Compare commits

..

35 Commits

Author SHA1 Message Date
69f2b7070f remove arm64 support for the time being, because of upstream support 2022-11-24 21:09:32 +01:00
11bea1c7c4 updating version to v3.6.13 2022-11-24 20:35:28 +01:00
68a1dc65c1 update pnpm-lock.yaml 2022-11-24 17:04:11 +01:00
4b1ce539d5 remove sentry integration 2022-11-24 16:58:36 +01:00
a6fbb8191d Update docker-build-push.yml 2022-11-24 16:32:22 +01:00
552ff281b8 I have no idea what I'm doing here. 2022-11-24 16:29:36 +01:00
54fad2f6d8 update docker-build-push.yml 2022-11-24 16:20:40 +01:00
78edcd7d0e fix typo in github workflow 2022-11-24 16:02:39 +01:00
a8034b21d5 attempting to fix github actions 2022-11-24 15:58:27 +01:00
f0e95905d2 trying out env instead of secrets 2022-11-24 15:44:28 +01:00
69a5276614 attempt to fix locale issue 2022-11-24 15:40:49 +01:00
2e62eea351 fix sentry issue: 28c5a41aea3c4435902046e56c435e56 2022-11-24 15:38:21 +01:00
13d972b8f3 update docker-build-push.yaml 2022-11-24 15:15:35 +01:00
03cb198e95 move from env to secrets 2022-11-24 15:11:55 +01:00
67ee55b502 fix env for sentry auth token 2022-11-24 15:01:33 +01:00
b5998d7f3a pass sentry token to docker build push step 2022-11-24 14:58:26 +01:00
f71cf99b77 remove .git from .dockerignore 2022-11-24 13:27:43 +01:00
a2092a6a39 revert version back to 3.6.12 2022-11-24 12:58:15 +01:00
43c09666a0 add sentry CLI to github actions 2022-11-24 11:42:03 +01:00
0da23f95fd Merge pull request #1101 from stonespheres/patch-1
Fix link typo
2022-11-24 11:25:17 +01:00
e8f44e2142 update pnpm-lock.yaml 2022-11-24 11:23:37 +01:00
fbb237e982 Fix link typo
Bad practice on my part for last commit - did not check before push.
Link under table of contents fixed and now directs to the documentation at https://docs.rxresu.me
2022-11-24 18:22:57 +08:00
7f7c1d7b87 update version to 3.6.13 2022-11-24 11:21:45 +01:00
be0b7f20f9 integrate sentry for error logging 2022-11-24 11:21:30 +01:00
0672988fff Merge pull request #1100 from stonespheres/patch-1
Fixed formatting and typos on README.md
2022-11-24 11:01:38 +01:00
75dad60cb5 Fixed formatting and typos on README.md
- Under Table of Contents: Fixed the formatting error for the link to the docs.
- Under Languages: fixed typo Ukranian -> Ukrainian
- Under Building from Source: ...head over to the doc's -> head over to the docs
2022-11-24 17:47:29 +08:00
0140e3fce0 update version to 3.6.12 2022-11-23 15:20:34 +01:00
42d0e14b98 fix styling issues and theme cascades across all templates 2022-11-23 15:20:04 +01:00
9a42d684fb add branching deploy condition 2022-11-23 14:15:36 +01:00
ab6ad65445 update github actions to a more streamlined workflow using gh matrix 2022-11-23 14:10:14 +01:00
b613764ccc fix matrix variable name 2022-11-23 13:59:25 +01:00
ac44d0489f change name of test action so as to not trigger further actions 2022-11-23 13:56:59 +01:00
c57e6fbbb8 fix versioning of github action package 2022-11-23 13:56:22 +01:00
6c6da215c8 add on: [workflow_dispatch] to test github action 2022-11-23 13:55:15 +01:00
be700c7629 Testing a new streamlined GitHub Actions workflow 2022-11-23 13:53:41 +01:00
24 changed files with 232 additions and 293 deletions

View File

@ -2,9 +2,9 @@
/app
# Build Artifacts
dist
.next
.turbo
**/.turbo
/server/dist
/client/.next
# IDEs
.vscode
@ -19,7 +19,7 @@ CHANGELOG.md
CODE_OF_CONDUCT.md
# Project Dependencies
node_modules
**/node_modules
# Docker
Dockerfile

View File

@ -8,9 +8,9 @@ on:
- completed
jobs:
deploy:
on-success:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- name: Install DigitalOcean CLI
uses: digitalocean/action-doctl@v2.2.0
@ -19,3 +19,10 @@ jobs:
- name: Create Deployment with Latest Version
run: doctl apps create-deployment ${{ secrets.DIGITALOCEAN_APP_ID }} --wait --force-rebuild
on-failure:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
steps:
- name: Abruptly end the worklfow
run: exit 1

View File

@ -1,36 +1,39 @@
name: Build and Push Docker Image
on:
workflow_dispatch:
release:
types: [published]
jobs:
client:
name: Client
build_matrix:
name: Build and Push Docker Image
runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
strategy:
matrix:
image: [client, server]
steps:
- name: Checkout the repository
uses: actions/checkout@v3.1.0
with:
fetch-depth: 2
- id: version
name: Get Version
run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
name: App Version
uses: martinbeentjes/npm-get-version-action@v1.2.3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.1.0
with:
platforms: amd64
- id: buildx
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.2.1
with:
install: true
- name: Login to Docker Hub
uses: docker/login-action@v2.1.0
@ -45,68 +48,15 @@ jobs:
username: $GITHUB_REPOSITORY_OWNER
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Client Image
- name: Build and Push Docker Image
uses: docker/build-push-action@v3.2.0
with:
context: .
push: true
file: client/Dockerfile
platforms: linux/amd64,linux/arm64
platforms: linux/amd64
file: ${{ matrix.image }}/Dockerfile
tags: |
amruthpillai/reactive-resume:client-latest
amruthpillai/reactive-resume:client-${{ env.version }}
ghcr.io/amruthpillai/reactive-resume:client-latest
ghcr.io/amruthpillai/reactive-resume:client-${{ env.version }}
server:
name: Server
runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
steps:
- name: Checkout the repository
uses: actions/checkout@v3.1.0
with:
fetch-depth: 2
- id: version
name: Get Version
run: echo "version=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.1.0
- id: buildx
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.2.1
with:
install: true
- name: Login to Docker Hub
uses: docker/login-action@v2.1.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2.1.0
with:
registry: ghcr.io
username: $GITHUB_REPOSITORY_OWNER
password: ${{ secrets.GH_TOKEN }}
- name: Build and Push Server Image
uses: docker/build-push-action@v3.2.0
with:
context: .
push: true
file: server/Dockerfile
platforms: linux/amd64,linux/arm64
tags: |
amruthpillai/reactive-resume:server-latest
amruthpillai/reactive-resume:server-${{ env.version }}
ghcr.io/amruthpillai/reactive-resume:server-latest
ghcr.io/amruthpillai/reactive-resume:server-${{ env.version }}
amruthpillai/reactive-resume:${{ matrix.image }}-latest
amruthpillai/reactive-resume:${{ matrix.image }}-${{ steps.version.outputs.current-version }}
ghcr.io/amruthpillai/reactive-resume:${{ matrix.image }}-latest
ghcr.io/amruthpillai/reactive-resume:${{ matrix.image }}-${{ steps.version.outputs.current-version }}

