diff --git a/.eslintrc.js b/.eslintrc.js
index bfc96a8..f551104 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,9 +1,9 @@
module.exports = {
- root: true,
- extends: ["@developomp-site/eslint-config"],
- settings: {
- next: {
- rootDir: ["apps/*/"],
- },
- },
+ root: true,
+ extends: ["@developomp-site/eslint-config"],
+ settings: {
+ next: {
+ rootDir: ["apps/*/"],
+ },
+ },
}
diff --git a/.firebaserc b/.firebaserc
index d372a6f..062e644 100644
--- a/.firebaserc
+++ b/.firebaserc
@@ -11,11 +11,11 @@
"blog": [
"developomp-site-blog"
],
- "portfolio": [
+ "portfolio": [
"developomp-site-portfolio"
]
}
}
},
"etags": {}
-}
\ No newline at end of file
+}
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 7a94d32..7a951b6 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -2,37 +2,37 @@
name: Deploy pages
on:
- push:
- branches:
- - master
+ push:
+ branches:
+ - master
jobs:
- deploy:
- if: ${{ github.repository_owner == 'developomp' }}
- name: Deploy
- runs-on: ubuntu-latest
- steps:
- - name: Checkout Repo
- uses: actions/checkout@master
+ deploy:
+ if: ${{ github.repository_owner == 'developomp' }}
+ name: Deploy
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repo
+ uses: actions/checkout@master
- - uses: pnpm/action-setup@v2
- with:
- version: 8
+ - uses: pnpm/action-setup@v2
+ with:
+ version: 8
- - name: Setup Node
- uses: actions/setup-node@v2
- with:
- node-version: 18
- cache: pnpm
+ - name: Setup Node
+ uses: actions/setup-node@v2
+ with:
+ node-version: 18
+ cache: pnpm
- - name: Install dependencies
- run: pnpm install
+ - name: Install dependencies
+ run: pnpm install
- - name: Build
- run: pnpm build
+ - name: Build
+ run: pnpm build
- - name: Deploy to Firebase
- uses: w9jds/firebase-action@master
- with:
- args: deploy
- env:
- GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
+ - name: Deploy to Firebase
+ uses: w9jds/firebase-action@master
+ with:
+ args: deploy
+ env:
+ GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
diff --git a/.gitignore b/.gitignore
index e18c506..0c14b8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,10 +8,10 @@ node_modules
*.log
.next
dist
+build
dist-ssr
*.local
.env
.cache
-server/dist
-public/dist
storybook-static/
+.svelte-kit/
diff --git a/.prettierrc b/.prettierrc
index 6d9b2ba..401605e 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,4 +1,19 @@
{
- "useTabs": true,
- "semi": false
+ "useTabs": false,
+ "tabWidth": 4,
+ "semi": false,
+ "overrides": [
+ {
+ "files": "*.md",
+ "options": {
+ "tabWidth": 2
+ }
+ },
+ {
+ "files": ".firebaserc",
+ "options": {
+ "tabWidth": 2
+ }
+ }
+ ]
}
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 28839e1..ed9860d 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,13 +1,13 @@
{
- "recommendations": [
- "esbenp.prettier-vscode",
- "dbaeumer.vscode-eslint",
- "naumovs.color-highlight",
- "streetsidesoftware.code-spell-checker",
- "aaron-bond.better-comments",
- "styled-components.vscode-styled-components",
- "bradlc.vscode-tailwindcss",
- "unifiedjs.vscode-mdx",
- "svelte.svelte-vscode"
- ]
+ "recommendations": [
+ "esbenp.prettier-vscode",
+ "dbaeumer.vscode-eslint",
+ "naumovs.color-highlight",
+ "streetsidesoftware.code-spell-checker",
+ "aaron-bond.better-comments",
+ "styled-components.vscode-styled-components",
+ "bradlc.vscode-tailwindcss",
+ "unifiedjs.vscode-mdx",
+ "svelte.svelte-vscode"
+ ]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index b77a548..bd3bf60 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,76 +1,76 @@
{
- "editor.defaultFormatter": "esbenp.prettier-vscode",
- "editor.formatOnPaste": true,
- "editor.formatOnSave": true,
- "editor.detectIndentation": false,
- "editor.insertSpaces": false,
- "editor.codeActionsOnSave": {
- "source.fixAll": true
- },
- "cSpell.words": [
- "bspwm",
- "cairographics",
- "classnet",
- "deno",
- "developomp",
- "developomp's",
- "dompurify",
- "elasticlunr",
- "Exyle",
- "exyleio",
- "Fontawesome",
- "Fonticons",
- "fontsource",
- "fortawesome",
- "Freedesktop",
- "GDSC",
- "githubactions",
- "githubpages",
- "gnubash",
- "godotengine",
- "heroicon",
- "hljs",
- "hongik",
- "hoofd",
- "inqling",
- "Jimin",
- "katex",
- "Librewolf",
- "linaria",
- "nodedotjs",
- "noto",
- "pnpm",
- "pocketbase",
- "polybar",
- "Pomky",
- "precompress",
- "rainmeter",
- "sxhkd",
- "tailwindcss",
- "tauri",
- "texmath",
- "tinycolor",
- "tsup",
- "Turborepo",
- "ungoogled",
- "unixporn",
- "wbtimeline",
- "webassembly",
- "wouter",
- "YYYYMMDD"
- ],
- "eslint.workingDirectories": [{ "mode": "auto" }],
- "[svg]": {
- "editor.defaultFormatter": "jock.svg"
- },
- // prevent tailwind-related warnings
- "css.lint.unknownAtRules": "ignore",
- "less.lint.unknownAtRules": "ignore",
- "scss.lint.unknownAtRules": "ignore",
- // for .ejs files
- "html.validate.styles": false,
- "color-highlight.markerType": "outline",
- "[dotenv]": {
- "editor.defaultFormatter": "foxundermoon.shell-format"
- }
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.formatOnPaste": true,
+ "editor.formatOnSave": true,
+ "editor.detectIndentation": false,
+ "editor.insertSpaces": false,
+ "editor.codeActionsOnSave": {
+ "source.fixAll": true
+ },
+ "cSpell.words": [
+ "bspwm",
+ "cairographics",
+ "classnet",
+ "deno",
+ "developomp",
+ "developomp's",
+ "dompurify",
+ "elasticlunr",
+ "Exyle",
+ "exyleio",
+ "Fontawesome",
+ "Fonticons",
+ "fontsource",
+ "fortawesome",
+ "Freedesktop",
+ "GDSC",
+ "githubactions",
+ "githubpages",
+ "gnubash",
+ "godotengine",
+ "heroicon",
+ "hljs",
+ "hongik",
+ "hoofd",
+ "inqling",
+ "Jimin",
+ "katex",
+ "Librewolf",
+ "linaria",
+ "nodedotjs",
+ "noto",
+ "pnpm",
+ "pocketbase",
+ "polybar",
+ "Pomky",
+ "precompress",
+ "rainmeter",
+ "sxhkd",
+ "tailwindcss",
+ "tauri",
+ "texmath",
+ "tinycolor",
+ "tsup",
+ "Turborepo",
+ "ungoogled",
+ "unixporn",
+ "wbtimeline",
+ "webassembly",
+ "wouter",
+ "YYYYMMDD"
+ ],
+ "eslint.workingDirectories": [{ "mode": "auto" }],
+ "[svg]": {
+ "editor.defaultFormatter": "jock.svg"
+ },
+ // prevent tailwind-related warnings
+ "css.lint.unknownAtRules": "ignore",
+ "less.lint.unknownAtRules": "ignore",
+ "scss.lint.unknownAtRules": "ignore",
+ // for .ejs files
+ "html.validate.styles": false,
+ "color-highlight.markerType": "outline",
+ "[dotenv]": {
+ "editor.defaultFormatter": "foxundermoon.shell-format"
+ }
}
diff --git a/apps/blog/.eslintrc b/apps/blog/.eslintrc
index e3a9cfc..46c0586 100644
--- a/apps/blog/.eslintrc
+++ b/apps/blog/.eslintrc
@@ -1,30 +1,30 @@
{
- "root": true,
- "extends": [
- "eslint:recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:json/recommended",
- "prettier"
- ],
- "settings": {
- "node": {
- "tryExtensions": [".js", ".jsx", ".json"]
- },
- "react": {
- "version": "18.0"
- }
- },
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true
- },
- "sourceType": "module"
- },
- "plugins": ["@typescript-eslint"],
- "rules": {
- "@typescript-eslint/no-empty-interface": "off",
- "@typescript-eslint/explicit-module-boundary-types": "off",
- "react/react-in-jsx-scope": ["off"]
- }
+ "root": true,
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:json/recommended",
+ "prettier"
+ ],
+ "settings": {
+ "node": {
+ "tryExtensions": [".js", ".jsx", ".json"]
+ },
+ "react": {
+ "version": "18.0"
+ }
+ },
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaFeatures": {
+ "jsx": true
+ },
+ "sourceType": "module"
+ },
+ "plugins": ["@typescript-eslint"],
+ "rules": {
+ "@typescript-eslint/no-empty-interface": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "react/react-in-jsx-scope": ["off"]
+ }
}
diff --git a/apps/blog/package.json b/apps/blog/package.json
index 8d6eb14..d5faee3 100644
--- a/apps/blog/package.json
+++ b/apps/blog/package.json
@@ -1,71 +1,71 @@
{
- "name": "@developomp-site/blog",
- "version": "0.0.0",
- "private": true,
- "scripts": {
- "cp": "cp -a ../../packages/blog-content/dist/public/. ./public",
- "dev": "pnpm cp && react-scripts start",
- "build": "pnpm cp && react-scripts build",
- "clean": "rm -rf .turbo build node_modules"
- },
- "dependencies": {
- "@developomp-site/blog-content": "workspace:*",
- "@developomp-site/theme": "workspace:*",
- "@fontsource/noto-sans-kr": "^5.0.3",
- "@fontsource/source-code-pro": "^5.0.3",
- "@fortawesome/fontawesome-svg-core": "^6.2.1",
- "@fortawesome/free-brands-svg-icons": "^6.2.1",
- "@fortawesome/free-regular-svg-icons": "^6.2.1",
- "@fortawesome/free-solid-svg-icons": "^6.2.1",
- "@fortawesome/react-fontawesome": "^0.2.0",
- "elasticlunr": "^0.9.5",
- "highlight.js": "^11.7.0",
- "katex": "^0.16.4",
- "local-storage-fallback": "^4.1.2",
- "react": "^18.2.0",
- "react-collapse": "^5.1.1",
- "react-date-range": "^1.4.0",
- "react-device-detect": "^2.2.2",
- "react-dnd": "^16.0.1",
- "react-dnd-html5-backend": "^16.0.1",
- "react-dom": "^18.2.0",
- "react-helmet-async": "^1.3.0",
- "react-router-dom": "^6.4.5",
- "react-scripts": "^5.0.1",
- "react-select": "^5.7.0",
- "react-tooltip": "^4.5.1",
- "styled-components": "^5.3.6"
- },
- "devDependencies": {
- "@developomp-site/tsconfig": "workspace:*",
- "@styled/typescript-styled-plugin": "^1.0.0",
- "@types/elasticlunr": "^0.9.5",
- "@types/highlight.js": "^10.1.0",
- "@types/jsdom": "^20.0.1",
- "@types/katex": "^0.14.0",
- "@types/node": "^18.11.11",
- "@types/react": "^18.0.26",
- "@types/react-collapse": "^5.0.1",
- "@types/react-date-range": "^1.4.4",
- "@types/react-dom": "^18.0.9",
- "@types/react-select": "^5.0.1",
- "@types/styled-components": "^5.1.26",
- "jsdom": "^20.0.3",
- "prettier": "^2.8.1",
- "simple-icons": "^7.21.0",
- "tslint-config-prettier": "^1.18.0",
- "typescript": "^4.9.4"
- },
- "browserslist": {
- "production": [
- ">0.2%",
- "not dead",
- "not op_mini all"
- ],
- "development": [
- "last 1 chrome version",
- "last 1 firefox version",
- "last 1 safari version"
- ]
- }
+ "name": "@developomp-site/blog",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "cp": "cp -a ../../packages/blog-content/dist/public/. ./public",
+ "dev": "pnpm cp && react-scripts start",
+ "build": "pnpm cp && react-scripts build",
+ "clean": "rm -rf .turbo build node_modules"
+ },
+ "dependencies": {
+ "@developomp-site/blog-content": "workspace:*",
+ "@developomp-site/theme": "workspace:*",
+ "@fontsource/noto-sans-kr": "^5.0.3",
+ "@fontsource/source-code-pro": "^5.0.3",
+ "@fortawesome/fontawesome-svg-core": "^6.2.1",
+ "@fortawesome/free-brands-svg-icons": "^6.2.1",
+ "@fortawesome/free-regular-svg-icons": "^6.2.1",
+ "@fortawesome/free-solid-svg-icons": "^6.2.1",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "elasticlunr": "^0.9.5",
+ "highlight.js": "^11.7.0",
+ "katex": "^0.16.4",
+ "local-storage-fallback": "^4.1.2",
+ "react": "^18.2.0",
+ "react-collapse": "^5.1.1",
+ "react-date-range": "^1.4.0",
+ "react-device-detect": "^2.2.2",
+ "react-dnd": "^16.0.1",
+ "react-dnd-html5-backend": "^16.0.1",
+ "react-dom": "^18.2.0",
+ "react-helmet-async": "^1.3.0",
+ "react-router-dom": "^6.4.5",
+ "react-scripts": "^5.0.1",
+ "react-select": "^5.7.0",
+ "react-tooltip": "^4.5.1",
+ "styled-components": "^5.3.6"
+ },
+ "devDependencies": {
+ "@developomp-site/tsconfig": "workspace:*",
+ "@styled/typescript-styled-plugin": "^1.0.0",
+ "@types/elasticlunr": "^0.9.5",
+ "@types/highlight.js": "^10.1.0",
+ "@types/jsdom": "^20.0.1",
+ "@types/katex": "^0.14.0",
+ "@types/node": "^18.11.11",
+ "@types/react": "^18.0.26",
+ "@types/react-collapse": "^5.0.1",
+ "@types/react-date-range": "^1.4.4",
+ "@types/react-dom": "^18.0.9",
+ "@types/react-select": "^5.0.1",
+ "@types/styled-components": "^5.1.26",
+ "jsdom": "^20.0.3",
+ "prettier": "^2.8.1",
+ "simple-icons": "^7.21.0",
+ "tslint-config-prettier": "^1.18.0",
+ "typescript": "^4.9.4"
+ },
+ "browserslist": {
+ "production": [
+ ">0.2%",
+ "not dead",
+ "not op_mini all"
+ ],
+ "development": [
+ "last 1 chrome version",
+ "last 1 firefox version",
+ "last 1 safari version"
+ ]
+ }
}
diff --git a/apps/blog/public/index.html b/apps/blog/public/index.html
index d890ba3..aea458d 100644
--- a/apps/blog/public/index.html
+++ b/apps/blog/public/index.html
@@ -1,22 +1,22 @@
-
-
-
-
+
+
+
+
-
-
-
+
+
+
- pomp
-
-
-
-
-
+ pomp
+
+
+
+
+
diff --git a/apps/blog/src/App.tsx b/apps/blog/src/App.tsx
index a799e6e..e264100 100644
--- a/apps/blog/src/App.tsx
+++ b/apps/blog/src/App.tsx
@@ -21,74 +21,77 @@ import GlobalStyle from "./styles/globalStyle"
import { globalContext } from "./globalContext"
const IENotSupported = styled.p`
- margin: auto;
- font-size: 2rem;
- margin-top: 2rem;
- text-align: center;
- font-family: ${(props) => props.theme.theme.font.sansSerif};
+ margin: auto;
+ font-size: 2rem;
+ margin-top: 2rem;
+ text-align: center;
+ font-family: ${(props) => props.theme.theme.font.sansSerif};
`
const StyledContentContainer = styled.div`
- flex: 1 1 auto;
- margin-bottom: 3rem;
- margin-top: 5rem;
+ flex: 1 1 auto;
+ margin-bottom: 3rem;
+ margin-top: 5rem;
`
export default function App() {
- const { globalState } = useContext(globalContext)
+ const { globalState } = useContext(globalContext)
- const [isLoading, setIsLoading] = useState(true)
+ const [isLoading, setIsLoading] = useState(true)
- useEffect(() => {
- // set loading to false if all fonts are loaded
- // checks if document.fonts.onloadingdone is supported on the browser
- if (typeof document.fonts.onloadingdone != undefined) {
- document.fonts.onloadingdone = () => {
- setIsLoading(false)
- }
- } else {
- setIsLoading(false)
- }
- }, [])
+ useEffect(() => {
+ // set loading to false if all fonts are loaded
+ // checks if document.fonts.onloadingdone is supported on the browser
+ if (typeof document.fonts.onloadingdone != undefined) {
+ document.fonts.onloadingdone = () => {
+ setIsLoading(false)
+ }
+ } else {
+ setIsLoading(false)
+ }
+ }, [])
- if (isIE)
- return (
-
- Internet Explorer is not supported.
-
- )
+ if (isIE)
+ return (
+
+ Internet Explorer is not supported.
+
+ )
- return (
-
-
-
-
-
-
-
+ return (
+
+
+
+
+
+
+
-
+
-
-
- {isLoading ? (
-
- ) : (
-
- } />
- } />
- } />
- } />
- } />
-
- )}
-
-
-
- )
+
+
+ {isLoading ? (
+
+ ) : (
+
+ } />
+ } />
+ } />
+ } />
+ } />
+
+ )}
+
+
+
+ )
}
diff --git a/apps/blog/src/components/Card.tsx b/apps/blog/src/components/Card.tsx
index 07def93..01f1197 100644
--- a/apps/blog/src/components/Card.tsx
+++ b/apps/blog/src/components/Card.tsx
@@ -1,22 +1,24 @@
import styled, { css } from "styled-components"
export const cardCSS = css`
- margin: auto;
- background-color: ${({ theme }) =>
- theme.currentTheme ? theme.theme.component.card.color.background : "white"};
- padding: 2rem;
- border-radius: 6px;
- box-shadow: ${({ theme }) =>
- theme.currentTheme === "dark"
- ? "0 4px 10px rgb(0 0 0 / 30%), 0 0 1px rgb(0 0 0 / 30%)"
- : "0 4px 10px rgb(0 0 0 / 5%), 0 0 1px rgb(0 0 0 / 10%)"};
+ margin: auto;
+ background-color: ${({ theme }) =>
+ theme.currentTheme
+ ? theme.theme.component.card.color.background
+ : "white"};
+ padding: 2rem;
+ border-radius: 6px;
+ box-shadow: ${({ theme }) =>
+ theme.currentTheme === "dark"
+ ? "0 4px 10px rgb(0 0 0 / 30%), 0 0 1px rgb(0 0 0 / 30%)"
+ : "0 4px 10px rgb(0 0 0 / 5%), 0 0 1px rgb(0 0 0 / 10%)"};
- @media screen and (max-width: ${({ theme }) =>
- theme.theme.maxDisplayWidth.mobile}) {
- padding: 1rem;
- }
+ @media screen and (max-width: ${({ theme }) =>
+ theme.theme.maxDisplayWidth.mobile}) {
+ padding: 1rem;
+ }
`
export default styled.div`
- ${cardCSS}
+ ${cardCSS}
`
diff --git a/apps/blog/src/components/Footer/Footer.tsx b/apps/blog/src/components/Footer/Footer.tsx
index 964d58b..6b7c27e 100644
--- a/apps/blog/src/components/Footer/Footer.tsx
+++ b/apps/blog/src/components/Footer/Footer.tsx
@@ -3,41 +3,41 @@ import styled from "styled-components"
import GithubLinkIcon from "../GithubLinkIcon"
const StyledFooter = styled.footer`
- display: flex;
+ display: flex;
- // congratulation. You've found the lucky 7s
- min-height: 7.77rem;
- max-height: 7.77rem;
+ // congratulation. You've found the lucky 7s
+ min-height: 7.77rem;
+ max-height: 7.77rem;
- align-items: center;
- justify-content: center;
+ align-items: center;
+ justify-content: center;
- background-color: ${({ theme }) =>
- theme.theme.component.footer.color.background};
+ background-color: ${({ theme }) =>
+ theme.theme.component.footer.color.background};
`
const StyledFooterContainer = styled.div`
- display: flex;
- padding: 0 1rem 0 1rem;
- justify-content: space-between;
+ display: flex;
+ padding: 0 1rem 0 1rem;
+ justify-content: space-between;
- text-align: center;
- color: gray;
+ text-align: center;
+ color: gray;
- width: 100%;
- max-width: ${({ theme }) => theme.theme.maxDisplayWidth.desktop};
+ width: 100%;
+ max-width: ${({ theme }) => theme.theme.maxDisplayWidth.desktop};
`
export default () => {
- return (
-
-
-
- Created by developomp
-
+ return (
+
+
+
+ Created by developomp
+
-
-
-
- )
+
+
+
+ )
}
diff --git a/apps/blog/src/components/GithubLinkIcon.tsx b/apps/blog/src/components/GithubLinkIcon.tsx
index e723ee4..ed26773 100644
--- a/apps/blog/src/components/GithubLinkIcon.tsx
+++ b/apps/blog/src/components/GithubLinkIcon.tsx
@@ -5,31 +5,31 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faGithub } from "@fortawesome/free-brands-svg-icons"
const StyledGithubLink = styled.a<{ size?: string }>`
- font-size: ${(props) => props.size || "2.5rem"};
- color: ${({ theme }) =>
- theme.currentTheme === "dark" ? "grey" : "lightgrey"};
+ font-size: ${(props) => props.size || "2.5rem"};
+ color: ${({ theme }) =>
+ theme.currentTheme === "dark" ? "grey" : "lightgrey"};
- :hover {
- color: ${({ theme }) => theme.theme.color.text.highContrast};
- }
+ :hover {
+ color: ${({ theme }) => theme.theme.color.text.highContrast};
+ }
`
interface Props {
- link: string
- size?: string
- children?: ReactNode
+ link: string
+ size?: string
+ children?: ReactNode
}
export default ({ link, size, children }: Props) => {
- return (
-
-
- {children}
-
- )
+ return (
+
+
+ {children}
+
+ )
}
diff --git a/apps/blog/src/components/Header/Buttons/Buttons.tsx b/apps/blog/src/components/Header/Buttons/Buttons.tsx
index e8487a4..95cafe2 100644
--- a/apps/blog/src/components/Header/Buttons/Buttons.tsx
+++ b/apps/blog/src/components/Header/Buttons/Buttons.tsx
@@ -4,16 +4,16 @@ import ThemeToggleButton from "./ThemeToggleButton"
import SearchButton from "./SearchButton"
const RightButtons = styled.div`
- display: flex;
- height: 100%;
- margin-left: auto;
+ display: flex;
+ height: 100%;
+ margin-left: auto;
`
export default () => {
- return (
-
-
-
-
- )
+ return (
+
+
+
+
+ )
}
diff --git a/apps/blog/src/components/Header/Buttons/SearchButton.tsx b/apps/blog/src/components/Header/Buttons/SearchButton.tsx
index 79c7d45..4ac17b7 100644
--- a/apps/blog/src/components/Header/Buttons/SearchButton.tsx
+++ b/apps/blog/src/components/Header/Buttons/SearchButton.tsx
@@ -6,25 +6,25 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import { faSearch } from "@fortawesome/free-solid-svg-icons"
const SearchButton = () => {
- return (
- <>
-
-
-
-
-
-
-
-
- Search
-
- >
- )
+ return (
+ <>
+
+
+
+
+
+
+
+
+ Search
+
+ >
+ )
}
export default SearchButton
diff --git a/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx b/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx
index 68241a4..f09fa15 100644
--- a/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx
+++ b/apps/blog/src/components/Header/Buttons/ThemeToggleButton.tsx
@@ -10,42 +10,42 @@ import { ActionsEnum, globalContext } from "../../../globalContext"
import { HeaderButtonCSS } from "../HeaderButton"
const StyledThemeButton = styled.button`
- ${HeaderButtonCSS}
- border: none;
- width: 72px;
+ ${HeaderButtonCSS}
+ border: none;
+ width: 72px;
- ${({ theme }) =>
- theme.currentTheme === "dark" ? "transform: scaleX(-1)" : ""};
+ ${({ theme }) =>
+ theme.currentTheme === "dark" ? "transform: scaleX(-1)" : ""};
`
const ThemeToggleButton = () => {
- const { globalState, dispatch } = useContext(globalContext)
- const theme = globalState.currentTheme
+ const { globalState, dispatch } = useContext(globalContext)
+ const theme = globalState.currentTheme
- return (
- <>
-
- dispatch({
- type: ActionsEnum.UPDATE_THEME,
- payload: theme === "dark" ? "light" : "dark",
- })
- }
- >
- {theme == "dark" && }
- {theme == "light" && }
-
+ return (
+ <>
+
+ dispatch({
+ type: ActionsEnum.UPDATE_THEME,
+ payload: theme === "dark" ? "light" : "dark",
+ })
+ }
+ >
+ {theme == "dark" && }
+ {theme == "light" && }
+
- {!isMobile && (
-
- Using {theme} theme
-
- )}
- >
- )
+ {!isMobile && (
+
+ Using {theme} theme
+
+ )}
+ >
+ )
}
export default ThemeToggleButton
diff --git a/apps/blog/src/components/Header/Header.tsx b/apps/blog/src/components/Header/Header.tsx
index f85c8d8..180922f 100644
--- a/apps/blog/src/components/Header/Header.tsx
+++ b/apps/blog/src/components/Header/Header.tsx
@@ -9,50 +9,52 @@ import Sidebar from "../Sidebar"
import Buttons from "./Buttons"
const Header = styled.header`
- /* set z index to arbitrarily high value to prevent other components from drawing over it */
- z-index: 9999;
+ /* set z index to arbitrarily high value to prevent other components from drawing over it */
+ z-index: 9999;
- position: fixed;
- width: 100%;
+ position: fixed;
+ width: 100%;
- background-color: ${({ theme }) =>
- theme.theme.component.ui.color.background.default};
- color: ${({ theme }) => theme.theme.color.text.default};
- box-shadow: 0 4px 10px rgb(0 0 0 / 5%);
+ background-color: ${({ theme }) =>
+ theme.theme.component.ui.color.background.default};
+ color: ${({ theme }) => theme.theme.color.text.default};
+ box-shadow: 0 4px 10px rgb(0 0 0 / 5%);
`
const Container = styled.div`
- margin: 0 auto;
- align-items: center;
- display: flex;
- height: 4rem;
+ margin: 0 auto;
+ align-items: center;
+ display: flex;
+ height: 4rem;
- /* account for 20px scrollbar width */
- @media only screen and (min-width: calc(${({ theme }) =>
- theme.theme.maxDisplayWidth.desktop} + 20px)) {
- width: calc(${({ theme }) => theme.theme.maxDisplayWidth.desktop} - 20px);
- }
+ /* account for 20px scrollbar width */
+ @media only screen and (min-width: calc(${({ theme }) =>
+ theme.theme.maxDisplayWidth.desktop} + 20px)) {
+ width: calc(
+ ${({ theme }) => theme.theme.maxDisplayWidth.desktop} - 20px
+ );
+ }
`
const Icon = styled.img`
- height: 2.5rem;
+ height: 2.5rem;
- display: block;
- margin: 1rem;
+ display: block;
+ margin: 1rem;
`
export default () => {
- return (
-
- )
+ return (
+
+ )
}
diff --git a/apps/blog/src/components/Header/HeaderButton.tsx b/apps/blog/src/components/Header/HeaderButton.tsx
index 988a1a4..3b0a5fe 100644
--- a/apps/blog/src/components/Header/HeaderButton.tsx
+++ b/apps/blog/src/components/Header/HeaderButton.tsx
@@ -5,39 +5,39 @@
import styled, { css } from "styled-components"
export const HeaderButtonCSS = css`
- /* style */
+ /* style */
- display: flex;
- cursor: pointer;
- align-items: center;
- justify-content: center;
+ display: flex;
+ cursor: pointer;
+ align-items: center;
+ justify-content: center;
- /* size */
+ /* size */
- height: 100%;
- min-width: 2.5rem;
- margin: 0;
- padding: 0 1rem 0 1rem;
+ height: 100%;
+ min-width: 2.5rem;
+ margin: 0;
+ padding: 0 1rem 0 1rem;
- /* text */
+ /* text */
- text-decoration: none;
+ text-decoration: none;
- /* color */
+ /* color */
- color: ${({ theme }) => theme.theme.color.text.default};
- background-color: ${({ theme }) =>
- theme.theme.component.ui.color.background.default};
+ color: ${({ theme }) => theme.theme.color.text.default};
+ background-color: ${({ theme }) =>
+ theme.theme.component.ui.color.background.default};
- /* animation */
+ /* animation */
- transition: transform 0.1s linear;
- &:hover {
- background-color: ${({ theme }) =>
- theme.theme.component.ui.color.background.hover};
- }
+ transition: transform 0.1s linear;
+ &:hover {
+ background-color: ${({ theme }) =>
+ theme.theme.component.ui.color.background.hover};
+ }
`
export default styled.div`
- ${HeaderButtonCSS}
+ ${HeaderButtonCSS}
`
diff --git a/apps/blog/src/components/Header/Nav.tsx b/apps/blog/src/components/Header/Nav.tsx
index 470699a..375c7d6 100644
--- a/apps/blog/src/components/Header/Nav.tsx
+++ b/apps/blog/src/components/Header/Nav.tsx
@@ -6,29 +6,29 @@ import HeaderButton from "./HeaderButton"
import NavbarData from "../../data/NavbarData"
const Nav = styled.div`
- display: flex;
- height: 100%;
+ display: flex;
+ height: 100%;
- @media only screen and (max-width: ${({ theme }) =>
- theme.theme.maxDisplayWidth.mobile}) {
- display: none;
- }
+ @media only screen and (max-width: ${({ theme }) =>
+ theme.theme.maxDisplayWidth.mobile}) {
+ display: none;
+ }
`
export default () => {
- return (
-
- )
+ return (
+
+ )
}
diff --git a/apps/blog/src/components/Header/ReadProgress.tsx b/apps/blog/src/components/Header/ReadProgress.tsx
index 439380d..7ba8aff 100644
--- a/apps/blog/src/components/Header/ReadProgress.tsx
+++ b/apps/blog/src/components/Header/ReadProgress.tsx
@@ -3,15 +3,15 @@ import { useLocation } from "react-router-dom"
import styled from "styled-components"
const Background = styled.div`
- height: 0.2rem;
- background-color: ${({ theme }) =>
- theme.theme.component.scrollProgressBar.color.background};
+ height: 0.2rem;
+ background-color: ${({ theme }) =>
+ theme.theme.component.scrollProgressBar.color.background};
`
const ProgressBar = styled.div`
- height: 100%;
- background-color: ${({ theme }) =>
- theme.theme.component.scrollProgressBar.color.foreground};
+ height: 100%;
+ background-color: ${({ theme }) =>
+ theme.theme.component.scrollProgressBar.color.foreground};
`
const st = "scrollTop"
@@ -20,40 +20,42 @@ const h = document.documentElement
const b = document.body
const ReadProgress = () => {
- const [scroll, setScroll] = useState(0)
- const location = useLocation()
+ const [scroll, setScroll] = useState(0)
+ const location = useLocation()
- // https://stackoverflow.com/a/8028584/12979111
- const scrollHandler = useCallback(() => {
- setScroll(((h[st] || b[st]) / ((h[sh] || b[sh]) - h.clientHeight)) * 100)
- }, [])
+ // https://stackoverflow.com/a/8028584/12979111
+ const scrollHandler = useCallback(() => {
+ setScroll(
+ ((h[st] || b[st]) / ((h[sh] || b[sh]) - h.clientHeight)) * 100
+ )
+ }, [])
- useEffect(() => {
- const resizeObserver = new ResizeObserver(() => {
- scrollHandler()
- })
+ useEffect(() => {
+ const resizeObserver = new ResizeObserver(() => {
+ scrollHandler()
+ })
- resizeObserver.observe(document.body)
- window.addEventListener("scroll", scrollHandler)
+ resizeObserver.observe(document.body)
+ window.addEventListener("scroll", scrollHandler)
- return () => {
- resizeObserver.disconnect()
- window.removeEventListener("scroll", scrollHandler)
- }
- }, [])
+ return () => {
+ resizeObserver.disconnect()
+ window.removeEventListener("scroll", scrollHandler)
+ }
+ }, [])
- // update on path change
- useEffect(() => {
- setTimeout(() => {
- scrollHandler()
- }, 100)
- }, [location])
+ // update on path change
+ useEffect(() => {
+ setTimeout(() => {
+ scrollHandler()
+ }, 100)
+ }, [location])
- return (
-
-
-
- )
+ return (
+
+
+
+ )
}
export default ReadProgress
diff --git a/apps/blog/src/components/Loading.tsx b/apps/blog/src/components/Loading.tsx
index 8e13c7b..7a79df1 100644
--- a/apps/blog/src/components/Loading.tsx
+++ b/apps/blog/src/components/Loading.tsx
@@ -7,133 +7,133 @@ import styled from "styled-components"
import MainContent from "./MainContent"
const StyledContainer = styled(MainContent)`
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- text-align: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
- animation: fadein 2s;
- @keyframes fadein {
- from {
- opacity: 0;
- }
- 50% {
- opacity: 0;
- }
- to {
- opacity: 1;
- }
- }
+ animation: fadein 2s;
+ @keyframes fadein {
+ from {
+ opacity: 0;
+ }
+ 50% {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+ }
`
const StyledSVG = styled.svg`
- --color: ${({ theme }) => theme.theme.color.text.default};
+ --color: ${({ theme }) => theme.theme.color.text.default};
- display: block;
- margin: 1rem;
- margin-bottom: 4.5rem;
+ display: block;
+ margin: 1rem;
+ margin-bottom: 4.5rem;
- transform: scale(2);
+ transform: scale(2);
- #teabag {
- transform-origin: top center;
- transform: rotate(3deg);
- animation: swingAnimation 2s infinite;
- }
+ #teabag {
+ transform-origin: top center;
+ transform: rotate(3deg);
+ animation: swingAnimation 2s infinite;
+ }
- #steamL {
- stroke-dasharray: 13;
- stroke-dashoffset: 13;
- animation: steamLargeAnimation 2s infinite;
- }
+ #steamL {
+ stroke-dasharray: 13;
+ stroke-dashoffset: 13;
+ animation: steamLargeAnimation 2s infinite;
+ }
- #steamR {
- stroke-dasharray: 9;
- stroke-dashoffset: 9;
- animation: steamSmallAnimation 2s infinite;
- }
+ #steamR {
+ stroke-dasharray: 9;
+ stroke-dashoffset: 9;
+ animation: steamSmallAnimation 2s infinite;
+ }
- @keyframes swingAnimation {
- 50% {
- transform: rotate(-3deg);
- }
- }
+ @keyframes swingAnimation {
+ 50% {
+ transform: rotate(-3deg);
+ }
+ }
- @keyframes steamLargeAnimation {
- 0% {
- stroke-dashoffset: 13;
- opacity: 0.6;
- }
- 100% {
- stroke-dashoffset: 39;
- opacity: 0;
- }
- }
+ @keyframes steamLargeAnimation {
+ 0% {
+ stroke-dashoffset: 13;
+ opacity: 0.6;
+ }
+ 100% {
+ stroke-dashoffset: 39;
+ opacity: 0;
+ }
+ }
- @keyframes steamSmallAnimation {
- 10% {
- stroke-dashoffset: 9;
- opacity: 0.6;
- }
- 80% {
- stroke-dashoffset: 27;
- opacity: 0;
- }
- 100% {
- stroke-dashoffset: 27;
- opacity: 0;
- }
- }
+ @keyframes steamSmallAnimation {
+ 10% {
+ stroke-dashoffset: 9;
+ opacity: 0.6;
+ }
+ 80% {
+ stroke-dashoffset: 27;
+ opacity: 0;
+ }
+ 100% {
+ stroke-dashoffset: 27;
+ opacity: 0;
+ }
+ }
`
const Loading = () => {
- return (
-
-
-
-
-
-
-
-
- Loading...
-
- )
+ return (
+
+
+
+
+
+
+
+
+ Loading...
+
+ )
}
export default Loading
diff --git a/apps/blog/src/components/MainContent.tsx b/apps/blog/src/components/MainContent.tsx
index 82226f7..c8f7f72 100644
--- a/apps/blog/src/components/MainContent.tsx
+++ b/apps/blog/src/components/MainContent.tsx
@@ -3,26 +3,26 @@ import styled, { css } from "styled-components"
import Card from "./Card"
export const mainContentCSS = css`
- margin-top: 1rem;
- width: 50%;
+ margin-top: 1rem;
+ width: 50%;
- img {
- max-width: 100%;
- }
+ img {
+ max-width: 100%;
+ }
- table img {
- max-width: fit-content;
- }
+ table img {
+ max-width: fit-content;
+ }
- @media screen and (max-width: ${({ theme }) =>
- theme.theme.maxDisplayWidth.mobile}) {
- width: auto;
- margin: 1rem;
- }
+ @media screen and (max-width: ${({ theme }) =>
+ theme.theme.maxDisplayWidth.mobile}) {
+ width: auto;
+ margin: 1rem;
+ }
`
const MainContent = styled(Card)`
- ${mainContentCSS}
+ ${mainContentCSS}
`
export default MainContent
diff --git a/apps/blog/src/components/PostCard.tsx b/apps/blog/src/components/PostCard.tsx
index e5fdd86..30534ba 100644
--- a/apps/blog/src/components/PostCard.tsx
+++ b/apps/blog/src/components/PostCard.tsx
@@ -5,9 +5,9 @@ import { PostData } from "@developomp-site/blog-content/src/types/types"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import {
- faBook,
- faCalendar,
- faHourglass,
+ faBook,
+ faCalendar,
+ faHourglass,
} from "@fortawesome/free-solid-svg-icons"
import Tag from "./Tag"
@@ -15,85 +15,85 @@ import TagList from "./TagList"
import MainContent from "./MainContent"
const PostCard = styled(MainContent)`
- box-shadow: 0 4px 10px rgb(0 0 0 / 10%);
- text-align: left;
- margin-bottom: 2rem;
+ box-shadow: 0 4px 10px rgb(0 0 0 / 10%);
+ text-align: left;
+ margin-bottom: 2rem;
- :hover {
- cursor: pointer;
- box-shadow: 0 4px 10px
- ${({ theme }) => theme.theme.component.card.color.hoverGlow};
- }
+ :hover {
+ cursor: pointer;
+ box-shadow: 0 4px 10px
+ ${({ theme }) => theme.theme.component.card.color.hoverGlow};
+ }
`
const PostCardContainer = styled(Link)`
- display: block;
- padding: 2rem;
- text-decoration: none;
- padding: 0;
+ display: block;
+ padding: 2rem;
+ text-decoration: none;
+ padding: 0;
- /* override link color */
- color: ${({ theme }) => theme.theme.color.text.gray};
- &:hover {
- color: ${({ theme }) => theme.theme.color.text.gray};
- }
+ /* override link color */
+ color: ${({ theme }) => theme.theme.color.text.gray};
+ &:hover {
+ color: ${({ theme }) => theme.theme.color.text.gray};
+ }
`
const Title = styled.h1`
- font-size: 2rem;
- font-style: bold;
- margin: 0;
- margin-bottom: 1rem;
+ font-size: 2rem;
+ font-style: bold;
+ margin: 0;
+ margin-bottom: 1rem;
`
const MetaContainer = styled.small``
interface PostCardData extends PostData {
- content_id: string
+ content_id: string
}
interface Props {
- postData: PostCardData
+ postData: PostCardData
}
export default (props: Props) => {
- const { postData } = props
- const { content_id, wordCount, date, readTime, title, tags } = postData
+ const { postData } = props
+ const { content_id, wordCount, date, readTime, title, tags } = postData
- return (
-
-
-
- {title || "No title"}
- {/* show "(series)" for urls that matches regex "/series/" */}
- {/\/series\/[^/]*$/.test(content_id) && " (series)"}
-
+ return (
+
+
+
+ {title || "No title"}
+ {/* show "(series)" for urls that matches regex "/series/" */}
+ {/\/series\/[^/]*$/.test(content_id) && " (series)"}
+
-
+
-
-
- {tags &&
- tags.map((tag) => {
- return
- })}
-
-
-
-
- {date || "Unknown date"}
-
-
-
- {readTime ? readTime + " read" : "unknown read time"}
-
-
-
- {typeof wordCount === "number"
- ? wordCount + " words"
- : "unknown length"}
-
-
-
- )
+
+
+ {tags &&
+ tags.map((tag) => {
+ return
+ })}
+
+
+
+
+ {date || "Unknown date"}
+
+
+
+ {readTime ? readTime + " read" : "unknown read time"}
+
+
+
+ {typeof wordCount === "number"
+ ? wordCount + " words"
+ : "unknown length"}
+
+
+
+ )
}
diff --git a/apps/blog/src/components/Sidebar/Sidebar.tsx b/apps/blog/src/components/Sidebar/Sidebar.tsx
index a9ac9d3..a6f9384 100644
--- a/apps/blog/src/components/Sidebar/Sidebar.tsx
+++ b/apps/blog/src/components/Sidebar/Sidebar.tsx
@@ -12,99 +12,112 @@ import NavbarData from "../../data/NavbarData"
import { HeaderButtonCSS } from "../Header/HeaderButton"
const SidebarOpenButton = styled.div`
- ${HeaderButtonCSS}
+ ${HeaderButtonCSS}
- @media only screen and (min-width: ${({ theme }) =>
- theme.theme.maxDisplayWidth.mobile}) {
- display: none;
- }
+ @media only screen and (min-width: ${({ theme }) =>
+ theme.theme.maxDisplayWidth.mobile}) {
+ display: none;
+ }
`
const SidebarCloseButton = styled.div`
- ${HeaderButtonCSS}
- height: 4rem;
- font-size: 1.1rem;
+ ${HeaderButtonCSS}
+ height: 4rem;
+ font-size: 1.1rem;
- svg {
- margin-top: 0.2rem;
- margin-right: 0.5rem;
- }
+ svg {
+ margin-top: 0.2rem;
+ margin-right: 0.5rem;
+ }
`
const StyledOverlay = styled.div<{ isSidebarOpen: boolean }>`
- display: ${(props) => (props.isSidebarOpen ? "block" : "none")};
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 20;
- transition-property: opacity;
- background-color: rgba(0, 0, 0, 25%);
+ display: ${(props) => (props.isSidebarOpen ? "block" : "none")};
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 20;
+ transition-property: opacity;
+ background-color: rgba(0, 0, 0, 25%);
- * {
- overflow: scroll;
- }
+ * {
+ overflow: scroll;
+ }
`
const SidebarNav = styled.nav<{ isSidebarOpen: boolean }>`
- width: 250px;
- height: 100vh;
- display: flex;
- justify-content: center;
- position: fixed;
- top: 0;
- right: ${(props) => (props.isSidebarOpen ? "0" : "-100%")};
- transition: 350ms;
- z-index: 30;
- overflow-x: hidden;
- overflow-y: scroll;
- background-color: ${({ theme }) =>
- theme.theme.component.header.color.background};
- color: ${({ theme }) => theme.theme.component.header.color.text};
+ width: 250px;
+ height: 100vh;
+ display: flex;
+ justify-content: center;
+ position: fixed;
+ top: 0;
+ right: ${(props) => (props.isSidebarOpen ? "0" : "-100%")};
+ transition: 350ms;
+ z-index: 30;
+ overflow-x: hidden;
+ overflow-y: scroll;
+ background-color: ${({ theme }) =>
+ theme.theme.component.header.color.background};
+ color: ${({ theme }) => theme.theme.component.header.color.text};
`
const SidebarWrap = styled.div`
- width: 100%;
+ width: 100%;
`
const Sidebar = () => {
- const [isSidebarOpen, setSidebarOpen] = useState(false)
- const toggleSidebar = useCallback(() => {
- setSidebarOpen((prev) => !prev)
- document.body.style.overflow = isSidebarOpen ? "" : "hidden"
- }, [isSidebarOpen])
+ const [isSidebarOpen, setSidebarOpen] = useState(false)
+ const toggleSidebar = useCallback(() => {
+ setSidebarOpen((prev) => !prev)
+ document.body.style.overflow = isSidebarOpen ? "" : "hidden"
+ }, [isSidebarOpen])
- return (
- <>
-
+ return (
+ <>
+
-
-
- {!isMobile && (
-
- )}
-
+
+
+ {!isMobile && (
+
+ )}
+
-
-
- {/* close sidebar button */}
+
+
+ {/* close sidebar button */}
-
- Close
-
+
+ Close
+
- {/* sidebar items */}
+ {/* sidebar items */}
- {NavbarData.map((item, index) => {
- return
- })}
-
-
- >
- )
+ {NavbarData.map((item, index) => {
+ return (
+
+ )
+ })}
+
+
+ >
+ )
}
export default Sidebar
diff --git a/apps/blog/src/components/Sidebar/SubMenu.tsx b/apps/blog/src/components/Sidebar/SubMenu.tsx
index 486bb82..3d2a8b1 100644
--- a/apps/blog/src/components/Sidebar/SubMenu.tsx
+++ b/apps/blog/src/components/Sidebar/SubMenu.tsx
@@ -11,70 +11,74 @@ import styled, { css } from "styled-components"
import button from "../../styles/button"
const sharedStyle = css`
- ${button};
- display: flex;
- width: 100%;
- margin: 0;
- border-radius: 0;
- justify-content: space-between;
- height: 2rem;
- align-items: center;
- padding: 20px;
- list-style: none;
+ ${button};
+ display: flex;
+ width: 100%;
+ margin: 0;
+ border-radius: 0;
+ justify-content: space-between;
+ height: 2rem;
+ align-items: center;
+ padding: 20px;
+ list-style: none;
- svg {
- scale: 1.5;
- }
+ svg {
+ scale: 1.5;
+ }
- &:hover {
- color: inherit;
- }
+ &:hover {
+ color: inherit;
+ }
`
const SidebarLink = styled(Link)`
- ${sharedStyle}
+ ${sharedStyle}
`
const SidebarAnchor = styled.a`
- ${sharedStyle}
+ ${sharedStyle}
`
const SidebarLabel = styled.span`
- margin-left: 1rem;
+ margin-left: 1rem;
`
interface Props {
- item: Item
- onClick: () => void
+ item: Item
+ onClick: () => void
}
const SubMenu = ({ item, onClick }: Props) => {
- const { path, icon, title } = item
- const [isSubNavOpen, setSubNavOpen] = useState(false)
- const handleSidebarLinkClick = useCallback(() => {
- onClick()
- setSubNavOpen((prev) => !prev)
- }, [isSubNavOpen])
+ const { path, icon, title } = item
+ const [isSubNavOpen, setSubNavOpen] = useState(false)
+ const handleSidebarLinkClick = useCallback(() => {
+ onClick()
+ setSubNavOpen((prev) => !prev)
+ }, [isSubNavOpen])
- if (path.at(0) == "/") {
- return (
-
-
- {icon}
- {title}
-
-
- )
- }
+ if (path.at(0) == "/") {
+ return (
+
+
+ {icon}
+ {title}
+
+
+ )
+ }
- return (
-
-
- {icon}
- {title}
-
-
- )
+ return (
+
+
+ {icon}
+ {title}
+
+
+ )
}
export default SubMenu
diff --git a/apps/blog/src/components/Tag.tsx b/apps/blog/src/components/Tag.tsx
index 7abecc4..8ddbb24 100644
--- a/apps/blog/src/components/Tag.tsx
+++ b/apps/blog/src/components/Tag.tsx
@@ -5,23 +5,23 @@ import { faHashtag } from "@fortawesome/free-solid-svg-icons"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
const Tag = styled.div`
- text-align: center;
+ text-align: center;
- margin-right: 0.8rem;
- border-radius: 10px;
+ margin-right: 0.8rem;
+ border-radius: 10px;
- color: ${({ theme }) => theme.theme.color.text.gray};
+ color: ${({ theme }) => theme.theme.color.text.gray};
`
interface Props {
- text: string
- onClick?: (event: MouseEvent) => void
+ text: string
+ onClick?: (event: MouseEvent) => void
}
export default (props: Props) => {
- return (
-
- {props.text}
-
- )
+ return (
+
+ {props.text}
+
+ )
}
diff --git a/apps/blog/src/components/TagList.tsx b/apps/blog/src/components/TagList.tsx
index bea589f..bf5ec1a 100644
--- a/apps/blog/src/components/TagList.tsx
+++ b/apps/blog/src/components/TagList.tsx
@@ -2,25 +2,25 @@ import { ReactNode } from "react"
import styled from "styled-components"
const StyledTagList = styled.div<{ direction: string }>`
- display: flex;
- flex-wrap: wrap;
- row-gap: 0.5rem;
- column-gap: 0.5rem;
- flex-direction: row;
- justify-content: ${({ direction }) => direction};
+ display: flex;
+ flex-wrap: wrap;
+ row-gap: 0.5rem;
+ column-gap: 0.5rem;
+ flex-direction: row;
+ justify-content: ${({ direction }) => direction};
`
interface Props {
- direction?: string
- children?: ReactNode | undefined
+ direction?: string
+ children?: ReactNode | undefined
}
const TagList = (props: Props) => {
- return (
-
- {props.children}
-
- )
+ return (
+
+ {props.children}
+
+ )
}
export default TagList
diff --git a/apps/blog/src/data/NavbarData.tsx b/apps/blog/src/data/NavbarData.tsx
index a5ddaf3..064a98e 100644
--- a/apps/blog/src/data/NavbarData.tsx
+++ b/apps/blog/src/data/NavbarData.tsx
@@ -1,39 +1,39 @@
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import {
- faHome,
- faFileLines,
- faUser,
- faUserTie,
+ faHome,
+ faFileLines,
+ faUser,
+ faUserTie,
} from "@fortawesome/free-solid-svg-icons"
// item from sidebar data
export type Item = {
- path: string
- icon: JSX.Element
- title: string
+ path: string
+ icon: JSX.Element
+ title: string
}
const NavbarData: Item[] = [
- {
- title: "Home",
- path: "/",
- icon: ,
- },
- {
- title: "About",
- path: "https://developomp.com",
- icon: ,
- },
- {
- title: "Portfolio",
- path: "https://portfolio.developomp.com",
- icon: ,
- },
- {
- title: "Resume",
- path: "/resume",
- icon: ,
- },
+ {
+ title: "Home",
+ path: "/",
+ icon: ,
+ },
+ {
+ title: "About",
+ path: "https://developomp.com",
+ icon: ,
+ },
+ {
+ title: "Portfolio",
+ path: "https://portfolio.developomp.com",
+ icon: ,
+ },
+ {
+ title: "Resume",
+ path: "/resume",
+ icon: ,
+ },
]
export default NavbarData
diff --git a/apps/blog/src/globalContext.tsx b/apps/blog/src/globalContext.tsx
index 9379c3e..78f75eb 100644
--- a/apps/blog/src/globalContext.tsx
+++ b/apps/blog/src/globalContext.tsx
@@ -9,61 +9,61 @@ import storage from "local-storage-fallback"
export type SiteTheme = "dark" | "light"
export enum ActionsEnum {
- UPDATE_THEME,
- UPDATE_LOCALE,
+ UPDATE_THEME,
+ UPDATE_LOCALE,
}
// union of all actions
export type GlobalAction = {
- type: ActionsEnum.UPDATE_THEME
- payload: SiteTheme
+ type: ActionsEnum.UPDATE_THEME
+ payload: SiteTheme
}
export interface IGlobalState {
- currentTheme: SiteTheme
- theme: Theme
+ currentTheme: SiteTheme
+ theme: Theme
}
export interface IGlobalContext {
- globalState: IGlobalState
- dispatch: Dispatch
+ globalState: IGlobalState
+ dispatch: Dispatch
}
const defaultState: IGlobalState = {
- currentTheme: (storage.getItem("theme") || "dark") as SiteTheme,
- theme:
- ((storage.getItem("theme") || "dark") as SiteTheme) === "dark"
- ? darkTheme
- : lightTheme,
+ currentTheme: (storage.getItem("theme") || "dark") as SiteTheme,
+ theme:
+ ((storage.getItem("theme") || "dark") as SiteTheme) === "dark"
+ ? darkTheme
+ : lightTheme,
}
export const globalContext = createContext({} as IGlobalContext)
function reducer(state = defaultState, action: GlobalAction): IGlobalState {
- switch (action.type) {
- case ActionsEnum.UPDATE_THEME:
- state.currentTheme = action.payload
- state.theme = state.currentTheme === "dark" ? darkTheme : lightTheme
- break
+ switch (action.type) {
+ case ActionsEnum.UPDATE_THEME:
+ state.currentTheme = action.payload
+ state.theme = state.currentTheme === "dark" ? darkTheme : lightTheme
+ break
- default:
- break
- }
+ default:
+ break
+ }
- return { ...state }
+ return { ...state }
}
export function GlobalStore(props: { children: ReactNode }): ReactElement {
- const [globalState, dispatch] = useReducer(reducer, defaultState)
+ const [globalState, dispatch] = useReducer(reducer, defaultState)
- // save theme when it is changed
- useEffect(() => {
- storage.setItem("theme", globalState.currentTheme)
- }, [globalState.currentTheme])
+ // save theme when it is changed
+ useEffect(() => {
+ storage.setItem("theme", globalState.currentTheme)
+ }, [globalState.currentTheme])
- return (
-
- {props.children}
-
- )
+ return (
+
+ {props.children}
+
+ )
}
diff --git a/apps/blog/src/index.tsx b/apps/blog/src/index.tsx
index 1020d46..5e13bf0 100644
--- a/apps/blog/src/index.tsx
+++ b/apps/blog/src/index.tsx
@@ -12,11 +12,11 @@ import App from "./App"
const container = document.getElementById("root") as HTMLElement
const root = createRoot(container)
root.render(
-
-
-
-
-
-
-
+
+
+
+
+
+
+
)
diff --git a/apps/blog/src/pages/Home/Home.tsx b/apps/blog/src/pages/Home/Home.tsx
index bf02733..eb78a82 100644
--- a/apps/blog/src/pages/Home/Home.tsx
+++ b/apps/blog/src/pages/Home/Home.tsx
@@ -13,75 +13,75 @@ import ShowMoreButton from "./ShowMoreButton"
import contentMap from "../../contentMap"
const PostList = styled.div`
- flex-direction: column;
- align-items: center;
- text-align: center;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
- color: ${({ theme }) => theme.theme.color.text.default};
+ color: ${({ theme }) => theme.theme.color.text.default};
`
export default () => {
- const [howMany, setHowMany] = useState(5)
- const [postsLength, setPostsLength] = useState(0)
- const [postCards, setPostCards] = useState([])
+ const [howMany, setHowMany] = useState(5)
+ const [postsLength, setPostsLength] = useState(0)
+ const [postCards, setPostCards] = useState([])
- const loadPostCards = useCallback(() => {
- let postCount = 0
- const postCards = [] as JSX.Element[]
+ const loadPostCards = useCallback(() => {
+ let postCount = 0
+ const postCards = [] as JSX.Element[]
- for (const date of Object.keys(contentMap.date).reverse()) {
- if (postCount >= howMany) break
+ for (const date of Object.keys(contentMap.date).reverse()) {
+ if (postCount >= howMany) break
- const length = contentMap.date[date].length
+ const length = contentMap.date[date].length
- for (let i = 0; i < length; i++) {
- if (postCount >= howMany) break
+ for (let i = 0; i < length; i++) {
+ if (postCount >= howMany) break
- postCount++
- const content_id = contentMap.date[date][length - i - 1]
+ postCount++
+ const content_id = contentMap.date[date][length - i - 1]
- postCards.push(
-
- )
- }
- }
+ postCards.push(
+
+ )
+ }
+ }
- setPostCards(postCards)
- }, [howMany, postCards])
+ setPostCards(postCards)
+ }, [howMany, postCards])
- useEffect(() => {
- loadPostCards()
- setPostsLength(Object.keys(contentMap.posts).length)
- }, [howMany])
+ useEffect(() => {
+ loadPostCards()
+ setPostsLength(Object.keys(contentMap.posts).length)
+ }, [howMany])
- return (
- <>
-
- pomp | Home
+ return (
+ <>
+
+ pomp | Home
-
-
-
+
+
+
-
- Recent Posts
+
+ Recent Posts
- {postCards}
+ {postCards}
- {postsLength > howMany && (
- {
- setHowMany((prev) => prev + 5)
- }}
- />
- )}
-
- >
- )
+ {postsLength > howMany && (
+ {
+ setHowMany((prev) => prev + 5)
+ }}
+ />
+ )}
+
+ >
+ )
}
diff --git a/apps/blog/src/pages/Home/ShowMoreButton.tsx b/apps/blog/src/pages/Home/ShowMoreButton.tsx
index 93787a4..769c4e5 100644
--- a/apps/blog/src/pages/Home/ShowMoreButton.tsx
+++ b/apps/blog/src/pages/Home/ShowMoreButton.tsx
@@ -3,16 +3,16 @@ import styled from "styled-components"
import buttonStyle from "../../styles/button"
const Button = styled.button`
- ${buttonStyle}
+ ${buttonStyle}
- /* center div */
+ /* center div */
margin: 0 auto;
`
interface Props {
- action(): void
+ action(): void
}
export default (props: Props) => {
- return
+ return
}
diff --git a/apps/blog/src/pages/NotFound.tsx b/apps/blog/src/pages/NotFound.tsx
index 121e2c5..239ac57 100644
--- a/apps/blog/src/pages/NotFound.tsx
+++ b/apps/blog/src/pages/NotFound.tsx
@@ -4,36 +4,36 @@ import { Helmet } from "react-helmet-async"
import MainContent from "../components/MainContent"
const StyledNotFound = styled(MainContent)`
- text-align: center;
+ text-align: center;
`
const Styled404 = styled.h1`
- font-size: 5rem;
+ font-size: 5rem;
`
const NotFound = () => {
- return (
- <>
-
- pomp | 404
+ return (
+ <>
+
+ pomp | 404
-
-
-
-
-
-
+
+
+
+
+
+
-
- 404
-
- Page was not found :(
-
- >
- )
+
+ 404
+
+ Page was not found :(
+
+ >
+ )
}
export default NotFound
diff --git a/apps/blog/src/pages/Page/Meta.tsx b/apps/blog/src/pages/Page/Meta.tsx
index aaa0892..1a58ab5 100644
--- a/apps/blog/src/pages/Page/Meta.tsx
+++ b/apps/blog/src/pages/Page/Meta.tsx
@@ -1,52 +1,53 @@
import styled from "styled-components"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import {
- faBook,
- faCalendar,
- faFile,
- faHourglass,
+ faBook,
+ faCalendar,
+ faFile,
+ faHourglass,
} from "@fortawesome/free-solid-svg-icons"
import { PageData } from "@developomp-site/blog-content/src/types/types"
const StyledMetaContainer = styled.div`
- color: ${({ theme }) => theme.theme.color.text.gray};
+ color: ${({ theme }) => theme.theme.color.text.gray};
`
const Meta = (props: { fetchedPage: PageData }) => {
- return (
-
- {/* posts count */}
- {props.fetchedPage.length > 0 && (
- <>
-
-
- {props.fetchedPage.length} post
- {props.fetchedPage.length > 1 && "s"}
- >
- )}
- {/* date */}
-
-
- {props.fetchedPage.date || "Unknown date"}
-
- {/* read time */}
-
-
- {props.fetchedPage.readTime
- ? props.fetchedPage.readTime + " read"
- : "unknown length"}
-
- {/* word count */}
-
-
- {props.fetchedPage.wordCount
- ? props.fetchedPage.wordCount +
- " word" +
- (props.fetchedPage.wordCount > 1 && "s")
- : "unknown words"}
-
- )
+ return (
+
+ {/* posts count */}
+ {props.fetchedPage.length > 0 && (
+ <>
+
+
+ {props.fetchedPage.length} post
+ {props.fetchedPage.length > 1 && "s"}{" "}
+
+ >
+ )}
+ {/* date */}
+
+
+ {props.fetchedPage.date || "Unknown date"}
+
+ {/* read time */}
+
+
+ {props.fetchedPage.readTime
+ ? props.fetchedPage.readTime + " read"
+ : "unknown length"}
+
+ {/* word count */}
+
+
+ {props.fetchedPage.wordCount
+ ? props.fetchedPage.wordCount +
+ " word" +
+ (props.fetchedPage.wordCount > 1 && "s")
+ : "unknown words"}
+
+ )
}
export default Meta
diff --git a/apps/blog/src/pages/Page/Page.tsx b/apps/blog/src/pages/Page/Page.tsx
index a0c246a..903738b 100644
--- a/apps/blog/src/pages/Page/Page.tsx
+++ b/apps/blog/src/pages/Page/Page.tsx
@@ -12,10 +12,10 @@ import NotFound from "../NotFound"
import SeriesControlButtons from "./SeriesControlButtons"
import {
- categorizePageType,
- fetchContent,
- PageType,
- parsePageData,
+ categorizePageType,
+ fetchContent,
+ PageType,
+ parsePageData,
} from "./helper"
import Meta from "./Meta"
import Toc from "./Toc"
@@ -25,112 +25,114 @@ import type { PageData } from "@developomp-site/blog-content/src/types/types"
import contentMap from "../../contentMap"
const StyledTitle = styled.h1`
- margin-bottom: 1rem;
+ margin-bottom: 1rem;
- word-wrap: break-word;
+ word-wrap: break-word;
`
export default function Page() {
- const { pathname } = useLocation()
+ const { pathname } = useLocation()
- const [pageData, setPageData] = useState(undefined)
- const [pageType, setPageType] = useState(PageType.POST)
- const [isLoading, setIsLoading] = useState(true)
+ const [pageData, setPageData] = useState(undefined)
+ const [pageType, setPageType] = useState(PageType.POST)
+ const [isLoading, setIsLoading] = useState(true)
- // this code runs if either the url or the locale changes
- useEffect(() => {
- const content_id = pathname.replace(/\/$/, "") // remove trailing slash
- const pageType = categorizePageType(content_id)
+ // this code runs if either the url or the locale changes
+ useEffect(() => {
+ const content_id = pathname.replace(/\/$/, "") // remove trailing slash
+ const pageType = categorizePageType(content_id)
- fetchContent(pageType, content_id).then((fetched_content) => {
- if (!fetched_content) {
- // stop loading without fetching pageData so 404 page will display
- setIsLoading(false)
+ fetchContent(pageType, content_id).then((fetched_content) => {
+ if (!fetched_content) {
+ // stop loading without fetching pageData so 404 page will display
+ setIsLoading(false)
- return
- }
+ return
+ }
- setPageData(parsePageData(fetched_content, pageType, content_id))
- setPageType(pageType)
- setIsLoading(false)
- })
- }, [pathname])
+ setPageData(parsePageData(fetched_content, pageType, content_id))
+ setPageType(pageType)
+ setIsLoading(false)
+ })
+ }, [pathname])
- if (isLoading) return
+ if (isLoading) return
- if (!pageData) return
+ if (!pageData) return
- return (
- <>
-
- pomp | {pageData.title}
+ return (
+ <>
+
+ pomp | {pageData.title}
-
-
-
-
+
+
+
+
-
- {/* next/previous series post buttons */}
- {pageType == PageType.SERIES && (
-
- )}
+
+ {/* next/previous series post buttons */}
+ {pageType == PageType.SERIES && (
+
+ )}
- {pageData.title}
+ {pageData.title}
-
- {/* Post tags */}
- {pageData.tags.length > 0 && (
-
- {pageData.tags.map((tag) => {
- return (
-
-
-
- )
- })}
-
- )}
+
+ {/* Post tags */}
+ {pageData.tags.length > 0 && (
+
+ {pageData.tags.map((tag) => {
+ return (
+
+
+
+ )
+ })}
+
+ )}
-
+
- {/* Post metadata */}
- {[PageType.POST, PageType.SERIES, PageType.SERIES_HOME].includes(
- pageType
- ) && }
-
+ {/* Post metadata */}
+ {[
+ PageType.POST,
+ PageType.SERIES,
+ PageType.SERIES_HOME,
+ ].includes(pageType) && }
+
-
+
- {/* add table of contents if it exists */}
-
+ {/* add table of contents if it exists */}
+
- {/* page content */}
-
-
+ {/* page content */}
+
+
- {/* series post list */}
+ {/* series post list */}
- {pageType == PageType.SERIES_HOME &&
- pageData.order.map((post) => {
- return (
-
- )
- })}
- >
- )
+ {pageType == PageType.SERIES_HOME &&
+ pageData.order.map((post) => {
+ return (
+
+ )
+ })}
+ >
+ )
}
diff --git a/apps/blog/src/pages/Page/SeriesControlButtons.tsx b/apps/blog/src/pages/Page/SeriesControlButtons.tsx
index f5af178..1e02d6e 100644
--- a/apps/blog/src/pages/Page/SeriesControlButtons.tsx
+++ b/apps/blog/src/pages/Page/SeriesControlButtons.tsx
@@ -3,69 +3,69 @@ import { Link } from "react-router-dom"
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"
import {
- faArrowLeft,
- faArrowRight,
- faListUl,
+ faArrowLeft,
+ faArrowRight,
+ faListUl,
} from "@fortawesome/free-solid-svg-icons"
import buttonStyle from "../../styles/button"
const Container = styled.div`
- display: flex;
- justify-content: space-between;
+ display: flex;
+ justify-content: space-between;
`
const Button = styled.div`
- ${buttonStyle}
+ ${buttonStyle}
`
const DisabledButton = styled.div`
- ${buttonStyle}
+ ${buttonStyle}
- color: grey;
- cursor: default;
+ color: grey;
+ cursor: default;
`
interface Props {
- seriesHome: string
- prevURL?: string
- nextURL?: string
+ seriesHome: string
+ prevURL?: string
+ nextURL?: string
}
function SeriesControlButtons({ prevURL, seriesHome, nextURL }: Props) {
- return (
-
- {prevURL ? (
-
-
-
- ) : (
-
-
-
- )}
+ return (
+
+ {prevURL ? (
+
+
+
+ ) : (
+
+
+
+ )}
-
-
-
+
+
+
- {nextURL ? (
-
-
-
- ) : (
-
-
-
- )}
-
- )
+ {nextURL ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+ )
}
export default SeriesControlButtons
diff --git a/apps/blog/src/pages/Page/Toc.tsx b/apps/blog/src/pages/Page/Toc.tsx
index 7a099d9..ee77363 100644
--- a/apps/blog/src/pages/Page/Toc.tsx
+++ b/apps/blog/src/pages/Page/Toc.tsx
@@ -7,52 +7,54 @@ import { faCaretDown, faCaretUp } from "@fortawesome/free-solid-svg-icons"
import styled from "styled-components"
const StyledTocToggleButton = styled.button`
- cursor: pointer;
- border: none;
- text-align: left;
- background-color: rgba(0, 0, 0, 0);
- width: 100%;
- padding: 0.5rem;
- color: ${({ theme }) => theme.theme.color.text.highContrast};
+ cursor: pointer;
+ border: none;
+ text-align: left;
+ background-color: rgba(0, 0, 0, 0);
+ width: 100%;
+ padding: 0.5rem;
+ color: ${({ theme }) => theme.theme.color.text.highContrast};
`
const StyledCollapseContainer = styled.div`
- * {
- transition: height 200ms ease-out;
- }
+ * {
+ transition: height 200ms ease-out;
+ }
`
const Toc = (props: { data?: string }) => {
- const [isTocOpened, setIsTocOpened] = useState(
- storage.getItem("isTocOpened") == "true"
- )
+ const [isTocOpened, setIsTocOpened] = useState(
+ storage.getItem("isTocOpened") == "true"
+ )
- useEffect(() => {
- storage.setItem("isTocOpened", isTocOpened.toString())
- }, [isTocOpened])
+ useEffect(() => {
+ storage.setItem("isTocOpened", isTocOpened.toString())
+ }, [isTocOpened])
- if (!props.data) return <>>
+ if (!props.data) return <>>
- return (
- <>
- {
- setIsTocOpened((prev) => !prev)
- }}
- >
-
- Table of Contents
-
-
-
-
-
-
-
-
-
- >
- )
+ return (
+ <>
+ {
+ setIsTocOpened((prev) => !prev)
+ }}
+ >
+
+ Table of Contents
+
+
+
+
+
+
+
+
+
+ >
+ )
}
export default Toc
diff --git a/apps/blog/src/pages/Page/helper.ts b/apps/blog/src/pages/Page/helper.ts
index 0e5755c..cdebdfd 100644
--- a/apps/blog/src/pages/Page/helper.ts
+++ b/apps/blog/src/pages/Page/helper.ts
@@ -5,163 +5,165 @@ import type { PageData } from "@developomp-site/blog-content/src/types/types"
import contentMap from "../../contentMap"
export enum PageType {
- POST,
- SERIES,
- SERIES_HOME,
- PORTFOLIO_PROJECT,
- UNSEARCHABLE,
+ POST,
+ SERIES,
+ SERIES_HOME,
+ PORTFOLIO_PROJECT,
+ UNSEARCHABLE,
}
export async function fetchContent(pageType: PageType, url: string) {
- try {
- if (pageType == PageType.UNSEARCHABLE) {
- return await import(
- `@developomp-site/blog-content/dist/content/unsearchable${url}.json`
- )
- } else {
- return await import(
- `@developomp-site/blog-content/dist/content${url}.json`
- )
- }
- } catch (err) {
- return
- }
+ try {
+ if (pageType == PageType.UNSEARCHABLE) {
+ return await import(
+ `@developomp-site/blog-content/dist/content/unsearchable${url}.json`
+ )
+ } else {
+ return await import(
+ `@developomp-site/blog-content/dist/content${url}.json`
+ )
+ }
+ } catch (err) {
+ return
+ }
}
export function categorizePageType(content_id: string): PageType {
- if (content_id.startsWith("/post")) return PageType.POST
- if (content_id.startsWith("/portfolio")) return PageType.PORTFOLIO_PROJECT
- if (content_id.startsWith("/series")) {
- // if the URL looks like /series/series-title (if the url has two slashes)
- if ([...(content_id.match(/\//g) || [])].length == 2)
- return PageType.SERIES_HOME
+ if (content_id.startsWith("/post")) return PageType.POST
+ if (content_id.startsWith("/portfolio")) return PageType.PORTFOLIO_PROJECT
+ if (content_id.startsWith("/series")) {
+ // if the URL looks like /series/series-title (if the url has two slashes)
+ if ([...(content_id.match(/\//g) || [])].length == 2)
+ return PageType.SERIES_HOME
- // if the URL looks like /series/series-title/post-title (if the url does not have 2 slashes)
- return PageType.SERIES
- }
+ // if the URL looks like /series/series-title/post-title (if the url does not have 2 slashes)
+ return PageType.SERIES
+ }
- return PageType.UNSEARCHABLE
+ return PageType.UNSEARCHABLE
}
export function parsePageData(
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- fetched_content: any,
- pageType: PageType,
- content_id: string
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ fetched_content: any,
+ pageType: PageType,
+ content_id: string
): PageData {
- // page date to be saved as a react state
- const pageData: PageData = {
- title: "No title",
- date: "Unknown date",
- readTime: "Unknown read time",
- wordCount: 0,
- tags: [],
- toc: undefined,
- content: "No content",
+ // page date to be saved as a react state
+ const pageData: PageData = {
+ title: "No title",
+ date: "Unknown date",
+ readTime: "Unknown read time",
+ wordCount: 0,
+ tags: [],
+ toc: undefined,
+ content: "No content",
- // series
+ // series
- seriesHome: "",
- prev: "",
- next: "",
+ seriesHome: "",
+ prev: "",
+ next: "",
- // series home
+ // series home
- order: [],
- length: 0,
+ order: [],
+ length: 0,
- // portfolio
+ // portfolio
- image: "",
- overview: "",
- badges: [],
- repo: "",
- }
+ image: "",
+ overview: "",
+ badges: [],
+ repo: "",
+ }
- // load and parse content differently depending on the content type
- switch (pageType) {
- case PageType.POST: {
- const post = contentMap.posts[content_id]
+ // load and parse content differently depending on the content type
+ switch (pageType) {
+ case PageType.POST: {
+ const post = contentMap.posts[content_id]
- pageData.content = fetched_content.content
- pageData.toc = fetched_content.toc
+ pageData.content = fetched_content.content
+ pageData.toc = fetched_content.toc
- pageData.title = post.title
- pageData.date = post.date
- pageData.readTime = post.readTime
- pageData.wordCount = post.wordCount
- pageData.tags = post.tags || []
+ pageData.title = post.title
+ pageData.date = post.date
+ pageData.readTime = post.readTime
+ pageData.wordCount = post.wordCount
+ pageData.tags = post.tags || []
- break
- }
+ break
+ }
- case PageType.SERIES: {
- const seriesURL = content_id.slice(0, content_id.lastIndexOf("/"))
+ case PageType.SERIES: {
+ const seriesURL = content_id.slice(0, content_id.lastIndexOf("/"))
- const curr = contentMap.series[seriesURL].order.indexOf(content_id)
- const prev = curr - 1
- const next = curr + 1
+ const curr = contentMap.series[seriesURL].order.indexOf(content_id)
+ const prev = curr - 1
+ const next = curr + 1
- const post = contentMap.posts[content_id]
+ const post = contentMap.posts[content_id]
- pageData.content = fetched_content.content
- pageData.toc = fetched_content.toc
+ pageData.content = fetched_content.content
+ pageData.toc = fetched_content.toc
- pageData.title = post.title
- pageData.date = post.date
- pageData.readTime = post.readTime
- pageData.wordCount = post.wordCount
- pageData.tags = post.tags || []
+ pageData.title = post.title
+ pageData.date = post.date
+ pageData.readTime = post.readTime
+ pageData.wordCount = post.wordCount
+ pageData.tags = post.tags || []
- pageData.seriesHome = seriesURL
- pageData.prev =
- prev >= 0 ? contentMap.series[seriesURL].order[prev] : undefined
- pageData.next =
- next < contentMap.series[seriesURL].order.length
- ? contentMap.series[seriesURL].order[next]
- : undefined
+ pageData.seriesHome = seriesURL
+ pageData.prev =
+ prev >= 0 ? contentMap.series[seriesURL].order[prev] : undefined
+ pageData.next =
+ next < contentMap.series[seriesURL].order.length
+ ? contentMap.series[seriesURL].order[next]
+ : undefined
- break
- }
+ break
+ }
- case PageType.SERIES_HOME: {
- const seriesData = contentMap.series[content_id]
+ case PageType.SERIES_HOME: {
+ const seriesData = contentMap.series[content_id]
- pageData.title = seriesData.title
- pageData.content = fetched_content.content
+ pageData.title = seriesData.title
+ pageData.content = fetched_content.content
- pageData.date = seriesData.date
- pageData.readTime = seriesData.readTime
- pageData.wordCount = seriesData.wordCount
- pageData.order = seriesData.order
- pageData.length = seriesData.length
+ pageData.date = seriesData.date
+ pageData.readTime = seriesData.readTime
+ pageData.wordCount = seriesData.wordCount
+ pageData.order = seriesData.order
+ pageData.length = seriesData.length
- break
- }
+ break
+ }
- case PageType.PORTFOLIO_PROJECT: {
- const data =
- portfolio.projects[content_id as keyof typeof portfolio.projects]
+ case PageType.PORTFOLIO_PROJECT: {
+ const data =
+ portfolio.projects[
+ content_id as keyof typeof portfolio.projects
+ ]
- pageData.content = fetched_content.content
- pageData.toc = fetched_content.toc
+ pageData.content = fetched_content.content
+ pageData.toc = fetched_content.toc
- pageData.title = data.name
- pageData.image = data.image
- pageData.overview = data.overview
- pageData.badges = data.badges
- pageData.repo = data.repo
+ pageData.title = data.name
+ pageData.image = data.image
+ pageData.overview = data.overview
+ pageData.badges = data.badges
+ pageData.repo = data.repo
- break
- }
+ break
+ }
- case PageType.UNSEARCHABLE: {
- pageData.title = contentMap.unsearchable[content_id].title
- pageData.content = fetched_content.content
+ case PageType.UNSEARCHABLE: {
+ pageData.title = contentMap.unsearchable[content_id].title
+ pageData.content = fetched_content.content
- break
- }
- }
+ break
+ }
+ }
- return pageData
+ return pageData
}
diff --git a/apps/blog/src/pages/Search/DateRange.tsx b/apps/blog/src/pages/Search/DateRange.tsx
index 65c0023..254be40 100644
--- a/apps/blog/src/pages/Search/DateRange.tsx
+++ b/apps/blog/src/pages/Search/DateRange.tsx
@@ -2,27 +2,27 @@ import { DateRange } from "react-date-range"
import styled from "styled-components"
export const DateRangeControl = styled.div`
- width: 350px;
+ width: 350px;
- @media screen and (max-width: ${(props) =>
- props.theme.theme.maxDisplayWidth.mobile}) {
- margin-top: 2rem;
- }
+ @media screen and (max-width: ${(props) =>
+ props.theme.theme.maxDisplayWidth.mobile}) {
+ margin-top: 2rem;
+ }
`
export const ClearDateButton = styled.button`
- width: 100%;
- height: 2.5rem;
+ width: 100%;
+ height: 2.5rem;
- border: none;
- cursor: pointer;
+ border: none;
+ cursor: pointer;
- background-color: tomato; /* 🍅 mmm tomato 🍅 */
- color: white;
- font-weight: bold;
+ background-color: tomato; /* 🍅 mmm tomato 🍅 */
+ color: white;
+ font-weight: bold;
`
export const StyledDateRange = styled(DateRange)`
- width: 100%;
- height: 350px;
+ width: 100%;
+ height: 350px;
`
diff --git a/apps/blog/src/pages/Search/Search.tsx b/apps/blog/src/pages/Search/Search.tsx
index 2b10085..c8ecb54 100644
--- a/apps/blog/src/pages/Search/Search.tsx
+++ b/apps/blog/src/pages/Search/Search.tsx
@@ -24,251 +24,259 @@ import "react-date-range/dist/theme/default.css"
const searchIndex = elasticlunr.Index.load(searchData as never)
export interface SearchParams {
- date_from: string
- date_to: string
- tags: string[]
- query: string
+ date_from: string
+ date_to: string
+ tags: string[]
+ query: string
}
const defaultDateRange = [
- {
- startDate: undefined,
- endDate: undefined,
- key: "selection",
- },
+ {
+ startDate: undefined,
+ endDate: undefined,
+ key: "selection",
+ },
]
const StyledSearch = styled(MainContent)`
- text-align: center;
- margin-bottom: 2rem;
+ text-align: center;
+ margin-bottom: 2rem;
`
const StyledSearchContainer = styled.div`
- display: flex;
- align-items: flex-start;
+ display: flex;
+ align-items: flex-start;
- @media screen and (max-width: ${(props) =>
- props.theme.theme.maxDisplayWidth.mobile}) {
- flex-direction: column-reverse;
- align-items: center;
- }
+ @media screen and (max-width: ${(props) =>
+ props.theme.theme.maxDisplayWidth.mobile}) {
+ flex-direction: column-reverse;
+ align-items: center;
+ }
`
const StyledSearchControlContainer = styled.div`
- width: 100%;
- margin-left: 1rem;
+ width: 100%;
+ margin-left: 1rem;
- @media screen and (max-width: ${(props) =>
- props.theme.theme.maxDisplayWidth.mobile}) {
- margin-top: 2rem;
- margin-left: 0;
- }
+ @media screen and (max-width: ${(props) =>
+ props.theme.theme.maxDisplayWidth.mobile}) {
+ margin-top: 2rem;
+ margin-left: 0;
+ }
`
// check if post date is withing the range
function isDateInRange(dateStringToCompare: string, range: Range): boolean {
- if (!dateStringToCompare) throw Error("No date to compare")
- const dateToCompare = new Date(dateStringToCompare)
- const { startDate, endDate } = range
+ if (!dateStringToCompare) throw Error("No date to compare")
+ const dateToCompare = new Date(dateStringToCompare)
+ const { startDate, endDate } = range
- const startDateExists = !!startDate
- const endDateExists = !!endDate
+ const startDateExists = !!startDate
+ const endDateExists = !!endDate
- if (endDateExists && !startDateExists) return dateToCompare < endDate
- if (startDateExists && !endDateExists) return dateToCompare > startDate
- if (startDateExists && endDateExists)
- return dateToCompare > startDate && dateToCompare < endDate
+ if (endDateExists && !startDateExists) return dateToCompare < endDate
+ if (startDateExists && !endDateExists) return dateToCompare > startDate
+ if (startDateExists && endDateExists)
+ return dateToCompare > startDate && dateToCompare < endDate
- return true
+ return true
}
function isSelectedTagsInPost(selectedTags?: TagsData[], postTags?: string[]) {
- if (!selectedTags || selectedTags.length <= 0) return true
- if (!postTags || postTags.length <= 0) return false
+ if (!selectedTags || selectedTags.length <= 0) return true
+ if (!postTags || postTags.length <= 0) return false
- // if tag is empty or undefined
- const tagValues = selectedTags.map((value) => value.value)
- if (!postTags.every((val) => tagValues.includes(val))) return false
+ // if tag is empty or undefined
+ const tagValues = selectedTags.map((value) => value.value)
+ if (!postTags.every((val) => tagValues.includes(val))) return false
- return true
+ return true
}
const Search = () => {
- // URL search parameters
- const [URLSearchParams, setURLSearchParams] = useSearchParams()
+ // URL search parameters
+ const [URLSearchParams, setURLSearchParams] = useSearchParams()
- const [initialized, setInitialized] = useState(false)
+ const [initialized, setInitialized] = useState(false)
- const [dateRange, setDateRange] = useState(defaultDateRange)
- const [selectedTags, setSelectedTags] = useState([])
- const [searchInput, setSearchInput] = useState("")
+ const [dateRange, setDateRange] = useState(defaultDateRange)
+ const [selectedTags, setSelectedTags] = useState([])
+ const [searchInput, setSearchInput] = useState("")
- const [postCards, setPostCards] = useState([])
+ const [postCards, setPostCards] = useState([])
- const doSearch = useCallback(() => {
- try {
- const _postCards: JSX.Element[] = []
- for (const res of searchIndex.search(searchInput)) {
- const postData = contentMap.posts[res.ref]
+ const doSearch = useCallback(() => {
+ try {
+ const _postCards: JSX.Element[] = []
+ for (const res of searchIndex.search(searchInput)) {
+ const postData = contentMap.posts[res.ref]
- if (
- postData && // if post data exists
- isDateInRange(postData.date, dateRange[0]) && // date is within range
- isSelectedTagsInPost(selectedTags, postData.tags) // if post include tags
- ) {
- _postCards.push(
-
- )
- }
- }
+ if (
+ postData && // if post data exists
+ isDateInRange(postData.date, dateRange[0]) && // date is within range
+ isSelectedTagsInPost(selectedTags, postData.tags) // if post include tags
+ ) {
+ _postCards.push(
+
+ )
+ }
+ }
- // apply search result
- setPostCards(_postCards)
+ // apply search result
+ setPostCards(_postCards)
- // eslint-disable-next-line no-empty
- } catch (err) {
- console.error(err)
- }
- }, [dateRange, selectedTags, searchInput])
+ // eslint-disable-next-line no-empty
+ } catch (err) {
+ console.error(err)
+ }
+ }, [dateRange, selectedTags, searchInput])
- // parse search parameters
- useEffect(() => {
- for (const [key, value] of URLSearchParams.entries()) {
- switch (key) {
- case "date_from":
- setDateRange((prev) => [{ ...prev[0], startDate: new Date(value) }])
- break
+ // parse search parameters
+ useEffect(() => {
+ for (const [key, value] of URLSearchParams.entries()) {
+ switch (key) {
+ case "date_from":
+ setDateRange((prev) => [
+ { ...prev[0], startDate: new Date(value) },
+ ])
+ break
- case "date_to":
- setDateRange((prev) => [{ ...prev[0], endDate: new Date(value) }])
- break
+ case "date_to":
+ setDateRange((prev) => [
+ { ...prev[0], endDate: new Date(value) },
+ ])
+ break
- case "tags":
- setSelectedTags(
- value.split(",").map((elem) => {
- return { value: elem, label: elem }
- })
- )
- break
+ case "tags":
+ setSelectedTags(
+ value.split(",").map((elem) => {
+ return { value: elem, label: elem }
+ })
+ )
+ break
- case "query":
- setSearchInput(value)
- break
- }
- }
+ case "query":
+ setSearchInput(value)
+ break
+ }
+ }
- setInitialized(true)
- }, [])
+ setInitialized(true)
+ }, [])
- // update URL when data changes
- useEffect(() => {
- if (!initialized) return
+ // update URL when data changes
+ useEffect(() => {
+ if (!initialized) return
- let date_from
- let date_to
+ let date_from
+ let date_to
- // convert Date to YYYY-MM-DD string if it exists
- if (dateRange[0].startDate)
- date_from = dateRange[0].startDate.toISOString().split("T")[0]
+ // convert Date to YYYY-MM-DD string if it exists
+ if (dateRange[0].startDate)
+ date_from = dateRange[0].startDate.toISOString().split("T")[0]
- if (dateRange[0].endDate)
- date_to = dateRange[0].endDate.toISOString().split("T")[0]
+ if (dateRange[0].endDate)
+ date_to = dateRange[0].endDate.toISOString().split("T")[0]
- setURLSearchParams({
- ...(date_from && {
- date_from: date_from,
- }),
- ...(date_to && {
- date_to: date_to,
- }),
- ...(selectedTags.length > 0 && {
- tags: selectedTags.map((value) => value.value).join(","),
- }),
- ...(searchInput && {
- query: searchInput,
- }),
- })
- }, [dateRange, selectedTags, searchInput])
+ setURLSearchParams({
+ ...(date_from && {
+ date_from: date_from,
+ }),
+ ...(date_to && {
+ date_to: date_to,
+ }),
+ ...(selectedTags.length > 0 && {
+ tags: selectedTags.map((value) => value.value).join(","),
+ }),
+ ...(searchInput && {
+ query: searchInput,
+ }),
+ })
+ }, [dateRange, selectedTags, searchInput])
- // run search if date range and selected tags change
- useEffect(() => {
- doSearch()
- }, [dateRange, selectedTags])
+ // run search if date range and selected tags change
+ useEffect(() => {
+ doSearch()
+ }, [dateRange, selectedTags])
- // run search if user stops typing
- useEffect(() => {
- const delayDebounceFn = setTimeout(() => {
- doSearch()
- }, 200)
+ // run search if user stops typing
+ useEffect(() => {
+ const delayDebounceFn = setTimeout(() => {
+ doSearch()
+ }, 200)
- return () => clearTimeout(delayDebounceFn)
- }, [searchInput])
+ return () => clearTimeout(delayDebounceFn)
+ }, [searchInput])
- if (!initialized) return
+ if (!initialized) return
- return (
- <>
-
- pomp | Search
-
+ return (
+ <>
+
+ pomp | Search
+
-
- Search
+
+ Search
-
-
- {
- setDateRange(defaultDateRange)
- }}
- >
- Reset date range
-
- {
- setDateRange([rangesByKey.selection])
- }}
- />
-
+
+
+ {
+ setDateRange(defaultDateRange)
+ }}
+ >
+ Reset date range
+
+ {
+ setDateRange([rangesByKey.selection])
+ }}
+ />
+
- event.preventDefault()}
- >
- setSearchInput(event.target.value)}
- onKeyPress={(event) => {
- event.key === "Enter" && searchInput && doSearch()
- }}
- />
- {postCards.length} result{postCards.length > 1 && "s"}
- {
- setSelectedTags(newValue as TagsData[])
- }}
- />
-
-
-
+ event.preventDefault()}
+ >
+
+ setSearchInput(event.target.value)
+ }
+ onKeyPress={(event) => {
+ event.key === "Enter" &&
+ searchInput &&
+ doSearch()
+ }}
+ />
+ {postCards.length} result{postCards.length > 1 && "s"}
+ {
+ setSelectedTags(newValue as TagsData[])
+ }}
+ />
+
+
+
- {postCards}
- >
- )
+ {postCards}
+ >
+ )
}
export default Search
diff --git a/apps/blog/src/pages/Search/SearchBar.tsx b/apps/blog/src/pages/Search/SearchBar.tsx
index ecffbdc..7976d56 100644
--- a/apps/blog/src/pages/Search/SearchBar.tsx
+++ b/apps/blog/src/pages/Search/SearchBar.tsx
@@ -1,30 +1,31 @@
import styled from "styled-components"
export default styled.input`
- width: 100%;
- border-radius: 100px; /* arbitrarily large value */
- height: 2.5rem;
- text-align: center;
- font-size: 1.2rem;
- outline: none;
- color: ${({ theme }) => theme.theme.color.text.default};
- border: 1px solid
- ${(props) => props.theme.theme.component.input.color.border.default};
- background-color: ${(props) =>
- props.theme.theme.component.input.color.background.default};
+ width: 100%;
+ border-radius: 100px; /* arbitrarily large value */
+ height: 2.5rem;
+ text-align: center;
+ font-size: 1.2rem;
+ outline: none;
+ color: ${({ theme }) => theme.theme.color.text.default};
+ border: 1px solid
+ ${(props) => props.theme.theme.component.input.color.border.default};
+ background-color: ${(props) =>
+ props.theme.theme.component.input.color.background.default};
- ::placeholder {
- color: ${(props) => props.theme.theme.component.input.color.placeHolder};
- opacity: 1;
- }
+ ::placeholder {
+ color: ${(props) =>
+ props.theme.theme.component.input.color.placeHolder};
+ opacity: 1;
+ }
- &:hover {
- border: 1px solid
- ${({ theme }) => theme.theme.component.input.color.border.hover};
- }
+ &:hover {
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.input.color.border.hover};
+ }
- &:focus {
- border: 1px solid
- ${({ theme }) => theme.theme.component.input.color.border.focus};
- }
+ &:focus {
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.input.color.border.focus};
+ }
`
diff --git a/apps/blog/src/pages/Search/TagSelect.tsx b/apps/blog/src/pages/Search/TagSelect.tsx
index cda42f0..29006ac 100644
--- a/apps/blog/src/pages/Search/TagSelect.tsx
+++ b/apps/blog/src/pages/Search/TagSelect.tsx
@@ -6,102 +6,108 @@ import contentMap from "../../contentMap"
import { globalContext } from "../../globalContext"
const StyledReactTagsContainer = styled.div`
- width: 100%;
- margin-top: 1.5rem;
+ width: 100%;
+ margin-top: 1.5rem;
`
export interface TagsData {
- value: string
- label: string
+ value: string
+ label: string
}
const options: TagsData[] = contentMap.meta.tags.map((elem) => ({
- value: elem,
- label: elem,
+ value: elem,
+ label: elem,
}))
interface TagSelectProps {
- defaultValue: TagsData[]
- onChange(newValue: unknown): void
+ defaultValue: TagsData[]
+ onChange(newValue: unknown): void
}
const TagSelect = (props: TagSelectProps) => {
- const { globalState } = useContext(globalContext)
- const { theme } = globalState
- const { onChange, defaultValue: selectedTags } = props
+ const { globalState } = useContext(globalContext)
+ const { theme } = globalState
+ const { onChange, defaultValue: selectedTags } = props
- return (
-
-
- )
+ return (
+
+
+ )
}
export default TagSelect
diff --git a/apps/blog/src/styles/anchor.ts b/apps/blog/src/styles/anchor.ts
index 824a09e..58c1942 100644
--- a/apps/blog/src/styles/anchor.ts
+++ b/apps/blog/src/styles/anchor.ts
@@ -1,30 +1,31 @@
import { css } from "styled-components"
export default css`
- a {
- text-decoration: none;
+ a {
+ text-decoration: none;
- color: ${(props) => props.theme.theme.component.anchor.color.default};
+ color: ${(props) => props.theme.theme.component.anchor.color.default};
- &:hover {
- color: ${(props) => props.theme.theme.component.anchor.color.hover};
- }
+ &:hover {
+ color: ${(props) => props.theme.theme.component.anchor.color.hover};
+ }
- &:active {
- color: ${(props) => props.theme.theme.component.anchor.color.active};
- }
- }
+ &:active {
+ color: ${(props) =>
+ props.theme.theme.component.anchor.color.active};
+ }
+ }
- /* The "#" thingy used beside headers */
- a.header-anchor {
- /* compensate for navbar height*/
- display: inline-block;
+ /* The "#" thingy used beside headers */
+ a.header-anchor {
+ /* compensate for navbar height*/
+ display: inline-block;
- color: ${(props) => props.theme.theme.component.anchor.color.header};
- }
+ color: ${(props) => props.theme.theme.component.anchor.color.header};
+ }
- /* footnote anchors */
- a[id^="fnref"] {
- display: inline;
- }
+ /* footnote anchors */
+ a[id^="fnref"] {
+ display: inline;
+ }
`
diff --git a/apps/blog/src/styles/blockQuote.ts b/apps/blog/src/styles/blockQuote.ts
index 321490b..5fedb7f 100644
--- a/apps/blog/src/styles/blockQuote.ts
+++ b/apps/blog/src/styles/blockQuote.ts
@@ -1,19 +1,19 @@
import { css } from "styled-components"
export default css`
- blockquote {
- background-color: ${({ theme }) =>
- theme.theme.component.blockQuote.color.background};
- border-left: 0.4rem solid
- ${({ theme }) => theme.theme.component.blockQuote.color.borderLeft};
- padding-top: 0.1rem;
- padding-right: 1rem;
- padding-bottom: 0.1rem;
- padding-left: 1.5rem;
+ blockquote {
+ background-color: ${({ theme }) =>
+ theme.theme.component.blockQuote.color.background};
+ border-left: 0.4rem solid
+ ${({ theme }) => theme.theme.component.blockQuote.color.borderLeft};
+ padding-top: 0.1rem;
+ padding-right: 1rem;
+ padding-bottom: 0.1rem;
+ padding-left: 1.5rem;
- @media screen and (max-width: ${({ theme }) =>
- theme.theme.maxDisplayWidth.mobile}) {
- margin: 0.5rem;
- }
- }
+ @media screen and (max-width: ${({ theme }) =>
+ theme.theme.maxDisplayWidth.mobile}) {
+ margin: 0.5rem;
+ }
+ }
`
diff --git a/apps/blog/src/styles/button.ts b/apps/blog/src/styles/button.ts
index ac129f7..bb2afcc 100644
--- a/apps/blog/src/styles/button.ts
+++ b/apps/blog/src/styles/button.ts
@@ -1,37 +1,37 @@
import { css } from "styled-components"
export default css`
- /* style */
+ /* style */
- display: flex;
- cursor: pointer;
- align-items: center;
- justify-content: center;
- border: none;
- border-radius: 0.5rem;
+ display: flex;
+ cursor: pointer;
+ align-items: center;
+ justify-content: center;
+ border: none;
+ border-radius: 0.5rem;
- /* size */
+ /* size */
- height: 3rem;
- min-width: 2.5rem;
- margin: 0;
- padding: 0 1rem 0 1rem;
+ height: 3rem;
+ min-width: 2.5rem;
+ margin: 0;
+ padding: 0 1rem 0 1rem;
- /* text */
+ /* text */
- text-decoration: none;
+ text-decoration: none;
- /* color */
+ /* color */
- color: ${({ theme }) => theme.theme.color.text.default};
- background-color: ${({ theme }) =>
- theme.theme.component.ui.color.background.default};
- &:hover {
- background-color: ${({ theme }) =>
- theme.theme.component.ui.color.background.hover};
- }
+ color: ${({ theme }) => theme.theme.color.text.default};
+ background-color: ${({ theme }) =>
+ theme.theme.component.ui.color.background.default};
+ &:hover {
+ background-color: ${({ theme }) =>
+ theme.theme.component.ui.color.background.hover};
+ }
- /* animation */
+ /* animation */
- transition: transform 0.1s linear;
+ transition: transform 0.1s linear;
`
diff --git a/apps/blog/src/styles/checkbox.ts b/apps/blog/src/styles/checkbox.ts
index 138edc2..a772d97 100644
--- a/apps/blog/src/styles/checkbox.ts
+++ b/apps/blog/src/styles/checkbox.ts
@@ -1,17 +1,17 @@
import { css } from "styled-components"
export default css`
- input[type="checkbox"] {
- /* default width and height */
- width: 13px;
- height: 13px;
- }
+ input[type="checkbox"] {
+ /* default width and height */
+ width: 13px;
+ height: 13px;
+ }
- input[type="checkbox"][disabled][checked] {
- filter: invert(100%) brightness(5);
- }
+ input[type="checkbox"][disabled][checked] {
+ filter: invert(100%) brightness(5);
+ }
- input[type="checkbox"][disabled] {
- filter: invert(100%) brightness(5);
- }
+ input[type="checkbox"][disabled] {
+ filter: invert(100%) brightness(5);
+ }
`
diff --git a/apps/blog/src/styles/code.ts b/apps/blog/src/styles/code.ts
index 44f1399..4f31ba6 100644
--- a/apps/blog/src/styles/code.ts
+++ b/apps/blog/src/styles/code.ts
@@ -1,37 +1,37 @@
import { css } from "styled-components"
export default css`
- /* highlight.js code style */
- ${({ theme }) => theme.theme.component.code.block.style}
+ /* highlight.js code style */
+ ${({ theme }) => theme.theme.component.code.block.style}
- /* inline code */
+ /* inline code */
:not(pre) > code {
- font-family: ${({ theme }) => theme.theme.font.monospace};
- word-wrap: break-word;
- color: ${({ theme }) => theme.theme.component.code.inline.color.text};
- background-color: ${({ theme }) =>
- theme.theme.component.code.inline.color.background};
- border: 1px solid
- ${({ theme }) => theme.theme.component.code.inline.color.border};
- border-radius: 3px;
- padding: 0 3px;
- }
+ font-family: ${({ theme }) => theme.theme.font.monospace};
+ word-wrap: break-word;
+ color: ${({ theme }) => theme.theme.component.code.inline.color.text};
+ background-color: ${({ theme }) =>
+ theme.theme.component.code.inline.color.background};
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.code.inline.color.border};
+ border-radius: 3px;
+ padding: 0 3px;
+ }
- /* code block */
- pre > code {
- font-family: ${(props) => props.theme.theme.font.monospace};
- border: 1px solid
- ${({ theme }) => theme.theme.component.code.block.color.border};
- }
+ /* code block */
+ pre > code {
+ font-family: ${(props) => props.theme.theme.font.monospace};
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.code.block.color.border};
+ }
- /* // todo: fix highlight not working properly when scrolled horizontally // */
- .highlighted-line {
- background-color: ${({ theme }) =>
- theme.theme.component.code.block.color.highlight};
+ /* // todo: fix highlight not working properly when scrolled horizontally // */
+ .highlighted-line {
+ background-color: ${({ theme }) =>
+ theme.theme.component.code.block.color.highlight};
- display: block;
- min-width: min-content;
- margin: 0 -1rem;
- padding: 0 1rem;
- }
+ display: block;
+ min-width: min-content;
+ margin: 0 -1rem;
+ padding: 0 1rem;
+ }
`
diff --git a/apps/blog/src/styles/globalStyle.ts b/apps/blog/src/styles/globalStyle.ts
index 9d81708..ed48336 100644
--- a/apps/blog/src/styles/globalStyle.ts
+++ b/apps/blog/src/styles/globalStyle.ts
@@ -14,44 +14,44 @@ import markCSS from "./mark"
import katexCSS from "./katex"
const globalCSS = css`
- body {
- overflow-x: hidden;
- overflow-y: scroll;
- }
+ body {
+ overflow-x: hidden;
+ overflow-y: scroll;
+ }
- html,
- body,
- #root {
- /* size */
+ html,
+ body,
+ #root {
+ /* size */
- min-height: 100vh;
- margin: 0;
+ min-height: 100vh;
+ margin: 0;
- /* style */
+ /* style */
- display: flex;
- flex-flow: column;
+ display: flex;
+ flex-flow: column;
- /* text */
+ /* text */
- line-height: 2rem;
- font-size: 1rem;
- font-family: ${({ theme }) => theme.theme.font.sansSerif};
- font-weight: 400;
- -webkit-font-smoothing: antialiased;
- text-rendering: optimizeLegibility;
+ line-height: 2rem;
+ font-size: 1rem;
+ font-family: ${({ theme }) => theme.theme.font.sansSerif};
+ font-weight: 400;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
- /* color */
+ /* color */
- background-color: ${({ theme }) => theme.theme.color.background};
- color: ${({ theme }) => theme.theme.color.text.default};
- }
+ background-color: ${({ theme }) => theme.theme.color.background};
+ color: ${({ theme }) => theme.theme.color.text.default};
+ }
- * {
- transition: color 0.1s linear;
- scroll-behavior: smooth;
- scroll-margin: 4rem;
- }
+ * {
+ transition: color 0.1s linear;
+ scroll-behavior: smooth;
+ scroll-margin: 4rem;
+ }
`
/**
diff --git a/apps/blog/src/styles/header.ts b/apps/blog/src/styles/header.ts
index ecf6195..69d7fd0 100644
--- a/apps/blog/src/styles/header.ts
+++ b/apps/blog/src/styles/header.ts
@@ -1,38 +1,38 @@
import { css } from "styled-components"
export default css`
- /* intentionally left out h1 */
- h2,
- h3,
- h4,
- h5,
- h6 {
- margin-top: 3rem;
- padding-top: 0.5rem;
- margin-bottom: 0.5rem;
- font-weight: 700;
- }
+ /* intentionally left out h1 */
+ h2,
+ h3,
+ h4,
+ h5,
+ h6 {
+ margin-top: 3rem;
+ padding-top: 0.5rem;
+ margin-bottom: 0.5rem;
+ font-weight: 700;
+ }
- h1 {
- font-size: 2.5rem;
- }
- h2 {
- font-size: 1.5rem;
- }
- h3 {
- font-size: 1rem;
- text-indent: 0.5rem;
- }
- h4 {
- font-size: 1rem;
- text-indent: 1rem;
- }
- h5 {
- font-size: 1rem;
- text-indent: 1.5rem;
- }
- h6 {
- font-size: 1rem;
- text-indent: 2rem;
- }
+ h1 {
+ font-size: 2.5rem;
+ }
+ h2 {
+ font-size: 1.5rem;
+ }
+ h3 {
+ font-size: 1rem;
+ text-indent: 0.5rem;
+ }
+ h4 {
+ font-size: 1rem;
+ text-indent: 1rem;
+ }
+ h5 {
+ font-size: 1rem;
+ text-indent: 1.5rem;
+ }
+ h6 {
+ font-size: 1rem;
+ text-indent: 2rem;
+ }
`
diff --git a/apps/blog/src/styles/hr.ts b/apps/blog/src/styles/hr.ts
index dc044d3..c59e687 100644
--- a/apps/blog/src/styles/hr.ts
+++ b/apps/blog/src/styles/hr.ts
@@ -1,8 +1,8 @@
import { css } from "styled-components"
export default css`
- hr {
- border: 0;
- border-bottom: 1px solid;
- }
+ hr {
+ border: 0;
+ border-bottom: 1px solid;
+ }
`
diff --git a/apps/blog/src/styles/katex.ts b/apps/blog/src/styles/katex.ts
index b0d81fe..a2d4ad7 100644
--- a/apps/blog/src/styles/katex.ts
+++ b/apps/blog/src/styles/katex.ts
@@ -1,9 +1,9 @@
import { css } from "styled-components"
export default css`
- // prevent overflowing on small displays
- .katex-html {
- overflow: auto;
- padding: 0.5rem;
- }
+ // prevent overflowing on small displays
+ .katex-html {
+ overflow: auto;
+ padding: 0.5rem;
+ }
`
diff --git a/apps/blog/src/styles/kbd.ts b/apps/blog/src/styles/kbd.ts
index 6438b71..bde38ca 100644
--- a/apps/blog/src/styles/kbd.ts
+++ b/apps/blog/src/styles/kbd.ts
@@ -1,21 +1,22 @@
import { css } from "styled-components"
export default css`
- /* https://www.rgagnon.com/jsdetails/js-nice-effect-the-KBD-tag.html */
- kbd {
- margin: 0px 0.1em;
- padding: 0.1em 0.6em;
- border-radius: 3px;
- border: 1px solid ${({ theme }) => theme.theme.component.kbd.color.border};
- color: ${({ theme }) => theme.theme.component.kbd.color.text};
- line-height: 1.4;
- font-size: 13.5px;
- display: inline-block;
- box-shadow: 0px 1px 0px
- ${({ theme }) => theme.theme.component.kbd.color.outerShadow},
- inset 0px 0px 0px 2px
- ${({ theme }) => theme.theme.component.kbd.color.innerShadow};
- background-color: ${({ theme }) =>
- theme.theme.component.kbd.color.background};
- }
+ /* https://www.rgagnon.com/jsdetails/js-nice-effect-the-KBD-tag.html */
+ kbd {
+ margin: 0px 0.1em;
+ padding: 0.1em 0.6em;
+ border-radius: 3px;
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.kbd.color.border};
+ color: ${({ theme }) => theme.theme.component.kbd.color.text};
+ line-height: 1.4;
+ font-size: 13.5px;
+ display: inline-block;
+ box-shadow: 0px 1px 0px
+ ${({ theme }) => theme.theme.component.kbd.color.outerShadow},
+ inset 0px 0px 0px 2px
+ ${({ theme }) => theme.theme.component.kbd.color.innerShadow};
+ background-color: ${({ theme }) =>
+ theme.theme.component.kbd.color.background};
+ }
`
diff --git a/apps/blog/src/styles/mark.ts b/apps/blog/src/styles/mark.ts
index 09d78c9..a194772 100644
--- a/apps/blog/src/styles/mark.ts
+++ b/apps/blog/src/styles/mark.ts
@@ -1,9 +1,9 @@
import { css } from "styled-components"
export default css`
- mark {
- background-color: ${({ theme }) =>
- theme.theme.component.mark.color.background};
- color: ${({ theme }) => theme.theme.component.mark.color.text};
- }
+ mark {
+ background-color: ${({ theme }) =>
+ theme.theme.component.mark.color.background};
+ color: ${({ theme }) => theme.theme.component.mark.color.text};
+ }
`
diff --git a/apps/blog/src/styles/scrollbar.ts b/apps/blog/src/styles/scrollbar.ts
index 58e50ba..5649cd2 100644
--- a/apps/blog/src/styles/scrollbar.ts
+++ b/apps/blog/src/styles/scrollbar.ts
@@ -1,21 +1,23 @@
import { css } from "styled-components"
export default css`
- body::-webkit-scrollbar {
- width: ${(props) => props.theme.theme.component.scrollbar.width};
- }
+ body::-webkit-scrollbar {
+ width: ${(props) => props.theme.theme.component.scrollbar.width};
+ }
- body::-webkit-scrollbar-track {
- border-radius: ${(props) =>
- props.theme.theme.component.scrollbar.borderRadius};
- background: ${(props) => props.theme.theme.component.scrollbar.color.track};
- box-shadow: inset 0 0 5px rgb(0 0 0 / 10%);
- }
+ body::-webkit-scrollbar-track {
+ border-radius: ${(props) =>
+ props.theme.theme.component.scrollbar.borderRadius};
+ background: ${(props) =>
+ props.theme.theme.component.scrollbar.color.track};
+ box-shadow: inset 0 0 5px rgb(0 0 0 / 10%);
+ }
- body::-webkit-scrollbar-thumb {
- border-radius: ${(props) =>
- props.theme.theme.component.scrollbar.borderRadius};
- background: ${(props) => props.theme.theme.component.scrollbar.color.thumb};
- box-shadow: inset 0 0 10px rgb(0 0 0 / 20%);
- }
+ body::-webkit-scrollbar-thumb {
+ border-radius: ${(props) =>
+ props.theme.theme.component.scrollbar.borderRadius};
+ background: ${(props) =>
+ props.theme.theme.component.scrollbar.color.thumb};
+ box-shadow: inset 0 0 10px rgb(0 0 0 / 20%);
+ }
`
diff --git a/apps/blog/src/styles/table.ts b/apps/blog/src/styles/table.ts
index c1aa1ad..bd9ccb9 100644
--- a/apps/blog/src/styles/table.ts
+++ b/apps/blog/src/styles/table.ts
@@ -1,22 +1,22 @@
import { css } from "styled-components"
export default css`
- table {
- border-collapse: collapse;
- border-spacing: 0;
- width: 100%;
+ table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
- td,
- th {
- padding: 8px;
- border: 1px solid
- ${({ theme }) => theme.theme.component.table.color.border};
- }
+ td,
+ th {
+ padding: 8px;
+ border: 1px solid
+ ${({ theme }) => theme.theme.component.table.color.border};
+ }
- /* table alternating color */
- tr:nth-child(even) {
- background-color: ${({ theme }) =>
- theme.theme.component.table.color.even};
- }
- }
+ /* table alternating color */
+ tr:nth-child(even) {
+ background-color: ${({ theme }) =>
+ theme.theme.component.table.color.even};
+ }
+ }
`
diff --git a/apps/blog/src/theme.tsx b/apps/blog/src/theme.tsx
index 35f4b65..2104f61 100644
--- a/apps/blog/src/theme.tsx
+++ b/apps/blog/src/theme.tsx
@@ -3,53 +3,54 @@ import { ChangeEventHandler } from "react"
/* NEW (START) */
const setDark = () => {
- localStorage.setItem("theme", "dark")
- document.documentElement.setAttribute("data-theme", "dark")
+ localStorage.setItem("theme", "dark")
+ document.documentElement.setAttribute("data-theme", "dark")
}
const setLight = () => {
- localStorage.setItem("theme", "light")
- document.documentElement.setAttribute("data-theme", "light")
+ localStorage.setItem("theme", "light")
+ document.documentElement.setAttribute("data-theme", "light")
}
const storedTheme = localStorage.getItem("theme")
const prefersDark =
- window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches
+ window.matchMedia &&
+ window.matchMedia("(prefers-color-scheme: dark)").matches
const defaultDark =
- storedTheme === "dark" || (storedTheme === null && prefersDark)
+ storedTheme === "dark" || (storedTheme === null && prefersDark)
if (defaultDark) {
- setDark()
+ setDark()
}
const toggleTheme: ChangeEventHandler = (e) => {
- if (e.target.checked) {
- setDark()
- } else {
- setLight()
- }
+ if (e.target.checked) {
+ setDark()
+ } else {
+ setLight()
+ }
}
/* NEW (END) */
const DarkMode = () => {
- return (
-
- )
+ return (
+
+ )
}
export default DarkMode
diff --git a/apps/blog/tsconfig.json b/apps/blog/tsconfig.json
index a4beccc..5e8de14 100644
--- a/apps/blog/tsconfig.json
+++ b/apps/blog/tsconfig.json
@@ -1,28 +1,28 @@
{
- "compilerOptions": {
- "plugins": [
- {
- "name": "@styled/typescript-styled-plugin",
- "validate": false
- }
- ],
- "target": "es5",
- "module": "esnext",
- "lib": ["dom", "dom.iterable", "esnext"],
- "allowJs": true,
- "skipLibCheck": true,
- "esModuleInterop": true,
- "allowSyntheticDefaultImports": true,
- "strict": true,
- "downlevelIteration": true,
- "forceConsistentCasingInFileNames": true,
- "noFallthroughCasesInSwitch": true,
- "noImplicitAny": true,
- "moduleResolution": "node",
- "resolveJsonModule": true,
- "isolatedModules": true,
- "noEmit": true,
- "jsx": "react-jsx"
- },
- "include": ["src/**/*", "types/**/*"]
+ "compilerOptions": {
+ "plugins": [
+ {
+ "name": "@styled/typescript-styled-plugin",
+ "validate": false
+ }
+ ],
+ "target": "es5",
+ "module": "esnext",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "downlevelIteration": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "noImplicitAny": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src/**/*", "types/**/*"]
}
diff --git a/apps/blog/types/react-date-range.d.ts b/apps/blog/types/react-date-range.d.ts
index 5e452a7..78482ef 100644
--- a/apps/blog/types/react-date-range.d.ts
+++ b/apps/blog/types/react-date-range.d.ts
@@ -1,7 +1,7 @@
import "react-date-range"
declare module "react-date-range" {
- export interface DateRangeProps extends Range, CommonCalendarProps {
- retainEndDateOnFirstSelection?: boolean | undefined
- }
+ export interface DateRangeProps extends Range, CommonCalendarProps {
+ retainEndDateOnFirstSelection?: boolean | undefined
+ }
}
diff --git a/apps/blog/types/read-time-estimate.d.ts b/apps/blog/types/read-time-estimate.d.ts
index 0f16493..21deaa9 100644
--- a/apps/blog/types/read-time-estimate.d.ts
+++ b/apps/blog/types/read-time-estimate.d.ts
@@ -1,19 +1,19 @@
declare module "read-time-estimate" {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- export default function toc(
- string: string,
- customWordTime: number,
- customImageTime: number,
- chineseKoreanReadTime: number,
- imageTags: string[]
- ): {
- humanizedDuration: string
- duration: number
- totalWords: number
- wordTime: number
- totalImages: number
- imageTime: number
- otherLanguageTimeCharacters: number
- otherLanguageTime: number
- }
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ export default function toc(
+ string: string,
+ customWordTime: number,
+ customImageTime: number,
+ chineseKoreanReadTime: number,
+ imageTags: string[]
+ ): {
+ humanizedDuration: string
+ duration: number
+ totalWords: number
+ wordTime: number
+ totalImages: number
+ imageTime: number
+ otherLanguageTimeCharacters: number
+ otherLanguageTime: number
+ }
}
diff --git a/apps/blog/types/styled-components.ts b/apps/blog/types/styled-components.ts
index c07561a..02bae65 100644
--- a/apps/blog/types/styled-components.ts
+++ b/apps/blog/types/styled-components.ts
@@ -3,8 +3,8 @@ import type { Theme } from "@developomp-site/theme"
import { SiteTheme } from "../src/globalContext"
declare module "styled-components" {
- export interface DefaultTheme {
- currentTheme: SiteTheme
- theme: Theme
- }
+ export interface DefaultTheme {
+ currentTheme: SiteTheme
+ theme: Theme
+ }
}
diff --git a/apps/portfolio/tsconfig.node.json b/apps/portfolio/tsconfig.node.json
index eca6668..26063d8 100644
--- a/apps/portfolio/tsconfig.node.json
+++ b/apps/portfolio/tsconfig.node.json
@@ -1,10 +1,10 @@
{
- "compilerOptions": {
- "composite": true,
- "skipLibCheck": true,
- "module": "ESNext",
- "moduleResolution": "bundler",
- "allowSyntheticDefaultImports": true
- },
- "include": ["vite.config.ts"]
+ "compilerOptions": {
+ "composite": true,
+ "skipLibCheck": true,
+ "module": "ESNext",
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
}
diff --git a/firebase.json b/firebase.json
index 88c33c3..ae49ee7 100644
--- a/firebase.json
+++ b/firebase.json
@@ -1,40 +1,40 @@
{
- "hosting": [
- {
- "target": "main",
- "cleanUrls": true,
- "public": "apps/main/build",
- "rewrites": [
- {
- "source": "**",
- "destination": "/index.html"
- }
- ],
- "ignore": ["**/.*"]
- },
- {
- "target": "blog",
- "cleanUrls": true,
- "public": "apps/blog/build",
- "rewrites": [
- {
- "source": "**",
- "destination": "/index.html"
- }
- ],
- "ignore": ["**/.*"]
- },
- {
- "target": "portfolio",
- "cleanUrls": true,
- "public": "apps/portfolio/dist",
- "rewrites": [
- {
- "source": "**",
- "destination": "/index.html"
- }
- ],
- "ignore": ["**/.*"]
- }
- ]
+ "hosting": [
+ {
+ "target": "main",
+ "cleanUrls": true,
+ "public": "apps/main/build",
+ "rewrites": [
+ {
+ "source": "**",
+ "destination": "/index.html"
+ }
+ ],
+ "ignore": ["**/.*"]
+ },
+ {
+ "target": "blog",
+ "cleanUrls": true,
+ "public": "apps/blog/build",
+ "rewrites": [
+ {
+ "source": "**",
+ "destination": "/index.html"
+ }
+ ],
+ "ignore": ["**/.*"]
+ },
+ {
+ "target": "portfolio",
+ "cleanUrls": true,
+ "public": "apps/portfolio/dist",
+ "rewrites": [
+ {
+ "source": "**",
+ "destination": "/index.html"
+ }
+ ],
+ "ignore": ["**/.*"]
+ }
+ ]
}
diff --git a/package.json b/package.json
index 96dfbb3..eae6b81 100755
--- a/package.json
+++ b/package.json
@@ -1,18 +1,18 @@
{
- "private": true,
- "packageManager": "^pnpm@7.0.0",
- "scripts": {
- "build": "turbo run build",
- "dev": "turbo run dev --no-cache --parallel --continue",
- "lint": "turbo run lint",
- "clean": "turbo run clean && rm -rf node_modules",
- "format": "prettier --write \"**/*.{ts,tsx,md}\""
- },
- "devDependencies": {
- "@developomp-site/eslint-config": "workspace:*",
- "eslint": "^8.29.0",
- "prettier": "^2.8.1",
- "prettier-plugin-tailwindcss": "^0.2.0",
- "turbo": "^1.10.6"
- }
+ "private": true,
+ "packageManager": "^pnpm@7.0.0",
+ "scripts": {
+ "build": "turbo run build",
+ "dev": "turbo run dev --no-cache --parallel --continue",
+ "lint": "turbo run lint",
+ "clean": "turbo run clean && rm -rf node_modules",
+ "format": "prettier --write \"**/*.{ts,tsx,md}\""
+ },
+ "devDependencies": {
+ "@developomp-site/eslint-config": "workspace:*",
+ "eslint": "^8.29.0",
+ "prettier": "^2.8.1",
+ "prettier-plugin-tailwindcss": "^0.2.0",
+ "turbo": "^1.10.6"
+ }
}
diff --git a/packages/blog-content/package.json b/packages/blog-content/package.json
index 8dd7810..3c36201 100644
--- a/packages/blog-content/package.json
+++ b/packages/blog-content/package.json
@@ -1,41 +1,41 @@
{
- "name": "@developomp-site/blog-content",
- "version": "0.0.0",
- "license": "MIT",
- "files": [
- "dist/**"
- ],
- "scripts": {
- "build": "ts-node --experimental-specifier-resolution=node ./src",
- "clean": "rm -rf .turbo node_modules dist"
- },
- "dependencies": {
- "@developomp-site/tsconfig": "workspace:*",
- "@types/ejs": "^3.1.1",
- "@types/katex": "^0.14.0",
- "@types/markdown-it": "^12.2.3",
- "@types/read-time-estimate": "^0.0.0",
- "@types/svgo": "^3.0.0",
- "@types/tinycolor2": "^1.4.3",
- "canvas": "^2.11.2",
- "ejs": "^3.1.8",
- "gray-matter": "^4.0.3",
- "markdown-it": "^13.0.1",
- "markdown-it-anchor": "^8.6.5",
- "markdown-it-attrs": "^4.1.4",
- "markdown-it-footnote": "^3.0.3",
- "markdown-it-highlight-lines": "^1.0.2",
- "markdown-it-mark": "^3.0.1",
- "markdown-it-sub": "^1.0.0",
- "markdown-it-sup": "^1.0.0",
- "markdown-it-task-checkbox": "^1.0.6",
- "markdown-it-texmath": "^1.0.0",
- "markdown-toc": "^1.2.0",
- "read-time-estimate": "^0.0.3",
- "simple-icons": "^7.21.0",
- "slugify": "^1.6.6",
- "svgo": "^3.0.2",
- "tinycolor2": "^1.4.2",
- "typescript": "^4.9.4"
- }
+ "name": "@developomp-site/blog-content",
+ "version": "0.0.0",
+ "license": "MIT",
+ "files": [
+ "dist/**"
+ ],
+ "scripts": {
+ "build": "ts-node --experimental-specifier-resolution=node ./src",
+ "clean": "rm -rf .turbo node_modules dist"
+ },
+ "dependencies": {
+ "@developomp-site/tsconfig": "workspace:*",
+ "@types/ejs": "^3.1.1",
+ "@types/katex": "^0.14.0",
+ "@types/markdown-it": "^12.2.3",
+ "@types/read-time-estimate": "^0.0.0",
+ "@types/svgo": "^3.0.0",
+ "@types/tinycolor2": "^1.4.3",
+ "canvas": "^2.11.2",
+ "ejs": "^3.1.8",
+ "gray-matter": "^4.0.3",
+ "markdown-it": "^13.0.1",
+ "markdown-it-anchor": "^8.6.5",
+ "markdown-it-attrs": "^4.1.4",
+ "markdown-it-footnote": "^3.0.3",
+ "markdown-it-highlight-lines": "^1.0.2",
+ "markdown-it-mark": "^3.0.1",
+ "markdown-it-sub": "^1.0.0",
+ "markdown-it-sup": "^1.0.0",
+ "markdown-it-task-checkbox": "^1.0.6",
+ "markdown-it-texmath": "^1.0.0",
+ "markdown-toc": "^1.2.0",
+ "read-time-estimate": "^0.0.3",
+ "simple-icons": "^7.21.0",
+ "slugify": "^1.6.6",
+ "svgo": "^3.0.2",
+ "tinycolor2": "^1.4.2",
+ "typescript": "^4.9.4"
+ }
}
diff --git a/packages/blog-content/src/index.ts b/packages/blog-content/src/index.ts
index 02eb846..8799dcb 100644
--- a/packages/blog-content/src/index.ts
+++ b/packages/blog-content/src/index.ts
@@ -16,19 +16,19 @@ import postProcess from "./postProcess"
import { ContentMap, ParseMode, PortfolioData, SeriesMap } from "./types/types"
export const contentMap: ContentMap = {
- date: {},
- tags: {},
- meta: {
- tags: [],
- },
- posts: {},
- series: {},
- unsearchable: {},
+ date: {},
+ tags: {},
+ meta: {
+ tags: [],
+ },
+ posts: {},
+ series: {},
+ unsearchable: {},
}
export const seriesMap: SeriesMap = {}
export const portfolioData: PortfolioData = {
- skills: new Set(),
- projects: {},
+ skills: new Set(),
+ projects: {},
}
/**
@@ -36,8 +36,8 @@ export const portfolioData: PortfolioData = {
*/
try {
- fs.rmSync("dist", { recursive: true })
- // eslint-disable-next-line no-empty
+ fs.rmSync("dist", { recursive: true })
+ // eslint-disable-next-line no-empty
} catch (err) {}
/**
@@ -45,16 +45,16 @@ try {
*/
if (!fs.lstatSync(markdownPath).isDirectory())
- throw Error("Invalid markdown path")
+ throw Error("Invalid markdown path")
if (!fs.lstatSync(markdownPath + "/posts").isDirectory())
- throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
+ throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
if (!fs.lstatSync(markdownPath + "/unsearchable").isDirectory())
- throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
+ throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
if (!fs.lstatSync(markdownPath + "/series").isDirectory())
- throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
+ throw Error(`Cannot find directory: ${markdownPath + "/posts"}`)
/**
* Parse
@@ -77,11 +77,11 @@ postProcess()
fs.writeFileSync(mapFilePath, JSON.stringify(contentMap))
fs.writeFileSync(
- portfolioFilePath,
- JSON.stringify({
- ...portfolioData,
- skills: Array.from(portfolioData.skills),
- })
+ portfolioFilePath,
+ JSON.stringify({
+ ...portfolioData,
+ skills: Array.from(portfolioData.skills),
+ })
)
saveIndex()
diff --git a/packages/blog-content/src/parseMarkdown.ts b/packages/blog-content/src/parseMarkdown.ts
index e80c48a..3c27c3c 100644
--- a/packages/blog-content/src/parseMarkdown.ts
+++ b/packages/blog-content/src/parseMarkdown.ts
@@ -24,37 +24,37 @@ import { MarkdownData, ParseMode } from "./types/types"
const slugifyIt = (s: string) => slugify(s, { lower: true, strict: true })
const md = markdownIt({
- // https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md
- highlight: (str, lang) => {
- if (lang && hljs.getLanguage(lang)) {
- try {
- return hljs.highlight(str, { language: lang }).value
- // eslint-disable-next-line no-empty
- } catch (error) {}
- }
+ // https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md
+ highlight: (str, lang) => {
+ if (lang && hljs.getLanguage(lang)) {
+ try {
+ return hljs.highlight(str, { language: lang }).value
+ // eslint-disable-next-line no-empty
+ } catch (error) {}
+ }
- return "" // use external default escaping
- },
- html: true,
+ return "" // use external default escaping
+ },
+ html: true,
})
- .use(markdownItTexMath, {
- engine: katex,
- delimiters: "dollars",
- })
- .use(markdownItAnchor, {
- permalink: markdownItAnchor.permalink.ariaHidden({
- placement: "before",
- symbol: "#",
- renderHref: (s) => `#${slugifyIt(s)}`,
- }),
- slugify: slugifyIt,
- })
- .use(markdownItTaskCheckbox)
- .use(markDownItMark)
- .use(markdownItSub)
- .use(markdownItSup)
- .use(highlightLines)
- .use(markdownItFootnote)
+ .use(markdownItTexMath, {
+ engine: katex,
+ delimiters: "dollars",
+ })
+ .use(markdownItAnchor, {
+ permalink: markdownItAnchor.permalink.ariaHidden({
+ placement: "before",
+ symbol: "#",
+ renderHref: (s) => `#${slugifyIt(s)}`,
+ }),
+ slugify: slugifyIt,
+ })
+ .use(markdownItTaskCheckbox)
+ .use(markDownItMark)
+ .use(markdownItSub)
+ .use(markdownItSup)
+ .use(highlightLines)
+ .use(markdownItFootnote)
/**
* parse the front matter if it exists
@@ -64,70 +64,70 @@ const md = markdownIt({
* @param {ParseMode} mode
*/
export default function parseMarkdown(
- markdownRaw: string,
- path: string,
- mode: ParseMode
+ markdownRaw: string,
+ path: string,
+ mode: ParseMode
): MarkdownData {
- const fileHasFrontMatter = markdownRaw.startsWith("---")
+ const fileHasFrontMatter = markdownRaw.startsWith("---")
- const frontMatter = fileHasFrontMatter
- ? matter(markdownRaw.slice(0, nthIndex(markdownRaw, "---", 2) + 3)).data
- : {}
+ const frontMatter = fileHasFrontMatter
+ ? matter(markdownRaw.slice(0, nthIndex(markdownRaw, "---", 2) + 3)).data
+ : {}
- if (fileHasFrontMatter) {
- if (mode != ParseMode.PORTFOLIO) {
- if (!frontMatter.title)
- throw Error(`Title is not defined in file: ${path}`)
+ if (fileHasFrontMatter) {
+ if (mode != ParseMode.PORTFOLIO) {
+ if (!frontMatter.title)
+ throw Error(`Title is not defined in file: ${path}`)
- if (mode != ParseMode.UNSEARCHABLE && !frontMatter.date)
- throw Error(`Date is not defined in file: ${path}`)
- }
+ if (mode != ParseMode.UNSEARCHABLE && !frontMatter.date)
+ throw Error(`Date is not defined in file: ${path}`)
+ }
- if (mode === ParseMode.PORTFOLIO) {
- if (frontMatter.overview) {
- frontMatter.overview = md.render(frontMatter.overview)
- }
- }
- }
+ if (mode === ParseMode.PORTFOLIO) {
+ if (frontMatter.overview) {
+ frontMatter.overview = md.render(frontMatter.overview)
+ }
+ }
+ }
- //
- // work with rendered DOM
- //
+ //
+ // work with rendered DOM
+ //
- const dom = new JSDOM(
- md.render(
- fileHasFrontMatter
- ? markdownRaw.slice(nthIndex(markdownRaw, "---", 2) + 3)
- : markdownRaw
- ) || ""
- )
+ const dom = new JSDOM(
+ md.render(
+ fileHasFrontMatter
+ ? markdownRaw.slice(nthIndex(markdownRaw, "---", 2) + 3)
+ : markdownRaw
+ ) || ""
+ )
- // add .hljs class to all block codes
+ // add .hljs class to all block codes
- dom.window.document.querySelectorAll("pre > code").forEach((item) => {
- item.classList.add("hljs")
- })
+ dom.window.document.querySelectorAll("pre > code").forEach((item) => {
+ item.classList.add("hljs")
+ })
- // add parent div to tables (horizontally scroll table on small displays)
+ // add parent div to tables (horizontally scroll table on small displays)
- dom.window.document.querySelectorAll("table").forEach((item) => {
- // `element` is the element you want to wrap
- const parent = item.parentNode
- if (!parent) return // stop if table doesn't have a parent node
- const wrapper = dom.window.document.createElement("div")
- wrapper.style.overflowX = "auto"
+ dom.window.document.querySelectorAll("table").forEach((item) => {
+ // `element` is the element you want to wrap
+ const parent = item.parentNode
+ if (!parent) return // stop if table doesn't have a parent node
+ const wrapper = dom.window.document.createElement("div")
+ wrapper.style.overflowX = "auto"
- parent.replaceChild(wrapper, item)
- wrapper.appendChild(item)
- })
+ parent.replaceChild(wrapper, item)
+ wrapper.appendChild(item)
+ })
- frontMatter.content = dom.window.document.documentElement.innerHTML
+ frontMatter.content = dom.window.document.documentElement.innerHTML
- return frontMatter as MarkdownData
+ return frontMatter as MarkdownData
}
export function generateToc(markdownRaw: string): string {
- return md.render(toc(markdownRaw).content, {
- slugify: slugifyIt,
- })
+ return md.render(toc(markdownRaw).content, {
+ slugify: slugifyIt,
+ })
}
diff --git a/packages/blog-content/src/portfolio/skills.json b/packages/blog-content/src/portfolio/skills.json
index e1b2353..188f847 100644
--- a/packages/blog-content/src/portfolio/skills.json
+++ b/packages/blog-content/src/portfolio/skills.json
@@ -1,21 +1,21 @@
{
- "Programming Languages": [
- "javascript",
- "typescript",
- "python",
- "rust",
- "csharp C#"
- ],
- "Web Front End": ["react", "svelte", "tailwindcss Tailwind"],
- "Desktop Front End": ["gtk", "electron", "tauri"],
- "Back End": ["firebase"],
- "DevOps": ["docker", "githubactions GH Actions"],
- "Game Development": ["unity"],
- "Etc": [
- "figma",
- "markdown",
- "notion",
- "google Google-Fu",
- "discord Discord Bot"
- ]
+ "Programming Languages": [
+ "javascript",
+ "typescript",
+ "python",
+ "rust",
+ "csharp C#"
+ ],
+ "Web Front End": ["react", "svelte", "tailwindcss Tailwind"],
+ "Desktop Front End": ["gtk", "electron", "tauri"],
+ "Back End": ["firebase"],
+ "DevOps": ["docker", "githubactions GH Actions"],
+ "Game Development": ["unity"],
+ "Etc": [
+ "figma",
+ "markdown",
+ "notion",
+ "google Google-Fu",
+ "discord Discord Bot"
+ ]
}
diff --git a/packages/blog-content/src/portfolio/style.css b/packages/blog-content/src/portfolio/style.css
index 21f35d9..9ade16e 100644
--- a/packages/blog-content/src/portfolio/style.css
+++ b/packages/blog-content/src/portfolio/style.css
@@ -1,9 +1,9 @@
svg {
- /* from github */
- font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,
- sans-serif, Apple Color Emoji, Segoe UI Emoji;
- font-size: 14px;
- color: #777777;
+ /* from github */
+ font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,
+ sans-serif, Apple Color Emoji, Segoe UI Emoji;
+ font-size: 14px;
+ color: #777777;
}
h1,
@@ -12,50 +12,50 @@ h3,
h4,
h5,
h6 {
- text-align: center;
+ text-align: center;
}
.items-wrapper {
- display: grid;
- grid-template-columns: repeat(5, 1fr);
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
- column-gap: 10px;
- row-gap: 15px;
+ column-gap: 10px;
+ row-gap: 15px;
}
.badge {
- display: flex;
- flex-direction: column;
+ display: flex;
+ flex-direction: column;
- justify-content: center;
- align-items: center;
- text-align: center;
+ justify-content: center;
+ align-items: center;
+ text-align: center;
- gap: 5px;
+ gap: 5px;
}
.badge-box {
- display: flex;
+ display: flex;
- justify-content: center;
- align-items: center;
+ justify-content: center;
+ align-items: center;
- border-radius: 7px;
+ border-radius: 7px;
- width: 70px;
- height: 70px;
+ width: 70px;
+ height: 70px;
}
.icon-container > svg {
- height: 40px !important;
+ height: 40px !important;
}
.white {
- color: white;
- fill: white;
+ color: white;
+ fill: white;
}
.black {
- color: black;
- fill: black;
+ color: black;
+ fill: black;
}
diff --git a/packages/blog-content/src/postProcess.ts b/packages/blog-content/src/postProcess.ts
index c3dd826..121f27c 100644
--- a/packages/blog-content/src/postProcess.ts
+++ b/packages/blog-content/src/postProcess.ts
@@ -12,127 +12,127 @@ import skills from "./portfolio/skills.json"
import { writeToFile } from "./util"
export default function postProcess() {
- sortDates()
- fillTags()
- parseSeries()
- generatePortfolioSVGs()
+ sortDates()
+ fillTags()
+ parseSeries()
+ generatePortfolioSVGs()
}
function sortDates() {
- const TmpDate = contentMap.date
- contentMap.date = {}
- Object.keys(TmpDate)
- .sort()
- .forEach((sortedDateKey) => {
- contentMap.date[sortedDateKey] = TmpDate[sortedDateKey]
- })
+ const TmpDate = contentMap.date
+ contentMap.date = {}
+ Object.keys(TmpDate)
+ .sort()
+ .forEach((sortedDateKey) => {
+ contentMap.date[sortedDateKey] = TmpDate[sortedDateKey]
+ })
}
function fillTags() {
- contentMap.meta.tags = Object.keys(contentMap.tags)
+ contentMap.meta.tags = Object.keys(contentMap.tags)
}
function parseSeries() {
- // sort series map
- for (const seriesURL in seriesMap) {
- seriesMap[seriesURL].sort((a, b) => {
- if (a.index < b.index) return -1
- if (a.index > b.index) return 1
+ // sort series map
+ for (const seriesURL in seriesMap) {
+ seriesMap[seriesURL].sort((a, b) => {
+ if (a.index < b.index) return -1
+ if (a.index > b.index) return 1
- return 0
- })
- }
+ return 0
+ })
+ }
- // series length and order
- for (const seriesURL in seriesMap) {
- contentMap.series[seriesURL].length = seriesMap[seriesURL].length
- contentMap.series[seriesURL].order = seriesMap[seriesURL].map(
- (item) => item.url
- )
- }
+ // series length and order
+ for (const seriesURL in seriesMap) {
+ contentMap.series[seriesURL].length = seriesMap[seriesURL].length
+ contentMap.series[seriesURL].order = seriesMap[seriesURL].map(
+ (item) => item.url
+ )
+ }
}
function generatePortfolioSVGs() {
- /**
- * render skills.svg
- */
+ /**
+ * render skills.svg
+ */
- // todo: wait add ejs once it's available
+ // todo: wait add ejs once it's available
- const style = readFileSync("./src/portfolio/style.css", "utf-8")
+ const style = readFileSync("./src/portfolio/style.css", "utf-8")
- const data: {
- [key: string]: Badge[] | { [key: string]: Badge[] }
- } = {}
+ const data: {
+ [key: string]: Badge[] | { [key: string]: Badge[] }
+ } = {}
- // C O G N I T O - H A Z A R D
- // THIS PART OF THE CODE WAS WRITTEN IN 3 AM
- // C O G N I T O - H A Z A R D
+ // C O G N I T O - H A Z A R D
+ // THIS PART OF THE CODE WAS WRITTEN IN 3 AM
+ // C O G N I T O - H A Z A R D
- for (const key in skills) {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- if (skills[key] instanceof Array) {
- if (!data[key]) {
- data[key] = []
- }
+ for (const key in skills) {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ if (skills[key] instanceof Array) {
+ if (!data[key]) {
+ data[key] = []
+ }
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- ;(skills[key] as string[]).forEach((badge) =>
- (data[key] as Badge[]).push(parseBadge(badge))
- )
- } else {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- for (const subKey in skills[key]) {
- if (!data[key]) data[key] = {}
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ ;(skills[key] as string[]).forEach((badge) =>
+ (data[key] as Badge[]).push(parseBadge(badge))
+ )
+ } else {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ for (const subKey in skills[key]) {
+ if (!data[key]) data[key] = {}
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- if (!data[key][subKey]) {
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- data[key][subKey] = []
- }
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ if (!data[key][subKey]) {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ data[key][subKey] = []
+ }
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- skills[key][subKey].forEach((badge: string) =>
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
- // @ts-ignore
- (data[key][subKey] as Badge[]).push(parseBadge(badge))
- )
- }
- }
- }
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ skills[key][subKey].forEach((badge: string) =>
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ (data[key][subKey] as Badge[]).push(parseBadge(badge))
+ )
+ }
+ }
+ }
- const renderedSVG = ejs.render(
- readFileSync("./src/portfolio/skills.ejs", "utf-8"),
- { style, data },
- { views: ["./src/portfolio"] }
- )
+ const renderedSVG = ejs.render(
+ readFileSync("./src/portfolio/skills.ejs", "utf-8"),
+ { style, data },
+ { views: ["./src/portfolio"] }
+ )
- writeToFile(
- "./dist/public/img/skills.svg",
- optimize(renderedSVG, { multipass: true }).data
- )
+ writeToFile(
+ "./dist/public/img/skills.svg",
+ optimize(renderedSVG, { multipass: true }).data
+ )
}
function parseBadge(badgeRaw: string): Badge {
- const isMultiWord = badgeRaw.includes(" ")
- const words = badgeRaw.split(" ")
- const slug = words[0]
+ const isMultiWord = badgeRaw.includes(" ")
+ const words = badgeRaw.split(" ")
+ const slug = words[0]
- // @ts-ignore
- const icon = icons["si" + slug[0].toUpperCase() + slug.slice(1)]
+ // @ts-ignore
+ const icon = icons["si" + slug[0].toUpperCase() + slug.slice(1)]
- const color = tinycolor(icon.hex).lighten(5).desaturate(5)
+ const color = tinycolor(icon.hex).lighten(5).desaturate(5)
- return {
- svg: icon.svg,
- hex: color.toHexString(),
- isDark: color.isDark(),
- title: isMultiWord ? words.slice(1).join(" ") : icon.title,
- }
+ return {
+ svg: icon.svg,
+ hex: color.toHexString(),
+ isDark: color.isDark(),
+ title: isMultiWord ? words.slice(1).join(" ") : icon.title,
+ }
}
diff --git a/packages/blog-content/src/recursiveParse/index.ts b/packages/blog-content/src/recursiveParse/index.ts
index f704219..191372e 100644
--- a/packages/blog-content/src/recursiveParse/index.ts
+++ b/packages/blog-content/src/recursiveParse/index.ts
@@ -15,15 +15,15 @@ import { ParseMode } from "../types/types"
* Data that's passed from {@link parseFile} to other function
*/
export interface DataToPass {
- path: string
- urlPath: string
- markdownRaw: string
- markdownData: {
- content: string
- [key: string]: unknown
- }
- humanizedDuration: string
- totalWords: number
+ path: string
+ urlPath: string
+ markdownRaw: string
+ markdownData: {
+ content: string
+ [key: string]: unknown
+ }
+ humanizedDuration: string
+ totalWords: number
}
/**
@@ -33,23 +33,23 @@ export interface DataToPass {
* @param {string} path - path of file or folder
*/
export function recursiveParse(mode: ParseMode, path: string): void {
- // get name of the file or folder that's currently being parsed
- const fileOrFolderName = path2FileOrFolderName(path)
+ // get name of the file or folder that's currently being parsed
+ const fileOrFolderName = path2FileOrFolderName(path)
- // stop if the file or folder starts with a underscore
- if (fileOrFolderName.startsWith("_")) return
+ // stop if the file or folder starts with a underscore
+ if (fileOrFolderName.startsWith("_")) return
- const stats = fs.lstatSync(path)
+ const stats = fs.lstatSync(path)
- // if it's a directory, call this function to every files/directories in it
- // if it's a file, parse it and then save it to file
- if (stats.isDirectory()) {
- fs.readdirSync(path).map((childPath) => {
- recursiveParse(mode, `${path}/${childPath}`)
- })
- } else if (stats.isFile()) {
- parseFile(mode, path)
- }
+ // if it's a directory, call this function to every files/directories in it
+ // if it's a file, parse it and then save it to file
+ if (stats.isDirectory()) {
+ fs.readdirSync(path).map((childPath) => {
+ recursiveParse(mode, `${path}/${childPath}`)
+ })
+ } else if (stats.isFile()) {
+ parseFile(mode, path)
+ }
}
/**
@@ -59,50 +59,50 @@ export function recursiveParse(mode: ParseMode, path: string): void {
* @param {string} path - path of the markdown file
*/
function parseFile(mode: ParseMode, path: string): void {
- // stop if it is not a markdown file
- if (!path.endsWith(".md")) {
- console.log(`Ignoring non markdown file at: ${path}`)
- return
- }
+ // stop if it is not a markdown file
+ if (!path.endsWith(".md")) {
+ console.log(`Ignoring non markdown file at: ${path}`)
+ return
+ }
- /**
- * Parse markdown
- */
+ /**
+ * Parse markdown
+ */
- const markdownRaw = fs.readFileSync(path, "utf8")
- const markdownData = parseMarkdown(markdownRaw, path, mode)
- const { humanizedDuration, totalWords } = readTimeEstimate(
- markdownData.content,
- 275,
- 12,
- 500,
- ["img", "Image"]
- )
+ const markdownRaw = fs.readFileSync(path, "utf8")
+ const markdownData = parseMarkdown(markdownRaw, path, mode)
+ const { humanizedDuration, totalWords } = readTimeEstimate(
+ markdownData.content,
+ 275,
+ 12,
+ 500,
+ ["img", "Image"]
+ )
- const dataToPass: DataToPass = {
- path,
- urlPath: path2URL(path),
- markdownRaw,
- markdownData,
- humanizedDuration,
- totalWords,
- }
+ const dataToPass: DataToPass = {
+ path,
+ urlPath: path2URL(path),
+ markdownRaw,
+ markdownData,
+ humanizedDuration,
+ totalWords,
+ }
- switch (mode) {
- case ParseMode.POSTS:
- parsePost(dataToPass)
- break
+ switch (mode) {
+ case ParseMode.POSTS:
+ parsePost(dataToPass)
+ break
- case ParseMode.SERIES:
- parseSeries(dataToPass)
- break
+ case ParseMode.SERIES:
+ parseSeries(dataToPass)
+ break
- case ParseMode.UNSEARCHABLE:
- parseUnsearchable(dataToPass)
- break
+ case ParseMode.UNSEARCHABLE:
+ parseUnsearchable(dataToPass)
+ break
- case ParseMode.PORTFOLIO:
- parseProjects(dataToPass)
- break
- }
+ case ParseMode.PORTFOLIO:
+ parseProjects(dataToPass)
+ break
+ }
}
diff --git a/packages/blog-content/src/recursiveParse/parsePost.ts b/packages/blog-content/src/recursiveParse/parsePost.ts
index 5cd9640..5e4c924 100644
--- a/packages/blog-content/src/recursiveParse/parsePost.ts
+++ b/packages/blog-content/src/recursiveParse/parsePost.ts
@@ -8,65 +8,70 @@ import { DataToPass } from "."
import { PostData } from "../types/types"
export default function parsePost(data: DataToPass): void {
- const { urlPath, markdownRaw, markdownData, humanizedDuration, totalWords } =
- data
+ const {
+ urlPath,
+ markdownRaw,
+ markdownData,
+ humanizedDuration,
+ totalWords,
+ } = data
- const postData: PostData = {
- title: markdownData.title as string,
- date: "",
- readTime: humanizedDuration,
- wordCount: totalWords,
- tags: [],
- }
+ const postData: PostData = {
+ title: markdownData.title as string,
+ date: "",
+ readTime: humanizedDuration,
+ wordCount: totalWords,
+ tags: [],
+ }
- /**
- * Dates
- */
+ /**
+ * Dates
+ */
- const postDate = new Date(markdownData.date as string)
- postData.date = postDate.toLocaleString("default", {
- month: "short",
- day: "numeric",
- year: "numeric",
- })
+ const postDate = new Date(markdownData.date as string)
+ postData.date = postDate.toLocaleString("default", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ })
- const YYYY_MM_DD = postDate.toISOString().split("T")[0]
- if (contentMap.date[YYYY_MM_DD]) {
- contentMap.date[YYYY_MM_DD].push(urlPath)
- } else {
- contentMap.date[YYYY_MM_DD] = [urlPath]
- }
+ const YYYY_MM_DD = postDate.toISOString().split("T")[0]
+ if (contentMap.date[YYYY_MM_DD]) {
+ contentMap.date[YYYY_MM_DD].push(urlPath)
+ } else {
+ contentMap.date[YYYY_MM_DD] = [urlPath]
+ }
- /**
- * Tags
- */
+ /**
+ * Tags
+ */
- postData.tags = markdownData.tags as string[]
- if (postData.tags) {
- postData.tags.forEach((tag) => {
- if (contentMap.tags[tag]) {
- contentMap.tags[tag].push(urlPath)
- } else {
- contentMap.tags[tag] = [urlPath]
- }
- })
- }
+ postData.tags = markdownData.tags as string[]
+ if (postData.tags) {
+ postData.tags.forEach((tag) => {
+ if (contentMap.tags[tag]) {
+ contentMap.tags[tag].push(urlPath)
+ } else {
+ contentMap.tags[tag] = [urlPath]
+ }
+ })
+ }
- /**
- *
- */
+ /**
+ *
+ */
- contentMap.posts[urlPath] = postData
- addDocument({
- title: markdownData.title,
- body: markdownData.content,
- url: urlPath,
- })
- writeToFile(
- `${contentDirectoryPath}${urlPath}.json`,
- JSON.stringify({
- content: markdownData.content,
- toc: generateToc(markdownRaw),
- })
- )
+ contentMap.posts[urlPath] = postData
+ addDocument({
+ title: markdownData.title,
+ body: markdownData.content,
+ url: urlPath,
+ })
+ writeToFile(
+ `${contentDirectoryPath}${urlPath}.json`,
+ JSON.stringify({
+ content: markdownData.content,
+ toc: generateToc(markdownRaw),
+ })
+ )
}
diff --git a/packages/blog-content/src/recursiveParse/parseProjects.ts b/packages/blog-content/src/recursiveParse/parseProjects.ts
index a649cc8..e03fb5a 100644
--- a/packages/blog-content/src/recursiveParse/parseProjects.ts
+++ b/packages/blog-content/src/recursiveParse/parseProjects.ts
@@ -9,46 +9,46 @@ import { portfolioData } from ".."
import { DataToPass } from "."
export default function parseProjects(data: DataToPass): void {
- const { urlPath, markdownRaw, markdownData } = data
+ const { urlPath, markdownRaw, markdownData } = data
- if (markdownData.badges) {
- ;(markdownData.badges as string[]).forEach((slug) => {
- // todo: handle cases when icon is not on simple-icons
- const icon: SimpleIcon =
- // @ts-ignore
- icons["si" + slug[0].toUpperCase() + slug.slice(1)]
+ if (markdownData.badges) {
+ ;(markdownData.badges as string[]).forEach((slug) => {
+ // todo: handle cases when icon is not on simple-icons
+ const icon: SimpleIcon =
+ // @ts-ignore
+ icons["si" + slug[0].toUpperCase() + slug.slice(1)]
- portfolioData.skills.add(slug)
+ portfolioData.skills.add(slug)
- const color = tinycolor(icon.hex).lighten(5).desaturate(5)
+ const color = tinycolor(icon.hex).lighten(5).desaturate(5)
- // save svg icon
- writeToFile(
- `${iconsDirectoryPath}/${icon.slug}.json`,
- JSON.stringify({
- svg: icon.svg,
- hex: color.toHexString(),
- isDark: color.isDark(),
- title: icon.title,
- })
- )
- })
- }
+ // save svg icon
+ writeToFile(
+ `${iconsDirectoryPath}/${icon.slug}.json`,
+ JSON.stringify({
+ svg: icon.svg,
+ hex: color.toHexString(),
+ isDark: color.isDark(),
+ title: icon.title,
+ })
+ )
+ })
+ }
- // remove /projects/ prefix
- portfolioData.projects[urlPath.replace("/projects/", "")] = {
- name: markdownData.name as string,
- image: markdownData.image as string,
- overview: markdownData.overview as string,
- badges: (markdownData.badges as string[]) || [],
- repo: (markdownData.repo as string) || "",
- }
+ // remove /projects/ prefix
+ portfolioData.projects[urlPath.replace("/projects/", "")] = {
+ name: markdownData.name as string,
+ image: markdownData.image as string,
+ overview: markdownData.overview as string,
+ badges: (markdownData.badges as string[]) || [],
+ repo: (markdownData.repo as string) || "",
+ }
- writeToFile(
- `${contentDirectoryPath}${urlPath}.json`,
- JSON.stringify({
- content: markdownData.content,
- toc: generateToc(markdownRaw),
- })
- )
+ writeToFile(
+ `${contentDirectoryPath}${urlPath}.json`,
+ JSON.stringify({
+ content: markdownData.content,
+ toc: generateToc(markdownRaw),
+ })
+ )
}
diff --git a/packages/blog-content/src/recursiveParse/parseSeries.ts b/packages/blog-content/src/recursiveParse/parseSeries.ts
index 6ca8dc7..12e1ca8 100644
--- a/packages/blog-content/src/recursiveParse/parseSeries.ts
+++ b/packages/blog-content/src/recursiveParse/parseSeries.ts
@@ -8,140 +8,141 @@ import { DataToPass } from "."
import { PostData } from "../types/types"
export default function parseSeries(data: DataToPass): void {
- const {
- path,
- urlPath: _urlPath,
- markdownRaw,
- markdownData,
- humanizedDuration,
- totalWords,
- } = data
+ const {
+ path,
+ urlPath: _urlPath,
+ markdownRaw,
+ markdownData,
+ humanizedDuration,
+ totalWords,
+ } = data
- // last part of the url without the slash
- let lastPath = _urlPath.slice(_urlPath.lastIndexOf("/") + 1)
- if (!lastPath.includes("_") && !lastPath.startsWith("0"))
- throw Error(`Invalid series file name at: "${path}"`)
+ // last part of the url without the slash
+ let lastPath = _urlPath.slice(_urlPath.lastIndexOf("/") + 1)
+ if (!lastPath.includes("_") && !lastPath.startsWith("0"))
+ throw Error(`Invalid series file name at: "${path}"`)
- // if file is a series descriptor or not (not = regular series post)
- const isFileDescriptor = lastPath.startsWith("0") && !lastPath.includes("_")
+ // if file is a series descriptor or not (not = regular series post)
+ const isFileDescriptor = lastPath.startsWith("0") && !lastPath.includes("_")
- // series post url
- if (isFileDescriptor) {
- lastPath = ""
- } else {
- lastPath = lastPath
- .slice(lastPath.indexOf("_") + 1) // get string after the series index
- .replace(/\/$/, "") // remove trailing slash
- }
+ // series post url
+ if (isFileDescriptor) {
+ lastPath = ""
+ } else {
+ lastPath = lastPath
+ .slice(lastPath.indexOf("_") + 1) // get string after the series index
+ .replace(/\/$/, "") // remove trailing slash
+ }
- // get url until right before the lastPath
- const urlUntilLastPath = _urlPath.slice(0, _urlPath.lastIndexOf("/") + 1)
+ // get url until right before the lastPath
+ const urlUntilLastPath = _urlPath.slice(0, _urlPath.lastIndexOf("/") + 1)
- // remove trailing slash if it's a regular series post
- const urlPath =
- (isFileDescriptor
- ? urlUntilLastPath.replace(/\/$/, "")
- : urlUntilLastPath) + lastPath
+ // remove trailing slash if it's a regular series post
+ const urlPath =
+ (isFileDescriptor
+ ? urlUntilLastPath.replace(/\/$/, "")
+ : urlUntilLastPath) + lastPath
- // todo: separate interface for series descriptor (no word count and read time)
- const postData: PostData = {
- title: markdownData.title as string,
- date: "",
- readTime: humanizedDuration,
- wordCount: totalWords,
- tags: [],
- }
+ // todo: separate interface for series descriptor (no word count and read time)
+ const postData: PostData = {
+ title: markdownData.title as string,
+ date: "",
+ readTime: humanizedDuration,
+ wordCount: totalWords,
+ tags: [],
+ }
- /**
- * Date
- */
+ /**
+ * Date
+ */
- const postDate = new Date(markdownData.date as string)
- postData.date = postDate.toLocaleString("default", {
- month: "short",
- day: "numeric",
- year: "numeric",
- })
+ const postDate = new Date(markdownData.date as string)
+ postData.date = postDate.toLocaleString("default", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ })
- const YYYY_MM_DD = postDate.toISOString().split("T")[0]
- if (contentMap.date[YYYY_MM_DD]) {
- contentMap.date[YYYY_MM_DD].push(urlPath)
- } else {
- contentMap.date[YYYY_MM_DD] = [urlPath]
- }
+ const YYYY_MM_DD = postDate.toISOString().split("T")[0]
+ if (contentMap.date[YYYY_MM_DD]) {
+ contentMap.date[YYYY_MM_DD].push(urlPath)
+ } else {
+ contentMap.date[YYYY_MM_DD] = [urlPath]
+ }
- /**
- * Tags
- */
+ /**
+ * Tags
+ */
- postData.tags = markdownData.tags as string[]
- if (postData.tags) {
- postData.tags.forEach((tag) => {
- if (contentMap.tags[tag]) {
- contentMap.tags[tag].push(urlPath)
- } else {
- contentMap.tags[tag] = [urlPath]
- }
- })
- }
+ postData.tags = markdownData.tags as string[]
+ if (postData.tags) {
+ postData.tags.forEach((tag) => {
+ if (contentMap.tags[tag]) {
+ contentMap.tags[tag].push(urlPath)
+ } else {
+ contentMap.tags[tag] = [urlPath]
+ }
+ })
+ }
- /**
- *
- */
+ /**
+ *
+ */
- addDocument({
- title: markdownData.title,
- body: markdownData.content,
- url: urlPath,
- })
+ addDocument({
+ title: markdownData.title,
+ body: markdownData.content,
+ url: urlPath,
+ })
- contentMap.posts[urlPath] = postData
+ contentMap.posts[urlPath] = postData
- // series markdown starting with 0 is a series descriptor
- if (isFileDescriptor) {
- contentMap.series[urlPath] = {
- ...postData,
- order: [],
- length: 0,
- }
- } else {
- // put series post in appropriate series
- for (const key of Object.keys(contentMap.series)) {
- if (urlPath.includes(key)) {
- const index = parseInt(
- _urlPath.slice(
- _urlPath.lastIndexOf("/") + 1,
- _urlPath.lastIndexOf("_")
- )
- )
+ // series markdown starting with 0 is a series descriptor
+ if (isFileDescriptor) {
+ contentMap.series[urlPath] = {
+ ...postData,
+ order: [],
+ length: 0,
+ }
+ } else {
+ // put series post in appropriate series
+ for (const key of Object.keys(contentMap.series)) {
+ if (urlPath.includes(key)) {
+ const index = parseInt(
+ _urlPath.slice(
+ _urlPath.lastIndexOf("/") + 1,
+ _urlPath.lastIndexOf("_")
+ )
+ )
- if (isNaN(index)) throw Error(`Invalid series index at: ${path}`)
+ if (isNaN(index))
+ throw Error(`Invalid series index at: ${path}`)
- const itemToPush = {
- index: index,
- url: urlPath,
- }
+ const itemToPush = {
+ index: index,
+ url: urlPath,
+ }
- if (seriesMap[key]) {
- seriesMap[key].push(itemToPush)
- } else {
- seriesMap[key] = [itemToPush]
- }
+ if (seriesMap[key]) {
+ seriesMap[key].push(itemToPush)
+ } else {
+ seriesMap[key] = [itemToPush]
+ }
- break
- }
- }
- }
+ break
+ }
+ }
+ }
- /**
- * Save content
- */
+ /**
+ * Save content
+ */
- writeToFile(
- `${contentDirectoryPath}${urlPath}.json`,
- JSON.stringify({
- content: markdownData.content,
- toc: generateToc(markdownRaw),
- })
- )
+ writeToFile(
+ `${contentDirectoryPath}${urlPath}.json`,
+ JSON.stringify({
+ content: markdownData.content,
+ toc: generateToc(markdownRaw),
+ })
+ )
}
diff --git a/packages/blog-content/src/recursiveParse/parseUnsearchable.ts b/packages/blog-content/src/recursiveParse/parseUnsearchable.ts
index 067334f..2ad4c1b 100644
--- a/packages/blog-content/src/recursiveParse/parseUnsearchable.ts
+++ b/packages/blog-content/src/recursiveParse/parseUnsearchable.ts
@@ -5,30 +5,30 @@ import { contentMap } from ".."
import { DataToPass } from "."
export default function parseUnsearchable(data: DataToPass): void {
- const { urlPath: _urlPath, markdownData } = data
+ const { urlPath: _urlPath, markdownData } = data
- // convert path like /XXX/YYY/ZZZ to /YYY/ZZZ
- const urlPath = _urlPath.slice(_urlPath.slice(1).indexOf("/") + 1)
+ // convert path like /XXX/YYY/ZZZ to /YYY/ZZZ
+ const urlPath = _urlPath.slice(_urlPath.slice(1).indexOf("/") + 1)
- addDocument({
- title: markdownData.title,
- body: markdownData.content,
- url: urlPath,
- })
+ addDocument({
+ title: markdownData.title,
+ body: markdownData.content,
+ url: urlPath,
+ })
- // Parse data that will be written to map.js
- contentMap.unsearchable[urlPath] = {
- title: markdownData.title as string,
- }
+ // Parse data that will be written to map.js
+ contentMap.unsearchable[urlPath] = {
+ title: markdownData.title as string,
+ }
- /**
- * Save content
- */
+ /**
+ * Save content
+ */
- writeToFile(
- `${contentDirectoryPath}/unsearchable${urlPath}.json`,
- JSON.stringify({
- content: markdownData.content,
- })
- )
+ writeToFile(
+ `${contentDirectoryPath}/unsearchable${urlPath}.json`,
+ JSON.stringify({
+ content: markdownData.content,
+ })
+ )
}
diff --git a/packages/blog-content/src/searchIndex.ts b/packages/blog-content/src/searchIndex.ts
index e38a6df..226f22e 100644
--- a/packages/blog-content/src/searchIndex.ts
+++ b/packages/blog-content/src/searchIndex.ts
@@ -8,19 +8,19 @@ import elasticlunr from "elasticlunr"
import { searchIndexFilePath } from "./config"
const elasticlunrIndex = elasticlunr(function () {
- this.addField("title" as never)
- this.addField("body" as never)
- this.setRef("url" as never)
+ this.addField("title" as never)
+ this.addField("body" as never)
+ this.setRef("url" as never)
})
export function addDocument(doc: {
- title?: unknown
- body?: string
- url?: string
+ title?: unknown
+ body?: string
+ url?: string
}) {
- elasticlunrIndex.addDoc(doc)
+ elasticlunrIndex.addDoc(doc)
}
export function saveIndex() {
- fs.writeFileSync(searchIndexFilePath, JSON.stringify(elasticlunrIndex))
+ fs.writeFileSync(searchIndexFilePath, JSON.stringify(elasticlunrIndex))
}
diff --git a/packages/blog-content/src/types/markdown-it-texmath.d.ts b/packages/blog-content/src/types/markdown-it-texmath.d.ts
index fe17949..61aae3d 100644
--- a/packages/blog-content/src/types/markdown-it-texmath.d.ts
+++ b/packages/blog-content/src/types/markdown-it-texmath.d.ts
@@ -1,4 +1,4 @@
declare module "markdown-it-texmath" {
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- export default function texmath(md: MarkdownIt, ...params: any[]): void
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ export default function texmath(md: MarkdownIt, ...params: any[]): void
}
diff --git a/packages/blog-content/src/types/markdown-toc.d.ts b/packages/blog-content/src/types/markdown-toc.d.ts
index 2bdc59f..856a040 100644
--- a/packages/blog-content/src/types/markdown-toc.d.ts
+++ b/packages/blog-content/src/types/markdown-toc.d.ts
@@ -1,6 +1,6 @@
declare module "markdown-toc" {
- export default function toc(str: string): {
- json: JSON
- content: string
- }
+ export default function toc(str: string): {
+ json: JSON
+ content: string
+ }
}
diff --git a/packages/blog-content/src/types/types.ts b/packages/blog-content/src/types/types.ts
index 6376df9..4f20fc8 100644
--- a/packages/blog-content/src/types/types.ts
+++ b/packages/blog-content/src/types/types.ts
@@ -1,32 +1,32 @@
export interface ContentMap {
- // key: YYYY-MM-DD
- // value: url
- date: { [key: string]: string[] }
+ // key: YYYY-MM-DD
+ // value: url
+ date: { [key: string]: string[] }
- // key: tag name
- // value: url
- tags: {
- [key: string]: string[]
- }
+ // key: tag name
+ // value: url
+ tags: {
+ [key: string]: string[]
+ }
- // list of all meta data
- meta: {
- tags: string[]
- }
+ // list of all meta data
+ meta: {
+ tags: string[]
+ }
- // searchable, non-series posts
- // must have a post date
- // tag is not required
- posts: {
- [key: string]: PostData
- }
+ // searchable, non-series posts
+ // must have a post date
+ // tag is not required
+ posts: {
+ [key: string]: PostData
+ }
- // series posts have "previous post" and "next post" button so they need to be ordered
- series: { [key: string]: Series }
+ // series posts have "previous post" and "next post" button so they need to be ordered
+ series: { [key: string]: Series }
- // urls of unsearchable posts
- // it is here to quickly check if a post exists or not
- unsearchable: { [key: string]: { title: string } }
+ // urls of unsearchable posts
+ // it is here to quickly check if a post exists or not
+ unsearchable: { [key: string]: { title: string } }
}
/**
@@ -34,58 +34,58 @@ export interface ContentMap {
*/
export enum ParseMode {
- POSTS,
- SERIES,
- UNSEARCHABLE,
- PORTFOLIO,
+ POSTS,
+ SERIES,
+ UNSEARCHABLE,
+ PORTFOLIO,
}
export interface MarkdownData {
- content: string
- [key: string]: unknown
+ content: string
+ [key: string]: unknown
}
export interface PostData {
- title: string
- date: string
- readTime: string
- wordCount: number
- tags?: string[]
+ title: string
+ date: string
+ readTime: string
+ wordCount: number
+ tags?: string[]
}
export interface PageData {
- title: string
- date: string
- readTime: string
- wordCount: number
- tags: string[]
- toc?: string
- content: string
+ title: string
+ date: string
+ readTime: string
+ wordCount: number
+ tags: string[]
+ toc?: string
+ content: string
- // series
+ // series
- seriesHome: string
- prev?: string
- next?: string
+ seriesHome: string
+ prev?: string
+ next?: string
- // series home
+ // series home
- order: string[]
- length: number
+ order: string[]
+ length: number
- // portfolio
+ // portfolio
- image: string // image url
- overview: string
- badges: string[]
- repo: string
+ image: string // image url
+ overview: string
+ badges: string[]
+ repo: string
}
export interface Badge {
- svg: string
- hex: string
- isDark: boolean
- title: string
+ svg: string
+ hex: string
+ isDark: boolean
+ title: string
}
/**
@@ -93,23 +93,23 @@ export interface Badge {
*/
export interface Series {
- title: string
- date: string
- readTime: string
- wordCount: number
- order: string[]
- length: number
- tags?: string[]
+ title: string
+ date: string
+ readTime: string
+ wordCount: number
+ order: string[]
+ length: number
+ tags?: string[]
}
export interface SeriesMap {
- // key: url
- [key: string]: SeriesEntry[]
+ // key: url
+ [key: string]: SeriesEntry[]
}
export interface SeriesEntry {
- index: number
- url: string
+ index: number
+ url: string
}
/**
@@ -117,25 +117,25 @@ export interface SeriesEntry {
*/
export interface PortfolioData {
- // a set of valid simple icons slug
- skills: Set
+ // a set of valid simple icons slug
+ skills: Set
- // key: url
- projects: {
- [key: string]: PortfolioProject
- }
+ // key: url
+ projects: {
+ [key: string]: PortfolioProject
+ }
}
export interface PortfolioOverview {
- // link to my github
- github: string
- description: string
+ // link to my github
+ github: string
+ description: string
}
export interface PortfolioProject {
- name: string
- image: string // url to the image
- overview: string
- badges: string[] // array of valid simpleIcons slug
- repo: string // url of the git repository
+ name: string
+ image: string // url to the image
+ overview: string
+ badges: string[] // array of valid simpleIcons slug
+ repo: string // url of the git repository
}
diff --git a/packages/blog-content/src/util.ts b/packages/blog-content/src/util.ts
index b8a1ecf..eab0f01 100644
--- a/packages/blog-content/src/util.ts
+++ b/packages/blog-content/src/util.ts
@@ -9,9 +9,9 @@ import { markdownPath } from "./config"
* @param {string} pathToConvert
*/
export function path2URL(pathToConvert: string): string {
- return `/${relative(markdownPath, pathToConvert)}`
- .replace(/\.[^/.]+$/, "") // remove the file extension
- .replace(/ /g, "-") // replace all space with a dash
+ return `/${relative(markdownPath, pathToConvert)}`
+ .replace(/\.[^/.]+$/, "") // remove the file extension
+ .replace(/ /g, "-") // replace all space with a dash
}
/**
@@ -20,33 +20,34 @@ export function path2URL(pathToConvert: string): string {
* @param {string} inputPath - path to parse
*/
export function path2FileOrFolderName(inputPath: string): string {
- // remove trailing slash
- if (inputPath[-1] == "/") inputPath = inputPath.slice(0, inputPath.length - 1)
+ // remove trailing slash
+ if (inputPath[-1] == "/")
+ inputPath = inputPath.slice(0, inputPath.length - 1)
- // get the last section
- return inputPath.slice(inputPath.lastIndexOf("/") + 1)
+ // get the last section
+ return inputPath.slice(inputPath.lastIndexOf("/") + 1)
}
// gets the nth occurance of a pattern in string
// returns -1 if nothing is found
// https://stackoverflow.com/a/14482123/12979111
export function nthIndex(str: string, pat: string, n: number) {
- let i = -1
+ let i = -1
- while (n-- && i++ < str.length) {
- i = str.indexOf(pat, i)
- if (i < 0) break
- }
+ while (n-- && i++ < str.length) {
+ i = str.indexOf(pat, i)
+ if (i < 0) break
+ }
- return i
+ return i
}
export function writeToFile(filePath: string, dataToWrite: string) {
- // create directory to put the files
- fs.mkdirSync(filePath.slice(0, filePath.lastIndexOf("/")), {
- recursive: true,
- })
+ // create directory to put the files
+ fs.mkdirSync(filePath.slice(0, filePath.lastIndexOf("/")), {
+ recursive: true,
+ })
- // write content to the file
- fs.writeFileSync(filePath, dataToWrite)
+ // write content to the file
+ fs.writeFileSync(filePath, dataToWrite)
}
diff --git a/packages/blog-content/tsconfig.json b/packages/blog-content/tsconfig.json
index 35970e2..8c1d9d7 100644
--- a/packages/blog-content/tsconfig.json
+++ b/packages/blog-content/tsconfig.json
@@ -1,16 +1,16 @@
{
- "extends": "@developomp-site/tsconfig/node16.json",
- "include": ["src"],
- "ts-node": {
- "esm": true
- },
- "compilerOptions": {
- "moduleResolution": "Node",
- "isolatedModules": false,
- "noImplicitAny": false,
- "esModuleInterop": true,
- "allowJs": true,
- "resolveJsonModule": true
- },
- "exclude": ["dist", "node_modules"]
+ "extends": "@developomp-site/tsconfig/node16.json",
+ "include": ["src"],
+ "ts-node": {
+ "esm": true
+ },
+ "compilerOptions": {
+ "moduleResolution": "Node",
+ "isolatedModules": false,
+ "noImplicitAny": false,
+ "esModuleInterop": true,
+ "allowJs": true,
+ "resolveJsonModule": true
+ },
+ "exclude": ["dist", "node_modules"]
}
diff --git a/packages/eslint-config/index.js b/packages/eslint-config/index.js
index 5371ea8..deafa58 100644
--- a/packages/eslint-config/index.js
+++ b/packages/eslint-config/index.js
@@ -1,17 +1,20 @@
+/** @type {import("eslint").Linter.Config} */
module.exports = {
- extends: [
- "plugin:@typescript-eslint/recommended",
- "plugin:json/recommended",
- "eslint:recommended",
- "prettier",
- "turbo",
- ],
- parser: "@typescript-eslint/parser",
- plugins: ["@typescript-eslint"],
- rules: {
- "@next/next/no-html-link-for-pages": "off",
-
- "@typescript-eslint/explicit-module-boundary-types": "off",
- "@typescript-eslint/no-empty-interface": "off",
- },
+ root: true,
+ extends: [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended",
+ "prettier",
+ "turbo",
+ ],
+ parser: "@typescript-eslint/parser",
+ plugins: ["@typescript-eslint", "simple-import-sort"],
+ rules: {
+ // import related
+ "simple-import-sort/imports": "error",
+ "simple-import-sort/exports": "error",
+ "import/first": "error",
+ "import/newline-after-import": "error",
+ "import/no-duplicates": "error",
+ },
}
diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json
index 9733626..685790a 100644
--- a/packages/eslint-config/package.json
+++ b/packages/eslint-config/package.json
@@ -1,16 +1,18 @@
{
- "name": "@developomp-site/eslint-config",
- "version": "0.0.0",
- "main": "index.js",
- "scripts": {
- "clean": "rm -rf node_modules"
- },
- "devDependencies": {
- "@typescript-eslint/eslint-plugin": "^5.46.0",
- "@typescript-eslint/parser": "^5.46.0",
- "eslint-config-next": "^12.3.4",
- "eslint-config-prettier": "^8.5.0",
- "eslint-config-turbo": "latest",
- "eslint-plugin-json": "^3.1.0"
- }
+ "name": "@developomp-site/eslint-config",
+ "version": "0.0.0",
+ "main": "index.js",
+ "scripts": {
+ "clean": "rm -rf node_modules"
+ },
+ "devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.60.1",
+ "@typescript-eslint/parser": "^5.60.1",
+ "eslint": "^8.43.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-config-turbo": "latest",
+ "eslint-plugin-json": "^3.1.0",
+ "eslint-plugin-simple-import-sort": "^10.0.0",
+ "typescript": "^5.1.6"
+ }
}
diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json
index 718b845..646e995 100644
--- a/packages/tailwind-config/package.json
+++ b/packages/tailwind-config/package.json
@@ -1,12 +1,12 @@
{
- "name": "@developomp-site/tailwind-config",
- "version": "0.0.0",
- "private": true,
- "main": "index.js",
- "scripts": {
- "clean": "rm -rf node_modules"
- },
- "devDependencies": {
- "tailwindcss": "^3.2.4"
- }
+ "name": "@developomp-site/tailwind-config",
+ "version": "0.0.0",
+ "private": true,
+ "main": "index.js",
+ "scripts": {
+ "clean": "rm -rf node_modules"
+ },
+ "devDependencies": {
+ "tailwindcss": "^3.2.4"
+ }
}
diff --git a/packages/tailwind-config/tailwind.config.js b/packages/tailwind-config/tailwind.config.js
index 33f6413..541d5a0 100644
--- a/packages/tailwind-config/tailwind.config.js
+++ b/packages/tailwind-config/tailwind.config.js
@@ -1,8 +1,8 @@
module.exports = {
- content: [
- // app content
- `src/**/*.{js,ts,jsx,tsx}`,
- // include packages if not transpiling
- // "../../packages/**/*.{js,ts,jsx,tsx}",
- ],
+ content: [
+ // app content
+ `src/**/*.{js,ts,jsx,tsx}`,
+ // include packages if not transpiling
+ // "../../packages/**/*.{js,ts,jsx,tsx}",
+ ],
}
diff --git a/packages/theme/.eslintrc b/packages/theme/.eslintrc
index 5e14571..a176be0 100644
--- a/packages/theme/.eslintrc
+++ b/packages/theme/.eslintrc
@@ -1,5 +1,5 @@
{
- "env": {
- "node": true
- }
+ "env": {
+ "node": true
+ }
}
diff --git a/packages/theme/index.d.ts b/packages/theme/index.d.ts
index 46657aa..b40eee8 100644
--- a/packages/theme/index.d.ts
+++ b/packages/theme/index.d.ts
@@ -1,143 +1,143 @@
export interface Theme {
- font: {
- sansSerif: string
- monospace: string
- }
+ font: {
+ sansSerif: string
+ monospace: string
+ }
- color: {
- text: {
- highContrast: string
- default: string
- gray: string
- }
- background: string
- }
+ color: {
+ text: {
+ highContrast: string
+ default: string
+ gray: string
+ }
+ background: string
+ }
- maxDisplayWidth: {
- mobile: string
- desktop: string
- }
+ maxDisplayWidth: {
+ mobile: string
+ desktop: string
+ }
- component: {
- anchor: {
- color: {
- default: string
- hover: string
- active: string
- header: string
- }
- }
+ component: {
+ anchor: {
+ color: {
+ default: string
+ hover: string
+ active: string
+ header: string
+ }
+ }
- blockQuote: {
- color: {
- background: string
- borderLeft: string
- }
- }
+ blockQuote: {
+ color: {
+ background: string
+ borderLeft: string
+ }
+ }
- card: {
- color: {
- background: string
- hoverGlow: string
- }
- }
+ card: {
+ color: {
+ background: string
+ hoverGlow: string
+ }
+ }
- code: {
- inline: {
- color: {
- text: string
- background: string
- border: string
- }
- }
- block: {
- color: {
- border: string
- highlight: string
- }
- style: string
- }
- }
+ code: {
+ inline: {
+ color: {
+ text: string
+ background: string
+ border: string
+ }
+ }
+ block: {
+ color: {
+ border: string
+ highlight: string
+ }
+ style: string
+ }
+ }
- footer: {
- color: {
- background: string
- text: string
- }
- }
+ footer: {
+ color: {
+ background: string
+ text: string
+ }
+ }
- header: {
- color: {
- background: string
- hover: string
- text: string
- }
- height: string
- }
+ header: {
+ color: {
+ background: string
+ hover: string
+ text: string
+ }
+ height: string
+ }
- input: {
- color: {
- background: {
- default: string
- itemHover: string
- }
- border: {
- default: string
- hover: string
- focus: string
- }
- placeHolder: string
- }
- }
+ input: {
+ color: {
+ background: {
+ default: string
+ itemHover: string
+ }
+ border: {
+ default: string
+ hover: string
+ focus: string
+ }
+ placeHolder: string
+ }
+ }
- kbd: {
- color: {
- text: string
- border: string
- outerShadow: string
- innerShadow: string
- background: string
- }
- }
+ kbd: {
+ color: {
+ text: string
+ border: string
+ outerShadow: string
+ innerShadow: string
+ background: string
+ }
+ }
- mark: {
- color: {
- text: string
- background: string
- }
- }
+ mark: {
+ color: {
+ text: string
+ background: string
+ }
+ }
- scrollbar: {
- color: {
- track: string
- thumb: string
- }
- width: string
- borderRadius: string
- }
+ scrollbar: {
+ color: {
+ track: string
+ thumb: string
+ }
+ width: string
+ borderRadius: string
+ }
- scrollProgressBar: {
- color: {
- background: string
- foreground: string
- }
- }
+ scrollProgressBar: {
+ color: {
+ background: string
+ foreground: string
+ }
+ }
- table: {
- color: {
- border: string
- even: string
- }
- }
+ table: {
+ color: {
+ border: string
+ even: string
+ }
+ }
- ui: {
- color: {
- background: {
- default: string
- hover: string
- }
- border: string
- }
- }
- }
+ ui: {
+ color: {
+ background: {
+ default: string
+ hover: string
+ }
+ border: string
+ }
+ }
+ }
}
diff --git a/packages/theme/package.json b/packages/theme/package.json
index 9ba47b9..13aadc5 100644
--- a/packages/theme/package.json
+++ b/packages/theme/package.json
@@ -1,22 +1,22 @@
{
- "name": "@developomp-site/theme",
- "version": "0.0.0",
- "types": "./index.d.ts",
- "private": true,
- "license": "MIT",
- "scripts": {
- "dev": "nodemon --ignore dist/ --exec pnpm build",
- "build": "npx ts-node ./build.ts",
- "clean": "rm -rf .turbo node_modules dist"
- },
- "devDependencies": {
- "@types/merge-deep": "^3.0.0",
- "@types/node": "^18.11.11",
- "merge-deep": "^3.0.3",
- "nodemon": "^2.0.20",
- "tailwindcss": "^3.2.4",
- "ts-node": "^10.9.1",
- "tsup": "^5.12.9",
- "utility-types": "^3.10.0"
- }
+ "name": "@developomp-site/theme",
+ "version": "0.0.0",
+ "types": "./index.d.ts",
+ "private": true,
+ "license": "MIT",
+ "scripts": {
+ "dev": "nodemon --ignore dist/ --exec pnpm build",
+ "build": "npx ts-node ./build.ts",
+ "clean": "rm -rf .turbo node_modules dist"
+ },
+ "devDependencies": {
+ "@types/merge-deep": "^3.0.0",
+ "@types/node": "^18.11.11",
+ "merge-deep": "^3.0.3",
+ "nodemon": "^2.0.20",
+ "tailwindcss": "^3.2.4",
+ "ts-node": "^10.9.1",
+ "tsup": "^5.12.9",
+ "utility-types": "^3.10.0"
+ }
}
diff --git a/packages/theme/src/dark/codeblock.css b/packages/theme/src/dark/codeblock.css
index 578015d..d7635d1 100644
--- a/packages/theme/src/dark/codeblock.css
+++ b/packages/theme/src/dark/codeblock.css
@@ -1,71 +1,71 @@
/* from highlight.js/styles/atom-one-dark-reasonable.css */
pre code.hljs {
- display: block;
- overflow-x: auto;
- padding: 1em;
+ display: block;
+ overflow-x: auto;
+ padding: 1em;
}
code.hljs {
- padding: 3px 5px;
+ padding: 3px 5px;
}
.hljs {
- color: #abb2bf;
- background: #282c34;
+ color: #abb2bf;
+ background: #282c34;
}
.hljs-keyword,
.hljs-operator,
.hljs-pattern-match {
- color: #f92672;
+ color: #f92672;
}
.hljs-function,
.hljs-pattern-match .hljs-constructor {
- color: #61aeee;
+ color: #61aeee;
}
.hljs-function .hljs-params {
- color: #a6e22e;
+ color: #a6e22e;
}
.hljs-function .hljs-params .hljs-typing {
- color: #fd971f;
+ color: #fd971f;
}
.hljs-module-access .hljs-module {
- color: #7e57c2;
+ color: #7e57c2;
}
.hljs-constructor {
- color: #e2b93d;
+ color: #e2b93d;
}
.hljs-constructor .hljs-string {
- color: #9ccc65;
+ color: #9ccc65;
}
.hljs-comment,
.hljs-quote {
- color: #b18eb1;
- font-style: italic;
+ color: #b18eb1;
+ font-style: italic;
}
.hljs-doctag,
.hljs-formula {
- color: #c678dd;
+ color: #c678dd;
}
.hljs-deletion,
.hljs-name,
.hljs-section,
.hljs-selector-tag,
.hljs-subst {
- color: #e06c75;
+ color: #e06c75;
}
.hljs-literal {
- color: #56b6c2;
+ color: #56b6c2;
}
.hljs-addition,
.hljs-attribute,
.hljs-meta .hljs-string,
.hljs-regexp,
.hljs-string {
- color: #98c379;
+ color: #98c379;
}
.hljs-built_in,
.hljs-class .hljs-title,
.hljs-title.class_ {
- color: #e6c07b;
+ color: #e6c07b;
}
.hljs-attr,
.hljs-number,
@@ -75,7 +75,7 @@ code.hljs {
.hljs-template-variable,
.hljs-type,
.hljs-variable {
- color: #d19a66;
+ color: #d19a66;
}
.hljs-bullet,
.hljs-link,
@@ -83,14 +83,14 @@ code.hljs {
.hljs-selector-id,
.hljs-symbol,
.hljs-title {
- color: #61aeee;
+ color: #61aeee;
}
.hljs-emphasis {
- font-style: italic;
+ font-style: italic;
}
.hljs-strong {
- font-weight: 700;
+ font-weight: 700;
}
.hljs-link {
- text-decoration: underline;
+ text-decoration: underline;
}
diff --git a/packages/theme/src/dark/index.ts b/packages/theme/src/dark/index.ts
index 88182c9..e0424bc 100644
--- a/packages/theme/src/dark/index.ts
+++ b/packages/theme/src/dark/index.ts
@@ -3,165 +3,145 @@ import type { Theme } from "../.."
import { readFileSync } from "fs"
export default {
- font: {
- sansSerif: "'Noto Sans KR', sans-serif", // https://fonts.google.com/noto/specimen/Noto+Sans+KR
- monospace: "'Source Code Pro', monospace",
- },
+ font: {
+ sansSerif: "'Noto Sans KR', sans-serif", // https://fonts.google.com/noto/specimen/Noto+Sans+KR
+ monospace: "'Source Code Pro', monospace",
+ },
- color: {
- text: {
- highContrast: "#FFFFFF",
- default: "#EEEEEE",
- gray: "#CCC",
- },
- background: "#36393F",
- },
+ color: {
+ text: {
+ highContrast: "#FFFFFF",
+ default: "#EEEEEE",
+ gray: "#CCC",
+ },
+ background: "#36393F",
+ },
- maxDisplayWidth: {
- mobile: "1024px", // max-w-screen-lg
- desktop: "1536px", // max-w-screen-2xl
- },
+ maxDisplayWidth: {
+ mobile: "1024px", // max-w-screen-lg
+ desktop: "1536px", // max-w-screen-2xl
+ },
- component: {
- anchor: {
- color: {
- default: "#66AAFF",
- hover: "#4592F7",
- active: "#4592F7",
- header: "#778899",
- },
- },
+ component: {
+ anchor: {
+ color: {
+ default: "#66AAFF",
+ hover: "#4592F7",
+ active: "#4592F7",
+ header: "#778899",
+ },
+ },
- blockQuote: {
- color: {
- background: "#FFFFFF12",
- borderLeft: "#FFFFFF4D",
- },
- },
+ blockQuote: {
+ color: {
+ background: "#FFFFFF12",
+ borderLeft: "#FFFFFF4D",
+ },
+ },
- card: {
- color: {
- background: "#2F3136",
- hoverGlow: "#FFFFFF33",
- },
- },
+ card: {
+ color: {
+ background: "#2F3136",
+ hoverGlow: "#FFFFFF33",
+ },
+ },
- code: {
- inline: {
- color: {
- text: "#FFFFFF",
- background: "#444",
- border: "#666",
- },
- },
- block: {
- color: {
- border: "#555",
- highlight: "#14161A",
- },
- style: readFileSync(__dirname + "/codeblock.css", "utf-8"),
- },
- },
+ code: {
+ inline: {
+ color: {
+ text: "#FFFFFF",
+ background: "#444",
+ border: "#666",
+ },
+ },
+ block: {
+ color: {
+ border: "#555",
+ highlight: "#14161A",
+ },
+ style: readFileSync(__dirname + "/codeblock.css", "utf-8"),
+ },
+ },
- footer: {
- color: {
- background: "#000000",
- text: "",
- },
- },
+ footer: {
+ color: {
+ background: "#000000",
+ text: "",
+ },
+ },
- header: {
- color: {
- background: "#202225", // custom
- hover: "#3F3F46", // zinc-700
- text: "#D4D4D8", // zinc-300
- },
- height: "16px", // h-4
- },
+ header: {
+ color: {
+ background: "#202225", // custom
+ hover: "#3F3F46", // zinc-700
+ text: "#D4D4D8", // zinc-300
+ },
+ height: "16px", // h-4
+ },
- input: {
- color: {
- background: {
- default: "#36393f",
- itemHover: "#202225",
- },
- border: {
- default: "#555555",
- hover: "#808080",
- focus: "#a3a3a3", // neutral-400
- },
- placeHolder: "#A9A9A9",
- },
- },
+ input: {
+ color: {
+ background: {
+ default: "#36393f",
+ itemHover: "#202225",
+ },
+ border: {
+ default: "#555555",
+ hover: "#808080",
+ focus: "#a3a3a3", // neutral-400
+ },
+ placeHolder: "#A9A9A9",
+ },
+ },
- kbd: {
- color: {
- text: "#FFFFFF",
- border: "#555555",
- outerShadow: "#FFFFFF4D",
- innerShadow: "#000000",
- background: "#000000",
- },
- },
+ kbd: {
+ color: {
+ text: "#FFFFFF",
+ border: "#555555",
+ outerShadow: "#FFFFFF4D",
+ innerShadow: "#000000",
+ background: "#000000",
+ },
+ },
- mark: {
- color: {
- text: "#FFFFFF",
- background: "#FFFF0080",
- },
- },
+ mark: {
+ color: {
+ text: "#FFFFFF",
+ background: "#FFFF0080",
+ },
+ },
- scrollbar: {
- color: {
- track: "#18181B",
- thumb: "#888888",
- },
- width: "8px", // w-2
- borderRadius: "4px", // rounded
- },
+ scrollbar: {
+ color: {
+ track: "#18181B",
+ thumb: "#888888",
+ },
+ width: "8px", // w-2
+ borderRadius: "4px", // rounded
+ },
- scrollProgressBar: {
- color: {
- background: "#52525B", // zinc 600
- foreground: "#D4D4D8", // zinc-300
- },
- },
+ scrollProgressBar: {
+ color: {
+ background: "#52525B", // zinc 600
+ foreground: "#D4D4D8", // zinc-300
+ },
+ },
- table: {
- color: {
- border: "#777777",
- even: "#21272E",
- },
- },
+ table: {
+ color: {
+ border: "#777777",
+ even: "#21272E",
+ },
+ },
- ui: {
- color: {
- background: {
- default: "#202225",
- hover: "#3F3F46", // zinc-700
- },
- border: "#555",
- },
- },
- },
+ ui: {
+ color: {
+ background: {
+ default: "#202225",
+ hover: "#3F3F46", // zinc-700
+ },
+ border: "#555",
+ },
+ },
+ },
} as Theme
-
-/*
- dark: {
- backgroundColor0: "#18181b",
- backgroundColor1: "#36393F",
- backgroundColor2: "#2F3136",
- color0: "#FFFFFF",
- color1: "#EEEEEE",
- color2: "#CCC",
- }
-
- light: {
- backgroundColor0: "#FFFFFF",
- backgroundColor1: "#F7F7F7",
- backgroundColor2: "#DDDDDD",
- color0: "#000000",
- color1: "#111111",
- color2: "#555",
- }
-*/
diff --git a/packages/theme/src/light/codeblock.css b/packages/theme/src/light/codeblock.css
index 8144467..1365c21 100644
--- a/packages/theme/src/light/codeblock.css
+++ b/packages/theme/src/light/codeblock.css
@@ -1,27 +1,27 @@
/* from highlight.js/styles/default.css */
pre code.hljs {
- display: block;
- overflow-x: auto;
- padding: 1em;
+ display: block;
+ overflow-x: auto;
+ padding: 1em;
}
code.hljs {
- padding: 3px 5px;
+ padding: 3px 5px;
}
.hljs {
- background: #f0f0f0;
- color: #444;
+ background: #f0f0f0;
+ color: #444;
}
.hljs-comment {
- color: #888;
+ color: #888;
}
.hljs-punctuation,
.hljs-tag {
- color: #444a;
+ color: #444a;
}
.hljs-tag .hljs-attr,
.hljs-tag .hljs-name {
- color: #444;
+ color: #444;
}
.hljs-attribute,
.hljs-doctag,
@@ -29,7 +29,7 @@ code.hljs {
.hljs-meta .hljs-keyword,
.hljs-name,
.hljs-selector-tag {
- font-weight: 700;
+ font-weight: 700;
}
.hljs-deletion,
.hljs-number,
@@ -39,12 +39,12 @@ code.hljs {
.hljs-string,
.hljs-template-tag,
.hljs-type {
- color: #800;
+ color: #800;
}
.hljs-section,
.hljs-title {
- color: #800;
- font-weight: 700;
+ color: #800;
+ font-weight: 700;
}
.hljs-link,
.hljs-operator,
@@ -54,26 +54,26 @@ code.hljs {
.hljs-symbol,
.hljs-template-variable,
.hljs-variable {
- color: #bc6060;
+ color: #bc6060;
}
.hljs-literal {
- color: #78a960;
+ color: #78a960;
}
.hljs-addition,
.hljs-built_in,
.hljs-bullet,
.hljs-code {
- color: #397300;
+ color: #397300;
}
.hljs-meta {
- color: #1f7199;
+ color: #1f7199;
}
.hljs-meta .hljs-string {
- color: #4d99bf;
+ color: #4d99bf;
}
.hljs-emphasis {
- font-style: italic;
+ font-style: italic;
}
.hljs-strong {
- font-weight: 700;
+ font-weight: 700;
}
diff --git a/packages/theme/src/light/index.ts b/packages/theme/src/light/index.ts
index 5e384b0..d52e768 100644
--- a/packages/theme/src/light/index.ts
+++ b/packages/theme/src/light/index.ts
@@ -7,120 +7,120 @@ import { DeepPartial } from "utility-types"
import BaseTheme from "../dark"
export default merge>(BaseTheme, {
- color: {
- text: {
- highContrast: "#000000",
- default: "#111111",
- gray: "#555",
- },
- background: "#F7F7F7",
- },
- component: {
- anchor: {
- color: {
- header: "#D3D3D3",
- },
- },
+ color: {
+ text: {
+ highContrast: "#000000",
+ default: "#111111",
+ gray: "#555",
+ },
+ background: "#F7F7F7",
+ },
+ component: {
+ anchor: {
+ color: {
+ header: "#D3D3D3",
+ },
+ },
- blockQuote: {
- color: {
- background: "#0000000D",
- borderLeft: "#0000001A",
- },
- },
+ blockQuote: {
+ color: {
+ background: "#0000000D",
+ borderLeft: "#0000001A",
+ },
+ },
- card: {
- color: {
- background: "#FFFFFF",
- hoverGlow: "#00000040",
- },
- },
+ card: {
+ color: {
+ background: "#FFFFFF",
+ hoverGlow: "#00000040",
+ },
+ },
- code: {
- inline: {
- color: {
- text: "#000000",
- background: "#EEE",
- border: "#BBB",
- },
- },
- block: {
- color: {
- border: "#BBB",
- highlight: "#DDDDDD",
- },
- style: readFileSync(__dirname + "/codeblock.css", "utf-8"),
- },
- },
+ code: {
+ inline: {
+ color: {
+ text: "#000000",
+ background: "#EEE",
+ border: "#BBB",
+ },
+ },
+ block: {
+ color: {
+ border: "#BBB",
+ highlight: "#DDDDDD",
+ },
+ style: readFileSync(__dirname + "/codeblock.css", "utf-8"),
+ },
+ },
- footer: {
- color: {
- background: "#FFFFFF",
- text: "",
- },
- },
+ footer: {
+ color: {
+ background: "#FFFFFF",
+ text: "",
+ },
+ },
- input: {
- color: {
- background: {
- default: "#EEEEEE",
- itemHover: "#FFFFFF",
- },
- border: {
- default: "#CCCCCC",
- hover: "#808080",
- focus: "#000000",
- },
- placeHolder: "#777777",
- },
- },
+ input: {
+ color: {
+ background: {
+ default: "#EEEEEE",
+ itemHover: "#FFFFFF",
+ },
+ border: {
+ default: "#CCCCCC",
+ hover: "#808080",
+ focus: "#000000",
+ },
+ placeHolder: "#777777",
+ },
+ },
- kbd: {
- color: {
- text: "#333333",
- border: "#CCCCCC",
- outerShadow: "#00000033",
- innerShadow: "#FFFFFF",
- background: "#F7F7F7",
- },
- },
+ kbd: {
+ color: {
+ text: "#333333",
+ border: "#CCCCCC",
+ outerShadow: "#00000033",
+ innerShadow: "#FFFFFF",
+ background: "#F7F7F7",
+ },
+ },
- mark: {
- color: {
- text: "#000000",
- background: "#FFFF00BF",
- },
- },
+ mark: {
+ color: {
+ text: "#000000",
+ background: "#FFFF00BF",
+ },
+ },
- scrollbar: {
- color: {
- track: "#FFFFFF",
- thumb: "#DDDDDD",
- },
- },
+ scrollbar: {
+ color: {
+ track: "#FFFFFF",
+ thumb: "#DDDDDD",
+ },
+ },
- scrollProgressBar: {
- color: {
- background: "#d4d4d8", // zinc-300
- foreground: "#52525b", // zinc-600
- },
- },
+ scrollProgressBar: {
+ color: {
+ background: "#d4d4d8", // zinc-300
+ foreground: "#52525b", // zinc-600
+ },
+ },
- table: {
- color: {
- border: "#DDD",
- even: "#F2F2F2",
- },
- },
+ table: {
+ color: {
+ border: "#DDD",
+ even: "#F2F2F2",
+ },
+ },
- ui: {
- color: {
- background: {
- default: "#FFFFFF",
- hover: "#EEEEEE",
- },
- border: "#CCC",
- },
- },
- },
+ ui: {
+ color: {
+ background: {
+ default: "#FFFFFF",
+ hover: "#EEEEEE",
+ },
+ border: "#CCC",
+ },
+ },
+ },
}) as Theme
diff --git a/packages/theme/tsconfig.json b/packages/theme/tsconfig.json
index 3153233..9f1c032 100644
--- a/packages/theme/tsconfig.json
+++ b/packages/theme/tsconfig.json
@@ -1,9 +1,9 @@
{
- "compilerOptions": {
- "types": ["node"],
- "moduleResolution": "Node",
- "esModuleInterop": true
- },
- "include": ["src"],
- "exclude": ["dist", "node_modules"]
+ "compilerOptions": {
+ "types": ["node"],
+ "moduleResolution": "Node",
+ "esModuleInterop": true
+ },
+ "include": ["src"],
+ "exclude": ["dist", "node_modules"]
}
diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json
index d72a9f3..dd3c457 100644
--- a/packages/tsconfig/base.json
+++ b/packages/tsconfig/base.json
@@ -1,20 +1,20 @@
{
- "$schema": "https://json.schemastore.org/tsconfig",
- "display": "Default",
- "compilerOptions": {
- "composite": false,
- "declaration": true,
- "declarationMap": true,
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "inlineSources": false,
- "isolatedModules": true,
- "moduleResolution": "node",
- "noUnusedLocals": false,
- "noUnusedParameters": false,
- "preserveWatchOutput": true,
- "skipLibCheck": true,
- "strict": true
- },
- "exclude": ["node_modules"]
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "display": "Default",
+ "compilerOptions": {
+ "composite": false,
+ "declaration": true,
+ "declarationMap": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "inlineSources": false,
+ "isolatedModules": true,
+ "moduleResolution": "node",
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "preserveWatchOutput": true,
+ "skipLibCheck": true,
+ "strict": true
+ },
+ "exclude": ["node_modules"]
}
diff --git a/packages/tsconfig/node16.json b/packages/tsconfig/node16.json
index d88cc58..439bc3e 100644
--- a/packages/tsconfig/node16.json
+++ b/packages/tsconfig/node16.json
@@ -1,10 +1,10 @@
{
- "$schema": "https://json.schemastore.org/tsconfig",
- "display": "Node 16",
- "extends": "./base.json",
- "compilerOptions": {
- "lib": ["ES2020"],
- "module": "commonjs",
- "target": "ES2020"
- }
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "display": "Node 16",
+ "extends": "./base.json",
+ "compilerOptions": {
+ "lib": ["ES2020"],
+ "module": "commonjs",
+ "target": "ES2020"
+ }
}
diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json
index ddf474f..281c106 100644
--- a/packages/tsconfig/package.json
+++ b/packages/tsconfig/package.json
@@ -1,6 +1,6 @@
{
- "name": "@developomp-site/tsconfig",
- "version": "0.0.0",
- "private": true,
- "license": "MIT"
+ "name": "@developomp-site/tsconfig",
+ "version": "0.0.0",
+ "private": true,
+ "license": "MIT"
}
diff --git a/packages/tsconfig/react-library.json b/packages/tsconfig/react-library.json
index fc1e02a..5861de9 100644
--- a/packages/tsconfig/react-library.json
+++ b/packages/tsconfig/react-library.json
@@ -1,11 +1,11 @@
{
- "$schema": "https://json.schemastore.org/tsconfig",
- "display": "React Library",
- "extends": "./base.json",
- "compilerOptions": {
- "jsx": "react-jsx",
- "lib": ["dom", "ES2015"],
- "module": "ESNext",
- "target": "es6"
- }
+ "$schema": "https://json.schemastore.org/tsconfig",
+ "display": "React Library",
+ "extends": "./base.json",
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "lib": ["dom", "ES2015"],
+ "module": "ESNext",
+ "target": "es6"
+ }
}
diff --git a/packages/utils/.eslintrc.js b/packages/utils/.eslintrc.js
index e6bc623..cc3a1fa 100644
--- a/packages/utils/.eslintrc.js
+++ b/packages/utils/.eslintrc.js
@@ -1,4 +1,4 @@
module.exports = {
- root: true,
- extends: ["developomp-site"],
-};
+ root: true,
+ extends: ["developomp-site"],
+}
diff --git a/packages/utils/package.json b/packages/utils/package.json
index 05666bc..a3c47f9 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,28 +1,28 @@
{
- "name": "@developomp-site/utils",
- "version": "0.0.0",
- "main": "./dist/index.js",
- "module": "./dist/index.mjs",
- "types": "./dist/index.d.ts",
- "sideEffects": false,
- "license": "MIT",
- "files": [
- "dist/**"
- ],
- "scripts": {
- "build": "tsup src/index.tsx --format esm,cjs --dts --external react",
- "dev": "tsup src/index.tsx --format esm,cjs --watch --dts --external react",
- "lint": "TIMING=1 eslint \"src/**/*.ts*\"",
- "clean": "rm -rf .turbo node_modules dist"
- },
- "devDependencies": {
- "@developomp-site/eslint-config": "workspace:*",
- "@developomp-site/tsconfig": "workspace:*",
- "@types/react": "^18.0.26",
- "@types/react-dom": "^18.0.9",
- "eslint": "^8.29.0",
- "react": "^18.2.0",
- "tsup": "^5.12.9",
- "typescript": "^4.9.4"
- }
+ "name": "@developomp-site/utils",
+ "version": "0.0.0",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "sideEffects": false,
+ "license": "MIT",
+ "files": [
+ "dist/**"
+ ],
+ "scripts": {
+ "build": "tsup src/index.tsx --format esm,cjs --dts --external react",
+ "dev": "tsup src/index.tsx --format esm,cjs --watch --dts --external react",
+ "lint": "TIMING=1 eslint \"src/**/*.ts*\"",
+ "clean": "rm -rf .turbo node_modules dist"
+ },
+ "devDependencies": {
+ "@developomp-site/eslint-config": "workspace:*",
+ "@developomp-site/tsconfig": "workspace:*",
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "eslint": "^8.29.0",
+ "react": "^18.2.0",
+ "tsup": "^5.12.9",
+ "typescript": "^4.9.4"
+ }
}
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
index 529d14d..ddb4e3e 100644
--- a/packages/utils/tsconfig.json
+++ b/packages/utils/tsconfig.json
@@ -1,5 +1,5 @@
{
- "extends": "@developomp-site/tsconfig/react-library.json",
- "include": ["."],
- "exclude": ["dist", "build", "node_modules"]
+ "extends": "@developomp-site/tsconfig/react-library.json",
+ "include": ["."],
+ "exclude": ["dist", "build", "node_modules"]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f30d238..1c87056 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -413,23 +413,29 @@ importers:
packages/eslint-config:
devDependencies:
'@typescript-eslint/eslint-plugin':
- specifier: ^5.46.0
- version: 5.46.0(@typescript-eslint/parser@5.46.0)(eslint@8.43.0)(typescript@5.1.5)
+ specifier: ^5.60.1
+ version: 5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6)
'@typescript-eslint/parser':
- specifier: ^5.46.0
- version: 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- eslint-config-next:
- specifier: ^12.3.4
- version: 12.3.4(eslint@8.43.0)(typescript@5.1.5)
+ specifier: ^5.60.1
+ version: 5.60.1(eslint@8.43.0)(typescript@5.1.6)
+ eslint:
+ specifier: ^8.43.0
+ version: 8.43.0
eslint-config-prettier:
- specifier: ^8.5.0
- version: 8.5.0(eslint@8.43.0)
+ specifier: ^8.8.0
+ version: 8.8.0(eslint@8.43.0)
eslint-config-turbo:
specifier: latest
version: 1.10.6(eslint@8.43.0)
eslint-plugin-json:
specifier: ^3.1.0
version: 3.1.0
+ eslint-plugin-simple-import-sort:
+ specifier: ^10.0.0
+ version: 10.0.0(eslint@8.43.0)
+ typescript:
+ specifier: ^5.1.6
+ version: 5.1.6
packages/tailwind-config:
devDependencies:
@@ -456,10 +462,10 @@ importers:
version: 3.2.4(postcss@8.4.24)(ts-node@10.9.1)
ts-node:
specifier: ^10.9.1
- version: 10.9.1(@types/node@18.11.11)(typescript@5.1.5)
+ version: 10.9.1(@types/node@18.11.11)(typescript@5.1.6)
tsup:
specifier: ^5.12.9
- version: 5.12.9(postcss@8.4.24)(ts-node@10.9.1)(typescript@5.1.5)
+ version: 5.12.9(postcss@8.4.24)(ts-node@10.9.1)(typescript@5.1.6)
utility-types:
specifier: ^3.10.0
version: 3.10.0
@@ -3412,6 +3418,7 @@ packages:
dependencies:
core-js-pure: 3.26.1
regenerator-runtime: 0.13.11
+ dev: false
/@babel/runtime@7.20.6:
resolution: {integrity: sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==}
@@ -4594,12 +4601,6 @@ packages:
- supports-color
dev: false
- /@next/eslint-plugin-next@12.3.4:
- resolution: {integrity: sha512-BFwj8ykJY+zc1/jWANsDprDIu2MgwPOIKxNVnrKvPs+f5TPegrVnem8uScND+1veT4B7F6VeqgaNLFW1Hzl9Og==}
- dependencies:
- glob: 7.1.7
- dev: true
-
/@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
dependencies:
@@ -4749,6 +4750,7 @@ packages:
/@rushstack/eslint-patch@1.2.0:
resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==}
+ dev: false
/@sinclair/typebox@0.24.51:
resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
@@ -5190,6 +5192,7 @@ packages:
/@types/json5@0.0.29:
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: false
/@types/katex@0.14.0:
resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==}
@@ -5420,33 +5423,6 @@ packages:
'@types/yargs-parser': 21.0.0
dev: false
- /@typescript-eslint/eslint-plugin@5.46.0(@typescript-eslint/parser@5.46.0)(eslint@8.43.0)(typescript@5.1.5):
- resolution: {integrity: sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- '@typescript-eslint/parser': ^5.0.0
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/parser': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- '@typescript-eslint/scope-manager': 5.46.0
- '@typescript-eslint/type-utils': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- '@typescript-eslint/utils': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- debug: 4.3.4(supports-color@5.5.0)
- eslint: 8.43.0
- ignore: 5.2.4
- natural-compare-lite: 1.4.0
- regexpp: 3.2.0
- semver: 7.3.8
- tsutils: 3.21.0(typescript@5.1.5)
- typescript: 5.1.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3):
resolution: {integrity: sha512-78B+anHLF1TI8Jn/cD0Q00TBYdMgjdOn980JfAVa9yw5sop8nyTfVOQAv6LWywkOGLclDBtv5z3oxN4w7jxyNg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5531,6 +5507,34 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/eslint-plugin@5.60.1(@typescript-eslint/parser@5.60.1)(eslint@8.43.0)(typescript@5.1.6):
+ resolution: {integrity: sha512-KSWsVvsJsLJv3c4e73y/Bzt7OpqMCADUO846bHcuWYSYM19bldbAeDv7dYyV0jwkbMfJ2XdlzwjhXtuD7OY6bw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.5.1
+ '@typescript-eslint/parser': 5.60.1(eslint@8.43.0)(typescript@5.1.6)
+ '@typescript-eslint/scope-manager': 5.60.1
+ '@typescript-eslint/type-utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6)
+ '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6)
+ debug: 4.3.4(supports-color@5.5.0)
+ eslint: 8.43.0
+ grapheme-splitter: 1.0.4
+ ignore: 5.2.4
+ natural-compare-lite: 1.4.0
+ semver: 7.5.3
+ tsutils: 3.21.0(typescript@5.1.6)
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/experimental-utils@5.46.0(eslint@8.43.0)(typescript@4.9.4):
resolution: {integrity: sha512-iMnpijlNNLL+OPIzLadOYQzHsPQ2FW6Qcd5+4DpUv9lQN4Kl+AGxjv0dx+dXPgJfDpj9Q8ePlbROdKLjQydHqg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5544,26 +5548,6 @@ packages:
- typescript
dev: false
- /@typescript-eslint/parser@5.46.0(eslint@8.43.0)(typescript@5.1.5):
- resolution: {integrity: sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/scope-manager': 5.46.0
- '@typescript-eslint/types': 5.46.0
- '@typescript-eslint/typescript-estree': 5.46.0(typescript@5.1.5)
- debug: 4.3.4(supports-color@5.5.0)
- eslint: 8.43.0
- typescript: 5.1.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3):
resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5624,12 +5608,33 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/parser@5.60.1(eslint@8.43.0)(typescript@5.1.6):
+ resolution: {integrity: sha512-pHWlc3alg2oSMGwsU/Is8hbm3XFbcrb6P5wIxcQW9NsYBfnrubl/GhVVD/Jm/t8HXhA2WncoIRfBtnCgRGV96Q==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.60.1
+ '@typescript-eslint/types': 5.60.1
+ '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
+ debug: 4.3.4(supports-color@5.5.0)
+ eslint: 8.43.0
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/scope-manager@5.46.0:
resolution: {integrity: sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.46.0
'@typescript-eslint/visitor-keys': 5.46.0
+ dev: false
/@typescript-eslint/scope-manager@5.60.0:
resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==}
@@ -5646,26 +5651,6 @@ packages:
'@typescript-eslint/types': 5.60.1
'@typescript-eslint/visitor-keys': 5.60.1
- /@typescript-eslint/type-utils@5.46.0(eslint@8.43.0)(typescript@5.1.5):
- resolution: {integrity: sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: '*'
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/typescript-estree': 5.46.0(typescript@5.1.5)
- '@typescript-eslint/utils': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- debug: 4.3.4(supports-color@5.5.0)
- eslint: 8.43.0
- tsutils: 3.21.0(typescript@5.1.5)
- typescript: 5.1.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3):
resolution: {integrity: sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5726,9 +5711,30 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/type-utils@5.60.1(eslint@8.43.0)(typescript@5.1.6):
+ resolution: {integrity: sha512-vN6UztYqIu05nu7JqwQGzQKUJctzs3/Hg7E2Yx8rz9J+4LgtIDFWjjl1gm3pycH0P3mHAcEUBd23LVgfrsTR8A==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
+ '@typescript-eslint/utils': 5.60.1(eslint@8.43.0)(typescript@5.1.6)
+ debug: 4.3.4(supports-color@5.5.0)
+ eslint: 8.43.0
+ tsutils: 3.21.0(typescript@5.1.6)
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/types@5.46.0:
resolution: {integrity: sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: false
/@typescript-eslint/types@5.60.0:
resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==}
@@ -5760,27 +5766,6 @@ packages:
- supports-color
dev: false
- /@typescript-eslint/typescript-estree@5.46.0(typescript@5.1.5):
- resolution: {integrity: sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@typescript-eslint/types': 5.46.0
- '@typescript-eslint/visitor-keys': 5.46.0
- debug: 4.3.4(supports-color@5.5.0)
- globby: 11.1.0
- is-glob: 4.0.3
- semver: 7.5.3
- tsutils: 3.21.0(typescript@5.1.5)
- typescript: 5.1.5
- transitivePeerDependencies:
- - supports-color
- dev: true
-
/@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.3):
resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5816,7 +5801,7 @@ packages:
debug: 4.3.4(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
- semver: 7.3.8
+ semver: 7.5.3
tsutils: 3.21.0(typescript@4.9.4)
typescript: 4.9.4
transitivePeerDependencies:
@@ -5837,13 +5822,34 @@ packages:
debug: 4.3.4(supports-color@5.5.0)
globby: 11.1.0
is-glob: 4.0.3
- semver: 7.3.8
+ semver: 7.5.3
tsutils: 3.21.0(typescript@5.1.5)
typescript: 5.1.5
transitivePeerDependencies:
- supports-color
dev: true
+ /@typescript-eslint/typescript-estree@5.60.1(typescript@5.1.6):
+ resolution: {integrity: sha512-hkX70J9+2M2ZT6fhti5Q2FoU9zb+GeZK2SLP1WZlvUDqdMbEKhexZODD1WodNRyO8eS+4nScvT0dts8IdaBzfw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.60.1
+ '@typescript-eslint/visitor-keys': 5.60.1
+ debug: 4.3.4(supports-color@5.5.0)
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.5.3
+ tsutils: 3.21.0(typescript@5.1.6)
+ typescript: 5.1.6
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/utils@5.46.0(eslint@8.43.0)(typescript@4.9.4):
resolution: {integrity: sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5858,32 +5864,12 @@ packages:
eslint: 8.43.0
eslint-scope: 5.1.1
eslint-utils: 3.0.0(eslint@8.43.0)
- semver: 7.3.8
+ semver: 7.5.3
transitivePeerDependencies:
- supports-color
- typescript
dev: false
- /@typescript-eslint/utils@5.46.0(eslint@8.43.0)(typescript@5.1.5):
- resolution: {integrity: sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==}
- engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
- dependencies:
- '@types/json-schema': 7.0.12
- '@types/semver': 7.5.0
- '@typescript-eslint/scope-manager': 5.46.0
- '@typescript-eslint/types': 5.46.0
- '@typescript-eslint/typescript-estree': 5.46.0(typescript@5.1.5)
- eslint: 8.43.0
- eslint-scope: 5.1.1
- eslint-utils: 3.0.0(eslint@8.43.0)
- semver: 7.3.8
- transitivePeerDependencies:
- - supports-color
- - typescript
- dev: true
-
/@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.3):
resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -5944,12 +5930,33 @@ packages:
- typescript
dev: true
+ /@typescript-eslint/utils@5.60.1(eslint@8.43.0)(typescript@5.1.6):
+ resolution: {integrity: sha512-tiJ7FFdFQOWssFa3gqb94Ilexyw0JVxj6vBzaSpfN/8IhoKkDuSAenUKvsSHw2A/TMpJb26izIszTXaqygkvpQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.43.0)
+ '@types/json-schema': 7.0.12
+ '@types/semver': 7.5.0
+ '@typescript-eslint/scope-manager': 5.60.1
+ '@typescript-eslint/types': 5.60.1
+ '@typescript-eslint/typescript-estree': 5.60.1(typescript@5.1.6)
+ eslint: 8.43.0
+ eslint-scope: 5.1.1
+ semver: 7.5.3
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
/@typescript-eslint/visitor-keys@5.46.0:
resolution: {integrity: sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.46.0
eslint-visitor-keys: 3.4.1
+ dev: false
/@typescript-eslint/visitor-keys@5.60.0:
resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==}
@@ -6346,6 +6353,7 @@ packages:
dependencies:
'@babel/runtime': 7.22.5
'@babel/runtime-corejs3': 7.20.6
+ dev: false
/aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
@@ -6363,6 +6371,7 @@ packages:
dependencies:
call-bind: 1.0.2
is-array-buffer: 3.0.2
+ dev: false
/array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
@@ -6381,6 +6390,7 @@ packages:
es-abstract: 1.21.2
get-intrinsic: 1.2.1
is-string: 1.0.7
+ dev: false
/array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
@@ -6394,6 +6404,7 @@ packages:
define-properties: 1.2.0
es-abstract: 1.21.2
es-shim-unscopables: 1.0.0
+ dev: false
/array.prototype.flatmap@1.3.1:
resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
@@ -6403,6 +6414,7 @@ packages:
define-properties: 1.2.0
es-abstract: 1.21.2
es-shim-unscopables: 1.0.0
+ dev: false
/array.prototype.reduce@1.0.5:
resolution: {integrity: sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==}
@@ -6423,6 +6435,7 @@ packages:
es-abstract: 1.21.2
es-shim-unscopables: 1.0.0
get-intrinsic: 1.2.1
+ dev: false
/asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
@@ -6430,6 +6443,7 @@ packages:
/ast-types-flow@0.0.7:
resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
+ dev: false
/async@3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
@@ -6467,13 +6481,16 @@ packages:
/available-typed-arrays@1.0.5:
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
engines: {node: '>= 0.4'}
+ dev: false
/axe-core@4.5.2:
resolution: {integrity: sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==}
engines: {node: '>=4'}
+ dev: false
/axobject-query@2.2.0:
resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
+ dev: false
/axobject-query@3.2.1:
resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
@@ -6871,6 +6888,7 @@ packages:
dependencies:
function-bind: 1.1.1
get-intrinsic: 1.2.1
+ dev: false
/callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
@@ -7222,6 +7240,7 @@ packages:
/core-js-pure@3.26.1:
resolution: {integrity: sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==}
requiresBuild: true
+ dev: false
/core-js@3.26.1:
resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==}
@@ -7329,7 +7348,7 @@ packages:
postcss-modules-scope: 3.0.0(postcss@8.4.24)
postcss-modules-values: 4.0.0(postcss@8.4.24)
postcss-value-parser: 4.2.0
- semver: 7.3.8
+ semver: 7.5.3
webpack: 5.75.0
dev: false
@@ -7569,6 +7588,7 @@ packages:
/damerau-levenshtein@1.0.8:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: false
/data-urls@2.0.0:
resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
@@ -7609,6 +7629,7 @@ packages:
optional: true
dependencies:
ms: 2.0.0
+ dev: false
/debug@3.2.7(supports-color@5.5.0):
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
@@ -7676,6 +7697,7 @@ packages:
dependencies:
has-property-descriptors: 1.0.0
object-keys: 1.1.1
+ dev: false
/defined@1.0.1:
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
@@ -7804,6 +7826,7 @@ packages:
engines: {node: '>=0.10.0'}
dependencies:
esutils: 2.0.3
+ dev: false
/doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
@@ -7976,6 +7999,7 @@ packages:
/emoji-regex@9.2.2:
resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: false
/emojis-list@3.0.0:
resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
@@ -8057,6 +8081,7 @@ packages:
typed-array-length: 1.0.4
unbox-primitive: 1.0.2
which-typed-array: 1.1.9
+ dev: false
/es-array-method-boxes-properly@1.0.0:
resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==}
@@ -8077,11 +8102,13 @@ packages:
get-intrinsic: 1.2.1
has: 1.0.3
has-tostringtag: 1.0.0
+ dev: false
/es-shim-unscopables@1.0.0:
resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
dependencies:
has: 1.0.3
+ dev: false
/es-to-primitive@1.2.1:
resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
@@ -8090,6 +8117,7 @@ packages:
is-callable: 1.2.7
is-date-object: 1.0.5
is-symbol: 1.0.4
+ dev: false
/es6-promise@3.3.1:
resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
@@ -8367,40 +8395,6 @@ packages:
optionalDependencies:
source-map: 0.6.1
- /eslint-config-next@12.3.4(eslint@8.43.0)(typescript@5.1.5):
- resolution: {integrity: sha512-WuT3gvgi7Bwz00AOmKGhOeqnyA5P29Cdyr0iVjLyfDbk+FANQKcOjFUTZIdyYfe5Tq1x4TGcmoe4CwctGvFjHQ==}
- peerDependencies:
- eslint: ^7.23.0 || ^8.0.0
- typescript: '>=3.3.1'
- peerDependenciesMeta:
- typescript:
- optional: true
- dependencies:
- '@next/eslint-plugin-next': 12.3.4
- '@rushstack/eslint-patch': 1.2.0
- '@typescript-eslint/parser': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- eslint: 8.43.0
- eslint-import-resolver-node: 0.3.6
- eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.26.0)(eslint@8.43.0)
- eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.46.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.43.0)
- eslint-plugin-jsx-a11y: 6.6.1(eslint@8.43.0)
- eslint-plugin-react: 7.31.11(eslint@8.43.0)
- eslint-plugin-react-hooks: 4.6.0(eslint@8.43.0)
- typescript: 5.1.5
- transitivePeerDependencies:
- - eslint-import-resolver-webpack
- - supports-color
- dev: true
-
- /eslint-config-prettier@8.5.0(eslint@8.43.0):
- resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==}
- hasBin: true
- peerDependencies:
- eslint: '>=7.0.0'
- dependencies:
- eslint: 8.43.0
- dev: true
-
/eslint-config-prettier@8.8.0(eslint@8.43.0):
resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==}
hasBin: true
@@ -8461,54 +8455,7 @@ packages:
resolve: 1.22.2
transitivePeerDependencies:
- supports-color
-
- /eslint-import-resolver-typescript@2.7.1(eslint-plugin-import@2.26.0)(eslint@8.43.0):
- resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: '*'
- eslint-plugin-import: '*'
- dependencies:
- debug: 4.3.4(supports-color@5.5.0)
- eslint: 8.43.0
- eslint-plugin-import: 2.26.0(@typescript-eslint/parser@5.46.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.43.0)
- glob: 7.2.3
- is-glob: 4.0.3
- resolve: 1.22.2
- tsconfig-paths: 3.14.1
- transitivePeerDependencies:
- - supports-color
- dev: true
-
- /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.46.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@2.7.1)(eslint@8.43.0):
- resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: '*'
- eslint-import-resolver-node: '*'
- eslint-import-resolver-typescript: '*'
- eslint-import-resolver-webpack: '*'
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- eslint:
- optional: true
- eslint-import-resolver-node:
- optional: true
- eslint-import-resolver-typescript:
- optional: true
- eslint-import-resolver-webpack:
- optional: true
- dependencies:
- '@typescript-eslint/parser': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- debug: 3.2.7(supports-color@5.5.0)
- eslint: 8.43.0
- eslint-import-resolver-node: 0.3.6
- eslint-import-resolver-typescript: 2.7.1(eslint-plugin-import@2.26.0)(eslint@8.43.0)
- transitivePeerDependencies:
- - supports-color
- dev: true
+ dev: false
/eslint-module-utils@2.7.4(@typescript-eslint/parser@5.60.1)(eslint-import-resolver-node@0.3.6)(eslint@8.43.0):
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
@@ -8554,37 +8501,6 @@ packages:
string-natural-compare: 3.0.1
dev: false
- /eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.46.0)(eslint-import-resolver-typescript@2.7.1)(eslint@8.43.0):
- resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
- engines: {node: '>=4'}
- peerDependencies:
- '@typescript-eslint/parser': '*'
- eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
- peerDependenciesMeta:
- '@typescript-eslint/parser':
- optional: true
- dependencies:
- '@typescript-eslint/parser': 5.46.0(eslint@8.43.0)(typescript@5.1.5)
- array-includes: 3.1.6
- array.prototype.flat: 1.3.1
- debug: 2.6.9
- doctrine: 2.1.0
- eslint: 8.43.0
- eslint-import-resolver-node: 0.3.6
- eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.46.0)(eslint-import-resolver-node@0.3.6)(eslint-import-resolver-typescript@2.7.1)(eslint@8.43.0)
- has: 1.0.3
- is-core-module: 2.11.0
- is-glob: 4.0.3
- minimatch: 3.1.2
- object.values: 1.1.6
- resolve: 1.22.2
- tsconfig-paths: 3.14.1
- transitivePeerDependencies:
- - eslint-import-resolver-typescript
- - eslint-import-resolver-webpack
- - supports-color
- dev: true
-
/eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.60.1)(eslint@8.43.0):
resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
engines: {node: '>=4'}
@@ -8666,6 +8582,7 @@ packages:
language-tags: 1.0.6
minimatch: 3.1.2
semver: 6.3.0
+ dev: false
/eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8):
resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
@@ -8722,6 +8639,7 @@ packages:
resolve: 2.0.0-next.4
semver: 6.3.0
string.prototype.matchall: 4.0.8
+ dev: false
/eslint-plugin-simple-import-sort@10.0.0(eslint@8.43.0):
resolution: {integrity: sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==}
@@ -8821,6 +8739,7 @@ packages:
dependencies:
eslint: 8.43.0
eslint-visitor-keys: 2.1.0
+ dev: false
/eslint-visitor-keys@2.1.0:
resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
@@ -9272,6 +9191,7 @@ packages:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
dependencies:
is-callable: 1.2.7
+ dev: false
/for-in@0.1.8:
resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==}
@@ -9315,7 +9235,7 @@ packages:
memfs: 3.4.12
minimatch: 3.1.2
schema-utils: 2.7.0
- semver: 7.3.8
+ semver: 7.5.3
tapable: 1.1.3
typescript: 4.9.4
webpack: 5.75.0
@@ -9403,9 +9323,11 @@ packages:
define-properties: 1.2.0
es-abstract: 1.21.2
functions-have-names: 1.2.3
+ dev: false
/functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: false
/gauge@3.0.2:
resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
@@ -9438,6 +9360,7 @@ packages:
has: 1.0.3
has-proto: 1.0.1
has-symbols: 1.0.3
+ dev: false
/get-own-enumerable-property-symbols@3.0.2:
resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
@@ -9458,6 +9381,7 @@ packages:
dependencies:
call-bind: 1.0.2
get-intrinsic: 1.2.1
+ dev: false
/glob-parent@5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -9485,17 +9409,6 @@ packages:
once: 1.4.0
path-is-absolute: 1.0.1
- /glob@7.1.7:
- resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
- dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
- dev: true
-
/glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
dependencies:
@@ -9544,6 +9457,7 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
define-properties: 1.2.0
+ dev: false
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
@@ -9564,6 +9478,7 @@ packages:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
get-intrinsic: 1.2.1
+ dev: false
/graceful-fs@4.2.10:
resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
@@ -9625,6 +9540,7 @@ packages:
/has-bigints@1.0.2:
resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: false
/has-flag@3.0.0:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
@@ -9638,20 +9554,24 @@ packages:
resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
dependencies:
get-intrinsic: 1.2.1
+ dev: false
/has-proto@1.0.1:
resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
engines: {node: '>= 0.4'}
+ dev: false
/has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
+ dev: false
/has-tostringtag@1.0.0:
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
+ dev: false
/has-unicode@2.0.1:
resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
@@ -9954,6 +9874,7 @@ packages:
get-intrinsic: 1.2.1
has: 1.0.3
side-channel: 1.0.4
+ dev: false
/invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
@@ -9977,6 +9898,7 @@ packages:
call-bind: 1.0.2
get-intrinsic: 1.2.1
is-typed-array: 1.1.10
+ dev: false
/is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
@@ -9985,6 +9907,7 @@ packages:
resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
dependencies:
has-bigints: 1.0.2
+ dev: false
/is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
@@ -9998,6 +9921,7 @@ packages:
dependencies:
call-bind: 1.0.2
has-tostringtag: 1.0.0
+ dev: false
/is-buffer@1.1.6:
resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
@@ -10005,11 +9929,13 @@ packages:
/is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
+ dev: false
/is-core-module@2.11.0:
resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==}
dependencies:
has: 1.0.3
+ dev: false
/is-core-module@2.12.1:
resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
@@ -10021,6 +9947,7 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
+ dev: false
/is-docker@2.2.1:
resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
@@ -10065,12 +9992,14 @@ packages:
/is-negative-zero@2.0.2:
resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
engines: {node: '>= 0.4'}
+ dev: false
/is-number-object@1.0.7:
resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
+ dev: false
/is-number@2.1.0:
resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==}
@@ -10123,6 +10052,7 @@ packages:
dependencies:
call-bind: 1.0.2
has-tostringtag: 1.0.0
+ dev: false
/is-regexp@1.0.0:
resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
@@ -10138,6 +10068,7 @@ packages:
resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
dependencies:
call-bind: 1.0.2
+ dev: false
/is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
@@ -10148,12 +10079,14 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
has-tostringtag: 1.0.0
+ dev: false
/is-symbol@1.0.4:
resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
engines: {node: '>= 0.4'}
dependencies:
has-symbols: 1.0.3
+ dev: false
/is-typed-array@1.1.10:
resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
@@ -10164,6 +10097,7 @@ packages:
for-each: 0.3.3
gopd: 1.0.1
has-tostringtag: 1.0.0
+ dev: false
/is-typedarray@1.0.0:
resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
@@ -10173,6 +10107,7 @@ packages:
resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
dependencies:
call-bind: 1.0.2
+ dev: false
/is-wsl@2.2.0:
resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
@@ -10670,7 +10605,7 @@ packages:
jest-util: 27.5.1
natural-compare: 1.4.0
pretty-format: 27.5.1
- semver: 7.3.8
+ semver: 7.5.3
transitivePeerDependencies:
- supports-color
dev: false
@@ -10946,6 +10881,7 @@ packages:
hasBin: true
dependencies:
minimist: 1.2.8
+ dev: false
/json5@2.2.1:
resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
@@ -10985,6 +10921,7 @@ packages:
dependencies:
array-includes: 3.1.6
object.assign: 4.1.4
+ dev: false
/katex@0.16.4:
resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==}
@@ -11032,11 +10969,13 @@ packages:
/language-subtag-registry@0.3.22:
resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: false
/language-tags@1.0.6:
resolution: {integrity: sha512-HNkaCgM8wZgE/BZACeotAAgpL9FUjEnhgF0FVQMIgH//zqTPreLYMb3rWYkYAqPoF75Jwuycp1da7uz66cfFQg==}
dependencies:
language-subtag-registry: 0.3.22
+ dev: false
/lazy-cache@0.2.7:
resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==}
@@ -11531,6 +11470,7 @@ packages:
/ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+ dev: false
/ms@2.1.2:
resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
@@ -11694,10 +11634,12 @@ packages:
/object-inspect@1.12.3:
resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+ dev: false
/object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
+ dev: false
/object.assign@4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
@@ -11707,6 +11649,7 @@ packages:
define-properties: 1.2.0
has-symbols: 1.0.3
object-keys: 1.1.1
+ dev: false
/object.entries@1.1.6:
resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
@@ -11715,6 +11658,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/object.fromentries@2.0.6:
resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
@@ -11723,6 +11667,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/object.getownpropertydescriptors@2.1.5:
resolution: {integrity: sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==}
@@ -11739,6 +11684,7 @@ packages:
dependencies:
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/object.omit@3.0.0:
resolution: {integrity: sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==}
@@ -11760,6 +11706,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
@@ -12294,7 +12241,7 @@ packages:
dependencies:
lilconfig: 2.1.0
postcss: 8.4.24
- ts-node: 10.9.1(@types/node@18.11.11)(typescript@5.1.5)
+ ts-node: 10.9.1(@types/node@18.11.11)(typescript@5.1.6)
yaml: 1.10.2
dev: true
@@ -12324,7 +12271,7 @@ packages:
cosmiconfig: 7.1.0
klona: 2.0.5
postcss: 8.4.24
- semver: 7.3.8
+ semver: 7.5.3
webpack: 5.75.0
dev: false
@@ -13481,6 +13428,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
functions-have-names: 1.2.3
+ dev: false
/regexpp@3.2.0:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
@@ -13614,6 +13562,7 @@ packages:
is-core-module: 2.12.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
+ dev: false
/retry@0.13.1:
resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
@@ -13699,6 +13648,7 @@ packages:
call-bind: 1.0.2
get-intrinsic: 1.2.1
is-regex: 1.1.4
+ dev: false
/safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -13849,6 +13799,7 @@ packages:
hasBin: true
dependencies:
lru-cache: 6.0.0
+ dev: false
/semver@7.5.3:
resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==}
@@ -13978,6 +13929,7 @@ packages:
call-bind: 1.0.2
get-intrinsic: 1.2.1
object-inspect: 1.12.3
+ dev: false
/signal-exit@3.0.7:
resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
@@ -14201,6 +14153,7 @@ packages:
internal-slot: 1.0.5
regexp.prototype.flags: 1.5.0
side-channel: 1.0.4
+ dev: false
/string.prototype.trim@1.2.7:
resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
@@ -14209,6 +14162,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/string.prototype.trimend@1.0.6:
resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
@@ -14216,6 +14170,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/string.prototype.trimstart@1.0.6:
resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
@@ -14223,6 +14178,7 @@ packages:
call-bind: 1.0.2
define-properties: 1.2.0
es-abstract: 1.21.2
+ dev: false
/string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
@@ -14266,6 +14222,7 @@ packages:
/strip-bom@3.0.0:
resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
engines: {node: '>=4'}
+ dev: false
/strip-bom@4.0.0:
resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
@@ -14408,8 +14365,8 @@ packages:
picocolors: 1.0.0
sade: 1.8.1
svelte: 4.0.0
- svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@4.0.0)(typescript@5.1.3)
- typescript: 5.1.3
+ svelte-preprocess: 5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@4.0.0)(typescript@5.1.6)
+ typescript: 5.1.6
transitivePeerDependencies:
- '@babel/core'
- coffeescript
@@ -14448,7 +14405,7 @@ packages:
svelte: 4.0.0
dev: true
- /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@4.0.0)(typescript@5.1.3):
+ /svelte-preprocess@5.0.4(postcss@8.4.24)(sass@1.63.6)(svelte@4.0.0)(typescript@5.1.6):
resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==}
engines: {node: '>= 14.10.0'}
requiresBuild: true
@@ -14494,7 +14451,7 @@ packages:
sorcery: 0.11.0
strip-indent: 3.0.0
svelte: 4.0.0
- typescript: 5.1.3
+ typescript: 5.1.6
dev: true
/svelte@4.0.0:
@@ -14850,7 +14807,7 @@ packages:
dependencies:
tslib: 2.6.0
- /ts-node@10.9.1(@types/node@18.11.11)(typescript@5.1.5):
+ /ts-node@10.9.1(@types/node@18.11.11)(typescript@5.1.6):
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
peerDependencies:
@@ -14876,7 +14833,7 @@ packages:
create-require: 1.1.1
diff: 4.0.2
make-error: 1.3.6
- typescript: 5.1.5
+ typescript: 5.1.6
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
dev: true
@@ -14901,6 +14858,7 @@ packages:
json5: 1.0.2
minimist: 1.2.8
strip-bom: 3.0.0
+ dev: false
/tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
@@ -14918,7 +14876,7 @@ packages:
hasBin: true
dev: true
- /tsup@5.12.9(postcss@8.4.24)(ts-node@10.9.1)(typescript@5.1.5):
+ /tsup@5.12.9(postcss@8.4.24)(ts-node@10.9.1)(typescript@5.1.6):
resolution: {integrity: sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==}
hasBin: true
peerDependencies:
@@ -14948,7 +14906,7 @@ packages:
source-map: 0.8.0-beta.0
sucrase: 3.32.0
tree-kill: 1.2.2
- typescript: 5.1.5
+ typescript: 5.1.6
transitivePeerDependencies:
- supports-color
- ts-node
@@ -15019,6 +14977,16 @@ packages:
typescript: 5.1.5
dev: true
+ /tsutils@3.21.0(typescript@5.1.6):
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.1.6
+ dev: true
+
/turbo-darwin-64@1.10.6:
resolution: {integrity: sha512-s2Gc7i9Ud+H9GDcrGJjPIyscJfzDGQ6il4Sl2snfvwngJs4/TaqKuBoX3HNt/7F4NiFRs7ZhlLV1/Yu9zGBRhw==}
cpu: [x64]
@@ -15125,6 +15093,7 @@ packages:
call-bind: 1.0.2
for-each: 0.3.3
is-typed-array: 1.1.10
+ dev: false
/typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
@@ -15157,6 +15126,12 @@ packages:
hasBin: true
dev: true
+ /typescript@5.1.6:
+ resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
/ua-parser-js@1.0.32:
resolution: {integrity: sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==}
dev: false
@@ -15172,6 +15147,7 @@ packages:
has-bigints: 1.0.2
has-symbols: 1.0.3
which-boxed-primitive: 1.0.2
+ dev: false
/undefsafe@2.0.5:
resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
@@ -15766,6 +15742,7 @@ packages:
is-number-object: 1.0.7
is-string: 1.0.7
is-symbol: 1.0.4
+ dev: false
/which-typed-array@1.1.9:
resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
@@ -15777,6 +15754,7 @@ packages:
gopd: 1.0.1
has-tostringtag: 1.0.0
is-typed-array: 1.1.10
+ dev: false
/which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 3ff5faa..4af3162 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,3 +1,3 @@
packages:
- - "apps/*"
- - "packages/*"
+ - "apps/*"
+ - "packages/*"
diff --git a/turbo.json b/turbo.json
index 29d4e0f..d04b627 100644
--- a/turbo.json
+++ b/turbo.json
@@ -1,22 +1,22 @@
{
- "$schema": "https://turbo.build/schema.json",
- "pipeline": {
- "build": {
- "outputs": ["build/**", "dist/**", "storybook-static/**"],
- "dependsOn": ["^build"]
- },
- "test": {
- "outputs": ["coverage/**"],
- "dependsOn": []
- },
- "lint": {
- "outputs": []
- },
- "dev": {
- "cache": false
- },
- "clean": {
- "cache": false
- }
- }
+ "$schema": "https://turbo.build/schema.json",
+ "pipeline": {
+ "build": {
+ "outputs": ["build/**", "dist/**", "storybook-static/**"],
+ "dependsOn": ["^build"]
+ },
+ "test": {
+ "outputs": ["coverage/**"],
+ "dependsOn": []
+ },
+ "lint": {
+ "outputs": []
+ },
+ "dev": {
+ "cache": false
+ },
+ "clean": {
+ "cache": false
+ }
+ }
}