Implement Turbo Workspaces, among other things

This commit is contained in:
Amruth Pillai
2022-08-21 22:18:12 +02:00
parent 73af4a6859
commit 0630369087
35 changed files with 569 additions and 50703 deletions

View File

@ -1,13 +1,19 @@
# Build Artifacts # Build Artifacts
dist dist
.next .next
.turbo
# IDEs # IDEs
.vscode .vscode
# Project Metadata # Project Metadata
.crowdin.yml
# Documentation
README.md README.md
SECURITY.md
CHANGELOG.md CHANGELOG.md
CODE_OF_CONDUCT.md
# Project Dependencies # Project Dependencies
node_modules node_modules
@ -18,4 +24,4 @@ Dockerfile
docker-compose.yml docker-compose.yml
# Android App # Android App
/app /app

View File

@ -5,27 +5,27 @@
"extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], "extends": ["plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"],
"plugins": ["@typescript-eslint/eslint-plugin", "simple-import-sort", "unused-imports"], "plugins": ["@typescript-eslint/eslint-plugin", "simple-import-sort", "unused-imports"],
"rules": { "rules": {
// Unused Imports
"no-unused-vars": "off",
// Simple Import Sort
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"args": "none",
"varsIgnorePattern": "^_",
"argsIgnorePattern": "^_"
}
],
"unused-imports/no-unused-imports": "error",
// TypeScript ESLint // TypeScript ESLint
"@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/interface-name-prefix": "off", "@typescript-eslint/interface-name-prefix": "off",
"@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-function-return-type": "off",
"@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/explicit-module-boundary-types": "off"
// Simple Import Sort
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
// Unused Imports
"no-unused-vars": "off",
"unused-imports/no-unused-imports": "error",
"unused-imports/no-unused-vars": [
"warn",
{
"vars": "all",
"varsIgnorePattern": "^_",
"args": "none",
"argsIgnorePattern": "^_"
}
]
}, },
"overrides": [ "overrides": [
{ {

View File

@ -1,36 +1,43 @@
--- ---
name: Bug Report name: Bug Report
about: Create a report to help improve about: Create a report to help improve
title: "[BUG] " title: '[BUG] '
labels: bug labels: bug
assignees: '' assignees: ''
--- ---
**Describe the bug** **Describe the bug**
<!-- A clear and concise description of what the bug is. --> <!-- A clear and concise description of what the bug is. -->
**Product Flavor** **Product Flavor**
- [ ] Managed (https://rxresu.me) - [ ] Managed (https://rxresu.me)
- [ ] Self Hosted - [ ] Self Hosted
**To Reproduce** **To Reproduce**
<!-- Steps to reproduce the behavior: --> <!-- Steps to reproduce the behavior: -->
1. Go to '...' 1. Go to '...'
2. Click on '....' 2. Click on '....'
3. Scroll down to '....' 3. Scroll down to '....'
4. See error 4. See error
**Expected behavior** **Expected behavior**
<!-- A clear and concise description of what you expected to happen. --> <!-- A clear and concise description of what you expected to happen. -->
**Screenshots** **Screenshots**
<!-- If applicable, add screenshots to help explain your problem. --> <!-- If applicable, add screenshots to help explain your problem. -->
**Desktop (please complete the following information):** **Desktop (please complete the following information):**
- OS: <!--[e.g. iOS]-->
- Browser <!--[e.g. chrome, safari]--> - OS: <!--[e.g. iOS]-->
- Version <!--[e.g. 22]--> - Browser <!--[e.g. chrome, safari]-->
- Version <!--[e.g. 22]-->
**Additional context** **Additional context**
<!-- Add any other context about the problem here. --> <!-- Add any other context about the problem here. -->

View File

@ -1,20 +1,23 @@
--- ---
name: Feature Request name: Feature Request
about: Suggest an idea for this project about: Suggest an idea for this project
title: "[FEATURE] " title: '[FEATURE] '
labels: enhancement labels: enhancement
assignees: '' assignees: ''
--- ---
**Is your feature request related to a problem? Please describe.** **Is your feature request related to a problem? Please describe.**
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] --> <!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like** **Describe the solution you'd like**
<!-- A clear and concise description of what you want to happen. --> <!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered** **Describe alternatives you've considered**
<!-- A clear and concise description of any alternative solutions or features you've considered. --> <!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context** **Additional context**
<!-- Add any other context or screenshots about the feature request here. --> <!-- Add any other context or screenshots about the feature request here. -->

View File

@ -7,11 +7,18 @@ on:
jobs: jobs:
client: client:
name: Client name: Client
timeout-minutes: 15
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v3.0.2 uses: actions/checkout@v3.0.2
with:
fetch-depth: 2
- id: version - id: version
name: Get Version name: Get Version
@ -44,11 +51,18 @@ jobs:
server: server:
name: Server name: Server
timeout-minutes: 15
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
steps: steps:
- name: Checkout the repository - name: Checkout the repository
uses: actions/checkout@v3.0.2 uses: actions/checkout@v3.0.2
with:
fetch-depth: 2
- id: version - id: version
name: Get Version name: Get Version

86
.github/workflows/docker-build.yml vendored Normal file
View File

@ -0,0 +1,86 @@
name: Build and Push Docker Image
on: pull_request
jobs:
client:
name: Client
timeout-minutes: 15
runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.2
with:
fetch-depth: 2
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.0.0
- id: buildx
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.0.0
with:
install: true
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Build Client Image
uses: docker/build-push-action@v3.1.1
with:
context: .
push: false
file: client/Dockerfile
platforms: linux/amd64,linux/arm64
tags: |
amruthpillai/reactive-resume:client-latest
amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
ghcr.io/amruthpillai/reactive-resume:client-latest
ghcr.io/amruthpillai/reactive-resume:client-${{ steps.version.outputs.tag }}
server:
name: Server
timeout-minutes: 15
runs-on: ubuntu-latest
env:
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
steps:
- name: Checkout the repository
uses: actions/checkout@v3.0.2
with:
fetch-depth: 2
- name: Set up QEMU
uses: docker/setup-qemu-action@v2.0.0
- id: buildx
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.0.0
with:
install: true
- id: version
name: Get Version
run: echo ::set-output name=tag::${GITHUB_REF#refs/*/}
- name: Build Server Image
uses: docker/build-push-action@v3.1.1
with:
context: .
push: false
file: server/Dockerfile
platforms: linux/amd64,linux/arm64
tags: |
amruthpillai/reactive-resume:server-latest
amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}
ghcr.io/amruthpillai/reactive-resume:server-latest
ghcr.io/amruthpillai/reactive-resume:server-${{ steps.version.outputs.tag }}

5
.gitignore vendored
View File

@ -7,4 +7,7 @@
node_modules node_modules
# macOS # macOS
.DS_Store .DS_Store
# Turbo
.turbo

View File

@ -18,6 +18,7 @@ CHANGELOG.md
# Project Dependencies # Project Dependencies
node_modules node_modules
pnpm-lock.yaml
# Docker # Docker
Dockerfile Dockerfile

View File

@ -1,3 +1,7 @@
{ {
"recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "lokalise.i18n-ally"] "recommendations": [
} "dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"lokalise.i18n-ally"
]
}

12
.vscode/launch.json vendored
View File

@ -3,12 +3,12 @@
"configurations": [ "configurations": [
{ {
"type": "node", "type": "node",
"request": "attach",
"name": "Debug: Server", "name": "Debug: Server",
"port": 9229, "port": 9229,
"request": "attach",
"restart": true, "restart": true,
"stopOnEntry": false, "protocol": "inspector",
"protocol": "inspector" "stopOnEntry": false
}, },
{ {
"name": "Debug: Client", "name": "Debug: Client",
@ -17,10 +17,10 @@
"command": "pnpm run dev:client", "command": "pnpm run dev:client",
"console": "integratedTerminal", "console": "integratedTerminal",
"serverReadyAction": { "serverReadyAction": {
"action": "debugWithChrome",
"pattern": "started server on .+, url: (https?://.+)", "pattern": "started server on .+, url: (https?://.+)",
"uriFormat": "%s", "uriFormat": "%s"
"action": "debugWithChrome"
} }
} }
] ]
} }

12
.vscode/settings.json vendored
View File

@ -1,22 +1,22 @@
{ {
"css.validate": false, "css.validate": false,
"scss.validate": false,
"editor.wordWrap": "on",
"npm.packageManager": "pnpm",
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true "source.fixAll.eslint": true
}, },
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.wordWrap": "on",
"eslint.workingDirectories": [ "eslint.workingDirectories": [
"schema", "schema",
"client", "client",
"server" "server"
], ],
"scss.validate": false,
"conventionalCommits.scopes": [ "conventionalCommits.scopes": [
"client", "client",
"server", "server",
"docker", "docker",
"dependencies" "dependencies"
], ]
"npm.packageManager": "pnpm"
} }

