Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
a3dece1
Fix app workflows
kqito Mar 22, 2025
01f8409
Fix version of kqito/manage-heroku-review-app temporary
kqito Mar 22, 2025
03950e3
Pin version of kqito/manage-heroku-review-app to specific commit hash
kqito Mar 22, 2025
c3e35b2
webpack production mode
kimurash Mar 23, 2025
067a418
webpack devtool source-map
kimurash Mar 23, 2025
985bb3f
Remove limit chunk count plugin
kimurash Mar 23, 2025
b31b360
webpack output chunk format module
kimurash Mar 23, 2025
2a7231a
Ignore stats.json
kimurash Mar 23, 2025
ed720ef
Remove @ffmpeg/ffmpeg
kimurash Mar 24, 2025
777a8c1
Add seek thumbnail preview images
kimurash Mar 24, 2025
454ed0e
Use only necessary icon
kimurash Mar 24, 2025
d540da5
Disable react/jsx-sort-props
kimurash Mar 24, 2025
b06918c
Use only necessary material symbols icon
kimurash Mar 24, 2025
dd4ca4e
Remove p-min-delay
kimurash Mar 24, 2025
ee8c126
Remove renderToString
kimurash Mar 25, 2025
4af55be
Add root element to SSR template
kimurash Mar 28, 2025
02365d1
Only select necessary column
kimurash Mar 28, 2025
ca9e1a0
Remove unnecessary seek thumbnail image
kimurash Mar 29, 2025
e613ff2
Use loader data in episode page
kimurash Mar 29, 2025
c186156
Remove unnecessary polyfill
kimurash Mar 29, 2025
a06ce03
Remove cache control hook
kimurash Mar 29, 2025
685c4e3
Not subscribe pointer
kimurash Mar 29, 2025
ad5be4a
Remove lodash
kimurash Apr 4, 2025
2826f2c
Replace luxon with dayjs
kimurash Apr 4, 2025
471051a
Remove luxon
kimurash Apr 4, 2025
1022826
Remove unused player package
kimurash Apr 4, 2025
70029a2
Change schema import path from API to OpenAPI
kimurash Apr 5, 2025
ee3c8fd
Enable webpack cache directory
kimurash Apr 5, 2025
d2266c7
Abolish frontend validation
kimurash Apr 5, 2025
a2528dc
type import
kimurash Apr 5, 2025
3fd7cfd
Remove root element from SSR template
kimurash Apr 5, 2025
6b99bb2
Remove zod validation
kimurash Apr 5, 2025
76ceedc
Replace GIF with MP4 video
kimurash Apr 5, 2025
2856096
Remove EXT-X-DATERANGE metadata
kimurash Apr 5, 2025
888278b
Install eslint-plugin-regexp
kimurash Apr 5, 2025
68ff9dc
Avoid ReDoS
kimurash Apr 5, 2025
0b6df67
Compress fastify response
kimurash Apr 6, 2025
56dd3b8
Remove unocss runtime
kimurash Apr 6, 2025
57d7ef1
Add aspect ratio to img tag
kimurash Apr 6, 2025
8c7930c
Remove react-ellipsis-component
kimurash Apr 12, 2025
9ee875e
Remove AspectRatio component
kimurash Apr 12, 2025
6aa9ff7
Remove Hoverable component
kimurash Apr 12, 2025
cbb507e
Fix percentage calc to handle element zero width
kimurash Apr 12, 2025
fdfd103
Replace scroll snap hooks with css
kimurash Apr 12, 2025
275ad30
Pass 認証-新規会員登録---ログアウト---ログイン
kimurash Apr 13, 2025
633ac93
Pass 全画面-シリーズページ
kimurash Apr 13, 2025
041bef9
Comment out lazy loading and async decoding attr from image tag
kimurash Apr 13, 2025
c9a4000
Pass 全画面-プログラム
kimurash Apr 13, 2025
b2afe71
Use loader modules in episode page
kimurash Apr 13, 2025
3d037b2
Replace svg icon with preset icons
kimurash Apr 13, 2025
f35eeb1
Update premium episode page snapshot
kimurash Apr 13, 2025
550f8a8
Remove debug log
kimurash Apr 13, 2025
8f92156
Remove Heroku review app workflow
kimurash Apr 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,6 @@
"overrides": {
"es-abstract": "~1.23.9",
"m3u8-parser>@babel/runtime": "-"
},
"patchedDependencies": {
"shaka-player": "patches/shaka-player.patch"
}
},
"wireit": {
Expand Down
1,119 changes: 792 additions & 327 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

Binary file removed public/animations/001.gif
Binary file not shown.
Binary file added public/animations/001.mp4
Binary file not shown.
Binary file added public/images/thumbnails/caminandes2/preview.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/thumbnails/dailydweebs/preview.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/thumbnails/glasshalf/preview.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/images/thumbnails/wing-it/preview.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions workspaces/client/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
stats.json
21 changes: 21 additions & 0 deletions workspaces/client/analyze_bundle.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/bin/bash

# デフォルト値の設定
DEFALT_SIZE="parsed"

# オプションの処理
while getopts "s:" opt; do
case $opt in
s)
DEFALT_SIZE="$OPTARG"
;;
\?)
echo "無効なオプション: -$OPTARG" >&2
exit 1
;;
esac
done