View File

@ -18,7 +18,7 @@ You have complete control over what goes into your resume, how it looks, what co
## Table of Contents
- [Reactive Resume](#reactive-resume)
- [Go to App | [Docs](https://docs.rxresu.me)](#go-to-app--docs)
- [Go to App Docs](https://docs.rxresu.me)
- [Table of Contents](#table-of-contents)
- [Features](#features)
- [Languages](#languages)
@ -93,7 +93,7 @@ You have complete control over what goes into your resume, how it looks, what co
- Swedish (Svenska)
- Tamil (தமிழ்)
- Turkish (Türkçe)
- Ukranian (Українська мова)
- Ukrainian (Українська мова)
- Vietnamese (Tiếng Việt)
Help by [translating Reactive Resume](https://translate.rxresu.me) to your language!
@ -104,7 +104,7 @@ The docs include an extensive [Tutorial](https://docs.rxresu.me/tutorial) sectio
## Build from Source
For extensive information on how to build the app on your local machine, head over to the docs's [Source Code](https://docs.rxresu.me/source-code) section.
For extensive information on how to build the app on your local machine, head over to the docs [Source Code](https://docs.rxresu.me/source-code) section.
## Contributing

2
client/.gitignore vendored
View File

@ -39,4 +39,4 @@ yarn-error.log*
__ENV.js
# next-sitemap
sitemap*.xml
sitemap*.xml

View File

@ -1,7 +1,6 @@
import clsx from 'clsx';
import { isEmpty } from 'lodash';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
type Props = {
children?: string;
@ -12,7 +11,7 @@ const Markdown: React.FC<Props> = ({ className, children }) => {
if (!children || isEmpty(children)) return null;
return (
<ReactMarkdown remarkPlugins={[remarkGfm]} className={clsx('markdown', className)}>
<ReactMarkdown remarkPlugins={[]} className={clsx('markdown', className)}>
{children}
</ReactMarkdown>
);

View File

@ -21,7 +21,7 @@
"@mui/material": "^5.10.15",
"@mui/system": "^5.10.15",
"@mui/x-date-pickers": "5.0.8",
"@next/env": "^13.0.4",
"@next/env": "^13.0.5",
"@react-oauth/google": "^0.5.0",
"@reduxjs/toolkit": "^1.9.0",
"axios": "^1.2.0",
@ -33,7 +33,7 @@
"md5-hex": "^4.0.0",
"monaco-editor": "^0.34.1",
"nanoid": "^3.3.4",
"next": "13.0.4",
"next": "13.0.5",
"next-i18next": "^13.0.0",
"react": "^18.2.0",
"react-colorful": "^5.6.1",
@ -59,10 +59,9 @@
"devDependencies": {
"@babel/core": "^7.20.2",
"@reactive-resume/schema": "workspace:*",
"eslint-plugin-unused-imports": "^2.0.0",
"@tailwindcss/typography": "^0.5.8",
"@types/downloadjs": "^1.4.3",
"@types/lodash": "^4.14.189",
"@types/lodash": "^4.14.190",
"@types/node": "^18.11.9",
"@types/react": "^18.0.25",
"@types/react-dom": "^18.0.9",
@ -72,8 +71,9 @@
"@types/webfontloader": "^1.6.35",
"autoprefixer": "^10.4.13",
"csstype": "^3.1.1",
"eslint-config-next": "^13.0.4",
"eslint-config-next": "^13.0.5",
"eslint-plugin-tailwindcss": "^3.7.0",
"eslint-plugin-unused-imports": "^2.0.0",
"next-sitemap": "^3.1.32",
"postcss": "^8.4.19",
"sass": "^1.56.1",

View File

@ -61,10 +61,12 @@ const Preview: NextPage<Props> = ({ username, slug, resume: initialData }) => {
}, [dispatch, initialData]);
useEffect(() => {
if (!isEmpty(resume) && router.locale !== resume.metadata.locale) {
const locale = get(resume, 'metadata.locale', 'en');
if (!isEmpty(resume) && router.locale !== locale) {
const { pathname, asPath, query } = router;
router.push({ pathname, query }, asPath, { locale: resume.metadata.locale });
router.push({ pathname, query }, asPath, { locale });
}
}, [resume, router]);

View File

@ -27,7 +27,7 @@ type Props = {
export const getServerSideProps: GetServerSideProps<Props | Promise<Props>, QueryParams> = async ({
query,
locale,
locale = 'en',
}) => {
const { username, slug, secretKey } = query as QueryParams;
@ -35,7 +35,7 @@ export const getServerSideProps: GetServerSideProps<Props | Promise<Props>, Quer
if (isEmpty(secretKey)) throw new Error('There is no secret key!');
const resume = await fetchResumeByIdentifier({ username, slug, options: { secretKey } });
const displayLocale = resume.metadata.locale || locale || 'en';
const displayLocale = get(resume, 'metadata.locale') ?? locale;
return {
props: {

View File

@ -19,7 +19,6 @@ const axios = _axios.create({ baseURL });
axios.interceptors.request.use((config) => {
const { accessToken } = store.getState().auth;
// @ts-ignore
config.headers = {
...config.headers,
Authorization: `Bearer ${accessToken}`,

View File

@ -35,34 +35,55 @@ export const MastheadSidebar: React.FC = () => {
/>
)}
<div>
<div className={clsx({ invert: contrast === 'light' })}>
<h1 className="mb-1">{name}</h1>
<p className="opacity-75">{headline}</p>
</div>
<div className={clsx('flex flex-col gap-2.5', css(`svg { color: ${color} }`))}>
<DataDisplay icon={<Room />} className="!gap-2 text-xs">
<DataDisplay icon={<Room />} className="!gap-2 text-xs" textClassName={clsx({ invert: contrast === 'light' })}>
{formatLocation(location)}
</DataDisplay>
<DataDisplay icon={<Cake />} className="!gap-2 text-xs">
<DataDisplay icon={<Cake />} className="!gap-2 text-xs" textClassName={clsx({ invert: contrast === 'light' })}>
{formatDateString(birthdate, dateFormat)}
</DataDisplay>
<DataDisplay icon={<Email />} className="!gap-2 text-xs" link={`mailto:${email}`}>
<DataDisplay
icon={<Email />}
className="!gap-2 text-xs"
link={`mailto:${email}`}
textClassName={clsx({ invert: contrast === 'light' })}
>
{email}
</DataDisplay>
<DataDisplay icon={<Phone />} className="!gap-2 text-xs" link={`tel:${phone}`}>
<DataDisplay
icon={<Phone />}
className="!gap-2 text-xs"
link={`tel:${phone}`}
textClassName={clsx({ invert: contrast === 'light' })}
>
{phone}
</DataDisplay>
<DataDisplay icon={<Public />} link={website && addHttp(website)} className="!gap-2 text-xs">
<DataDisplay
icon={<Public />}
link={website && addHttp(website)}
className="!gap-2 text-xs"
textClassName={clsx({ invert: contrast === 'light' })}
>
{website}
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="!gap-2 text-xs">
<DataDisplay
key={id}
icon={getProfileIcon(network)}
link={url && addHttp(url)}
className="!gap-2 text-xs"
textClassName={clsx({ invert: contrast === 'light' })}
>
{username}
</DataDisplay>
))}

View File

@ -1,5 +1,6 @@
import { Email, Link, Phone } from '@mui/icons-material';
import { ListItem, Section as SectionType } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import isArray from 'lodash/isArray';
import isEmpty from 'lodash/isEmpty';
@ -23,8 +24,10 @@ const Section: React.FC<SectionProps> = ({
}) => {
const section: SectionType = useAppSelector((state) => get(state.resume.present, path, {} as SectionType));
const dateFormat: string = useAppSelector((state) => get(state.resume.present, 'metadata.date.format'));
const layout: string[][][] = useAppSelector((state) => get(state.resume.present, 'metadata.layout'));
const sectionId = useMemo(() => section.id || path.replace('sections.', ''), [path, section]);
const isSidebarSection = useMemo(() => layout.some((row) => row[1].includes(sectionId)), [layout, sectionId]);
if (!section.visible) return null;
@ -35,7 +38,7 @@ const Section: React.FC<SectionProps> = ({
<Heading>{section.name}</Heading>
<div
className="grid items-start gap-4"
className={clsx('grid items-start gap-4', { invert: isSidebarSection })}
style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }}
>
{section.items.map((item: ListItem) => {
@ -76,8 +79,13 @@ const Section: React.FC<SectionProps> = ({
key={index}
className="mr-2 h-3 w-3 rounded-full border"
style={{
borderColor: 'var(--primary-color)',
backgroundColor: levelNum / (10 / 5) > index ? 'var(--primary-color)' : '',
borderColor: isSidebarSection ? 'var(--text-color)' : 'var(--primary-color)',
backgroundColor:
levelNum / (10 / 5) > index
? isSidebarSection
? 'var(--text-color)'
: 'var(--primary-color)'
: '',
}}
/>
))}
@ -94,7 +102,7 @@ const Section: React.FC<SectionProps> = ({
</DataDisplay>
)}
{keywords && <div>{keywords.join(', ')}</div>}
{keywords && <span>{keywords.join(', ')}</span>}
{(phone || email) && (
<div className="grid gap-1">

View File

@ -36,34 +36,55 @@ export const MastheadSidebar: React.FC = () => {
/>
)}
<div>
<div className={clsx({ invert: contrast === 'light' })}>
<h1 className="mb-1">{name}</h1>
<p className="opacity-75">{headline}</p>
</div>
<div className={clsx('flex flex-col gap-2.5', css(`svg { color: ${iconColor} }`))}>
<DataDisplay icon={<Room />} className="!gap-2 text-xs">
<DataDisplay icon={<Room />} className="!gap-2 text-xs" textClassName={clsx({ invert: contrast === 'light' })}>
{formatLocation(location)}
</DataDisplay>
<DataDisplay icon={<Cake />} className="!gap-2 text-xs">
<DataDisplay icon={<Cake />} className="!gap-2 text-xs" textClassName={clsx({ invert: contrast === 'light' })}>
{formatDateString(birthdate, dateFormat)}
</DataDisplay>
<DataDisplay icon={<Email />} className="!gap-2 text-xs" link={`mailto:${email}`}>
<DataDisplay
icon={<Email />}
className="!gap-2 text-xs"
link={`mailto:${email}`}
textClassName={clsx({ invert: contrast === 'light' })}
>
{email}
</DataDisplay>
<DataDisplay icon={<Phone />} className="!gap-2 text-xs" link={`tel:${phone}`}>
<DataDisplay
icon={<Phone />}
className="!gap-2 text-xs"
link={`tel:${phone}`}
textClassName={clsx({ invert: contrast === 'light' })}
>
{phone}
</DataDisplay>
<DataDisplay icon={<Public />} link={website && addHttp(website)} className="!gap-2 text-xs">
<DataDisplay
icon={<Public />}
link={website && addHttp(website)}
className="!gap-2 text-xs"
textClassName={clsx({ invert: contrast === 'light' })}
>
{website}
</DataDisplay>
{profiles.map(({ id, username, network, url }) => (
<DataDisplay key={id} icon={getProfileIcon(network)} link={url && addHttp(url)} className="!gap-2 text-xs">
<DataDisplay
key={id}
icon={getProfileIcon(network)}
link={url && addHttp(url)}
className="!gap-2 text-xs"
textClassName="invert"
>
{username}
</DataDisplay>
))}

View File

@ -21,15 +21,8 @@ const BadgeDisplay: React.FC<Props> = ({ items }) => {
return (
<ul className="mt-1 flex flex-wrap gap-2 text-xs">
{items.map((item) => (
<li
key={item}
className="rounded-sm px-2 py-0.5"
style={{
color: contrast === 'dark' ? theme.text : theme.background,
backgroundColor: alpha(theme.primary, 0.75),
}}
>
{item}
<li key={item} className="rounded-sm px-2 py-0.5" style={{ backgroundColor: alpha(theme.primary, 0.75) }}>
<span style={{ color: contrast === 'dark' ? theme.text : theme.background }}>{item}</span>
</li>
))}
</ul>

View File

@ -20,15 +20,8 @@ const BadgeDisplay: React.FC<Props> = ({ items }) => {
return (
<ul className="my-1 flex flex-wrap items-start justify-center gap-1.5">
{items.map((item) => (
<li
key={item}
className="rounded-lg px-2 py-0.5 text-xs"
style={{
color: contrast === 'dark' ? theme.text : theme.background,
backgroundColor: theme.primary,
}}
>
{item}
<li key={item} className="rounded-lg px-2 py-0.5 text-xs" style={{ backgroundColor: theme.primary }}>
<span style={{ color: contrast === 'dark' ? theme.text : theme.background }}>{item}</span>
</li>
))}
</ul>

View File

@ -1,5 +1,5 @@
.container {
@apply grid grid-cols-2 gap-4 px-6 py-4;
@apply grid grid-cols-2 gap-4 px-6 py-4 items-start;
.main {
@apply grid gap-4;

View File

@ -1,5 +1,6 @@
import { Cake, Email, Phone, Public, Room } from '@mui/icons-material';
import { ThemeConfig } from '@reactive-resume/schema';
import clsx from 'clsx';
import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty';
import { useMemo } from 'react';
@ -72,14 +73,14 @@ export const MastheadMain: React.FC = () => {
className="grid gap-2 p-4"
style={{ color: contrast === 'dark' ? theme.text : theme.background, backgroundColor: theme.primary }}
>
<div>
<div className={clsx({ invert: contrast === 'light' })}>
<h1>{name}</h1>
<p className="opacity-75">{headline}</p>
</div>
<hr className="opacity-25" />
<Markdown>{summary}</Markdown>
<Markdown className={clsx({ invert: contrast === 'light' })}>{summary}</Markdown>
</div>
);
};

View File

@ -5,16 +5,17 @@ type Props = {
icon?: JSX.Element;
link?: string;
className?: string;
textClassName?: string;
};
const DataDisplay: React.FC<React.PropsWithChildren<Props>> = ({ icon, link, className, children }) => {
const DataDisplay: React.FC<React.PropsWithChildren<Props>> = ({ icon, link, className, textClassName, children }) => {
if (isEmpty(children)) return null;
if (!isEmpty(link)) {
return (
<div className={clsx('inline-flex items-center gap-1', className)}>
{icon}
<a href={link} target="_blank" rel="noreferrer">
<a href={link} target="_blank" rel="noreferrer" className={textClassName}>
{children}
</a>
</div>
@ -24,7 +25,7 @@ const DataDisplay: React.FC<React.PropsWithChildren<Props>> = ({ icon, link, cla
return (
<div className={clsx('inline-flex items-center gap-1', className)}>
{icon}
<span>{children}</span>
<span className={textClassName}>{children}</span>
</div>
);
};

View File

@ -7,7 +7,7 @@ export const generateTypographyStyles = ({ family, size }: Typography): string =
font-size: ${size.body}px !important;
font-family: ${family.body} !important;
svg { font-size: ${size.body}px !important; }
p, li, svg { font-size: ${size.body}px !important; line-height: ${size.body * 1.5}px !important; }
h1,
h2,
@ -25,25 +25,31 @@ export const generateTypographyStyles = ({ family, size }: Typography): string =
h4 { font-size: ${size.heading / 2.5}px !important; line-height: ${size.heading / 2.5}px !important; }
h5 { font-size: ${size.heading / 3}px !important; line-height: ${size.heading / 3}px !important; }
h6 { font-size: ${size.heading / 3.5}px !important; line-height: ${size.heading / 3.5}px !important; }
.markdown p,
.markdown li {
font-size: ${size.body}px !important;
}
`;
export const generateThemeStyles = ({ text, background, primary }: ThemeConfig): string => `
color: ${text} !important;
background-color: ${background} !important;
--text-color: ${text} !important;
--primary-color: ${primary} !important;
--background-color: ${background} !important;
svg {
color: var(--primary-color) !important;
color: var(--text-color);
background-color: var(--background-color);
span,
h1,
h2,
h3,
h4,
h5,
h6,
li,
p,
a {
color: var(--text-color);
}
.markdown p,
.markdown li {
color: ${text} !important;
svg {
color: var(--primary-color);
}
`;

View File

@ -1,6 +1,6 @@
{
"name": "reactive-resume",
"version": "3.6.11",
"version": "3.6.13",
"private": true,
"scripts": {
"dev": "env-cmd --silent turbo run dev",

222
pnpm-lock.yaml generated
View File

@ -47,13 +47,13 @@ importers:
'@mui/material': ^5.10.15
'@mui/system': ^5.10.15
'@mui/x-date-pickers': 5.0.8
'@next/env': ^13.0.4
'@next/env': ^13.0.5
'@react-oauth/google': ^0.5.0
'@reactive-resume/schema': workspace:*
'@reduxjs/toolkit': ^1.9.0
'@tailwindcss/typography': ^0.5.8
'@types/downloadjs': ^1.4.3
'@types/lodash': ^4.14.189
'@types/lodash': ^4.14.190
'@types/node': ^18.11.9
'@types/react': 17.0.2
'@types/react-dom': 17.0.2
@ -67,7 +67,7 @@ importers:
csstype: ^3.1.1
dayjs: ^1.11.6
downloadjs: ^1.4.7
eslint-config-next: ^13.0.4
eslint-config-next: ^13.0.5
eslint-plugin-tailwindcss: ^3.7.0
eslint-plugin-unused-imports: ^2.0.0
joi: ^17.7.0
@ -75,7 +75,7 @@ importers:
md5-hex: ^4.0.0
monaco-editor: ^0.34.1
nanoid: ^3.3.4
next: 13.0.4
next: 13.0.5
next-i18next: ^13.0.0
next-sitemap: ^3.1.32
postcss: ^8.4.19
@ -116,7 +116,7 @@ importers:
'@mui/material': 5.10.15_xzmje33rig364cbj43xp3ygiuq
'@mui/system': 5.10.15_j3jabumvycmrdiobmx2xqyhqry
'@mui/x-date-pickers': 5.0.8_yqbh3qrtqjk6bsxt6dd5qlkxym
'@next/env': 13.0.4
'@next/env': 13.0.5
'@react-oauth/google': 0.5.0_biqbaboplfbrettd7655fr4n2y
'@reduxjs/toolkit': 1.9.0_k4ae6lp43ej6mezo3ztvx6pykq
axios: 1.2.0
@ -128,8 +128,8 @@ importers:
md5-hex: 4.0.0
monaco-editor: 0.34.1
nanoid: 3.3.4
next: 13.0.4_vgii64pd2ccbnbx2v3ro5gbin4
next-i18next: 13.0.0_45muwplwdy3pbxlcpjcsuwdrxy
next: 13.0.5_vgii64pd2ccbnbx2v3ro5gbin4
next-i18next: 13.0.0_sqrilzjmqdbnpr3f23fvxycbtm
react: 18.2.0
react-colorful: 5.6.1_biqbaboplfbrettd7655fr4n2y
react-dnd: 16.0.1_rvbzq2vebt6t464rfxvpo2q7nq
@ -155,7 +155,7 @@ importers:
'@reactive-resume/schema': link:../schema
'@tailwindcss/typography': 0.5.8_tailwindcss@3.2.4
'@types/downloadjs': 1.4.3
'@types/lodash': 4.14.189
'@types/lodash': 4.14.190
'@types/node': 18.11.9
'@types/react': 17.0.2
'@types/react-dom': 17.0.2
@ -165,10 +165,10 @@ importers:
'@types/webfontloader': 1.6.35
autoprefixer: 10.4.13_postcss@8.4.19
csstype: 3.1.1
eslint-config-next: 13.0.4_hsf322ms6xhhd4b5ne6lb74y4a
eslint-config-next: 13.0.5_hsf322ms6xhhd4b5ne6lb74y4a
eslint-plugin-tailwindcss: 3.7.0
eslint-plugin-unused-imports: 2.0.0_eslint@8.28.0
next-sitemap: 3.1.32_5onsal3mz77zvmmbchlexi75wu
next-sitemap: 3.1.32_r3fabycidlfwwdsgai3zabmjcq
postcss: 8.4.19
sass: 1.56.1
tailwindcss: 3.2.4_postcss@8.4.19
@ -203,7 +203,7 @@ importers:
'@types/bcryptjs': ^2.4.2
'@types/cookie-parser': ^1.4.3
'@types/express': ^4.17.14
'@types/lodash': ^4.14.189
'@types/lodash': ^4.14.190
'@types/multer': ^1.4.7
'@types/node': ^18.11.9
'@types/nodemailer': ^6.4.6
@ -229,7 +229,7 @@ importers:
passport-local: ^1.0.0
pdf-lib: ^1.17.1
pg: ^8.8.0
playwright-chromium: ^1.28.0
playwright-chromium: ^1.28.1
prettier: ^2.8.0
reflect-metadata: ^0.1.13
rimraf: ^3.0.2
@ -276,7 +276,7 @@ importers:
passport-local: 1.0.0
pdf-lib: 1.17.1
pg: 8.8.0
playwright-chromium: 1.28.0
playwright-chromium: 1.28.1
reflect-metadata: 0.1.13
rimraf: 3.0.2
rxjs: 7.5.7
@ -289,7 +289,7 @@ importers:
'@types/bcryptjs': 2.4.2
'@types/cookie-parser': 1.4.3
'@types/express': 4.17.14
'@types/lodash': 4.14.189
'@types/lodash': 4.14.190
'@types/multer': 1.4.7
'@types/node': 18.11.9
'@types/nodemailer': 6.4.6
@ -2529,113 +2529,113 @@ packages:
uuid: 8.3.2
dev: false
/@next/env/13.0.4:
resolution: {integrity: sha512-N5Z3bdxBzoxrC5bwykDFITzdWuwDteOdZ+7nxixY+I1XpRX8/iQYbw2wuXMdqdfBGm2NNUpAqg8YF2e4oAC2UQ==}
/@next/env/13.0.5:
resolution: {integrity: sha512-F3KLtiDrUslAZhTYTh8Zk5ZaavbYwLUn3NYPBnOjAXU8hWm0QVGVzKIOuURQ098ofRU4e9oglf3Sj9pFx5nI5w==}
/@next/eslint-plugin-next/13.0.4:
resolution: {integrity: sha512-jZ4urKT+aO9QHm3ttihrIQscQISDSKK8isAom750+EySn9o3LCSkTdPGBtvBqY7Yku+NqhfQempR5J58DqTaVg==}
/@next/eslint-plugin-next/13.0.5:
resolution: {integrity: sha512-H9U9B1dFnCDmylDZ6/dYt95Ie1Iu+SLBMcO6rkIGIDcj5UK+DNyMiWm83xWBZ1gREM8cfp5Srv1g6wqf8pM4lw==}
dependencies:
glob: 7.1.7
dev: true
/@next/swc-android-arm-eabi/13.0.4:
resolution: {integrity: sha512-SD9H+/zuV3L0oHIhsDdFkDqFtg6pIHtqRUPlsrNdOsmWXgMlSzxBmwt2ta4kyrazS62BQu7XRUG++ZyODS7AWg==}
/@next/swc-android-arm-eabi/13.0.5:
resolution: {integrity: sha512-YO691dxHlviy6H0eghgwqn+5kU9J3iQnKERHTDSppqjjGDBl6ab4wz9XfI5AhljjkaTg3TknHoIEWFDoZ4Ve8g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [android]
requiresBuild: true
optional: true
/@next/swc-android-arm64/13.0.4:
resolution: {integrity: sha512-F8W5WcBbdn/zBoy32/mQiefs9DNsT12CTSSVCsO8GvQR7GjJU+uduQ4drKcSDoDLuAFULc2jDN06Circq4vuQg==}
/@next/swc-android-arm64/13.0.5:
resolution: {integrity: sha512-ugbwffkUmp8cd2afehDC8LtQeFUxElRUBBngfB5UYSWBx18HW4OgzkPFIY8jUBH16zifvGZWXbICXJWDHrOLtw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
requiresBuild: true
optional: true
/@next/swc-darwin-arm64/13.0.4:
resolution: {integrity: sha512-/lajev+9GSie+rRTl5z8skW9RJwZ+TwMKLzzM24TbDk8lUjqPTyJZ/cU0NDj8J7VQAZ6EehACSh9rcJeBRtLuA==}
/@next/swc-darwin-arm64/13.0.5:
resolution: {integrity: sha512-mshlh8QOtOalfZbc17uNAftWgqHTKnrv6QUwBe+mpGz04eqsSUzVz1JGZEdIkmuDxOz00cK2NPoc+VHDXh99IQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
optional: true
/@next/swc-darwin-x64/13.0.4:
resolution: {integrity: sha512-HK4b2rFiju8d40GTL/jH9U6OQ7BYA2MeEHs7Dm7Rp7kwQtLzP3z6osdQS8er20tIFHDE4b+oVBy03ZUQkHf0Pg==}
/@next/swc-darwin-x64/13.0.5:
resolution: {integrity: sha512-SfigOKW4Z2UB3ruUPyvrlDIkcJq1hiw1wvYApWugD+tQsAkYZKEoz+/8emCmeYZ6Gwgi1WHV+z52Oj8u7bEHPg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
optional: true
/@next/swc-freebsd-x64/13.0.4:
resolution: {integrity: sha512-xBvIGLaGzZtgJfRRJ2DBN82DQCJ/O7jkXyBp8X/vHefPWyVXVqF6C68Rv8ADp11thPpf8WpjkvDDLb9AuWHQUA==}
/@next/swc-freebsd-x64/13.0.5:
resolution: {integrity: sha512-0NJg8HZr4yG8ynmMGFXQf+Mahvq4ZgBmUwSlLXXymgxEQgH17erH/LoR69uITtW+KTsALgk9axEt5AAabM4ucg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [freebsd]
requiresBuild: true
optional: true
/@next/swc-linux-arm-gnueabihf/13.0.4:
resolution: {integrity: sha512-s13pxNp9deKmmxEGTp1MoL1e4nf4wbEymEaHgFxUlhoR1OD9tK8oTNrQphQePJgVjzcWmRGH/dX7O9mVkHbU/g==}
/@next/swc-linux-arm-gnueabihf/13.0.5:
resolution: {integrity: sha512-Cye+h3oDT3NDWjACMlRaolL8fokpKie34FlPj9nfoW7bYKmoMBY1d4IO/GgBF+5xEl7HkH0Ny/qex63vQ0pN+A==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
requiresBuild: true
optional: true
/@next/swc-linux-arm64-gnu/13.0.4:
resolution: {integrity: sha512-Lklo65usNzoYwjX51CpDKOepWVZBdwO49/Jz3djxiYUr2lRtpDVnlfwCvzN+47j3BMVMWtC2ndIi8Q4s3J0v4g==}
/@next/swc-linux-arm64-gnu/13.0.5:
resolution: {integrity: sha512-5BfDS/VoRDR5QUGG9oedOCEZGmV2zxUVFYLUJVPMSMeIgqkjxWQBiG2BUHZI6/LGk9yvHmjx7BTvtBCLtRg6IQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
/@next/swc-linux-arm64-musl/13.0.4:
resolution: {integrity: sha512-+3BXtXBwjVhd5lahDe5nKZ7EwD6hE/oLFQkITCvgxymU5qYHGlLFyF52/lyw8qhyxoCr7mMVsUFhlCzVwCfNjg==}
/@next/swc-linux-arm64-musl/13.0.5:
resolution: {integrity: sha512-xenvqlXz+KxVKAB1YR723gnVNszpsCvKZkiFFaAYqDGJ502YuqU2fwLsaSm/ASRizNcBYeo9HPLTyc3r/9cdMQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
optional: true
/@next/swc-linux-x64-gnu/13.0.4:
resolution: {integrity: sha512-QB8qoZrvHhZsz62nUrTKlp5IiZ8I7KZsaa6437H/W/NOZHLGJjCxROnhUjLvKVe/T5P86pjya2SUOUqWAjz4Pg==}
/@next/swc-linux-x64-gnu/13.0.5:
resolution: {integrity: sha512-9Ahi1bbdXwhrWQmOyoTod23/hhK05da/FzodiNqd6drrMl1y7+RujoEcU8Dtw3H1mGWB+yuTlWo8B4Iba8hqiQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
/@next/swc-linux-x64-musl/13.0.4:
resolution: {integrity: sha512-WaahF6DYUQRg1QqIMcuOu2ZsFhS3aC5iWeQyeptMHklP9wb4FfTNmBArKHknX/GXD8P9gI38WTAHJ25cc0zVwg==}
/@next/swc-linux-x64-musl/13.0.5:
resolution: {integrity: sha512-V+1mnh49qmS9fOZxVRbzjhBEz9IUGJ7AQ80JPWAYQM5LI4TxfdiF4APLPvJ52rOmNeTqnVz1bbKtVOso+7EZ4w==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
optional: true
/@next/swc-win32-arm64-msvc/13.0.4:
resolution: {integrity: sha512-FD+k1j2jeY0aKcqcpzFKfTsv55PPmIZ5GKDyPjjV5AO6XvQ4nALwWl4JwizjH2426TfLXObb+C3MH0bl9Ok1Kw==}
/@next/swc-win32-arm64-msvc/13.0.5:
resolution: {integrity: sha512-wRE9rkp7I+/3Jf2T9PFIJOKq3adMWYEFkPOA7XAkUfYbQHlDJm/U5cVCWUsKByyQq5RThwufI91sgd19MfxRxg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
optional: true
/@next/swc-win32-ia32-msvc/13.0.4:
resolution: {integrity: sha512-+Q/Q8Ydvz3X3U84CyZdNv1HC7fE43k+xB8C6b3IFmWGa5Tu2tfskQ2FsUNBrYreZjhFC/894J3rVQ6Vj6Auugg==}
/@next/swc-win32-ia32-msvc/13.0.5:
resolution: {integrity: sha512-Q1XQSLEhFuFhkKFdJIGt7cYQ4T3u6P5wrtUNreg5M+7P+fjSiC8+X+Vjcw+oebaacsdl0pWZlK+oACGafush1w==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
optional: true
/@next/swc-win32-x64-msvc/13.0.4:
resolution: {integrity: sha512-vXtbo9N1FdtZZRcv4BliU28tTYrkb1EnVpUiiFFe88I6kS9aZVTMY9Z/OtDR52rl1JF1hgs9sL/59D/TQqSATQ==}
/@next/swc-win32-x64-msvc/13.0.5:
resolution: {integrity: sha512-t5gRblrwwiNZP6cT7NkxlgxrFgHWtv9ei5vUraCLgBqzvIsa7X+PnarZUeQCXqz6Jg9JSGGT9j8lvzD97UqeJQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
@ -2804,8 +2804,8 @@ packages:
resolution: {integrity: sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==}
dev: false
/@swc/helpers/0.4.11:
resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
/@swc/helpers/0.4.14:
resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==}
dependencies:
tslib: 2.4.1
@ -2929,8 +2929,8 @@ packages:
'@types/node': 18.11.9
dev: true
/@types/lodash/4.14.189:
resolution: {integrity: sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==}
/@types/lodash/4.14.190:
resolution: {integrity: sha512-5iJ3FBJBvQHQ8sFhEhJfjUP+G+LalhavTkYyrAYqz5MEJG+erSv0k9KJLb6q7++17Lafk1scaTIFXcMJlwK8Mw==}
dev: true
/@types/mdast/3.0.10:
@ -3108,26 +3108,6 @@ packages:
- supports-color
dev: true
/@typescript-eslint/parser/5.42.1_hsf322ms6xhhd4b5ne6lb74y4a:
resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==}
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.42.1
'@typescript-eslint/types': 5.42.1
'@typescript-eslint/typescript-estree': 5.42.1_typescript@4.9.3
debug: 4.3.4
eslint: 8.28.0
typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/parser/5.44.0_hsf322ms6xhhd4b5ne6lb74y4a:
resolution: {integrity: sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -3148,14 +3128,6 @@ packages:
- supports-color
dev: true
/@typescript-eslint/scope-manager/5.42.1:
resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.42.1
'@typescript-eslint/visitor-keys': 5.42.1
dev: true
/@typescript-eslint/scope-manager/5.44.0:
resolution: {integrity: sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -3184,37 +3156,11 @@ packages:
- supports-color
dev: true
/@typescript-eslint/types/5.42.1:
resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@typescript-eslint/types/5.44.0:
resolution: {integrity: sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
/@typescript-eslint/typescript-estree/5.42.1_typescript@4.9.3:
resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@typescript-eslint/types': 5.42.1
'@typescript-eslint/visitor-keys': 5.42.1
debug: 4.3.4
globby: 11.1.0
is-glob: 4.0.3
semver: 7.3.8
tsutils: 3.21.0_typescript@4.9.3
typescript: 4.9.3
transitivePeerDependencies:
- supports-color
dev: true
/@typescript-eslint/typescript-estree/5.44.0_typescript@4.9.3:
resolution: {integrity: sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -3256,14 +3202,6 @@ packages:
- typescript
dev: true
/@typescript-eslint/visitor-keys/5.42.1:
resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies:
'@typescript-eslint/types': 5.42.1
eslint-visitor-keys: 3.3.0
dev: true
/@typescript-eslint/visitor-keys/5.44.0:
resolution: {integrity: sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -4785,8 +4723,8 @@ packages:
engines: {node: '>=12'}
dev: false
/eslint-config-next/13.0.4_hsf322ms6xhhd4b5ne6lb74y4a:
resolution: {integrity: sha512-moEC7BW2TK7JKq3QfnaauqRjWzVcEf71gp5DbClpFPHM6QXE0u0uVvSTiHlmOgtCe1vyWAO+AhF87ZITd8mIDw==}
/eslint-config-next/13.0.5_hsf322ms6xhhd4b5ne6lb74y4a:
resolution: {integrity: sha512-lge94W7ME6kNCO96eCykq5GbKbllzmcDNDhh1/llMCRgNPl0+GIQ8dOoM0I7uRQVW56VmTXFybJFXgow11a5pg==}
peerDependencies:
eslint: ^7.23.0 || ^8.0.0
typescript: '>=3.3.1'
@ -4794,9 +4732,9 @@ packages:
typescript:
optional: true
dependencies:
'@next/eslint-plugin-next': 13.0.4
'@next/eslint-plugin-next': 13.0.5
'@rushstack/eslint-patch': 1.1.4
'@typescript-eslint/parser': 5.42.1_hsf322ms6xhhd4b5ne6lb74y4a
'@typescript-eslint/parser': 5.44.0_hsf322ms6xhhd4b5ne6lb74y4a
eslint: 8.28.0
eslint-import-resolver-node: 0.3.6
eslint-import-resolver-typescript: 3.5.2_ktrec6dplf4now6nlbc6d67jee
@ -7103,7 +7041,7 @@ packages:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
dev: true
/next-i18next/13.0.0_45muwplwdy3pbxlcpjcsuwdrxy:
/next-i18next/13.0.0_sqrilzjmqdbnpr3f23fvxycbtm:
resolution: {integrity: sha512-XiODAmMdueAIETQKIRPvYEZ5ghLOlzHb6PI4/WzwYkKdC/5q6UROzwIRw7aj3VWRB3xwnuuzEVI9NAjMfXyrkQ==}
engines: {node: '>=14'}
peerDependencies:
@ -7118,12 +7056,12 @@ packages:
hoist-non-react-statics: 3.3.2
i18next: 22.0.6
i18next-fs-backend: 2.0.0
next: 13.0.4_vgii64pd2ccbnbx2v3ro5gbin4
next: 13.0.5_vgii64pd2ccbnbx2v3ro5gbin4
react: 18.2.0
react-i18next: 12.0.0_nger6pvrp5hnzeykouhwqmsdti
dev: false
/next-sitemap/3.1.32_5onsal3mz77zvmmbchlexi75wu:
/next-sitemap/3.1.32_r3fabycidlfwwdsgai3zabmjcq:
resolution: {integrity: sha512-jkIKpwLXpWWTPfmDO46+6nu4+qpar4CjvUwCR9rYZHWtzE/wFfaCVFKpGtFMl6MFjpu8GjiE6kWFEa7uF3bzzg==}
engines: {node: '>=14.18'}
hasBin: true
@ -7132,13 +7070,13 @@ packages:
next: '*'
dependencies:
'@corex/deepmerge': 4.0.29
'@next/env': 13.0.4
'@next/env': 13.0.5
minimist: 1.2.6
next: 13.0.4_vgii64pd2ccbnbx2v3ro5gbin4
next: 13.0.5_vgii64pd2ccbnbx2v3ro5gbin4
dev: true
/next/13.0.4_vgii64pd2ccbnbx2v3ro5gbin4:
resolution: {integrity: sha512-4P0MvbjPCI1E/UPL1GrTXtYlgFnbBbY3JQ+AMY8jYE2SwyvCWctEJySoRjveznAHjrl6TIjuAJeB8u1c2StYUQ==}
/next/13.0.5_vgii64pd2ccbnbx2v3ro5gbin4:
resolution: {integrity: sha512-awpc3DkphyKydwCotcBnuKwh6hMqkT5xdiBK4OatJtOZurDPBYLP62jtM2be/4OunpmwIbsS0Eyv+ZGU97ciEg==}
engines: {node: '>=14.6.0'}
hasBin: true
peerDependencies:
@ -7155,29 +7093,28 @@ packages:
sass:
optional: true
dependencies:
'@next/env': 13.0.4
'@swc/helpers': 0.4.11
'@next/env': 13.0.5
'@swc/helpers': 0.4.14
caniuse-lite: 1.0.30001431
postcss: 8.4.14
react: 18.2.0
react-dom: 18.2.0_react@18.2.0
sass: 1.56.1
styled-jsx: 5.1.0_3lzqd2prgnu7gkxqqdmtvzna5u
use-sync-external-store: 1.2.0_react@18.2.0
optionalDependencies:
'@next/swc-android-arm-eabi': 13.0.4
'@next/swc-android-arm64': 13.0.4
'@next/swc-darwin-arm64': 13.0.4
'@next/swc-darwin-x64': 13.0.4
'@next/swc-freebsd-x64': 13.0.4
'@next/swc-linux-arm-gnueabihf': 13.0.4
'@next/swc-linux-arm64-gnu': 13.0.4
'@next/swc-linux-arm64-musl': 13.0.4
'@next/swc-linux-x64-gnu': 13.0.4
'@next/swc-linux-x64-musl': 13.0.4
'@next/swc-win32-arm64-msvc': 13.0.4
'@next/swc-win32-ia32-msvc': 13.0.4
'@next/swc-win32-x64-msvc': 13.0.4
'@next/swc-android-arm-eabi': 13.0.5
'@next/swc-android-arm64': 13.0.5
'@next/swc-darwin-arm64': 13.0.5
'@next/swc-darwin-x64': 13.0.5
'@next/swc-freebsd-x64': 13.0.5
'@next/swc-linux-arm-gnueabihf': 13.0.5
'@next/swc-linux-arm64-gnu': 13.0.5
'@next/swc-linux-arm64-musl': 13.0.5
'@next/swc-linux-x64-gnu': 13.0.5
'@next/swc-linux-x64-musl': 13.0.5
'@next/swc-win32-arm64-msvc': 13.0.5
'@next/swc-win32-ia32-msvc': 13.0.5
'@next/swc-win32-x64-msvc': 13.0.5
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
@ -7676,17 +7613,17 @@ packages:
engines: {node: '>=4'}
dev: true
/playwright-chromium/1.28.0:
resolution: {integrity: sha512-5IUBJShMJMaK6NmRj/7KWdvVqd7J8DqLH0wVdXBs/4MfZUAvByBB35y5v6B33NjlJg3SZGX5alR8TANrcKaJNA==}
/playwright-chromium/1.28.1:
resolution: {integrity: sha512-+JVgyAOaLUVN8ppAATtURmb5hEl6kaJjK5j3qh05viZvgJi9QoWkb5K02iBy99ww3q86vSnPoMmtKa1Bv+P7LQ==}
engines: {node: '>=14'}
hasBin: true
requiresBuild: true
dependencies:
playwright-core: 1.28.0
playwright-core: 1.28.1
dev: false
/playwright-core/1.28.0:
resolution: {integrity: sha512-nJLknd28kPBiCNTbqpu6Wmkrh63OEqJSFw9xOfL9qxfNwody7h6/L3O2dZoWQ6Oxcm0VOHjWmGiCUGkc0X3VZA==}
/playwright-core/1.28.1:
resolution: {integrity: sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==}
engines: {node: '>=14'}
hasBin: true
dev: false
@ -9527,6 +9464,7 @@ packages:
react: ^16.8.0 || ^17.0.0 || ^18.0.0
dependencies:
react: 18.2.0
dev: false
/util-deprecate/1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}

View File

@ -41,7 +41,7 @@
"passport-local": "^1.0.0",
"pdf-lib": "^1.17.1",
"pg": "^8.8.0",
"playwright-chromium": "^1.28.0",
"playwright-chromium": "^1.28.1",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.5.7",
@ -55,7 +55,7 @@
"@types/bcryptjs": "^2.4.2",
"@types/cookie-parser": "^1.4.3",
"@types/express": "^4.17.14",
"@types/lodash": "^4.14.189",
"@types/lodash": "^4.14.190",
"@types/multer": "^1.4.7",
"@types/node": "^18.11.9",
"@types/nodemailer": "^6.4.6",

View File

@ -8,6 +8,7 @@ import { AppModule } from './app.module';
const bootstrap = async () => {
const app = await NestFactory.create<NestExpressApplication>(AppModule);
const configService = app.get(ConfigService);
// Middleware
app.enableCors({ credentials: true });
@ -17,9 +18,8 @@ const bootstrap = async () => {
// Pipes
app.useGlobalPipes(new ValidationPipe({ transform: true }));
const configService = app.get(ConfigService);
// Server Port
const port = configService.get<number>('app.port');
await app.listen(port);
Logger.log(`🚀 Server is up and running!`);

View File

@ -1,4 +1,4 @@
import { Controller, Get, Param, Query } from '@nestjs/common';
import { Controller, Get, InternalServerErrorException, Param, Query } from '@nestjs/common';
import { PrinterService } from './printer.service';