View File

@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
Examples of behavior that contributes to a positive environment for our Examples of behavior that contributes to a positive environment for our
community include: community include:
* Demonstrating empathy and kindness toward other people - Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences - Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback - Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, - Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience and learning from the experience
* Focusing on what is best not just for us as individuals, but for the - Focusing on what is best not just for us as individuals, but for the
overall community overall community
Examples of unacceptable behavior include: Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or - The use of sexualized language or imagery, and sexual attention or
advances of any kind advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks - Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment - Public or private harassment
* Publishing others' private information, such as a physical or email - Publishing others' private information, such as a physical or email
address, without their explicit permission address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a - Other conduct which could reasonably be considered inappropriate in a
professional setting professional setting
## Enforcement Responsibilities ## Enforcement Responsibilities
@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban ### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community **Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals. individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within **Consequence**: A permanent ban from any sort of public interaction within

View File

@ -1,22 +1,18 @@
FROM node:lts-alpine as dependencies FROM node:lts-alpine AS base
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app WORKDIR /app
RUN apk add --no-cache g++ git curl make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
COPY package.json pnpm-*.yaml ./ FROM base as dependencies
COPY package.json pnpm-*.yaml turbo.json ./
COPY ./schema/package.json ./schema/package.json COPY ./schema/package.json ./schema/package.json
COPY ./client/package.json ./client/package.json COPY ./client/package.json ./client/package.json
RUN pnpm install --frozen-lockfile RUN pnpm install --frozen-lockfile
FROM node:lts-alpine as builder FROM base as builder
RUN apk add --no-cache curl g++ make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app
COPY . . COPY . .
@ -24,21 +20,14 @@ COPY --from=dependencies /app/node_modules ./node_modules
COPY --from=dependencies /app/schema/node_modules ./schema/node_modules COPY --from=dependencies /app/schema/node_modules ./schema/node_modules
COPY --from=dependencies /app/client/node_modules ./client/node_modules COPY --from=dependencies /app/client/node_modules ./client/node_modules
RUN pnpm run build:schema RUN pnpm run build --filter client
RUN pnpm run build:client
FROM node:lts-alpine as production FROM base as production
WORKDIR /app COPY --from=builder /app/package.json /app/pnpm-*.yaml /app/turbo.json ./
RUN apk add --no-cache curl \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
COPY --from=builder /app/pnpm-*.yaml ./
COPY --from=builder /app/package.json ./
COPY --from=builder /app/client/package.json ./client/package.json COPY --from=builder /app/client/package.json ./client/package.json
RUN pnpm install -F client --frozen-lockfile --prod RUN pnpm install --filter client --prod --frozen-lockfile --workspace-root
COPY --from=builder /app/client/.next ./client/.next COPY --from=builder /app/client/.next ./client/.next
COPY --from=builder /app/client/public ./client/public COPY --from=builder /app/client/public ./client/public
@ -52,4 +41,4 @@ ENV PORT 3000
HEALTHCHECK --interval=30s --timeout=20s --retries=3 --start-period=15s \ HEALTHCHECK --interval=30s --timeout=20s --retries=3 --start-period=15s \
CMD curl -fSs 127.0.0.1:3000 || exit 1 CMD curl -fSs 127.0.0.1:3000 || exit 1
CMD [ "pnpm", "run", "start:client" ] CMD [ "pnpm", "run", "start", "--filter", "client" ]

