diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f974b29 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true, + "[markdown]": { + "editor.formatOnSave": false + }, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.fixAll.stylelint": "explicit" + }, + "eslint.validate": ["html", "javascriptreact", "typescriptreact"], + "css.validate": false, + "scss.validate": false +} diff --git a/view/.eslintrc.json b/view/.eslintrc.json index bffb357..331e282 100644 --- a/view/.eslintrc.json +++ b/view/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": "next/core-web-vitals" + "extends": ["next", "next/core-web-vitals", "prettier", "next/babel"] } diff --git a/view/.prettierrc.mjs b/view/.prettierrc.mjs new file mode 100644 index 0000000..4d31dde --- /dev/null +++ b/view/.prettierrc.mjs @@ -0,0 +1,22 @@ +/** @type {import('next').NextConfig} */ + +const prettierConfig = { + plugins: ["prettier-plugin-tailwindcss"], + printWidth: 100, + tabWidth: 2, + useTabs: false, + semi: true, + singleQuote: false, + quoteProps: "as-needed", + jsxSingleQuote: false, + trailingComma: "es5", + bracketSpacing: true, + bracketSameLine: false, + arrowParens: "always", + proseWrap: "preserve", + htmlWhitespaceSensitivity: "css", + endOfLine: "lf", + embeddedLanguageFormatting: "off", +}; + +export default prettierConfig; diff --git a/view/package.json b/view/package.json index 6a537e9..3c475d0 100644 --- a/view/package.json +++ b/view/package.json @@ -30,7 +30,10 @@ "autoprefixer": "^10.0.1", "eslint": "^8", "eslint-config-next": "14.1.0", + "eslint-config-prettier": "^9.1.0", "postcss": "^8", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.12", "tailwindcss": "^3.3.0", "typescript": "^5" }, diff --git a/view/src/app/create/page.tsx b/view/src/app/create/page.tsx index ec55258..b36e6aa 100644 --- a/view/src/app/create/page.tsx +++ b/view/src/app/create/page.tsx @@ -27,14 +27,10 @@ export default function Home() { }, }); - const onSubmit: SubmitHandler = async ( - data: PlayerCarInput - ) => { + const onSubmit: SubmitHandler = async (data: PlayerCarInput) => { try { setSubmit(true); - const responseJson: PlayerCarRes | false = await getPlayerCarDataFromGpt( - data - ); + const responseJson: PlayerCarRes | false = await getPlayerCarDataFromGpt(data); if (responseJson) { await getResponseFromGpt(responseJson); router.push("/create/result"); @@ -55,9 +51,9 @@ export default function Home() { return (
{submit && } -
+
-
+
announcer - +

これからレースだ!

君の車を作製しよう!

-
-
+
+

これからChatGPに出場する車を

ChatGPTに作成してもらおう!

