chore: easier development for jsonresume-theme-custom thanks to vite
11
.markdownlint-cli2.jsonc
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"config": {
|
||||||
|
"default": true,
|
||||||
|
"MD013": false,
|
||||||
|
"MD024": false,
|
||||||
|
"MD033": false,
|
||||||
|
"MD041": false
|
||||||
|
},
|
||||||
|
"globs": ["**/*.{md,mdx}"],
|
||||||
|
"ignores": ["**/node_modules"]
|
||||||
|
}
|
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"default": true,
|
|
||||||
"MD013": false,
|
|
||||||
"MD024": false,
|
|
||||||
"MD033": false,
|
|
||||||
"MD041": false
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
import { useCallback, useEffect, useState, useRef } from 'react'
|
import { useCallback, useEffect, useState, useRef } from 'react'
|
||||||
import useTranslation from 'next-translate/useTranslation'
|
import useTranslation from 'next-translate/useTranslation'
|
||||||
import setLanguage from 'next-translate/setLanguage'
|
import setLanguage from 'next-translate/setLanguage'
|
||||||
import classNames from 'classnames'
|
import classNames from 'clsx'
|
||||||
|
|
||||||
import i18n from 'i18n.json'
|
import i18n from 'i18n.json'
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import classNames from 'classnames'
|
import classNames from 'clsx'
|
||||||
|
|
||||||
export const Icon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {
|
export const Icon: React.FC<React.SVGProps<SVGSVGElement>> = (props) => {
|
||||||
const { children, className, ...rest } = props
|
const { children, className, ...rest } = props
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import classNames from 'classnames'
|
import classNames from 'clsx'
|
||||||
|
|
||||||
type ShadowContainerProps = React.ComponentPropsWithRef<'div'>
|
type ShadowContainerProps = React.ComponentPropsWithRef<'div'>
|
||||||
|
|
||||||
|
22
jsonresume-theme-custom/.gitignore
vendored
@ -1,4 +1,22 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
theme/index.html
|
|
||||||
dist
|
dist
|
||||||
.parcel-cache
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
Before Width: | Height: | Size: 1015 B After Width: | Height: | Size: 1015 B |
Before Width: | Height: | Size: 986 B After Width: | Height: | Size: 986 B |
Before Width: | Height: | Size: 629 B After Width: | Height: | Size: 629 B |
Before Width: | Height: | Size: 912 B After Width: | Height: | Size: 912 B |
Before Width: | Height: | Size: 528 B After Width: | Height: | Size: 528 B |
@ -5,10 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<title><%= locals.basics.name %></title>
|
<title><%= locals.basics.name %></title>
|
||||||
<link rel="icon" type="image/png" href="<%= locals.basics.image %>" />
|
<link rel="icon" type="image/png" href="<%= locals.basics.image %>" />
|
||||||
|
<link rel="stylesheet" href="./styles/global.css" />
|
||||||
<style>
|
|
||||||
@import './styles/global.css';
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
@ -59,7 +56,7 @@
|
|||||||
<div class="background-details">
|
<div class="background-details">
|
||||||
<div class="detail" id="about">
|
<div class="detail" id="about">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<img src="data-url:./images/user.svg" alt="user" />
|
<img src="./images/user.svg" alt="user" />
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h4 class="title text-uppercase">À propos</h4>
|
<h4 class="title text-uppercase">À propos</h4>
|
||||||
@ -75,10 +72,7 @@
|
|||||||
|
|
||||||
<div class="detail" id="work-experience">
|
<div class="detail" id="work-experience">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<img
|
<img src="./images/building-columns.svg" alt="work" />
|
||||||
src="data-url:./images/building-columns.svg"
|
|
||||||
alt="work"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h4 class="title text-uppercase">Expériences</h4>
|
<h4 class="title text-uppercase">Expériences</h4>
|
||||||
@ -117,7 +111,7 @@
|
|||||||
|
|
||||||
<div class="detail" id="skills">
|
<div class="detail" id="skills">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<img src="data-url:./images/toolbox.svg" alt="toolbox" />
|
<img src="./images/toolbox.svg" alt="toolbox" />
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h4 class="title text-uppercase">Compétences</h4>
|
<h4 class="title text-uppercase">Compétences</h4>
|
||||||
@ -144,10 +138,7 @@
|
|||||||
|
|
||||||
<div class="detail" id="education">
|
<div class="detail" id="education">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<img
|
<img src="./images/graduation-cap.svg" alt="graduation" />
|
||||||
src="data-url:./images/graduation-cap.svg"
|
|
||||||
alt="graduation"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h4 class="title text-uppercase">Éducation</h4>
|
<h4 class="title text-uppercase">Éducation</h4>
|
||||||
@ -183,7 +174,7 @@
|
|||||||
|
|
||||||
<div class="detail" id="interests">
|
<div class="detail" id="interests">
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<img src="data-url:./images/heart.svg" alt="heart" />
|
<img src="./images/heart.svg" alt="heart" />
|
||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<h4 class="title text-uppercase">Intérets</h4>
|
<h4 class="title text-uppercase">Intérets</h4>
|
5182
jsonresume-theme-custom/package-lock.json
generated
@ -3,16 +3,18 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"date-and-time": "2.4.0",
|
|
||||||
"ejs": "3.1.8",
|
|
||||||
"modern-normalize": "1.1.0"
|
"modern-normalize": "1.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@parcel/config-default": "2.6.2",
|
"@types/node": "18.6.2",
|
||||||
"@parcel/core": "2.6.2",
|
"date-and-time": "2.4.1",
|
||||||
"@parcel/optimizer-data-url": "2.6.2",
|
"vite": "3.0.3",
|
||||||
"@parcel/transformer-inline-string": "2.6.2",
|
"vite-plugin-html": "3.2.0"
|
||||||
"parcel": "2.6.2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
118
jsonresume-theme-custom/resume.json
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
|
||||||
|
"meta": {
|
||||||
|
"theme": "custom"
|
||||||
|
},
|
||||||
|
"basics": {
|
||||||
|
"name": "Théo LUDWIG",
|
||||||
|
"label": "Développeur Full Stack Junior • Passionné de High-Tech",
|
||||||
|
"image": "https://divlo.fr/images/logo_orange.png",
|
||||||
|
"email": "contact@divlo.fr",
|
||||||
|
"location": {},
|
||||||
|
"url": "https://divlo.fr",
|
||||||
|
"summary": "Je me forme en autodidacte dans l'informatique en suivant des formations en ligne et je suis aussi un étudiant à l'université suivant la formation \"BUT Informatique\" (première année). <br/> Je mets en pratique tout ce que j'apprends et réalise de nombreux projets."
|
||||||
|
},
|
||||||
|
"education": [
|
||||||
|
{
|
||||||
|
"startDate": "2022",
|
||||||
|
"studyType": "Diplôme du Bachelor Universitaire de Technologie (BUT) Informatique",
|
||||||
|
"institution": "IUT Robert Schuman à Illkirch-Graffenstaden",
|
||||||
|
"score": "En cours"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"startDate": "2019",
|
||||||
|
"endDate": "2021",
|
||||||
|
"studyType": "Diplôme du Baccalauréat Général (Mathématiques et Numériques Sciences Informatiques)",
|
||||||
|
"institution": "Lycée Heinrich Nessel à Haguenau",
|
||||||
|
"score": "Mention Assez Bien"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"startDate": "2014",
|
||||||
|
"endDate": "2018",
|
||||||
|
"studyType": "Diplôme national du brevet",
|
||||||
|
"institution": "Collège Gustave Doré à Hochfelden",
|
||||||
|
"score": "Mention Bien"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"work": [
|
||||||
|
{
|
||||||
|
"summary": "Développement site web en React.js et Strapi afin de répondre <a href=\"https://www.nuitdelinfo.com/nuitinfo/_media/infos:la_nuit_de_l_info_2021_-_sujet.pdf\">au sujet de la Nuit de l'Info 2021</a>.<br /> TOP 1 France: Défi de l'entreprise <a href=\"https://www.nuitdelinfo.com/inscription/defis/300\">ToolPad</a>.",
|
||||||
|
"website": "https://www.nuitdelinfo.com/",
|
||||||
|
"name": "La Nuit de l'info 2021",
|
||||||
|
"position": "Participation avec l'équipe <a href=\"https://www.nuitdelinfo.com/inscription/equipes/46\">Who are We</a>",
|
||||||
|
"startDate": "2021-12-02",
|
||||||
|
"endDate": "2021-12-03"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"summary": "Agent administratif en vue de faire face au sucroît temporaire d'activités liés à la numérisation des plans des postes sources <br /> actuellement sous format papier calque suite à la libération des locaux des archives.",
|
||||||
|
"website": "https://www.es.fr/",
|
||||||
|
"name": "ÉS (Électricité de Strasbourg)",
|
||||||
|
"location": "5 Rue André Marie Ampère, 67450 Mundolsheim",
|
||||||
|
"position": "Emploi d'été en qualité d'agent administratif",
|
||||||
|
"startDate": "2021-07-07",
|
||||||
|
"endDate": "2021-07-30"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"summary": "Hackathon développement d'une landing page et web scraping.",
|
||||||
|
"website": "https://www.wildcodeschool.fr/",
|
||||||
|
"name": "Wild Code School",
|
||||||
|
"location": "32 Rue du Bass. d'Austerlitz, 67100 Strasbourg",
|
||||||
|
"position": "Stage initiation métier développeur web",
|
||||||
|
"startDate": "2019-06-24",
|
||||||
|
"endDate": "2019-06-28"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"summary": "Développement d'un site web pour trouver un restaurant à la pause repas.",
|
||||||
|
"website": "https://www.itpartners.fr/",
|
||||||
|
"name": "Tribe | IT Partners",
|
||||||
|
"location": "16 Rue du Parc, 67205 Oberhausbergen",
|
||||||
|
"position": "Stage initiation métier développeur web",
|
||||||
|
"startDate": "2019-06-17",
|
||||||
|
"endDate": "2019-06-21"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"summary": "Apprentissage du métier \"Chargé de communication\" et des logiciels de graphisme tels que \"Adobe Photoshop\".",
|
||||||
|
"website": "https://www.es.fr/",
|
||||||
|
"name": "ÉS (Électricité de Strasbourg)",
|
||||||
|
"location": "26 Bd du Président-Wilson, 67000 Strasbourg",
|
||||||
|
"position": "Stage de découverte (3ème)",
|
||||||
|
"startDate": "2018-02-19",
|
||||||
|
"endDate": "2018-02-23"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"interests": [
|
||||||
|
{
|
||||||
|
"name": "Développeur Full Stack Junior"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Passionné de High-Tech"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Enthousiaste de l'Open-Source"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"skills": [
|
||||||
|
{
|
||||||
|
"keywords": ["JavaScript", "TypeScript", "Python", "C/C++"],
|
||||||
|
"name": "Langages de programmation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keywords": ["HTML", "CSS", "Tailwind CSS", "React.js (+ Next.js)"],
|
||||||
|
"name": "Front-end"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keywords": ["Node.js", "Fastify", "PostgreSQL", "MySQL"],
|
||||||
|
"name": "Back-end"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keywords": [
|
||||||
|
"GNU/Linux",
|
||||||
|
"Ubuntu",
|
||||||
|
"Visual Studio Code",
|
||||||
|
"git",
|
||||||
|
"Docker"
|
||||||
|
],
|
||||||
|
"name": "Logiciels et outils"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,21 +1,19 @@
|
|||||||
|
import { fileURLToPath } from 'node:url'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
|
|
||||||
import { render } from '../index.js'
|
import { build } from 'vite'
|
||||||
|
|
||||||
const jsonResumeURL = new URL('../../resume.json', import.meta.url)
|
const jsonResumeThemeCustom = new URL('../', import.meta.url)
|
||||||
const publicResumeURL = new URL(
|
const jsonResumeThemeCustomDist = new URL('./dist', jsonResumeThemeCustom)
|
||||||
'../../public/curriculum-vitae.html',
|
const publicResumeOutputURL = new URL(
|
||||||
|
'../../public/curriculum-vitae',
|
||||||
import.meta.url
|
import.meta.url
|
||||||
)
|
)
|
||||||
|
|
||||||
const dataResumeStringJSON = await fs.promises.readFile(jsonResumeURL, {
|
await build({
|
||||||
encoding: 'utf-8'
|
root: fileURLToPath(jsonResumeThemeCustom)
|
||||||
})
|
|
||||||
const dataResumeJSON = JSON.parse(dataResumeStringJSON)
|
|
||||||
const dataResumeIndexHTML = await render(dataResumeJSON)
|
|
||||||
await fs.promises.writeFile(publicResumeURL, dataResumeIndexHTML, {
|
|
||||||
encoding: 'utf-8'
|
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log('Resume generated successfully!')
|
await fs.promises.cp(jsonResumeThemeCustomDist, publicResumeOutputURL, {
|
||||||
console.log(`See it at ${publicResumeURL}`)
|
recursive: true
|
||||||
|
})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
@import 'npm:modern-normalize/modern-normalize.css';
|
@import 'modern-normalize/modern-normalize.css';
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: 'Montserrat', 'Arial', 'sans-serif';
|
font-family: 'Montserrat', 'Arial', 'sans-serif';
|
33
jsonresume-theme-custom/vite.config.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import fs from 'node:fs'
|
||||||
|
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import { createHtmlPlugin } from 'vite-plugin-html'
|
||||||
|
import date from 'date-and-time'
|
||||||
|
|
||||||
|
const jsonResumeURL = new URL('./resume.json', import.meta.url)
|
||||||
|
const dataResumeStringJSON = await fs.promises.readFile(jsonResumeURL, {
|
||||||
|
encoding: 'utf-8'
|
||||||
|
})
|
||||||
|
const resume = JSON.parse(dataResumeStringJSON)
|
||||||
|
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
build: {
|
||||||
|
assetsDir: './'
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
createHtmlPlugin({
|
||||||
|
inject: {
|
||||||
|
data: {
|
||||||
|
date,
|
||||||
|
locals: {
|
||||||
|
...resume
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
],
|
||||||
|
css: {
|
||||||
|
postcss: {}
|
||||||
|
}
|
||||||
|
})
|
6403
package-lock.json
generated
28
package.json
@ -17,7 +17,7 @@
|
|||||||
"export": "next export",
|
"export": "next export",
|
||||||
"lint:commit": "commitlint",
|
"lint:commit": "commitlint",
|
||||||
"lint:editorconfig": "editorconfig-checker",
|
"lint:editorconfig": "editorconfig-checker",
|
||||||
"lint:markdown": "markdownlint \"**/*.{md,mdx}\" --dot --ignore-path \".gitignore\"",
|
"lint:markdown": "markdownlint-cli2",
|
||||||
"lint:typescript": "eslint \"**/*.{js,jsx,ts,tsx}\"",
|
"lint:typescript": "eslint \"**/*.{js,jsx,ts,tsx}\"",
|
||||||
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"",
|
"lint:prettier": "prettier \".\" --check --ignore-path \".gitignore\"",
|
||||||
"lint:staged": "lint-staged",
|
"lint:staged": "lint-staged",
|
||||||
@ -27,22 +27,21 @@
|
|||||||
"test:e2e": "start-server-and-test \"start\" \"http://localhost:3000\" \"cypress run\"",
|
"test:e2e": "start-server-and-test \"start\" \"http://localhost:3000\" \"cypress run\"",
|
||||||
"test:e2e:dev": "start-server-and-test \"dev\" \"http://localhost:3000\" \"cypress open\"",
|
"test:e2e:dev": "start-server-and-test \"dev\" \"http://localhost:3000\" \"cypress open\"",
|
||||||
"resume:build": "node ./jsonresume-theme-custom/scripts/build.js",
|
"resume:build": "node ./jsonresume-theme-custom/scripts/build.js",
|
||||||
"resume:dev": "nodemon ./jsonresume-theme-custom/scripts/build.js --watch ./jsonresume-theme-custom/theme -e js,css,ejs",
|
|
||||||
"release": "semantic-release",
|
"release": "semantic-release",
|
||||||
"deploy": "vercel",
|
"deploy": "vercel",
|
||||||
"postinstall": "husky install"
|
"postinstall": "husky install"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/montserrat": "4.5.11",
|
"@fontsource/montserrat": "4.5.11",
|
||||||
"@fortawesome/fontawesome-svg-core": "6.1.1",
|
"@fortawesome/fontawesome-svg-core": "6.1.2",
|
||||||
"@fortawesome/free-brands-svg-icons": "6.1.1",
|
"@fortawesome/free-brands-svg-icons": "6.1.2",
|
||||||
"@fortawesome/free-solid-svg-icons": "6.1.1",
|
"@fortawesome/free-solid-svg-icons": "6.1.2",
|
||||||
"@fortawesome/react-fontawesome": "0.2.0",
|
"@fortawesome/react-fontawesome": "0.2.0",
|
||||||
"classnames": "2.3.1",
|
"clsx": "1.2.1",
|
||||||
"date-and-time": "2.4.0",
|
"date-and-time": "2.4.1",
|
||||||
"gray-matter": "4.0.3",
|
"gray-matter": "4.0.3",
|
||||||
"html-react-parser": "3.0.1",
|
"html-react-parser": "3.0.1",
|
||||||
"next": "12.2.3",
|
"next": "12.2.2",
|
||||||
"next-mdx-remote": "4.1.0",
|
"next-mdx-remote": "4.1.0",
|
||||||
"next-pwa": "5.5.4",
|
"next-pwa": "5.5.4",
|
||||||
"next-themes": "0.2.0",
|
"next-themes": "0.2.0",
|
||||||
@ -69,16 +68,16 @@
|
|||||||
"@testing-library/jest-dom": "5.16.4",
|
"@testing-library/jest-dom": "5.16.4",
|
||||||
"@testing-library/react": "13.3.0",
|
"@testing-library/react": "13.3.0",
|
||||||
"@types/jest": "27.5.0",
|
"@types/jest": "27.5.0",
|
||||||
"@types/node": "18.0.6",
|
"@types/node": "18.6.2",
|
||||||
"@types/react": "18.0.15",
|
"@types/react": "18.0.15",
|
||||||
"@types/unist": "2.0.6",
|
"@types/unist": "2.0.6",
|
||||||
"@typescript-eslint/eslint-plugin": "5.30.7",
|
"@typescript-eslint/eslint-plugin": "5.31.0",
|
||||||
"autoprefixer": "10.4.7",
|
"autoprefixer": "10.4.7",
|
||||||
"cypress": "10.3.1",
|
"cypress": "10.3.1",
|
||||||
"editorconfig-checker": "4.0.2",
|
"editorconfig-checker": "4.0.2",
|
||||||
"eslint": "8.20.0",
|
"eslint": "8.20.0",
|
||||||
"eslint-config-conventions": "3.0.0",
|
"eslint-config-conventions": "3.0.0",
|
||||||
"eslint-config-next": "12.2.3",
|
"eslint-config-next": "12.2.2",
|
||||||
"eslint-config-prettier": "8.5.0",
|
"eslint-config-prettier": "8.5.0",
|
||||||
"eslint-plugin-import": "2.26.0",
|
"eslint-plugin-import": "2.26.0",
|
||||||
"eslint-plugin-prettier": "4.2.1",
|
"eslint-plugin-prettier": "4.2.1",
|
||||||
@ -89,16 +88,15 @@
|
|||||||
"jest": "27.5.1",
|
"jest": "27.5.1",
|
||||||
"jsonresume-theme-custom": "file:./jsonresume-theme-custom",
|
"jsonresume-theme-custom": "file:./jsonresume-theme-custom",
|
||||||
"lint-staged": "13.0.3",
|
"lint-staged": "13.0.3",
|
||||||
"markdownlint-cli": "0.32.0",
|
"markdownlint-cli2": "0.5.0",
|
||||||
"next-secure-headers": "2.2.0",
|
"next-secure-headers": "2.2.0",
|
||||||
"nodemon": "2.0.19",
|
|
||||||
"postcss": "8.4.14",
|
"postcss": "8.4.14",
|
||||||
"prettier": "2.7.1",
|
"prettier": "2.7.1",
|
||||||
"prettier-plugin-tailwindcss": "0.1.12",
|
"prettier-plugin-tailwindcss": "0.1.13",
|
||||||
"semantic-release": "19.0.3",
|
"semantic-release": "19.0.3",
|
||||||
"start-server-and-test": "1.14.0",
|
"start-server-and-test": "1.14.0",
|
||||||
"tailwindcss": "3.1.6",
|
"tailwindcss": "3.1.6",
|
||||||
"typescript": "4.7.4",
|
"typescript": "4.7.4",
|
||||||
"vercel": "27.2.0"
|
"vercel": "27.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|