View File

@ -97,7 +97,7 @@ const Settings = () => {
<List sx={{ padding: 0 }}> <List sx={{ padding: 0 }}>
{/* Global Settings */} {/* Global Settings */}
<> <>
<ListSubheader className="rounded"> <ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.global.heading')} {t<string>('builder.rightSidebar.sections.settings.global.heading')}
</ListSubheader> </ListSubheader>
@ -155,7 +155,7 @@ const Settings = () => {
{/* Page Settings */} {/* Page Settings */}
<> <>
<ListSubheader className="rounded"> <ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.page.heading')} {t<string>('builder.rightSidebar.sections.settings.page.heading')}
</ListSubheader> </ListSubheader>
@ -187,7 +187,7 @@ const Settings = () => {
{/* Resume Settings */} {/* Resume Settings */}
<> <>
<ListSubheader className="rounded"> <ListSubheader disableSticky className="rounded">
{t<string>('builder.rightSidebar.sections.settings.resume.heading')} {t<string>('builder.rightSidebar.sections.settings.resume.heading')}
</ListSubheader> </ListSubheader>

View File

@ -1,6 +1,6 @@
import { createTheme } from '@mui/material'; import { createTheme, ThemeOptions } from '@mui/material/styles';
const theme = createTheme({ const theme: ThemeOptions = {
typography: { typography: {
fontSize: 12, fontSize: 12,
fontFamily: 'Inter, sans-serif', fontFamily: 'Inter, sans-serif',
@ -49,7 +49,7 @@ const theme = createTheme({
}, },
}, },
}, },
}); };
export const lightTheme = createTheme({ export const lightTheme = createTheme({
...theme, ...theme,

View File

@ -2,81 +2,84 @@
"name": "@reactive-resume/client", "name": "@reactive-resume/client",
"scripts": { "scripts": {
"dev": "react-env --prefix PUBLIC -- next dev", "dev": "react-env --prefix PUBLIC -- next dev",
"lint": "next lint --fix",
"build": "next build && npm run sitemap", "build": "next build && npm run sitemap",
"start": "react-env --prefix PUBLIC -- next start", "start": "react-env --prefix PUBLIC -- next start",
"lint": "next lint --fix",
"sitemap": "next-sitemap --config next-sitemap.config.js" "sitemap": "next-sitemap --config next-sitemap.config.js"
}, },
"dependencies": { "dependencies": {
"@beam-australia/react-env": "^3.1.1",
"@date-io/dayjs": "^2.15.0",
"@emotion/css": "^11.10.0",
"@emotion/react": "^11.10.0",
"@emotion/styled": "^11.10.0",
"@hookform/resolvers": "2.9.7",
"@monaco-editor/react": "^4.4.5",
"@mui/icons-material": "^5.8.4",
"@mui/lab": "^5.0.0-alpha.95",
"@mui/material": "^5.10.1",
"@mui/system": "^5.10.1",
"@mui/x-date-pickers": "5.0.0-beta.6",
"@next/env": "^12.2.5",
"@reduxjs/toolkit": "^1.8.5",
"axios": "^0.27.2",
"clsx": "^1.2.1",
"dayjs": "^1.11.5",
"downloadjs": "^1.4.7",
"joi": "^17.6.0", "joi": "^17.6.0",
"lodash": "^4.17.21", "clsx": "^1.2.1",
"md5-hex": "^4.0.0",
"monaco-editor": "^0.34.0",
"nanoid": "^3.3.4",
"next": "12.2.5", "next": "12.2.5",
"next-i18next": "^11.3.0", "uuid": "^8.3.2",
"axios": "^0.27.2",
"dayjs": "^1.11.5",
"react": "18.2.0", "react": "18.2.0",
"react-beautiful-dnd": "^13.1.0",
"react-colorful": "^5.6.1",
"react-dnd": "16.0.1",
"react-dnd-html5-backend": "16.0.1",
"react-dom": "18.2.0",
"react-hook-form": "^7.34.2",
"react-hot-toast": "2.3.0",
"react-hotkeys-hook": "^3.4.7",
"react-icons": "^4.4.0",
"react-markdown": "^8.0.3",
"react-query": "^3.39.2",
"react-redux": "^8.0.2",
"react-zoom-pan-pinch": "^2.1.3",
"redux": "^4.2.0", "redux": "^4.2.0",
"redux-persist": "^6.0.0", "sharp": "^0.30.7",
"lodash": "^4.17.21",
"nanoid": "^3.3.4",
"md5-hex": "^4.0.0",
"@mui/lab": "^5.0.0-alpha.95",
"@next/env": "^12.2.5",
"react-dnd": "16.0.1",
"react-dom": "18.2.0",
"downloadjs": "^1.4.7",
"redux-saga": "^1.2.1", "redux-saga": "^1.2.1",
"remark-gfm": "^3.0.1", "remark-gfm": "^3.0.1",
"sharp": "^0.30.7", "@mui/system": "^5.10.1",
"uuid": "^8.3.2", "react-icons": "^4.4.0",
"webfontloader": "^1.6.28" "react-query": "^3.39.2",
"react-redux": "^8.0.2",
"@emotion/css": "^11.10.0",
"next-i18next": "^11.3.0",
"@mui/material": "^5.10.1",
"monaco-editor": "^0.34.0",
"redux-persist": "^6.0.0",
"webfontloader": "^1.6.28",
"@date-io/dayjs": "^2.15.0",
"@emotion/react": "^11.10.0",
"react-colorful": "^5.6.1",
"react-markdown": "^8.0.3",
"@emotion/styled": "^11.10.0",
"react-hook-form": "^7.34.2",
"react-hot-toast": "2.3.0",
"@reduxjs/toolkit": "^1.8.5",
"react-hotkeys-hook": "^3.4.7",
"@hookform/resolvers": "2.9.7",
"@mui/icons-material": "^5.8.4",
"@mui/x-date-pickers": "5.0.0-beta.6",
"react-beautiful-dnd": "^13.1.0",
"@monaco-editor/react": "^4.4.5",
"react-zoom-pan-pinch": "^2.1.3",
"react-dnd-html5-backend": "16.0.1",
"@beam-australia/react-env": "^3.1.1"
},
"resolutions": {
"@types/react": "18.0.17",
"@types/react-dom": "18.0.6"
}, },
"devDependencies": { "devDependencies": {
"sass": "^1.54.5",
"csstype": "^3.1.0",
"postcss": "^8.4.16",
"typescript": "^4.7.4",
"@babel/core": "^7.18.10", "@babel/core": "^7.18.10",
"@reactive-resume/schema": "workspace:*",
"@tailwindcss/typography": "^0.5.4",
"@types/downloadjs": "^1.4.3",
"@types/lodash": "^4.14.184",
"@types/node": "18.7.8", "@types/node": "18.7.8",
"@types/uuid": "^8.3.4",
"tailwindcss": "^3.1.8",
"@types/react": "18.0.17", "@types/react": "18.0.17",
"@types/react-beautiful-dnd": "^13.1.2", "autoprefixer": "^10.4.8",
"next-sitemap": "^3.1.21",
"@types/lodash": "^4.14.184",
"@types/react-dom": "18.0.6",
"@types/downloadjs": "^1.4.3",
"@types/react-redux": "^7.1.24", "@types/react-redux": "^7.1.24",
"@types/tailwindcss": "^3.0.11", "@types/tailwindcss": "^3.0.11",
"@types/uuid": "^8.3.4",
"@types/webfontloader": "^1.6.34",
"autoprefixer": "^10.4.8",
"csstype": "^3.1.0",
"eslint": "^8.22.0",
"eslint-config-next": "12.2.5", "eslint-config-next": "12.2.5",
"next-sitemap": "^3.1.20", "@types/webfontloader": "^1.6.34",
"postcss": "^8.4.16", "@reactive-resume/schema": "workspace:*",
"prettier": "^2.7.1", "@tailwindcss/typography": "^0.5.4",
"sass": "^1.54.5", "@types/react-beautiful-dnd": "^13.1.2"
"tailwindcss": "^3.1.8",
"typescript": "^4.7.4"
} }
} }

View File

@ -3,7 +3,6 @@ import clsx from 'clsx';
import get from 'lodash/get'; import get from 'lodash/get';
import isEmpty from 'lodash/isEmpty'; import isEmpty from 'lodash/isEmpty';
import { GetServerSideProps, NextPage } from 'next'; import { GetServerSideProps, NextPage } from 'next';
import { useRouter } from 'next/router';
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'; import { serverSideTranslations } from 'next-i18next/serverSideTranslations';
import { useEffect } from 'react'; import { useEffect } from 'react';
@ -55,8 +54,6 @@ export const getServerSideProps: GetServerSideProps<Props | Promise<Props>, Quer
}; };
const Printer: NextPage<Props> = ({ resume: initialData, locale }) => { const Printer: NextPage<Props> = ({ resume: initialData, locale }) => {
const router = useRouter();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const resume = useAppSelector((state) => state.resume); const resume = useAppSelector((state) => state.resume);
@ -65,12 +62,6 @@ const Printer: NextPage<Props> = ({ resume: initialData, locale }) => {
if (initialData) dispatch(setResume(initialData)); if (initialData) dispatch(setResume(initialData));
}, [dispatch, initialData]); }, [dispatch, initialData]);
useEffect(() => {
const { pathname, asPath, query } = router;
router.push({ pathname, query }, asPath, { locale });
}, [router, locale]);
if (!resume || isEmpty(resume)) return null; if (!resume || isEmpty(resume)) return null;
const layout: string[][][] = get(resume, 'metadata.layout', []); const layout: string[][][] = get(resume, 'metadata.layout', []);