@@ -83,27 +79,27 @@ export default function Home() {

君の言葉で決まるよ!

- +
-
+
入力欄
-
+
{errors.text && ( -
+
20文字以内で入力してください
)} diff --git a/view/src/app/create/result/page.tsx b/view/src/app/create/result/page.tsx index ab80432..ada34ff 100644 --- a/view/src/app/create/result/page.tsx +++ b/view/src/app/create/result/page.tsx @@ -50,33 +50,33 @@ export default function Home() { return (
-
-
-
+
+
+

{carInstruction}

- +

俺は、{carName}

今日は、{carFortune}

-
- -
+
+ +
{PLAYER_CAR_IMAGE}
-
+
-
+
-
+
enemy0
-
+
+
scene -
-
-
+
+
+
-
- +
+ {errors.event && (
-
+
20文字以内で入力してください
)} -
+
diff --git a/view/src/app/race/Progress.tsx b/view/src/app/race/Progress.tsx index b31d6a0..ec21166 100644 --- a/view/src/app/race/Progress.tsx +++ b/view/src/app/race/Progress.tsx @@ -13,24 +13,24 @@ export function Progress({ loader, order, text, carImages, click }: ProgProps) { }; return ( -
+
scene -
-
-
-

{text}

+
+
+
+

{text}

-
+
@@ -39,21 +39,21 @@ export function Progress({ loader, order, text, carImages, click }: ProgProps) {
{loader ? ( -
-
- +
+
+ order
-
-
+
+
-
-
+
+
enemy1
-
+
enemy2
-
+
enemy3
) : ( -
- Loading -
+
Loading
)}
); diff --git a/view/src/app/race/layout.tsx b/view/src/app/race/layout.tsx index 43e1400..a3a6d01 100644 --- a/view/src/app/race/layout.tsx +++ b/view/src/app/race/layout.tsx @@ -7,9 +7,9 @@ export default function RaceLayout({ }>) { return (
-
+
announcer +

これからスタートだ!

あなたはどうスタートする?

); } else if (scene === 1) { return ( -
+

現在{order}位!レース中盤だ!

カーブが目の前にある!

あなたはどうする?

@@ -30,7 +30,7 @@ export function Messages({ scene, order }: Props) { ); } else if (scene === 2) { return ( -
+

現在{order}位!レース終盤だ!

目の前には最後の直線...

あなたはどうする?

@@ -38,7 +38,7 @@ export function Messages({ scene, order }: Props) { ); } else { return ( -
+

予期しないエラーが発生しています。

下のボタンからスタートに戻ってください

diff --git a/view/src/app/race/page.tsx b/view/src/app/race/page.tsx index 0518e54..174e011 100644 --- a/view/src/app/race/page.tsx +++ b/view/src/app/race/page.tsx @@ -8,11 +8,7 @@ import { SubmitProps, OrderedImages, RaceInfoRes } from "./type"; import { RaceData, RaceEndData } from "@/app/race/type"; import { getRaceDataFromGpt, getEndDataFromGpt } from "@/lib/race/action"; import { Loading } from "@/components/Loading"; -import { - RACE_CAR_IMAGES, - RACE_RESPONSE_DATA, - GENERATED_TEXT, -} from "@/lib/const"; +import { RACE_CAR_IMAGES, RACE_RESPONSE_DATA, GENERATED_TEXT } from "@/lib/const"; import { generateRaceRequestBody, generateRaceEndRequestBody, @@ -94,12 +90,7 @@ export default function Home() { return (
{submit && } - +
); } else diff --git a/view/src/app/race/type.ts b/view/src/app/race/type.ts index d161e96..1aedcf8 100644 --- a/view/src/app/race/type.ts +++ b/view/src/app/race/type.ts @@ -1,6 +1,4 @@ import { SubmitHandler } from "react-hook-form"; -import { PlayerCarRes } from "@/app/create/type"; - import { GENERATED_TEXT, FIRST_PLACE, diff --git a/view/src/components/Loading.tsx b/view/src/components/Loading.tsx index 0c53dad..d065fc3 100644 --- a/view/src/components/Loading.tsx +++ b/view/src/components/Loading.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; export function Loading() { return ( -
+
loading
-
+

ChatGPTの生成は時間がかかります!

少々お待ちください。

diff --git a/view/src/components/ui/button.tsx b/view/src/components/ui/button.tsx index 0ba4277..ec71848 100644 --- a/view/src/components/ui/button.tsx +++ b/view/src/components/ui/button.tsx @@ -1,8 +1,8 @@ -import * as React from "react" -import { Slot } from "@radix-ui/react-slot" -import { cva, type VariantProps } from "class-variance-authority" +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; const buttonVariants = cva( "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", @@ -10,12 +10,9 @@ const buttonVariants = cva( variants: { variant: { default: "bg-primary text-primary-foreground hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground hover:bg-destructive/90", - outline: - "border border-input bg-background hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground hover:bg-secondary/80", + destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", ghost: "hover:bg-accent hover:text-accent-foreground", link: "text-primary underline-offset-4 hover:underline", }, @@ -31,26 +28,22 @@ const buttonVariants = cva( size: "default", }, } -) +); export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { - asChild?: boolean + asChild?: boolean; } const Button = React.forwardRef( ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button" + const Comp = asChild ? Slot : "button"; return ( - - ) + + ); } -) -Button.displayName = "Button" +); +Button.displayName = "Button"; -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/view/src/components/ui/card.tsx b/view/src/components/ui/card.tsx index afa13ec..b81ed0e 100644 --- a/view/src/components/ui/card.tsx +++ b/view/src/components/ui/card.tsx @@ -1,79 +1,56 @@ -import * as React from "react" - -import { cn } from "@/lib/utils" - -const Card = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -Card.displayName = "Card" - -const CardHeader = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardHeader.displayName = "CardHeader" - -const CardTitle = React.forwardRef< - HTMLParagraphElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardTitle.displayName = "CardTitle" +import * as React from "react"; + +import { cn } from "@/lib/utils"; + +const Card = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ) +); +Card.displayName = "Card"; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ) +); +CardHeader.displayName = "CardHeader"; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ) +); +CardTitle.displayName = "CardTitle"; const CardDescription = React.forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -

-)) -CardDescription.displayName = "CardDescription" - -const CardContent = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -

-)) -CardContent.displayName = "CardContent" - -const CardFooter = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes ->(({ className, ...props }, ref) => ( -
-)) -CardFooter.displayName = "CardFooter" - -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } +

+)); +CardDescription.displayName = "CardDescription"; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) => ( +

+ ) +); +CardContent.displayName = "CardContent"; + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ) +); +CardFooter.displayName = "CardFooter"; + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; diff --git a/view/src/components/ui/textarea.tsx b/view/src/components/ui/textarea.tsx index 9f9a6dc..af01a47 100644 --- a/view/src/components/ui/textarea.tsx +++ b/view/src/components/ui/textarea.tsx @@ -1,9 +1,8 @@ -import * as React from "react" +import * as React from "react"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; -export interface TextareaProps - extends React.TextareaHTMLAttributes {} +export interface TextareaProps extends React.TextareaHTMLAttributes {} const Textarea = React.forwardRef( ({ className, ...props }, ref) => { @@ -16,9 +15,9 @@ const Textarea = React.forwardRef( ref={ref} {...props} /> - ) + ); } -) -Textarea.displayName = "Textarea" +); +Textarea.displayName = "Textarea"; -export { Textarea } +export { Textarea }; diff --git a/view/src/lib/race/generateRequestBody.ts b/view/src/lib/race/generateRequestBody.ts index 1a25f4d..33a82a8 100644 --- a/view/src/lib/race/generateRequestBody.ts +++ b/view/src/lib/race/generateRequestBody.ts @@ -31,8 +31,7 @@ export const generateRaceEndRequestBody = (event: string) => { if (playerCar === null) { throw new Error("Player Car Data is not found."); } - const playerCarInstruction: string = - JSON.parse(playerCar)[PLAYER_CAR_INSTRUCTION]; + const playerCarInstruction: string = JSON.parse(playerCar)[PLAYER_CAR_INSTRUCTION]; const playerCarLuck: number = JSON.parse(playerCar)[PLAYER_CAR_LUCK]; const requestBody: RaceEndData = { ...raceRequestBody, @@ -91,12 +90,7 @@ const getCarInstruction = (carName: string) => { const enemyCar0 = localStorage.getItem(ENEMY_CAR + "_0"); const enemyCar1 = localStorage.getItem(ENEMY_CAR + "_1"); const enemyCar2 = localStorage.getItem(ENEMY_CAR + "_2"); - if ( - playerCarName === null || - enemyCar0 === null || - enemyCar1 === null || - enemyCar2 === null - ) { + if (playerCarName === null || enemyCar0 === null || enemyCar1 === null || enemyCar2 === null) { throw new Error("Player Car or Enemy Car Data is not found."); } const enemyCarName0: string = JSON.parse(enemyCar0)[ENEMY_CAR_NAME]; @@ -115,10 +109,10 @@ const getCarInstruction = (carName: string) => { const getResponseJson = () => { const responseJson = localStorage.getItem(RACE_RESPONSE_DATA); - console.log("Get responseJson",responseJson) + console.log("Get responseJson", responseJson); if (responseJson === null) { // 何もない場合は、仮のデータを返却する - console.log("Generate Dummy ResponseJson") + console.log("Generate Dummy ResponseJson"); const dummyResponseJson = generateDummyResponseJson(); localStorage.setItem(RACE_RESPONSE_DATA, JSON.stringify(dummyResponseJson)); return dummyResponseJson; @@ -136,12 +130,7 @@ export const generateDummyResponseJson = () => { const enemyCar0 = localStorage.getItem(ENEMY_CAR + "_0"); const enemyCar1 = localStorage.getItem(ENEMY_CAR + "_1"); const enemyCar2 = localStorage.getItem(ENEMY_CAR + "_2"); - if ( - playerCarName === null || - enemyCar0 === null || - enemyCar1 === null || - enemyCar2 === null - ) { + if (playerCarName === null || enemyCar0 === null || enemyCar1 === null || enemyCar2 === null) { throw new Error("Player Car or Enemy Car Data is not found."); } const enemyCarName0: string = JSON.parse(enemyCar0)[ENEMY_CAR_NAME]; diff --git a/view/src/lib/race/returnOrderImage.ts b/view/src/lib/race/returnOrderImage.ts index 28202a3..98f2b1f 100644 --- a/view/src/lib/race/returnOrderImage.ts +++ b/view/src/lib/race/returnOrderImage.ts @@ -59,12 +59,7 @@ const getCarImage = (carName: string) => { const enemyCar0 = localStorage.getItem(ENEMY_CAR + "_0"); const enemyCar1 = localStorage.getItem(ENEMY_CAR + "_1"); const enemyCar2 = localStorage.getItem(ENEMY_CAR + "_2"); - if ( - playerCarName === null || - enemyCar0 === null || - enemyCar1 === null || - enemyCar2 === null - ) { + if (playerCarName === null || enemyCar0 === null || enemyCar1 === null || enemyCar2 === null) { throw new Error("Player Car or Enemy Car Data is not found."); } const enemyCarName0: string = JSON.parse(enemyCar0)[ENEMY_CAR_NAME]; diff --git a/view/src/lib/utils.ts b/view/src/lib/utils.ts index d084cca..365058c 100644 --- a/view/src/lib/utils.ts +++ b/view/src/lib/utils.ts @@ -1,6 +1,6 @@ -import { type ClassValue, clsx } from "clsx" -import { twMerge } from "tailwind-merge" +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return twMerge(clsx(inputs)); } diff --git a/view/src/lib/validator/carDataValidator.ts b/view/src/lib/validator/carDataValidator.ts index b92bccb..fab0ed2 100644 --- a/view/src/lib/validator/carDataValidator.ts +++ b/view/src/lib/validator/carDataValidator.ts @@ -4,7 +4,6 @@ import { PLAYER_CAR_NAME, PLAYER_CAR_LUCK, PLAYER_CAR_INSTRUCTION, - ENEMY_CAR_IMAGE, ENEMY_CAR_NAME, ENEMY_CAR_LUCK, @@ -14,9 +13,7 @@ import { const toBlob = async (base64: string) => { try { const bin = atob(base64); - const buffer = new Uint8Array(bin.length).map((_, i) => - bin.charCodeAt(i) - ); + const buffer = new Uint8Array(bin.length).map((_, i) => bin.charCodeAt(i)); const blob = new Blob([buffer], { type: "image/png" }); return blob; } catch (e) { @@ -25,50 +22,50 @@ const toBlob = async (base64: string) => { } }; -export const validatePlayerCarRes = async(carDataJson: PlayerCarRes) => { - const dataBase64 = carDataJson[PLAYER_CAR_IMAGE]; - const playerCarName = carDataJson[PLAYER_CAR_NAME]; - const playerCarLuck = carDataJson[PLAYER_CAR_LUCK]; - const playerCarInstruction = carDataJson[PLAYER_CAR_INSTRUCTION]; - // 文字型かどうかのチェック - if (typeof dataBase64 !== "string") return false; - if (typeof playerCarName !== "string") return false; - if (typeof playerCarInstruction !== "string") return false; - // 数値型かどうかのチェック - if (typeof playerCarLuck !== "number") return false; - // base64をblobに変換 - const blob = await toBlob(dataBase64); - if (!blob) return false; // 変換に失敗した場合 - // blobをurlに変換 - const url = URL.createObjectURL(blob); - // ImageをUrlに変更したJSONを返却 - const carDataJsonWithUrl = { - ...carDataJson, // スプレッド構文を用いて、元のオブジェクトを展開 - [PLAYER_CAR_IMAGE]: url, // ImageのみURLで上書き - }; - return carDataJsonWithUrl; +export const validatePlayerCarRes = async (carDataJson: PlayerCarRes) => { + const dataBase64 = carDataJson[PLAYER_CAR_IMAGE]; + const playerCarName = carDataJson[PLAYER_CAR_NAME]; + const playerCarLuck = carDataJson[PLAYER_CAR_LUCK]; + const playerCarInstruction = carDataJson[PLAYER_CAR_INSTRUCTION]; + // 文字型かどうかのチェック + if (typeof dataBase64 !== "string") return false; + if (typeof playerCarName !== "string") return false; + if (typeof playerCarInstruction !== "string") return false; + // 数値型かどうかのチェック + if (typeof playerCarLuck !== "number") return false; + // base64をblobに変換 + const blob = await toBlob(dataBase64); + if (!blob) return false; // 変換に失敗した場合 + // blobをurlに変換 + const url = URL.createObjectURL(blob); + // ImageをUrlに変更したJSONを返却 + const carDataJsonWithUrl = { + ...carDataJson, // スプレッド構文を用いて、元のオブジェクトを展開 + [PLAYER_CAR_IMAGE]: url, // ImageのみURLで上書き + }; + return carDataJsonWithUrl; }; -export const validateEnemyCarRes = async(carDataJson: EnemyCarRes) => { - const dataBase64 = carDataJson[ENEMY_CAR_IMAGE]; - const enemyCarName = carDataJson[ENEMY_CAR_NAME]; - const enemyCarLuck = carDataJson[ENEMY_CAR_LUCK]; - const enemyCarInstruction = carDataJson[ENEMY_CAR_INSTRUCTION]; - // 文字型かどうかのチェック - if (typeof dataBase64 !== "string") return false; - if (typeof enemyCarName !== "string") return false; - if (typeof enemyCarInstruction !== "string") return false; - // 数値型かどうかのチェック - if (typeof enemyCarLuck !== "number") return false; - // base64をblobに変換 - const blob = await toBlob(dataBase64); - if (!blob) return false; // 変換に失敗した場合 - // blobをurlに変換 - const url = URL.createObjectURL(blob); - // ImageをUrlに変更したJSONを返却 - const carDataJsonWithUrl = { - ...carDataJson, // スプレッド構文を用いて、元のオブジェクトを展開 - [ENEMY_CAR_IMAGE]: url, // ImageのみURLで上書き - }; - return carDataJsonWithUrl; -} \ No newline at end of file +export const validateEnemyCarRes = async (carDataJson: EnemyCarRes) => { + const dataBase64 = carDataJson[ENEMY_CAR_IMAGE]; + const enemyCarName = carDataJson[ENEMY_CAR_NAME]; + const enemyCarLuck = carDataJson[ENEMY_CAR_LUCK]; + const enemyCarInstruction = carDataJson[ENEMY_CAR_INSTRUCTION]; + // 文字型かどうかのチェック + if (typeof dataBase64 !== "string") return false; + if (typeof enemyCarName !== "string") return false; + if (typeof enemyCarInstruction !== "string") return false; + // 数値型かどうかのチェック + if (typeof enemyCarLuck !== "number") return false; + // base64をblobに変換 + const blob = await toBlob(dataBase64); + if (!blob) return false; // 変換に失敗した場合 + // blobをurlに変換 + const url = URL.createObjectURL(blob); + // ImageをUrlに変更したJSONを返却 + const carDataJsonWithUrl = { + ...carDataJson, // スプレッド構文を用いて、元のオブジェクトを展開 + [ENEMY_CAR_IMAGE]: url, // ImageのみURLで上書き + }; + return carDataJsonWithUrl; +}; diff --git a/view/yarn.lock b/view/yarn.lock index 59551fa..e92811f 100644 --- a/view/yarn.lock +++ b/view/yarn.lock @@ -1821,6 +1821,17 @@ __metadata: languageName: node linkType: hard +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" + peerDependencies: + eslint: ">=7.0.0" + bin: + eslint-config-prettier: bin/cli.js + checksum: 10c0/6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -3750,6 +3761,69 @@ __metadata: languageName: node linkType: hard +"prettier-plugin-tailwindcss@npm:^0.5.12": + version: 0.5.12 + resolution: "prettier-plugin-tailwindcss@npm:0.5.12" + peerDependencies: + "@ianvs/prettier-plugin-sort-imports": "*" + "@prettier/plugin-pug": "*" + "@shopify/prettier-plugin-liquid": "*" + "@trivago/prettier-plugin-sort-imports": "*" + prettier: ^3.0 + prettier-plugin-astro: "*" + prettier-plugin-css-order: "*" + prettier-plugin-import-sort: "*" + prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" + prettier-plugin-organize-attributes: "*" + prettier-plugin-organize-imports: "*" + prettier-plugin-sort-imports: "*" + prettier-plugin-style-order: "*" + prettier-plugin-svelte: "*" + peerDependenciesMeta: + "@ianvs/prettier-plugin-sort-imports": + optional: true + "@prettier/plugin-pug": + optional: true + "@shopify/prettier-plugin-liquid": + optional: true + "@trivago/prettier-plugin-sort-imports": + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-twig-melody: + optional: true + checksum: 10c0/984b79fd33aed89f09bb19c3659079eb19dad6c38a78150f8b1a3082d7331f4faf46e6c561e0e54f47954679c105ef8e674e9c56e22db318e1493b468aa29f5b + languageName: node + linkType: hard + +"prettier@npm:^3.2.5": + version: 3.2.5 + resolution: "prettier@npm:3.2.5" + bin: + prettier: bin/prettier.cjs + checksum: 10c0/ea327f37a7d46f2324a34ad35292af2ad4c4c3c3355da07313339d7e554320f66f65f91e856add8530157a733c6c4a897dc41b577056be5c24c40f739f5ee8c6 + languageName: node + linkType: hard + "proc-log@npm:^3.0.0": version: 3.0.0 resolution: "proc-log@npm:3.0.0" @@ -4805,9 +4879,12 @@ __metadata: clsx: "npm:^2.1.0" eslint: "npm:^8" eslint-config-next: "npm:14.1.0" + eslint-config-prettier: "npm:^9.1.0" lucide-react: "npm:^0.344.0" next: "npm:14.1.0" postcss: "npm:^8" + prettier: "npm:^3.2.5" + prettier-plugin-tailwindcss: "npm:^0.5.12" react: "npm:^18" react-dom: "npm:^18" react-hook-form: "npm:^7.51.0"