pnpm run build
npx webpack --profile --json > stats.json
npx webpack-bundle-analyzer stats.json dist -s "$DEFALT_SIZE"
4 changes: 4 additions & 0 deletions workspaces/client/eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,9 @@ export default [
...configs,
{
ignores: ['dist/*', '.wireit/*'],
rules: {
"react/jsx-sort-props": "off",
"regexp/no-unused-capturing-group": "off",
}
},
];
25 changes: 9 additions & 16 deletions workspaces/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
"@better-fetch/fetch": "1.1.15",
"@dhmk/zustand-lens": "5.0.0",
"@epic-web/restore-scroll": "1.1.1",
"@ffmpeg/ffmpeg": "0.12.15",
"@headlessui/react": "2.2.0",
"@radix-ui/react-slider": "1.2.3",
"@standard-schema/spec": "1.0.0",
Expand All @@ -22,13 +21,9 @@
"classnames": "2.5.1",
"final-form": "4.20.10",
"immer": "10.1.1",
"lodash": "4.17.21",
"luxon": "3.5.0",
"m3u8-parser": "7.2.0",
"p-min-delay": "4.0.2",
"react": "19.0.0",
"react-dom": "19.0.0",
"react-ellipsis-component": "1.1.11",
"react-final-form": "6.5.9",
"react-flip-toolkit": "7.2.4",
"react-router": "7.0.2",
Expand All @@ -40,8 +35,6 @@
"use-callback-ref": "1.3.3",
"use-sync-external-store": "1.4.0",
"valibot": "1.0.0-rc.3",
"view-transitions-polyfill": "1.0.3",
"zod": "3.24.1",
"zustand": "5.0.3",
"zustand-di": "0.0.16"
},
Expand All @@ -50,8 +43,6 @@
"@babel/preset-env": "7.26.0",
"@babel/preset-react": "7.25.9",
"@babel/preset-typescript": "7.26.0",
"@ffmpeg/core": "0.12.10",
"@ffmpeg/util": "0.12.2",
"@iconify/json": "2.2.317",
"@iconify/types": "2.0.0",
"@types/lodash": "4.17.16",
Expand All @@ -60,18 +51,19 @@
"@types/react": "19.0.1",
"@types/react-dom": "19.0.2",
"@types/wicg-task-scheduling": "2024.1.0",
"@unocss/preset-icons": "66.1.0-beta.5",
"@unocss/preset-wind3": "66.1.0-beta.5",
"@unocss/reset": "66.1.0-beta.5",
"@unocss/runtime": "66.1.0-beta.5",
"@unocss/preset-wind3": "66.1.0-beta.10",
"@unocss/reset": "66.1.0-beta.10",
"@unocss/webpack": "66.1.0-beta.10",
"@wsh-2025/configs": "workspace:*",
"arraybuffer-loader": "1.0.8",
"babel-loader": "9.2.1",
"core-js": "3.41.0",
"css-loader": "7.1.2",
"dayjs": "1.11.13",
"hls.js": "1.5.17",
"shaka-player": "4.12.5",
"mini-css-extract-plugin": "2.9.2",
"style-loader": "4.0.0",
"typescript": "5.7.2",
"video.js": "8.21.0",
"unocss": "66.1.0-beta.10",
"webpack": "5.96.1",
"webpack-bundle-analyzer": "4.10.2",
"webpack-cli": "5.1.4",
Expand All @@ -85,6 +77,7 @@
"../../pnpm-lock.yaml",
"../schema/src/**/*",
"./src/**/*",
"./uno.config.ts",
"./webpack.config.mjs"
],
"output": [
Expand Down
1 change: 1 addition & 0 deletions workspaces/client/src/app/Document.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export const Document = () => {
<head>
<meta charSet="UTF-8" />
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
<link href="/public/main.css" type="text/css" rel="stylesheet" />
<script src="/public/main.js"></script>
</head>
<body className="size-full bg-[#000000] text-[#ffffff]">
Expand Down
31 changes: 8 additions & 23 deletions workspaces/client/src/app/createRoutes.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import lazy from 'p-min-delay';
import { RouteObject } from 'react-router';

import { Document, prefetch } from '@wsh-2025/client/src/app/Document';
Expand All @@ -11,10 +10,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
{
index: true,
async lazy() {
const { HomePage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/home/components/HomePage'),
1000,
);
const { HomePage, prefetch } = await import('@wsh-2025/client/src/pages/home/components/HomePage');
return {
Component: HomePage,
async loader() {
Expand All @@ -25,10 +21,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
},
{
async lazy() {
const { EpisodePage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/episode/components/EpisodePage'),
1000,
);
const { EpisodePage, prefetch } = await import('@wsh-2025/client/src/pages/episode/components/EpisodePage');
return {
Component: EpisodePage,
async loader({ params }) {
Expand All @@ -40,10 +33,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
},
{
async lazy() {
const { prefetch, ProgramPage } = await lazy(
import('@wsh-2025/client/src/pages/program/components/ProgramPage'),
1000,
);
const { prefetch, ProgramPage } = await import('@wsh-2025/client/src/pages/program/components/ProgramPage');
return {
Component: ProgramPage,
async loader({ params }) {
Expand All @@ -55,10 +45,7 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
},
{
async lazy() {
const { prefetch, SeriesPage } = await lazy(
import('@wsh-2025/client/src/pages/series/components/SeriesPage'),
1000,
);
const { prefetch, SeriesPage } = await import('@wsh-2025/client/src/pages/series/components/SeriesPage');
return {
Component: SeriesPage,
async loader({ params }) {
Expand All @@ -70,9 +57,8 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
},
{
async lazy() {
const { prefetch, TimetablePage } = await lazy(
import('@wsh-2025/client/src/pages/timetable/components/TimetablePage'),
1000,
const { prefetch, TimetablePage } = await import(
'@wsh-2025/client/src/pages/timetable/components/TimetablePage'
);
return {
Component: TimetablePage,
Expand All @@ -85,9 +71,8 @@ export function createRoutes(store: ReturnType<typeof createStore>): RouteObject
},
{
async lazy() {
const { NotFoundPage, prefetch } = await lazy(
import('@wsh-2025/client/src/pages/not_found/components/NotFoundPage'),
1000,
const { NotFoundPage, prefetch } = await import(
'@wsh-2025/client/src/pages/not_found/components/NotFoundPage'
);
return {
Component: NotFoundPage,
Expand Down
10 changes: 2 additions & 8 deletions workspaces/client/src/app/createStore.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { withLenses } from '@dhmk/zustand-lens';
import _ from 'lodash';
import { createStore as createZustandStore } from 'zustand/vanilla';

import { createAuthStoreSlice } from '@wsh-2025/client/src/features/auth/stores/createAuthStoreSlice';
Expand All @@ -14,11 +13,7 @@ import { createEpisodePageStoreSlice } from '@wsh-2025/client/src/pages/episode/
import { createProgramPageStoreSlice } from '@wsh-2025/client/src/pages/program/stores/createProgramPageStoreSlice';
import { createTimetablePageStoreSlice } from '@wsh-2025/client/src/pages/timetable/stores/createTimetablePageStoreSlice';

interface Props {
hydrationData?: unknown;
}

export const createStore = ({ hydrationData }: Props) => {
export const createStore = () => {
const store = createZustandStore(
withLenses(() => ({
features: {
Expand All @@ -38,8 +33,7 @@ export const createStore = ({ hydrationData }: Props) => {
},
})),
);

store.setState((s) => _.merge(s, hydrationData));
store.setState((s) => s);

return store;
};
33 changes: 23 additions & 10 deletions workspaces/client/src/features/auth/components/SignInDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { BetterFetchError } from '@better-fetch/fetch';
import { FORM_ERROR } from 'final-form';
import { useId } from 'react';
import { Field, Form } from 'react-final-form';
import { z } from 'zod';
import * as v from 'valibot';

import { useAuthActions } from '@wsh-2025/client/src/features/auth/hooks/useAuthActions';
import { isValidEmail } from '@wsh-2025/client/src/features/auth/logics/isValidEmail';
Expand Down Expand Up @@ -54,16 +54,29 @@ export const SignInDialog = ({ isOpen, onClose, onOpenSignUp }: Props) => {

<Form
validate={(values) => {
const schema = z.object({
email: z
.string({ required_error: 'メールアドレスを入力してください' })
.and(z.custom(isValidEmail, { message: 'メールアドレスが正しくありません' })),
password: z
.string({ required_error: 'パスワードを入力してください' })
.and(z.custom(isValidPassword, { message: 'パスワードが正しくありません' })),
const schema = v.object({
email: v.optional(
v.pipe(
v.string('メールアドレスを入力してください'),
v.minLength(1, 'メールアドレスを入力してください'),
v.check(isValidEmail, 'メールアドレスが正しくありません'),
),
),
password: v.optional(
v.pipe(
v.string('パスワードを入力してください'),
v.minLength(1, 'パスワードを入力してください'),
v.check(isValidPassword, 'パスワードが正しくありません'),
),
),
});
const result = schema.safeParse(values);
return result.success ? undefined : result.error.formErrors.fieldErrors;
const result = v.safeParse(schema, values);
if (result.success) {
return undefined;
} else {
const errors = v.flatten<typeof schema>(result.issues);
return errors.nested;
}
}}
onSubmit={onSubmit}
>
Expand Down
33 changes: 23 additions & 10 deletions workspaces/client/src/features/auth/components/SignUpDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { BetterFetchError } from '@better-fetch/fetch';
import { FORM_ERROR } from 'final-form';
import { useId } from 'react';
import { Field, Form } from 'react-final-form';
import { z } from 'zod';
import * as v from 'valibot';

import { useAuthActions } from '@wsh-2025/client/src/features/auth/hooks/useAuthActions';
import { isValidEmail } from '@wsh-2025/client/src/features/auth/logics/isValidEmail';
Expand Down Expand Up @@ -54,16 +54,29 @@ export const SignUpDialog = ({ isOpen, onClose, onOpenSignIn }: Props) => {

<Form
validate={(values) => {
const schema = z.object({
email: z
.string({ required_error: 'メールアドレスを入力してください' })
.and(z.custom(isValidEmail, { message: 'メールアドレスが正しくありません' })),
password: z
.string({ required_error: 'パスワードを入力してください' })
.and(z.custom(isValidPassword, { message: 'パスワードが正しくありません' })),
const schema = v.object({
email: v.optional(
v.pipe(
v.string('メールアドレスを入力してください'),
v.minLength(1, 'メールアドレスを入力してください'),
v.check(isValidEmail, 'メールアドレスが正しくありません'),
),
),
password: v.optional(
v.pipe(
v.string('パスワードを入力してください'),
v.minLength(1, 'パスワードを入力してください'),
v.check(isValidPassword, 'パスワードが正しくありません'),
),
),
});
const result = schema.safeParse(values);
return result.success ? undefined : result.error.formErrors.fieldErrors;
const result = v.safeParse(schema, values);
if (result.success) {
return undefined;
} else {
const errors = v.flatten<typeof schema>(result.issues);
return errors.nested;
}
}}
onSubmit={onSubmit}
>
Expand Down
17 changes: 16 additions & 1 deletion workspaces/client/src/features/auth/logics/isValidEmail.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
export const isValidEmail = (email: string): boolean => {
return /^([A-Z0-9_+-]+\.?)*[A-Z0-9_+-]@([A-Z0-9][A-Z0-9-]*\.)+[A-Z]{2,}$/i.test(email);
const parts = email.split('@');
if (parts.length !== 2) {
return false;
}

const localPart = parts[0] as string;
const domainPart = parts[1] as string;

if (!/^[\w+-]+(?:\.[\w+-]+)*$/.test(localPart)) {
return false;
}
if (!/^[A-Z0-9-]+(?:\.[A-Z0-9-]+)*\.[A-Z]{2,}$/i.test(domainPart)) {
return false;
}

return true;
};
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export const isValidPassword = (password: string): boolean => {
return /^([A-Z0-9_+-]|[A-Z0-9_+-]){3,}$/i.test(password);
return /^[\w+-]{3,}$/.test(password);
};
Loading