View File

@ -1,39 +1,39 @@
{ {
"extends": "../tsconfig.base.json", "extends": "../tsconfig.base.json",
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": [".next"],
"compilerOptions": { "compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"], "lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true, "jsx": "preserve",
"skipLibCheck": true, "target": "es5",
"strict": true, "strict": true,
"forceConsistentCasingInFileNames": true,
"noEmit": true, "noEmit": true,
"esModuleInterop": true,
"module": "esnext", "module": "esnext",
"allowJs": true,
"baseUrl": "./",
"incremental": true,
"skipLibCheck": true,
"esModuleInterop": true,
"isolatedModules": true,
"moduleResolution": "node", "moduleResolution": "node",
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "forceConsistentCasingInFileNames": true,
"jsx": "preserve",
"incremental": true,
"baseUrl": "./",
"paths": { "paths": {
"@/components/*": ["components/*"],
"@/config/*": ["config/*"],
"@/constants/*": ["constants/*"],
"@/data/*": ["data/*"], "@/data/*": ["data/*"],
"@/i18n/*": ["i18n/*"], "@/i18n/*": ["i18n/*"],
"@/modals/*": ["modals/*"],
"@/pages/*": ["pages/*"], "@/pages/*": ["pages/*"],
"@/public/*": ["public/*"],
"@/services/*": ["services/*"],
"@/store/*": ["store/*"], "@/store/*": ["store/*"],
"@/styles/*": ["styles/*"],
"@/templates/*": ["templates/*"],
"@/types/*": ["types/*"], "@/types/*": ["types/*"],
"@/utils/*": ["utils/*"], "@/utils/*": ["utils/*"],
"@/wrappers/*": ["wrappers/*"] "@/config/*": ["config/*"],
"@/modals/*": ["modals/*"],
"@/public/*": ["public/*"],
"@/styles/*": ["styles/*"],
"@/services/*": ["services/*"],
"@/wrappers/*": ["wrappers/*"],
"@/constants/*": ["constants/*"],
"@/templates/*": ["templates/*"],
"@/components/*": ["components/*"]
} }
}, }
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
"exclude": [".next"]
} }

