diff --git a/application/client/babel.config.js b/application/client/babel.config.js
index c3c574591a..bd221f6b52 100644
--- a/application/client/babel.config.js
+++ b/application/client/babel.config.js
@@ -4,16 +4,23 @@ module.exports = {
[
"@babel/preset-env",
{
- targets: "ie 11",
- corejs: "3",
+ targets: {"chrome": "145"},
+ // corejs: "3",
modules: "commonjs",
useBuiltIns: false,
},
+ // {
+ // targets: "ie 11",
+ // corejs: "3",
+ // modules: "commonjs",
+ // useBuiltIns: false,
+ // },
],
[
"@babel/preset-react",
{
- development: true,
+ development: false,
+ // development: true,
runtime: "automatic",
},
],
diff --git a/application/client/package.json b/application/client/package.json
index 9f8e80a6a8..f7edeaee5f 100644
--- a/application/client/package.json
+++ b/application/client/package.json
@@ -5,7 +5,7 @@
"license": "MPL-2.0",
"author": "CyberAgent, Inc.",
"scripts": {
- "build": "NODE_ENV=development webpack",
+ "build": "NODE_ENV=production webpack",
"typecheck": "tsc"
},
"dependencies": {
@@ -20,6 +20,7 @@
"classnames": "2.5.1",
"common-tags": "1.8.2",
"core-js": "3.45.1",
+ "dayjs": "1.11.20",
"encoding-japanese": "2.2.0",
"fast-average-color": "9.5.0",
"gifler": "github:themadcreator/gifler#v0.3.0",
diff --git a/application/client/src/auth/validation.ts b/application/client/src/auth/validation.ts
index 2a83bbfb15..72fe70b0c4 100644
--- a/application/client/src/auth/validation.ts
+++ b/application/client/src/auth/validation.ts
@@ -13,7 +13,10 @@ export const validate = (values: AuthFormData): FormErrors => {
errors.name = "名前を入力してください";
}
- if (/^(?:[^\P{Letter}&&\P{Number}]*){16,}$/v.test(normalizedPassword)) {
+ // if (/^(?:[^\P{Letter}&&\P{Number}]*){16,}$/v.test(normalizedPassword)) {
+ // errors.password = "パスワードには記号を含める必要があります";
+ // }
+ if (/^(?:[^\P{Letter}&&\P{Number}]*)$/v.test(normalizedPassword)) {
errors.password = "パスワードには記号を含める必要があります";
}
if (normalizedPassword.length === 0) {
diff --git a/application/client/src/components/application/NavigationItem.tsx b/application/client/src/components/application/NavigationItem.tsx
index 57e64b004a..2a33157c0e 100644
--- a/application/client/src/components/application/NavigationItem.tsx
+++ b/application/client/src/components/application/NavigationItem.tsx
@@ -1,7 +1,7 @@
import classNames from "classnames";
-import { useLocation } from "react-router";
+import { Link, useLocation } from "react-router";
-import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
+// import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
interface Props {
badge?: React.ReactNode;
diff --git a/application/client/src/components/auth_modal/AuthModalPage.tsx b/application/client/src/components/auth_modal/AuthModalPage.tsx
index 08996f9afd..74300ef204 100644
--- a/application/client/src/components/auth_modal/AuthModalPage.tsx
+++ b/application/client/src/components/auth_modal/AuthModalPage.tsx
@@ -4,9 +4,10 @@ import { Field, formValueSelector, InjectedFormProps, reduxForm } from "redux-fo
import { AuthFormData } from "@web-speed-hackathon-2026/client/src/auth/types";
import { validate } from "@web-speed-hackathon-2026/client/src/auth/validation";
import { FormInputField } from "@web-speed-hackathon-2026/client/src/components/foundation/FormInputField";
-import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
+// import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
import { ModalErrorMessage } from "@web-speed-hackathon-2026/client/src/components/modal/ModalErrorMessage";
import { ModalSubmitButton } from "@web-speed-hackathon-2026/client/src/components/modal/ModalSubmitButton";
+import { Link } from "react-router";
interface Props {
onRequestCloseModal: () => void;
diff --git a/application/client/src/components/direct_message/DirectMessageListPage.tsx b/application/client/src/components/direct_message/DirectMessageListPage.tsx
index 5a373e918e..62b199012f 100644
--- a/application/client/src/components/direct_message/DirectMessageListPage.tsx
+++ b/application/client/src/components/direct_message/DirectMessageListPage.tsx
@@ -1,12 +1,15 @@
-import moment from "moment";
-import { useCallback, useEffect, useState } from "react";
+// import moment from "moment";
+import 'dayjs/locale/ja';
+import dayjs, { locale, extend } from 'dayjs';
+import relativeTime from 'dayjs/plugin/relativeTime';import { useCallback, useEffect, useState } from "react";
import { Button } from "@web-speed-hackathon-2026/client/src/components/foundation/Button";
import { FontAwesomeIcon } from "@web-speed-hackathon-2026/client/src/components/foundation/FontAwesomeIcon";
-import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
+// import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
import { useWs } from "@web-speed-hackathon-2026/client/src/hooks/use_ws";
import { fetchJSON } from "@web-speed-hackathon-2026/client/src/utils/fetchers";
import { getProfileImagePath } from "@web-speed-hackathon-2026/client/src/utils/get_path";
+import { Link } from 'react-router';
interface Props {
activeUser: Models.User;
@@ -45,6 +48,9 @@ export const DirectMessageListPage = ({ activeUser, newDmModalId }: Props) => {
return null;
}
+ locale('ja');
+ extend(relativeTime);
+
return (
@@ -100,7 +106,8 @@ export const DirectMessageListPage = ({ activeUser, newDmModalId }: Props) => {
className="text-cax-text-subtle text-xs"
dateTime={lastMessage.createdAt}
>
- {moment(lastMessage.createdAt).locale("ja").fromNow()}
+ {/* {moment(lastMessage.createdAt).locale("ja").fromNow()} */}
+ {dayjs(lastMessage.createdAt).locale("ja").fromNow()}
)}
diff --git a/application/client/src/components/direct_message/DirectMessagePage.tsx b/application/client/src/components/direct_message/DirectMessagePage.tsx
index 098c7d2894..355b89c02c 100644
--- a/application/client/src/components/direct_message/DirectMessagePage.tsx
+++ b/application/client/src/components/direct_message/DirectMessagePage.tsx
@@ -1,5 +1,5 @@
import classNames from "classnames";
-import moment from "moment";
+// import moment from "moment";
import {
ChangeEvent,
useCallback,
@@ -14,6 +14,7 @@ import {
import { FontAwesomeIcon } from "@web-speed-hackathon-2026/client/src/components/foundation/FontAwesomeIcon";
import { DirectMessageFormData } from "@web-speed-hackathon-2026/client/src/direct_message/types";
import { getProfileImagePath } from "@web-speed-hackathon-2026/client/src/utils/get_path";
+import dayjs from "dayjs";
interface Props {
conversationError: Error | null;
@@ -44,13 +45,17 @@ export const DirectMessagePage = ({
const textAreaRows = Math.min((text || "").split("\n").length, 5);
const isInvalid = text.trim().length === 0;
const scrollHeightRef = useRef(0);
+ const [isTyping, setIsTyping] = useState(false);
const handleChange = useCallback(
(event: ChangeEvent) => {
setText(event.target.value);
- onTyping();
+ if(!isTyping) {
+ onTyping();
+ setIsTyping(true)
+ }
},
- [onTyping],
+ [isTyping],
);
const handleKeyDown = useCallback(
@@ -80,7 +85,8 @@ export const DirectMessagePage = ({
scrollHeightRef.current = height;
window.scrollTo(0, height);
}
- }, 1);
+ setIsTyping(false);
+ }, 5000);
return () => clearInterval(id);
}, []);
@@ -141,7 +147,8 @@ export const DirectMessagePage = ({
{isActiveUserSend && message.isRead && (
既読
diff --git a/application/client/src/components/foundation/SoundWaveSVG.tsx b/application/client/src/components/foundation/SoundWaveSVG.tsx
index d95e63164c..af129db990 100644
--- a/application/client/src/components/foundation/SoundWaveSVG.tsx
+++ b/application/client/src/components/foundation/SoundWaveSVG.tsx
@@ -1,8 +1,8 @@
-import _ from "lodash";
+import { chunk, map, mean, zip, max } from 'es-toolkit/compat';
import { useEffect, useRef, useState } from "react";
interface ParsedData {
- max: number;
+ maxNum: number;
peaks: number[];
}
@@ -12,20 +12,20 @@ async function calculate(data: ArrayBuffer): Promise
{
// 音声をデコードする
const buffer = await audioCtx.decodeAudioData(data.slice(0));
// 左の音声データの絶対値を取る
- const leftData = _.map(buffer.getChannelData(0), Math.abs);
+ const leftData = map(buffer.getChannelData(0), Math.abs);
// 右の音声データの絶対値を取る
- const rightData = _.map(buffer.getChannelData(1), Math.abs);
+ const rightData = map(buffer.getChannelData(1), Math.abs);
// 左右の音声データの平均を取る
- const normalized = _.map(_.zip(leftData, rightData), _.mean);
+ const normalized = map(zip(leftData, rightData), mean);
// 100 個の chunk に分ける
- const chunks = _.chunk(normalized, Math.ceil(normalized.length / 100));
+ const chunks = chunk(normalized, Math.ceil(normalized.length / 100));
// chunk ごとに平均を取る
- const peaks = _.map(chunks, _.mean);
+ const peaks = map(chunks, mean);
// chunk の平均の中から最大値を取る
- const max = _.max(peaks) ?? 0;
+ const maxNum = max(peaks) ?? 0;
- return { max, peaks };
+ return { maxNum, peaks };
}
interface Props {
@@ -34,21 +34,21 @@ interface Props {
export const SoundWaveSVG = ({ soundData }: Props) => {
const uniqueIdRef = useRef(Math.random().toString(16));
- const [{ max, peaks }, setPeaks] = useState({
- max: 0,
+ const [{ maxNum, peaks }, setPeaks] = useState({
+ maxNum: 0,
peaks: [],
});
useEffect(() => {
- calculate(soundData).then(({ max, peaks }) => {
- setPeaks({ max, peaks });
+ calculate(soundData).then(({ maxNum, peaks }) => {
+ setPeaks({ maxNum, peaks });
});
}, [soundData]);
return (
-
diff --git a/application/client/src/components/post/PostItem.tsx b/application/client/src/components/post/PostItem.tsx
index 5fa904c91a..e1103ae78e 100644
--- a/application/client/src/components/post/PostItem.tsx
+++ b/application/client/src/components/post/PostItem.tsx
@@ -1,11 +1,13 @@
-import moment from "moment";
+// import moment from "moment";
-import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
+// import { Link } from "@web-speed-hackathon-2026/client/src/components/foundation/Link";
import { ImageArea } from "@web-speed-hackathon-2026/client/src/components/post/ImageArea";
import { MovieArea } from "@web-speed-hackathon-2026/client/src/components/post/MovieArea";
import { SoundArea } from "@web-speed-hackathon-2026/client/src/components/post/SoundArea";
import { TranslatableText } from "@web-speed-hackathon-2026/client/src/components/post/TranslatableText";
import { getProfileImagePath } from "@web-speed-hackathon-2026/client/src/utils/get_path";
+import dayjs from "dayjs";
+import { Link } from "react-router";
interface Props {
post: Models.Post;
@@ -67,8 +69,11 @@ export const PostItem = ({ post }: Props) => {
) : null}
-
+ {/*
{moment(post.createdAt).locale("ja").format("LL")}
+ */}
+
+ {dayjs(post.createdAt).locale("ja").format('YYYY年MM月DD日')}
diff --git a/application/client/src/components/timeline/TimelineItem.tsx b/application/client/src/components/timeline/TimelineItem.tsx
index 21b88980f8..1b8757ac3e 100644
--- a/application/client/src/components/timeline/TimelineItem.tsx
+++ b/application/client/src/components/timeline/TimelineItem.tsx
@@ -1,4 +1,4 @@
-import moment from "moment";
+// import moment from "moment";
import { MouseEventHandler, useCallback } from "react";
import { Link, useNavigate } from "react-router";
@@ -7,6 +7,7 @@ import { MovieArea } from "@web-speed-hackathon-2026/client/src/components/post/
import { SoundArea } from "@web-speed-hackathon-2026/client/src/components/post/SoundArea";
import { TranslatableText } from "@web-speed-hackathon-2026/client/src/components/post/TranslatableText";
import { getProfileImagePath } from "@web-speed-hackathon-2026/client/src/utils/get_path";
+import dayjs from "dayjs";
const isClickedAnchorOrButton = (target: EventTarget | null, currentTarget: Element): boolean => {
while (target !== null && target instanceof Element) {
@@ -76,8 +77,11 @@ export const TimelineItem = ({ post }: Props) => {
-
-
+ {/*
{moment(post.createdAt).locale("ja").format("LL")}
+ */}
+
+ {dayjs(post.createdAt).locale("ja").format('YYYY年MM月DD日')}
diff --git a/application/client/src/components/user_profile/UserProfileHeader.tsx b/application/client/src/components/user_profile/UserProfileHeader.tsx
index c1c3355e19..5a8544885f 100644
--- a/application/client/src/components/user_profile/UserProfileHeader.tsx
+++ b/application/client/src/components/user_profile/UserProfileHeader.tsx
@@ -1,9 +1,10 @@
import { FastAverageColor } from "fast-average-color";
-import moment from "moment";
+// import moment from "moment";
import { ReactEventHandler, useCallback, useState } from "react";
import { FontAwesomeIcon } from "@web-speed-hackathon-2026/client/src/components/foundation/FontAwesomeIcon";
import { getProfileImagePath } from "@web-speed-hackathon-2026/client/src/utils/get_path";
+import dayjs from "dayjs";
interface Props {
user: Models.User;
@@ -43,8 +44,11 @@ export const UserProfileHeader = ({ user }: Props) => {
-
+ {/*
{moment(user.createdAt).locale("ja").format("LL")}
+ */}
+
+ {dayjs(user.createdAt).locale("ja").format('YYYY年MM月DD日')}
からサービスを利用しています
diff --git a/application/client/src/utils/bm25_search.ts b/application/client/src/utils/bm25_search.ts
index c590d12c09..46f460217f 100644
--- a/application/client/src/utils/bm25_search.ts
+++ b/application/client/src/utils/bm25_search.ts
@@ -1,6 +1,6 @@
import { BM25 } from "bayesian-bm25";
+import { zipWith } from "es-toolkit/compat";
import type { Tokenizer, IpadicFeatures } from "kuromoji";
-import _ from "lodash";
const STOP_POS = new Set(["助詞", "助動詞", "記号"]);
@@ -28,15 +28,14 @@ export function filterSuggestionsBM25(
const tokenizedCandidates = candidates.map((c) => extractTokens(tokenizer.tokenize(c)));
bm25.index(tokenizedCandidates);
- const results = _.zipWith(candidates, bm25.getScores(queryTokens), (text, score) => {
+ const results = zipWith(candidates, bm25.getScores(queryTokens), (text, score) => {
return { text, score };
});
// スコアが高い(=類似度が高い)ものが下に来るように、上位10件を取得する
- return _(results)
+ return results
.filter((s) => s.score > 0)
- .sortBy(["score"])
+ .sort((a,b) => b.score - a.score)
.slice(-10)
.map((s) => s.text)
- .value();
}
diff --git a/application/client/src/utils/convert_image.ts b/application/client/src/utils/convert_image.ts
index 9fce086d9c..66d79a2635 100644
--- a/application/client/src/utils/convert_image.ts
+++ b/application/client/src/utils/convert_image.ts
@@ -1,5 +1,5 @@
import { initializeImageMagick, ImageMagick, MagickFormat } from "@imagemagick/magick-wasm";
-import magickWasm from "@imagemagick/magick-wasm/magick.wasm?binary";
+// import magickWasm from "@imagemagick/magick-wasm/magick.wasm?binary";
import { dump, insert, ImageIFD } from "piexifjs";
interface Options {
@@ -7,7 +7,8 @@ interface Options {
}
export async function convertImage(file: File, options: Options): Promise {
- await initializeImageMagick(magickWasm);
+ await initializeImageMagick(new ImageMagick());
+ // await initializeImageMagick(magickWasm);
const byteArray = new Uint8Array(await file.arrayBuffer());
diff --git a/application/client/src/utils/convert_movie.ts b/application/client/src/utils/convert_movie.ts
index fa08b4a003..bb6f5606f8 100644
--- a/application/client/src/utils/convert_movie.ts
+++ b/application/client/src/utils/convert_movie.ts
@@ -1,4 +1,5 @@
-import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
+// import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
+import { FFmpeg } from "@ffmpeg/ffmpeg";
interface Options {
extension: string;
@@ -9,7 +10,8 @@ interface Options {
* 先頭 5 秒のみ、正方形にくり抜かれた無音動画を作成します
*/
export async function convertMovie(file: File, options: Options): Promise {
- const ffmpeg = await loadFFmpeg();
+ // const ffmpeg = await loadFFmpeg();
+ const ffmpeg = new FFmpeg();
const cropOptions = [
"'min(iw,ih)':'min(iw,ih)'",
diff --git a/application/client/src/utils/convert_sound.ts b/application/client/src/utils/convert_sound.ts
index 79cc37ab2d..f4dae04f7a 100644
--- a/application/client/src/utils/convert_sound.ts
+++ b/application/client/src/utils/convert_sound.ts
@@ -1,12 +1,14 @@
+import { FFmpeg } from "@ffmpeg/ffmpeg";
import { extractMetadataFromSound } from "@web-speed-hackathon-2026/client/src/utils/extract_metadata_from_sound";
-import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
+// import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
interface Options {
extension: string;
}
export async function convertSound(file: File, options: Options): Promise {
- const ffmpeg = await loadFFmpeg();
+ const ffmpeg = new FFmpeg();
+ // const ffmpeg = await loadFFmpeg();
const exportFile = `export.${options.extension}`;
diff --git a/application/client/src/utils/create_translator.ts b/application/client/src/utils/create_translator.ts
index ad1dabad22..f3ab1d4a64 100644
--- a/application/client/src/utils/create_translator.ts
+++ b/application/client/src/utils/create_translator.ts
@@ -1,6 +1,6 @@
import { CreateMLCEngine } from "@mlc-ai/web-llm";
import { stripIndents } from "common-tags";
-import * as JSONRepairJS from "json-repair-js";
+import { loads } from "json-repair-js";
import langs from "langs";
import invariant from "tiny-invariant";
@@ -46,7 +46,7 @@ export async function createTranslator(params: Params): Promise {
const content = reply.choices[0]!.message.content;
invariant(content, "No content in the reply from the translation engine.");
- const parsed = JSONRepairJS.loads(content);
+ const parsed = loads(content);
invariant(
parsed != null && "result" in parsed,
"The translation result is missing in the reply.",
diff --git a/application/client/src/utils/extract_metadata_from_sound.ts b/application/client/src/utils/extract_metadata_from_sound.ts
index 5e3ee41fe1..8badf2a46a 100644
--- a/application/client/src/utils/extract_metadata_from_sound.ts
+++ b/application/client/src/utils/extract_metadata_from_sound.ts
@@ -1,6 +1,7 @@
import Encoding from "encoding-japanese";
-import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
+import { FFmpeg } from "@ffmpeg/ffmpeg";
+// import { loadFFmpeg } from "@web-speed-hackathon-2026/client/src/utils/load_ffmpeg";
interface SoundMetadata {
artist: string;
@@ -13,7 +14,8 @@ const UNKNOWN_TITLE = "Unknown Title";
export async function extractMetadataFromSound(data: File): Promise {
try {
- const ffmpeg = await loadFFmpeg();
+ const ffmpeg = new FFmpeg()
+ // const ffmpeg = await loadFFmpeg();
const exportFile = "meta.txt";
diff --git a/application/client/src/utils/get_path.ts b/application/client/src/utils/get_path.ts
index 0e3497f56c..8597011e04 100644
--- a/application/client/src/utils/get_path.ts
+++ b/application/client/src/utils/get_path.ts
@@ -11,5 +11,5 @@ export function getSoundPath(soundId: string): string {
}
export function getProfileImagePath(profileImageId: string): string {
- return `/images/profiles/${profileImageId}.jpg`;
+ return `/images/profiles/${profileImageId}.webp`;
}
diff --git a/application/client/webpack.config.js b/application/client/webpack.config.js
index 9fae72647f..f776f638d1 100644
--- a/application/client/webpack.config.js
+++ b/application/client/webpack.config.js
@@ -11,6 +11,9 @@ const PUBLIC_PATH = path.resolve(__dirname, "../public");
const UPLOAD_PATH = path.resolve(__dirname, "../upload");
const DIST_PATH = path.resolve(__dirname, "../dist");
+const { BundleAnalyzerPlugin } = require("webpack-bundle-analyzer");
+
+
/** @type {import('webpack').Configuration} */
const config = {
devServer: {
@@ -25,10 +28,10 @@ const config = {
],
static: [PUBLIC_PATH, UPLOAD_PATH],
},
- devtool: "inline-source-map",
+ devtool: "eval",
entry: {
main: [
- "core-js",
+ // "core-js",
"regenerator-runtime/runtime",
"jquery-binarytransport",
path.resolve(SRC_PATH, "./index.css"),
@@ -77,7 +80,8 @@ const config = {
BUILD_DATE: new Date().toISOString(),
// Heroku では SOURCE_VERSION 環境変数から commit hash を参照できます
COMMIT_HASH: process.env.SOURCE_VERSION || "",
- NODE_ENV: "development",
+ NODE_ENV: "production",
+ // NODE_ENV: "development",
}),
new MiniCssExtractPlugin({
filename: "styles/[name].css",
@@ -94,32 +98,36 @@ const config = {
inject: false,
template: path.resolve(SRC_PATH, "./index.html"),
}),
+ new BundleAnalyzerPlugin({
+ analyzerMode: 'disabled', // stats.jsonファイルのみを出力
+ generateStatsFile: true,
+ })
],
resolve: {
extensions: [".tsx", ".ts", ".mjs", ".cjs", ".jsx", ".js"],
alias: {
"bayesian-bm25$": path.resolve(__dirname, "node_modules", "bayesian-bm25/dist/index.js"),
["kuromoji$"]: path.resolve(__dirname, "node_modules", "kuromoji/build/kuromoji.js"),
- "@ffmpeg/ffmpeg$": path.resolve(
- __dirname,
- "node_modules",
- "@ffmpeg/ffmpeg/dist/esm/index.js",
- ),
- "@ffmpeg/core$": path.resolve(
- __dirname,
- "node_modules",
- "@ffmpeg/core/dist/umd/ffmpeg-core.js",
- ),
- "@ffmpeg/core/wasm$": path.resolve(
- __dirname,
- "node_modules",
- "@ffmpeg/core/dist/umd/ffmpeg-core.wasm",
- ),
- "@imagemagick/magick-wasm/magick.wasm$": path.resolve(
- __dirname,
- "node_modules",
- "@imagemagick/magick-wasm/dist/magick.wasm",
- ),
+ // "@ffmpeg/ffmpeg$": path.resolve(
+ // __dirname,
+ // "node_modules",
+ // "@ffmpeg/ffmpeg/dist/esm/index.js",
+ // ),
+ // "@ffmpeg/core$": path.resolve(
+ // __dirname,
+ // "node_modules",
+ // "@ffmpeg/core/dist/umd/ffmpeg-core.js",
+ // ),
+ // "@ffmpeg/core/wasm$": path.resolve(
+ // __dirname,
+ // "node_modules",
+ // "@ffmpeg/core/dist/umd/ffmpeg-core.wasm",
+ // ),
+ // "@imagemagick/magick-wasm/magick.wasm$": path.resolve(
+ // __dirname,
+ // "node_modules",
+ // "@imagemagick/magick-wasm/dist/magick.wasm",
+ // ),
},
fallback: {
fs: false,
diff --git a/application/package.json b/application/package.json
index 9a4daa55a6..5caf0c5498 100644
--- a/application/package.json
+++ b/application/package.json
@@ -10,14 +10,19 @@
"typecheck": "pnpm run --recursive typecheck",
"format": "pnpm run format:oxlint && pnpm run format:oxfmt",
"format:oxlint": "oxlint --fix",
- "format:oxfmt": "oxfmt"
+ "format:oxfmt": "oxfmt",
+ "bundle": "pnpm webpack-bundle-analyzer dist/stats.json dist -m static"
},
"devDependencies": {
"oxfmt": "0.36.0",
- "oxlint": "1.43.0"
+ "oxlint": "1.43.0",
+ "webpack-bundle-analyzer": "5.2.0"
},
"engines": {
"node": "24.14.0"
},
- "packageManager": "pnpm@10.32.1"
+ "packageManager": "pnpm@10.32.1",
+ "dependencies": {
+ "es-toolkit": "1.45.1"
+ }
}
diff --git a/application/pnpm-lock.yaml b/application/pnpm-lock.yaml
index 510570f5c9..01f7aa9054 100644
--- a/application/pnpm-lock.yaml
+++ b/application/pnpm-lock.yaml
@@ -11,6 +11,10 @@ overrides:
importers:
.:
+ dependencies:
+ es-toolkit:
+ specifier: 1.45.1
+ version: 1.45.1
devDependencies:
oxfmt:
specifier: 0.36.0
@@ -18,6 +22,9 @@ importers:
oxlint:
specifier: 1.43.0
version: 1.43.0
+ webpack-bundle-analyzer:
+ specifier: 5.2.0
+ version: 5.2.0
client:
dependencies:
@@ -54,6 +61,9 @@ importers:
core-js:
specifier: 3.45.1
version: 3.45.1
+ dayjs:
+ specifier: 1.11.20
+ version: 1.11.20
encoding-japanese:
specifier: 2.2.0
version: 2.2.0
@@ -62,7 +72,7 @@ importers:
version: 9.5.0
gifler:
specifier: github:themadcreator/gifler#v0.3.0
- version: https://codeload.github.com/themadcreator/gifler/tar.gz/c3259b071c7782f85d4928a5f03d0b378ed003b5
+ version: https://codeload.github.com/themadcreator/gifler/tar.gz/89484cb3db174c584a3138e89664f0167a7760c1
image-size:
specifier: 2.0.2
version: 2.0.2
@@ -246,7 +256,7 @@ importers:
version: 5.102.1(webpack-cli@6.0.1)
webpack-cli:
specifier: 6.0.1
- version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ version: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
webpack-dev-server:
specifier: 5.2.2
version: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1)
@@ -265,6 +275,9 @@ importers:
server:
dependencies:
+ '@mlc-ai/web-llm':
+ specifier: 0.2.80
+ version: 0.2.80
'@tsconfig/strictest':
specifier: 2.0.8
version: 2.0.8
@@ -274,9 +287,15 @@ importers:
bcrypt:
specifier: 6.0.0
version: 6.0.0
+ bluebird:
+ specifier: 3.7.2
+ version: 3.7.2
body-parser:
specifier: 2.2.0
version: 2.2.0
+ common-tags:
+ specifier: 1.8.2
+ version: 1.8.2
connect-history-api-fallback:
specifier: 2.0.0
version: 2.0.0
@@ -292,18 +311,33 @@ importers:
http-errors:
specifier: 2.0.0
version: 2.0.0
+ json-repair-js:
+ specifier: 1.0.0
+ version: 1.0.0
+ kuromoji:
+ specifier: 0.1.2
+ version: 0.1.2
+ langs:
+ specifier: 2.0.0
+ version: 2.0.0
music-metadata:
specifier: 11.10.3
version: 11.10.3
+ negaposi-analyzer-ja:
+ specifier: 1.0.1
+ version: 1.0.1
sequelize:
specifier: 6.37.7
- version: 6.37.7(sqlite3@5.1.7)
+ version: 6.37.7(sqlite3@5.1.7(bluebird@3.7.2))
serve-static:
specifier: 2.2.0
version: 2.2.0
sqlite3:
specifier: 5.1.7
- version: 5.1.7
+ version: 5.1.7(bluebird@3.7.2)
+ tiny-invariant:
+ specifier: 1.3.3
+ version: 1.3.3
tsx:
specifier: 4.20.6
version: 4.20.6
@@ -1181,6 +1215,10 @@ packages:
peerDependencies:
postcss: ^8.4
+ '@discoveryjs/json-ext@0.5.7':
+ resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
+ engines: {node: '>=10.0.0'}
+
'@discoveryjs/json-ext@0.6.3':
resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==}
engines: {node: '>=14.17.0'}
@@ -1608,6 +1646,9 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ '@polka/url@1.0.0-next.29':
+ resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==}
+
'@tokenizer/inflate@0.4.1':
resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==}
engines: {node: '>=18'}
@@ -1888,6 +1929,10 @@ packages:
peerDependencies:
acorn: ^8.14.0
+ acorn-walk@8.3.5:
+ resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==}
+ engines: {node: '>=0.4.0'}
+
acorn@8.15.0:
resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
engines: {node: '>=0.4.0'}
@@ -2147,6 +2192,10 @@ packages:
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+ commander@7.2.0:
+ resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+ engines: {node: '>= 10'}
+
commander@8.3.0:
resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
engines: {node: '>= 12'}
@@ -2293,6 +2342,12 @@ packages:
csv-parse@1.3.3:
resolution: {integrity: sha512-byxnDBxM1AVF3YfmsK7Smop9/usNz7gAZYSo9eYp61TGcNXraJby1rAiLyJSt1/8Iho2qaxZOtZCOvQMXogPtg==}
+ dayjs@1.11.20:
+ resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==}
+
+ debounce@1.2.1:
+ resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
+
debug@2.6.9:
resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
peerDependencies:
@@ -2463,6 +2518,9 @@ packages:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
+ es-toolkit@1.45.1:
+ resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==}
+
es6-error@4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
@@ -2478,6 +2536,10 @@ packages:
escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
escape-string-regexp@5.0.0:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
@@ -2667,8 +2729,8 @@ packages:
get-tsconfig@4.13.0:
resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==}
- gifler@https://codeload.github.com/themadcreator/gifler/tar.gz/c3259b071c7782f85d4928a5f03d0b378ed003b5:
- resolution: {tarball: https://codeload.github.com/themadcreator/gifler/tar.gz/c3259b071c7782f85d4928a5f03d0b378ed003b5}
+ gifler@https://codeload.github.com/themadcreator/gifler/tar.gz/89484cb3db174c584a3138e89664f0167a7760c1:
+ resolution: {tarball: https://codeload.github.com/themadcreator/gifler/tar.gz/89484cb3db174c584a3138e89664f0167a7760c1}
version: 0.3.0
github-from-package@0.0.0:
@@ -2766,6 +2828,9 @@ packages:
hpack.js@2.1.6:
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
html-minifier-terser@6.1.0:
resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
engines: {node: '>=12'}
@@ -3384,6 +3449,10 @@ packages:
moment@2.30.1:
resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+ mrmime@2.0.1:
+ resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
+ engines: {node: '>=10'}
+
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -3515,6 +3584,10 @@ packages:
resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==}
engines: {node: '>=18'}
+ opener@1.5.2:
+ resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
+ hasBin: true
+
oxfmt@0.36.0:
resolution: {integrity: sha512-/ejJ+KoSW6J9bcNT9a9UtJSJNWhJ3yOLSBLbkoFHJs/8CZjmaZVZAJe4YgO1KMJlKpNQasrn/G9JQUEZI3p0EQ==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -4246,6 +4319,10 @@ packages:
simple-get@4.0.1:
resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==}
+ sirv@3.0.2:
+ resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==}
+ engines: {node: '>=18'}
+
smart-buffer@4.2.0:
resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
@@ -4419,6 +4496,10 @@ packages:
toposort-class@1.0.1:
resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==}
+ totalist@3.0.1:
+ resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
+ engines: {node: '>=6'}
+
tree-dump@1.1.0:
resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==}
engines: {node: '>=10.0'}
@@ -4575,6 +4656,11 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+ webpack-bundle-analyzer@5.2.0:
+ resolution: {integrity: sha512-Etrauj1wYO/xjiz/Vfd6bW1lG9fEhrJpNmu10tv0X9kv+gyY3qiE09uYepqg1Xd0PxOvllRXwWYWjtQYoO/glQ==}
+ engines: {node: '>= 20.9.0'}
+ hasBin: true
+
webpack-cli@6.0.1:
resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==}
engines: {node: '>=18.12.0'}
@@ -4666,6 +4752,18 @@ packages:
utf-8-validate:
optional: true
+ ws@8.19.0:
+ resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
wsl-utils@0.1.0:
resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==}
engines: {node: '>=18'}
@@ -5710,6 +5808,8 @@ snapshots:
dependencies:
postcss: 8.5.6
+ '@discoveryjs/json-ext@0.5.7': {}
+
'@discoveryjs/json-ext@0.6.3': {}
'@dr.pogodin/react-helmet@3.0.4(react@19.2.0)':
@@ -5972,6 +6072,8 @@ snapshots:
dependencies:
playwright: 1.50.1
+ '@polka/url@1.0.0-next.29': {}
+
'@tokenizer/inflate@0.4.1':
dependencies:
debug: 4.4.3
@@ -6260,17 +6362,17 @@ snapshots:
'@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)':
dependencies:
webpack: 5.102.1(webpack-cli@6.0.1)
- webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
'@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)':
dependencies:
webpack: 5.102.1(webpack-cli@6.0.1)
- webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
'@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.102.1)':
dependencies:
webpack: 5.102.1(webpack-cli@6.0.1)
- webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
optionalDependencies:
webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1)
@@ -6295,6 +6397,10 @@ snapshots:
dependencies:
acorn: 8.15.0
+ acorn-walk@8.3.5:
+ dependencies:
+ acorn: 8.15.0
+
acorn@8.15.0: {}
agent-base@6.0.2:
@@ -6508,7 +6614,7 @@ snapshots:
bytes@3.1.2: {}
- cacache@15.3.0:
+ cacache@15.3.0(bluebird@3.7.2):
dependencies:
'@npmcli/fs': 1.1.1
'@npmcli/move-file': 1.1.2
@@ -6523,7 +6629,7 @@ snapshots:
minipass-pipeline: 1.2.4
mkdirp: 1.0.4
p-map: 4.0.0
- promise-inflight: 1.0.1
+ promise-inflight: 1.0.1(bluebird@3.7.2)
rimraf: 3.0.2
ssri: 8.0.1
tar: 6.2.1
@@ -6605,6 +6711,8 @@ snapshots:
commander@2.20.3: {}
+ commander@7.2.0: {}
+
commander@8.3.0: {}
common-tags@1.8.2: {}
@@ -6743,6 +6851,10 @@ snapshots:
csv-parse@1.3.3: {}
+ dayjs@1.11.20: {}
+
+ debounce@1.2.1: {}
+
debug@2.6.9:
dependencies:
ms: 2.0.0
@@ -6881,6 +6993,8 @@ snapshots:
dependencies:
es-errors: 1.3.0
+ es-toolkit@1.45.1: {}
+
es6-error@4.1.1: {}
esbuild@0.25.11:
@@ -6916,6 +7030,8 @@ snapshots:
escape-html@1.0.3: {}
+ escape-string-regexp@4.0.0: {}
+
escape-string-regexp@5.0.0: {}
eslint-scope@5.1.1:
@@ -7161,7 +7277,7 @@ snapshots:
dependencies:
resolve-pkg-maps: 1.0.0
- gifler@https://codeload.github.com/themadcreator/gifler/tar.gz/c3259b071c7782f85d4928a5f03d0b378ed003b5:
+ gifler@https://codeload.github.com/themadcreator/gifler/tar.gz/89484cb3db174c584a3138e89664f0167a7760c1:
dependencies:
bluebird: 3.7.2
omggif: 1.0.10
@@ -7306,6 +7422,8 @@ snapshots:
readable-stream: 2.3.8
wbuf: 1.7.3
+ html-escaper@2.0.2: {}
+
html-minifier-terser@6.1.0:
dependencies:
camel-case: 4.1.2
@@ -7635,10 +7753,10 @@ snapshots:
yallist: 4.0.0
optional: true
- make-fetch-happen@9.1.0:
+ make-fetch-happen@9.1.0(bluebird@3.7.2):
dependencies:
agentkeepalive: 4.6.0
- cacache: 15.3.0
+ cacache: 15.3.0(bluebird@3.7.2)
http-cache-semantics: 4.2.0
http-proxy-agent: 4.0.1
https-proxy-agent: 5.0.1
@@ -8139,6 +8257,8 @@ snapshots:
moment@2.30.1: {}
+ mrmime@2.0.1: {}
+
ms@2.0.0: {}
ms@2.1.3: {}
@@ -8208,12 +8328,12 @@ snapshots:
node-gyp-build@4.8.4: {}
- node-gyp@8.4.1:
+ node-gyp@8.4.1(bluebird@3.7.2):
dependencies:
env-paths: 2.2.1
glob: 7.2.3
graceful-fs: 4.2.11
- make-fetch-happen: 9.1.0
+ make-fetch-happen: 9.1.0(bluebird@3.7.2)
nopt: 5.0.0
npmlog: 6.0.2
rimraf: 3.0.2
@@ -8277,6 +8397,8 @@ snapshots:
is-inside-container: 1.0.0
wsl-utils: 0.1.0
+ opener@1.5.2: {}
+
oxfmt@0.36.0:
dependencies:
tinypool: 2.1.0
@@ -8709,7 +8831,9 @@ snapshots:
process-nextick-args@2.0.1: {}
- promise-inflight@1.0.1:
+ promise-inflight@1.0.1(bluebird@3.7.2):
+ optionalDependencies:
+ bluebird: 3.7.2
optional: true
promise-retry@2.0.1:
@@ -9074,7 +9198,7 @@ snapshots:
sequelize-pool@7.1.0: {}
- sequelize@6.37.7(sqlite3@5.1.7):
+ sequelize@6.37.7(sqlite3@5.1.7(bluebird@3.7.2)):
dependencies:
'@types/debug': 4.1.12
'@types/validator': 13.15.3
@@ -9093,7 +9217,7 @@ snapshots:
validator: 13.15.15
wkx: 0.5.0
optionalDependencies:
- sqlite3: 5.1.7
+ sqlite3: 5.1.7(bluebird@3.7.2)
transitivePeerDependencies:
- supports-color
@@ -9191,6 +9315,12 @@ snapshots:
once: 1.4.0
simple-concat: 1.0.1
+ sirv@3.0.2:
+ dependencies:
+ '@polka/url': 1.0.0-next.29
+ mrmime: 2.0.1
+ totalist: 3.0.1
+
smart-buffer@4.2.0:
optional: true
@@ -9247,14 +9377,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- sqlite3@5.1.7:
+ sqlite3@5.1.7(bluebird@3.7.2):
dependencies:
bindings: 1.5.0
node-addon-api: 7.1.1
prebuild-install: 7.1.3
tar: 6.2.1
optionalDependencies:
- node-gyp: 8.4.1
+ node-gyp: 8.4.1(bluebird@3.7.2)
transitivePeerDependencies:
- bluebird
- supports-color
@@ -9393,6 +9523,8 @@ snapshots:
toposort-class@1.0.1: {}
+ totalist@3.0.1: {}
+
tree-dump@1.1.0(tslib@2.8.1):
dependencies:
tslib: 2.8.1
@@ -9553,7 +9685,24 @@ snapshots:
web-namespaces@2.0.1: {}
- webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1):
+ webpack-bundle-analyzer@5.2.0:
+ dependencies:
+ '@discoveryjs/json-ext': 0.5.7
+ acorn: 8.15.0
+ acorn-walk: 8.3.5
+ commander: 7.2.0
+ debounce: 1.2.1
+ escape-string-regexp: 4.0.0
+ html-escaper: 2.0.2
+ opener: 1.5.2
+ picocolors: 1.1.1
+ sirv: 3.0.2
+ ws: 8.19.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ webpack-cli@6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1):
dependencies:
'@discoveryjs/json-ext': 0.6.3
'@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.102.1)
@@ -9570,6 +9719,7 @@ snapshots:
webpack: 5.102.1(webpack-cli@6.0.1)
webpack-merge: 6.0.1
optionalDependencies:
+ webpack-bundle-analyzer: 5.2.0
webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.102.1)
webpack-dev-middleware@7.4.5(webpack@5.102.1):
@@ -9615,7 +9765,7 @@ snapshots:
ws: 8.18.3
optionalDependencies:
webpack: 5.102.1(webpack-cli@6.0.1)
- webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
transitivePeerDependencies:
- bufferutil
- debug
@@ -9658,7 +9808,7 @@ snapshots:
watchpack: 2.4.4
webpack-sources: 3.3.3
optionalDependencies:
- webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.102.1)
+ webpack-cli: 6.0.1(webpack-bundle-analyzer@5.2.0)(webpack-dev-server@5.2.2)(webpack@5.102.1)
transitivePeerDependencies:
- '@swc/core'
- esbuild
@@ -9691,6 +9841,8 @@ snapshots:
ws@8.18.3: {}
+ ws@8.19.0: {}
+
wsl-utils@0.1.0:
dependencies:
is-wsl: 3.1.0
diff --git a/application/public/images/029b4b75-bbcc-4aa5-8bd7-e4bb12a33cd3.jpg b/application/public/images/029b4b75-bbcc-4aa5-8bd7-e4bb12a33cd3.jpg
index 8ce999154f..484643d26d 100644
Binary files a/application/public/images/029b4b75-bbcc-4aa5-8bd7-e4bb12a33cd3.jpg and b/application/public/images/029b4b75-bbcc-4aa5-8bd7-e4bb12a33cd3.jpg differ
diff --git a/application/public/images/078c4d42-12e3-4c1d-823c-9ba552f6b066.jpg b/application/public/images/078c4d42-12e3-4c1d-823c-9ba552f6b066.jpg
index c2fa15e15d..f3d844470f 100644
Binary files a/application/public/images/078c4d42-12e3-4c1d-823c-9ba552f6b066.jpg and b/application/public/images/078c4d42-12e3-4c1d-823c-9ba552f6b066.jpg differ
diff --git a/application/public/images/083258be-3e8c-4537-ac9c-fd5fd9cd943b.jpg b/application/public/images/083258be-3e8c-4537-ac9c-fd5fd9cd943b.jpg
index c0b4aab6e3..8fbfd80c22 100644
Binary files a/application/public/images/083258be-3e8c-4537-ac9c-fd5fd9cd943b.jpg and b/application/public/images/083258be-3e8c-4537-ac9c-fd5fd9cd943b.jpg differ
diff --git a/application/public/images/18358ca6-0aa7-4592-9926-1ec522b9aacb.jpg b/application/public/images/18358ca6-0aa7-4592-9926-1ec522b9aacb.jpg
index 252ec44ae1..5d8a6e3187 100644
Binary files a/application/public/images/18358ca6-0aa7-4592-9926-1ec522b9aacb.jpg and b/application/public/images/18358ca6-0aa7-4592-9926-1ec522b9aacb.jpg differ
diff --git a/application/public/images/19b3516f-ccfc-4d76-a45c-fc2aade43afe.jpg b/application/public/images/19b3516f-ccfc-4d76-a45c-fc2aade43afe.jpg
index deb08a9733..8ae7521de5 100644
Binary files a/application/public/images/19b3516f-ccfc-4d76-a45c-fc2aade43afe.jpg and b/application/public/images/19b3516f-ccfc-4d76-a45c-fc2aade43afe.jpg differ
diff --git a/application/public/images/26117ade-f330-46a2-8c48-767b6f472613.jpg b/application/public/images/26117ade-f330-46a2-8c48-767b6f472613.jpg
index 2a858b13ef..13b23a115a 100644
Binary files a/application/public/images/26117ade-f330-46a2-8c48-767b6f472613.jpg and b/application/public/images/26117ade-f330-46a2-8c48-767b6f472613.jpg differ
diff --git a/application/public/images/3a5915dc-6ef0-4c66-ad4b-bba9c724cfbc.jpg b/application/public/images/3a5915dc-6ef0-4c66-ad4b-bba9c724cfbc.jpg
index 69f567ba06..3f1c699ba1 100644
Binary files a/application/public/images/3a5915dc-6ef0-4c66-ad4b-bba9c724cfbc.jpg and b/application/public/images/3a5915dc-6ef0-4c66-ad4b-bba9c724cfbc.jpg differ
diff --git a/application/public/images/4685b32a-43d2-4478-bb79-2cdb56f8ecf0.jpg b/application/public/images/4685b32a-43d2-4478-bb79-2cdb56f8ecf0.jpg
index fc5345e622..a55228ff08 100644
Binary files a/application/public/images/4685b32a-43d2-4478-bb79-2cdb56f8ecf0.jpg and b/application/public/images/4685b32a-43d2-4478-bb79-2cdb56f8ecf0.jpg differ
diff --git a/application/public/images/49b8af97-9536-4a23-86f6-21526ff2715b.jpg b/application/public/images/49b8af97-9536-4a23-86f6-21526ff2715b.jpg
index 19cf6b1607..ff528c1340 100644
Binary files a/application/public/images/49b8af97-9536-4a23-86f6-21526ff2715b.jpg and b/application/public/images/49b8af97-9536-4a23-86f6-21526ff2715b.jpg differ
diff --git a/application/public/images/5be3fce7-0365-4aa3-a1b6-cdeb553e8dfb.jpg b/application/public/images/5be3fce7-0365-4aa3-a1b6-cdeb553e8dfb.jpg
index 9b2d6c4e1c..57839debf2 100644
Binary files a/application/public/images/5be3fce7-0365-4aa3-a1b6-cdeb553e8dfb.jpg and b/application/public/images/5be3fce7-0365-4aa3-a1b6-cdeb553e8dfb.jpg differ
diff --git a/application/public/images/5e7212da-6b4c-4eb2-b828-b0bc35bfbc1c.jpg b/application/public/images/5e7212da-6b4c-4eb2-b828-b0bc35bfbc1c.jpg
index 4d6a13d7e0..8d0fdd2c91 100644
Binary files a/application/public/images/5e7212da-6b4c-4eb2-b828-b0bc35bfbc1c.jpg and b/application/public/images/5e7212da-6b4c-4eb2-b828-b0bc35bfbc1c.jpg differ
diff --git a/application/public/images/6d532fa5-daff-4876-a26f-b5c8669d1176.jpg b/application/public/images/6d532fa5-daff-4876-a26f-b5c8669d1176.jpg
index 6db63536c4..5b6fe8ec3d 100644
Binary files a/application/public/images/6d532fa5-daff-4876-a26f-b5c8669d1176.jpg and b/application/public/images/6d532fa5-daff-4876-a26f-b5c8669d1176.jpg differ
diff --git a/application/public/images/737f764e-f495-4104-b6d6-8434681718d5.jpg b/application/public/images/737f764e-f495-4104-b6d6-8434681718d5.jpg
index 12e5a0742c..21e0be8b20 100644
Binary files a/application/public/images/737f764e-f495-4104-b6d6-8434681718d5.jpg and b/application/public/images/737f764e-f495-4104-b6d6-8434681718d5.jpg differ
diff --git a/application/public/images/77284ba9-06c0-4c66-92a9-4d2513336e24.jpg b/application/public/images/77284ba9-06c0-4c66-92a9-4d2513336e24.jpg
index 9182e213f2..ad02591278 100644
Binary files a/application/public/images/77284ba9-06c0-4c66-92a9-4d2513336e24.jpg and b/application/public/images/77284ba9-06c0-4c66-92a9-4d2513336e24.jpg differ
diff --git a/application/public/images/824ddc65-8afc-4cd5-8176-1a8053758e72.jpg b/application/public/images/824ddc65-8afc-4cd5-8176-1a8053758e72.jpg
index 9dee0afd36..17711014fb 100644
Binary files a/application/public/images/824ddc65-8afc-4cd5-8176-1a8053758e72.jpg and b/application/public/images/824ddc65-8afc-4cd5-8176-1a8053758e72.jpg differ
diff --git a/application/public/images/85946f86-c0bd-4d6b-83b7-94eb32dcbcf4.jpg b/application/public/images/85946f86-c0bd-4d6b-83b7-94eb32dcbcf4.jpg
index 74e42ea800..d34773a532 100644
Binary files a/application/public/images/85946f86-c0bd-4d6b-83b7-94eb32dcbcf4.jpg and b/application/public/images/85946f86-c0bd-4d6b-83b7-94eb32dcbcf4.jpg differ
diff --git a/application/public/images/9bb2f5c0-0f7c-4b9d-8e6a-aa87ebe7efc5.jpg b/application/public/images/9bb2f5c0-0f7c-4b9d-8e6a-aa87ebe7efc5.jpg
index 7ffc62b872..7e1070594f 100644
Binary files a/application/public/images/9bb2f5c0-0f7c-4b9d-8e6a-aa87ebe7efc5.jpg and b/application/public/images/9bb2f5c0-0f7c-4b9d-8e6a-aa87ebe7efc5.jpg differ
diff --git a/application/public/images/9c8c5258-f659-4890-8b7f-0485097d957b.jpg b/application/public/images/9c8c5258-f659-4890-8b7f-0485097d957b.jpg
index 476900f697..20a6d61de8 100644
Binary files a/application/public/images/9c8c5258-f659-4890-8b7f-0485097d957b.jpg and b/application/public/images/9c8c5258-f659-4890-8b7f-0485097d957b.jpg differ
diff --git a/application/public/images/a21c9b2c-9fc7-4d3c-8488-a465150f7b1c.jpg b/application/public/images/a21c9b2c-9fc7-4d3c-8488-a465150f7b1c.jpg
index 607c1dcaad..a5396eb353 100644
Binary files a/application/public/images/a21c9b2c-9fc7-4d3c-8488-a465150f7b1c.jpg and b/application/public/images/a21c9b2c-9fc7-4d3c-8488-a465150f7b1c.jpg differ
diff --git a/application/public/images/af15685e-2e43-4453-bc8f-55e386bd5963.jpg b/application/public/images/af15685e-2e43-4453-bc8f-55e386bd5963.jpg
index 9d733cf531..737f18a784 100644
Binary files a/application/public/images/af15685e-2e43-4453-bc8f-55e386bd5963.jpg and b/application/public/images/af15685e-2e43-4453-bc8f-55e386bd5963.jpg differ
diff --git a/application/public/images/af15f1d0-8350-46f4-9652-e02eb31469da.jpg b/application/public/images/af15f1d0-8350-46f4-9652-e02eb31469da.jpg
index 2afefff833..0bb1a26b9f 100644
Binary files a/application/public/images/af15f1d0-8350-46f4-9652-e02eb31469da.jpg and b/application/public/images/af15f1d0-8350-46f4-9652-e02eb31469da.jpg differ
diff --git a/application/public/images/c095fdc4-eb78-4ae1-9efa-4b8e360177ce.jpg b/application/public/images/c095fdc4-eb78-4ae1-9efa-4b8e360177ce.jpg
index dd24051c18..7ea3c0caf0 100644
Binary files a/application/public/images/c095fdc4-eb78-4ae1-9efa-4b8e360177ce.jpg and b/application/public/images/c095fdc4-eb78-4ae1-9efa-4b8e360177ce.jpg differ
diff --git a/application/public/images/da2bfcde-14fd-473c-ae79-572d95152b61.jpg b/application/public/images/da2bfcde-14fd-473c-ae79-572d95152b61.jpg
index 7e5fcd034d..efee957bc4 100644
Binary files a/application/public/images/da2bfcde-14fd-473c-ae79-572d95152b61.jpg and b/application/public/images/da2bfcde-14fd-473c-ae79-572d95152b61.jpg differ
diff --git a/application/public/images/ddc7053e-0f2f-49b1-9c07-e1060e2fa4aa.jpg b/application/public/images/ddc7053e-0f2f-49b1-9c07-e1060e2fa4aa.jpg
index 09b3277c02..c642257087 100644
Binary files a/application/public/images/ddc7053e-0f2f-49b1-9c07-e1060e2fa4aa.jpg and b/application/public/images/ddc7053e-0f2f-49b1-9c07-e1060e2fa4aa.jpg differ
diff --git a/application/public/images/e40ff559-d0d3-4eb0-8792-21cb171b815c.jpg b/application/public/images/e40ff559-d0d3-4eb0-8792-21cb171b815c.jpg
index e2eb1f9420..c11fe8e413 100644
Binary files a/application/public/images/e40ff559-d0d3-4eb0-8792-21cb171b815c.jpg and b/application/public/images/e40ff559-d0d3-4eb0-8792-21cb171b815c.jpg differ
diff --git a/application/public/images/eb487309-79ed-40d0-9fee-382ed8486b70.jpg b/application/public/images/eb487309-79ed-40d0-9fee-382ed8486b70.jpg
index 4527761130..327bb2daa3 100644
Binary files a/application/public/images/eb487309-79ed-40d0-9fee-382ed8486b70.jpg and b/application/public/images/eb487309-79ed-40d0-9fee-382ed8486b70.jpg differ
diff --git a/application/public/images/ec098438-5fac-44a8-bd5a-84c575a32790.jpg b/application/public/images/ec098438-5fac-44a8-bd5a-84c575a32790.jpg
index 7885818d74..0605b3e840 100644
Binary files a/application/public/images/ec098438-5fac-44a8-bd5a-84c575a32790.jpg and b/application/public/images/ec098438-5fac-44a8-bd5a-84c575a32790.jpg differ
diff --git a/application/public/images/ee6d7cb7-3c05-4bde-92e5-aebef3785904.jpg b/application/public/images/ee6d7cb7-3c05-4bde-92e5-aebef3785904.jpg
index 0db48838ad..0cf96cda96 100644
Binary files a/application/public/images/ee6d7cb7-3c05-4bde-92e5-aebef3785904.jpg and b/application/public/images/ee6d7cb7-3c05-4bde-92e5-aebef3785904.jpg differ
diff --git a/application/public/images/f046441d-b837-4dc7-b0ae-5cf2604eab4c.jpg b/application/public/images/f046441d-b837-4dc7-b0ae-5cf2604eab4c.jpg
index b6677c524f..871adbbdd2 100644
Binary files a/application/public/images/f046441d-b837-4dc7-b0ae-5cf2604eab4c.jpg and b/application/public/images/f046441d-b837-4dc7-b0ae-5cf2604eab4c.jpg differ
diff --git a/application/public/images/f478a152-02f8-46a3-91ce-d1d7944d303a.jpg b/application/public/images/f478a152-02f8-46a3-91ce-d1d7944d303a.jpg
index a2aa172d31..664646cc94 100644
Binary files a/application/public/images/f478a152-02f8-46a3-91ce-d1d7944d303a.jpg and b/application/public/images/f478a152-02f8-46a3-91ce-d1d7944d303a.jpg differ
diff --git a/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.jpg b/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.jpg
deleted file mode 100644
index 233fecd827..0000000000
Binary files a/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.jpg and /dev/null differ
diff --git a/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.webp b/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.webp
new file mode 100644
index 0000000000..685d8e31b0
Binary files /dev/null and b/application/public/images/profiles/09d52cbb-28a2-4413-b220-1f8c9e80a440.webp differ
diff --git a/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.jpg b/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.jpg
deleted file mode 100644
index 83534c3edf..0000000000
Binary files a/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.jpg and /dev/null differ
diff --git a/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.webp b/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.webp
new file mode 100644
index 0000000000..41fe23b0d4
Binary files /dev/null and b/application/public/images/profiles/0aba06a6-1b56-4ebd-8218-951aaba173af.webp differ
diff --git a/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.jpg b/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.jpg
deleted file mode 100644
index cd0ad8af5d..0000000000
Binary files a/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.jpg and /dev/null differ
diff --git a/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.webp b/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.webp
new file mode 100644
index 0000000000..2f2bb368c7
Binary files /dev/null and b/application/public/images/profiles/0ccabdd2-4601-4c2f-88f5-1848b06ef035.webp differ
diff --git a/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.jpg b/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.jpg
deleted file mode 100644
index ac262dc1a2..0000000000
Binary files a/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.jpg and /dev/null differ
diff --git a/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.webp b/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.webp
new file mode 100644
index 0000000000..ff115c4ff2
Binary files /dev/null and b/application/public/images/profiles/25dde9ae-1dd3-4d23-bfd3-90a94b59816c.webp differ
diff --git a/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.jpg b/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.jpg
deleted file mode 100644
index 2790b99200..0000000000
Binary files a/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.jpg and /dev/null differ
diff --git a/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.webp b/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.webp
new file mode 100644
index 0000000000..e3092d5464
Binary files /dev/null and b/application/public/images/profiles/2d5ef610-a9e5-426c-9eeb-916a9b753d55.webp differ
diff --git a/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.jpg b/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.jpg
deleted file mode 100644
index 46b554eb6f..0000000000
Binary files a/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.jpg and /dev/null differ
diff --git a/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.webp b/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.webp
new file mode 100644
index 0000000000..c554b98168
Binary files /dev/null and b/application/public/images/profiles/36079dc7-dd73-4073-aceb-7d5c1f0dab4e.webp differ
diff --git a/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.jpg b/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.jpg
deleted file mode 100644
index 5b48c21675..0000000000
Binary files a/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.jpg and /dev/null differ
diff --git a/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.webp b/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.webp
new file mode 100644
index 0000000000..4fe7ffdbda
Binary files /dev/null and b/application/public/images/profiles/37812068-9ef8-4429-b219-8d9c9b91c89c.webp differ
diff --git a/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.jpg b/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.jpg
deleted file mode 100644
index 3183b7c1d5..0000000000
Binary files a/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.jpg and /dev/null differ
diff --git a/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.webp b/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.webp
new file mode 100644
index 0000000000..90ee749973
Binary files /dev/null and b/application/public/images/profiles/396fe4ce-aa36-4d96-b54e-6db40bae2eed.webp differ
diff --git a/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.jpg b/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.jpg
deleted file mode 100644
index 56fbbddfa2..0000000000
Binary files a/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.jpg and /dev/null differ
diff --git a/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.webp b/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.webp
new file mode 100644
index 0000000000..a420430c27
Binary files /dev/null and b/application/public/images/profiles/3d43c4e2-6eaf-4bb9-bff3-cb955440c891.webp differ
diff --git a/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.jpg b/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.jpg
deleted file mode 100644
index 16b5ea9144..0000000000
Binary files a/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.jpg and /dev/null differ
diff --git a/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.webp b/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.webp
new file mode 100644
index 0000000000..cae8f68838
Binary files /dev/null and b/application/public/images/profiles/3dd3640a-5f9e-40d0-8daf-bfdb473b129e.webp differ
diff --git a/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.jpg b/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.jpg
deleted file mode 100644
index 0c993f38e7..0000000000
Binary files a/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.jpg and /dev/null differ
diff --git a/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.webp b/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.webp
new file mode 100644
index 0000000000..5a17c52761
Binary files /dev/null and b/application/public/images/profiles/51874337-0b42-4b03-8e3d-fbd4960a9947.webp differ
diff --git a/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.jpg b/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.jpg
deleted file mode 100644
index a66fe8cd43..0000000000
Binary files a/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.jpg and /dev/null differ
diff --git a/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.webp b/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.webp
new file mode 100644
index 0000000000..724050247b
Binary files /dev/null and b/application/public/images/profiles/52c82d1c-b455-4572-aef1-0dd61b50b1d2.webp differ
diff --git a/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.jpg b/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.jpg
deleted file mode 100644
index 2cc2dec460..0000000000
Binary files a/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.jpg and /dev/null differ
diff --git a/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.webp b/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.webp
new file mode 100644
index 0000000000..d0ab1d62f4
Binary files /dev/null and b/application/public/images/profiles/538dbca6-85d6-434e-a1f4-b370d03dbb85.webp differ
diff --git a/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.jpg b/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.jpg
deleted file mode 100644
index ce19226b90..0000000000
Binary files a/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.jpg and /dev/null differ
diff --git a/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.webp b/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.webp
new file mode 100644
index 0000000000..02508e4cdc
Binary files /dev/null and b/application/public/images/profiles/5506d25e-f03b-497a-a883-6434aa160d0f.webp differ
diff --git a/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.jpg b/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.jpg
deleted file mode 100644
index 9a3ac1e9bb..0000000000
Binary files a/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.jpg and /dev/null differ
diff --git a/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.webp b/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.webp
new file mode 100644
index 0000000000..6e0c8b3764
Binary files /dev/null and b/application/public/images/profiles/5e071af0-e9a1-4c5c-859f-464c18bb7da9.webp differ
diff --git a/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.jpg b/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.jpg
deleted file mode 100644
index 30dfd53a3f..0000000000
Binary files a/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.jpg and /dev/null differ
diff --git a/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.webp b/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.webp
new file mode 100644
index 0000000000..9a656f230a
Binary files /dev/null and b/application/public/images/profiles/6931b54d-f07b-405d-80dc-17c09acebfa9.webp differ
diff --git a/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.jpg b/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.jpg
deleted file mode 100644
index 887c28b398..0000000000
Binary files a/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.jpg and /dev/null differ
diff --git a/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.webp b/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.webp
new file mode 100644
index 0000000000..a65d361b8f
Binary files /dev/null and b/application/public/images/profiles/7d7bf516-e05e-4a4f-95fa-0c73e7bd3f93.webp differ
diff --git a/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.jpg b/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.jpg
deleted file mode 100644
index 36f1107d67..0000000000
Binary files a/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.jpg and /dev/null differ
diff --git a/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.webp b/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.webp
new file mode 100644
index 0000000000..961b7611d7
Binary files /dev/null and b/application/public/images/profiles/84ba6fee-d167-43c4-8b10-d94caa923f48.webp differ
diff --git a/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.jpg b/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.jpg
deleted file mode 100644
index 16115798f4..0000000000
Binary files a/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.jpg and /dev/null differ
diff --git a/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.webp b/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.webp
new file mode 100644
index 0000000000..49b8c9b63f
Binary files /dev/null and b/application/public/images/profiles/a99e1112-f0a0-46a3-8e23-5d34c27898c0.webp differ
diff --git a/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.jpg b/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.jpg
deleted file mode 100644
index 65b3887c6d..0000000000
Binary files a/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.jpg and /dev/null differ
diff --git a/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.webp b/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.webp
new file mode 100644
index 0000000000..01a5c984ca
Binary files /dev/null and b/application/public/images/profiles/af98cd5f-b1a6-408c-a455-0970b3247e4c.webp differ
diff --git a/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.jpg b/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.jpg
deleted file mode 100644
index 8224e454c6..0000000000
Binary files a/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.jpg and /dev/null differ
diff --git a/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.webp b/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.webp
new file mode 100644
index 0000000000..39330e57e0
Binary files /dev/null and b/application/public/images/profiles/b2c256a3-296f-49e0-ba8b-101b55146956.webp differ
diff --git a/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.jpg b/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.jpg
deleted file mode 100644
index 42a6b2d415..0000000000
Binary files a/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.jpg and /dev/null differ
diff --git a/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.webp b/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.webp
new file mode 100644
index 0000000000..427c9bc8b8
Binary files /dev/null and b/application/public/images/profiles/c8939885-5dca-4132-b234-64a12c1861a5.webp differ
diff --git a/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.jpg b/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.jpg
deleted file mode 100644
index 069ef7f263..0000000000
Binary files a/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.jpg and /dev/null differ
diff --git a/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.webp b/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.webp
new file mode 100644
index 0000000000..199e3f928f
Binary files /dev/null and b/application/public/images/profiles/ca81e02a-11aa-4218-971d-c8bd8d9e67cf.webp differ
diff --git a/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.jpg b/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.jpg
deleted file mode 100644
index 53e1fada1a..0000000000
Binary files a/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.jpg and /dev/null differ
diff --git a/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.webp b/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.webp
new file mode 100644
index 0000000000..0f3a7624d0
Binary files /dev/null and b/application/public/images/profiles/cd5b31e5-0fb4-4b40-830d-3a22058b30cc.webp differ
diff --git a/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.jpg b/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.jpg
deleted file mode 100644
index 3a0b4f3fbe..0000000000
Binary files a/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.jpg and /dev/null differ
diff --git a/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.webp b/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.webp
new file mode 100644
index 0000000000..64c1fb8e04
Binary files /dev/null and b/application/public/images/profiles/cf145991-b2ff-4ef5-aeb5-dbc9d9eb51a0.webp differ
diff --git a/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.jpg b/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.jpg
deleted file mode 100644
index 4753c56a48..0000000000
Binary files a/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.jpg and /dev/null differ
diff --git a/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.webp b/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.webp
new file mode 100644
index 0000000000..d02014834b
Binary files /dev/null and b/application/public/images/profiles/dbe9b1f0-9822-4f77-9635-f9fd64e2b4e5.webp differ
diff --git a/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.jpg b/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.jpg
deleted file mode 100644
index 82c2cff091..0000000000
Binary files a/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.jpg and /dev/null differ
diff --git a/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.webp b/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.webp
new file mode 100644
index 0000000000..5a5a0c495d
Binary files /dev/null and b/application/public/images/profiles/ed0d327c-2ba5-4b23-8284-3e31f7a51d16.webp differ
diff --git a/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.jpg b/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.jpg
deleted file mode 100644
index 26f38db2ae..0000000000
Binary files a/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.jpg and /dev/null differ
diff --git a/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.webp b/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.webp
new file mode 100644
index 0000000000..9e4adfa673
Binary files /dev/null and b/application/public/images/profiles/f1f4c2c2-bf06-44b5-b43e-02a00d770242.webp differ
diff --git a/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.jpg b/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.jpg
deleted file mode 100644
index 6e361f141b..0000000000
Binary files a/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.jpg and /dev/null differ
diff --git a/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.webp b/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.webp
new file mode 100644
index 0000000000..e73eca17ae
Binary files /dev/null and b/application/public/images/profiles/f4619909-0f90-45dd-ada0-6c6305453a74.webp differ
diff --git a/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.jpg b/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.jpg
deleted file mode 100644
index 8477503ea7..0000000000
Binary files a/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.jpg and /dev/null differ
diff --git a/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.webp b/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.webp
new file mode 100644
index 0000000000..737bdf8c64
Binary files /dev/null and b/application/public/images/profiles/fd571d42-c471-47fd-846f-d3c1325685fd.webp differ
diff --git a/application/public/sounds/05333292-5786-4a1f-9046-6b4863da3286.mp3 b/application/public/sounds/05333292-5786-4a1f-9046-6b4863da3286.mp3
index 2d53b6deef..5f128601f2 100644
Binary files a/application/public/sounds/05333292-5786-4a1f-9046-6b4863da3286.mp3 and b/application/public/sounds/05333292-5786-4a1f-9046-6b4863da3286.mp3 differ
diff --git a/application/public/sounds/10b3358c-945f-428e-a7f1-1558f675ef3d.mp3 b/application/public/sounds/10b3358c-945f-428e-a7f1-1558f675ef3d.mp3
index 843f2c28ca..4941475564 100644
Binary files a/application/public/sounds/10b3358c-945f-428e-a7f1-1558f675ef3d.mp3 and b/application/public/sounds/10b3358c-945f-428e-a7f1-1558f675ef3d.mp3 differ
diff --git a/application/public/sounds/2174b434-fe47-4c6a-9f30-de4d4e4c7554.mp3 b/application/public/sounds/2174b434-fe47-4c6a-9f30-de4d4e4c7554.mp3
index 2723f9f4fe..23130ab857 100644
Binary files a/application/public/sounds/2174b434-fe47-4c6a-9f30-de4d4e4c7554.mp3 and b/application/public/sounds/2174b434-fe47-4c6a-9f30-de4d4e4c7554.mp3 differ
diff --git a/application/public/sounds/28604fdc-0adb-40b0-bd67-ed39d61f007d.mp3 b/application/public/sounds/28604fdc-0adb-40b0-bd67-ed39d61f007d.mp3
index cc40d09533..b06d7cdb00 100644
Binary files a/application/public/sounds/28604fdc-0adb-40b0-bd67-ed39d61f007d.mp3 and b/application/public/sounds/28604fdc-0adb-40b0-bd67-ed39d61f007d.mp3 differ
diff --git a/application/public/sounds/2abadebb-6fae-4db0-9dba-d3063d9cc2e1.mp3 b/application/public/sounds/2abadebb-6fae-4db0-9dba-d3063d9cc2e1.mp3
index 3c48b197c9..cceef4d002 100644
Binary files a/application/public/sounds/2abadebb-6fae-4db0-9dba-d3063d9cc2e1.mp3 and b/application/public/sounds/2abadebb-6fae-4db0-9dba-d3063d9cc2e1.mp3 differ
diff --git a/application/public/sounds/42232f2b-b7b2-46f8-a3de-1eefbfbbd8c2.mp3 b/application/public/sounds/42232f2b-b7b2-46f8-a3de-1eefbfbbd8c2.mp3
index 788cff70d2..776ee2d623 100644
Binary files a/application/public/sounds/42232f2b-b7b2-46f8-a3de-1eefbfbbd8c2.mp3 and b/application/public/sounds/42232f2b-b7b2-46f8-a3de-1eefbfbbd8c2.mp3 differ
diff --git a/application/public/sounds/49a3663a-1e66-4e22-83b8-3c43f181a254.mp3 b/application/public/sounds/49a3663a-1e66-4e22-83b8-3c43f181a254.mp3
index c3a2700a82..9d3d9f4872 100644
Binary files a/application/public/sounds/49a3663a-1e66-4e22-83b8-3c43f181a254.mp3 and b/application/public/sounds/49a3663a-1e66-4e22-83b8-3c43f181a254.mp3 differ
diff --git a/application/public/sounds/4ce92862-3d2d-47a4-975d-4b293173cec4.mp3 b/application/public/sounds/4ce92862-3d2d-47a4-975d-4b293173cec4.mp3
index f35972ed06..35364ccb28 100644
Binary files a/application/public/sounds/4ce92862-3d2d-47a4-975d-4b293173cec4.mp3 and b/application/public/sounds/4ce92862-3d2d-47a4-975d-4b293173cec4.mp3 differ
diff --git a/application/public/sounds/5352a4a1-6a47-445d-874d-6e08f811c4f4.mp3 b/application/public/sounds/5352a4a1-6a47-445d-874d-6e08f811c4f4.mp3
index c7d72cbe4b..56b06ea6ea 100644
Binary files a/application/public/sounds/5352a4a1-6a47-445d-874d-6e08f811c4f4.mp3 and b/application/public/sounds/5352a4a1-6a47-445d-874d-6e08f811c4f4.mp3 differ
diff --git a/application/public/sounds/56570f22-2db4-458c-981d-558021d2f648.mp3 b/application/public/sounds/56570f22-2db4-458c-981d-558021d2f648.mp3
index dfbfcb037c..dee079ccf7 100644
Binary files a/application/public/sounds/56570f22-2db4-458c-981d-558021d2f648.mp3 and b/application/public/sounds/56570f22-2db4-458c-981d-558021d2f648.mp3 differ
diff --git a/application/public/sounds/5a93be41-caab-4eec-9ac1-8b57c24ccbe2.mp3 b/application/public/sounds/5a93be41-caab-4eec-9ac1-8b57c24ccbe2.mp3
index 464803f8fd..3ed6398f96 100644
Binary files a/application/public/sounds/5a93be41-caab-4eec-9ac1-8b57c24ccbe2.mp3 and b/application/public/sounds/5a93be41-caab-4eec-9ac1-8b57c24ccbe2.mp3 differ
diff --git a/application/public/sounds/5d0cd8a0-805a-4fb8-940a-53d2dee9c87e.mp3 b/application/public/sounds/5d0cd8a0-805a-4fb8-940a-53d2dee9c87e.mp3
index 9bca9071f2..5685965012 100644
Binary files a/application/public/sounds/5d0cd8a0-805a-4fb8-940a-53d2dee9c87e.mp3 and b/application/public/sounds/5d0cd8a0-805a-4fb8-940a-53d2dee9c87e.mp3 differ
diff --git a/application/public/sounds/8bb8891c-40c1-4536-8eee-2ecdac298931.mp3 b/application/public/sounds/8bb8891c-40c1-4536-8eee-2ecdac298931.mp3
index 055ec8bd95..beb39ec8bb 100644
Binary files a/application/public/sounds/8bb8891c-40c1-4536-8eee-2ecdac298931.mp3 and b/application/public/sounds/8bb8891c-40c1-4536-8eee-2ecdac298931.mp3 differ
diff --git a/application/public/sounds/8ed91156-d15e-4a6a-87cc-87f2e8905fa3.mp3 b/application/public/sounds/8ed91156-d15e-4a6a-87cc-87f2e8905fa3.mp3
index b62abd6067..21feb050ee 100644
Binary files a/application/public/sounds/8ed91156-d15e-4a6a-87cc-87f2e8905fa3.mp3 and b/application/public/sounds/8ed91156-d15e-4a6a-87cc-87f2e8905fa3.mp3 differ
diff --git a/application/public/sounds/93b848fe-24c8-4597-a515-463a910f6ceb.mp3 b/application/public/sounds/93b848fe-24c8-4597-a515-463a910f6ceb.mp3
index 7ede9a957b..0727fb8f1b 100644
Binary files a/application/public/sounds/93b848fe-24c8-4597-a515-463a910f6ceb.mp3 and b/application/public/sounds/93b848fe-24c8-4597-a515-463a910f6ceb.mp3 differ
diff --git a/application/server/package.json b/application/server/package.json
index 9482575df7..7c9c1235dc 100644
--- a/application/server/package.json
+++ b/application/server/package.json
@@ -13,19 +13,27 @@
"seed:insert": "tsx ./scripts/insertSeeds.ts"
},
"dependencies": {
+ "@mlc-ai/web-llm": "0.2.80",
"@tsconfig/strictest": "2.0.8",
"@web-speed-hackathon-2026/server": "workspace:*",
"bcrypt": "6.0.0",
+ "bluebird": "3.7.2",
"body-parser": "2.2.0",
+ "common-tags": "1.8.2",
"connect-history-api-fallback": "2.0.0",
"express": "5.1.0",
"express-session": "1.18.2",
"file-type": "21.1.1",
"http-errors": "2.0.0",
+ "json-repair-js": "1.0.0",
+ "kuromoji": "0.1.2",
+ "langs": "2.0.0",
"music-metadata": "11.10.3",
+ "negaposi-analyzer-ja": "1.0.1",
"sequelize": "6.37.7",
"serve-static": "2.2.0",
"sqlite3": "5.1.7",
+ "tiny-invariant": "1.3.3",
"tsx": "4.20.6",
"uuid": "13.0.0",
"ws": "8.18.3"
diff --git a/application/server/src/routes/api.ts b/application/server/src/routes/api.ts
index e6a57a3b16..c117ebbe2b 100644
--- a/application/server/src/routes/api.ts
+++ b/application/server/src/routes/api.ts
@@ -12,6 +12,7 @@ import { postRouter } from "@web-speed-hackathon-2026/server/src/routes/api/post
import { searchRouter } from "@web-speed-hackathon-2026/server/src/routes/api/search";
import { soundRouter } from "@web-speed-hackathon-2026/server/src/routes/api/sound";
import { userRouter } from "@web-speed-hackathon-2026/server/src/routes/api/user";
+import { translateRouter } from "@web-speed-hackathon-2026/server/src/routes/api/translate";
export const apiRouter = Router();
@@ -25,6 +26,7 @@ apiRouter.use(imageRouter);
apiRouter.use(soundRouter);
apiRouter.use(authRouter);
apiRouter.use(crokRouter);
+apiRouter.use(translateRouter);
apiRouter.use(async (err: Error, _req: Request, _res: Response, _next: NextFunction) => {
if (err instanceof ValidationError) {
diff --git a/application/server/src/routes/api/image.ts b/application/server/src/routes/api/image.ts
index d5c23e209d..56575240a5 100644
--- a/application/server/src/routes/api/image.ts
+++ b/application/server/src/routes/api/image.ts
@@ -9,7 +9,7 @@ import { v4 as uuidv4 } from "uuid";
import { UPLOAD_PATH } from "@web-speed-hackathon-2026/server/src/paths";
// 変換した画像の拡張子
-const EXTENSION = "jpg";
+const EXTENSION = "jpg"; // 後で確認
export const imageRouter = Router();
diff --git a/application/server/src/routes/api/translate.ts b/application/server/src/routes/api/translate.ts
new file mode 100644
index 0000000000..a803792dca
--- /dev/null
+++ b/application/server/src/routes/api/translate.ts
@@ -0,0 +1,45 @@
+import { Router } from "express";
+
+import { loads } from "json-repair-js";
+import { CreateMLCEngine } from "@mlc-ai/web-llm";
+import { stripIndents } from "common-tags";
+import invariant from "tiny-invariant";
+
+
+export const translateRouter = Router();
+
+translateRouter.post("/translate", async (req, res) => {
+ const sourceLang = req.body.sourceLanguage;
+ const targetLang = req.body.targetLanguage;
+
+ const engine = await CreateMLCEngine("gemma-2-2b-jpn-it-q4f16_1-MLC");
+
+ const reply = await engine.chat.completions.create({
+ messages: [
+ {
+ role: "system",
+ content: stripIndents`
+ You are a professional translator. Translate the following text from ${sourceLang.name} to ${targetLang.name}.
+ Provide as JSON only in the format: { "result": "{{translated text}}" } without any additional explanations.
+ `,
+ },
+ {
+ role: "user",
+ content: String(req.query["text"]),
+ },
+ ],
+ response_format: { type: "json_object" },
+ temperature: 0,
+ });
+
+ const content = reply.choices[0]!.message.content;
+ invariant(content, "No content in the reply from the translation engine.");
+
+ const parsed = loads(content);
+ invariant(
+ parsed != null && "result" in parsed,
+ "The translation result is missing in the reply.",
+ );
+
+ return res.status(200).type("application/json").send({ text: String(parsed.result) });
+});
diff --git a/scoring-tool/src/calculate.ts b/scoring-tool/src/calculate.ts
index 6d55676316..59dbba6ddc 100644
--- a/scoring-tool/src/calculate.ts
+++ b/scoring-tool/src/calculate.ts
@@ -1,6 +1,6 @@
import { setTimeout } from "node:timers/promises";
-import _ from "lodash";
+import { sum, map, round } from 'es-toolkit/compat';
import mergeErrorCause from "merge-error-cause";
import type * as playwright from "playwright";
import type * as puppeteer from "puppeteer";
@@ -214,8 +214,8 @@ export async function* calculate({
yield result;
}
- const landingTotalScore = _.round(
- _.sum(_.map(landingResults, ({ scoreX100 }) => scoreX100)) / 100,
+ const landingTotalScore = round(
+ sum(map(landingResults, ({ scoreX100 }) => scoreX100)) / 100,
2,
);
diff --git a/scoring-tool/src/index.ts b/scoring-tool/src/index.ts
index 8e781abc2e..9dc8eb03a0 100644
--- a/scoring-tool/src/index.ts
+++ b/scoring-tool/src/index.ts
@@ -2,7 +2,7 @@ import * as github from "@actions/github";
import { defineCommand, runMain } from "citty";
import { stripIndents } from "common-tags";
import debug from "debug";
-import _ from "lodash";
+import { sum, map, round } from 'es-toolkit/compat';
import { inject } from "regexparam";
import { calculate, TARGET_NAME_LIST } from "./calculate";
@@ -291,8 +291,8 @@ const command = defineCommand({
}
{
- const totalScore = _.round(_.sum(_.map(results, ({ scoreX100 }) => scoreX100)) / 100, 2);
- const totalMaxScore = _.sum(_.map(results, ({ target }) => target.maxScore));
+ const totalScore = round(sum(map(results, ({ scoreX100 }) => scoreX100)) / 100, 2);
+ const totalMaxScore = sum(map(results, ({ target }) => target.maxScore));
const { rank } = await sendScoreToDashboard(totalScore);