diff --git a/coding-standards.md b/coding-standards.md new file mode 100644 index 0000000..0751377 --- /dev/null +++ b/coding-standards.md @@ -0,0 +1,85 @@ +# Coding Standards + +## Table of Contents + +1. [Naming Convention](#naming-convention) +1. [Import](#import) + +--- + +## Naming Convention + +### Format Options[^1] + +1. `camelCase` : standard `camelCase` format - no underscores are allowed between characters, and consecutive capitals are allowed (i.e. both `myID` and `myId` - are valid). +1. `PascalCase` : same as `camelCase`, except the first character must be upper-case. +1. `snake_case` : standard `snake_case` format - all characters must be lower-case, and underscores are allowed. +1. `strictCamelCase` : same as `camelCase`, but consecutive capitals are not allowed (i.e. `myId` is valid, but `myID` is not). +1. `StrictPascalCase` : same as `strictCamelCase`, except the first character must be upper-case. +1. `UPPER_CASE` : same as `snake_case`, except all characters must be upper-case. + +### Format of Names + +#### General + +| Name Of | Format | Prefix | +| --------: | :----------- | -------------------- | +| Classe | `PascalCase` | | +| Variable | `camelCase` | | +| Function | `camelCase` | | +| File | `camelCase` | (component name)[^2] | +| Directory | `camelCase` | | +| Constant | `UPPER_CASE` | | + +##### Files for React Component + +1. Prefix with component name +1. Postfix with utility +1. Use **singular** form for `type` and `state` files +1. Postfix view-file with import-name of the `View` component +1. Extension should be `tsx` only when `react` element is exported +1. Example: + - `compInteractor.ts` + - `compPresenter.tsx` + - `compViewInput.tsx` + - `compState.ts` + - `compType.ts` + +#### React Variables + +| Name Of | Format | Prefix | +| --------: | :----------- | ------ | +| Component | `PascalCase` | | +| Type | `PascalCase` | | +| Interface | `PascalCase` | | +| State | `camelCase` | | +| Hook | `camelCase` | `use` | +| URL | `UPPER_CASE` | | + +## Import + +### Local + +1. Import local states as `mState` and use them with dot notation +1. Import local types as `mType` and use them with dot notation +1. Import example: + - State : `import * as mState from './compState';` + - Type : `import * as mType from './compType';` +1. Usage example: + - State : `const inputValue = useAtom(mState.inputValue);` + - Type :`const inputValue : mType.InputValue = {};` + +### Global + +1. Import global states as `gState` and use them with dot notation +1. Import global types as `gType` and use them with dot notation +1. Import example: + - State : `import * as gState from '../../controller/data/states';` + - Type : `import * as gType from '../../controller/data/types';` +1. Usage example: + - State : `const inputValue = useAtom(gState.inputValue);` + - Type :`const inputValue : gType.InputValue = {};` + +[^1]: + +[^2]: `( )` means "if applicable" diff --git a/components/errors/errorsViewImage.tsx b/components/errors/errorsViewImage.tsx index 31c60e3..2391a99 100644 --- a/components/errors/errorsViewImage.tsx +++ b/components/errors/errorsViewImage.tsx @@ -1,13 +1,13 @@ import { useAtomValue } from 'jotai'; import Image from 'next/image'; import Link from 'next/link'; -import { stateErrorCode } from '../../controllers/data/states'; +import * as gState from '../../controllers/data/states'; import imageSrc404 from '../../public/assets/images/404_broken_robot.png'; import imageSrc500 from '../../public/assets/images/500_faulty_dog.png'; import styles from './errors.module.scss'; const View = () => { - const errorCode = useAtomValue(stateErrorCode); + const errorCode = useAtomValue(gState.errorCode); return (
diff --git a/components/example/examplePresenter.tsx b/components/example/examplePresenter.tsx index 015c873..9e8b4b8 100644 --- a/components/example/examplePresenter.tsx +++ b/components/example/examplePresenter.tsx @@ -1,11 +1,10 @@ import { placeholderUrl } from '../../controllers/apiURLs'; import { useStaticQuery } from '../../controllers/net/staticQuery'; import styles from './example.module.scss'; -import { ExamplePost } from './exampleType'; +import * as mType from './exampleType'; import Posts from './exampleViewPosts'; - const Presenter = () => { - const query = useStaticQuery(placeholderUrl); + const query = useStaticQuery(placeholderUrl); let contents; switch (query.status) { diff --git a/components/example/exampleType.ts b/components/example/exampleType.ts index b148473..02ee196 100644 --- a/components/example/exampleType.ts +++ b/components/example/exampleType.ts @@ -1,4 +1,4 @@ -export type ExamplePost = { +export type Post = { id: number; title: string; body: string; diff --git a/components/example/exampleViewPostSingle.tsx b/components/example/exampleViewPostSingle.tsx index 2a78d5c..56c3b23 100644 --- a/components/example/exampleViewPostSingle.tsx +++ b/components/example/exampleViewPostSingle.tsx @@ -1,9 +1,9 @@ import { memo } from 'react'; import styles from './example.module.scss'; -import { ExamplePost } from './exampleType'; +import * as mType from './exampleType'; // This uses props to get data from parent -const View = ({ post }: { post: ExamplePost }) => { +const View = ({ post }: { post: mType.Post }) => { return

{post.title}

; }; diff --git a/components/example/exampleViewPosts.tsx b/components/example/exampleViewPosts.tsx index b701c5a..856afd0 100644 --- a/components/example/exampleViewPosts.tsx +++ b/components/example/exampleViewPosts.tsx @@ -1,9 +1,9 @@ import styles from './example.module.scss'; -import { ExamplePost } from './exampleType'; +import * as mType from './exampleType'; import PostSingle from './exampleViewPostSingle'; -const View = ({ data }: { data: ExamplePost[] }) => { - const dataMapper = (post: ExamplePost) => ; +const View = ({ data }: { data: mType.Post[] }) => { + const dataMapper = (post: mType.Post) => ; return
{data.map(dataMapper)}
; }; diff --git a/components/meta/meta.tsx b/components/meta/meta.tsx index d1e64f7..7c02bee 100644 --- a/components/meta/meta.tsx +++ b/components/meta/meta.tsx @@ -1,8 +1,8 @@ import Head from 'next/head'; import { useGTM } from './gtm'; -import { TMPropsMeta } from './metaType'; +import * as mType from './metaType'; -const Meta = (props: TMPropsMeta) => { +const Meta = (props: mType.Props) => { const authorName = 'junekimdev'; const siteName = "another junekimdev's website"; const homeUrl = process.env.NEXT_PUBLIC_URL ?? 'localhost:3000'; diff --git a/components/meta/metaType.ts b/components/meta/metaType.ts index 9a77c6e..eba9e77 100644 --- a/components/meta/metaType.ts +++ b/components/meta/metaType.ts @@ -1,6 +1,6 @@ import { ReactNode } from 'react'; -export type TMPropsMeta = { +export type Props = { title: string; desc: string; url: string; diff --git a/controllers/data/states.ts b/controllers/data/states.ts index b5c0510..4c020bc 100644 --- a/controllers/data/states.ts +++ b/controllers/data/states.ts @@ -1,3 +1,3 @@ import { atom } from 'jotai'; -export const stateErrorCode = atom(500); +export const errorCode = atom(500); diff --git a/controllers/data/types.ts b/controllers/data/types.ts index 5e46d4b..0a64c4f 100644 --- a/controllers/data/types.ts +++ b/controllers/data/types.ts @@ -1 +1 @@ -export type TypeError = { code: number; message: string }; +export type Error = { code: number; message: string }; diff --git a/package.json b/package.json index 77ff8a7..80a2cb9 100644 --- a/package.json +++ b/package.json @@ -10,25 +10,25 @@ "build": "next build", "export": "next export", "lint": "eslint", - "inspect-lint": "eslint --inspect-config", + "lint-inspect": "eslint --inspect-config", "start": "next start" }, "dependencies": { - "@tanstack/react-query": "^5.65.1", - "jotai": "^2.11.2", + "@tanstack/react-query": "^5.66.0", + "jotai": "^2.11.3", "next": "^15.1.6", "react": "^19.0.0", "react-dom": "^19.0.0", - "sass": "^1.83.4", + "sass": "^1.84.0", "sharp": "^0.33.3" }, "devDependencies": { "@eslint/js": "^9.19.0", "@next/eslint-plugin-next": "^15.1.6", "@stylistic/eslint-plugin": "^3.0.1", - "@tanstack/react-query-devtools": "^5.65.1", + "@tanstack/react-query-devtools": "^5.66.0", "@testing-library/react": "^16.2.0", - "@types/node": "^22.12.0", + "@types/node": "^22.13.1", "@types/react": "^19.0.8", "@types/react-dom": "^19.0.3", "ejs": "^3.1.9", @@ -39,7 +39,7 @@ "jest-environment-jsdom": "^29.7.0", "prettier": "^3.4.2", "typescript": "^5.7.3", - "typescript-eslint": "^8.22.0" + "typescript-eslint": "^8.23.0" }, "browserslist": { "production": [ diff --git a/pages/404.tsx b/pages/404.tsx index 62ef0a5..9d7c2e8 100644 --- a/pages/404.tsx +++ b/pages/404.tsx @@ -2,11 +2,11 @@ import { useSetAtom } from 'jotai'; import { useEffect } from 'react'; import Errors from '../components/errors'; import Meta from '../components/meta'; -import { stateErrorCode } from '../controllers/data/states'; +import * as gState from '../controllers/data/states'; const Error404 = () => { const publicUrl = process.env.PUBLIC_URL || 'localhost:3000'; - const setErrorCode = useSetAtom(stateErrorCode); + const setErrorCode = useSetAtom(gState.errorCode); useEffect(() => { setErrorCode(404); diff --git a/pages/_error.tsx b/pages/_error.tsx index 97b19ba..28a0063 100644 --- a/pages/_error.tsx +++ b/pages/_error.tsx @@ -3,11 +3,11 @@ import { NextPageContext } from 'next'; import { useEffect } from 'react'; import Errors from '../components/errors'; import Meta from '../components/meta'; -import { stateErrorCode } from '../controllers/data/states'; +import * as gState from '../controllers/data/states'; const Error = ({ statusCode }: { statusCode: number }) => { const publicUrl = process.env.PUBLIC_URL || 'localhost:3000'; - const setErrorCode = useSetAtom(stateErrorCode); + const setErrorCode = useSetAtom(gState.errorCode); useEffect(() => { window.scrollTo(0, 0); diff --git a/templates/interactor.ejs b/templates/interactor.ejs index 6bc6526..b4b297a 100644 --- a/templates/interactor.ejs +++ b/templates/interactor.ejs @@ -1,5 +1,4 @@ -<% const camelName = name.charAt(0).toUpperCase() + name.slice(1) -%> -import { Dispatch, SetStateAction } from 'react'; +import { Dispatch, MouseEvent, SetStateAction, useCallback } from 'react'; export const useLinkClick = (setState: Dispatch>) => { return useCallback( diff --git a/templates/presenter.ejs b/templates/presenter.ejs index 667e58c..51faf55 100644 --- a/templates/presenter.ejs +++ b/templates/presenter.ejs @@ -1,4 +1,3 @@ -<% const camelName = name.charAt(0).toUpperCase() + name.slice(1) -%> import styles from './<%=name%>.module.scss'; const Presenter = () => { diff --git a/templates/view.ejs b/templates/view.ejs index ec09904..a11cc63 100644 --- a/templates/view.ejs +++ b/templates/view.ejs @@ -1,4 +1,3 @@ -<% const camelName = name.charAt(0).toUpperCase() + name.slice(1) -%> import { useState } from 'react'; import styles from './<%=name%>.module.scss'; import { useLinkClick } from './<%=name%>Interactor'; diff --git a/tsconfig.json b/tsconfig.json index 27faea1..65447f4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "ESNext", - "module": "nodenext", + "target": "esnext", + "module": "esnext", "lib": ["DOM", "ESNext", "WebWorker"], "declaration": true, "declarationMap": true, @@ -18,7 +18,7 @@ "noFallthroughCasesInSwitch": true, "skipLibCheck": true, /* Module Resolution Options */ - "moduleResolution": "nodenext", + "moduleResolution": "node", "esModuleInterop": true, "allowSyntheticDefaultImports": true, "resolveJsonModule": true, diff --git a/yarn.lock b/yarn.lock index 2b2e344..c2a3a25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -300,11 +300,11 @@ integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.19.0": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" - integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== + version "0.19.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" + integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== dependencies: - "@eslint/object-schema" "^2.1.5" + "@eslint/object-schema" "^2.1.6" debug "^4.3.1" minimatch "^3.1.2" @@ -335,10 +335,10 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.19.0.tgz#51dbb140ed6b49d05adc0b171c41e1a8713b7789" integrity sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ== -"@eslint/object-schema@^2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" - integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.2.5": version "0.2.5" @@ -933,29 +933,29 @@ dependencies: tslib "^2.8.0" -"@tanstack/query-core@5.65.0": - version "5.65.0" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.65.0.tgz#6b7c7087a36867361535b613ff39b633808052fd" - integrity sha512-Bnnq/1axf00r2grRT6gUyIkZRKzhHs+p4DijrCQ3wMlA3D3TTT71gtaSLtqnzGddj73/7X5JDGyjiSLdjvQN4w== +"@tanstack/query-core@5.66.0": + version "5.66.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.66.0.tgz#163f670b3b4e3b3cdbff6698ad44b2edfcaed185" + integrity sha512-J+JeBtthiKxrpzUu7rfIPDzhscXF2p5zE/hVdrqkACBP8Yu0M96mwJ5m/8cPPYQE9aRNvXztXHlNwIh4FEeMZw== "@tanstack/query-devtools@5.65.0": version "5.65.0" resolved "https://registry.yarnpkg.com/@tanstack/query-devtools/-/query-devtools-5.65.0.tgz#37da5e911543b4f6d98b9a04369eab0de6044ba1" integrity sha512-g5y7zc07U9D3esMdqUfTEVu9kMHoIaVBsD0+M3LPdAdD710RpTcLiNvJY1JkYXqkq9+NV+CQoemVNpQPBXVsJg== -"@tanstack/react-query-devtools@^5.65.1": - version "5.65.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.65.1.tgz#375ba44398076436f9c82f5ae46f0a3d47397db6" - integrity sha512-PKUBz7+FAP3eI1zoWrP5vxNQXs+elPz3u/3cILGhNZl2dufgbU9OJRpbC+BAptLXTsGxTwkAlrWBIZbD/c7CDw== +"@tanstack/react-query-devtools@^5.66.0": + version "5.66.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query-devtools/-/react-query-devtools-5.66.0.tgz#d54ba345cecf259181565699af1f80e0b284e714" + integrity sha512-uB57wA2YZaQ2fPcFW0E9O1zAGDGSbRKRx84uMk/86VyU9jWVxvJ3Uzp+zNm+nZJYsuekCIo2opTdgNuvM3cKgA== dependencies: "@tanstack/query-devtools" "5.65.0" -"@tanstack/react-query@^5.65.1": - version "5.65.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.65.1.tgz#84f120f7cf7398626c991ccef4557bd4d780fe37" - integrity sha512-BSpjo4RQdJ75Mw3pqM1AJYNhanNxJE3ct7RmCZUAv9cUJg/Qmonzc/Xy2kKXeQA1InuKATSuc6pOZciWOF8TYQ== +"@tanstack/react-query@^5.66.0": + version "5.66.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.66.0.tgz#9f7aa1b3e844ea6a0ad2ee61fccaed76e614b865" + integrity sha512-z3sYixFQJe8hndFnXgWu7C79ctL+pI0KAelYyW+khaNJ1m22lWrhJU2QrsTcRKMuVPtoZvfBYrTStIdKo+x0Xw== dependencies: - "@tanstack/query-core" "5.65.0" + "@tanstack/query-core" "5.66.0" "@testing-library/react@^16.2.0": version "16.2.0" @@ -1047,10 +1047,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*", "@types/node@^22.12.0": - version "22.12.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.12.0.tgz#bf8af3b2af0837b5a62a368756ff2b705ae0048c" - integrity sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA== +"@types/node@*", "@types/node@^22.13.1": + version "22.13.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.1.tgz#a2a3fefbdeb7ba6b89f40371842162fac0934f33" + integrity sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew== dependencies: undici-types "~6.20.0" @@ -1088,85 +1088,85 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.22.0.tgz#63a1b0d24d85a971949f8d71d693019f58d2e861" - integrity sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw== +"@typescript-eslint/eslint-plugin@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz#7745f4e3e4a7ae5f6f73fefcd856fd6a074189b7" + integrity sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.22.0" - "@typescript-eslint/type-utils" "8.22.0" - "@typescript-eslint/utils" "8.22.0" - "@typescript-eslint/visitor-keys" "8.22.0" + "@typescript-eslint/scope-manager" "8.23.0" + "@typescript-eslint/type-utils" "8.23.0" + "@typescript-eslint/utils" "8.23.0" + "@typescript-eslint/visitor-keys" "8.23.0" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" - ts-api-utils "^2.0.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/parser@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.22.0.tgz#f21c5db24271f182ebbb4ba8c7ad3eb76e5f5f3a" - integrity sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ== +"@typescript-eslint/parser@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.23.0.tgz#57acb3b65fce48d12b70d119436e145842a30081" + integrity sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q== dependencies: - "@typescript-eslint/scope-manager" "8.22.0" - "@typescript-eslint/types" "8.22.0" - "@typescript-eslint/typescript-estree" "8.22.0" - "@typescript-eslint/visitor-keys" "8.22.0" + "@typescript-eslint/scope-manager" "8.23.0" + "@typescript-eslint/types" "8.23.0" + "@typescript-eslint/typescript-estree" "8.23.0" + "@typescript-eslint/visitor-keys" "8.23.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.22.0.tgz#e85836ddeb8eae715f870628bcc32fe96aaf4d0e" - integrity sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ== +"@typescript-eslint/scope-manager@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz#ee3bb7546421ca924b9b7a8b62a77d388193ddec" + integrity sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw== dependencies: - "@typescript-eslint/types" "8.22.0" - "@typescript-eslint/visitor-keys" "8.22.0" + "@typescript-eslint/types" "8.23.0" + "@typescript-eslint/visitor-keys" "8.23.0" -"@typescript-eslint/type-utils@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.22.0.tgz#cd9f23c23f021357ef0baa3490d4d96edcc97509" - integrity sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA== +"@typescript-eslint/type-utils@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz#271e1eecece072d92679dfda5ccfceac3faa9f76" + integrity sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA== dependencies: - "@typescript-eslint/typescript-estree" "8.22.0" - "@typescript-eslint/utils" "8.22.0" + "@typescript-eslint/typescript-estree" "8.23.0" + "@typescript-eslint/utils" "8.23.0" debug "^4.3.4" - ts-api-utils "^2.0.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/types@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.22.0.tgz#d9dec7116479ad03aeb6c8ac9c5223c4c79cf360" - integrity sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A== +"@typescript-eslint/types@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.23.0.tgz#3355f6bcc5ebab77ef6dcbbd1113ec0a683a234a" + integrity sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ== -"@typescript-eslint/typescript-estree@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.22.0.tgz#c188c3e19529d5b3145577c0bd967e2683b114df" - integrity sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w== +"@typescript-eslint/typescript-estree@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz#f633ef08efa656e386bc44b045ffcf9537cc6924" + integrity sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ== dependencies: - "@typescript-eslint/types" "8.22.0" - "@typescript-eslint/visitor-keys" "8.22.0" + "@typescript-eslint/types" "8.23.0" + "@typescript-eslint/visitor-keys" "8.23.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" minimatch "^9.0.4" semver "^7.6.0" - ts-api-utils "^2.0.0" + ts-api-utils "^2.0.1" -"@typescript-eslint/utils@8.22.0", "@typescript-eslint/utils@^8.13.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.22.0.tgz#c8cc4e52a9c711af8a741a82dc5d7242b7a8dd44" - integrity sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg== +"@typescript-eslint/utils@8.23.0", "@typescript-eslint/utils@^8.13.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.23.0.tgz#b269cbdc77129fd6e0e600b168b5ef740a625554" + integrity sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.22.0" - "@typescript-eslint/types" "8.22.0" - "@typescript-eslint/typescript-estree" "8.22.0" + "@typescript-eslint/scope-manager" "8.23.0" + "@typescript-eslint/types" "8.23.0" + "@typescript-eslint/typescript-estree" "8.23.0" -"@typescript-eslint/visitor-keys@8.22.0": - version "8.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.22.0.tgz#02cc005014c372033eb9171e2275b76cba722a3f" - integrity sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w== +"@typescript-eslint/visitor-keys@8.23.0": + version "8.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz#40405fd26a61d23f5f4c2ed0f016a47074781df8" + integrity sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ== dependencies: - "@typescript-eslint/types" "8.22.0" + "@typescript-eslint/types" "8.23.0" eslint-visitor-keys "^4.2.0" abab@^2.0.6: @@ -1519,9 +1519,9 @@ camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001688: - version "1.0.30001696" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001696.tgz#00c30a2fc11e3c98c25e5125418752af3ae2f49f" - integrity sha512-pDCPkvzfa39ehJtJ+OwGT/2yvT2SbjfHhiIW2LWOAcMQ7BzwxT/XuyUp4OTOd0XFWA6BKw0JalnBHgSi5DGJBQ== + version "1.0.30001698" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001698.tgz#3e86d4bad6f87f493197fb2483a211fe8841abd3" + integrity sha512-xJ3km2oiG/MbNU8G6zIq6XRZ6HtAOVXsbOrP/blGazi52kc5Yy7b6sDA5O+FbROzRrV7BSTllLHuNvmawYUJjw== chalk@^4.0.0, chalk@^4.0.2: version "4.1.2" @@ -1803,9 +1803,9 @@ ejs@^3.1.9: jake "^10.8.5" electron-to-chromium@^1.5.73: - version "1.5.90" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.90.tgz#4717e5a5413f95bbb12d0af14c35057e9c65e0b6" - integrity sha512-C3PN4aydfW91Natdyd449Kw+BzhLmof6tzy5W1pFC5SpQxVXT+oyiyOG9AgYYSN9OdA/ik3YkCrpwqI8ug5Tug== + version "1.5.95" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.95.tgz#c7819461af3cc64f467bd10bf020516e20682a2a" + integrity sha512-XNsZaQrgQX+BG37BRQv+E+HcOZlWhqYaDoVVNCws/WrYYdbGrkR1qCDJ2mviBF3flCs6/BTa4O7ANfFTFZk6Dg== emittery@^0.13.1: version "0.13.1" @@ -2489,9 +2489,9 @@ immutable@^5.0.2: integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" resolve-from "^4.0.0" @@ -2569,11 +2569,11 @@ is-bigint@^1.1.0: has-bigints "^1.0.2" is-boolean-object@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" - integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" has-tostringtag "^1.0.2" is-callable@^1.2.7: @@ -2724,11 +2724,11 @@ is-weakmap@^2.0.2: integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2, is-weakref@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" - integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== dependencies: - call-bound "^1.0.2" + call-bound "^1.0.3" is-weakset@^2.0.3: version "2.0.4" @@ -3195,10 +3195,10 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jotai@^2.11.2: - version "2.11.2" - resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.2.tgz#30c8f04add5820f7fbf0b9ef2c51ae2dd41522a1" - integrity sha512-H3xOvsdqjBJnXTvpgAWfff2y1B3wabi1iSA6FFd0FrLaM4ENsRJd+RJQtkNhY4PZgvAODa4PQhau9dheK+pUkw== +jotai@^2.11.3: + version "2.11.3" + resolved "https://registry.yarnpkg.com/jotai/-/jotai-2.11.3.tgz#7d95086ac7aebf363cb607404356b8427d3c1547" + integrity sha512-B/PsewAQ0UOS5e2+TTWegUPQ3SCLPCjPY24LYUjfn2EorGlluTA2dFjVLgF1+xHLjK9Jit3y5mKHyMG3Xq/GZg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -3506,9 +3506,9 @@ object-assign@^4.1.1: integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.3: - version "1.13.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" - integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== object-keys@^1.1.1: version "1.1.1" @@ -3696,9 +3696,9 @@ pkg-dir@^4.2.0: find-up "^4.0.0" possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== postcss@8.4.31: version "8.4.31" @@ -3925,10 +3925,10 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.83.4: - version "1.83.4" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" - integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== +sass@^1.84.0: + version "1.84.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.84.0.tgz#da9154cbccb2d2eac7a9486091b6d9ba93ef5bad" + integrity sha512-XDAbhEPJRxi7H0SxrnOpiXFQoUJHwkR2u3Zc4el+fK/Tt5Hpzw5kkQ59qVDfvdaUq6gCrEZIbySFBM2T9DNKHg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -3954,9 +3954,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: - version "7.7.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c" - integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ== + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== set-function-length@^1.2.2: version "1.2.2" @@ -4294,10 +4294,10 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -ts-api-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900" - integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ== +ts-api-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== tslib@^2.4.0, tslib@^2.8.0: version "2.8.1" @@ -4366,14 +4366,14 @@ typed-array-length@^1.0.7: possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" -typescript-eslint@^8.22.0: - version "8.22.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.22.0.tgz#1d4becf1d65385e57e9271fbd557ccc22f6c0f53" - integrity sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw== +typescript-eslint@^8.23.0: + version "8.23.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.23.0.tgz#796deb48f040146b68fcc8cb07db68b87219a8d2" + integrity sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ== dependencies: - "@typescript-eslint/eslint-plugin" "8.22.0" - "@typescript-eslint/parser" "8.22.0" - "@typescript-eslint/utils" "8.22.0" + "@typescript-eslint/eslint-plugin" "8.23.0" + "@typescript-eslint/parser" "8.23.0" + "@typescript-eslint/utils" "8.23.0" typescript@^5.7.3: version "5.7.3"