View File

@ -1,8 +1,8 @@
version: '3' version: '3.8'
services: services:
postgres: postgres:
image: postgres:14.2-alpine image: postgres:alpine
container_name: postgres container_name: postgres
ports: ports:
- 5432:5432 - 5432:5432
@ -21,7 +21,7 @@ services:
restart: always restart: always
traefik: traefik:
image: traefik:rocamadour image: traefik:latest
container_name: traefik container_name: traefik
command: command:
- --providers.docker=true - --providers.docker=true
@ -33,37 +33,12 @@ services:
- /var/run/docker.sock:/var/run/docker.sock:ro - /var/run/docker.sock:/var/run/docker.sock:ro
server: server:
image: amruthpillai/reactive-resume:server-latest # image: amruthpillai/reactive-resume:server-latest
# build: build:
# context: . context: .
# dockerfile: ./server/Dockerfile dockerfile: ./server/Dockerfile
container_name: server container_name: server
environment: env_file: .env
- TZ=UTC
- PUBLIC_URL=http://localhost:3000
- PUBLIC_SERVER_URL=http://localhost:3000/api
- PUBLIC_GOOGLE_CLIENT_ID=
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- SECRET_KEY=
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
- POSTGRES_SSL_CERT=
- JWT_SECRET=
- JWT_EXPIRY_TIME=604800
- GOOGLE_CLIENT_SECRET=
- GOOGLE_API_KEY=
- SENDGRID_API_KEY=
- SENDGRID_FORGOT_PASSWORD_TEMPLATE_ID=
- SENDGRID_FROM_NAME=
- SENDGRID_FROM_EMAIL=
- STORAGE_BUCKET=
- STORAGE_REGION=
- STORAGE_ENDPOINT=
- STORAGE_URL_PREFIX=
- STORAGE_ACCESS_KEY=
- STORAGE_SECRET_KEY=
depends_on: depends_on:
- traefik - traefik
- postgres - postgres
@ -77,17 +52,12 @@ services:
restart: always restart: always
client: client:
image: amruthpillai/reactive-resume:client-latest # image: amruthpillai/reactive-resume:client-latest
# build: build:
# context: . context: .
# dockerfile: ./client/Dockerfile dockerfile: ./client/Dockerfile
container_name: client container_name: client
environment: env_file: .env
- TZ=UTC
- PUBLIC_URL=http://localhost:3000
- PUBLIC_SERVER_URL=http://localhost:3000/api
- PUBLIC_GOOGLE_CLIENT_ID=
- PUBLIC_FLAG_DISABLE_SIGNUPS=false
depends_on: depends_on:
- traefik - traefik
- server - server

2
docs/.gitignore vendored
View File

@ -2,7 +2,7 @@
/node_modules /node_modules
# Production # Production
/build build
# Generated files # Generated files
.docusaurus .docusaurus

View File

@ -4,7 +4,6 @@ sidebar_position: 2
# Create a new resume # Create a new resume
To create a new resume from scratch, click on the selected part. To create a new resume from scratch, click on the selected part.
<a href="https://rxresu.me/dashboard"> <a href="https://rxresu.me/dashboard">
@ -12,13 +11,27 @@ To create a new resume from scratch, click on the selected part.
</a> </a>
<p> <p>
After you click on it, enter name and select whether you want it publicly accessible After you click on it, enter name and select whether you want it publicly accessible
<img align="center" src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655884469/on-button_a5kfbz.png" height='25' type="image"></img> or not <img
<img align="center" src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655884949/off-button_rrkz3g.png" height='25' type="image"></img> . You can also change it later from the sharing <a href="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655889311/toggle_jcmfix.gif">see where</a>. align="center"
src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655884469/on-button_a5kfbz.png"
height="25"
type="image"
></img> or not
<img
align="center"
src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655884949/off-button_rrkz3g.png"
height="25"
type="image"
></img> . You can also change it later from the sharing{' '}
<a href="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655889311/toggle_jcmfix.gif">see where</a>.
</p> </p>
<h3> Now it's look like ⚡</h3> <h3> Now it's look like ⚡</h3>
<a href="https://rxresu.me/dashboard"> <a href="https://rxresu.me/dashboard">
<img src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655882355/Screenshot_2022-06-22_at_12.48.42_PM_dx6714.png" type="image"></img> <img
src="https://res.cloudinary.com/dn2mupqo0/image/upload/v1655882355/Screenshot_2022-06-22_at_12.48.42_PM_dx6714.png"
type="image"
></img>
</a> </a>

