From 93ebb6e369b424412f7cede38215184d5d2b810e Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Sat, 24 Feb 2024 21:12:54 +0200 Subject: [PATCH] Migrate to Vite --- .env.example | 3 +- .eslintrc.js => .eslintrc.cjs | 0 .prettierrc.js | 6 - README.md | 4 +- app/components/BuildCard.tsx | 2 +- app/components/Catcher.tsx | 2 +- app/components/Main.tsx | 2 +- app/components/layout/LanguageChanger.tsx | 2 +- app/components/layout/UserItem.tsx | 2 +- app/constants.ts | 4 +- app/db/seed/index.ts | 8 +- app/db/types.ts | 4 +- app/entry.client.tsx | 2 +- app/entry.server.tsx | 4 +- app/features/admin/AdminRepository.server.ts | 2 +- app/features/admin/routes/admin.tsx | 4 +- .../api-public/routes/tournament-match.$id.ts | 2 +- .../api-public/routes/tournament.$id.teams.ts | 2 +- .../api-public/routes/user.$identifier.ts | 3 +- app/features/art/art-types.ts | 2 +- app/features/art/index.ts | 10 - app/features/art/routes/art.new.tsx | 2 +- app/features/art/routes/art.tsx | 2 +- app/features/articles/routes/a.tsx | 2 +- app/features/auth/core/index.ts | 15 - app/features/auth/routes/auth.callback.tsx | 2 +- app/features/auth/routes/auth.create-link.tsx | 2 +- .../auth/routes/auth.impersonate.stop.tsx | 2 +- app/features/auth/routes/auth.impersonate.tsx | 2 +- app/features/auth/routes/auth.login.tsx | 2 +- app/features/auth/routes/auth.logout.tsx | 2 +- app/features/auth/routes/auth.tsx | 2 +- app/features/badges/index.ts | 1 - .../badges/routes/badges.$id.edit.tsx | 2 +- app/features/badges/routes/badges.$id.tsx | 2 +- app/features/badges/routes/badges.tsx | 2 +- app/features/build-analyzer/analyzer-types.ts | 6 +- .../build-analyzer/core/ability-values.json | 72 - .../build-analyzer/core/ability-values.ts | 72 + app/features/build-analyzer/core/stats.ts | 2 +- app/features/build-analyzer/core/utils.ts | 6 +- .../build-analyzer/core/weapon-params.json | 2354 ----------------- .../build-analyzer/core/weapon-params.ts | 2354 +++++++++++++++++ app/features/build-analyzer/index.ts | 1 - .../build-analyzer/routes/analyzer.tsx | 4 +- .../routes/builds.$slug.popular.tsx | 2 +- .../build-stats/routes/builds.$slug.stats.tsx | 4 +- app/features/builds/routes/builds.$slug.tsx | 2 +- app/features/builds/routes/builds.tsx | 2 +- app/features/calendar/calendar-constants.ts | 50 + .../calendar/calendar-schemas.server.ts | 103 + .../calendar/calendar-utils.server.ts | 2 +- app/features/calendar/calendar-utils.ts | 7 + app/features/calendar/components/Tags.tsx | 2 +- app/features/calendar/routes/calendar.$id.tsx | 8 +- app/features/calendar/routes/calendar.new.tsx | 149 +- app/features/calendar/routes/calendar.tsx | 6 +- app/features/calendar/tags.json | 50 - app/features/chat/components/Chat.tsx | 2 +- app/features/front-page/routes/index.tsx | 6 +- app/features/img-upload/routes/upload.tsx | 2 +- app/features/info/routes/contributions.tsx | 2 +- app/features/info/routes/faq.tsx | 2 +- app/features/info/routes/support.tsx | 2 +- .../LeaderboardRepository.server.ts | 2 +- .../queries/userSPLeaderboard.server.ts | 2 +- .../leaderboards/routes/leaderboards.tsx | 8 +- .../map-list-generator/routes/maps.tsx | 4 +- .../map-planner/components/Planner.tsx | 2 +- app/features/map-planner/routes/plans.tsx | 2 +- app/features/mmr/index.ts | 8 - .../core/objectHitPoints.ts | 2 +- .../routes/object-damage-calculator.tsx | 2 +- ...plus.suggestions.comment.$tier.$userId.tsx | 3 +- .../routes/plus.suggestions.new.tsx | 3 +- .../routes/plus.suggestions.tsx | 3 +- app/features/plus-suggestions/routes/plus.tsx | 2 +- .../routes/plus.voting.results.tsx | 4 +- .../plus-voting/routes/plus.voting.tsx | 2 +- .../sendouq-settings/routes/q.settings.tsx | 2 +- .../sendouq-streams/routes/q.streams.tsx | 2 +- app/features/sendouq/components/GroupCard.tsx | 2 +- app/features/sendouq/core/skills.server.ts | 10 +- app/features/sendouq/routes/q.looking.tsx | 4 +- app/features/sendouq/routes/q.match.$id.tsx | 6 +- app/features/sendouq/routes/q.preparing.tsx | 4 +- app/features/sendouq/routes/q.tsx | 6 +- app/features/sendouq/routes/tiers.tsx | 2 +- .../team/routes/t.$customUrl.edit.tsx | 2 +- .../team/routes/t.$customUrl.join.tsx | 4 +- .../team/routes/t.$customUrl.roster.tsx | 4 +- app/features/team/routes/t.$customUrl.tsx | 4 +- app/features/team/routes/t.tsx | 6 +- .../top-search/routes/xsearch.player.$id.tsx | 4 +- app/features/top-search/routes/xsearch.tsx | 4 +- .../components/Bracket/Match.tsx | 2 +- .../components/CastInfo.tsx | 2 +- .../components/ScoreReporter.tsx | 2 +- .../tournament-bracket/core/Bracket.ts | 4 +- .../core/Tournament.server.ts | 4 +- .../tournament-bracket/core/Tournament.ts | 6 +- .../core/brackets-manager/manager.server.ts | 11 + .../core/brackets-manager/manager.ts | 8 +- app/features/tournament-bracket/index.ts | 3 - .../routes/to.$id.brackets.tsx | 17 +- .../routes/to.$id.matches.$mid.tsx | 9 +- .../routes/to.$id.subs.new.tsx | 5 +- .../tournament-subs/routes/to.$id.subs.tsx | 5 +- .../tournament/routes/to.$id.admin.tsx | 4 +- .../tournament/routes/to.$id.join.tsx | 2 +- .../tournament/routes/to.$id.maps.tsx | 4 +- .../tournament/routes/to.$id.register.tsx | 4 +- .../tournament/routes/to.$id.seeds.tsx | 2 +- app/features/tournament/routes/to.$id.tsx | 4 +- .../user-page/routes/u.$identifier.art.tsx | 18 +- .../routes/u.$identifier.builds.new.tsx | 2 +- .../user-page/routes/u.$identifier.builds.tsx | 2 +- .../user-page/routes/u.$identifier.edit.tsx | 6 +- .../u.$identifier.results.highlights.tsx | 2 +- .../routes/u.$identifier.results.tsx | 2 +- .../routes/u.$identifier.seasons.tsx | 2 +- .../user-page/routes/u.$identifier.tsx | 6 +- .../user-page/routes/u.$identifier.vods.tsx | 4 +- app/features/user-search/routes/u.tsx | 2 +- app/features/vods/routes/vods.$id.tsx | 4 +- app/features/vods/routes/vods.new.tsx | 2 +- app/features/vods/routes/vods.tsx | 4 +- app/modules/i18n/index.ts | 4 - app/root.tsx | 21 +- app/utils/playwright.ts | 2 +- app/utils/urls.ts | 6 +- e2e/tournament-bracket.spec.ts | 2 +- package-lock.json | 1100 +++++++- package.json | 69 +- playwright.config.ts | 7 +- remix.config.js | 270 -- scripts/check-translation-jsons.ts | 6 +- scripts/create-analyzer-json.ts | 6 +- scripts/create-gear-json.ts | 6 +- scripts/create-misc-json.ts | 6 +- scripts/create-object-dmg-json.ts | 6 +- scripts/placements/index.ts | 2 +- scripts/refresh-prod-db.ts | 6 +- scripts/replace-img-names.ts | 4 + scripts/replace-weapon-names.ts | 4 + scripts/sync-xp-badges.ts | 2 +- scripts/utils.ts | 4 + tsconfig.json | 2 +- types/{remix.env.d.ts => env.d.ts} | 2 +- vite.config.ts | 308 +++ 150 files changed, 4319 insertions(+), 3181 deletions(-) rename .eslintrc.js => .eslintrc.cjs (100%) delete mode 100644 .prettierrc.js delete mode 100644 app/features/art/index.ts delete mode 100644 app/features/auth/core/index.ts delete mode 100644 app/features/badges/index.ts delete mode 100644 app/features/build-analyzer/core/ability-values.json create mode 100644 app/features/build-analyzer/core/ability-values.ts delete mode 100644 app/features/build-analyzer/core/weapon-params.json create mode 100644 app/features/build-analyzer/core/weapon-params.ts create mode 100644 app/features/calendar/calendar-constants.ts create mode 100644 app/features/calendar/calendar-schemas.server.ts delete mode 100644 app/features/calendar/tags.json delete mode 100644 app/features/mmr/index.ts create mode 100644 app/features/tournament-bracket/core/brackets-manager/manager.server.ts delete mode 100644 app/features/tournament-bracket/index.ts delete mode 100644 app/modules/i18n/index.ts delete mode 100644 remix.config.js rename types/{remix.env.d.ts => env.d.ts} (54%) create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example index b0b033c57..c65d467a2 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,4 @@ -PORT=5800 -BASE_URL=http://localhost:5800 +BASE_URL=http://localhost:5173 DB_PATH=db.sqlite3 LOHI_TOKEN=salmon SESSION_SECRET=secret diff --git a/.eslintrc.js b/.eslintrc.cjs similarity index 100% rename from .eslintrc.js rename to .eslintrc.cjs diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index 2ca56d8f0..000000000 --- a/.prettierrc.js +++ /dev/null @@ -1,6 +0,0 @@ -/** - * @type {import('prettier').Config} - */ -module.exports = { - // defaults only so far -}; diff --git a/README.md b/README.md index 601cd5427..c290b270f 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ There is a sequence of commands you need to run: 3. Make a copy of `.env.example` that's called `.env`. Filling additional values is not necessary unless you want to use real Discord authentication or develop the Lohi bot. 4. `npm run migrate up` to set up the database tables. 5. `npm run dev` to run the project in development mode. -6. Navigate to `http://localhost:5800/admin`. There press the seed button to fill the DB with test data. You can also impersonate any user (Sendou#0043 = admin). +6. Navigate to `http://localhost:5173/admin`. There press the seed button to fill the DB with test data. You can also impersonate any user (Sendou#0043 = admin). ## Contributing @@ -217,7 +217,7 @@ Note: This is only useful if you have access to a production running on Render.c 11. Fill new weapon IDs by category to `weapon-ids.ts` (easy to take from the diff of English weapons.json) 12. Get gear IDs for each slot from /output folder and update `gear-ids.ts`. 13. Replace `object-dmg.json` with the `object-dmg.json` in /output folder -14. Replace `weapon-params.json` with the `params.json` in /output folder +14. Replace `weapon-params.ts` with the `params.json` in /output folder 15. Delete all images inside `main-weapons`, `main-weapons-outlined`, `main-weapons-outlined-2` and `gear` folders. 16. Replace with images from Lean's repository. 17. Run the `npm run replace-img-names` command diff --git a/app/components/BuildCard.tsx b/app/components/BuildCard.tsx index 827fe9050..2b0aa5b23 100644 --- a/app/components/BuildCard.tsx +++ b/app/components/BuildCard.tsx @@ -8,7 +8,7 @@ import type { UserWithPlusTier, } from "~/db/types"; import { useIsMounted } from "~/hooks/useIsMounted"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import type { Ability as AbilityType, ModeShort, diff --git a/app/components/Catcher.tsx b/app/components/Catcher.tsx index 470f3a33e..e0a94754b 100644 --- a/app/components/Catcher.tsx +++ b/app/components/Catcher.tsx @@ -1,6 +1,6 @@ import { isRouteErrorResponse, useRouteError } from "@remix-run/react"; import { Button } from "~/components/Button"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { ERROR_GIRL_IMAGE_PATH, LOG_IN_URL, diff --git a/app/components/Main.tsx b/app/components/Main.tsx index 0ad69f448..b0dde777b 100644 --- a/app/components/Main.tsx +++ b/app/components/Main.tsx @@ -6,7 +6,7 @@ import { import clsx from "clsx"; import type * as React from "react"; import { useMatches } from "react-router"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import type { RootLoaderData } from "~/root"; import { SideNav } from "app/components/layout/SideNav"; diff --git a/app/components/layout/LanguageChanger.tsx b/app/components/layout/LanguageChanger.tsx index 53d2750e4..4309db070 100644 --- a/app/components/layout/LanguageChanger.tsx +++ b/app/components/layout/LanguageChanger.tsx @@ -1,10 +1,10 @@ import { useSearchParams } from "@remix-run/react"; import type * as React from "react"; import { useTranslation } from "react-i18next"; -import { languages } from "~/modules/i18n"; import { LinkButton } from "../Button"; import { GlobeIcon } from "../icons/Globe"; import { Popover } from "../Popover"; +import { languages } from "~/modules/i18n/config"; const addUniqueParam = ( oldParams: URLSearchParams, diff --git a/app/components/layout/UserItem.tsx b/app/components/layout/UserItem.tsx index 1073ce81c..606fa4e07 100644 --- a/app/components/layout/UserItem.tsx +++ b/app/components/layout/UserItem.tsx @@ -1,6 +1,6 @@ import { Link } from "@remix-run/react"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { userPage } from "~/utils/urls"; import { Avatar } from "../Avatar"; import { LogInIcon } from "../icons/LogIn"; diff --git a/app/constants.ts b/app/constants.ts index f1f6b0889..2ee6a240f 100644 --- a/app/constants.ts +++ b/app/constants.ts @@ -1,5 +1,5 @@ -import allTags from "~/features/calendar/tags.json"; import type { CalendarEventTag } from "./db/types"; +import { tags } from "./features/calendar/calendar-constants"; import type { BuildAbilitiesTupleWithUnknown } from "./modules/in-game-lists"; export const TWEET_LENGTH_MAX_LENGTH = 280; @@ -24,7 +24,7 @@ export const CALENDAR_EVENT = { DISCORD_INVITE_CODE_MAX_LENGTH: 50, BRACKET_URL_MAX_LENGTH: 200, MAX_AMOUNT_OF_DATES: 5, - TAGS: Object.keys(allTags) as Array, + TAGS: Object.keys(tags) as Array, }; export const CALENDAR_EVENT_RESULT = { diff --git a/app/db/seed/index.ts b/app/db/seed/index.ts index 519dd1e3a..853f05644 100644 --- a/app/db/seed/index.ts +++ b/app/db/seed/index.ts @@ -5,7 +5,6 @@ import { nanoid } from "nanoid"; import invariant from "tiny-invariant"; import { ADMIN_DISCORD_ID, ADMIN_ID, INVITE_CODE_LENGTH } from "~/constants"; import { db, sql } from "~/db/sql"; -import allTags from "~/features/calendar/tags.json"; import { MapPool } from "~/features/map-list-generator/core/map-pool"; import { lastCompletedVoting, @@ -70,6 +69,7 @@ import { import placements from "./placements.json"; import { BANNED_MAPS } from "~/features/sendouq-settings/banned-maps"; import { AMOUNT_OF_MAPS_IN_POOL_PER_MODE } from "~/features/sendouq-settings/q-settings-constants"; +import { tags } from "~/features/calendar/calendar-constants"; const calendarEventWithToToolsRegOpen = () => calendarEventWithToTools("PICNIC", true); @@ -667,7 +667,9 @@ function calendarEvents() { const userIds = userIdsInRandomOrder(); for (let id = 1; id <= AMOUNT_OF_CALENDAR_EVENTS; id++) { - const tags = shuffle(Object.keys(allTags)).filter((tag) => tag !== "BADGE"); + const shuffledTags = shuffle(Object.keys(tags)).filter( + (tag) => tag !== "BADGE", + ); sql .prepare( @@ -702,7 +704,7 @@ function calendarEvents() { authorId: id === 1 ? NZAP_TEST_ID : userIds.pop(), tags: Math.random() > 0.2 - ? tags + ? shuffledTags .slice( 0, faker.helpers.arrayElement([ diff --git a/app/db/types.ts b/app/db/types.ts index 0ce8ea646..1bd208e65 100644 --- a/app/db/types.ts +++ b/app/db/types.ts @@ -6,8 +6,8 @@ import type { RankedModeShort, StageId, } from "~/modules/in-game-lists"; -import type allTags from "~/features/calendar/tags.json"; import type { TieredSkill } from "~/features/mmr/tiered.server"; +import type { tags } from "~/features/calendar/calendar-constants"; export interface User { id: number; @@ -135,7 +135,7 @@ export interface CalendarEvent { tournamentId: number | null; } -export type CalendarEventTag = keyof typeof allTags; +export type CalendarEventTag = keyof typeof tags; export interface CalendarEventDate { id: number; diff --git a/app/entry.client.tsx b/app/entry.client.tsx index f0060a714..d8a1890f0 100644 --- a/app/entry.client.tsx +++ b/app/entry.client.tsx @@ -1,8 +1,8 @@ import { RemixBrowser } from "@remix-run/react"; import { hydrateRoot } from "react-dom/client"; -import { i18nLoader } from "./modules/i18n"; import i18next from "i18next"; import { I18nextProvider } from "react-i18next"; +import { i18nLoader } from "./modules/i18n/loader"; if ("serviceWorker" in navigator) { window.addEventListener("load", () => { diff --git a/app/entry.server.tsx b/app/entry.server.tsx index 181973b97..4e2b0fea5 100644 --- a/app/entry.server.tsx +++ b/app/entry.server.tsx @@ -11,10 +11,10 @@ import { isbot } from "isbot"; import cron from "node-cron"; import { renderToPipeableStream } from "react-dom/server"; import { I18nextProvider } from "react-i18next"; -import { getUser } from "./features/auth/core"; -import { i18Instance } from "./modules/i18n"; +import { getUser } from "./features/auth/core/user.server"; import { updatePatreonData } from "./modules/patreon"; import { noticeError, setTransactionName } from "./utils/newrelic.server"; +import { i18Instance } from "./modules/i18n/loader.server"; const ABORT_DELAY = 5000; diff --git a/app/features/admin/AdminRepository.server.ts b/app/features/admin/AdminRepository.server.ts index 666d7d97d..ef42defcc 100644 --- a/app/features/admin/AdminRepository.server.ts +++ b/app/features/admin/AdminRepository.server.ts @@ -1,8 +1,8 @@ import { db, sql } from "~/db/sql"; -import { syncXPBadges } from "../badges"; import type { Tables } from "~/db/tables"; import { dateToDatabaseTimestamp } from "~/utils/dates"; import invariant from "tiny-invariant"; +import { syncXPBadges } from "../badges/queries/syncXPBadges.server"; const removeOldLikesStm = sql.prepare(/*sql*/ ` delete from diff --git a/app/features/admin/routes/admin.tsx b/app/features/admin/routes/admin.tsx index bf62e16ef..c59b2ab09 100644 --- a/app/features/admin/routes/admin.tsx +++ b/app/features/admin/routes/admin.tsx @@ -17,8 +17,7 @@ import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { UserSearch } from "~/components/UserSearch"; import * as AdminRepository from "~/features/admin/AdminRepository.server"; -import { makeArtist } from "~/features/art"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId, isImpersonating, @@ -35,6 +34,7 @@ import { assertUnreachable } from "~/utils/types"; import { SEED_URL, STOP_IMPERSONATING_URL, impersonateUrl } from "~/utils/urls"; import { adminActionSchema } from "../admin-schemas.server"; import { plusTiersFromVotingAndLeaderboard } from "../core/plus-tier.server"; +import { makeArtist } from "~/features/art/queries/makeArtist.server"; export const meta: MetaFunction = () => { return [{ title: makeTitle("Admin page") }]; diff --git a/app/features/api-public/routes/tournament-match.$id.ts b/app/features/api-public/routes/tournament-match.$id.ts index 37453a7a4..f016e1eb4 100644 --- a/app/features/api-public/routes/tournament-match.$id.ts +++ b/app/features/api-public/routes/tournament-match.$id.ts @@ -4,10 +4,10 @@ import { db } from "~/db/sql"; import { notFoundIfFalsy, parseParams } from "~/utils/remix"; import { id } from "~/utils/zod"; import type { GetTournamentMatchResponse } from "../schema"; -import { i18next } from "~/modules/i18n"; import { jsonArrayFrom } from "kysely/helpers/sqlite"; import { resolveMapList } from "~/features/tournament-bracket/core/mapList.server"; import { requireBearerAuth } from "../api-public-utils.server"; +import i18next from "~/modules/i18n/i18next.server"; const paramsSchema = z.object({ id, diff --git a/app/features/api-public/routes/tournament.$id.teams.ts b/app/features/api-public/routes/tournament.$id.teams.ts index 1dbe35e6e..e56627a4f 100644 --- a/app/features/api-public/routes/tournament.$id.teams.ts +++ b/app/features/api-public/routes/tournament.$id.teams.ts @@ -6,8 +6,8 @@ import { id } from "~/utils/zod"; import type { GetTournamentTeamsResponse } from "../schema"; import { databaseTimestampToDate } from "~/utils/dates"; import { jsonArrayFrom } from "kysely/helpers/sqlite"; -import { i18next } from "~/modules/i18n"; import { requireBearerAuth } from "../api-public-utils.server"; +import i18next from "~/modules/i18n/i18next.server"; const paramsSchema = z.object({ id, diff --git a/app/features/api-public/routes/user.$identifier.ts b/app/features/api-public/routes/user.$identifier.ts index e75430835..516c6fff6 100644 --- a/app/features/api-public/routes/user.$identifier.ts +++ b/app/features/api-public/routes/user.$identifier.ts @@ -5,7 +5,8 @@ import { safeNumberParse } from "~/utils/number"; import { notFoundIfFalsy, parseParams } from "~/utils/remix"; import type { GetUserResponse } from "../schema"; import { jsonArrayFrom } from "kysely/helpers/sqlite"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; +("~/modules/i18n"); import { requireBearerAuth } from "../api-public-utils.server"; const paramsSchema = z.object({ diff --git a/app/features/art/art-types.ts b/app/features/art/art-types.ts index 9eee71f5d..d728e1b89 100644 --- a/app/features/art/art-types.ts +++ b/app/features/art/art-types.ts @@ -21,4 +21,4 @@ export interface ListedArt { } export const ART_SOURCES = ["ALL", "MADE-BY", "MADE-OF"] as const; -export type ArtSouce = (typeof ART_SOURCES)[number]; +export type ArtSource = (typeof ART_SOURCES)[number]; diff --git a/app/features/art/index.ts b/app/features/art/index.ts deleted file mode 100644 index 3ca1cd466..000000000 --- a/app/features/art/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { ArtGrid } from "./components/ArtGrid"; -export { artsByUserId } from "./queries/artsByUserId.server"; -export { countArtByUserId } from "./queries/countArtByUserId.server"; -export { makeArtist } from "./queries/makeArtist.server"; -export { deleteArt } from "./queries/deleteArt.server"; -export { findArtById } from "./queries/findArtById.server"; -export type { ListedArt, ArtSouce } from "./art-types"; -export { ART_SOURCES } from "./art-types"; -export { NEW_ART_EXISTING_SEARCH_PARAM_KEY } from "./art-constants"; -export { deleteArtSchema } from "./art-schemas.server"; diff --git a/app/features/art/routes/art.new.tsx b/app/features/art/routes/art.new.tsx index 3dc35827f..03334d8ab 100644 --- a/app/features/art/routes/art.new.tsx +++ b/app/features/art/routes/art.new.tsx @@ -21,7 +21,7 @@ import { Toggle } from "~/components/Toggle"; import { CrossIcon } from "~/components/icons/Cross"; import { s3UploadHandler } from "~/features/img-upload"; import { useTranslation } from "react-i18next"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { dateToDatabaseTimestamp } from "~/utils/dates"; import { validate, diff --git a/app/features/art/routes/art.tsx b/app/features/art/routes/art.tsx index 6cc12d07e..fb627cde5 100644 --- a/app/features/art/routes/art.tsx +++ b/app/features/art/routes/art.tsx @@ -10,7 +10,6 @@ import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; import { Toggle } from "~/components/Toggle"; import { useTranslation } from "react-i18next"; -import { i18next } from "~/modules/i18n"; import { type SendouRouteHandle } from "~/utils/remix"; import { makeTitle } from "~/utils/strings"; import { artPage, navIconUrl } from "~/utils/urls"; @@ -22,6 +21,7 @@ import { } from "../queries/showcaseArts.server"; import { Button } from "~/components/Button"; import { CrossIcon } from "~/components/icons/Cross"; +import i18next from "~/modules/i18n/i18next.server"; const FILTERED_TAG_KEY = "tag"; const OPEN_COMMISIONS_KEY = "open"; diff --git a/app/features/articles/routes/a.tsx b/app/features/articles/routes/a.tsx index 1c53c43dd..b5b429db4 100644 --- a/app/features/articles/routes/a.tsx +++ b/app/features/articles/routes/a.tsx @@ -2,7 +2,7 @@ import { Main } from "~/components/Main"; import type { LinksFunction } from "@remix-run/node"; import { json } from "@remix-run/node"; import { mostRecentArticles } from "../core/list.server"; -import styles from "~/styles/front.css"; +import styles from "~/styles/front.css?url"; import { useTranslation } from "react-i18next"; import type { SendouRouteHandle } from "~/utils/remix"; import { articlePage, ARTICLES_MAIN_PAGE, navIconUrl } from "~/utils/urls"; diff --git a/app/features/auth/core/index.ts b/app/features/auth/core/index.ts deleted file mode 100644 index 8c6f6f336..000000000 --- a/app/features/auth/core/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { - callbackLoader, - impersonateAction, - stopImpersonatingAction, - logInAction, - logOutAction, - createLogInLinkAction, - logInViaLinkLoader, -} from "./routes.server"; - -export { getUser, requireUser } from "./user.server"; - -export { useUser } from "./user"; - -export type { AuthErrorCode } from "./errors"; diff --git a/app/features/auth/routes/auth.callback.tsx b/app/features/auth/routes/auth.callback.tsx index 5c4a9315a..a82996a5a 100644 --- a/app/features/auth/routes/auth.callback.tsx +++ b/app/features/auth/routes/auth.callback.tsx @@ -1 +1 @@ -export { callbackLoader as loader } from "~/features/auth/core"; +export { callbackLoader as loader } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.create-link.tsx b/app/features/auth/routes/auth.create-link.tsx index e4cd1eb4a..a16ae5859 100644 --- a/app/features/auth/routes/auth.create-link.tsx +++ b/app/features/auth/routes/auth.create-link.tsx @@ -1 +1 @@ -export { createLogInLinkAction as action } from "~/features/auth/core"; +export { createLogInLinkAction as action } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.impersonate.stop.tsx b/app/features/auth/routes/auth.impersonate.stop.tsx index abe828909..29d5aa758 100644 --- a/app/features/auth/routes/auth.impersonate.stop.tsx +++ b/app/features/auth/routes/auth.impersonate.stop.tsx @@ -1 +1 @@ -export { stopImpersonatingAction as action } from "~/features/auth/core"; +export { stopImpersonatingAction as action } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.impersonate.tsx b/app/features/auth/routes/auth.impersonate.tsx index 8124784b0..98006fbd1 100644 --- a/app/features/auth/routes/auth.impersonate.tsx +++ b/app/features/auth/routes/auth.impersonate.tsx @@ -1 +1 @@ -export { impersonateAction as action } from "~/features/auth/core"; +export { impersonateAction as action } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.login.tsx b/app/features/auth/routes/auth.login.tsx index 63d2c68b8..949eea430 100644 --- a/app/features/auth/routes/auth.login.tsx +++ b/app/features/auth/routes/auth.login.tsx @@ -1 +1 @@ -export { logInViaLinkLoader as loader } from "~/features/auth/core"; +export { logInViaLinkLoader as loader } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.logout.tsx b/app/features/auth/routes/auth.logout.tsx index 7c197b435..880b6b03a 100644 --- a/app/features/auth/routes/auth.logout.tsx +++ b/app/features/auth/routes/auth.logout.tsx @@ -1 +1 @@ -export { logOutAction as action } from "~/features/auth/core"; +export { logOutAction as action } from "~/features/auth/core/routes.server"; diff --git a/app/features/auth/routes/auth.tsx b/app/features/auth/routes/auth.tsx index 0e897e8d6..4ac22855e 100644 --- a/app/features/auth/routes/auth.tsx +++ b/app/features/auth/routes/auth.tsx @@ -1 +1 @@ -export { logInAction as action } from "~/features/auth/core"; +export { logInAction as action } from "~/features/auth/core/routes.server"; diff --git a/app/features/badges/index.ts b/app/features/badges/index.ts deleted file mode 100644 index 6691b2ef4..000000000 --- a/app/features/badges/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { syncXPBadges } from "./queries/syncXPBadges.server"; diff --git a/app/features/badges/routes/badges.$id.edit.tsx b/app/features/badges/routes/badges.$id.edit.tsx index 176649952..bfdb32146 100644 --- a/app/features/badges/routes/badges.$id.edit.tsx +++ b/app/features/badges/routes/badges.$id.edit.tsx @@ -9,7 +9,7 @@ import { Label } from "~/components/Label"; import { UserSearch } from "~/components/UserSearch"; import { TrashIcon } from "~/components/icons/Trash"; import type { User } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; import { canEditBadgeManagers, canEditBadgeOwners } from "~/permissions"; import { atOrError } from "~/utils/arrays"; diff --git a/app/features/badges/routes/badges.$id.tsx b/app/features/badges/routes/badges.$id.tsx index f89044f3b..77908b1b2 100644 --- a/app/features/badges/routes/badges.$id.tsx +++ b/app/features/badges/routes/badges.$id.tsx @@ -5,7 +5,7 @@ import { Badge } from "~/components/Badge"; import { LinkButton } from "~/components/Button"; import { Redirect } from "~/components/Redirect"; import { type Badge as BadgeDBType } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { canEditBadgeOwners, isMod } from "~/permissions"; import { BADGES_PAGE } from "~/utils/urls"; import { type BadgesLoaderData } from "./badges"; diff --git a/app/features/badges/routes/badges.tsx b/app/features/badges/routes/badges.tsx index 539e341f0..053141760 100644 --- a/app/features/badges/routes/badges.tsx +++ b/app/features/badges/routes/badges.tsx @@ -2,7 +2,7 @@ import type { LinksFunction, SerializeFrom } from "@remix-run/node"; import { Link, NavLink, Outlet, useLoaderData } from "@remix-run/react"; import { Badge } from "~/components/Badge"; import { Main } from "~/components/Main"; -import styles from "~/styles/badges.css"; +import styles from "~/styles/badges.css?url"; import { BADGES_PAGE, BORZOIC_TWITTER, diff --git a/app/features/build-analyzer/analyzer-types.ts b/app/features/build-analyzer/analyzer-types.ts index 993916e80..d7ff6e783 100644 --- a/app/features/build-analyzer/analyzer-types.ts +++ b/app/features/build-analyzer/analyzer-types.ts @@ -5,10 +5,10 @@ import type { SubWeaponId, } from "~/modules/in-game-lists"; import type { SPECIAL_EFFECTS } from "./core/specialEffects"; -import type weaponParams from "./core/weapon-params.json"; -import type abilityValues from "./core/ability-values.json"; import type { DAMAGE_TYPE } from "./analyzer-constants"; import type { AbilityWithUnknown } from "~/modules/in-game-lists/types"; +import type { weaponParams } from "./core/weapon-params"; +import type { abilityValues } from "./core/utils"; type Overwrites = Record< string, @@ -113,7 +113,7 @@ export interface DistanceDamage { export interface SubWeaponParams { overwrites?: Overwrites; - SubInkSaveLv: 0 | 1 | 2 | 3; + SubInkSaveLv: 0 | 1 | 2 | 3 | 4; /** How much ink one usage of the sub consumes */ InkConsume: number; /** Amount of frames white ink (=no ink recovery during this time) takes */ diff --git a/app/features/build-analyzer/core/ability-values.json b/app/features/build-analyzer/core/ability-values.json deleted file mode 100644 index 2f1a54582..000000000 --- a/app/features/build-analyzer/core/ability-values.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "ConsumeRt_Main": [0.55, 0.775, 1.0], - "ConsumeRt_Sub_Lv0": [0.8, 0.9, 1.0], - "ConsumeRt_Sub_Lv1": [0.7, 0.85, 1.0], - "ConsumeRt_Sub_Lv2": [0.65, 0.825, 1.0], - "ConsumeRt_Sub_Lv3": [0.6, 0.8, 1.0], - "ConsumeRt_Sub_Lv4": [0.71111, 0.85555, 1.0], - "DamageRt_BombH": [0.5, 0.75, 1.0], - "DamageRt_BombL": [0.6, 0.75, 1.0], - "DamageRt_LineMarker": [0.5, 0.75, 1.0], - "DamageRt_Shield": [0.5, 0.75, 1.0], - "DamageRt_Sprinkler": [0.5, 0.75, 1.0], - "Dying_AroundFrm": [30.0, 60.0, 90.0], - "Dying_ChaseFrm": [90.0, 180.0, 270.0], - "IncreaseRt_Special": [1.3, 1.15, 1.0], - "InkRecoverFrm_Std": [220.0, 410.0, 600.0], - "InkRecoverFrm_Stealth": [117.0, 148.5, 180.0], - "MarkingTimeRt": [0.1, 0.43, 1.0], - "MarkingTimeRt_Trap": [0.1, 0.55, 1.0], - "MoveDownRt_PoisonMist": [0.5, 0.75, 1.0], - "MoveVelRt_Shot": [1.25, 1.125, 1.0], - "MoveVel_Human": [0.144, 0.12, 0.096], - "MoveVel_Human_Fast": [0.144, 0.124, 0.104], - "MoveVel_Human_Slow": [0.144, 0.116, 0.088], - "MoveVel_Stealth": [0.24, 0.216, 0.192], - "MoveVel_Stealth_Fast": [0.24, 0.2208, 0.2016], - "MoveVel_Stealth_Slow": [0.24, 0.216, 0.1728], - "OpInk_ArmorHP": [39.0, 26.0, 0.0], - "OpInk_DamageLmt": [0.2, 0.3, 0.4], - "OpInk_DamagePerFrame": [0.0015, 0.0022, 0.003], - "OpInk_JumpVel": [0.11, 0.098, 0.08], - "OpInk_MoveVel": [0.0768, 0.0557, 0.024], - "OpInk_MoveVel_Shot": [0.042, 0.033, 0.012], - "OpInk_MoveVel_ShotK": [1.0, 0.75, 0.5], - "Overwrite_ConsumeRt_Main": [-1.0, -1.0, -1.0], - "Overwrite_MoveVelRt_Shot": [-1.0, -1.0, -1.0], - "Somersault_MoveVelKd": [1.0, 0.925, 0.85], - "SpecialGaugeRt_Restart": [1.0, 0.8, 0.5], - "SuperJump_ChargeFrm": [20.0, 35.0, 80.0], - "SuperJump_MoveFrm": [96.6, 132.3, 138.0], - "WallJumpChargeFrm": [5.0, 18.0, 45.0], - "ReduceJumpSwerveRate": [1.0, 0.75, 0.0], - "SpawnSpeedZSpecUp": [0.0, 0.0, 0.0], - "MoveSpeed": [0.0, 0.0, 0.0], - "SubSpecUpParam": [0.0, 0.0, 0.0], - "PeriodFirst": [0.0, 0.0, 0.0], - "PeriodSecond": [0.0, 0.0, 0.0], - "MarkingFrameSubSpec": [0.0, 0.0, 0.0], - "SensorRadius": [0.0, 0.0, 0.0], - "ExplosionRadius": [0.0, 0.0, 0.0], - "MaxHP": [0.0, 0.0, 0.0], - "SpecialDurationFrame": [0.0, 0.0, 0.0], - "DistanceDamageDistanceRate": [0.0, 0.0, 0.0], - "PaintRadius": [0.0, 0.0, 0.0], - "MaxFieldHP": [0.0, 0.0, 0.0], - "InkConsume_Hook": [0.0, 0.0, 0.0], - "InkConsume_PerSec": [0.0, 0.0, 0.0], - "TargetInCircleRadius": [0.0, 0.0, 0.0], - "RainyFrame": [0.0, 0.0, 0.0], - "ChargeRateAutoPerFrame": [0.0, 0.0, 0.0], - "MaxFrame": [0.0, 0.0, 0.0], - "MaxRadius": [0.0, 0.0, 0.0], - "RadiusMax": [0.0, 0.0, 0.0], - "RadiusMin": [0.0, 0.0, 0.0], - "LaserFrame": [0.0, 0.0, 0.0], - "SplashAroundVelocityMin": [0.0, 0.0, 0.0], - "SplashAroundVelocityMax": [0.0, 0.0, 0.0], - "SplashAroundPaintRadius": [0.0, 0.0, 0.0], - "SpecialTotalFrame": [0.0, 0.0, 0.0], - "PowerUpFrame": [0.0, 0.0, 0.0], - "CrossPaintRadius": [0.0, 0.0, 0.0] -} diff --git a/app/features/build-analyzer/core/ability-values.ts b/app/features/build-analyzer/core/ability-values.ts new file mode 100644 index 000000000..a90b5640b --- /dev/null +++ b/app/features/build-analyzer/core/ability-values.ts @@ -0,0 +1,72 @@ +export const abilityValues = { + ConsumeRt_Main: [0.55, 0.775, 1.0], + ConsumeRt_Sub_Lv0: [0.8, 0.9, 1.0], + ConsumeRt_Sub_Lv1: [0.7, 0.85, 1.0], + ConsumeRt_Sub_Lv2: [0.65, 0.825, 1.0], + ConsumeRt_Sub_Lv3: [0.6, 0.8, 1.0], + ConsumeRt_Sub_Lv4: [0.71111, 0.85555, 1.0], + DamageRt_BombH: [0.5, 0.75, 1.0], + DamageRt_BombL: [0.6, 0.75, 1.0], + DamageRt_LineMarker: [0.5, 0.75, 1.0], + DamageRt_Shield: [0.5, 0.75, 1.0], + DamageRt_Sprinkler: [0.5, 0.75, 1.0], + Dying_AroundFrm: [30.0, 60.0, 90.0], + Dying_ChaseFrm: [90.0, 180.0, 270.0], + IncreaseRt_Special: [1.3, 1.15, 1.0], + InkRecoverFrm_Std: [220.0, 410.0, 600.0], + InkRecoverFrm_Stealth: [117.0, 148.5, 180.0], + MarkingTimeRt: [0.1, 0.43, 1.0], + MarkingTimeRt_Trap: [0.1, 0.55, 1.0], + MoveDownRt_PoisonMist: [0.5, 0.75, 1.0], + MoveVelRt_Shot: [1.25, 1.125, 1.0], + MoveVel_Human: [0.144, 0.12, 0.096], + MoveVel_Human_Fast: [0.144, 0.124, 0.104], + MoveVel_Human_Slow: [0.144, 0.116, 0.088], + MoveVel_Stealth: [0.24, 0.216, 0.192], + MoveVel_Stealth_Fast: [0.24, 0.2208, 0.2016], + MoveVel_Stealth_Slow: [0.24, 0.216, 0.1728], + OpInk_ArmorHP: [39.0, 26.0, 0.0], + OpInk_DamageLmt: [0.2, 0.3, 0.4], + OpInk_DamagePerFrame: [0.0015, 0.0022, 0.003], + OpInk_JumpVel: [0.11, 0.098, 0.08], + OpInk_MoveVel: [0.0768, 0.0557, 0.024], + OpInk_MoveVel_Shot: [0.042, 0.033, 0.012], + OpInk_MoveVel_ShotK: [1.0, 0.75, 0.5], + Overwrite_ConsumeRt_Main: [-1.0, -1.0, -1.0], + Overwrite_MoveVelRt_Shot: [-1.0, -1.0, -1.0], + Somersault_MoveVelKd: [1.0, 0.925, 0.85], + SpecialGaugeRt_Restart: [1.0, 0.8, 0.5], + SuperJump_ChargeFrm: [20.0, 35.0, 80.0], + SuperJump_MoveFrm: [96.6, 132.3, 138.0], + WallJumpChargeFrm: [5.0, 18.0, 45.0], + ReduceJumpSwerveRate: [1.0, 0.75, 0.0], + SpawnSpeedZSpecUp: [0.0, 0.0, 0.0], + MoveSpeed: [0.0, 0.0, 0.0], + SubSpecUpParam: [0.0, 0.0, 0.0], + PeriodFirst: [0.0, 0.0, 0.0], + PeriodSecond: [0.0, 0.0, 0.0], + MarkingFrameSubSpec: [0.0, 0.0, 0.0], + SensorRadius: [0.0, 0.0, 0.0], + ExplosionRadius: [0.0, 0.0, 0.0], + MaxHP: [0.0, 0.0, 0.0], + SpecialDurationFrame: [0.0, 0.0, 0.0], + DistanceDamageDistanceRate: [0.0, 0.0, 0.0], + PaintRadius: [0.0, 0.0, 0.0], + MaxFieldHP: [0.0, 0.0, 0.0], + InkConsume_Hook: [0.0, 0.0, 0.0], + InkConsume_PerSec: [0.0, 0.0, 0.0], + TargetInCircleRadius: [0.0, 0.0, 0.0], + RainyFrame: [0.0, 0.0, 0.0], + ChargeRateAutoPerFrame: [0.0, 0.0, 0.0], + MaxFrame: [0.0, 0.0, 0.0], + MaxRadius: [0.0, 0.0, 0.0], + RadiusMax: [0.0, 0.0, 0.0], + RadiusMin: [0.0, 0.0, 0.0], + LaserFrame: [0.0, 0.0, 0.0], + SplashAroundVelocityMin: [0.0, 0.0, 0.0], + SplashAroundVelocityMax: [0.0, 0.0, 0.0], + SplashAroundPaintRadius: [0.0, 0.0, 0.0], + SpecialTotalFrame: [0.0, 0.0, 0.0], + PowerUpFrame: [0.0, 0.0, 0.0], + CrossPaintRadius: [0.0, 0.0, 0.0], +}; diff --git a/app/features/build-analyzer/core/stats.ts b/app/features/build-analyzer/core/stats.ts index 9e4d2db8b..d6e269605 100644 --- a/app/features/build-analyzer/core/stats.ts +++ b/app/features/build-analyzer/core/stats.ts @@ -52,7 +52,7 @@ import { roundToNDecimalPlaces, sumArray, } from "~/utils/number"; -import type abilityValuesJson from "./ability-values.json"; +import type { abilityValues as abilityValuesJson } from "./ability-values"; export function buildStats({ weaponSplId, diff --git a/app/features/build-analyzer/core/utils.ts b/app/features/build-analyzer/core/utils.ts index efd5813e2..9257d200a 100644 --- a/app/features/build-analyzer/core/utils.ts +++ b/app/features/build-analyzer/core/utils.ts @@ -30,11 +30,11 @@ import type { SubWeaponDamage, SubWeaponParams, } from "../analyzer-types"; -import abilityValuesJson from "./ability-values.json"; -import weaponParamsJson from "./weapon-params.json"; +import { abilityValues as abilityValuesJson } from "./ability-values"; +import { weaponParams as rawWeaponParams } from "./weapon-params"; export function weaponParams(): ParamsJson { - return weaponParamsJson as ParamsJson; + return rawWeaponParams as ParamsJson; } export function buildToAbilityPoints(build: BuildAbilitiesTupleWithUnknown) { diff --git a/app/features/build-analyzer/core/weapon-params.json b/app/features/build-analyzer/core/weapon-params.json deleted file mode 100644 index 6ae157b40..000000000 --- a/app/features/build-analyzer/core/weapon-params.json +++ /dev/null @@ -1,2354 +0,0 @@ -{ - "mainWeapons": { - "0": { - "SpecialPoint": 180, - "subWeaponId": 6, - "specialWeaponId": 11, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 380, - "DamageParam_ValueMin": 190, - "Jump_DegSwerve": 18, - "Stand_DegSwerve": 12, - "InkRecoverStop": 15, - "InkConsume": 0.008 - }, - "1": { - "SpecialPoint": 170, - "subWeaponId": 8, - "specialWeaponId": 9, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 380, - "DamageParam_ValueMin": 190, - "Jump_DegSwerve": 18, - "Stand_DegSwerve": 12, - "InkRecoverStop": 15, - "InkConsume": 0.008 - }, - "10": { - "SpecialPoint": 180, - "subWeaponId": 0, - "specialWeaponId": 2, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.076, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 15, - "Stand_DegSwerve": 12, - "InkRecoverStop": 15, - "InkConsume": 0.0043 - }, - "11": { - "SpecialPoint": 190, - "subWeaponId": 13, - "specialWeaponId": 7, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.076, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 15, - "Stand_DegSwerve": 12, - "InkRecoverStop": 15, - "InkConsume": 0.0043 - }, - "20": { - "SpecialPoint": 200, - "subWeaponId": 2, - "specialWeaponId": 12, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 0, - "Stand_DegSwerve": 0, - "InkConsume": 0.008 - }, - "21": { - "SpecialPoint": 210, - "subWeaponId": 1, - "specialWeaponId": 14, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 0, - "Stand_DegSwerve": 0, - "InkConsume": 0.008 - }, - "30": { - "SpecialPoint": 180, - "subWeaponId": 5, - "specialWeaponId": 13, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 240, - "DamageParam_ValueMin": 120, - "Jump_DegSwerve": 16, - "Stand_DegSwerve": 13, - "InkRecoverStop": 15, - "InkConsume": 0.005 - }, - "31": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 6, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 240, - "DamageParam_ValueMin": 120, - "Jump_DegSwerve": 16, - "Stand_DegSwerve": 13, - "InkRecoverStop": 15, - "InkConsume": 0.005 - }, - "40": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 1, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 5, - "InkConsume": 0.0092 - }, - "41": { - "SpecialPoint": 190, - "subWeaponId": 0, - "specialWeaponId": 14, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 5, - "InkConsume": 0.0092 - }, - "45": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 1, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 5, - "InkConsume": 0.0092 - }, - "50": { - "SpecialPoint": 190, - "subWeaponId": 4, - "specialWeaponId": 9, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 520, - "DamageParam_ValueMin": 300, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 6, - "InkConsume": 0.013 - }, - "60": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 15, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.084, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 5, - "InkConsume": 0.008 - }, - "61": { - "SpecialPoint": 180, - "subWeaponId": 7, - "specialWeaponId": 16, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.084, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 5, - "InkConsume": 0.008 - }, - "70": { - "SpecialPoint": 180, - "subWeaponId": 12, - "specialWeaponId": 12, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "MoveSpeed": 0.055, - "DamageParam_ValueMax": 420, - "DamageParam_ValueMin": 210, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 2.7, - "InkConsume": 0.02 - }, - "71": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 6, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "MoveSpeed": 0.055, - "DamageParam_ValueMax": 420, - "DamageParam_ValueMin": 210, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 2.7, - "InkConsume": 0.02 - }, - "80": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 8, - "MoveSpeed": 0.04, - "DamageParam_ValueMax": 620, - "DamageParam_ValueMin": 350, - "Jump_DegSwerve": 11.3511, - "Stand_DegSwerve": 4, - "InkConsume": 0.023 - }, - "81": { - "SpecialPoint": 210, - "subWeaponId": 4, - "specialWeaponId": 17, - "MoveSpeed": 0.04, - "DamageParam_ValueMax": 620, - "DamageParam_ValueMin": 350, - "Jump_DegSwerve": 11.3511, - "Stand_DegSwerve": 4, - "InkConsume": 0.023 - }, - "90": { - "SpecialPoint": 180, - "subWeaponId": 12, - "specialWeaponId": 8, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 2.5, - "InkConsume": 0.016 - }, - "91": { - "SpecialPoint": 180, - "subWeaponId": 11, - "specialWeaponId": 5, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 2.5, - "InkConsume": 0.016 - }, - "100": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 9, - "MoveSpeed": 0.079, - "DamageParam_ValueMax": 240, - "DamageParam_ValueMin": 120, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 6, - "InkConsume": 0.0096 - }, - "101": { - "SpecialPoint": 210, - "subWeaponId": 10, - "specialWeaponId": 10, - "MoveSpeed": 0.079, - "DamageParam_ValueMax": 240, - "DamageParam_ValueMin": 120, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 6, - "InkConsume": 0.0096 - }, - "200": { - "SpecialPoint": 170, - "subWeaponId": 0, - "specialWeaponId": 3, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - }, - "ReduceJumpSwerveRate": { - "Mid": 0.625 - } - }, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 1.5 - }, - { - "Damage": 500, - "Distance": 3.57 - } - ], - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 0, - "InkRecoverStop": 55, - "InkConsume": 0.075 - }, - "201": { - "SpecialPoint": 180, - "subWeaponId": 5, - "specialWeaponId": 11, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - }, - "ReduceJumpSwerveRate": { - "Mid": 0.625 - } - }, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 1.5 - }, - { - "Damage": 500, - "Distance": 3.57 - } - ], - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 0, - "InkRecoverStop": 55, - "InkConsume": 0.075 - }, - "210": { - "SpecialPoint": 180, - "subWeaponId": 7, - "specialWeaponId": 2, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.045, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 0.94 - }, - { - "Damage": 500, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 10, - "Stand_DegSwerve": 0, - "InkRecoverStop": 60, - "InkConsume": 0.1 - }, - "211": { - "SpecialPoint": 180, - "subWeaponId": 9, - "specialWeaponId": 18, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.045, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 0.94 - }, - { - "Damage": 500, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 10, - "Stand_DegSwerve": 0, - "InkRecoverStop": 60, - "InkConsume": 0.1 - }, - "220": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 7, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.04, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 1 - }, - { - "Damage": 500, - "Distance": 3.5 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 70, - "InkConsume": 0.11 - }, - "230": { - "SpecialPoint": 180, - "subWeaponId": 0, - "specialWeaponId": 1, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.065, - "DamageParam_ValueDirect": 600, - "BlastParam_DistanceDamage": [ - { - "Damage": 300, - "Distance": 1 - }, - { - "Damage": 300, - "Distance": 4 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 40, - "InkConsume": 0.04 - }, - "231": { - "SpecialPoint": 170, - "subWeaponId": 6, - "specialWeaponId": 16, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.065, - "DamageParam_ValueDirect": 600, - "BlastParam_DistanceDamage": [ - { - "Damage": 300, - "Distance": 1 - }, - { - "Damage": 300, - "Distance": 4 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 40, - "InkConsume": 0.04 - }, - "240": { - "SpecialPoint": 190, - "subWeaponId": 10, - "specialWeaponId": 14, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.055, - "DamageParam_ValueDirect": 850, - "BlastParam_DistanceDamage": [ - { - "Damage": 350, - "Distance": 0.94 - }, - { - "Damage": 350, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 50, - "InkConsume": 0.07 - }, - "241": { - "SpecialPoint": 210, - "subWeaponId": 13, - "specialWeaponId": 10, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.055, - "DamageParam_ValueDirect": 850, - "BlastParam_DistanceDamage": [ - { - "Damage": 350, - "Distance": 0.94 - }, - { - "Damage": 350, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 50, - "InkConsume": 0.07 - }, - "250": { - "SpecialPoint": 180, - "subWeaponId": 11, - "specialWeaponId": 8, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 850, - "BlastParam_DistanceDamage": [ - { - "Damage": 350, - "Distance": 0.94 - }, - { - "Damage": 350, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 50, - "InkConsume": 0.08 - }, - "251": { - "SpecialPoint": 190, - "subWeaponId": 12, - "specialWeaponId": 9, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.5 - } - }, - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 850, - "BlastParam_DistanceDamage": [ - { - "Damage": 350, - "Distance": 0.94 - }, - { - "Damage": 350, - "Distance": 3.3 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 50, - "InkConsume": 0.08 - }, - "260": { - "SpecialPoint": 180, - "subWeaponId": 3, - "specialWeaponId": 13, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.625 - } - }, - "MoveSpeed": 0.04, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 1 - }, - { - "Damage": 500, - "Distance": 1.8 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 60, - "InkConsume": 0.085 - }, - "261": { - "SpecialPoint": 190, - "subWeaponId": 2, - "specialWeaponId": 6, - "overwrites": { - "ReduceJumpSwerveRate": { - "Mid": 0.625 - } - }, - "MoveSpeed": 0.04, - "DamageParam_ValueDirect": 1250, - "BlastParam_DistanceDamage": [ - { - "Damage": 700, - "Distance": 1 - }, - { - "Damage": 500, - "Distance": 1.8 - } - ], - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 0, - "InkRecoverStop": 60, - "InkConsume": 0.085 - }, - "300": { - "SpecialPoint": 190, - "subWeaponId": 6, - "specialWeaponId": 12, - "TripleShotSpanFrame": 8, - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 290, - "DamageParam_ValueMin": 145, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 1, - "InkRecoverStop": 25, - "InkConsume": 0.0115 - }, - "301": { - "SpecialPoint": 200, - "subWeaponId": 2, - "specialWeaponId": 11, - "TripleShotSpanFrame": 8, - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 290, - "DamageParam_ValueMin": 145, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 1, - "InkRecoverStop": 25, - "InkConsume": 0.0115 - }, - "310": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 15, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "TripleShotSpanFrame": 20, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 410, - "DamageParam_ValueMin": 205, - "Jump_DegSwerve": 1, - "Stand_DegSwerve": 1, - "InkRecoverStop": 25, - "InkConsume": 0.0225 - }, - "311": { - "SpecialPoint": 200, - "subWeaponId": 4, - "specialWeaponId": 2, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "TripleShotSpanFrame": 20, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 410, - "DamageParam_ValueMin": 205, - "Jump_DegSwerve": 1, - "Stand_DegSwerve": 1, - "InkRecoverStop": 25, - "InkConsume": 0.0225 - }, - "400": { - "SpecialPoint": 210, - "subWeaponId": 4, - "specialWeaponId": 1, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 380, - "DamageParam_ValueMin": 190, - "Variable_Damage_ValueMax": 300, - "Variable_Damage_ValueMin": 150, - "Jump_DegSwerve": 0, - "Stand_DegSwerve": 0, - "Variable_Jump_DegSwerve": 13, - "Variable_Stand_DegSwerve": 8, - "InkConsume": 0.024 - }, - "401": { - "SpecialPoint": 190, - "subWeaponId": 7, - "specialWeaponId": 19, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 380, - "DamageParam_ValueMin": 190, - "Variable_Damage_ValueMax": 300, - "Variable_Damage_ValueMin": 150, - "Jump_DegSwerve": 0, - "Stand_DegSwerve": 0, - "Variable_Jump_DegSwerve": 13, - "Variable_Stand_DegSwerve": 8, - "InkConsume": 0.024 - }, - "1000": { - "SpecialPoint": 170, - "subWeaponId": 7, - "specialWeaponId": 3, - "WeaponSpeedType": "Fast", - "BodyParam_Damage": 700, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1200, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 250, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1000, - "InkConsume_WeaponSwingParam": 0.0396 - }, - "1001": { - "SpecialPoint": 190, - "subWeaponId": 2, - "specialWeaponId": 1, - "WeaponSpeedType": "Fast", - "BodyParam_Damage": 700, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1200, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 250, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1000, - "InkConsume_WeaponSwingParam": 0.0396 - }, - "1010": { - "SpecialPoint": 180, - "subWeaponId": 6, - "specialWeaponId": 2, - "BodyParam_Damage": 1250, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "InkConsume_WeaponSwingParam": 0.085 - }, - "1011": { - "SpecialPoint": 180, - "subWeaponId": 8, - "specialWeaponId": 17, - "BodyParam_Damage": 1250, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "InkConsume_WeaponSwingParam": 0.085 - }, - "1020": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 15, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "BodyParam_Damage": 1250, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1800, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1800, - "InkConsume_WeaponSwingParam": 0.18 - }, - "1021": { - "SpecialPoint": 190, - "subWeaponId": 0, - "specialWeaponId": 16, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "BodyParam_Damage": 1250, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1800, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1800, - "InkConsume_WeaponSwingParam": 0.18 - }, - "1030": { - "SpecialPoint": 210, - "subWeaponId": 10, - "specialWeaponId": 4, - "BodyParam_Damage": 1250, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 300, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 1500, - "InkConsume_WeaponVerticalSwingParam": 0.12, - "InkConsume_WeaponWideSwingParam": 0.08 - }, - "1040": { - "SpecialPoint": 190, - "subWeaponId": 4, - "specialWeaponId": 8, - "BodyParam_Damage": 700, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1200, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 700, - "InkConsume_WeaponSwingParam": 0.1 - }, - "1041": { - "SpecialPoint": 200, - "subWeaponId": 12, - "specialWeaponId": 5, - "BodyParam_Damage": 700, - "VerticalSwingUnitGroupParam_DamageParam_DamageMinValue": 400, - "VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue": 1200, - "WideSwingUnitGroupParam_DamageParam_DamageMinValue": 350, - "WideSwingUnitGroupParam_DamageParam_DamageMaxValue": 700, - "InkConsume_WeaponSwingParam": 0.1 - }, - "1100": { - "SpecialPoint": 180, - "subWeaponId": 0, - "specialWeaponId": 9, - "WeaponSpeedType": "Fast", - "BodyParam_Damage": 200, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 150, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 300, - "InkConsume_WeaponSwingParam": 0.02 - }, - "1101": { - "SpecialPoint": 180, - "subWeaponId": 10, - "specialWeaponId": 11, - "WeaponSpeedType": "Fast", - "BodyParam_Damage": 200, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 150, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 300, - "InkConsume_WeaponSwingParam": 0.02 - }, - "1110": { - "SpecialPoint": 200, - "subWeaponId": 1, - "specialWeaponId": 3, - "BodyParam_Damage": 250, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 200, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 400, - "InkConsume_WeaponSwingParam": 0.03 - }, - "1111": { - "SpecialPoint": 180, - "subWeaponId": 8, - "specialWeaponId": 5, - "BodyParam_Damage": 250, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 200, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 400, - "InkConsume_WeaponSwingParam": 0.03 - }, - "1120": { - "SpecialPoint": 200, - "subWeaponId": 6, - "specialWeaponId": 7, - "BodyParam_Damage": 300, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 310, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 600, - "InkConsume_WeaponSwingParam": 0.048 - }, - "1121": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 4, - "BodyParam_Damage": 300, - "SwingUnitGroupParam_DamageParam_DamageMinValue": 310, - "SwingUnitGroupParam_DamageParam_DamageMaxValue": 600, - "InkConsume_WeaponSwingParam": 0.048 - }, - "2000": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 2, - "MoveSpeedFullCharge": 0.03, - "DamageParam_ValueFullCharge": 1400, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 45, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge": 0.105, - "InkConsumeMinCharge": 0.018667 - }, - "2010": { - "SpecialPoint": 200, - "subWeaponId": 0, - "specialWeaponId": 8, - "MoveSpeedFullCharge": 0.02, - "DamageParam_ValueFullCharge": 1600, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge": 0.18, - "InkConsumeMinCharge": 0.0225 - }, - "2011": { - "SpecialPoint": 210, - "subWeaponId": 4, - "specialWeaponId": 14, - "MoveSpeedFullCharge": 0.02, - "DamageParam_ValueFullCharge": 1600, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge": 0.18, - "InkConsumeMinCharge": 0.0225 - }, - "2020": { - "SpecialPoint": 200, - "subWeaponId": 0, - "specialWeaponId": 8, - "MoveSpeedFullCharge": 0.02, - "DamageParam_ValueFullCharge": 1600, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "InkConsumeFullCharge": 0.18, - "InkConsumeMinCharge": 0.0225 - }, - "2021": { - "SpecialPoint": 210, - "subWeaponId": 4, - "specialWeaponId": 14, - "MoveSpeedFullCharge": 0.02, - "DamageParam_ValueFullCharge": 1600, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "InkConsumeFullCharge": 0.18, - "InkConsumeMinCharge": 0.0225 - }, - "2030": { - "SpecialPoint": 210, - "subWeaponId": 10, - "specialWeaponId": 7, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "MoveSpeedFullCharge": 0.015, - "DamageParam_ValueFullCharge": 1800, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 92, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge": 0.25, - "InkConsumeMinCharge": 0.0225 - }, - "2040": { - "SpecialPoint": 210, - "subWeaponId": 10, - "specialWeaponId": 7, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "MoveSpeedFullCharge": 0.015, - "DamageParam_ValueFullCharge": 1800, - "DamageParam_ValueMaxCharge": 800, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 92, - "InkConsumeFullCharge": 0.25, - "InkConsumeMinCharge": 0.0225 - }, - "2050": { - "SpecialPoint": 190, - "subWeaponId": 7, - "specialWeaponId": 9, - "WeaponSpeedType": "Fast", - "MoveSpeedFullCharge": 0.06, - "DamageParam_ValueFullCharge": 850, - "DamageParam_ValueMaxCharge": 850, - "DamageParam_ValueMinCharge": 300, - "ChargeFrameFullCharge": 20, - "InkConsumeFullCharge": 0.07, - "InkConsumeMinCharge": 0.028 - }, - "2060": { - "SpecialPoint": 200, - "subWeaponId": 13, - "specialWeaponId": 4, - "MoveSpeedFullCharge": 0.03, - "DamageParam_ValueFullCharge": 1800, - "DamageParam_ValueMaxCharge": 1300, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 75, - "KeepChargeFullFrame": 300, - "InkConsumeFullCharge": 0.15, - "InkConsumeMinCharge": 0.02 - }, - "2061": { - "SpecialPoint": 200, - "subWeaponId": 5, - "specialWeaponId": 11, - "MoveSpeedFullCharge": 0.03, - "DamageParam_ValueFullCharge": 1800, - "DamageParam_ValueMaxCharge": 1300, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 75, - "KeepChargeFullFrame": 300, - "InkConsumeFullCharge": 0.15, - "InkConsumeMinCharge": 0.02 - }, - "2070": { - "SpecialPoint": 200, - "subWeaponId": 3, - "specialWeaponId": 15, - "MoveSpeedFullCharge": 0.068, - "DamageParam_ValueFullCharge": 680, - "DamageParam_ValueMaxCharge": 680, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 72, - "InkConsumeFullCharge": 0.35, - "InkConsumeMinCharge": 0.0197 - }, - "2071": { - "SpecialPoint": 210, - "subWeaponId": 4, - "specialWeaponId": 5, - "MoveSpeedFullCharge": 0.068, - "DamageParam_ValueFullCharge": 680, - "DamageParam_ValueMaxCharge": 680, - "DamageParam_ValueMinCharge": 400, - "ChargeFrameFullCharge": 72, - "InkConsumeFullCharge": 0.35, - "InkConsumeMinCharge": 0.0197 - }, - "3000": { - "SpecialPoint": 200, - "subWeaponId": 0, - "specialWeaponId": 14, - "MoveSpeed": 0.04, - "DamageParam_ValueDirectMax": 700, - "DamageParam_ValueDirectMin": 500, - "InkRecoverStop": 40, - "InkConsumeSlosher": 0.07 - }, - "3001": { - "SpecialPoint": 180, - "subWeaponId": 12, - "specialWeaponId": 3, - "MoveSpeed": 0.04, - "DamageParam_ValueDirectMax": 700, - "DamageParam_ValueDirectMin": 500, - "InkRecoverStop": 40, - "InkConsumeSlosher": 0.07 - }, - "3010": { - "SpecialPoint": 180, - "subWeaponId": 11, - "specialWeaponId": 10, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.066, - "DamageParam_ValueDirectMax": 620, - "DamageParam_ValueDirectMin": 350, - "InkRecoverStop": 35, - "InkConsumeSlosher": 0.06 - }, - "3011": { - "SpecialPoint": 210, - "subWeaponId": 5, - "specialWeaponId": 15, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.066, - "DamageParam_ValueDirectMax": 620, - "DamageParam_ValueDirectMin": 350, - "InkRecoverStop": 35, - "InkConsumeSlosher": 0.06 - }, - "3020": { - "SpecialPoint": 220, - "subWeaponId": 5, - "specialWeaponId": 6, - "MoveSpeed": 0.07, - "DamageParam_ValueDirectMax": 760, - "DamageParam_ValueDirectMin": 520, - "BlastParam_SplashDamage": 380, - "InkRecoverStop": 42, - "InkConsumeSlosher": 0.092 - }, - "3021": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 1, - "MoveSpeed": 0.07, - "DamageParam_ValueDirectMax": 760, - "DamageParam_ValueDirectMin": 520, - "InkRecoverStop": 42, - "InkConsumeSlosher": 0.092 - }, - "3030": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 5, - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 300, - "InkRecoverStop": 40, - "InkConsumeSlosher": 0.08 - }, - "3031": { - "SpecialPoint": 200, - "subWeaponId": 12, - "specialWeaponId": 17, - "MoveSpeed": 0.05, - "DamageParam_ValueDirect": 300, - "InkRecoverStop": 40, - "InkConsumeSlosher": 0.08 - }, - "3040": { - "SpecialPoint": 200, - "subWeaponId": 9, - "specialWeaponId": 5, - "WeaponSpeedType": "Slow", - "MoveSpeed": 0.045, - "DamageParam_ValueDirect": 550, - "BlastParam_DistanceDamage": [ - { - "Damage": 350, - "Distance": 2.8 - } - ], - "InkRecoverStop": 70, - "InkConsumeSlosher": 0.117 - }, - "3050": { - "SpecialPoint": 190, - "subWeaponId": 1, - "specialWeaponId": 13, - "MoveSpeed": 0.04, - "DamageParam_ValueDirectMax": 480, - "DamageParam_ValueDirectMin": 350, - "DamageParam_Secondary_ValueDirectMax": 420, - "DamageParam_Secondary_ValueDirectMin": 350, - "InkRecoverStop": 50, - "InkConsumeSlosher": 0.09 - }, - "4000": { - "SpecialPoint": 190, - "subWeaponId": 2, - "specialWeaponId": 11, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.4, - "Low": 1, - "Mid": 1.2 - } - }, - "MoveSpeed": 0.086, - "MoveSpeed_Charge": 0.072, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 4, - "InkRecoverStop": 30, - "InkConsumeFullChargeSplatling": 0.15 - }, - "4001": { - "SpecialPoint": 190, - "subWeaponId": 11, - "specialWeaponId": 2, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.4, - "Low": 1, - "Mid": 1.2 - } - }, - "MoveSpeed": 0.086, - "MoveSpeed_Charge": 0.072, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 4, - "InkRecoverStop": 30, - "InkConsumeFullChargeSplatling": 0.15 - }, - "4010": { - "SpecialPoint": 200, - "subWeaponId": 3, - "specialWeaponId": 7, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.35, - "Low": 1, - "Mid": 1.175 - } - }, - "MoveSpeed": 0.07, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 7, - "Stand_DegSwerve": 3.3, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.225 - }, - "4011": { - "SpecialPoint": 200, - "subWeaponId": 9, - "specialWeaponId": 17, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.35, - "Low": 1, - "Mid": 1.175 - } - }, - "MoveSpeed": 0.07, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 7, - "Stand_DegSwerve": 3.3, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.225 - }, - "4020": { - "SpecialPoint": 190, - "subWeaponId": 7, - "specialWeaponId": 6, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Low": 1, - "Mid": 0.7 - }, - "MoveVelRt_Shot": { - "High": 1.35, - "Low": 1, - "Mid": 1.175 - } - }, - "WeaponSpeedType": "Slow", - "MoveSpeed": 0.06, - "MoveSpeed_Charge": 0.044, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "DamageParam_ValueFullChargeMax": 400, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 3, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.35 - }, - "4030": { - "SpecialPoint": 210, - "subWeaponId": 5, - "specialWeaponId": 10, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.25, - "Low": 1, - "Mid": 1.125 - } - }, - "MoveSpeed": 0.086, - "MoveSpeed_Charge": 0.086, - "MoveSpeedVariable": 0.05, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Variable_Damage_ValueMax": 300, - "Variable_Damage_ValueMin": 150, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 6, - "Variable_Jump_DegSwerve": 4, - "Variable_Stand_DegSwerve": 1.5, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.25 - }, - "4031": { - "SpecialPoint": 200, - "subWeaponId": 10, - "specialWeaponId": 8, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.25, - "Low": 1, - "Mid": 1.125 - } - }, - "MoveSpeed": 0.086, - "MoveSpeed_Charge": 0.086, - "MoveSpeedVariable": 0.05, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Variable_Damage_ValueMax": 300, - "Variable_Damage_ValueMin": 150, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 6, - "Variable_Jump_DegSwerve": 4, - "Variable_Stand_DegSwerve": 1.5, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.25 - }, - "4040": { - "SpecialPoint": 190, - "subWeaponId": 9, - "specialWeaponId": 5, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.3, - "Low": 1, - "Mid": 1.15 - } - }, - "MoveSpeed": 0.07, - "MoveSpeed_Charge": 0.04, - "DamageParam_ValueMax": 320, - "DamageParam_ValueMin": 160, - "KeepChargeFullFrame": 200, - "Jump_DegSwerve": 3.6, - "Stand_DegSwerve": 3.3, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.15 - }, - "4050": { - "SpecialPoint": 200, - "subWeaponId": 6, - "specialWeaponId": 15, - "overwrites": { - "MoveVelRt_Shot": { - "High": 1.4, - "Low": 1, - "Mid": 1.2 - } - }, - "MoveSpeed": 0.086, - "MoveSpeed_Charge": 0.072, - "DamageParam_ValueMax": 260, - "DamageParam_ValueMin": 130, - "Jump_DegSwerve": 6, - "Stand_DegSwerve": 3, - "InkRecoverStop": 40, - "InkConsumeFullChargeSplatling": 0.2 - }, - "5000": { - "SpecialPoint": 180, - "subWeaponId": 8, - "specialWeaponId": 15, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 7, - "InkConsume": 0.00663, - "InkConsume_SideStepParam": 0.05 - }, - "5001": { - "SpecialPoint": 190, - "subWeaponId": 13, - "specialWeaponId": 13, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "Jump_DegSwerve": 12, - "Stand_DegSwerve": 7, - "InkConsume": 0.00663, - "InkConsume_SideStepParam": 0.05 - }, - "5010": { - "SpecialPoint": 190, - "subWeaponId": 1, - "specialWeaponId": 12, - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 7.5, - "Stand_DegSwerve": 2, - "InkConsume": 0.0072, - "InkConsume_SideStepParam": 0.07 - }, - "5011": { - "SpecialPoint": 190, - "subWeaponId": 6, - "specialWeaponId": 18, - "MoveSpeed": 0.08, - "DamageParam_ValueMax": 300, - "DamageParam_ValueMin": 150, - "Jump_DegSwerve": 7.5, - "Stand_DegSwerve": 2, - "InkConsume": 0.0072, - "InkConsume_SideStepParam": 0.07 - }, - "5020": { - "SpecialPoint": 180, - "subWeaponId": 4, - "specialWeaponId": 6, - "MoveSpeed": 0.06, - "DamageParam_ValueMax": 360, - "DamageParam_ValueMin": 180, - "DamageLapOverParam_ValueMax": 525, - "DamageLapOverParam_ValueMin": 263, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 3.2, - "InkConsume": 0.014, - "InkConsume_SideStepParam": 0.08 - }, - "5030": { - "SpecialPoint": 200, - "subWeaponId": 0, - "specialWeaponId": 7, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 4, - "InkConsume": 0.012, - "InkConsume_SideStepParam": 0.08 - }, - "5031": { - "SpecialPoint": 210, - "subWeaponId": 8, - "specialWeaponId": 16, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 8, - "Stand_DegSwerve": 4, - "InkConsume": 0.012, - "InkConsume_SideStepParam": 0.08 - }, - "5040": { - "SpecialPoint": 200, - "subWeaponId": 7, - "specialWeaponId": 13, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 12.8, - "Stand_DegSwerve": 7.4, - "InkConsume": 0.008, - "InkConsume_SideStepParam": 0.03 - }, - "5041": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 3, - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 280, - "DamageParam_ValueMin": 140, - "Jump_DegSwerve": 12.8, - "Stand_DegSwerve": 7.4, - "InkConsume": 0.008, - "InkConsume_SideStepParam": 0.03 - }, - "6000": { - "SpecialPoint": 200, - "subWeaponId": 3, - "specialWeaponId": 14, - "MoveSpeed": 0.065, - "DamageParam_ValueMax": 810, - "InkConsumeUmbrella_WeaponShelterCanopyParam": 0.3, - "InkConsume_WeaponShelterShotgunParam": 0.055 - }, - "6001": { - "SpecialPoint": 190, - "subWeaponId": 7, - "specialWeaponId": 10, - "MoveSpeed": 0.065, - "DamageParam_ValueMax": 810, - "InkConsumeUmbrella_WeaponShelterCanopyParam": 0.3, - "InkConsume_WeaponShelterShotgunParam": 0.055 - }, - "6010": { - "SpecialPoint": 190, - "subWeaponId": 8, - "specialWeaponId": 8, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "MoveSpeed": 0.05, - "DamageParam_ValueMax": 1190, - "CanopyHP": 7000, - "InkConsumeUmbrella_WeaponShelterCanopyParam": 0.3, - "InkConsume_WeaponShelterShotgunParam": 0.11 - }, - "6011": { - "SpecialPoint": 200, - "subWeaponId": 10, - "specialWeaponId": 1, - "overwrites": { - "ConsumeRt_Main": { - "High": 0.5, - "Mid": 0.7 - } - }, - "WeaponSpeedType": "Slow", - "MoveSpeed": 0.05, - "DamageParam_ValueMax": 1190, - "CanopyHP": 7000, - "InkConsumeUmbrella_WeaponShelterCanopyParam": 0.3, - "InkConsume_WeaponShelterShotgunParam": 0.11 - }, - "6020": { - "SpecialPoint": 180, - "subWeaponId": 10, - "specialWeaponId": 13, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 400, - "CanopyHP": 2000, - "InkConsume_WeaponShelterShotgunParam": 0.04 - }, - "6021": { - "SpecialPoint": 180, - "subWeaponId": 13, - "specialWeaponId": 19, - "WeaponSpeedType": "Fast", - "MoveSpeed": 0.072, - "DamageParam_ValueMax": 400, - "CanopyHP": 2000, - "InkConsume_WeaponShelterShotgunParam": 0.04 - }, - "7010": { - "SpecialPoint": 190, - "subWeaponId": 11, - "specialWeaponId": 9, - "MoveSpeedFullCharge": 0.068, - "DamageParam_ValueMax": 350, - "DamageParam_ValueMin": 300, - "BlastParam_DistanceDamage": [ - { - "Damage": 300, - "Distance": 2 - } - ], - "ChargeFrameFullCharge": 72, - "InkConsumeFullCharge_ChargeParam": 0.085 - }, - "7011": { - "SpecialPoint": 190, - "subWeaponId": 3, - "specialWeaponId": 16, - "MoveSpeedFullCharge": 0.068, - "DamageParam_ValueMax": 350, - "DamageParam_ValueMin": 300, - "BlastParam_DistanceDamage": [ - { - "Damage": 300, - "Distance": 2 - } - ], - "ChargeFrameFullCharge": 72, - "InkConsumeFullCharge_ChargeParam": 0.085 - }, - "7020": { - "SpecialPoint": 210, - "subWeaponId": 6, - "specialWeaponId": 4, - "WeaponSpeedType": "Fast", - "MoveSpeedFullCharge": 0.084, - "DamageParam_ValueMax": 450, - "DamageParam_ValueMin": 300, - "ChargeFrameFullCharge": 34, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge_ChargeParam": 0.065 - }, - "7021": { - "SpecialPoint": 200, - "subWeaponId": 4, - "specialWeaponId": 13, - "WeaponSpeedType": "Fast", - "MoveSpeedFullCharge": 0.084, - "DamageParam_ValueMax": 450, - "DamageParam_ValueMin": 300, - "BlastParam_DistanceDamage": [ - { - "Damage": 280, - "Distance": 2 - } - ], - "ChargeFrameFullCharge": 34, - "KeepChargeFullFrame": 75, - "InkConsumeFullCharge_ChargeParam": 0.065 - }, - "8000": { - "SpecialPoint": 210, - "subWeaponId": 2, - "specialWeaponId": 3, - "DamageParam_SplatanaVerticalDirect": 1400, - "DamageParam_SplatanaVertical": 700, - "DamageParam_SplatanaHorizontalDirect": 550, - "DamageParam_SplatanaHorizontal": 350, - "InkConsume_SwingParam": 0.052, - "InkConsumeFullCharge_ChargeParam": 0.117 - }, - "8001": { - "SpecialPoint": 210, - "subWeaponId": 11, - "specialWeaponId": 12, - "DamageParam_SplatanaVerticalDirect": 1400, - "DamageParam_SplatanaVertical": 700, - "DamageParam_SplatanaHorizontalDirect": 550, - "DamageParam_SplatanaHorizontal": 350, - "InkConsume_SwingParam": 0.052, - "InkConsumeFullCharge_ChargeParam": 0.117 - }, - "8010": { - "SpecialPoint": 190, - "subWeaponId": 13, - "specialWeaponId": 11, - "WeaponSpeedType": "Fast", - "DamageParam_SplatanaVerticalDirect": 1200, - "DamageParam_SplatanaVertical": 600, - "DamageParam_SplatanaHorizontalDirect": 450, - "DamageParam_SplatanaHorizontal": 300, - "InkConsume_SwingParam": 0.03, - "InkConsumeFullCharge_ChargeParam": 0.06 - }, - "8011": { - "SpecialPoint": 190, - "subWeaponId": 8, - "specialWeaponId": 4, - "WeaponSpeedType": "Fast", - "DamageParam_SplatanaVerticalDirect": 1200, - "DamageParam_SplatanaVertical": 600, - "DamageParam_SplatanaHorizontalDirect": 450, - "DamageParam_SplatanaHorizontal": 300, - "InkConsume_SwingParam": 0.03, - "InkConsumeFullCharge_ChargeParam": 0.06 - } - }, - "subWeapons": { - "0": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - } - }, - "SubInkSaveLv": 2, - "InkConsume": 0.7, - "InkRecoverStop": 60, - "DistanceDamage": [ - { - "Damage": 1800, - "Distance": 3.6 - }, - { - "Damage": 300, - "Distance": 7 - } - ] - }, - "1": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - } - }, - "SubInkSaveLv": 2, - "InkConsume": 0.7, - "InkRecoverStop": 60, - "DistanceDamage": [ - { - "Damage": 1800, - "Distance": 4.6 - }, - { - "Damage": 300, - "Distance": 8 - } - ] - }, - "2": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - } - }, - "SubInkSaveLv": 4, - "InkConsume": 0.45, - "InkRecoverStop": 60, - "DistanceDamage": [ - { - "Damage": 350, - "Distance": 2.8 - }, - { - "Damage": 250, - "Distance": 4 - } - ] - }, - "3": { - "overwrites": { - "PeriodFirst": { - "High": 780, - "Low": 480, - "Mid": 630 - }, - "PeriodSecond": { - "High": 1020, - "Low": 900, - "Mid": 960 - } - }, - "SubInkSaveLv": 3, - "InkConsume": 0.6, - "InkRecoverStop": 60 - }, - "4": { - "overwrites": { - "MaxHP": { - "High": 15000, - "Low": 8000, - "Mid": 11500 - } - }, - "SubInkSaveLv": 2, - "InkConsume": 0.6, - "InkRecoverStop": 85 - }, - "5": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.84, - "Low": 1.36, - "Mid": 1.6 - } - }, - "SubInkSaveLv": 1, - "InkConsume": 0.6, - "InkRecoverStop": 85, - "DistanceDamage_BlastParamArray": [ - [ - { - "Damage": 500, - "Distance": 1.6 - }, - { - "Damage": 350, - "Distance": 3.8 - } - ], - [ - { - "Damage": 500, - "Distance": 1.95 - }, - { - "Damage": 350, - "Distance": 4.5 - } - ], - [ - { - "Damage": 500, - "Distance": 2.6 - }, - { - "Damage": 350, - "Distance": 5.45 - } - ] - ] - }, - "6": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 0.52, - "Low": 0.4, - "Mid": 0.46 - } - }, - "SubInkSaveLv": 2, - "InkConsume": 0.65, - "InkRecoverStop": 70, - "DistanceDamage": [ - [ - { - "Damage": 1800, - "Distance": 4.6 - }, - { - "Damage": 300, - "Distance": 8 - } - ], - [ - { - "Damage": 1800, - "Distance": 1.6 - }, - { - "Damage": 300, - "Distance": 5 - } - ] - ], - "DirectDamage": 200 - }, - "7": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - } - }, - "SubInkSaveLv": 1, - "InkConsume": 0.55, - "InkRecoverStop": 85, - "DistanceDamage": [ - { - "Damage": 1800, - "Distance": 2.85 - }, - { - "Damage": 300, - "Distance": 6.5 - } - ] - }, - "8": { - "overwrites": { - "SubSpecUpParam": { - "Low": 0, - "High": 57, - "Mid": 25 - } - }, - "SubInkSaveLv": 3, - "InkConsume": 0.75, - "InkRecoverStop": 0 - }, - "9": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.87, - "Low": 1.38, - "Mid": 1.64 - }, - "MarkingFrameSubSpec": { - "High": 960, - "Low": 480, - "Mid": 720 - } - }, - "SubInkSaveLv": 1, - "InkConsume": 0.45, - "InkRecoverStop": 75 - }, - "10": { - "overwrites": { - "MarkingFrameSubSpec": { - "High": 600, - "Low": 300, - "Mid": 450 - }, - "SensorRadius": { - "High": 4, - "Low": 3, - "Mid": 3.5 - }, - "ExplosionRadius": { - "High": 11, - "Low": 8, - "Mid": 9.5 - } - }, - "SubInkSaveLv": 3, - "InkConsume": 0.6, - "InkRecoverStop": 0, - "DistanceDamage": [ - { - "Damage": 450, - "Distance": 3.6 - }, - { - "Damage": 350, - "Distance": 8 - } - ] - }, - "11": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - } - }, - "SubInkSaveLv": 1, - "InkConsume": 0.6, - "InkRecoverStop": 75 - }, - "12": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 6.48, - "Low": 6, - "Mid": 6.24 - }, - "MarkingFrameSubSpec": { - "High": 600, - "Low": 300, - "Mid": 450 - } - }, - "SubInkSaveLv": 0, - "InkConsume": 0.4, - "InkRecoverStop": 50, - "DirectDamage": 400 - }, - "13": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.84, - "Low": 1.36, - "Mid": 1.6 - } - }, - "SubInkSaveLv": 2, - "InkConsume": 0.65, - "InkRecoverStop": 88, - "DistanceDamage_BlastParamChase": [ - { - "Damage": 600, - "Distance": 2.6 - }, - { - "Damage": 350, - "Distance": 6 - } - ], - "DistanceDamage_SplashBlastParam": [ - { - "Damage": 120, - "Distance": 2.6 - } - ] - } - }, - "specialWeapons": { - "1": { - "overwrites": { - "PaintRadius": { - "High": 4, - "Low": 3.2, - "Mid": 3.6 - }, - "DistanceDamageDistanceRate": { - "High": 1.3, - "Low": 1, - "Mid": 1.15 - }, - "SpecialDurationFrame": { - "High": 480, - "Low": 360, - "Mid": 420 - } - }, - "DistanceDamage": [ - { - "Damage": 530, - "Distance": 4 - } - ], - "DirectDamage": 2200 - }, - "2": { - "overwrites": { - "MaxFieldHP": { - "High": 28800, - "Low": 24000, - "Mid": 26400 - }, - "MaxHP": { - "High": 14400, - "Low": 12000, - "Mid": 13200 - } - } - }, - "3": { - "overwrites": { - "InkConsume_Hook": { - "High": 0.0225, - "Low": 0.06, - "Mid": 0.0375 - }, - "InkConsume_PerSec": { - "High": 0.12, - "Low": 0.15, - "Mid": 0.1305 - } - }, - "DistanceDamage": [ - { - "Damage": 450, - "Distance": 4.8 - }, - { - "Damage": 350, - "Distance": 6 - } - ] - }, - "4": { - "overwrites": { - "TargetInCircleRadius": { - "High": 240, - "Low": 140, - "Mid": 190 - } - }, - "DistanceDamage": [ - { - "Damage": 1500, - "Distance": 1.1 - }, - { - "Damage": 500, - "Distance": 2.1 - }, - { - "Damage": 300, - "Distance": 4.25 - } - ] - }, - "5": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - }, - "SpecialDurationFrame": { - "High": 600, - "Low": 480, - "Mid": 540 - } - }, - "TickDamage": 4 - }, - "6": { - "overwrites": { - "ChargeRateAutoPerFrame": { - "High": 0.01, - "Low": 0.002, - "Mid": 0.006 - } - }, - "TickDamage": 33 - }, - "7": { - "overwrites": { - "MaxFrame": { - "High": 216, - "Low": 160, - "Mid": 192 - }, - "MaxRadius": { - "High": 27, - "Low": 20, - "Mid": 24 - } - }, - "DirectDamage": 300, - "WaveDamage": 450 - }, - "8": { - "overwrites": { - "RadiusMax": { - "High": 4.3, - "Low": 3.3, - "Mid": 3.8 - }, - "RadiusMin": { - "High": 1.4, - "Low": 0.8, - "Mid": 1.1 - } - }, - "ExhaleBlastParamMinChargeDistanceDamage": [ - { - "Damage": 2200, - "Distance": 6 - } - ], - "ExhaleBlastParamMaxChargeDistanceDamage": [ - { - "Damage": 2200, - "Distance": 10 - } - ] - }, - "9": { - "overwrites": { - "SpecialDurationFrame": { - "High": 240, - "Low": 180, - "Mid": 220 - } - }, - "TickDamage": 35 - }, - "10": { - "overwrites": { - "DistanceDamageDistanceRate": { - "High": 1.3, - "Low": 1, - "Mid": 1.15 - }, - "SplashAroundVelocityMin": { - "High": 0.52, - "Low": 0.49, - "Mid": 0.505 - }, - "SplashAroundVelocityMax": { - "High": 0.35, - "Low": 0.33, - "Mid": 0.34 - }, - "SpecialDurationFrame": { - "High": 510, - "Low": 450, - "Mid": 480 - }, - "PaintRadius": { - "High": 3.9000000000000004, - "Mid": 3.865, - "Low": 3.83 - } - }, - "DistanceDamage": [ - { - "Damage": 500, - "Distance": 2.55 - }, - { - "Damage": 300, - "Distance": 5 - } - ], - "DirectDamage": 1200 - }, - "11": { - "overwrites": { - "SpecialDurationFrame": { - "High": 660, - "Low": 450, - "Mid": 570 - } - }, - "SwingDamage": [ - { - "Damage": 1000, - "Distance": 0 - }, - { - "Damage": 400, - "Distance": 4 - } - ], - "ThrowDamage": [ - { - "Damage": 600, - "Distance": 4 - }, - { - "Damage": 300, - "Distance": 8 - } - ], - "ThrowDirectDamage": 2200 - }, - "12": { - "ArmorHP": 5000, - "overwrites": { - "SpecialDurationFrame": { - "High": 660, - "Low": 480, - "Mid": 570 - } - }, - "BulletDamageMin": 160, - "BulletDamageMax": 320, - "CannonDamage": [ - { - "Damage": 600, - "Distance": 1 - }, - { - "Damage": 300, - "Distance": 5.6 - } - ], - "BumpDamage": 400 - }, - "13": { - "overwrites": { - "DistanceDamageDistanceRate": { - "High": 1.2, - "Low": 1, - "Mid": 1.1 - }, - "PaintRadius": { - "High": 11.399999999999999, - "Mid": 10.45, - "Low": 9.5 - }, - "SplashAroundVelocityMin": { - "High": 0.7, - "Low": 0.6, - "Mid": 0.65 - }, - "SplashAroundVelocityMax": { - "High": 0.8, - "Low": 0.7, - "Mid": 0.75 - } - }, - "DistanceDamage": [ - { - "Damage": 2200, - "Distance": 7.5 - }, - { - "Damage": 700, - "Distance": 13.5 - } - ] - }, - "14": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 2.6, - "Low": 2, - "Mid": 2.3 - } - } - }, - "15": { - "overwrites": { - "PowerUpFrame": { - "High": 1500, - "Low": 1020, - "Mid": 1290 - } - } - }, - "16": { - "overwrites": { - "CrossPaintCheckLength": { - "High": 3, - "Low": 2.5, - "Mid": 2.75 - }, - "CrossPaintRadius": { - "High": 3, - "Low": 2.5, - "Mid": 2.75 - }, - "DistanceDamageDistanceRate": { - "High": 1.2, - "Low": 1, - "Mid": 1.1 - } - }, - "DistanceDamage": [ - { - "Damage": 700, - "Distance": 3.6 - }, - { - "Damage": 350, - "Distance": 6 - } - ] - }, - "17": { - "overwrites": { - "SpecialDurationFrame": { - "High": 600, - "Low": 480, - "Mid": 540 - } - }, - "DirectDamage": 1200, - "JumpDamage": 600 - }, - "18": { - "overwrites": { - "DistanceDamageDistanceRate": { - "High": 1.1, - "Low": 1, - "Mid": 1.05 - }, - "PaintRadius": { - "High": 10.8, - "Low": 9, - "Mid": 9.9 - } - }, - "DistanceDamage": [ - { - "Damage": 2200, - "Distance": 7 - }, - { - "Damage": 600, - "Distance": 12 - } - ] - }, - "19": { - "overwrites": { - "SpawnSpeedZSpecUp": { - "High": 1.68, - "Low": 1.12, - "Mid": 1.4 - }, - "MoveSpeed": { - "High": 0.06, - "Low": 0.04, - "Mid": 0.053 - } - } - } - } -} diff --git a/app/features/build-analyzer/core/weapon-params.ts b/app/features/build-analyzer/core/weapon-params.ts new file mode 100644 index 000000000..3095156e1 --- /dev/null +++ b/app/features/build-analyzer/core/weapon-params.ts @@ -0,0 +1,2354 @@ +export const weaponParams = { + mainWeapons: { + "0": { + SpecialPoint: 180, + subWeaponId: 6, + specialWeaponId: 11, + WeaponSpeedType: "Fast", + MoveSpeed: 0.08, + DamageParam_ValueMax: 380, + DamageParam_ValueMin: 190, + Jump_DegSwerve: 18, + Stand_DegSwerve: 12, + InkRecoverStop: 15, + InkConsume: 0.008, + }, + "1": { + SpecialPoint: 170, + subWeaponId: 8, + specialWeaponId: 9, + WeaponSpeedType: "Fast", + MoveSpeed: 0.08, + DamageParam_ValueMax: 380, + DamageParam_ValueMin: 190, + Jump_DegSwerve: 18, + Stand_DegSwerve: 12, + InkRecoverStop: 15, + InkConsume: 0.008, + }, + "10": { + SpecialPoint: 180, + subWeaponId: 0, + specialWeaponId: 2, + WeaponSpeedType: "Fast", + MoveSpeed: 0.076, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 15, + Stand_DegSwerve: 12, + InkRecoverStop: 15, + InkConsume: 0.0043, + }, + "11": { + SpecialPoint: 190, + subWeaponId: 13, + specialWeaponId: 7, + WeaponSpeedType: "Fast", + MoveSpeed: 0.076, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 15, + Stand_DegSwerve: 12, + InkRecoverStop: 15, + InkConsume: 0.0043, + }, + "20": { + SpecialPoint: 200, + subWeaponId: 2, + specialWeaponId: 12, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 0, + Stand_DegSwerve: 0, + InkConsume: 0.008, + }, + "21": { + SpecialPoint: 210, + subWeaponId: 1, + specialWeaponId: 14, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 0, + Stand_DegSwerve: 0, + InkConsume: 0.008, + }, + "30": { + SpecialPoint: 180, + subWeaponId: 5, + specialWeaponId: 13, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 240, + DamageParam_ValueMin: 120, + Jump_DegSwerve: 16, + Stand_DegSwerve: 13, + InkRecoverStop: 15, + InkConsume: 0.005, + }, + "31": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 6, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 240, + DamageParam_ValueMin: 120, + Jump_DegSwerve: 16, + Stand_DegSwerve: 13, + InkRecoverStop: 15, + InkConsume: 0.005, + }, + "40": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 1, + MoveSpeed: 0.072, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + Jump_DegSwerve: 12, + Stand_DegSwerve: 5, + InkConsume: 0.0092, + }, + "41": { + SpecialPoint: 190, + subWeaponId: 0, + specialWeaponId: 14, + MoveSpeed: 0.072, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + Jump_DegSwerve: 12, + Stand_DegSwerve: 5, + InkConsume: 0.0092, + }, + "45": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 1, + MoveSpeed: 0.072, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + Jump_DegSwerve: 12, + Stand_DegSwerve: 5, + InkConsume: 0.0092, + }, + "50": { + SpecialPoint: 190, + subWeaponId: 4, + specialWeaponId: 9, + MoveSpeed: 0.06, + DamageParam_ValueMax: 520, + DamageParam_ValueMin: 300, + Jump_DegSwerve: 12, + Stand_DegSwerve: 6, + InkConsume: 0.013, + }, + "60": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 15, + WeaponSpeedType: "Fast", + MoveSpeed: 0.084, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 12, + Stand_DegSwerve: 5, + InkConsume: 0.008, + }, + "61": { + SpecialPoint: 180, + subWeaponId: 7, + specialWeaponId: 16, + WeaponSpeedType: "Fast", + MoveSpeed: 0.084, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 12, + Stand_DegSwerve: 5, + InkConsume: 0.008, + }, + "70": { + SpecialPoint: 180, + subWeaponId: 12, + specialWeaponId: 12, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + MoveSpeed: 0.055, + DamageParam_ValueMax: 420, + DamageParam_ValueMin: 210, + Jump_DegSwerve: 6, + Stand_DegSwerve: 2.7, + InkConsume: 0.02, + }, + "71": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 6, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + MoveSpeed: 0.055, + DamageParam_ValueMax: 420, + DamageParam_ValueMin: 210, + Jump_DegSwerve: 6, + Stand_DegSwerve: 2.7, + InkConsume: 0.02, + }, + "80": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 8, + MoveSpeed: 0.04, + DamageParam_ValueMax: 620, + DamageParam_ValueMin: 350, + Jump_DegSwerve: 11.3511, + Stand_DegSwerve: 4, + InkConsume: 0.023, + }, + "81": { + SpecialPoint: 210, + subWeaponId: 4, + specialWeaponId: 17, + MoveSpeed: 0.04, + DamageParam_ValueMax: 620, + DamageParam_ValueMin: 350, + Jump_DegSwerve: 11.3511, + Stand_DegSwerve: 4, + InkConsume: 0.023, + }, + "90": { + SpecialPoint: 180, + subWeaponId: 12, + specialWeaponId: 8, + MoveSpeed: 0.06, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + Jump_DegSwerve: 8, + Stand_DegSwerve: 2.5, + InkConsume: 0.016, + }, + "91": { + SpecialPoint: 180, + subWeaponId: 11, + specialWeaponId: 5, + MoveSpeed: 0.06, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + Jump_DegSwerve: 8, + Stand_DegSwerve: 2.5, + InkConsume: 0.016, + }, + "100": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 9, + MoveSpeed: 0.079, + DamageParam_ValueMax: 240, + DamageParam_ValueMin: 120, + Jump_DegSwerve: 12, + Stand_DegSwerve: 6, + InkConsume: 0.0096, + }, + "101": { + SpecialPoint: 210, + subWeaponId: 10, + specialWeaponId: 10, + MoveSpeed: 0.079, + DamageParam_ValueMax: 240, + DamageParam_ValueMin: 120, + Jump_DegSwerve: 12, + Stand_DegSwerve: 6, + InkConsume: 0.0096, + }, + "200": { + SpecialPoint: 170, + subWeaponId: 0, + specialWeaponId: 3, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + ReduceJumpSwerveRate: { + Mid: 0.625, + }, + }, + WeaponSpeedType: "Fast", + MoveSpeed: 0.05, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 1.5, + }, + { + Damage: 500, + Distance: 3.57, + }, + ], + Jump_DegSwerve: 6, + Stand_DegSwerve: 0, + InkRecoverStop: 55, + InkConsume: 0.075, + }, + "201": { + SpecialPoint: 180, + subWeaponId: 5, + specialWeaponId: 11, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + ReduceJumpSwerveRate: { + Mid: 0.625, + }, + }, + WeaponSpeedType: "Fast", + MoveSpeed: 0.05, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 1.5, + }, + { + Damage: 500, + Distance: 3.57, + }, + ], + Jump_DegSwerve: 6, + Stand_DegSwerve: 0, + InkRecoverStop: 55, + InkConsume: 0.075, + }, + "210": { + SpecialPoint: 180, + subWeaponId: 7, + specialWeaponId: 2, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.045, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 0.94, + }, + { + Damage: 500, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 10, + Stand_DegSwerve: 0, + InkRecoverStop: 60, + InkConsume: 0.1, + }, + "211": { + SpecialPoint: 180, + subWeaponId: 9, + specialWeaponId: 18, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.045, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 0.94, + }, + { + Damage: 500, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 10, + Stand_DegSwerve: 0, + InkRecoverStop: 60, + InkConsume: 0.1, + }, + "220": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 7, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.04, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 1, + }, + { + Damage: 500, + Distance: 3.5, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 70, + InkConsume: 0.11, + }, + "230": { + SpecialPoint: 180, + subWeaponId: 0, + specialWeaponId: 1, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + WeaponSpeedType: "Fast", + MoveSpeed: 0.065, + DamageParam_ValueDirect: 600, + BlastParam_DistanceDamage: [ + { + Damage: 300, + Distance: 1, + }, + { + Damage: 300, + Distance: 4, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 40, + InkConsume: 0.04, + }, + "231": { + SpecialPoint: 170, + subWeaponId: 6, + specialWeaponId: 16, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + WeaponSpeedType: "Fast", + MoveSpeed: 0.065, + DamageParam_ValueDirect: 600, + BlastParam_DistanceDamage: [ + { + Damage: 300, + Distance: 1, + }, + { + Damage: 300, + Distance: 4, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 40, + InkConsume: 0.04, + }, + "240": { + SpecialPoint: 190, + subWeaponId: 10, + specialWeaponId: 14, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.055, + DamageParam_ValueDirect: 850, + BlastParam_DistanceDamage: [ + { + Damage: 350, + Distance: 0.94, + }, + { + Damage: 350, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 50, + InkConsume: 0.07, + }, + "241": { + SpecialPoint: 210, + subWeaponId: 13, + specialWeaponId: 10, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.055, + DamageParam_ValueDirect: 850, + BlastParam_DistanceDamage: [ + { + Damage: 350, + Distance: 0.94, + }, + { + Damage: 350, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 50, + InkConsume: 0.07, + }, + "250": { + SpecialPoint: 180, + subWeaponId: 11, + specialWeaponId: 8, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.05, + DamageParam_ValueDirect: 850, + BlastParam_DistanceDamage: [ + { + Damage: 350, + Distance: 0.94, + }, + { + Damage: 350, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 50, + InkConsume: 0.08, + }, + "251": { + SpecialPoint: 190, + subWeaponId: 12, + specialWeaponId: 9, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.5, + }, + }, + MoveSpeed: 0.05, + DamageParam_ValueDirect: 850, + BlastParam_DistanceDamage: [ + { + Damage: 350, + Distance: 0.94, + }, + { + Damage: 350, + Distance: 3.3, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 50, + InkConsume: 0.08, + }, + "260": { + SpecialPoint: 180, + subWeaponId: 3, + specialWeaponId: 13, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.625, + }, + }, + MoveSpeed: 0.04, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 1, + }, + { + Damage: 500, + Distance: 1.8, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 60, + InkConsume: 0.085, + }, + "261": { + SpecialPoint: 190, + subWeaponId: 2, + specialWeaponId: 6, + overwrites: { + ReduceJumpSwerveRate: { + Mid: 0.625, + }, + }, + MoveSpeed: 0.04, + DamageParam_ValueDirect: 1250, + BlastParam_DistanceDamage: [ + { + Damage: 700, + Distance: 1, + }, + { + Damage: 500, + Distance: 1.8, + }, + ], + Jump_DegSwerve: 8, + Stand_DegSwerve: 0, + InkRecoverStop: 60, + InkConsume: 0.085, + }, + "300": { + SpecialPoint: 190, + subWeaponId: 6, + specialWeaponId: 12, + TripleShotSpanFrame: 8, + MoveSpeed: 0.08, + DamageParam_ValueMax: 290, + DamageParam_ValueMin: 145, + Jump_DegSwerve: 6, + Stand_DegSwerve: 1, + InkRecoverStop: 25, + InkConsume: 0.0115, + }, + "301": { + SpecialPoint: 200, + subWeaponId: 2, + specialWeaponId: 11, + TripleShotSpanFrame: 8, + MoveSpeed: 0.08, + DamageParam_ValueMax: 290, + DamageParam_ValueMin: 145, + Jump_DegSwerve: 6, + Stand_DegSwerve: 1, + InkRecoverStop: 25, + InkConsume: 0.0115, + }, + "310": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 15, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + TripleShotSpanFrame: 20, + MoveSpeed: 0.06, + DamageParam_ValueMax: 410, + DamageParam_ValueMin: 205, + Jump_DegSwerve: 1, + Stand_DegSwerve: 1, + InkRecoverStop: 25, + InkConsume: 0.0225, + }, + "311": { + SpecialPoint: 200, + subWeaponId: 4, + specialWeaponId: 2, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + TripleShotSpanFrame: 20, + MoveSpeed: 0.06, + DamageParam_ValueMax: 410, + DamageParam_ValueMin: 205, + Jump_DegSwerve: 1, + Stand_DegSwerve: 1, + InkRecoverStop: 25, + InkConsume: 0.0225, + }, + "400": { + SpecialPoint: 210, + subWeaponId: 4, + specialWeaponId: 1, + MoveSpeed: 0.072, + DamageParam_ValueMax: 380, + DamageParam_ValueMin: 190, + Variable_Damage_ValueMax: 300, + Variable_Damage_ValueMin: 150, + Jump_DegSwerve: 0, + Stand_DegSwerve: 0, + Variable_Jump_DegSwerve: 13, + Variable_Stand_DegSwerve: 8, + InkConsume: 0.024, + }, + "401": { + SpecialPoint: 190, + subWeaponId: 7, + specialWeaponId: 19, + MoveSpeed: 0.072, + DamageParam_ValueMax: 380, + DamageParam_ValueMin: 190, + Variable_Damage_ValueMax: 300, + Variable_Damage_ValueMin: 150, + Jump_DegSwerve: 0, + Stand_DegSwerve: 0, + Variable_Jump_DegSwerve: 13, + Variable_Stand_DegSwerve: 8, + InkConsume: 0.024, + }, + "1000": { + SpecialPoint: 170, + subWeaponId: 7, + specialWeaponId: 3, + WeaponSpeedType: "Fast", + BodyParam_Damage: 700, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1200, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 250, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1000, + InkConsume_WeaponSwingParam: 0.0396, + }, + "1001": { + SpecialPoint: 190, + subWeaponId: 2, + specialWeaponId: 1, + WeaponSpeedType: "Fast", + BodyParam_Damage: 700, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1200, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 250, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1000, + InkConsume_WeaponSwingParam: 0.0396, + }, + "1010": { + SpecialPoint: 180, + subWeaponId: 6, + specialWeaponId: 2, + BodyParam_Damage: 1250, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + InkConsume_WeaponSwingParam: 0.085, + }, + "1011": { + SpecialPoint: 180, + subWeaponId: 8, + specialWeaponId: 17, + BodyParam_Damage: 1250, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + InkConsume_WeaponSwingParam: 0.085, + }, + "1020": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 15, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + BodyParam_Damage: 1250, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1800, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1800, + InkConsume_WeaponSwingParam: 0.18, + }, + "1021": { + SpecialPoint: 190, + subWeaponId: 0, + specialWeaponId: 16, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + BodyParam_Damage: 1250, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1800, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1800, + InkConsume_WeaponSwingParam: 0.18, + }, + "1030": { + SpecialPoint: 210, + subWeaponId: 10, + specialWeaponId: 4, + BodyParam_Damage: 1250, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 300, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 1500, + InkConsume_WeaponVerticalSwingParam: 0.12, + InkConsume_WeaponWideSwingParam: 0.08, + }, + "1040": { + SpecialPoint: 190, + subWeaponId: 4, + specialWeaponId: 8, + BodyParam_Damage: 700, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1200, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 700, + InkConsume_WeaponSwingParam: 0.1, + }, + "1041": { + SpecialPoint: 200, + subWeaponId: 12, + specialWeaponId: 5, + BodyParam_Damage: 700, + VerticalSwingUnitGroupParam_DamageParam_DamageMinValue: 400, + VerticalSwingUnitGroupParam_DamageParam_DamageMaxValue: 1200, + WideSwingUnitGroupParam_DamageParam_DamageMinValue: 350, + WideSwingUnitGroupParam_DamageParam_DamageMaxValue: 700, + InkConsume_WeaponSwingParam: 0.1, + }, + "1100": { + SpecialPoint: 180, + subWeaponId: 0, + specialWeaponId: 9, + WeaponSpeedType: "Fast", + BodyParam_Damage: 200, + SwingUnitGroupParam_DamageParam_DamageMinValue: 150, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 300, + InkConsume_WeaponSwingParam: 0.02, + }, + "1101": { + SpecialPoint: 180, + subWeaponId: 10, + specialWeaponId: 11, + WeaponSpeedType: "Fast", + BodyParam_Damage: 200, + SwingUnitGroupParam_DamageParam_DamageMinValue: 150, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 300, + InkConsume_WeaponSwingParam: 0.02, + }, + "1110": { + SpecialPoint: 200, + subWeaponId: 1, + specialWeaponId: 3, + BodyParam_Damage: 250, + SwingUnitGroupParam_DamageParam_DamageMinValue: 200, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 400, + InkConsume_WeaponSwingParam: 0.03, + }, + "1111": { + SpecialPoint: 180, + subWeaponId: 8, + specialWeaponId: 5, + BodyParam_Damage: 250, + SwingUnitGroupParam_DamageParam_DamageMinValue: 200, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 400, + InkConsume_WeaponSwingParam: 0.03, + }, + "1120": { + SpecialPoint: 200, + subWeaponId: 6, + specialWeaponId: 7, + BodyParam_Damage: 300, + SwingUnitGroupParam_DamageParam_DamageMinValue: 310, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 600, + InkConsume_WeaponSwingParam: 0.048, + }, + "1121": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 4, + BodyParam_Damage: 300, + SwingUnitGroupParam_DamageParam_DamageMinValue: 310, + SwingUnitGroupParam_DamageParam_DamageMaxValue: 600, + InkConsume_WeaponSwingParam: 0.048, + }, + "2000": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 2, + MoveSpeedFullCharge: 0.03, + DamageParam_ValueFullCharge: 1400, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 45, + KeepChargeFullFrame: 75, + InkConsumeFullCharge: 0.105, + InkConsumeMinCharge: 0.018667, + }, + "2010": { + SpecialPoint: 200, + subWeaponId: 0, + specialWeaponId: 8, + MoveSpeedFullCharge: 0.02, + DamageParam_ValueFullCharge: 1600, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + KeepChargeFullFrame: 75, + InkConsumeFullCharge: 0.18, + InkConsumeMinCharge: 0.0225, + }, + "2011": { + SpecialPoint: 210, + subWeaponId: 4, + specialWeaponId: 14, + MoveSpeedFullCharge: 0.02, + DamageParam_ValueFullCharge: 1600, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + KeepChargeFullFrame: 75, + InkConsumeFullCharge: 0.18, + InkConsumeMinCharge: 0.0225, + }, + "2020": { + SpecialPoint: 200, + subWeaponId: 0, + specialWeaponId: 8, + MoveSpeedFullCharge: 0.02, + DamageParam_ValueFullCharge: 1600, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + InkConsumeFullCharge: 0.18, + InkConsumeMinCharge: 0.0225, + }, + "2021": { + SpecialPoint: 210, + subWeaponId: 4, + specialWeaponId: 14, + MoveSpeedFullCharge: 0.02, + DamageParam_ValueFullCharge: 1600, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + InkConsumeFullCharge: 0.18, + InkConsumeMinCharge: 0.0225, + }, + "2030": { + SpecialPoint: 210, + subWeaponId: 10, + specialWeaponId: 7, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + MoveSpeedFullCharge: 0.015, + DamageParam_ValueFullCharge: 1800, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 92, + KeepChargeFullFrame: 75, + InkConsumeFullCharge: 0.25, + InkConsumeMinCharge: 0.0225, + }, + "2040": { + SpecialPoint: 210, + subWeaponId: 10, + specialWeaponId: 7, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + MoveSpeedFullCharge: 0.015, + DamageParam_ValueFullCharge: 1800, + DamageParam_ValueMaxCharge: 800, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 92, + InkConsumeFullCharge: 0.25, + InkConsumeMinCharge: 0.0225, + }, + "2050": { + SpecialPoint: 190, + subWeaponId: 7, + specialWeaponId: 9, + WeaponSpeedType: "Fast", + MoveSpeedFullCharge: 0.06, + DamageParam_ValueFullCharge: 850, + DamageParam_ValueMaxCharge: 850, + DamageParam_ValueMinCharge: 300, + ChargeFrameFullCharge: 20, + InkConsumeFullCharge: 0.07, + InkConsumeMinCharge: 0.028, + }, + "2060": { + SpecialPoint: 200, + subWeaponId: 13, + specialWeaponId: 4, + MoveSpeedFullCharge: 0.03, + DamageParam_ValueFullCharge: 1800, + DamageParam_ValueMaxCharge: 1300, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 75, + KeepChargeFullFrame: 300, + InkConsumeFullCharge: 0.15, + InkConsumeMinCharge: 0.02, + }, + "2061": { + SpecialPoint: 200, + subWeaponId: 5, + specialWeaponId: 11, + MoveSpeedFullCharge: 0.03, + DamageParam_ValueFullCharge: 1800, + DamageParam_ValueMaxCharge: 1300, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 75, + KeepChargeFullFrame: 300, + InkConsumeFullCharge: 0.15, + InkConsumeMinCharge: 0.02, + }, + "2070": { + SpecialPoint: 200, + subWeaponId: 3, + specialWeaponId: 15, + MoveSpeedFullCharge: 0.068, + DamageParam_ValueFullCharge: 680, + DamageParam_ValueMaxCharge: 680, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 72, + InkConsumeFullCharge: 0.35, + InkConsumeMinCharge: 0.0197, + }, + "2071": { + SpecialPoint: 210, + subWeaponId: 4, + specialWeaponId: 5, + MoveSpeedFullCharge: 0.068, + DamageParam_ValueFullCharge: 680, + DamageParam_ValueMaxCharge: 680, + DamageParam_ValueMinCharge: 400, + ChargeFrameFullCharge: 72, + InkConsumeFullCharge: 0.35, + InkConsumeMinCharge: 0.0197, + }, + "3000": { + SpecialPoint: 200, + subWeaponId: 0, + specialWeaponId: 14, + MoveSpeed: 0.04, + DamageParam_ValueDirectMax: 700, + DamageParam_ValueDirectMin: 500, + InkRecoverStop: 40, + InkConsumeSlosher: 0.07, + }, + "3001": { + SpecialPoint: 180, + subWeaponId: 12, + specialWeaponId: 3, + MoveSpeed: 0.04, + DamageParam_ValueDirectMax: 700, + DamageParam_ValueDirectMin: 500, + InkRecoverStop: 40, + InkConsumeSlosher: 0.07, + }, + "3010": { + SpecialPoint: 180, + subWeaponId: 11, + specialWeaponId: 10, + WeaponSpeedType: "Fast", + MoveSpeed: 0.066, + DamageParam_ValueDirectMax: 620, + DamageParam_ValueDirectMin: 350, + InkRecoverStop: 35, + InkConsumeSlosher: 0.06, + }, + "3011": { + SpecialPoint: 210, + subWeaponId: 5, + specialWeaponId: 15, + WeaponSpeedType: "Fast", + MoveSpeed: 0.066, + DamageParam_ValueDirectMax: 620, + DamageParam_ValueDirectMin: 350, + InkRecoverStop: 35, + InkConsumeSlosher: 0.06, + }, + "3020": { + SpecialPoint: 220, + subWeaponId: 5, + specialWeaponId: 6, + MoveSpeed: 0.07, + DamageParam_ValueDirectMax: 760, + DamageParam_ValueDirectMin: 520, + BlastParam_SplashDamage: 380, + InkRecoverStop: 42, + InkConsumeSlosher: 0.092, + }, + "3021": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 1, + MoveSpeed: 0.07, + DamageParam_ValueDirectMax: 760, + DamageParam_ValueDirectMin: 520, + InkRecoverStop: 42, + InkConsumeSlosher: 0.092, + }, + "3030": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 5, + MoveSpeed: 0.05, + DamageParam_ValueDirect: 300, + InkRecoverStop: 40, + InkConsumeSlosher: 0.08, + }, + "3031": { + SpecialPoint: 200, + subWeaponId: 12, + specialWeaponId: 17, + MoveSpeed: 0.05, + DamageParam_ValueDirect: 300, + InkRecoverStop: 40, + InkConsumeSlosher: 0.08, + }, + "3040": { + SpecialPoint: 200, + subWeaponId: 9, + specialWeaponId: 5, + WeaponSpeedType: "Slow", + MoveSpeed: 0.045, + DamageParam_ValueDirect: 550, + BlastParam_DistanceDamage: [ + { + Damage: 350, + Distance: 2.8, + }, + ], + InkRecoverStop: 70, + InkConsumeSlosher: 0.117, + }, + "3050": { + SpecialPoint: 190, + subWeaponId: 1, + specialWeaponId: 13, + MoveSpeed: 0.04, + DamageParam_ValueDirectMax: 480, + DamageParam_ValueDirectMin: 350, + DamageParam_Secondary_ValueDirectMax: 420, + DamageParam_Secondary_ValueDirectMin: 350, + InkRecoverStop: 50, + InkConsumeSlosher: 0.09, + }, + "4000": { + SpecialPoint: 190, + subWeaponId: 2, + specialWeaponId: 11, + overwrites: { + MoveVelRt_Shot: { + High: 1.4, + Low: 1, + Mid: 1.2, + }, + }, + MoveSpeed: 0.086, + MoveSpeed_Charge: 0.072, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + Jump_DegSwerve: 8, + Stand_DegSwerve: 4, + InkRecoverStop: 30, + InkConsumeFullChargeSplatling: 0.15, + }, + "4001": { + SpecialPoint: 190, + subWeaponId: 11, + specialWeaponId: 2, + overwrites: { + MoveVelRt_Shot: { + High: 1.4, + Low: 1, + Mid: 1.2, + }, + }, + MoveSpeed: 0.086, + MoveSpeed_Charge: 0.072, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + Jump_DegSwerve: 8, + Stand_DegSwerve: 4, + InkRecoverStop: 30, + InkConsumeFullChargeSplatling: 0.15, + }, + "4010": { + SpecialPoint: 200, + subWeaponId: 3, + specialWeaponId: 7, + overwrites: { + MoveVelRt_Shot: { + High: 1.35, + Low: 1, + Mid: 1.175, + }, + }, + MoveSpeed: 0.07, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 7, + Stand_DegSwerve: 3.3, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.225, + }, + "4011": { + SpecialPoint: 200, + subWeaponId: 9, + specialWeaponId: 17, + overwrites: { + MoveVelRt_Shot: { + High: 1.35, + Low: 1, + Mid: 1.175, + }, + }, + MoveSpeed: 0.07, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 7, + Stand_DegSwerve: 3.3, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.225, + }, + "4020": { + SpecialPoint: 190, + subWeaponId: 7, + specialWeaponId: 6, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Low: 1, + Mid: 0.7, + }, + MoveVelRt_Shot: { + High: 1.35, + Low: 1, + Mid: 1.175, + }, + }, + WeaponSpeedType: "Slow", + MoveSpeed: 0.06, + MoveSpeed_Charge: 0.044, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + DamageParam_ValueFullChargeMax: 400, + Jump_DegSwerve: 6, + Stand_DegSwerve: 3, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.35, + }, + "4030": { + SpecialPoint: 210, + subWeaponId: 5, + specialWeaponId: 10, + overwrites: { + MoveVelRt_Shot: { + High: 1.25, + Low: 1, + Mid: 1.125, + }, + }, + MoveSpeed: 0.086, + MoveSpeed_Charge: 0.086, + MoveSpeedVariable: 0.05, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Variable_Damage_ValueMax: 300, + Variable_Damage_ValueMin: 150, + Jump_DegSwerve: 12, + Stand_DegSwerve: 6, + Variable_Jump_DegSwerve: 4, + Variable_Stand_DegSwerve: 1.5, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.25, + }, + "4031": { + SpecialPoint: 200, + subWeaponId: 10, + specialWeaponId: 8, + overwrites: { + MoveVelRt_Shot: { + High: 1.25, + Low: 1, + Mid: 1.125, + }, + }, + MoveSpeed: 0.086, + MoveSpeed_Charge: 0.086, + MoveSpeedVariable: 0.05, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Variable_Damage_ValueMax: 300, + Variable_Damage_ValueMin: 150, + Jump_DegSwerve: 12, + Stand_DegSwerve: 6, + Variable_Jump_DegSwerve: 4, + Variable_Stand_DegSwerve: 1.5, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.25, + }, + "4040": { + SpecialPoint: 190, + subWeaponId: 9, + specialWeaponId: 5, + overwrites: { + MoveVelRt_Shot: { + High: 1.3, + Low: 1, + Mid: 1.15, + }, + }, + MoveSpeed: 0.07, + MoveSpeed_Charge: 0.04, + DamageParam_ValueMax: 320, + DamageParam_ValueMin: 160, + KeepChargeFullFrame: 200, + Jump_DegSwerve: 3.6, + Stand_DegSwerve: 3.3, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.15, + }, + "4050": { + SpecialPoint: 200, + subWeaponId: 6, + specialWeaponId: 15, + overwrites: { + MoveVelRt_Shot: { + High: 1.4, + Low: 1, + Mid: 1.2, + }, + }, + MoveSpeed: 0.086, + MoveSpeed_Charge: 0.072, + DamageParam_ValueMax: 260, + DamageParam_ValueMin: 130, + Jump_DegSwerve: 6, + Stand_DegSwerve: 3, + InkRecoverStop: 40, + InkConsumeFullChargeSplatling: 0.2, + }, + "5000": { + SpecialPoint: 180, + subWeaponId: 8, + specialWeaponId: 15, + WeaponSpeedType: "Fast", + MoveSpeed: 0.08, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + Jump_DegSwerve: 12, + Stand_DegSwerve: 7, + InkConsume: 0.00663, + InkConsume_SideStepParam: 0.05, + }, + "5001": { + SpecialPoint: 190, + subWeaponId: 13, + specialWeaponId: 13, + WeaponSpeedType: "Fast", + MoveSpeed: 0.08, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + Jump_DegSwerve: 12, + Stand_DegSwerve: 7, + InkConsume: 0.00663, + InkConsume_SideStepParam: 0.05, + }, + "5010": { + SpecialPoint: 190, + subWeaponId: 1, + specialWeaponId: 12, + MoveSpeed: 0.08, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 7.5, + Stand_DegSwerve: 2, + InkConsume: 0.0072, + InkConsume_SideStepParam: 0.07, + }, + "5011": { + SpecialPoint: 190, + subWeaponId: 6, + specialWeaponId: 18, + MoveSpeed: 0.08, + DamageParam_ValueMax: 300, + DamageParam_ValueMin: 150, + Jump_DegSwerve: 7.5, + Stand_DegSwerve: 2, + InkConsume: 0.0072, + InkConsume_SideStepParam: 0.07, + }, + "5020": { + SpecialPoint: 180, + subWeaponId: 4, + specialWeaponId: 6, + MoveSpeed: 0.06, + DamageParam_ValueMax: 360, + DamageParam_ValueMin: 180, + DamageLapOverParam_ValueMax: 525, + DamageLapOverParam_ValueMin: 263, + Jump_DegSwerve: 8, + Stand_DegSwerve: 3.2, + InkConsume: 0.014, + InkConsume_SideStepParam: 0.08, + }, + "5030": { + SpecialPoint: 200, + subWeaponId: 0, + specialWeaponId: 7, + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 8, + Stand_DegSwerve: 4, + InkConsume: 0.012, + InkConsume_SideStepParam: 0.08, + }, + "5031": { + SpecialPoint: 210, + subWeaponId: 8, + specialWeaponId: 16, + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 8, + Stand_DegSwerve: 4, + InkConsume: 0.012, + InkConsume_SideStepParam: 0.08, + }, + "5040": { + SpecialPoint: 200, + subWeaponId: 7, + specialWeaponId: 13, + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 12.8, + Stand_DegSwerve: 7.4, + InkConsume: 0.008, + InkConsume_SideStepParam: 0.03, + }, + "5041": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 3, + MoveSpeed: 0.072, + DamageParam_ValueMax: 280, + DamageParam_ValueMin: 140, + Jump_DegSwerve: 12.8, + Stand_DegSwerve: 7.4, + InkConsume: 0.008, + InkConsume_SideStepParam: 0.03, + }, + "6000": { + SpecialPoint: 200, + subWeaponId: 3, + specialWeaponId: 14, + MoveSpeed: 0.065, + DamageParam_ValueMax: 810, + InkConsumeUmbrella_WeaponShelterCanopyParam: 0.3, + InkConsume_WeaponShelterShotgunParam: 0.055, + }, + "6001": { + SpecialPoint: 190, + subWeaponId: 7, + specialWeaponId: 10, + MoveSpeed: 0.065, + DamageParam_ValueMax: 810, + InkConsumeUmbrella_WeaponShelterCanopyParam: 0.3, + InkConsume_WeaponShelterShotgunParam: 0.055, + }, + "6010": { + SpecialPoint: 190, + subWeaponId: 8, + specialWeaponId: 8, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + MoveSpeed: 0.05, + DamageParam_ValueMax: 1190, + CanopyHP: 7000, + InkConsumeUmbrella_WeaponShelterCanopyParam: 0.3, + InkConsume_WeaponShelterShotgunParam: 0.11, + }, + "6011": { + SpecialPoint: 200, + subWeaponId: 10, + specialWeaponId: 1, + overwrites: { + ConsumeRt_Main: { + High: 0.5, + Mid: 0.7, + }, + }, + WeaponSpeedType: "Slow", + MoveSpeed: 0.05, + DamageParam_ValueMax: 1190, + CanopyHP: 7000, + InkConsumeUmbrella_WeaponShelterCanopyParam: 0.3, + InkConsume_WeaponShelterShotgunParam: 0.11, + }, + "6020": { + SpecialPoint: 180, + subWeaponId: 10, + specialWeaponId: 13, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 400, + CanopyHP: 2000, + InkConsume_WeaponShelterShotgunParam: 0.04, + }, + "6021": { + SpecialPoint: 180, + subWeaponId: 13, + specialWeaponId: 19, + WeaponSpeedType: "Fast", + MoveSpeed: 0.072, + DamageParam_ValueMax: 400, + CanopyHP: 2000, + InkConsume_WeaponShelterShotgunParam: 0.04, + }, + "7010": { + SpecialPoint: 190, + subWeaponId: 11, + specialWeaponId: 9, + MoveSpeedFullCharge: 0.068, + DamageParam_ValueMax: 350, + DamageParam_ValueMin: 300, + BlastParam_DistanceDamage: [ + { + Damage: 300, + Distance: 2, + }, + ], + ChargeFrameFullCharge: 72, + InkConsumeFullCharge_ChargeParam: 0.085, + }, + "7011": { + SpecialPoint: 190, + subWeaponId: 3, + specialWeaponId: 16, + MoveSpeedFullCharge: 0.068, + DamageParam_ValueMax: 350, + DamageParam_ValueMin: 300, + BlastParam_DistanceDamage: [ + { + Damage: 300, + Distance: 2, + }, + ], + ChargeFrameFullCharge: 72, + InkConsumeFullCharge_ChargeParam: 0.085, + }, + "7020": { + SpecialPoint: 210, + subWeaponId: 6, + specialWeaponId: 4, + WeaponSpeedType: "Fast", + MoveSpeedFullCharge: 0.084, + DamageParam_ValueMax: 450, + DamageParam_ValueMin: 300, + ChargeFrameFullCharge: 34, + KeepChargeFullFrame: 75, + InkConsumeFullCharge_ChargeParam: 0.065, + }, + "7021": { + SpecialPoint: 200, + subWeaponId: 4, + specialWeaponId: 13, + WeaponSpeedType: "Fast", + MoveSpeedFullCharge: 0.084, + DamageParam_ValueMax: 450, + DamageParam_ValueMin: 300, + BlastParam_DistanceDamage: [ + { + Damage: 280, + Distance: 2, + }, + ], + ChargeFrameFullCharge: 34, + KeepChargeFullFrame: 75, + InkConsumeFullCharge_ChargeParam: 0.065, + }, + "8000": { + SpecialPoint: 210, + subWeaponId: 2, + specialWeaponId: 3, + DamageParam_SplatanaVerticalDirect: 1400, + DamageParam_SplatanaVertical: 700, + DamageParam_SplatanaHorizontalDirect: 550, + DamageParam_SplatanaHorizontal: 350, + InkConsume_SwingParam: 0.052, + InkConsumeFullCharge_ChargeParam: 0.117, + }, + "8001": { + SpecialPoint: 210, + subWeaponId: 11, + specialWeaponId: 12, + DamageParam_SplatanaVerticalDirect: 1400, + DamageParam_SplatanaVertical: 700, + DamageParam_SplatanaHorizontalDirect: 550, + DamageParam_SplatanaHorizontal: 350, + InkConsume_SwingParam: 0.052, + InkConsumeFullCharge_ChargeParam: 0.117, + }, + "8010": { + SpecialPoint: 190, + subWeaponId: 13, + specialWeaponId: 11, + WeaponSpeedType: "Fast", + DamageParam_SplatanaVerticalDirect: 1200, + DamageParam_SplatanaVertical: 600, + DamageParam_SplatanaHorizontalDirect: 450, + DamageParam_SplatanaHorizontal: 300, + InkConsume_SwingParam: 0.03, + InkConsumeFullCharge_ChargeParam: 0.06, + }, + "8011": { + SpecialPoint: 190, + subWeaponId: 8, + specialWeaponId: 4, + WeaponSpeedType: "Fast", + DamageParam_SplatanaVerticalDirect: 1200, + DamageParam_SplatanaVertical: 600, + DamageParam_SplatanaHorizontalDirect: 450, + DamageParam_SplatanaHorizontal: 300, + InkConsume_SwingParam: 0.03, + InkConsumeFullCharge_ChargeParam: 0.06, + }, + }, + subWeapons: { + "0": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + }, + SubInkSaveLv: 2, + InkConsume: 0.7, + InkRecoverStop: 60, + DistanceDamage: [ + { + Damage: 1800, + Distance: 3.6, + }, + { + Damage: 300, + Distance: 7, + }, + ], + }, + "1": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + }, + SubInkSaveLv: 2, + InkConsume: 0.7, + InkRecoverStop: 60, + DistanceDamage: [ + { + Damage: 1800, + Distance: 4.6, + }, + { + Damage: 300, + Distance: 8, + }, + ], + }, + "2": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + }, + SubInkSaveLv: 4, + InkConsume: 0.45, + InkRecoverStop: 60, + DistanceDamage: [ + { + Damage: 350, + Distance: 2.8, + }, + { + Damage: 250, + Distance: 4, + }, + ], + }, + "3": { + overwrites: { + PeriodFirst: { + High: 780, + Low: 480, + Mid: 630, + }, + PeriodSecond: { + High: 1020, + Low: 900, + Mid: 960, + }, + }, + SubInkSaveLv: 3, + InkConsume: 0.6, + InkRecoverStop: 60, + }, + "4": { + overwrites: { + MaxHP: { + High: 15000, + Low: 8000, + Mid: 11500, + }, + }, + SubInkSaveLv: 2, + InkConsume: 0.6, + InkRecoverStop: 85, + }, + "5": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.84, + Low: 1.36, + Mid: 1.6, + }, + }, + SubInkSaveLv: 1, + InkConsume: 0.6, + InkRecoverStop: 85, + DistanceDamage_BlastParamArray: [ + [ + { + Damage: 500, + Distance: 1.6, + }, + { + Damage: 350, + Distance: 3.8, + }, + ], + [ + { + Damage: 500, + Distance: 1.95, + }, + { + Damage: 350, + Distance: 4.5, + }, + ], + [ + { + Damage: 500, + Distance: 2.6, + }, + { + Damage: 350, + Distance: 5.45, + }, + ], + ], + }, + "6": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 0.52, + Low: 0.4, + Mid: 0.46, + }, + }, + SubInkSaveLv: 2, + InkConsume: 0.65, + InkRecoverStop: 70, + DistanceDamage: [ + [ + { + Damage: 1800, + Distance: 4.6, + }, + { + Damage: 300, + Distance: 8, + }, + ], + [ + { + Damage: 1800, + Distance: 1.6, + }, + { + Damage: 300, + Distance: 5, + }, + ], + ], + DirectDamage: 200, + }, + "7": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + }, + SubInkSaveLv: 1, + InkConsume: 0.55, + InkRecoverStop: 85, + DistanceDamage: [ + { + Damage: 1800, + Distance: 2.85, + }, + { + Damage: 300, + Distance: 6.5, + }, + ], + }, + "8": { + overwrites: { + SubSpecUpParam: { + Low: 0, + High: 57, + Mid: 25, + }, + }, + SubInkSaveLv: 3, + InkConsume: 0.75, + InkRecoverStop: 0, + }, + "9": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.87, + Low: 1.38, + Mid: 1.64, + }, + MarkingFrameSubSpec: { + High: 960, + Low: 480, + Mid: 720, + }, + }, + SubInkSaveLv: 1, + InkConsume: 0.45, + InkRecoverStop: 75, + }, + "10": { + overwrites: { + MarkingFrameSubSpec: { + High: 600, + Low: 300, + Mid: 450, + }, + SensorRadius: { + High: 4, + Low: 3, + Mid: 3.5, + }, + ExplosionRadius: { + High: 11, + Low: 8, + Mid: 9.5, + }, + }, + SubInkSaveLv: 3, + InkConsume: 0.6, + InkRecoverStop: 0, + DistanceDamage: [ + { + Damage: 450, + Distance: 3.6, + }, + { + Damage: 350, + Distance: 8, + }, + ], + }, + "11": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + }, + SubInkSaveLv: 1, + InkConsume: 0.6, + InkRecoverStop: 75, + }, + "12": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 6.48, + Low: 6, + Mid: 6.24, + }, + MarkingFrameSubSpec: { + High: 600, + Low: 300, + Mid: 450, + }, + }, + SubInkSaveLv: 0, + InkConsume: 0.4, + InkRecoverStop: 50, + DirectDamage: 400, + }, + "13": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.84, + Low: 1.36, + Mid: 1.6, + }, + }, + SubInkSaveLv: 2, + InkConsume: 0.65, + InkRecoverStop: 88, + DistanceDamage_BlastParamChase: [ + { + Damage: 600, + Distance: 2.6, + }, + { + Damage: 350, + Distance: 6, + }, + ], + DistanceDamage_SplashBlastParam: [ + { + Damage: 120, + Distance: 2.6, + }, + ], + }, + }, + specialWeapons: { + "1": { + overwrites: { + PaintRadius: { + High: 4, + Low: 3.2, + Mid: 3.6, + }, + DistanceDamageDistanceRate: { + High: 1.3, + Low: 1, + Mid: 1.15, + }, + SpecialDurationFrame: { + High: 480, + Low: 360, + Mid: 420, + }, + }, + DistanceDamage: [ + { + Damage: 530, + Distance: 4, + }, + ], + DirectDamage: 2200, + }, + "2": { + overwrites: { + MaxFieldHP: { + High: 28800, + Low: 24000, + Mid: 26400, + }, + MaxHP: { + High: 14400, + Low: 12000, + Mid: 13200, + }, + }, + }, + "3": { + overwrites: { + InkConsume_Hook: { + High: 0.0225, + Low: 0.06, + Mid: 0.0375, + }, + InkConsume_PerSec: { + High: 0.12, + Low: 0.15, + Mid: 0.1305, + }, + }, + DistanceDamage: [ + { + Damage: 450, + Distance: 4.8, + }, + { + Damage: 350, + Distance: 6, + }, + ], + }, + "4": { + overwrites: { + TargetInCircleRadius: { + High: 240, + Low: 140, + Mid: 190, + }, + }, + DistanceDamage: [ + { + Damage: 1500, + Distance: 1.1, + }, + { + Damage: 500, + Distance: 2.1, + }, + { + Damage: 300, + Distance: 4.25, + }, + ], + }, + "5": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + SpecialDurationFrame: { + High: 600, + Low: 480, + Mid: 540, + }, + }, + TickDamage: 4, + }, + "6": { + overwrites: { + ChargeRateAutoPerFrame: { + High: 0.01, + Low: 0.002, + Mid: 0.006, + }, + }, + TickDamage: 33, + }, + "7": { + overwrites: { + MaxFrame: { + High: 216, + Low: 160, + Mid: 192, + }, + MaxRadius: { + High: 27, + Low: 20, + Mid: 24, + }, + }, + DirectDamage: 300, + WaveDamage: 450, + }, + "8": { + overwrites: { + RadiusMax: { + High: 4.3, + Low: 3.3, + Mid: 3.8, + }, + RadiusMin: { + High: 1.4, + Low: 0.8, + Mid: 1.1, + }, + }, + ExhaleBlastParamMinChargeDistanceDamage: [ + { + Damage: 2200, + Distance: 6, + }, + ], + ExhaleBlastParamMaxChargeDistanceDamage: [ + { + Damage: 2200, + Distance: 10, + }, + ], + }, + "9": { + overwrites: { + SpecialDurationFrame: { + High: 240, + Low: 180, + Mid: 220, + }, + }, + TickDamage: 35, + }, + "10": { + overwrites: { + DistanceDamageDistanceRate: { + High: 1.3, + Low: 1, + Mid: 1.15, + }, + SplashAroundVelocityMin: { + High: 0.52, + Low: 0.49, + Mid: 0.505, + }, + SplashAroundVelocityMax: { + High: 0.35, + Low: 0.33, + Mid: 0.34, + }, + SpecialDurationFrame: { + High: 510, + Low: 450, + Mid: 480, + }, + PaintRadius: { + High: 3.9000000000000004, + Mid: 3.865, + Low: 3.83, + }, + }, + DistanceDamage: [ + { + Damage: 500, + Distance: 2.55, + }, + { + Damage: 300, + Distance: 5, + }, + ], + DirectDamage: 1200, + }, + "11": { + overwrites: { + SpecialDurationFrame: { + High: 660, + Low: 450, + Mid: 570, + }, + }, + SwingDamage: [ + { + Damage: 1000, + Distance: 0, + }, + { + Damage: 400, + Distance: 4, + }, + ], + ThrowDamage: [ + { + Damage: 600, + Distance: 4, + }, + { + Damage: 300, + Distance: 8, + }, + ], + ThrowDirectDamage: 2200, + }, + "12": { + ArmorHP: 5000, + overwrites: { + SpecialDurationFrame: { + High: 660, + Low: 480, + Mid: 570, + }, + }, + BulletDamageMin: 160, + BulletDamageMax: 320, + CannonDamage: [ + { + Damage: 600, + Distance: 1, + }, + { + Damage: 300, + Distance: 5.6, + }, + ], + BumpDamage: 400, + }, + "13": { + overwrites: { + DistanceDamageDistanceRate: { + High: 1.2, + Low: 1, + Mid: 1.1, + }, + PaintRadius: { + High: 11.399999999999999, + Mid: 10.45, + Low: 9.5, + }, + SplashAroundVelocityMin: { + High: 0.7, + Low: 0.6, + Mid: 0.65, + }, + SplashAroundVelocityMax: { + High: 0.8, + Low: 0.7, + Mid: 0.75, + }, + }, + DistanceDamage: [ + { + Damage: 2200, + Distance: 7.5, + }, + { + Damage: 700, + Distance: 13.5, + }, + ], + }, + "14": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 2.6, + Low: 2, + Mid: 2.3, + }, + }, + }, + "15": { + overwrites: { + PowerUpFrame: { + High: 1500, + Low: 1020, + Mid: 1290, + }, + }, + }, + "16": { + overwrites: { + CrossPaintCheckLength: { + High: 3, + Low: 2.5, + Mid: 2.75, + }, + CrossPaintRadius: { + High: 3, + Low: 2.5, + Mid: 2.75, + }, + DistanceDamageDistanceRate: { + High: 1.2, + Low: 1, + Mid: 1.1, + }, + }, + DistanceDamage: [ + { + Damage: 700, + Distance: 3.6, + }, + { + Damage: 350, + Distance: 6, + }, + ], + }, + "17": { + overwrites: { + SpecialDurationFrame: { + High: 600, + Low: 480, + Mid: 540, + }, + }, + DirectDamage: 1200, + JumpDamage: 600, + }, + "18": { + overwrites: { + DistanceDamageDistanceRate: { + High: 1.1, + Low: 1, + Mid: 1.05, + }, + PaintRadius: { + High: 10.8, + Low: 9, + Mid: 9.9, + }, + }, + DistanceDamage: [ + { + Damage: 2200, + Distance: 7, + }, + { + Damage: 600, + Distance: 12, + }, + ], + }, + "19": { + overwrites: { + SpawnSpeedZSpecUp: { + High: 1.68, + Low: 1.12, + Mid: 1.4, + }, + MoveSpeed: { + High: 0.06, + Low: 0.04, + Mid: 0.053, + }, + }, + }, + }, +}; diff --git a/app/features/build-analyzer/index.ts b/app/features/build-analyzer/index.ts index 6e00cf587..47b910ecd 100644 --- a/app/features/build-analyzer/index.ts +++ b/app/features/build-analyzer/index.ts @@ -22,4 +22,3 @@ export { subStats, } from "./core/stats"; export { DAMAGE_TYPE, damageTypeToWeaponType } from "./analyzer-constants"; -export { default as weaponParams } from "./core/weapon-params.json"; diff --git a/app/features/build-analyzer/routes/analyzer.tsx b/app/features/build-analyzer/routes/analyzer.tsx index 121d68377..1ae8a102d 100644 --- a/app/features/build-analyzer/routes/analyzer.tsx +++ b/app/features/build-analyzer/routes/analyzer.tsx @@ -17,7 +17,7 @@ import { BeakerIcon } from "~/components/icons/Beaker"; import { MAX_AP } from "~/constants"; import { useSetTitle } from "~/hooks/useSetTitle"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import type { Ability as AbilityType } from "~/modules/in-game-lists"; import { ANGLE_SHOOTER_ID, @@ -59,7 +59,7 @@ import type { Stat, SubWeaponDamage, } from "../analyzer-types"; -import styles from "../analyzer.css"; +import styles from "../analyzer.css?url"; import { ABILITIES_WITHOUT_CHUNKS, getAbilityChunksMapAsArray, diff --git a/app/features/build-stats/routes/builds.$slug.popular.tsx b/app/features/build-stats/routes/builds.$slug.popular.tsx index 928e99577..a5ec02fcc 100644 --- a/app/features/build-stats/routes/builds.$slug.popular.tsx +++ b/app/features/build-stats/routes/builds.$slug.popular.tsx @@ -9,7 +9,7 @@ import clsx from "clsx"; import { Ability } from "~/components/Ability"; import { Main } from "~/components/Main"; import { useTranslation } from "react-i18next"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { notFoundIfNullLike, type SendouRouteHandle } from "~/utils/remix"; import { makeTitle } from "~/utils/strings"; import { weaponNameSlugToId } from "~/utils/unslugify.server"; diff --git a/app/features/build-stats/routes/builds.$slug.stats.tsx b/app/features/build-stats/routes/builds.$slug.stats.tsx index fca412228..7300b1f96 100644 --- a/app/features/build-stats/routes/builds.$slug.stats.tsx +++ b/app/features/build-stats/routes/builds.$slug.stats.tsx @@ -10,7 +10,7 @@ import { weaponNameSlugToId } from "~/utils/unslugify.server"; import { averageAbilityPoints } from "../queries/averageAbilityPoints.server"; import { abilityPointCountsToAverages } from "../build-stats-utils"; import { Ability } from "~/components/Ability"; -import styles from "../build-stats.css"; +import styles from "../build-stats.css?url"; import { WeaponImage } from "~/components/Image"; import { notFoundIfNullLike, type SendouRouteHandle } from "~/utils/remix"; import { MAX_AP, ONE_HOUR_IN_MS } from "~/constants"; @@ -21,7 +21,7 @@ import { outlinedMainWeaponImageUrl, weaponBuildPage, } from "~/utils/urls"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { makeTitle } from "~/utils/strings"; import { cache, ttl } from "~/utils/cache.server"; import { cachified } from "@epic-web/cachified"; diff --git a/app/features/builds/routes/builds.$slug.tsx b/app/features/builds/routes/builds.$slug.tsx index a45ae8657..68dc12c8d 100644 --- a/app/features/builds/routes/builds.$slug.tsx +++ b/app/features/builds/routes/builds.$slug.tsx @@ -29,7 +29,7 @@ import { ONE_HOUR_IN_MS, PATCHES, } from "~/constants"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { weaponIdIsNotAlt } from "~/modules/in-game-lists"; import { cache, ttl } from "~/utils/cache.server"; import { safeJSONParse } from "~/utils/json"; diff --git a/app/features/builds/routes/builds.tsx b/app/features/builds/routes/builds.tsx index 9f6344a4e..ff9928daf 100644 --- a/app/features/builds/routes/builds.tsx +++ b/app/features/builds/routes/builds.tsx @@ -12,7 +12,7 @@ import { weaponCategoryUrl, } from "~/utils/urls"; import { type SendouRouteHandle } from "~/utils/remix"; -import styles from "~/styles/builds.css"; +import styles from "~/styles/builds.css?url"; import type { LinksFunction, MetaFunction } from "@remix-run/node"; import { Main } from "~/components/Main"; import { makeTitle } from "~/utils/strings"; diff --git a/app/features/calendar/calendar-constants.ts b/app/features/calendar/calendar-constants.ts new file mode 100644 index 000000000..066815f2b --- /dev/null +++ b/app/features/calendar/calendar-constants.ts @@ -0,0 +1,50 @@ +export const tags = { + BADGE: { + color: "#000", + }, + SPECIAL: { + color: "#CE93D8", + }, + ART: { + color: "#C158F6", + }, + MONEY: { + color: "#96F29D", + }, + REGION: { + color: "#FF8C8C", + }, + LOW: { + color: "#BBDEFB", + }, + COUNT: { + color: "#62E8F5", + }, + LAN: { + color: "#FFF", + }, + QUALIFIER: { + color: "#FFC0CB", + }, + SZ: { + color: "#F44336", + }, + TW: { + color: "#D50000", + }, + S1: { + color: "#E5E4E2", + }, + S2: { + color: "#388E3C", + }, + SR: { + color: "#FBCEB1", + }, + CARDS: { + color: "#E4D00A", + }, + FULL_TOURNAMENT: { + color: "#FFC0CB", + }, +}; diff --git a/app/features/calendar/calendar-schemas.server.ts b/app/features/calendar/calendar-schemas.server.ts new file mode 100644 index 000000000..049c117db --- /dev/null +++ b/app/features/calendar/calendar-schemas.server.ts @@ -0,0 +1,103 @@ +import { z } from "zod"; +import { CALENDAR_EVENT } from "~/constants"; +import type { CalendarEventTag } from "~/db/types"; +import * as CalendarRepository from "~/features/calendar/CalendarRepository.server"; +import { + FORMATS_SHORT, + TOURNAMENT, +} from "~/features/tournament/tournament-constants"; +import { + actualNumber, + checkboxValueToBoolean, + date, + falsyToNull, + id, + processMany, + removeDuplicates, + safeJSONParse, + toArray, +} from "~/utils/zod"; +import { calendarEventMaxDate, calendarEventMinDate } from "./calendar-utils"; + +export const newCalendarEventActionSchema = z + .object({ + eventToEditId: z.preprocess(actualNumber, id.nullish()), + name: z + .string() + .min(CALENDAR_EVENT.NAME_MIN_LENGTH) + .max(CALENDAR_EVENT.NAME_MAX_LENGTH), + description: z.preprocess( + falsyToNull, + z.string().max(CALENDAR_EVENT.DESCRIPTION_MAX_LENGTH).nullable(), + ), + date: z.preprocess( + toArray, + z + .array( + z.preprocess( + date, + z.date().min(calendarEventMinDate()).max(calendarEventMaxDate()), + ), + ) + .min(1) + .max(CALENDAR_EVENT.MAX_AMOUNT_OF_DATES), + ), + bracketUrl: z + .string() + .url() + .max(CALENDAR_EVENT.BRACKET_URL_MAX_LENGTH) + .default("https://sendou.ink"), + discordInviteCode: z.preprocess( + falsyToNull, + z.string().max(CALENDAR_EVENT.DISCORD_INVITE_CODE_MAX_LENGTH).nullable(), + ), + tags: z.preprocess( + processMany(safeJSONParse, removeDuplicates), + z + .array( + z + .string() + .refine((val) => + CALENDAR_EVENT.TAGS.includes(val as CalendarEventTag), + ), + ) + .nullable(), + ), + badges: z.preprocess( + processMany(safeJSONParse, removeDuplicates), + z.array(id).nullable(), + ), + pool: z.string().optional(), + toToolsEnabled: z.preprocess(checkboxValueToBoolean, z.boolean()), + toToolsMode: z.enum(["ALL", "SZ", "TC", "RM", "CB"]).optional(), + // + // tournament format related fields + // + format: z.enum(FORMATS_SHORT).nullish(), + withUndergroundBracket: z.preprocess(checkboxValueToBoolean, z.boolean()), + teamsPerGroup: z.coerce + .number() + .min(TOURNAMENT.MIN_GROUP_SIZE) + .max(TOURNAMENT.MAX_GROUP_SIZE) + .nullish(), + advancingCount: z.coerce + .number() + .min(1) + .max(TOURNAMENT.MAX_GROUP_SIZE) + .nullish(), + }) + .refine( + async (schema) => { + if (schema.eventToEditId) { + const eventToEdit = await CalendarRepository.findById({ + id: schema.eventToEditId, + }); + return schema.date.length === 1 || !eventToEdit?.tournamentId; + } else { + return schema.date.length === 1 || !schema.toToolsEnabled; + } + }, + { + message: "Tournament must have exactly one date", + }, + ); diff --git a/app/features/calendar/calendar-utils.server.ts b/app/features/calendar/calendar-utils.server.ts index b6f79406c..723c7944f 100644 --- a/app/features/calendar/calendar-utils.server.ts +++ b/app/features/calendar/calendar-utils.server.ts @@ -1,9 +1,9 @@ import type { z } from "zod"; import { isAdmin } from "~/permissions"; -import type { newCalendarEventActionSchema } from "./routes/calendar.new"; import type { TournamentSettings } from "~/db/tables"; import { BRACKET_NAMES } from "../tournament/tournament-constants"; import { nullFilledArray } from "~/utils/arrays"; +import type { newCalendarEventActionSchema } from "./calendar-schemas.server"; const usersWithTournamentPerms = process.env["TOURNAMENT_PERMS"]?.split(",").map(Number) ?? []; diff --git a/app/features/calendar/calendar-utils.ts b/app/features/calendar/calendar-utils.ts index 8c4a0e3e3..e5a80218a 100644 --- a/app/features/calendar/calendar-utils.ts +++ b/app/features/calendar/calendar-utils.ts @@ -12,3 +12,10 @@ export function bracketProgressionToShortTournamentFormat( return "RR_TO_SE"; } + +export const calendarEventMinDate = () => new Date(Date.UTC(2015, 4, 28)); +export const calendarEventMaxDate = () => { + const result = new Date(); + result.setFullYear(result.getFullYear() + 1); + return result; +}; diff --git a/app/features/calendar/components/Tags.tsx b/app/features/calendar/components/Tags.tsx index 337736c3f..47f5a4f13 100644 --- a/app/features/calendar/components/Tags.tsx +++ b/app/features/calendar/components/Tags.tsx @@ -5,8 +5,8 @@ import { Badge } from "~/components/Badge"; import { Button } from "~/components/Button"; import { CrossIcon } from "~/components/icons/Cross"; import type { CalendarEventTag } from "~/db/types"; -import allTags from "../tags.json"; import type * as CalendarRepository from "../CalendarRepository.server"; +import { tags as allTags } from "../calendar-constants"; export function Tags({ tags, diff --git a/app/features/calendar/routes/calendar.$id.tsx b/app/features/calendar/routes/calendar.$id.tsx index ecfe26d37..29b722dcf 100644 --- a/app/features/calendar/routes/calendar.$id.tsx +++ b/app/features/calendar/routes/calendar.$id.tsx @@ -21,17 +21,17 @@ import { Placement } from "~/components/Placement"; import { Section } from "~/components/Section"; import { useIsMounted } from "~/hooks/useIsMounted"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { MapPool } from "~/features/map-list-generator/core/map-pool"; import { canDeleteCalendarEvent, canEditCalendarEvent, canReportCalendarEventWinners, } from "~/permissions"; -import calendarStyles from "~/styles/calendar-event.css"; -import mapsStyles from "~/styles/maps.css"; +import calendarStyles from "~/styles/calendar-event.css?url"; +import mapsStyles from "~/styles/maps.css?url"; import { databaseTimestampToDate } from "~/utils/dates"; import { notFoundIfFalsy, diff --git a/app/features/calendar/routes/calendar.new.tsx b/app/features/calendar/routes/calendar.new.tsx index 40fcb99da..47026744e 100644 --- a/app/features/calendar/routes/calendar.new.tsx +++ b/app/features/calendar/routes/calendar.new.tsx @@ -1,23 +1,22 @@ -import { json, redirect } from "@remix-run/node"; import type { - SerializeFrom, ActionFunction, LinksFunction, LoaderFunctionArgs, MetaFunction, + SerializeFrom, } from "@remix-run/node"; +import { json, redirect } from "@remix-run/node"; import { Form, useLoaderData } from "@remix-run/react"; import clsx from "clsx"; import * as React from "react"; -import { z } from "zod"; +import { useTranslation } from "react-i18next"; import type { AlertVariation } from "~/components/Alert"; import { Alert } from "~/components/Alert"; import { Badge } from "~/components/Badge"; import { Button } from "~/components/Button"; import { DateInput } from "~/components/DateInput"; +import { Divider } from "~/components/Divider"; import { FormMessage } from "~/components/FormMessage"; -import { CrossIcon } from "~/components/icons/Cross"; -import { TrashIcon } from "~/components/icons/Trash"; import { Input } from "~/components/Input"; import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; @@ -25,16 +24,29 @@ import { MapPoolSelector } from "~/components/MapPoolSelector"; import { RequiredHiddenInput } from "~/components/RequiredHiddenInput"; import { SubmitButton } from "~/components/SubmitButton"; import { Toggle } from "~/components/Toggle"; +import { CrossIcon } from "~/components/icons/Cross"; +import { TrashIcon } from "~/components/icons/Trash"; import { CALENDAR_EVENT } from "~/constants"; +import type { Tables } from "~/db/tables"; import type { Badge as BadgeType, CalendarEventTag } from "~/db/types"; -import { useIsMounted } from "~/hooks/useIsMounted"; -import { useTranslation } from "react-i18next"; import { requireUser } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; +import * as BadgeRepository from "~/features/badges/BadgeRepository.server"; +import * as CalendarRepository from "~/features/calendar/CalendarRepository.server"; import { MapPool } from "~/features/map-list-generator/core/map-pool"; +import type { Tournament } from "~/features/tournament-bracket/core/Tournament"; +import { tournamentFromDB } from "~/features/tournament-bracket/core/Tournament.server"; +import { + BRACKET_NAMES, + TOURNAMENT, + type TournamentFormatShort, +} from "~/features/tournament/tournament-constants"; +import { useIsMounted } from "~/hooks/useIsMounted"; +import { i18next } from "~/modules/i18n/i18next.server"; +import type { RankedModeShort } from "~/modules/in-game-lists"; +import { rankedModesShort } from "~/modules/in-game-lists/modes"; import { canEditCalendarEvent } from "~/permissions"; -import calendarNewStyles from "~/styles/calendar-new.css"; -import mapsStyles from "~/styles/maps.css"; +import calendarNewStyles from "~/styles/calendar-new.css?url"; +import mapsStyles from "~/styles/maps.css?url"; import { isDefined } from "~/utils/arrays"; import { databaseTimestampToDate, @@ -50,45 +62,18 @@ import { } from "~/utils/remix"; import { makeTitle, pathnameFromPotentialURL } from "~/utils/strings"; import { calendarEventPage, tournamentBracketsPage } from "~/utils/urls"; -import { - actualNumber, - checkboxValueToBoolean, - date, - falsyToNull, - id, - processMany, - removeDuplicates, - safeJSONParse, - toArray, -} from "~/utils/zod"; -import { Tags } from "../components/Tags"; -import type { RankedModeShort } from "~/modules/in-game-lists"; -import { rankedModesShort } from "~/modules/in-game-lists/modes"; -import * as BadgeRepository from "~/features/badges/BadgeRepository.server"; -import * as CalendarRepository from "~/features/calendar/CalendarRepository.server"; +import { newCalendarEventActionSchema } from "../calendar-schemas.server"; import { bracketProgressionToShortTournamentFormat, + calendarEventMaxDate, + calendarEventMinDate, canAddNewEvent, } from "../calendar-utils"; import { canCreateTournament, formValuesToBracketProgression, } from "../calendar-utils.server"; -import { tournamentFromDB } from "~/features/tournament-bracket/core/Tournament.server"; -import type { Tournament } from "~/features/tournament-bracket/core/Tournament"; -import type { Tables } from "~/db/tables"; -import { Divider } from "~/components/Divider"; -import { - BRACKET_NAMES, - FORMATS_SHORT, - TOURNAMENT, - type TournamentFormatShort, -} from "~/features/tournament/tournament-constants"; - -const MIN_DATE = new Date(Date.UTC(2015, 4, 28)); - -const MAX_DATE = new Date(); -MAX_DATE.setFullYear(MAX_DATE.getFullYear() + 1); +import { Tags } from "../components/Tags"; export const links: LinksFunction = () => { return [ @@ -105,84 +90,6 @@ export const meta: MetaFunction = (args) => { return [{ title: data.title }]; }; -export const newCalendarEventActionSchema = z - .object({ - eventToEditId: z.preprocess(actualNumber, id.nullish()), - name: z - .string() - .min(CALENDAR_EVENT.NAME_MIN_LENGTH) - .max(CALENDAR_EVENT.NAME_MAX_LENGTH), - description: z.preprocess( - falsyToNull, - z.string().max(CALENDAR_EVENT.DESCRIPTION_MAX_LENGTH).nullable(), - ), - date: z.preprocess( - toArray, - z - .array(z.preprocess(date, z.date().min(MIN_DATE).max(MAX_DATE))) - .min(1) - .max(CALENDAR_EVENT.MAX_AMOUNT_OF_DATES), - ), - bracketUrl: z - .string() - .url() - .max(CALENDAR_EVENT.BRACKET_URL_MAX_LENGTH) - .default("https://sendou.ink"), - discordInviteCode: z.preprocess( - falsyToNull, - z.string().max(CALENDAR_EVENT.DISCORD_INVITE_CODE_MAX_LENGTH).nullable(), - ), - tags: z.preprocess( - processMany(safeJSONParse, removeDuplicates), - z - .array( - z - .string() - .refine((val) => - CALENDAR_EVENT.TAGS.includes(val as CalendarEventTag), - ), - ) - .nullable(), - ), - badges: z.preprocess( - processMany(safeJSONParse, removeDuplicates), - z.array(id).nullable(), - ), - pool: z.string().optional(), - toToolsEnabled: z.preprocess(checkboxValueToBoolean, z.boolean()), - toToolsMode: z.enum(["ALL", "SZ", "TC", "RM", "CB"]).optional(), - // - // tournament format related fields - // - format: z.enum(FORMATS_SHORT).nullish(), - withUndergroundBracket: z.preprocess(checkboxValueToBoolean, z.boolean()), - teamsPerGroup: z.coerce - .number() - .min(TOURNAMENT.MIN_GROUP_SIZE) - .max(TOURNAMENT.MAX_GROUP_SIZE) - .nullish(), - advancingCount: z.coerce - .number() - .min(1) - .max(TOURNAMENT.MAX_GROUP_SIZE) - .nullish(), - }) - .refine( - async (schema) => { - if (schema.eventToEditId) { - const eventToEdit = await CalendarRepository.findById({ - id: schema.eventToEditId, - }); - return schema.date.length === 1 || !eventToEdit?.tournamentId; - } else { - return schema.date.length === 1 || !schema.toToolsEnabled; - } - }, - { - message: "Tournament must have exactly one date", - }, - ); - export const action: ActionFunction = async ({ request }) => { const user = await requireUser(request); const data = await parseRequestFormData({ @@ -501,8 +408,8 @@ function DatesInput({ allowMultiDate }: { allowMultiDate?: boolean }) { id={`date-input-${key}`} name="date" defaultValue={date ?? undefined} - min={MIN_DATE} - max={MAX_DATE} + min={calendarEventMinDate()} + max={calendarEventMaxDate()} required onChange={(newDate: Date | null) => { setDatesInputState((current) => diff --git a/app/features/calendar/routes/calendar.tsx b/app/features/calendar/routes/calendar.tsx index 6ab46632d..cf6b9950e 100644 --- a/app/features/calendar/routes/calendar.tsx +++ b/app/features/calendar/routes/calendar.tsx @@ -16,10 +16,10 @@ import { LinkButton } from "~/components/Button"; import { Main } from "~/components/Main"; import { useIsMounted } from "~/hooks/useIsMounted"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; -import styles from "~/styles/calendar.css"; +import { i18next } from "~/modules/i18n/i18next.server"; +import styles from "~/styles/calendar.css?url"; import { joinListToNaturalString } from "~/utils/arrays"; import { databaseTimestampToDate, diff --git a/app/features/calendar/tags.json b/app/features/calendar/tags.json deleted file mode 100644 index 4721e5aba..000000000 --- a/app/features/calendar/tags.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "BADGE": { - "color": "#000" - }, - "SPECIAL": { - "color": "#CE93D8" - }, - "ART": { - "color": "#C158F6" - }, - "MONEY": { - "color": "#96F29D" - }, - "REGION": { - "color": "#FF8C8C" - }, - "LOW": { - "color": "#BBDEFB" - }, - "COUNT": { - "color": "#62E8F5" - }, - "LAN": { - "color": "#FFF" - }, - "QUALIFIER": { - "color": "#FFC0CB" - }, - "SZ": { - "color": "#F44336" - }, - "TW": { - "color": "#D50000" - }, - "S1": { - "color": "#E5E4E2" - }, - "S2": { - "color": "#388E3C" - }, - "SR": { - "color": "#FBCEB1" - }, - "CARDS": { - "color": "#E4D00A" - }, - "FULL_TOURNAMENT": { - "color": "#FFC0CB" - } -} diff --git a/app/features/chat/components/Chat.tsx b/app/features/chat/components/Chat.tsx index a3060f5e9..6acec9b1a 100644 --- a/app/features/chat/components/Chat.tsx +++ b/app/features/chat/components/Chat.tsx @@ -2,7 +2,7 @@ import { Avatar } from "../../../components/Avatar"; import * as React from "react"; import { SubmitButton } from "../../../components/SubmitButton"; import type { User } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { nanoid } from "nanoid"; import clsx from "clsx"; import { Button } from "../../../components/Button"; diff --git a/app/features/front-page/routes/index.tsx b/app/features/front-page/routes/index.tsx index f99f790f1..d54e2332f 100644 --- a/app/features/front-page/routes/index.tsx +++ b/app/features/front-page/routes/index.tsx @@ -12,13 +12,11 @@ import { } from "~/utils/urls"; import { useTranslation } from "react-i18next"; import type { LinksFunction } from "@remix-run/node"; -import styles from "~/styles/front.css"; +import styles from "~/styles/front.css?url"; import { Link } from "@remix-run/react"; import { GlobeIcon } from "~/components/icons/Globe"; import { LanguageChanger } from "~/components/layout/LanguageChanger"; import { Avatar } from "~/components/Avatar"; -import { useUser } from "~/features/auth/core"; -import { languages } from "~/modules/i18n"; import { Button } from "~/components/Button"; import { LogOutIcon } from "~/components/icons/LogOut"; import { LogInButtonContainer } from "~/components/layout/LogInButtonContainer"; @@ -28,6 +26,8 @@ import { ThemeChanger } from "~/components/layout/ThemeChanger"; import { SelectedThemeIcon } from "~/components/layout/SelectedThemeIcon"; import { useRootLoaderData } from "~/hooks/useRootLoaderData"; import { useTheme } from "~/features/theme/core/provider"; +import { useUser } from "~/features/auth/core/user"; +import { languages } from "~/modules/i18n/config"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/img-upload/routes/upload.tsx b/app/features/img-upload/routes/upload.tsx index 18aaefec7..91ccfa69e 100644 --- a/app/features/img-upload/routes/upload.tsx +++ b/app/features/img-upload/routes/upload.tsx @@ -17,7 +17,7 @@ import Compressor from "compressorjs"; import invariant from "tiny-invariant"; import { Button } from "~/components/Button"; import { useTranslation } from "react-i18next"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { dateToDatabaseTimestamp } from "~/utils/dates"; import { validate } from "~/utils/remix"; import { teamPage } from "~/utils/urls"; diff --git a/app/features/info/routes/contributions.tsx b/app/features/info/routes/contributions.tsx index be0232f31..400f4dc57 100644 --- a/app/features/info/routes/contributions.tsx +++ b/app/features/info/routes/contributions.tsx @@ -2,7 +2,6 @@ import type { MetaFunction } from "@remix-run/node"; import { Trans } from "react-i18next"; import { Main } from "~/components/Main"; import { useSetTitle } from "~/hooks/useSetTitle"; -import { languages } from "~/modules/i18n"; import { makeTitle } from "~/utils/strings"; import { ANTARISKA_TWITTER, @@ -18,6 +17,7 @@ import { import { type SendouRouteHandle } from "~/utils/remix"; import { useTranslation } from "react-i18next"; import * as React from "react"; +import { languages } from "~/modules/i18n/config"; export const meta: MetaFunction = () => { return [{ title: makeTitle("Contributions") }]; diff --git a/app/features/info/routes/faq.tsx b/app/features/info/routes/faq.tsx index ab8143301..0f4bce4e5 100644 --- a/app/features/info/routes/faq.tsx +++ b/app/features/info/routes/faq.tsx @@ -2,7 +2,7 @@ import type { LinksFunction, MetaFunction } from "@remix-run/node"; import { useTranslation } from "react-i18next"; import { Main } from "~/components/Main"; import { useSetTitle } from "~/hooks/useSetTitle"; -import styles from "~/styles/faq.css"; +import styles from "~/styles/faq.css?url"; import { makeTitle } from "~/utils/strings"; import { type SendouRouteHandle } from "~/utils/remix"; diff --git a/app/features/info/routes/support.tsx b/app/features/info/routes/support.tsx index 0a5adc530..1d214ce7d 100644 --- a/app/features/info/routes/support.tsx +++ b/app/features/info/routes/support.tsx @@ -1,6 +1,6 @@ import type { LinksFunction, MetaFunction } from "@remix-run/node"; import { Main } from "~/components/Main"; -import styles from "../support.css"; +import styles from "../support.css?url"; import * as React from "react"; import { CheckmarkIcon } from "~/components/icons/Checkmark"; import { useTranslation } from "react-i18next"; diff --git a/app/features/leaderboards/LeaderboardRepository.server.ts b/app/features/leaderboards/LeaderboardRepository.server.ts index e553f48cf..5b3ef2e95 100644 --- a/app/features/leaderboards/LeaderboardRepository.server.ts +++ b/app/features/leaderboards/LeaderboardRepository.server.ts @@ -6,7 +6,7 @@ import { DEFAULT_LEADERBOARD_MAX_SIZE, MATCHES_COUNT_NEEDED_FOR_LEADERBOARD, } from "./leaderboards-constants"; -import { ordinalToSp } from "../mmr"; +import { ordinalToSp } from "../mmr/mmr-utils"; function addPowers(entries: T[]) { return entries.map((entry) => ({ diff --git a/app/features/leaderboards/queries/userSPLeaderboard.server.ts b/app/features/leaderboards/queries/userSPLeaderboard.server.ts index 36f93cf22..b8fbf12db 100644 --- a/app/features/leaderboards/queries/userSPLeaderboard.server.ts +++ b/app/features/leaderboards/queries/userSPLeaderboard.server.ts @@ -1,7 +1,7 @@ import { sql } from "~/db/sql"; import { MATCHES_COUNT_NEEDED_FOR_LEADERBOARD } from "../leaderboards-constants"; import type { PlusTier, User } from "~/db/types"; -import { ordinalToSp } from "~/features/mmr"; +import { ordinalToSp } from "~/features/mmr/mmr-utils"; const stm = sql.prepare(/* sql */ ` select diff --git a/app/features/leaderboards/routes/leaderboards.tsx b/app/features/leaderboards/routes/leaderboards.tsx index 3fd7206e7..72dc17d5a 100644 --- a/app/features/leaderboards/routes/leaderboards.tsx +++ b/app/features/leaderboards/routes/leaderboards.tsx @@ -12,16 +12,15 @@ import { Avatar } from "~/components/Avatar"; import { TierImage, WeaponImage } from "~/components/Image"; import { Main } from "~/components/Main"; import { HALF_HOUR_IN_MS } from "~/constants"; -import { getUser } from "~/features/auth/core"; +import { getUser } from "~/features/auth/core/user.server"; import * as LeaderboardRepository from "~/features/leaderboards/LeaderboardRepository.server"; -import { ordinalToSp } from "~/features/mmr"; import { allSeasons, currentOrPreviousSeason, currentSeason, } from "~/features/mmr/season"; import type { SkillTierInterval } from "~/features/mmr/tiered.server"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { weaponCategories, type MainWeaponId, @@ -40,7 +39,7 @@ import { userSeasonsPage, userSubmittedImage, } from "~/utils/urls"; -import styles from "../../top-search/top-search.css"; +import styles from "../../top-search/top-search.css?url"; import { TopTenPlayer } from "../components/TopTenPlayer"; import { cachedFullUserLeaderboard, @@ -59,6 +58,7 @@ import { weaponXPLeaderboard, type XPLeaderboardItem, } from "../queries/XPLeaderboard.server"; +import { ordinalToSp } from "~/features/mmr/mmr-utils"; export const handle: SendouRouteHandle = { i18n: ["vods"], diff --git a/app/features/map-list-generator/routes/maps.tsx b/app/features/map-list-generator/routes/maps.tsx index 7c7e46e34..3697ad2d6 100644 --- a/app/features/map-list-generator/routes/maps.tsx +++ b/app/features/map-list-generator/routes/maps.tsx @@ -18,9 +18,9 @@ import { Toggle } from "~/components/Toggle"; import type { CalendarEvent } from "~/db/types"; import { useTranslation } from "react-i18next"; import { getUserId } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { stageIds, type ModeWithStage } from "~/modules/in-game-lists"; -import styles from "~/styles/maps.css"; +import styles from "~/styles/maps.css?url"; import { type SendouRouteHandle } from "~/utils/remix"; import { makeTitle } from "~/utils/strings"; import { diff --git a/app/features/map-planner/components/Planner.tsx b/app/features/map-planner/components/Planner.tsx index 27744c9fe..95aaa25c3 100644 --- a/app/features/map-planner/components/Planner.tsx +++ b/app/features/map-planner/components/Planner.tsx @@ -4,7 +4,6 @@ import randomInt from "just-random-integer"; import * as React from "react"; import { usePlannerBg } from "~/hooks/usePlannerBg"; import { useTranslation } from "react-i18next"; -import type { LanguageCode } from "~/modules/i18n"; import type { ModeShort, StageId } from "~/modules/in-game-lists"; import { specialWeaponIds, @@ -27,6 +26,7 @@ import { Button } from "../../../components/Button"; import { Image } from "../../../components/Image"; import type { StageBackgroundStyle } from "../plans-types"; import clsx from "clsx"; +import type { LanguageCode } from "~/modules/i18n/config"; export default function Planner() { const { t } = useTranslation(["common"]); diff --git a/app/features/map-planner/routes/plans.tsx b/app/features/map-planner/routes/plans.tsx index aa1c57ae1..cc8c8cb7f 100644 --- a/app/features/map-planner/routes/plans.tsx +++ b/app/features/map-planner/routes/plans.tsx @@ -1,6 +1,6 @@ import { lazy } from "react"; import type { LinksFunction, MetaFunction } from "@remix-run/node"; -import styles from "../plans.css"; +import styles from "../plans.css?url"; import type { SendouRouteHandle } from "~/utils/remix"; import { useIsMounted } from "~/hooks/useIsMounted"; import { navIconUrl, PLANNER_URL } from "~/utils/urls"; diff --git a/app/features/mmr/index.ts b/app/features/mmr/index.ts deleted file mode 100644 index 82548fdd0..000000000 --- a/app/features/mmr/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { - queryCurrentUserRating, - queryCurrentTeamRating, -} from "./mmr-utils.server"; - -export { rate, userIdsToIdentifier, ordinalToSp } from "./mmr-utils"; - -export { currentSeason } from "./season"; diff --git a/app/features/object-damage-calculator/core/objectHitPoints.ts b/app/features/object-damage-calculator/core/objectHitPoints.ts index 41948c3ae..48da63212 100644 --- a/app/features/object-damage-calculator/core/objectHitPoints.ts +++ b/app/features/object-damage-calculator/core/objectHitPoints.ts @@ -9,12 +9,12 @@ import { specialFieldHp, subStats, hpDivided, - weaponParams, type AbilityPoints, type SpecialWeaponParams, type SubWeaponParams, } from "~/features/build-analyzer"; import type { HitPoints } from "../calculator-types"; +import { weaponParams } from "~/features/build-analyzer/core/weapon-params"; const WAVE_BREAKER_HP = 400; const SPRINKLER_HP = 120; diff --git a/app/features/object-damage-calculator/routes/object-damage-calculator.tsx b/app/features/object-damage-calculator/routes/object-damage-calculator.tsx index 679daef14..6b56c63dc 100644 --- a/app/features/object-damage-calculator/routes/object-damage-calculator.tsx +++ b/app/features/object-damage-calculator/routes/object-damage-calculator.tsx @@ -35,7 +35,7 @@ import { } from "~/utils/urls"; import { useObjectDamage } from "../calculator-hooks"; import type { DamageReceiver } from "../calculator-types"; -import styles from "../calculator.css"; +import styles from "../calculator.css?url"; export const CURRENT_PATCH = "6.1"; diff --git a/app/features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx b/app/features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx index d4ea5dabd..c1cb379cc 100644 --- a/app/features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx +++ b/app/features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx @@ -10,7 +10,7 @@ import { nextNonCompletedVoting, rangeToMonthYear, } from "~/features/plus-voting/core"; -import { requireUser, useUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { canAddCommentToSuggestionBE, canAddCommentToSuggestionFE, @@ -22,6 +22,7 @@ import { actualNumber, trimmedString } from "~/utils/zod"; import type { PlusSuggestionsLoaderData } from "./plus.suggestions"; import { CommentTextarea } from "./plus.suggestions.new"; import * as PlusSuggestionRepository from "~/features/plus-suggestions/PlusSuggestionRepository.server"; +import { useUser } from "~/features/auth/core/user"; const commentActionSchema = z.object({ comment: z.preprocess( diff --git a/app/features/plus-suggestions/routes/plus.suggestions.new.tsx b/app/features/plus-suggestions/routes/plus.suggestions.new.tsx index 6e363d41f..c880a0735 100644 --- a/app/features/plus-suggestions/routes/plus.suggestions.new.tsx +++ b/app/features/plus-suggestions/routes/plus.suggestions.new.tsx @@ -32,11 +32,12 @@ import { import type { UserWithPlusTier } from "~/db/types"; import { FormMessage } from "~/components/FormMessage"; import { atOrError } from "~/utils/arrays"; -import { requireUser, useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { SubmitButton } from "~/components/SubmitButton"; import { UserSearch } from "~/components/UserSearch"; import * as PlusSuggestionRepository from "~/features/plus-suggestions/PlusSuggestionRepository.server"; import * as UserRepository from "~/features/user-page/UserRepository.server"; +import { requireUser } from "~/features/auth/core/user.server"; const commentActionSchema = z.object({ tier: z.preprocess( diff --git a/app/features/plus-suggestions/routes/plus.suggestions.tsx b/app/features/plus-suggestions/routes/plus.suggestions.tsx index 68a43ab42..b8e3f6cae 100644 --- a/app/features/plus-suggestions/routes/plus.suggestions.tsx +++ b/app/features/plus-suggestions/routes/plus.suggestions.tsx @@ -22,7 +22,7 @@ import { } from "~/features/plus-voting/core"; import type { PlusSuggestion, User } from "~/db/types"; import * as PlusSuggestionRepository from "~/features/plus-suggestions/PlusSuggestionRepository.server"; -import { requireUser, useUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { canAddCommentToSuggestionFE, canDeleteComment, @@ -35,6 +35,7 @@ import { makeTitle } from "~/utils/strings"; import { assertUnreachable } from "~/utils/types"; import { userPage } from "~/utils/urls"; import { _action, actualNumber } from "~/utils/zod"; +import { useUser } from "~/features/auth/core/user"; export const meta: MetaFunction = () => { return [ diff --git a/app/features/plus-suggestions/routes/plus.tsx b/app/features/plus-suggestions/routes/plus.tsx index 39ba7f1c5..cdc99329d 100644 --- a/app/features/plus-suggestions/routes/plus.tsx +++ b/app/features/plus-suggestions/routes/plus.tsx @@ -2,7 +2,7 @@ import type { LinksFunction } from "@remix-run/node"; import { Outlet } from "@remix-run/react"; import { Main } from "~/components/Main"; import { SubNav, SubNavLink } from "~/components/SubNav"; -import styles from "~/styles/plus.css"; +import styles from "~/styles/plus.css?url"; import { type SendouRouteHandle } from "~/utils/remix"; import { navIconUrl, plusSuggestionPage } from "~/utils/urls"; diff --git a/app/features/plus-voting/routes/plus.voting.results.tsx b/app/features/plus-voting/routes/plus.voting.results.tsx index 59f44e490..cf6a69239 100644 --- a/app/features/plus-voting/routes/plus.voting.results.tsx +++ b/app/features/plus-voting/routes/plus.voting.results.tsx @@ -9,9 +9,9 @@ import clsx from "clsx"; import invariant from "tiny-invariant"; import type { UserWithPlusTier } from "~/db/types"; import * as PlusVotingRepository from "~/features/plus-voting/PlusVotingRepository.server"; -import { getUser } from "~/features/auth/core"; +import { getUser } from "~/features/auth/core/user.server"; import { lastCompletedVoting } from "~/features/plus-voting/core"; -import styles from "~/styles/plus-history.css"; +import styles from "~/styles/plus-history.css?url"; import { roundToNDecimalPlaces } from "~/utils/number"; import { makeTitle } from "~/utils/strings"; import { PLUS_SERVER_DISCORD_URL, userPage } from "~/utils/urls"; diff --git a/app/features/plus-voting/routes/plus.voting.tsx b/app/features/plus-voting/routes/plus.voting.tsx index 638f8bd51..029ad946f 100644 --- a/app/features/plus-voting/routes/plus.voting.tsx +++ b/app/features/plus-voting/routes/plus.voting.tsx @@ -13,7 +13,7 @@ import { Button } from "~/components/Button"; import { CheckmarkIcon } from "~/components/icons/Checkmark"; import { RelativeTime } from "~/components/RelativeTime"; import { PLUS_DOWNVOTE, PLUS_UPVOTE } from "~/constants"; -import { getUser, requireUser } from "~/features/auth/core"; +import { getUser, requireUser } from "~/features/auth/core/user.server"; import type { PlusVoteFromFE } from "~/features/plus-voting/core"; import { rangeToMonthYear, diff --git a/app/features/sendouq-settings/routes/q.settings.tsx b/app/features/sendouq-settings/routes/q.settings.tsx index fdedb844e..a2b8c89b9 100644 --- a/app/features/sendouq-settings/routes/q.settings.tsx +++ b/app/features/sendouq-settings/routes/q.settings.tsx @@ -48,7 +48,7 @@ import { SENDOUQ_WEAPON_POOL_MAX_SIZE, } from "../q-settings-constants"; import { settingsActionSchema } from "../q-settings-schemas.server"; -import styles from "../q-settings.css"; +import styles from "../q-settings.css?url"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/sendouq-streams/routes/q.streams.tsx b/app/features/sendouq-streams/routes/q.streams.tsx index e39c59c62..e4e0b3d56 100644 --- a/app/features/sendouq-streams/routes/q.streams.tsx +++ b/app/features/sendouq-streams/routes/q.streams.tsx @@ -5,7 +5,7 @@ import { twitchThumbnailUrlToSrc } from "~/modules/twitch/utils"; import { FAQ_PAGE, sendouQMatchPage, twitchUrl, userPage } from "~/utils/urls"; import { cachedStreams } from "../core/streams.server"; import { Avatar } from "~/components/Avatar"; -import styles from "~/features/sendouq/q.css"; +import styles from "~/features/sendouq/q.css?url"; import type { LinksFunction } from "@remix-run/node"; import { useTranslation } from "react-i18next"; import { useIsMounted } from "~/hooks/useIsMounted"; diff --git a/app/features/sendouq/components/GroupCard.tsx b/app/features/sendouq/components/GroupCard.tsx index aaa77844f..03c939c84 100644 --- a/app/features/sendouq/components/GroupCard.tsx +++ b/app/features/sendouq/components/GroupCard.tsx @@ -18,7 +18,7 @@ import { StarIcon } from "~/components/icons/Star"; import { StarFilledIcon } from "~/components/icons/StarFilled"; import { TrashIcon } from "~/components/icons/Trash"; import type { GroupMember as GroupMemberType, ParsedMemento } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { MATCHES_COUNT_NEEDED_FOR_LEADERBOARD } from "~/features/leaderboards/leaderboards-constants"; import { ordinalToRoundedSp } from "~/features/mmr/mmr-utils"; import type { TieredSkill } from "~/features/mmr/tiered.server"; diff --git a/app/features/sendouq/core/skills.server.ts b/app/features/sendouq/core/skills.server.ts index 69b0de3f7..7b651a604 100644 --- a/app/features/sendouq/core/skills.server.ts +++ b/app/features/sendouq/core/skills.server.ts @@ -12,12 +12,14 @@ import type { import { MATCHES_COUNT_NEEDED_FOR_LEADERBOARD } from "~/features/leaderboards/leaderboards-constants"; import { ordinalToSp, - queryCurrentTeamRating, - queryCurrentUserRating, rate, userIdsToIdentifier, -} from "~/features/mmr"; -import { queryTeamPlayerRatingAverage } from "~/features/mmr/mmr-utils.server"; +} from "~/features/mmr/mmr-utils"; +import { + queryCurrentTeamRating, + queryCurrentUserRating, + queryTeamPlayerRatingAverage, +} from "~/features/mmr/mmr-utils.server"; import { currentOrPreviousSeason } from "~/features/mmr/season"; import { roundToNDecimalPlaces } from "~/utils/number"; diff --git a/app/features/sendouq/routes/q.looking.tsx b/app/features/sendouq/routes/q.looking.tsx index 42a45757e..55da65edf 100644 --- a/app/features/sendouq/routes/q.looking.tsx +++ b/app/features/sendouq/routes/q.looking.tsx @@ -17,7 +17,7 @@ import { Image } from "~/components/Image"; import { Main } from "~/components/Main"; import { NewTabs } from "~/components/NewTabs"; import { SubmitButton } from "~/components/SubmitButton"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUser, requireUser } from "~/features/auth/core/user.server"; import * as NotificationService from "~/features/chat/NotificationService.server"; import { Chat, useChat } from "~/features/chat/components/Chat"; @@ -63,7 +63,7 @@ import { FULL_GROUP_SIZE } from "../q-constants"; import { lookingSchema } from "../q-schemas.server"; import type { LookingGroupWithInviteCode } from "../q-types"; import { groupRedirectLocationByCurrentLocation } from "../q-utils"; -import styles from "../q.css"; +import styles from "../q.css?url"; import { addLike } from "../queries/addLike.server"; import { addManagerRole } from "../queries/addManagerRole.server"; import { chatCodeByGroupId } from "../queries/chatCodeByGroupId.server"; diff --git a/app/features/sendouq/routes/q.match.$id.tsx b/app/features/sendouq/routes/q.match.$id.tsx index 4f0a1aa93..e3f78cc18 100644 --- a/app/features/sendouq/routes/q.match.$id.tsx +++ b/app/features/sendouq/routes/q.match.$id.tsx @@ -35,11 +35,10 @@ import type { GroupMember, ReportedWeapon } from "~/db/types"; import * as NotificationService from "~/features/chat/NotificationService.server"; import type { ChatMessage } from "~/features/chat/chat-types"; import { type ChatProps, Chat, useChat } from "~/features/chat/components/Chat"; -import { currentSeason } from "~/features/mmr"; import { resolveRoomPass } from "~/features/tournament-bracket/tournament-bracket-utils"; import { useIsMounted } from "~/hooks/useIsMounted"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId, requireUser } from "~/features/auth/core/user.server"; import type { MainWeaponId } from "~/modules/in-game-lists"; import { isMod } from "~/permissions"; @@ -79,7 +78,7 @@ import { import { FULL_GROUP_SIZE, USER_SKILLS_CACHE_KEY } from "../q-constants"; import { matchSchema } from "../q-schemas.server"; import { matchIdFromParams, winnersArrayToWinner } from "../q-utils"; -import styles from "../q.css"; +import styles from "../q.css?url"; import { addDummySkill } from "../queries/addDummySkill.server"; import { addMapResults } from "../queries/addMapResults.server"; import { addPlayerResults } from "../queries/addPlayerResults.server"; @@ -106,6 +105,7 @@ import cachified from "@epic-web/cachified"; import { refreshStreamsCache } from "~/features/sendouq-streams/core/streams.server"; import { CrossIcon } from "~/components/icons/Cross"; import { SPLATTERCOLOR_SCREEN_ID } from "~/modules/in-game-lists/weapon-ids"; +import { currentSeason } from "~/features/mmr/season"; export const meta: MetaFunction = (args) => { const data = args.data as SerializeFrom | null; diff --git a/app/features/sendouq/routes/q.preparing.tsx b/app/features/sendouq/routes/q.preparing.tsx index aae2bd264..937f4a71e 100644 --- a/app/features/sendouq/routes/q.preparing.tsx +++ b/app/features/sendouq/routes/q.preparing.tsx @@ -11,7 +11,7 @@ import invariant from "tiny-invariant"; import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { getUser, requireUser } from "~/features/auth/core/user.server"; -import { currentSeason } from "~/features/mmr"; +import { currentSeason } from "~/features/mmr/season"; import * as QMatchRepository from "~/features/sendouq-match/QMatchRepository.server"; import { useAutoRefresh } from "~/hooks/useAutoRefresh"; import type { SendouRouteHandle } from "~/utils/remix"; @@ -30,7 +30,7 @@ import { hasGroupManagerPerms } from "../core/groups"; import { FULL_GROUP_SIZE } from "../q-constants"; import { preparingSchema } from "../q-schemas.server"; import { groupRedirectLocationByCurrentLocation } from "../q-utils"; -import styles from "../q.css"; +import styles from "../q.css?url"; import { addMember } from "../queries/addMember.server"; import { findCurrentGroupByUserId } from "../queries/findCurrentGroupByUserId.server"; import { findPreparingGroup } from "../queries/findPreparingGroup.server"; diff --git a/app/features/sendouq/routes/q.tsx b/app/features/sendouq/routes/q.tsx index f49fc9cab..64a8fe8f6 100644 --- a/app/features/sendouq/routes/q.tsx +++ b/app/features/sendouq/routes/q.tsx @@ -24,9 +24,9 @@ import { UserIcon } from "~/components/icons/User"; import { UsersIcon } from "~/components/icons/Users"; import { sql } from "~/db/sql"; import type { GroupMember } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId, requireUserId } from "~/features/auth/core/user.server"; -import { currentSeason } from "~/features/mmr"; +import { currentSeason } from "~/features/mmr/season"; import type { RankingSeason } from "~/features/mmr/season"; import { nextSeason } from "~/features/mmr/season"; import * as QRepository from "~/features/sendouq/QRepository.server"; @@ -58,7 +58,7 @@ import { import { FULL_GROUP_SIZE, JOIN_CODE_SEARCH_PARAM_KEY } from "../q-constants"; import { frontPageSchema } from "../q-schemas.server"; import { groupRedirectLocationByCurrentLocation } from "../q-utils"; -import styles from "../q.css"; +import styles from "../q.css?url"; import { addMember } from "../queries/addMember.server"; import { deleteLikesByGroupId } from "../queries/deleteLikesByGroupId.server"; import { findCurrentGroupByUserId } from "../queries/findCurrentGroupByUserId.server"; diff --git a/app/features/sendouq/routes/tiers.tsx b/app/features/sendouq/routes/tiers.tsx index 35b03cf13..a254f05b2 100644 --- a/app/features/sendouq/routes/tiers.tsx +++ b/app/features/sendouq/routes/tiers.tsx @@ -1,7 +1,6 @@ import { useLoaderData } from "@remix-run/react"; import { TierImage } from "~/components/Image"; import { Main } from "~/components/Main"; -import { ordinalToSp } from "~/features/mmr"; import { TEAM_LEADERBOARD_MIN_ENTRIES_FOR_LEVIATHAN, TIERS, @@ -11,6 +10,7 @@ import { currentOrPreviousSeason } from "~/features/mmr/season"; import { userSkills } from "~/features/mmr/tiered.server"; import { useTranslation } from "react-i18next"; import type { SendouRouteHandle } from "~/utils/remix"; +import { ordinalToSp } from "~/features/mmr/mmr-utils"; export const handle: SendouRouteHandle = { i18n: ["q"], diff --git a/app/features/team/routes/t.$customUrl.edit.tsx b/app/features/team/routes/t.$customUrl.edit.tsx index db7a4a3f8..40d204c06 100644 --- a/app/features/team/routes/t.$customUrl.edit.tsx +++ b/app/features/team/routes/t.$customUrl.edit.tsx @@ -39,7 +39,7 @@ import { findByIdentifier } from "../queries/findByIdentifier.server"; import { TEAM } from "../team-constants"; import { editTeamSchema, teamParamsSchema } from "../team-schemas.server"; import { canAddCustomizedColors, isTeamOwner } from "../team-utils"; -import styles from "../team.css"; +import styles from "../team.css?url"; import { Input } from "~/components/Input"; export const links: LinksFunction = () => { diff --git a/app/features/team/routes/t.$customUrl.join.tsx b/app/features/team/routes/t.$customUrl.join.tsx index 961b99005..f75d7c7e8 100644 --- a/app/features/team/routes/t.$customUrl.join.tsx +++ b/app/features/team/routes/t.$customUrl.join.tsx @@ -9,7 +9,7 @@ import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { INVITE_CODE_LENGTH } from "~/constants"; import { useTranslation } from "react-i18next"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { notFoundIfFalsy, validate, @@ -24,7 +24,7 @@ import type { DetailedTeam } from "../team-types"; import { isTeamFull, isTeamMember } from "../team-utils"; import * as UserRepository from "~/features/user-page/UserRepository.server"; -import styles from "../team.css"; +import styles from "../team.css?url"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/team/routes/t.$customUrl.roster.tsx b/app/features/team/routes/t.$customUrl.roster.tsx index 1e97f9a4b..b5f9445d5 100644 --- a/app/features/team/routes/t.$customUrl.roster.tsx +++ b/app/features/team/routes/t.$customUrl.roster.tsx @@ -17,7 +17,7 @@ import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { useBaseUrl } from "~/hooks/useBaseUrl"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; import type { SendouRouteHandle } from "~/utils/remix"; import { notFoundIfFalsy, parseRequestFormData, validate } from "~/utils/remix"; @@ -39,7 +39,7 @@ import { TEAM_MEMBER_ROLES } from "../team-constants"; import { manageRosterSchema, teamParamsSchema } from "../team-schemas.server"; import type { DetailedTeamMember } from "../team-types"; import { isTeamFull, isTeamOwner } from "../team-utils"; -import styles from "../team.css"; +import styles from "../team.css?url"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/team/routes/t.$customUrl.tsx b/app/features/team/routes/t.$customUrl.tsx index b2528c488..9a52b4990 100644 --- a/app/features/team/routes/t.$customUrl.tsx +++ b/app/features/team/routes/t.$customUrl.tsx @@ -19,7 +19,7 @@ import { WeaponImage } from "~/components/Image"; import { Main } from "~/components/Main"; import { Placement } from "~/components/Placement"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; import { notFoundIfFalsy, @@ -46,7 +46,7 @@ import { isTeamMember, isTeamOwner, } from "../team-utils"; -import styles from "../team.css"; +import styles from "../team.css?url"; export const meta: MetaFunction = ({ data }) => { if (!data) return []; diff --git a/app/features/team/routes/t.tsx b/app/features/team/routes/t.tsx index 57e1d1563..d4c27db78 100644 --- a/app/features/team/routes/t.tsx +++ b/app/features/team/routes/t.tsx @@ -21,9 +21,9 @@ import { Input } from "~/components/Input"; import { Main } from "~/components/Main"; import { SubmitButton } from "~/components/SubmitButton"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId, requireUserId } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { joinListToNaturalString } from "~/utils/arrays"; import type { SendouRouteHandle } from "~/utils/remix"; import { parseRequestFormData, validate } from "~/utils/remix"; @@ -39,7 +39,7 @@ import { allTeams } from "../queries/allTeams.server"; import { createNewTeam } from "../queries/createNewTeam.server"; import { TEAM, TEAMS_PER_PAGE } from "../team-constants"; import { createTeamSchema } from "../team-schemas.server"; -import styles from "../team.css"; +import styles from "../team.css?url"; import { usePagination } from "~/hooks/usePagination"; import { Pagination } from "~/components/Pagination"; diff --git a/app/features/top-search/routes/xsearch.player.$id.tsx b/app/features/top-search/routes/xsearch.player.$id.tsx index d2b085a9a..9de0872e6 100644 --- a/app/features/top-search/routes/xsearch.player.$id.tsx +++ b/app/features/top-search/routes/xsearch.player.$id.tsx @@ -9,7 +9,7 @@ import { Main } from "~/components/Main"; import { type SendouRouteHandle, notFoundIfFalsy } from "~/utils/remix"; import { PlacementsTable } from "../components/Placements"; import { findPlacementsByPlayerId } from "../queries/findPlacements.server"; -import styles from "../top-search.css"; +import styles from "../top-search.css?url"; import { removeDuplicates } from "~/utils/arrays"; import { navIconUrl, @@ -17,7 +17,7 @@ import { topSearchPlayerPage, userPage, } from "~/utils/urls"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { makeTitle } from "~/utils/strings"; import { useTranslation } from "react-i18next"; diff --git a/app/features/top-search/routes/xsearch.tsx b/app/features/top-search/routes/xsearch.tsx index d2763efd5..91a3dd9e8 100644 --- a/app/features/top-search/routes/xsearch.tsx +++ b/app/features/top-search/routes/xsearch.tsx @@ -7,7 +7,7 @@ import type { import { useLoaderData, useSearchParams } from "@remix-run/react"; import { Main } from "~/components/Main"; import { findPlacementsOfMonth } from "../queries/findPlacements.server"; -import styles from "../top-search.css"; +import styles from "../top-search.css?url"; import { PlacementsTable } from "../components/Placements"; import { rankedModesShort } from "~/modules/in-game-lists/modes"; import type { XRankPlacement } from "~/db/types"; @@ -16,7 +16,7 @@ import { nanoid } from "nanoid"; import { useTranslation } from "react-i18next"; import invariant from "tiny-invariant"; import type { MonthYear } from "../top-search-utils"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { makeTitle } from "~/utils/strings"; import { monthYears } from "../queries/monthYears"; import type { SendouRouteHandle } from "~/utils/remix"; diff --git a/app/features/tournament-bracket/components/Bracket/Match.tsx b/app/features/tournament-bracket/components/Bracket/Match.tsx index b02e3572c..12989bd04 100644 --- a/app/features/tournament-bracket/components/Bracket/Match.tsx +++ b/app/features/tournament-bracket/components/Bracket/Match.tsx @@ -7,7 +7,7 @@ import { import { Link, useFetcher } from "@remix-run/react"; import { tournamentMatchPage, tournamentStreamsPage } from "~/utils/urls"; import clsx from "clsx"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import type { Bracket } from "../../core/Bracket"; import { Popover } from "~/components/Popover"; import * as React from "react"; diff --git a/app/features/tournament-bracket/components/CastInfo.tsx b/app/features/tournament-bracket/components/CastInfo.tsx index 259f3ad8f..69ee7f23c 100644 --- a/app/features/tournament-bracket/components/CastInfo.tsx +++ b/app/features/tournament-bracket/components/CastInfo.tsx @@ -3,7 +3,7 @@ import { InfoPopover } from "~/components/InfoPopover"; import { SubmitButton } from "~/components/SubmitButton"; import { LockIcon } from "~/components/icons/Lock"; import { UnlockIcon } from "~/components/icons/Unlock"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { useTournament } from "~/features/tournament/routes/to.$id"; const lockingInfo = diff --git a/app/features/tournament-bracket/components/ScoreReporter.tsx b/app/features/tournament-bracket/components/ScoreReporter.tsx index dec1a131d..59fbd58da 100644 --- a/app/features/tournament-bracket/components/ScoreReporter.tsx +++ b/app/features/tournament-bracket/components/ScoreReporter.tsx @@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next"; import { Image } from "~/components/Image"; import { NewTabs } from "~/components/NewTabs"; import { SubmitButton } from "~/components/SubmitButton"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { Chat, useChat } from "~/features/chat/components/Chat"; import { useTournament } from "~/features/tournament/routes/to.$id"; import { useIsMounted } from "~/hooks/useIsMounted"; diff --git a/app/features/tournament-bracket/core/Bracket.ts b/app/features/tournament-bracket/core/Bracket.ts index 96e4617ee..22ca9cabf 100644 --- a/app/features/tournament-bracket/core/Bracket.ts +++ b/app/features/tournament-bracket/core/Bracket.ts @@ -9,7 +9,7 @@ import { removeDuplicates } from "~/utils/arrays"; import { BRACKET_NAMES } from "~/features/tournament/tournament-constants"; import { logger } from "~/utils/logger"; import type { Round } from "~/modules/brackets-model"; -import { getTournamentManager } from ".."; +import { getTournamentManager } from "./brackets-manager"; interface CreateBracketArgs { id: number; @@ -93,7 +93,7 @@ export abstract class Bracket { return; try { - const manager = getTournamentManager("IN_MEMORY"); + const manager = getTournamentManager(); manager.import(this.data); diff --git a/app/features/tournament-bracket/core/Tournament.server.ts b/app/features/tournament-bracket/core/Tournament.server.ts index c1748a264..d5f8baa4f 100644 --- a/app/features/tournament-bracket/core/Tournament.server.ts +++ b/app/features/tournament-bracket/core/Tournament.server.ts @@ -1,10 +1,10 @@ import { Tournament } from "./Tournament"; -import { getTournamentManager } from ".."; import * as TournamentRepository from "~/features/tournament/TournamentRepository.server"; import { notFoundIfFalsy } from "~/utils/remix"; import type { Unwrapped } from "~/utils/types"; +import { getServerTournamentManager } from "./brackets-manager/manager.server"; -const manager = getTournamentManager("SQL"); +const manager = getServerTournamentManager(); export type TournamentData = Unwrapped; export type TournamentDataTeam = TournamentData["ctx"]["teams"][number]; diff --git a/app/features/tournament-bracket/core/Tournament.ts b/app/features/tournament-bracket/core/Tournament.ts index 66033ee74..b7a855373 100644 --- a/app/features/tournament-bracket/core/Tournament.ts +++ b/app/features/tournament-bracket/core/Tournament.ts @@ -13,12 +13,12 @@ import { import { rankedModesShort } from "~/modules/in-game-lists/modes"; import type { ModeShort } from "~/modules/in-game-lists"; import { databaseTimestampToDate } from "~/utils/dates"; -import { getTournamentManager } from ".."; import { fillWithNullTillPowerOfTwo } from "../tournament-bracket-utils"; import type { Stage } from "~/modules/brackets-model"; import { Bracket } from "./Bracket"; import { BRACKET_NAMES } from "~/features/tournament/tournament-constants"; -import { currentSeason } from "~/features/mmr"; +import { currentSeason } from "~/features/mmr/season"; +import { getTournamentManager } from "./brackets-manager"; export type OptionalIdObject = { id: number } | undefined; @@ -129,7 +129,7 @@ export class Tournament { }), ); } else { - const manager = getTournamentManager("IN_MEMORY"); + const manager = getTournamentManager(); const { teams, relevantMatchesFinished } = sources ? this.resolveTeamsFromSources(sources) : { diff --git a/app/features/tournament-bracket/core/brackets-manager/manager.server.ts b/app/features/tournament-bracket/core/brackets-manager/manager.server.ts new file mode 100644 index 000000000..ff40e19a3 --- /dev/null +++ b/app/features/tournament-bracket/core/brackets-manager/manager.server.ts @@ -0,0 +1,11 @@ +import { SqlDatabase } from "./crud.server"; +import { BracketsManager } from "~/modules/brackets-manager"; + +export function getServerTournamentManager() { + const storage = new SqlDatabase(); + // TODO: fix this ts-expect-error comment + // @ts-expect-error interface mismatch + const manager = new BracketsManager(storage); + + return manager; +} diff --git a/app/features/tournament-bracket/core/brackets-manager/manager.ts b/app/features/tournament-bracket/core/brackets-manager/manager.ts index 0c0dc84fa..d0569a24f 100644 --- a/app/features/tournament-bracket/core/brackets-manager/manager.ts +++ b/app/features/tournament-bracket/core/brackets-manager/manager.ts @@ -1,12 +1,8 @@ import { InMemoryDatabase } from "~/modules/brackets-memory-db"; -import { SqlDatabase } from "./crud.server"; import { BracketsManager } from "~/modules/brackets-manager"; -export function getTournamentManager(type: "SQL" | "IN_MEMORY") { - const storage = - type === "IN_MEMORY" ? new InMemoryDatabase() : new SqlDatabase(); - // TODO: fix this ts-expect-error comment - // @ts-expect-error interface mismatch +export function getTournamentManager() { + const storage = new InMemoryDatabase(); const manager = new BracketsManager(storage); return manager; diff --git a/app/features/tournament-bracket/index.ts b/app/features/tournament-bracket/index.ts deleted file mode 100644 index 92ae84570..000000000 --- a/app/features/tournament-bracket/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { everyMatchIsOver } from "./tournament-bracket-utils"; -export { getTournamentManager } from "./core/brackets-manager"; -export { findMapPoolByTeamId } from "./queries/findMapPoolByTeamId.server"; diff --git a/app/features/tournament-bracket/routes/to.$id.brackets.tsx b/app/features/tournament-bracket/routes/to.$id.brackets.tsx index eb2d85204..1a731b8bc 100644 --- a/app/features/tournament-bracket/routes/to.$id.brackets.tsx +++ b/app/features/tournament-bracket/routes/to.$id.brackets.tsx @@ -13,13 +13,12 @@ import { FormWithConfirm } from "~/components/FormWithConfirm"; import { Popover } from "~/components/Popover"; import { SubmitButton } from "~/components/SubmitButton"; import { sql } from "~/db/sql"; -import { requireUser, useUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { - currentSeason, queryCurrentTeamRating, queryCurrentUserRating, -} from "~/features/mmr"; -import { queryTeamPlayerRatingAverage } from "~/features/mmr/mmr-utils.server"; + queryTeamPlayerRatingAverage, +} from "~/features/mmr/mmr-utils.server"; import { TOURNAMENT, tournamentIdFromParams } from "~/features/tournament"; import * as TournamentRepository from "~/features/tournament/TournamentRepository.server"; import { HACKY_isInviteOnlyEvent } from "~/features/tournament/tournament-utils"; @@ -40,7 +39,6 @@ import { } from "../../tournament/routes/to.$id"; import { tournamentFromDB } from "../core/Tournament.server"; import { resolveBestOfs } from "../core/bestOf.server"; -import { getTournamentManager } from "../core/brackets-manager"; import { tournamentSummary } from "../core/summarizer.server"; import { addSummary } from "../queries/addSummary.server"; import { allMatchResultsByTournamentId } from "../queries/allMatchResultsByTournamentId.server"; @@ -51,8 +49,8 @@ import { bracketSubscriptionKey, fillWithNullTillPowerOfTwo, } from "../tournament-bracket-utils"; -import bracketStyles from "../tournament-bracket.css"; -import bracketComponentStyles from "../components/Bracket/bracket.css"; +import bracketStyles from "../tournament-bracket.css?url"; +import bracketComponentStyles from "../components/Bracket/bracket.css?url"; import type { Standing } from "../core/Bracket"; import { removeDuplicates } from "~/utils/arrays"; import { Placement } from "~/components/Placement"; @@ -62,6 +60,9 @@ import { BRACKET_NAMES } from "~/features/tournament/tournament-constants"; import { Bracket } from "../components/Bracket"; import { EyeIcon } from "~/components/icons/Eye"; import { EyeSlashIcon } from "~/components/icons/EyeSlash"; +import { useUser } from "~/features/auth/core/user"; +import { currentSeason } from "~/features/mmr/season"; +import { getServerTournamentManager } from "../core/brackets-manager/manager.server"; export const links: LinksFunction = () => { return [ @@ -81,7 +82,7 @@ export const action: ActionFunction = async ({ params, request }) => { const tournamentId = tournamentIdFromParams(params); const tournament = await tournamentFromDB({ tournamentId, user }); const data = await parseRequestFormData({ request, schema: bracketSchema }); - const manager = getTournamentManager("SQL"); + const manager = getServerTournamentManager(); switch (data._action) { case "START_BRACKET": { diff --git a/app/features/tournament-bracket/routes/to.$id.matches.$mid.tsx b/app/features/tournament-bracket/routes/to.$id.matches.$mid.tsx index 16df653c6..a7a9de427 100644 --- a/app/features/tournament-bracket/routes/to.$id.matches.$mid.tsx +++ b/app/features/tournament-bracket/routes/to.$id.matches.$mid.tsx @@ -13,7 +13,7 @@ import { Avatar } from "~/components/Avatar"; import { LinkButton } from "~/components/Button"; import { ArrowLongLeftIcon } from "~/components/icons/ArrowLongLeft"; import { sql } from "~/db/sql"; -import { requireUser, useUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { tournamentIdFromParams } from "~/features/tournament"; import { useTournament } from "~/features/tournament/routes/to.$id"; import { useSearchParamState } from "~/hooks/useSearchParamState"; @@ -30,7 +30,6 @@ import { } from "~/utils/urls"; import { ScoreReporter } from "../components/ScoreReporter"; import { tournamentFromDB } from "../core/Tournament.server"; -import { getTournamentManager } from "../core/brackets-manager"; import { emitter } from "../core/emitters.server"; import { resolveMapList } from "../core/mapList.server"; import { deleteTournamentMatchGameResultById } from "../queries/deleteTournamentMatchGameResultById.server"; @@ -45,9 +44,11 @@ import { matchIsLocked, matchSubscriptionKey, } from "../tournament-bracket-utils"; -import bracketStyles from "../tournament-bracket.css"; +import bracketStyles from "../tournament-bracket.css?url"; import { CastInfo } from "../components/CastInfo"; import * as TournamentRepository from "~/features/tournament/TournamentRepository.server"; +import { useUser } from "~/features/auth/core/user"; +import { getServerTournamentManager } from "../core/brackets-manager/manager.server"; export const links: LinksFunction = () => [ { @@ -84,7 +85,7 @@ export const action: ActionFunction = async ({ params, request }) => { ); }; - const manager = getTournamentManager("SQL"); + const manager = getServerTournamentManager(); const scores: [number, number] = [ match.opponentOne?.score ?? 0, diff --git a/app/features/tournament-subs/routes/to.$id.subs.new.tsx b/app/features/tournament-subs/routes/to.$id.subs.new.tsx index bf148bd66..62361ba94 100644 --- a/app/features/tournament-subs/routes/to.$id.subs.new.tsx +++ b/app/features/tournament-subs/routes/to.$id.subs.new.tsx @@ -9,8 +9,8 @@ import React from "react"; import { Label } from "~/components/Label"; import { SubmitButton } from "~/components/SubmitButton"; import { useTranslation } from "react-i18next"; -import styles from "../tournament-subs.css"; -import { requireUser, useUser } from "~/features/auth/core"; +import styles from "../tournament-subs.css?url"; +import { requireUser } from "~/features/auth/core/user.server"; import type { MainWeaponId } from "~/modules/in-game-lists"; import { WeaponCombobox } from "~/components/Combobox"; import { TOURNAMENT_SUB } from "../tournament-subs-constants"; @@ -24,6 +24,7 @@ import { FormMessage } from "~/components/FormMessage"; import { subSchema } from "../tournament-subs-schemas.server"; import { upsertSub } from "../queries/upsertSub.server"; import { tournamentSubsPage } from "~/utils/urls"; +import { useUser } from "~/features/auth/core/user"; export const handle: SendouRouteHandle = { i18n: ["user"], diff --git a/app/features/tournament-subs/routes/to.$id.subs.tsx b/app/features/tournament-subs/routes/to.$id.subs.tsx index 8caddd3cf..4a731f22b 100644 --- a/app/features/tournament-subs/routes/to.$id.subs.tsx +++ b/app/features/tournament-subs/routes/to.$id.subs.tsx @@ -15,7 +15,6 @@ import { WeaponImage } from "~/components/Image"; import { Redirect } from "~/components/Redirect"; import { MicrophoneIcon } from "~/components/icons/Microphone"; import { TrashIcon } from "~/components/icons/Trash"; -import { getUser, requireUser, useUser } from "~/features/auth/core"; import { tournamentIdFromParams } from "~/features/tournament"; import { useTournament } from "~/features/tournament/routes/to.$id"; import { discordFullName } from "~/utils/strings"; @@ -26,8 +25,10 @@ import { findSubsByTournamentId, type SubByTournamentId, } from "../queries/findSubsByTournamentId.server"; -import styles from "../tournament-subs.css"; +import styles from "../tournament-subs.css?url"; import { tournamentFromDB } from "~/features/tournament-bracket/core/Tournament.server"; +import { getUser, requireUser } from "~/features/auth/core/user.server"; +import { useUser } from "~/features/auth/core/user"; export const links: LinksFunction = () => { return [ diff --git a/app/features/tournament/routes/to.$id.admin.tsx b/app/features/tournament/routes/to.$id.admin.tsx index fe6748321..cdc4f92e9 100644 --- a/app/features/tournament/routes/to.$id.admin.tsx +++ b/app/features/tournament/routes/to.$id.admin.tsx @@ -14,7 +14,7 @@ import { SubmitButton } from "~/components/SubmitButton"; import { Toggle } from "~/components/Toggle"; import { UserSearch } from "~/components/UserSearch"; import { TrashIcon } from "~/components/icons/Trash"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; import type { TournamentData } from "~/features/tournament-bracket/core/Tournament.server"; import { tournamentFromDB } from "~/features/tournament-bracket/core/Tournament.server"; @@ -36,7 +36,7 @@ import { updateShowMapListGenerator } from "../queries/updateShowMapListGenerato import { adminActionSchema } from "../tournament-schemas.server"; import { tournamentIdFromParams } from "../tournament-utils"; import { useTournament } from "./to.$id"; -import { findMapPoolByTeamId } from "~/features/tournament-bracket"; +import { findMapPoolByTeamId } from "~/features/tournament-bracket/queries/findMapPoolByTeamId.server"; export const action: ActionFunction = async ({ request, params }) => { const user = await requireUserId(request); diff --git a/app/features/tournament/routes/to.$id.join.tsx b/app/features/tournament/routes/to.$id.join.tsx index f3e01ee90..72293ba0d 100644 --- a/app/features/tournament/routes/to.$id.join.tsx +++ b/app/features/tournament/routes/to.$id.join.tsx @@ -6,7 +6,7 @@ import { useTranslation } from "react-i18next"; import invariant from "tiny-invariant"; import { SubmitButton } from "~/components/SubmitButton"; import { INVITE_CODE_LENGTH } from "~/constants"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUserId } from "~/features/auth/core/user.server"; import { notFoundIfFalsy, parseRequestFormData, validate } from "~/utils/remix"; import { assertUnreachable } from "~/utils/types"; diff --git a/app/features/tournament/routes/to.$id.maps.tsx b/app/features/tournament/routes/to.$id.maps.tsx index 4c8306d3d..a6e88edcc 100644 --- a/app/features/tournament/routes/to.$id.maps.tsx +++ b/app/features/tournament/routes/to.$id.maps.tsx @@ -6,7 +6,7 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { Alert } from "~/components/Alert"; import type { MapPoolMap } from "~/db/types"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId } from "~/features/auth/core/user.server"; import { MapPool } from "~/features/map-list-generator/core/map-pool"; import { tournamentFromDB } from "~/features/tournament-bracket/core/Tournament.server"; @@ -18,7 +18,7 @@ import type { TournamentMaplistSource, } from "~/modules/tournament-map-list-generator"; import { createTournamentMapList } from "~/modules/tournament-map-list-generator"; -import mapsStyles from "~/styles/maps.css"; +import mapsStyles from "~/styles/maps.css?url"; import { type SendouRouteHandle } from "~/utils/remix"; import { tournamentPage } from "~/utils/urls"; import { findMapPoolsByTournamentId } from "../queries/findMapPoolsByTournamentId.server"; diff --git a/app/features/tournament/routes/to.$id.register.tsx b/app/features/tournament/routes/to.$id.register.tsx index ab8301033..ec4487c79 100644 --- a/app/features/tournament/routes/to.$id.register.tsx +++ b/app/features/tournament/routes/to.$id.register.tsx @@ -23,12 +23,11 @@ import { CheckmarkIcon } from "~/components/icons/Checkmark"; import { ClockIcon } from "~/components/icons/Clock"; import { CrossIcon } from "~/components/icons/Cross"; import { UserIcon } from "~/components/icons/User"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUser, requireUser } from "~/features/auth/core/user.server"; import { MapPool } from "~/features/map-list-generator/core/map-pool"; import { BANNED_MAPS } from "~/features/sendouq-settings/banned-maps"; import { ModeMapPoolPicker } from "~/features/sendouq-settings/components/ModeMapPoolPicker"; -import { findMapPoolByTeamId } from "~/features/tournament-bracket"; import type { TournamentData } from "~/features/tournament-bracket/core/Tournament.server"; import { tournamentFromDB, @@ -77,6 +76,7 @@ import { useTournamentFriendCode, useTournament } from "./to.$id"; import { FriendCodeInput } from "~/components/FriendCodeInput"; import * as UserRepository from "~/features/user-page/UserRepository.server"; import * as QRepository from "~/features/sendouq/QRepository.server"; +import { findMapPoolByTeamId } from "~/features/tournament-bracket/queries/findMapPoolByTeamId.server"; export const handle: SendouRouteHandle = { breadcrumb: () => ({ diff --git a/app/features/tournament/routes/to.$id.seeds.tsx b/app/features/tournament/routes/to.$id.seeds.tsx index 1f27d55e9..d40ed1d63 100644 --- a/app/features/tournament/routes/to.$id.seeds.tsx +++ b/app/features/tournament/routes/to.$id.seeds.tsx @@ -31,7 +31,7 @@ import { Catcher } from "~/components/Catcher"; import { Draggable } from "~/components/Draggable"; import { Image, TierImage } from "~/components/Image"; import { SubmitButton } from "~/components/SubmitButton"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { cachedFullUserLeaderboard } from "~/features/leaderboards/core/leaderboards.server"; import { currentOrPreviousSeason } from "~/features/mmr/season"; import { diff --git a/app/features/tournament/routes/to.$id.tsx b/app/features/tournament/routes/to.$id.tsx index 6795148ff..6a9551a46 100644 --- a/app/features/tournament/routes/to.$id.tsx +++ b/app/features/tournament/routes/to.$id.tsx @@ -14,7 +14,7 @@ import * as React from "react"; import { useTranslation } from "react-i18next"; import { Main } from "~/components/Main"; import { SubNav, SubNavLink } from "~/components/SubNav"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUser } from "~/features/auth/core/user.server"; import { Tournament } from "~/features/tournament-bracket/core/Tournament"; import { tournamentData } from "~/features/tournament-bracket/core/Tournament.server"; @@ -24,7 +24,7 @@ import { makeTitle } from "~/utils/strings"; import { assertUnreachable } from "~/utils/types"; import { streamsByTournamentId } from "../core/streams.server"; import { tournamentIdFromParams } from "../tournament-utils"; -import styles from "../tournament.css"; +import styles from "../tournament.css?url"; import * as UserRepository from "~/features/user-page/UserRepository.server"; import * as TournamentRepository from "~/features/tournament/TournamentRepository.server"; import { databaseTimestampToDate } from "~/utils/dates"; diff --git a/app/features/user-page/routes/u.$identifier.art.tsx b/app/features/user-page/routes/u.$identifier.art.tsx index 5b1fc7062..899d29070 100644 --- a/app/features/user-page/routes/u.$identifier.art.tsx +++ b/app/features/user-page/routes/u.$identifier.art.tsx @@ -7,17 +7,9 @@ import { validate, parseRequestFormData, } from "~/utils/remix"; -import { - artsByUserId, - ArtGrid, - type ArtSouce, - ART_SOURCES, - findArtById, -} from "~/features/art"; import { useLoaderData, useMatches } from "@remix-run/react"; import { useSearchParamState } from "~/hooks/useSearchParamState"; -import { useUser } from "~/features/auth/core"; -import { deleteArt, deleteArtSchema } from "~/features/art"; +import { useUser } from "~/features/auth/core/user"; import invariant from "tiny-invariant"; import { LinkButton } from "~/components/Button"; import { Popover } from "~/components/Popover"; @@ -26,6 +18,12 @@ import { useTranslation } from "react-i18next"; import { newArtPage } from "~/utils/urls"; import { getUserId, requireUserId } from "~/features/auth/core/user.server"; import * as UserRepository from "~/features/user-page/UserRepository.server"; +import { deleteArtSchema } from "~/features/art/art-schemas.server"; +import { findArtById } from "~/features/art/queries/findArtById.server"; +import { deleteArt } from "~/features/art/queries/deleteArt.server"; +import { artsByUserId } from "~/features/art/queries/artsByUserId.server"; +import { ART_SOURCES, type ArtSource } from "~/features/art/art-types"; +import { ArtGrid } from "~/features/art/components/ArtGrid"; export const handle: SendouRouteHandle = { i18n: ["art"], @@ -88,7 +86,7 @@ export default function UserArtPage() { const { t } = useTranslation(["art"]); const user = useUser(); const data = useLoaderData(); - const [type, setType] = useSearchParamState({ + const [type, setType] = useSearchParamState({ defaultValue: "ALL", name: "source", revive: (value) => ART_SOURCES.find((s) => s === value), diff --git a/app/features/user-page/routes/u.$identifier.builds.new.tsx b/app/features/user-page/routes/u.$identifier.builds.new.tsx index 348fc8d35..2db599e63 100644 --- a/app/features/user-page/routes/u.$identifier.builds.new.tsx +++ b/app/features/user-page/routes/u.$identifier.builds.new.tsx @@ -26,7 +26,7 @@ import { } from "~/features/build-analyzer"; import { buildsByUserId } from "~/features/builds"; import { useTranslation } from "react-i18next"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { requireUserId } from "~/features/auth/core/user.server"; import { type Ability, diff --git a/app/features/user-page/routes/u.$identifier.builds.tsx b/app/features/user-page/routes/u.$identifier.builds.tsx index 33ae9c697..2e9697d41 100644 --- a/app/features/user-page/routes/u.$identifier.builds.tsx +++ b/app/features/user-page/routes/u.$identifier.builds.tsx @@ -5,7 +5,7 @@ import { BuildCard } from "~/components/BuildCard"; import { Button, LinkButton } from "~/components/Button"; import { BUILD } from "~/constants"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId, requireUserId } from "~/features/auth/core/user.server"; import { atOrError } from "~/utils/arrays"; import { diff --git a/app/features/user-page/routes/u.$identifier.edit.tsx b/app/features/user-page/routes/u.$identifier.edit.tsx index c8bcc5427..fc4681e4e 100644 --- a/app/features/user-page/routes/u.$identifier.edit.tsx +++ b/app/features/user-page/routes/u.$identifier.edit.tsx @@ -24,12 +24,12 @@ import { SubmitButton } from "~/components/SubmitButton"; import { USER } from "~/constants"; import type { UserWeapon, User } from "~/db/types"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { requireUser, requireUserId } from "~/features/auth/core/user.server"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { type MainWeaponId } from "~/modules/in-game-lists"; import { canAddCustomizedColorsToUserProfile } from "~/permissions"; -import styles from "~/styles/u-edit.css"; +import styles from "~/styles/u-edit.css?url"; import { translatedCountry } from "~/utils/i18n.server"; import { notFoundIfFalsy, safeParseRequestFormData } from "~/utils/remix"; import { errorIsSqliteUniqueConstraintFailure } from "~/utils/sql"; diff --git a/app/features/user-page/routes/u.$identifier.results.highlights.tsx b/app/features/user-page/routes/u.$identifier.results.highlights.tsx index 759949ab6..5ab1b7a46 100644 --- a/app/features/user-page/routes/u.$identifier.results.highlights.tsx +++ b/app/features/user-page/routes/u.$identifier.results.highlights.tsx @@ -4,7 +4,7 @@ import { useTranslation } from "react-i18next"; import invariant from "tiny-invariant"; import { z } from "zod"; import { FormErrors } from "~/components/FormErrors"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { type UserPageLoaderData } from "~/features/user-page/routes/u.$identifier"; import { normalizeFormFieldArray } from "~/utils/arrays"; import { parseRequestFormData } from "~/utils/remix"; diff --git a/app/features/user-page/routes/u.$identifier.results.tsx b/app/features/user-page/routes/u.$identifier.results.tsx index c3c295575..8fa909b19 100644 --- a/app/features/user-page/routes/u.$identifier.results.tsx +++ b/app/features/user-page/routes/u.$identifier.results.tsx @@ -3,7 +3,7 @@ import invariant from "tiny-invariant"; import { LinkButton } from "~/components/Button"; import { Section } from "~/components/Section"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { userResultsEditHighlightsPage } from "~/utils/urls"; import type { UserPageLoaderData } from "../../../features/user-page/routes/u.$identifier"; import { UserResultsTable } from "~/features/user-page/components/UserResultsTable"; diff --git a/app/features/user-page/routes/u.$identifier.seasons.tsx b/app/features/user-page/routes/u.$identifier.seasons.tsx index 9a009be28..4043ea833 100644 --- a/app/features/user-page/routes/u.$identifier.seasons.tsx +++ b/app/features/user-page/routes/u.$identifier.seasons.tsx @@ -24,7 +24,6 @@ import { Tab, Tabs } from "~/components/Tabs"; import { AlertIcon } from "~/components/icons/Alert"; import { TopTenPlayer } from "~/features/leaderboards/components/TopTenPlayer"; import { playerTopTenPlacement } from "~/features/leaderboards/leaderboards-utils"; -import { ordinalToSp } from "~/features/mmr"; import { currentMMRByUserId, seasonAllMMRByUserId, @@ -60,6 +59,7 @@ import { type SendouRouteHandle, notFoundIfFalsy } from "~/utils/remix"; import { sendouQMatchPage, userSeasonsPage } from "~/utils/urls"; import { userParamsSchema, type UserPageLoaderData } from "./u.$identifier"; import * as UserRepository from "~/features/user-page/UserRepository.server"; +import { ordinalToSp } from "~/features/mmr/mmr-utils"; export const handle: SendouRouteHandle = { i18n: ["user"], diff --git a/app/features/user-page/routes/u.$identifier.tsx b/app/features/user-page/routes/u.$identifier.tsx index 732e96443..7536c5613 100644 --- a/app/features/user-page/routes/u.$identifier.tsx +++ b/app/features/user-page/routes/u.$identifier.tsx @@ -10,14 +10,13 @@ import invariant from "tiny-invariant"; import { z } from "zod"; import { Main } from "~/components/Main"; import { SubNav, SubNavLink } from "~/components/SubNav"; -import { countArtByUserId } from "~/features/art"; import { userTopPlacements } from "~/features/top-search"; import { findVods } from "~/features/vods"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { getUserId } from "~/features/auth/core/user.server"; import { canAddCustomizedColorsToUserProfile, isAdmin } from "~/permissions"; -import styles from "~/styles/u.css"; +import styles from "~/styles/u.css?url"; import { notFoundIfFalsy, type SendouRouteHandle } from "~/utils/remix"; import { discordFullName, makeTitle } from "~/utils/strings"; import { @@ -35,6 +34,7 @@ import { import * as BadgeRepository from "~/features/badges/BadgeRepository.server"; import * as UserRepository from "~/features/user-page/UserRepository.server"; import * as BuildRepository from "~/features/builds/BuildRepository.server"; +import { countArtByUserId } from "~/features/art/queries/countArtByUserId.server"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/user-page/routes/u.$identifier.vods.tsx b/app/features/user-page/routes/u.$identifier.vods.tsx index 0c1f547a7..3cb7d2927 100644 --- a/app/features/user-page/routes/u.$identifier.vods.tsx +++ b/app/features/user-page/routes/u.$identifier.vods.tsx @@ -3,13 +3,13 @@ import { useMatches } from "@remix-run/react"; import invariant from "tiny-invariant"; import { VodListing } from "~/features/vods"; import type { SendouRouteHandle } from "~/utils/remix"; -import styles from "~/features/vods/vods.css"; +import styles from "~/features/vods/vods.css?url"; import type { UserPageLoaderData } from "./u.$identifier"; import { Popover } from "~/components/Popover"; import { useTranslation } from "react-i18next"; import { newVodPage } from "~/utils/urls"; import { LinkButton } from "~/components/Button"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; export const handle: SendouRouteHandle = { i18n: ["vods"], diff --git a/app/features/user-search/routes/u.tsx b/app/features/user-search/routes/u.tsx index ae1606079..ca6cef60d 100644 --- a/app/features/user-search/routes/u.tsx +++ b/app/features/user-search/routes/u.tsx @@ -6,7 +6,7 @@ import type { import { Main } from "~/components/Main"; import { parseSearchParams, type SendouRouteHandle } from "~/utils/remix"; import { navIconUrl, userPage, USER_SEARCH_PAGE } from "~/utils/urls"; -import styles from "~/styles/u.css"; +import styles from "~/styles/u.css?url"; import { Input } from "~/components/Input"; import { SearchIcon } from "~/components/icons/Search"; import { Link, useLoaderData, useSearchParams } from "@remix-run/react"; diff --git a/app/features/vods/routes/vods.$id.tsx b/app/features/vods/routes/vods.$id.tsx index e1f3e79fd..08b3bf780 100644 --- a/app/features/vods/routes/vods.$id.tsx +++ b/app/features/vods/routes/vods.$id.tsx @@ -14,7 +14,7 @@ import { YouTubeEmbed } from "~/components/YouTubeEmbed"; import { useIsMounted } from "~/hooks/useIsMounted"; import { useSearchParamState } from "~/hooks/useSearchParamState"; import { useTranslation } from "react-i18next"; -import { useUser } from "~/features/auth/core"; +import { useUser } from "~/features/auth/core/user"; import { databaseTimestampToDate } from "~/utils/dates"; import { secondsToMinutes } from "~/utils/number"; import { notFoundIfFalsy, type SendouRouteHandle } from "~/utils/remix"; @@ -32,7 +32,7 @@ import { PovUser } from "../components/VodPov"; import { findVodById } from "../queries/findVodById.server"; import type { Vod } from "../vods-types"; import { canEditVideo } from "../vods-utils"; -import styles from "../vods.css"; +import styles from "../vods.css?url"; export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; diff --git a/app/features/vods/routes/vods.new.tsx b/app/features/vods/routes/vods.new.tsx index c49e641f3..f4d2c27d1 100644 --- a/app/features/vods/routes/vods.new.tsx +++ b/app/features/vods/routes/vods.new.tsx @@ -15,7 +15,7 @@ import { SubmitButton } from "~/components/SubmitButton"; import { YouTubeEmbed } from "~/components/YouTubeEmbed"; import type { Video, VideoMatch } from "~/db/types"; import { useTranslation } from "react-i18next"; -import { requireUser } from "~/features/auth/core"; +import { requireUser } from "~/features/auth/core/user.server"; import { stageIds, type MainWeaponId, diff --git a/app/features/vods/routes/vods.tsx b/app/features/vods/routes/vods.tsx index c66b5f183..2aad60893 100644 --- a/app/features/vods/routes/vods.tsx +++ b/app/features/vods/routes/vods.tsx @@ -10,7 +10,7 @@ import { WeaponCombobox } from "~/components/Combobox"; import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; import { useTranslation } from "react-i18next"; -import { i18next } from "~/modules/i18n"; +import { i18next } from "~/modules/i18n/i18next.server"; import { mainWeaponIds, modesShort, stageIds } from "~/modules/in-game-lists"; import type { SendouRouteHandle } from "~/utils/remix"; import { makeTitle } from "~/utils/strings"; @@ -18,7 +18,7 @@ import { navIconUrl, VODS_PAGE } from "~/utils/urls"; import { VodListing } from "../components/VodListing"; import { findVods } from "../queries/findVods.server"; import { videoMatchTypes, VODS_PAGE_BATCH_SIZE } from "../vods-constants"; -import styles from "../vods.css"; +import styles from "../vods.css?url"; export const handle: SendouRouteHandle = { i18n: ["vods"], diff --git a/app/modules/i18n/index.ts b/app/modules/i18n/index.ts deleted file mode 100644 index 1214ba1bf..000000000 --- a/app/modules/i18n/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { i18nLoader } from "./loader"; -export { i18Instance } from "./loader.server"; -export { i18next, i18nCookie } from "./i18next.server"; -export { DEFAULT_LANGUAGE, languages, type LanguageCode } from "./config"; diff --git a/app/root.tsx b/app/root.tsx index 6bac5303c..8081d49d5 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -7,7 +7,6 @@ import type { } from "@remix-run/node"; import { Links, - LiveReload, Meta, Outlet, Scripts, @@ -17,16 +16,15 @@ import { useNavigation, } from "@remix-run/react"; import * as React from "react"; -import commonStyles from "~/styles/common.css"; -import variableStyles from "~/styles/vars.css"; -import utilStyles from "~/styles/utils.css"; -import layoutStyles from "~/styles/layout.css"; -import resetStyles from "~/styles/reset.css"; -import flagsStyles from "~/styles/flags.css"; +import commonStyles from "~/styles/common.css?url"; +import variableStyles from "~/styles/vars.css?url"; +import utilStyles from "~/styles/utils.css?url"; +import layoutStyles from "~/styles/layout.css?url"; +import resetStyles from "~/styles/reset.css?url"; +import flagsStyles from "~/styles/flags.css?url"; import { Catcher } from "./components/Catcher"; import { Layout } from "./components/layout"; -import { getUser } from "./features/auth/core"; -import { DEFAULT_LANGUAGE, i18nCookie, i18next } from "./modules/i18n"; +import { getUser } from "./features/auth/core/user.server"; import { useChangeLanguage } from "remix-i18next/react"; import { type CustomTypeOptions } from "react-i18next"; import { useTranslation } from "react-i18next"; @@ -45,9 +43,11 @@ import { import { useIsMounted } from "./hooks/useIsMounted"; import { CUSTOMIZED_CSS_VARS_NAME } from "./constants"; import NProgress from "nprogress"; -import nProgressStyles from "nprogress/nprogress.css"; +import nProgressStyles from "nprogress/nprogress.css?url"; import * as UserRepository from "~/features/user-page/UserRepository.server"; import { browserTimingHeader } from "./utils/newrelic.server"; +import i18next, { i18nCookie } from "./modules/i18n/i18next.server"; +import { DEFAULT_LANGUAGE } from "./modules/i18n/config"; export const shouldRevalidate: ShouldRevalidateFunction = ({ nextUrl }) => { // // reload on language change so the selected language gets set into the cookie @@ -180,7 +180,6 @@ function Document({ - ); diff --git a/app/utils/playwright.ts b/app/utils/playwright.ts index a88756b8a..bd006afbe 100644 --- a/app/utils/playwright.ts +++ b/app/utils/playwright.ts @@ -85,7 +85,7 @@ export function modalClickConfirmButton(page: Page) { } export async function fetchSendouInk(url: string) { - const res = await fetch(`http://localhost:5800${url}`); + const res = await fetch(`http://localhost:5173${url}`); if (!res.ok) throw new Error("Response not successful"); return res.json() as T; diff --git a/app/utils/urls.ts b/app/utils/urls.ts index 67c7c7d11..370c616d0 100644 --- a/app/utils/urls.ts +++ b/app/utils/urls.ts @@ -20,14 +20,14 @@ import type { BuildAbilitiesTupleWithUnknown, } from "~/modules/in-game-lists/types"; import type navItems from "~/components/layout/nav-items.json"; -import { type AuthErrorCode } from "~/features/auth/core"; +import { type AuthErrorCode } from "~/features/auth/core/errors"; import type { StageBackgroundStyle } from "~/features/map-planner"; import type { ImageUploadType } from "~/features/img-upload"; import { serializeBuild } from "~/features/build-analyzer"; -import type { ArtSouce } from "~/features/art"; import { JOIN_CODE_SEARCH_PARAM_KEY } from "~/features/sendouq/q-constants"; import type { TierName } from "~/features/mmr/mmr-constants"; import type { Preference } from "~/db/tables"; +import type { ArtSource } from "~/features/art/art-types"; const staticAssetsUrl = ({ folder, @@ -158,7 +158,7 @@ export const newVodPage = (vodToEditId?: number) => export const userResultsEditHighlightsPage = (user: UserLinkArgs) => `${userResultsPage(user)}/highlights`; export const artPage = (tag?: string) => `/art${tag ? `?tag=${tag}` : ""}`; -export const userArtPage = (user: UserLinkArgs, source?: ArtSouce) => +export const userArtPage = (user: UserLinkArgs, source?: ArtSource) => `${userPage(user)}/art${source ? `?source=${source}` : ""}`; export const newArtPage = (artId?: Art["id"]) => `${artPage()}/new${artId ? `?art=${artId}` : ""}`; diff --git a/e2e/tournament-bracket.spec.ts b/e2e/tournament-bracket.spec.ts index 080b41196..0dacc330f 100644 --- a/e2e/tournament-bracket.spec.ts +++ b/e2e/tournament-bracket.spec.ts @@ -207,7 +207,7 @@ test.describe("Tournament bracket", () => { ); const inviteLink = inviteLinkProd.replace( "https://sendou.ink", - "http://localhost:5800", + "http://localhost:5173", ); await impersonate(page, NZAP_TEST_ID); diff --git a/package-lock.json b/package-lock.json index 421260708..68e9bc05c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,9 @@ "tsconfig-paths": "^4.2.0", "tsm": "^2.3.0", "typescript": "^5.3.3", - "uvu": "^0.5.6" + "uvu": "^0.5.6", + "vite": "^5.1.4", + "vite-tsconfig-paths": "^4.3.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1739,6 +1741,22 @@ "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.1.2.tgz", "integrity": "sha512-8Q1J/jF0bOKUN+XPTSUo+z34WJHMBLkuDv+HkPPS9ufs+cHvInWrLOLi3qIljhe03Xq777pwEDBKnMafetnPhA==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", @@ -4051,6 +4069,175 @@ "web-streams-polyfill": "^3.1.1" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@smithy/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.2.tgz", @@ -6248,9 +6435,9 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -9685,6 +9872,12 @@ "dev": true, "license": "MIT" }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gopd": { "version": "1.0.1", "license": "MIT", @@ -13064,9 +13257,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -14288,6 +14481,38 @@ "resolved": "https://registry.npmjs.org/ringbufferjs/-/ringbufferjs-2.0.0.tgz", "integrity": "sha512-GCOqTzUsTHF7nrqcgtNGAFotXztLgiePpIDpyWZ7R5I02tmfJWV+/yuJc//Hlsd8G+WzI1t/dc2y/w2imDZdog==" }, + "node_modules/rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "fsevents": "~2.3.2" + } + }, "node_modules/rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", @@ -15782,6 +16007,26 @@ "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" }, + "node_modules/tsconfck": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.2.tgz", + "integrity": "sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -16433,6 +16678,61 @@ "node": ">=4" } }, + "node_modules/vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vite-node": { "version": "0.28.5", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz", @@ -16927,6 +17227,429 @@ } } }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.1" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/void-elements": { "version": "3.1.0", "license": "MIT", @@ -18711,6 +19434,13 @@ "resolved": "https://registry.npmjs.org/@epic-web/cachified/-/cachified-5.1.2.tgz", "integrity": "sha512-8Q1J/jF0bOKUN+XPTSUo+z34WJHMBLkuDv+HkPPS9ufs+cHvInWrLOLi3qIljhe03Xq777pwEDBKnMafetnPhA==" }, + "@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "dev": true, + "optional": true + }, "@esbuild/android-arm": { "version": "0.17.6", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.6.tgz", @@ -20267,6 +20997,97 @@ "web-streams-polyfill": "^3.1.1" } }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "dev": true, + "optional": true + }, "@smithy/abort-controller": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.2.tgz", @@ -21795,9 +22616,9 @@ } }, "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==" }, "acorn-import-assertions": { "version": "1.9.0", @@ -24114,6 +24935,12 @@ "version": "0.1.4", "dev": true }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "gopd": { "version": "1.0.1", "requires": { @@ -26377,9 +27204,9 @@ "dev": true }, "postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "requires": { "nanoid": "^3.3.7", @@ -27121,6 +27948,29 @@ "resolved": "https://registry.npmjs.org/ringbufferjs/-/ringbufferjs-2.0.0.tgz", "integrity": "sha512-GCOqTzUsTHF7nrqcgtNGAFotXztLgiePpIDpyWZ7R5I02tmfJWV+/yuJc//Hlsd8G+WzI1t/dc2y/w2imDZdog==" }, + "rollup": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, "rtl-css-js": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", @@ -28216,6 +29066,13 @@ "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==" }, + "tsconfck": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.2.tgz", + "integrity": "sha512-6lWtFjwuhS3XI4HsX4Zg0izOI3FU/AI9EGVlPEUMDIhvLPMD4wkiof0WCoDgW7qY+Dy198g4d9miAqUHWHFH6Q==", + "dev": true, + "requires": {} + }, "tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -28628,6 +29485,212 @@ "unist-util-stringify-position": "^3.0.0" } }, + "vite": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", + "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "dev": true, + "requires": { + "esbuild": "^0.19.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.35", + "rollup": "^4.2.0" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + } + } + }, "vite-node": { "version": "0.28.5", "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.28.5.tgz", @@ -28857,6 +29920,17 @@ } } }, + "vite-tsconfig-paths": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.1.tgz", + "integrity": "sha512-cfgJwcGOsIxXOLU/nELPny2/LUD/lcf1IbfyeKTv2bsupVbTH/xpFtdQlBmIP1GEK2CjjLxYhFfB+QODFAx5aw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.1" + } + }, "void-elements": { "version": "3.1.0" }, diff --git a/package.json b/package.json index e1094ae92..10d1facd0 100644 --- a/package.json +++ b/package.json @@ -3,44 +3,45 @@ "version": "3.0.0", "private": true, "sideEffects": false, + "type": "module", "scripts": { "deploy": "npm ci && npm run build", - "build": "remix build", - "dev": "remix dev", + "build": "remix vite:build", + "dev": "remix vite:dev", "dev:prod": "cross-env DB_PATH=db-prod.sqlite3 remix dev", "dev:ci": "cp .env.example .env && npm run migrate up && npm run dev", - "start": "npm run migrate up && remix-serve ./build/index.js", - "start:nr": "npm run migrate up && NODE_OPTIONS='-r dotenv/config -r newrelic' remix-serve ./build/index.js", + "start": "npm run migrate up && remix-serve ./build/server/index.js", + "start:nr": "npm run migrate up && NODE_OPTIONS='-r dotenv/config -r newrelic' remix-serve ./build/server/index.js", "migrate": "ley", "migrate:reset": "node scripts/delete-db-files.mjs && npm run migrate up", - "add-badge": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/add-badge.ts", - "rename-badge": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/rename-badge.ts", - "add-badge-winners": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/add-badge-winners.ts", - "create-gear-json": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/create-gear-json.ts", - "create-object-dmg-json": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/create-object-dmg-json.ts", - "create-misc-json": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/create-misc-json.ts", - "create-analyzer-json": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/create-analyzer-json.ts", - "check-translation-jsons": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/check-translation-jsons.ts", - "check-translation-jsons:no-write": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/check-translation-jsons.ts --no-write", - "replace-img-names": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/replace-img-names.ts", - "replace-weapon-names": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/replace-weapon-names.ts", - "placements": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/placements/index.ts", - "hex-to-filter": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/hex-to-filter.ts", - "sync-xp-badges": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/sync-xp-badges.ts", - "delete-user": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/delete-user.ts", - "ban-user": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/ban-user.ts", - "unban-user": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/unban-user.ts", - "delete-skill": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/delete-skill.ts", - "skip-plus": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/skip-plus.ts", - "unskip-plus": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/unskip-plus.ts", - "season-initial-powers": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/season-initial-powers.ts", - "map-popularity": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/map-popularity.ts", - "map-popularity-q": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/map-popularity-q.ts", - "remove-vodder": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/remove-vodder.ts", - "update-fc": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/update-fc.ts", - "transfer-weapon-pools": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/transfer-weapon-pools.ts", - "reopen-tournament": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/reopen-tournament.ts", - "refresh-prod-db": "node --experimental-specifier-resolution=node -r @swc-node/register -r tsconfig-paths/register scripts/refresh-prod-db.ts && cross-env DB_PATH=db-prod.sqlite3 npm run migrate up", + "add-badge": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/add-badge.ts", + "rename-badge": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/rename-badge.ts", + "add-badge-winners": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/add-badge-winners.ts", + "create-gear-json": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/create-gear-json.ts", + "create-object-dmg-json": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/create-object-dmg-json.ts", + "create-misc-json": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/create-misc-json.ts", + "create-analyzer-json": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/create-analyzer-json.ts", + "check-translation-jsons": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/check-translation-jsons.ts", + "check-translation-jsons:no-write": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/check-translation-jsons.mts --no-write", + "replace-img-names": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/replace-img-names.ts", + "replace-weapon-names": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/replace-weapon-names.ts", + "placements": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/placements/index.ts", + "hex-to-filter": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/hex-to-filter.ts", + "sync-xp-badges": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/sync-xp-badges.ts", + "delete-user": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/delete-user.ts", + "ban-user": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/ban-user.ts", + "unban-user": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/unban-user.ts", + "delete-skill": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/delete-skill.ts", + "skip-plus": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/skip-plus.ts", + "unskip-plus": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/unskip-plus.ts", + "season-initial-powers": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/season-initial-powers.ts", + "map-popularity": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/map-popularity.ts", + "map-popularity-q": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/map-popularity-q.ts", + "remove-vodder": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/remove-vodder.ts", + "update-fc": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/update-fc.ts", + "transfer-weapon-pools": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/transfer-weapon-pools.ts", + "reopen-tournament": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/reopen-tournament.ts", + "refresh-prod-db": "node --experimental-specifier-resolution=node --import @swc-node/register/esm-register -r tsconfig-paths/register scripts/refresh-prod-db.ts && cross-env DB_PATH=db-prod.sqlite3 npm run migrate up", "lint:ts": "eslint . --ext .ts,.tsx", "lint:css": "stylelint \"app/styles/**/*.css\"", "prettier:check": "prettier --check . --log-level warn", @@ -139,6 +140,8 @@ "tsconfig-paths": "^4.2.0", "tsm": "^2.3.0", "typescript": "^5.3.3", - "uvu": "^0.5.6" + "uvu": "^0.5.6", + "vite": "^5.1.4", + "vite-tsconfig-paths": "^4.3.1" } } diff --git a/playwright.config.ts b/playwright.config.ts index ea2df4cd0..95ed3aa82 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -36,7 +36,7 @@ const config: PlaywrightTestConfig = { /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ actionTimeout: 0, /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: "http://localhost:5800", + baseURL: "http://localhost:5173", /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: "retain-on-failure", @@ -102,9 +102,12 @@ const config: PlaywrightTestConfig = { /* Run your local dev server before starting the tests */ webServer: { command: "npm run dev:ci", - port: 5800, + port: 5173, reuseExistingServer: !process.env["CI"], }, + build: { + external: ["**/*.json"], + }, }; export default config; diff --git a/remix.config.js b/remix.config.js deleted file mode 100644 index 73ce39c0a..000000000 --- a/remix.config.js +++ /dev/null @@ -1,270 +0,0 @@ -/** - * @type {import('@remix-run/dev').AppConfig} - */ -module.exports = { - ignoredRouteFiles: ["**/.*", "**/*.json", "**/components/*"], - cacheDirectory: process.env.NODE_ENV === "test" ? ".cache-test" : undefined, - routes: async (defineRoutes) => { - return defineRoutes((route) => { - route("/", "features/front-page/routes/index.tsx"); - - route("/u", "features/user-search/routes/u.tsx"); - - route( - "/u/:identifier", - "features/user-page/routes/u.$identifier.tsx", - () => { - route( - "/u/:identifier", - "features/user-page/routes/u.$identifier.index.tsx", - ); - route( - "/u/:identifier/art", - "features/user-page/routes/u.$identifier.art.tsx", - ); - route( - "/u/:identifier/edit", - "features/user-page/routes/u.$identifier.edit.tsx", - ); - route( - "/u/:identifier/seasons", - "features/user-page/routes/u.$identifier.seasons.tsx", - ); - route( - "/u/:identifier/vods", - "features/user-page/routes/u.$identifier.vods.tsx", - ); - - route( - "/u/:identifier/builds", - "features/user-page/routes/u.$identifier.builds.tsx", - ); - route( - "/u/:identifier/builds/new", - "features/user-page/routes/u.$identifier.builds.new.tsx", - ); - - route( - "/u/:identifier/results", - "features/user-page/routes/u.$identifier.results.tsx", - ); - route( - "/u/:identifier/results/highlights", - "features/user-page/routes/u.$identifier.results.highlights.tsx", - ); - }, - ); - - route("/badges", "features/badges/routes/badges.tsx", () => { - route("/badges/:id", "features/badges/routes/badges.$id.tsx", () => { - route( - "/badges/:id/edit", - "features/badges/routes/badges.$id.edit.tsx", - ); - }); - }); - - route("/calendar", "features/calendar/routes/calendar.tsx"); - route("/calendar/new", "features/calendar/routes/calendar.new.tsx"); - route("/calendar/:id", "features/calendar/routes/calendar.$id.tsx"); - route( - "/calendar/:id/report-winners", - "features/calendar/routes/calendar.$id.report-winners.tsx", - ); - route( - "/calendar/map-pool-events", - "features/calendar/routes/map-pool-events.ts", - ); - - route("/maps", "features/map-list-generator/routes/maps.tsx"); - - route("/upload", "features/img-upload/routes/upload.tsx"); - route("/upload/admin", "features/img-upload/routes/upload.admin.tsx"); - route("/plans", "features/map-planner/routes/plans.tsx"); - route("/analyzer", "features/build-analyzer/routes/analyzer.tsx"); - route( - "/object-damage-calculator", - "features/object-damage-calculator/routes/object-damage-calculator.tsx", - ); - route("/to/:id", "features/tournament/routes/to.$id.tsx", () => { - route("/to/:id", "features/tournament/routes/to.$id.index.tsx"); - route( - "/to/:id/register", - "features/tournament/routes/to.$id.register.tsx", - ); - route("/to/:id/teams", "features/tournament/routes/to.$id.teams.tsx"); - route( - "/to/:id/teams/:tid", - "features/tournament/routes/to.$id.teams.$tid.tsx", - ); - route("/to/:id/join", "features/tournament/routes/to.$id.join.tsx"); - route("/to/:id/admin", "features/tournament/routes/to.$id.admin.tsx"); - route("/to/:id/seeds", "features/tournament/routes/to.$id.seeds.tsx"); - route("/to/:id/maps", "features/tournament/routes/to.$id.maps.tsx"); - route( - "/to/:id/streams", - "features/tournament/routes/to.$id.streams.tsx", - ); - - route( - "/to/:id/subs", - "features/tournament-subs/routes/to.$id.subs.tsx", - ); - route( - "/to/:id/subs/new", - "features/tournament-subs/routes/to.$id.subs.new.tsx", - ); - - route( - "/to/:id/brackets", - "features/tournament-bracket/routes/to.$id.brackets.tsx", - ); - route( - "/to/:id/brackets/subscribe", - "features/tournament-bracket/routes/to.$id.brackets.subscribe.tsx", - ); - route( - "/to/:id/matches/:mid", - "features/tournament-bracket/routes/to.$id.matches.$mid.tsx", - ); - route( - "/to/:id/matches/:mid/subscribe", - "features/tournament-bracket/routes/to.$id.matches.$mid.subscribe.tsx", - ); - }); - - route("/faq", "features/info/routes/faq.tsx"); - route("/contributions", "features/info/routes/contributions.tsx"); - route("/privacy-policy", "features/info/routes/privacy-policy.tsx"); - route("/support", "features/info/routes/support.tsx"); - - route("/t", "features/team/routes/t.tsx"); - route("/t/:customUrl", "features/team/routes/t.$customUrl.tsx"); - route("/t/:customUrl/edit", "features/team/routes/t.$customUrl.edit.tsx"); - route( - "/t/:customUrl/roster", - "features/team/routes/t.$customUrl.roster.tsx", - ); - route("/t/:customUrl/join", "features/team/routes/t.$customUrl.join.tsx"); - - route("/vods", "features/vods/routes/vods.tsx"); - route("/vods/new", "features/vods/routes/vods.new.tsx"); - route("/vods/:id", "features/vods/routes/vods.$id.tsx"); - - route("/builds", "features/builds/routes/builds.tsx"); - route("/builds/:slug", "features/builds/routes/builds.$slug.tsx"); - route( - "/builds/:slug/stats", - "features/build-stats/routes/builds.$slug.stats.tsx", - ); - route( - "/builds/:slug/popular", - "features/build-stats/routes/builds.$slug.popular.tsx", - ); - - route("/xsearch", "features/top-search/routes/xsearch.tsx"); - route( - "/xsearch/player/:id", - "features/top-search/routes/xsearch.player.$id.tsx", - ); - - route("/leaderboards", "features/leaderboards/routes/leaderboards.tsx"); - - route("/links", "features/links/routes/links.tsx"); - - route("/art", "features/art/routes/art.tsx"); - route("/art/new", "features/art/routes/art.new.tsx"); - - route("/play", "features/sendouq/routes/play.tsx"); - route("/q", "features/sendouq/routes/q.tsx"); - route("/q/rules", "features/sendouq/routes/q.rules.tsx"); - route("/q/looking", "features/sendouq/routes/q.looking.tsx"); - route("/q/preparing", "features/sendouq/routes/q.preparing.tsx"); - route("/q/match/:id", "features/sendouq/routes/q.match.$id.tsx"); - - route("/trusters", "features/sendouq/routes/trusters.ts"); - - route("/q/settings", "features/sendouq-settings/routes/q.settings.tsx"); - - route("/q/streams", "features/sendouq-streams/routes/q.streams.tsx"); - - route("/weapon-usage", "features/sendouq/routes/weapon-usage.tsx"); - - route("/tiers", "features/sendouq/routes/tiers.tsx"); - - route("/admin", "features/admin/routes/admin.tsx"); - - route("/a", "features/articles/routes/a.tsx"); - route("/a/:slug", "features/articles/routes/a.$slug.tsx"); - - route("/plus", "features/plus-suggestions/routes/plus.tsx", () => { - route("/plus", "features/plus-suggestions/routes/plus.index.tsx"); - - route( - "/plus/suggestions", - "features/plus-suggestions/routes/plus.suggestions.tsx", - () => { - route( - "/plus/suggestions/new", - "features/plus-suggestions/routes/plus.suggestions.new.tsx", - ); - route( - "/plus/suggestions/comment/:tier/:userId", - "features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx", - ); - }, - ); - - route("/plus/list", "features/plus-voting/routes/plus.list.ts"); - route("/plus/voting", "features/plus-voting/routes/plus.voting.tsx"); - route( - "/plus/voting/results", - "features/plus-voting/routes/plus.voting.results.tsx", - ); - }); - - route("/patrons", "features/api-private/routes/patrons.tsx"); - route("/seed", "features/api-private/routes/seed.tsx"); - route("/users", "features/api-private/routes/users.tsx"); - - route( - "/api/user/:identifier", - "features/api-public/routes/user.$identifier.ts", - ); - route( - "/api/tournament/:id", - "features/api-public/routes/tournament.$id.ts", - ); - route( - "/api/tournament/:id/teams", - "features/api-public/routes/tournament.$id.teams.ts", - ); - route( - "/api/tournament-match/:id", - "features/api-public/routes/tournament-match.$id.ts", - ); - - route("/theme", "features/theme/routes/theme.ts"); - - route("/auth", "features/auth/routes/auth.tsx"); - route("/auth/callback", "features/auth/routes/auth.callback.tsx"); - route("/auth/create-link", "features/auth/routes/auth.create-link.tsx"); - route("/auth/login", "features/auth/routes/auth.login.tsx"); - route("/auth/logout", "features/auth/routes/auth.logout.tsx"); - - route("/auth/impersonate", "features/auth/routes/auth.impersonate.tsx"); - route( - "/auth/impersonate/stop", - "features/auth/routes/auth.impersonate.stop.tsx", - ); - }); - }, - serverModuleFormat: "cjs", - serverDependenciesToBundle: [ - "react-charts", - "d3-time-format", - "nanoid", - /^remix-i18next.*/, - /^remix-utils.*/, - ], -}; diff --git a/scripts/check-translation-jsons.ts b/scripts/check-translation-jsons.ts index c1c735ef8..083fbb045 100644 --- a/scripts/check-translation-jsons.ts +++ b/scripts/check-translation-jsons.ts @@ -1,7 +1,11 @@ import fs from "fs"; -import path from "path"; import prettier from "prettier"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const NO_WRITE_KEY = "--no-write"; const dontWrite = process.argv.includes(NO_WRITE_KEY); diff --git a/scripts/create-analyzer-json.ts b/scripts/create-analyzer-json.ts index 60ad45c69..23204cbce 100644 --- a/scripts/create-analyzer-json.ts +++ b/scripts/create-analyzer-json.ts @@ -15,7 +15,6 @@ import subWeapons from "./dicts/WeaponInfoSub.json"; import specialWeapons from "./dicts/WeaponInfoSpecial.json"; import playersParams from "./dicts/SplPlayer.game__GameParameterTable.json"; import fs from "node:fs"; -import path from "node:path"; import invariant from "tiny-invariant"; import type { MainWeaponParams, SubWeaponParams } from "~/modules/analyzer"; import type { ParamsJson } from "~/modules/analyzer/types"; @@ -26,6 +25,11 @@ import { translationJsonFolderName, } from "./utils"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const CURRENT_SEASON = 6; type MainWeapon = (typeof weapons)[number]; diff --git a/scripts/create-gear-json.ts b/scripts/create-gear-json.ts index 4053a11be..be42b8ff2 100644 --- a/scripts/create-gear-json.ts +++ b/scripts/create-gear-json.ts @@ -6,7 +6,6 @@ import clothes from "./dicts/GearInfoClothes.json"; import shoes from "./dicts/GearInfoShoes.json"; import fs from "node:fs"; -import path from "node:path"; import invariant from "tiny-invariant"; import { LANG_JSONS_TO_CREATE, @@ -14,6 +13,11 @@ import { translationJsonFolderName, } from "./utils"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const CURRENT_SEASON = 6; const OUTPUT_DIR_PATH = path.join(__dirname, "output"); diff --git a/scripts/create-misc-json.ts b/scripts/create-misc-json.ts index c44c2d429..fabc2883d 100644 --- a/scripts/create-misc-json.ts +++ b/scripts/create-misc-json.ts @@ -7,10 +7,14 @@ import { translationJsonFolderName, } from "./utils"; import fs from "fs"; -import path from "path"; import invariant from "tiny-invariant"; import { abilitiesShort } from "~/modules/in-game-lists"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + // ⚠️ keep same order as https://github.com/IPLSplatoon/IPLMapGen2/blob/main/data.js const stages = [ "Scorch Gorge", diff --git a/scripts/create-object-dmg-json.ts b/scripts/create-object-dmg-json.ts index 079d41db2..036f9c00b 100644 --- a/scripts/create-object-dmg-json.ts +++ b/scripts/create-object-dmg-json.ts @@ -10,7 +10,6 @@ import weapons from "./dicts/WeaponInfoMain.json"; import subWeapons from "./dicts/WeaponInfoSub.json"; import specialWeapons from "./dicts/WeaponInfoSpecial.json"; import fs from "node:fs"; -import path from "node:path"; import { mainWeaponIds, specialWeaponIds, @@ -18,6 +17,11 @@ import { } from "~/modules/in-game-lists"; import { DAMAGE_RECEIVERS } from "~/features/object-damage-calculator/calculator-constants"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const OUTPUT_DIR_PATH = path.join(__dirname, "output"); const weaponParamsToWeaponIds = ( diff --git a/scripts/placements/index.ts b/scripts/placements/index.ts index 6d2e0541e..fdac57f49 100644 --- a/scripts/placements/index.ts +++ b/scripts/placements/index.ts @@ -6,7 +6,7 @@ import { sql } from "~/db/sql"; import type { XRankPlacement } from "~/db/types"; import { type MainWeaponId, mainWeaponIds } from "~/modules/in-game-lists"; import { xRankSchema } from "./schemas"; -import { syncXPBadges } from "~/features/badges"; +import { syncXPBadges } from "~/features/badges/queries/syncXPBadges.server"; const rawJsonNumber = process.argv[2]?.trim(); invariant(rawJsonNumber, "jsonNumber is required (argument 1)"); diff --git a/scripts/refresh-prod-db.ts b/scripts/refresh-prod-db.ts index dab874755..f4f6bc600 100644 --- a/scripts/refresh-prod-db.ts +++ b/scripts/refresh-prod-db.ts @@ -1,6 +1,10 @@ -import path from "node:path"; import fs from "node:fs"; +import path from "path"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + function main() { const dbProdPath = path.join(__dirname, "..", "db-prod.sqlite3"); const dbProdShmPath = path.join(__dirname, "..", "db-prod.sqlite3-shm"); diff --git a/scripts/replace-img-names.ts b/scripts/replace-img-names.ts index 8af1ae4e7..a2ce64bbf 100644 --- a/scripts/replace-img-names.ts +++ b/scripts/replace-img-names.ts @@ -3,6 +3,10 @@ import fs from "node:fs"; import path from "node:path"; import invariant from "tiny-invariant"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const GEAR_IMAGES_DIR_PATH = path.join( __dirname, "..", diff --git a/scripts/replace-weapon-names.ts b/scripts/replace-weapon-names.ts index b43256903..e95caf960 100644 --- a/scripts/replace-weapon-names.ts +++ b/scripts/replace-weapon-names.ts @@ -6,6 +6,10 @@ import path from "node:path"; import invariant from "tiny-invariant"; import weapons from "./dicts/WeaponInfoMain.json"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const DIR_PATH_1 = path.join( __dirname, "..", diff --git a/scripts/sync-xp-badges.ts b/scripts/sync-xp-badges.ts index ac349ec1b..28941eb1d 100644 --- a/scripts/sync-xp-badges.ts +++ b/scripts/sync-xp-badges.ts @@ -1,6 +1,6 @@ /* eslint-disable no-console */ import "dotenv/config"; -import { syncXPBadges } from "~/features/badges"; +import { syncXPBadges } from "~/features/badges/queries/syncXPBadges.server"; syncXPBadges(); diff --git a/scripts/utils.ts b/scripts/utils.ts index f1e5ab9e1..40ada5bb8 100644 --- a/scripts/utils.ts +++ b/scripts/utils.ts @@ -5,6 +5,10 @@ import path from "node:path"; import fs from "node:fs"; import type euEn from "./dicts/langs/EUen.json"; +import { fileURLToPath } from "url"; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + const LANG_DICTS_PATH = path.join(__dirname, "dicts", "langs"); export const LANG_JSONS_TO_CREATE = [ diff --git a/tsconfig.json b/tsconfig.json index bfa556a3c..43af8dbb1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "include": ["./types/remix.env.d.ts", "**/*.ts", "**/*.tsx"], + "include": ["./types/env.d.ts", "**/*.ts", "**/*.tsx"], "compilerOptions": { "lib": ["DOM", "DOM.Iterable", "ES2019"], "module": "ESNext", diff --git a/types/remix.env.d.ts b/types/env.d.ts similarity index 54% rename from types/remix.env.d.ts rename to types/env.d.ts index 72e2affe3..870104310 100644 --- a/types/remix.env.d.ts +++ b/types/env.d.ts @@ -1,2 +1,2 @@ -/// +/// /// diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 000000000..2ec156d51 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,308 @@ +import { vitePlugin as remix } from "@remix-run/dev"; +import { defineConfig } from "vite"; +import { installGlobals } from "@remix-run/node"; +import tsconfigPaths from "vite-tsconfig-paths"; + +installGlobals(); + +export default defineConfig({ + ssr: { + noExternal: ["react-charts", "react-use"], + }, + plugins: [ + remix({ + ignoredRouteFiles: ["**/.*", "**/*.json", "**/components/*"], + serverModuleFormat: "cjs", + routes: (defineRoutes) => { + return defineRoutes((route) => { + route("/", "features/front-page/routes/index.tsx"); + + route("/u", "features/user-search/routes/u.tsx"); + + route( + "/u/:identifier", + "features/user-page/routes/u.$identifier.tsx", + () => { + route( + "/u/:identifier", + "features/user-page/routes/u.$identifier.index.tsx", + ); + route( + "/u/:identifier/art", + "features/user-page/routes/u.$identifier.art.tsx", + ); + route( + "/u/:identifier/edit", + "features/user-page/routes/u.$identifier.edit.tsx", + ); + route( + "/u/:identifier/seasons", + "features/user-page/routes/u.$identifier.seasons.tsx", + ); + route( + "/u/:identifier/vods", + "features/user-page/routes/u.$identifier.vods.tsx", + ); + + route( + "/u/:identifier/builds", + "features/user-page/routes/u.$identifier.builds.tsx", + ); + route( + "/u/:identifier/builds/new", + "features/user-page/routes/u.$identifier.builds.new.tsx", + ); + + route( + "/u/:identifier/results", + "features/user-page/routes/u.$identifier.results.tsx", + ); + route( + "/u/:identifier/results/highlights", + "features/user-page/routes/u.$identifier.results.highlights.tsx", + ); + }, + ); + + route("/badges", "features/badges/routes/badges.tsx", () => { + route( + "/badges/:id", + "features/badges/routes/badges.$id.tsx", + () => { + route( + "/badges/:id/edit", + "features/badges/routes/badges.$id.edit.tsx", + ); + }, + ); + }); + + route("/calendar", "features/calendar/routes/calendar.tsx"); + route("/calendar/new", "features/calendar/routes/calendar.new.tsx"); + route("/calendar/:id", "features/calendar/routes/calendar.$id.tsx"); + route( + "/calendar/:id/report-winners", + "features/calendar/routes/calendar.$id.report-winners.tsx", + ); + route( + "/calendar/map-pool-events", + "features/calendar/routes/map-pool-events.ts", + ); + + route("/maps", "features/map-list-generator/routes/maps.tsx"); + + route("/upload", "features/img-upload/routes/upload.tsx"); + route("/upload/admin", "features/img-upload/routes/upload.admin.tsx"); + route("/plans", "features/map-planner/routes/plans.tsx"); + route("/analyzer", "features/build-analyzer/routes/analyzer.tsx"); + route( + "/object-damage-calculator", + "features/object-damage-calculator/routes/object-damage-calculator.tsx", + ); + route("/to/:id", "features/tournament/routes/to.$id.tsx", () => { + route("/to/:id", "features/tournament/routes/to.$id.index.tsx"); + route( + "/to/:id/register", + "features/tournament/routes/to.$id.register.tsx", + ); + route( + "/to/:id/teams", + "features/tournament/routes/to.$id.teams.tsx", + ); + route( + "/to/:id/teams/:tid", + "features/tournament/routes/to.$id.teams.$tid.tsx", + ); + route("/to/:id/join", "features/tournament/routes/to.$id.join.tsx"); + route( + "/to/:id/admin", + "features/tournament/routes/to.$id.admin.tsx", + ); + route( + "/to/:id/seeds", + "features/tournament/routes/to.$id.seeds.tsx", + ); + route("/to/:id/maps", "features/tournament/routes/to.$id.maps.tsx"); + route( + "/to/:id/streams", + "features/tournament/routes/to.$id.streams.tsx", + ); + + route( + "/to/:id/subs", + "features/tournament-subs/routes/to.$id.subs.tsx", + ); + route( + "/to/:id/subs/new", + "features/tournament-subs/routes/to.$id.subs.new.tsx", + ); + + route( + "/to/:id/brackets", + "features/tournament-bracket/routes/to.$id.brackets.tsx", + ); + route( + "/to/:id/brackets/subscribe", + "features/tournament-bracket/routes/to.$id.brackets.subscribe.tsx", + ); + route( + "/to/:id/matches/:mid", + "features/tournament-bracket/routes/to.$id.matches.$mid.tsx", + ); + route( + "/to/:id/matches/:mid/subscribe", + "features/tournament-bracket/routes/to.$id.matches.$mid.subscribe.tsx", + ); + }); + + route("/faq", "features/info/routes/faq.tsx"); + route("/contributions", "features/info/routes/contributions.tsx"); + route("/privacy-policy", "features/info/routes/privacy-policy.tsx"); + route("/support", "features/info/routes/support.tsx"); + + route("/t", "features/team/routes/t.tsx"); + route("/t/:customUrl", "features/team/routes/t.$customUrl.tsx"); + route( + "/t/:customUrl/edit", + "features/team/routes/t.$customUrl.edit.tsx", + ); + route( + "/t/:customUrl/roster", + "features/team/routes/t.$customUrl.roster.tsx", + ); + route( + "/t/:customUrl/join", + "features/team/routes/t.$customUrl.join.tsx", + ); + + route("/vods", "features/vods/routes/vods.tsx"); + route("/vods/new", "features/vods/routes/vods.new.tsx"); + route("/vods/:id", "features/vods/routes/vods.$id.tsx"); + + route("/builds", "features/builds/routes/builds.tsx"); + route("/builds/:slug", "features/builds/routes/builds.$slug.tsx"); + route( + "/builds/:slug/stats", + "features/build-stats/routes/builds.$slug.stats.tsx", + ); + route( + "/builds/:slug/popular", + "features/build-stats/routes/builds.$slug.popular.tsx", + ); + + route("/xsearch", "features/top-search/routes/xsearch.tsx"); + route( + "/xsearch/player/:id", + "features/top-search/routes/xsearch.player.$id.tsx", + ); + + route( + "/leaderboards", + "features/leaderboards/routes/leaderboards.tsx", + ); + + route("/links", "features/links/routes/links.tsx"); + + route("/art", "features/art/routes/art.tsx"); + route("/art/new", "features/art/routes/art.new.tsx"); + + route("/play", "features/sendouq/routes/play.tsx"); + route("/q", "features/sendouq/routes/q.tsx"); + route("/q/rules", "features/sendouq/routes/q.rules.tsx"); + route("/q/looking", "features/sendouq/routes/q.looking.tsx"); + route("/q/preparing", "features/sendouq/routes/q.preparing.tsx"); + route("/q/match/:id", "features/sendouq/routes/q.match.$id.tsx"); + + route("/trusters", "features/sendouq/routes/trusters.ts"); + + route( + "/q/settings", + "features/sendouq-settings/routes/q.settings.tsx", + ); + + route("/q/streams", "features/sendouq-streams/routes/q.streams.tsx"); + + route("/weapon-usage", "features/sendouq/routes/weapon-usage.tsx"); + + route("/tiers", "features/sendouq/routes/tiers.tsx"); + + route("/admin", "features/admin/routes/admin.tsx"); + + route("/a", "features/articles/routes/a.tsx"); + route("/a/:slug", "features/articles/routes/a.$slug.tsx"); + + route("/plus", "features/plus-suggestions/routes/plus.tsx", () => { + route("/plus", "features/plus-suggestions/routes/plus.index.tsx"); + + route( + "/plus/suggestions", + "features/plus-suggestions/routes/plus.suggestions.tsx", + () => { + route( + "/plus/suggestions/new", + "features/plus-suggestions/routes/plus.suggestions.new.tsx", + ); + route( + "/plus/suggestions/comment/:tier/:userId", + "features/plus-suggestions/routes/plus.suggestions.comment.$tier.$userId.tsx", + ); + }, + ); + + route("/plus/list", "features/plus-voting/routes/plus.list.ts"); + route( + "/plus/voting", + "features/plus-voting/routes/plus.voting.tsx", + ); + route( + "/plus/voting/results", + "features/plus-voting/routes/plus.voting.results.tsx", + ); + }); + + route("/patrons", "features/api-private/routes/patrons.tsx"); + route("/seed", "features/api-private/routes/seed.tsx"); + route("/users", "features/api-private/routes/users.tsx"); + + route( + "/api/user/:identifier", + "features/api-public/routes/user.$identifier.ts", + ); + route( + "/api/tournament/:id", + "features/api-public/routes/tournament.$id.ts", + ); + route( + "/api/tournament/:id/teams", + "features/api-public/routes/tournament.$id.teams.ts", + ); + route( + "/api/tournament-match/:id", + "features/api-public/routes/tournament-match.$id.ts", + ); + + route("/theme", "features/theme/routes/theme.ts"); + + route("/auth", "features/auth/routes/auth.tsx"); + route("/auth/callback", "features/auth/routes/auth.callback.tsx"); + route( + "/auth/create-link", + "features/auth/routes/auth.create-link.tsx", + ); + route("/auth/login", "features/auth/routes/auth.login.tsx"); + route("/auth/logout", "features/auth/routes/auth.logout.tsx"); + + route( + "/auth/impersonate", + "features/auth/routes/auth.impersonate.tsx", + ); + route( + "/auth/impersonate/stop", + "features/auth/routes/auth.impersonate.stop.tsx", + ); + }); + }, + }), + tsconfigPaths(), + ], +});