View File

@ -1,10 +1,6 @@
// @ts-check
// Note: type annotations allow type checking and IDEs autocompletion
const lightCodeTheme = require('prism-react-renderer/themes/github'); const lightCodeTheme = require('prism-react-renderer/themes/github');
const darkCodeTheme = require('prism-react-renderer/themes/dracula'); const darkCodeTheme = require('prism-react-renderer/themes/dracula');
/** @type {import('@docusaurus/types').Config} */
const config = { const config = {
title: 'Reactive Resume', title: 'Reactive Resume',
tagline: 'A free and open source resume builder.', tagline: 'A free and open source resume builder.',
@ -24,7 +20,6 @@ const config = {
blog: false, blog: false,
docs: { docs: {
routeBasePath: '/', routeBasePath: '/',
sidebarPath: require.resolve('./sidebars.js'),
editUrl: 'https://github.com/AmruthPillai/Reactive-Resume/tree/main/docs', editUrl: 'https://github.com/AmruthPillai/Reactive-Resume/tree/main/docs',
}, },
sitemap: { sitemap: {

View File

@ -3,25 +3,17 @@
"version": "0.0.0", "version": "0.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"docusaurus": "docusaurus", "dev": "docusaurus start --no-open --port 3200",
"start": "docusaurus start --no-open --port 3200",
"build": "docusaurus build", "build": "docusaurus build",
"swizzle": "docusaurus swizzle", "start": "docusaurus serve --no-open --port 3200"
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve --port 3200",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
}, },
"dependencies": { "dependencies": {
"@algolia/client-search": "^4.14.2",
"@docusaurus/core": "2.0.1",
"@docusaurus/preset-classic": "2.0.1",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"prism-react-renderer": "^1.3.5",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2" "react-dom": "^17.0.2",
"@mdx-js/react": "^1.6.22",
"@docusaurus/core": "2.0.1",
"prism-react-renderer": "^1.3.5",
"@docusaurus/preset-classic": "2.0.1"
}, },
"browserslist": { "browserslist": {
"production": [ "production": [
@ -36,7 +28,7 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@types/react": "^17.0.2", "typescript": "^4.7.4",
"typescript": "^4.7.4" "@types/react": "^17.0.2"
} }
} }

View File

@ -1,31 +0,0 @@
/**
* Creating a sidebar enables you to:
- create an ordered group of docs
- render a sidebar for each doc of that group
- provide next/previous navigation
The sidebars can be generated from the filesystem, or explicitly defined here.
Create as many sidebars as you want.
*/
// @ts-check
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
const sidebars = {
// By default, Docusaurus generates a sidebar from the docs folder structure
tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }],
// But you can create a sidebar manually
/*
tutorialSidebar: [
{
type: 'category',
label: 'Tutorial',
items: ['hello'],
},
],
*/
};
module.exports = sidebars;

49834
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -2,54 +2,35 @@
"name": "reactive-resume", "name": "reactive-resume",
"version": "3.5.3", "version": "3.5.3",
"private": true, "private": true,
"scripts": {
"dev": "env-cmd --silent turbo run dev",
"lint": "eslint --fix .",
"build": "env-cmd --silent turbo run build",
"start": "env-cmd --silent turbo run start",
"format": "prettier --write .",
"release": "standard-version --release-as patch"
},
"workspaces": [ "workspaces": [
"schema", "schema",
"client", "client",
"server", "server",
"docs" "docs"
], ],
"config": {
"commitizen": {
"path": "cz-conventional-changelog"
}
},
"scripts": {
"prepare": "husky install",
"release": "standard-version",
"lint": "eslint --quiet --fix --ext .js,.ts,.tsx .",
"format": "prettier --loglevel error --write \"./**/*.{js,ts,tsx,json}\"",
"dev:schema": "pnpm -F schema dev",
"dev:server": "pnpm -F server start:debug",
"dev:client": "pnpm -F client dev",
"dev:docs": "pnpm -F docs start",
"dev": "env-cmd --silent concurrently --kill-others \"pnpm run dev:*\"",
"build:schema": "pnpm -F schema build",
"build:server": "pnpm -F server build",
"build:client": "pnpm -F client build",
"build:docs": "pnpm -F docs build",
"build": "env-cmd --silent concurrently \"pnpm run build:*\"",
"start:server": "pnpm -F server start:prod",
"start:client": "pnpm -F client start",
"start:docs": "pnpm -F docs serve",
"start": "env-cmd --silent concurrently --kill-others \"pnpm run start:*\""
},
"dependencies": { "dependencies": {
"concurrently": "^7.3.0", "turbo": "^1.4.3",
"env-cmd": "^10.1.0" "env-cmd": "^10.1.0"
}, },
"devDependencies": { "devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.33.1",
"@typescript-eslint/parser": "^5.33.1",
"cz-conventional-changelog": "^3.3.0",
"eslint": "^8.22.0", "eslint": "^8.22.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-simple-import-sort": "^7.0.0",
"eslint-plugin-unused-imports": "^2.0.0",
"husky": "^8.0.1",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"typescript": "^4.7.4",
"standard-version": "^9.5.0", "standard-version": "^9.5.0",
"typescript": "^4.7.4" "eslint-plugin-import": "^2.26.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-prettier": "^4.2.1",
"@typescript-eslint/parser": "^5.33.1",
"eslint-plugin-unused-imports": "^2.0.0",
"@typescript-eslint/eslint-plugin": "^5.33.1",
"eslint-plugin-simple-import-sort": "^7.0.0"
} }
} }

659
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -4,9 +4,8 @@
"main": "./dist/index.js", "main": "./dist/index.js",
"typings": "./dist/index.d.ts", "typings": "./dist/index.d.ts",
"scripts": { "scripts": {
"build": "tsc",
"dev": "tsc -w", "dev": "tsc -w",
"lint": "eslint --fix --ext .ts ./src" "build": "tsc"
}, },
"devDependencies": { "devDependencies": {
"eslint": "^8.22.0", "eslint": "^8.22.0",

View File

@ -1,22 +1,19 @@
FROM node:lts-alpine as dependencies FROM node:lts-alpine AS base
RUN apk add --no-cache g++ curl make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app WORKDIR /app
COPY package.json pnpm-*.yaml ./ RUN apk add --no-cache g++ git curl make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
FROM base AS dependencies
COPY package.json pnpm-*.yaml turbo.json ./
COPY ./schema/package.json ./schema/package.json COPY ./schema/package.json ./schema/package.json
COPY ./server/package.json ./server/package.json COPY ./server/package.json ./server/package.json
RUN pnpm install --frozen-lockfile RUN pnpm install --frozen-lockfile
FROM node:lts-alpine as builder FROM base AS builder
RUN apk add --no-cache g++ curl make python3 \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
WORKDIR /app
COPY . . COPY . .
@ -24,25 +21,25 @@ COPY --from=dependencies /app/node_modules ./node_modules
COPY --from=dependencies /app/schema/node_modules ./schema/node_modules COPY --from=dependencies /app/schema/node_modules ./schema/node_modules
COPY --from=dependencies /app/server/node_modules ./server/node_modules COPY --from=dependencies /app/server/node_modules ./server/node_modules
RUN pnpm run build:schema RUN pnpm run build --filter server
RUN pnpm run build:server
FROM mcr.microsoft.com/playwright:focal as production FROM mcr.microsoft.com/playwright:next-jammy as production
WORKDIR /app WORKDIR /app
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y curl \ && apt-get install -y curl build-essential \
&& curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm && curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm
COPY --from=builder /app/pnpm-*.yaml ./ COPY --from=builder /app/package.json /app/pnpm-*.yaml /app/turbo.json ./
COPY --from=builder /app/package.json ./
COPY --from=builder /app/server/package.json ./server/package.json COPY --from=builder /app/server/package.json ./server/package.json
RUN pnpm install -F server --frozen-lockfile --prod RUN npx playwright install --with-deps chromium
RUN pnpm install --filter server --prod --frozen-lockfile --workspace-root
COPY --from=builder /app/server/dist ./server/dist COPY --from=builder /app/server/dist ./server/dist
VOLUME /app/server/dist/assets/exports
VOLUME /app/server/dist/assets/uploads VOLUME /app/server/dist/assets/uploads
EXPOSE 3100 EXPOSE 3100
@ -52,4 +49,4 @@ ENV PORT 3100
HEALTHCHECK --interval=30s --timeout=20s --retries=3 --start-period=15s \ HEALTHCHECK --interval=30s --timeout=20s --retries=3 --start-period=15s \
CMD curl -fSs localhost:3100/health || exit 1 CMD curl -fSs localhost:3100/health || exit 1
CMD [ "pnpm", "run", "start:server" ] CMD [ "pnpm", "run", "start", "--filter", "server" ]

View File

@ -1,13 +1,10 @@
{ {
"name": "@reactive-resume/server", "name": "@reactive-resume/server",
"scripts": { "scripts": {
"dev": "nest start --watch",
"build": "rimraf dist && nest build", "build": "rimraf dist && nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "debug": "nest start --debug --watch",
"start": "nest start", "start": "node dist/main"
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint --fix --ext .ts ./src"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.154.0", "@aws-sdk/client-s3": "^3.154.0",
@ -25,7 +22,7 @@
"@nestjs/typeorm": "^9.0.1", "@nestjs/typeorm": "^9.0.1",
"@sendgrid/mail": "^7.7.0", "@sendgrid/mail": "^7.7.0",
"@types/passport": "^1.0.10", "@types/passport": "^1.0.10",
"bcrypt": "^5.0.1", "bcryptjs": "^2.4.3",
"cache-manager": "^4.1.0", "cache-manager": "^4.1.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.13.2", "class-validator": "^0.13.2",
@ -54,7 +51,7 @@
"@nestjs/cli": "^9.0.0", "@nestjs/cli": "^9.0.0",
"@nestjs/schematics": "^9.0.1", "@nestjs/schematics": "^9.0.1",
"@reactive-resume/schema": "workspace:*", "@reactive-resume/schema": "workspace:*",
"@types/bcrypt": "^5.0.0", "@types/bcryptjs": "^2.4.2",
"@types/cookie-parser": "^1.4.3", "@types/cookie-parser": "^1.4.3",
"@types/express": "^4.17.13", "@types/express": "^4.17.13",
"@types/lodash": "^4.14.184", "@types/lodash": "^4.14.184",
@ -62,7 +59,6 @@
"@types/node": "^18.7.8", "@types/node": "^18.7.8",
"@types/passport-jwt": "^3.0.6", "@types/passport-jwt": "^3.0.6",
"@types/passport-local": "^1.0.34", "@types/passport-local": "^1.0.34",
"eslint": "^8.22.0",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"ts-loader": "^9.3.1", "ts-loader": "^9.3.1",

View File

@ -2,8 +2,7 @@ import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { JwtService } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt';
import { SchedulerRegistry } from '@nestjs/schedule'; import { SchedulerRegistry } from '@nestjs/schedule';
import bcrypt from 'bcrypt'; import { compareSync, hashSync } from 'bcryptjs';
import { randomInt } from 'crypto';
import { OAuth2Client } from 'google-auth-library'; import { OAuth2Client } from 'google-auth-library';
import { PostgresErrorCode } from '@/database/errorCodes.enum'; import { PostgresErrorCode } from '@/database/errorCodes.enum';
@ -24,12 +23,12 @@ export class AuthService {
) {} ) {}
async register(registerDto: RegisterDto) { async register(registerDto: RegisterDto) {
const hashedPassword = await bcrypt.hash(registerDto.password, randomInt(8, 12)); const password = hashSync(registerDto.password);
try { try {
const createdUser = await this.usersService.create({ const createdUser = await this.usersService.create({
...registerDto, ...registerDto,
password: hashedPassword, password,
provider: 'email', provider: 'email',
}); });
@ -43,6 +42,17 @@ export class AuthService {
} }
} }
async verifyPassword(password: string, hashedPassword: string) {
const isPasswordMatching = compareSync(password, hashedPassword);
if (!isPasswordMatching) {
throw new HttpException(
'The username/email and password combination provided was incorrect.',
HttpStatus.UNAUTHORIZED
);
}
}
async getUser(identifier: string, password: string) { async getUser(identifier: string, password: string) {
try { try {
const user = await this.usersService.findByIdentifier(identifier); const user = await this.usersService.findByIdentifier(identifier);
@ -58,27 +68,17 @@ export class AuthService {
} }
} }
async verifyPassword(password: string, hashedPassword: string) {
const isPasswordMatching = await bcrypt.compare(password, hashedPassword);
if (!isPasswordMatching) {
throw new HttpException(
'The username/email and password combination provided was incorrect.',
HttpStatus.UNAUTHORIZED
);
}
}
forgotPassword(email: string) { forgotPassword(email: string) {
return this.usersService.generateResetToken(email); return this.usersService.generateResetToken(email);
} }
async resetPassword(resetPasswordDto: ResetPasswordDto) { async resetPassword(resetPasswordDto: ResetPasswordDto) {
const user = await this.usersService.findByResetToken(resetPasswordDto.resetToken); const user = await this.usersService.findByResetToken(resetPasswordDto.resetToken);
const hashedPassword = await bcrypt.hash(resetPasswordDto.password, randomInt(8, 12));
const password = hashSync(resetPasswordDto.password);
await this.usersService.update(user.id, { await this.usersService.update(user.id, {
password: hashedPassword, password,
resetToken: null, resetToken: null,
}); });

View File

@ -12,8 +12,6 @@ export class HealthController {
@Get() @Get()
@HealthCheck() @HealthCheck()
check() { check() {
return this.health.check([ return this.health.check([() => this.db.pingCheck('database')]);
() => this.db.pingCheck('database'),
]);
} }
} }

View File

@ -3,33 +3,33 @@
"exclude": ["dist"], "exclude": ["dist"],
"compilerOptions": { "compilerOptions": {
"module": "commonjs", "module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "es2017", "target": "es2017",
"sourceMap": true,
"outDir": "dist", "outDir": "dist",
"baseUrl": ".",
"sourceMap": true,
"declaration": true,
"incremental": true, "incremental": true,
"skipLibCheck": true, "skipLibCheck": true,
"strictNullChecks": false,
"noImplicitAny": false, "noImplicitAny": false,
"removeComments": true,
"strictNullChecks": false,
"resolveJsonModule": true, "resolveJsonModule": true,
"strictBindCallApply": false, "strictBindCallApply": false,
"forceConsistentCasingInFileNames": false, "emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noFallthroughCasesInSwitch": false, "noFallthroughCasesInSwitch": false,
"baseUrl": ".", "allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": false,
"paths": { "paths": {
"@/auth/*": ["src/auth/*"], "@/auth/*": ["src/auth/*"],
"@/config/*": ["src/config/*"],
"@/constants/*": ["src/constants/*"],
"@/database/*": ["src/database/*"],
"@/decorators/*": ["src/decorators/*"],
"@/filters/*": ["src/filters/*"],
"@/mail/*": ["src/mail/*"], "@/mail/*": ["src/mail/*"],
"@/users/*": ["src/users/*"],
"@/config/*": ["src/config/*"],
"@/resume/*": ["src/resume/*"], "@/resume/*": ["src/resume/*"],
"@/users/*": ["src/users/*"] "@/filters/*": ["src/filters/*"],
"@/database/*": ["src/database/*"],
"@/constants/*": ["src/constants/*"],
"@/decorators/*": ["src/decorators/*"]
} }
} }
} }

View File

@ -2,9 +2,9 @@
"compilerOptions": { "compilerOptions": {
"target": "es6", "target": "es6",
"module": "commonjs", "module": "commonjs",
"esModuleInterop": true, "strict": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true, "skipLibCheck": true,
"strict": true "esModuleInterop": true,
"forceConsistentCasingInFileNames": true
} }
} }

16
turbo.json Normal file
View File

@ -0,0 +1,16 @@
{
"$schema": "https://turborepo.org/schema.json",
"pipeline": {
"dev": {
"cache": false
},
"start": {
"cache": false
},
"build": {
"outputs": ["dist/**", ".next/**"],
"dependsOn": ["^build"]
}
},
"globalDependencies": [".env"]
}