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 useTranslation from 'next-translate/useTranslation' | ||||
| import setLanguage from 'next-translate/setLanguage' | ||||
| import classNames from 'classnames' | ||||
| import classNames from 'clsx' | ||||
|  | ||||
| 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) => { | ||||
|   const { children, className, ...rest } = props | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| import classNames from 'classnames' | ||||
| import classNames from 'clsx' | ||||
|  | ||||
| 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 | ||||
| theme/index.html | ||||
| 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" /> | ||||
|     <title><%= locals.basics.name %></title> | ||||
|     <link rel="icon" type="image/png" href="<%= locals.basics.image %>" /> | ||||
| 
 | ||||
|     <style> | ||||
|       @import './styles/global.css'; | ||||
|     </style> | ||||
|     <link rel="stylesheet" href="./styles/global.css" /> | ||||
|   </head> | ||||
|   <body> | ||||
|     <div class="container-fluid"> | ||||
| @@ -59,7 +56,7 @@ | ||||
|             <div class="background-details"> | ||||
|               <div class="detail" id="about"> | ||||
|                 <div class="icon"> | ||||
|                   <img src="data-url:./images/user.svg" alt="user" /> | ||||
|                   <img src="./images/user.svg" alt="user" /> | ||||
|                 </div> | ||||
|                 <div class="info"> | ||||
|                   <h4 class="title text-uppercase">À propos</h4> | ||||
| @@ -75,10 +72,7 @@ | ||||
| 
 | ||||
|               <div class="detail" id="work-experience"> | ||||
|                 <div class="icon"> | ||||
|                   <img | ||||
|                     src="data-url:./images/building-columns.svg" | ||||
|                     alt="work" | ||||
|                   /> | ||||
|                   <img src="./images/building-columns.svg" alt="work" /> | ||||
|                 </div> | ||||
|                 <div class="info"> | ||||
|                   <h4 class="title text-uppercase">Expériences</h4> | ||||
| @@ -117,7 +111,7 @@ | ||||
| 
 | ||||
|               <div class="detail" id="skills"> | ||||
|                 <div class="icon"> | ||||
|                   <img src="data-url:./images/toolbox.svg" alt="toolbox" /> | ||||
|                   <img src="./images/toolbox.svg" alt="toolbox" /> | ||||
|                 </div> | ||||
|                 <div class="info"> | ||||
|                   <h4 class="title text-uppercase">Compétences</h4> | ||||
| @@ -144,10 +138,7 @@ | ||||
| 
 | ||||
|               <div class="detail" id="education"> | ||||
|                 <div class="icon"> | ||||
|                   <img | ||||
|                     src="data-url:./images/graduation-cap.svg" | ||||
|                     alt="graduation" | ||||
|                   /> | ||||
|                   <img src="./images/graduation-cap.svg" alt="graduation" /> | ||||
|                 </div> | ||||
|                 <div class="info"> | ||||
|                   <h4 class="title text-uppercase">Éducation</h4> | ||||
| @@ -183,7 +174,7 @@ | ||||
| 
 | ||||
|               <div class="detail" id="interests"> | ||||
|                 <div class="icon"> | ||||
|                   <img src="data-url:./images/heart.svg" alt="heart" /> | ||||
|                   <img src="./images/heart.svg" alt="heart" /> | ||||
|                 </div> | ||||
|                 <div class="info"> | ||||
|                   <h4 class="title text-uppercase">Intérets</h4> | ||||
							
								
								
									
										5182
									
								
								jsonresume-theme-custom/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						| @@ -3,16 +3,18 @@ | ||||
|   "private": true, | ||||
|   "version": "1.0.0", | ||||
|   "type": "module", | ||||
|   "scripts": { | ||||
|     "dev": "vite", | ||||
|     "build": "vite build", | ||||
|     "preview": "vite preview" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "date-and-time": "2.4.0", | ||||
|     "ejs": "3.1.8", | ||||
|     "modern-normalize": "1.1.0" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "@parcel/config-default": "2.6.2", | ||||
|     "@parcel/core": "2.6.2", | ||||
|     "@parcel/optimizer-data-url": "2.6.2", | ||||
|     "@parcel/transformer-inline-string": "2.6.2", | ||||
|     "parcel": "2.6.2" | ||||
|     "@types/node": "18.6.2", | ||||
|     "date-and-time": "2.4.1", | ||||
|     "vite": "3.0.3", | ||||
|     "vite-plugin-html": "3.2.0" | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										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 { render } from '../index.js' | ||||
| import { build } from 'vite' | ||||
|  | ||||
| const jsonResumeURL = new URL('../../resume.json', import.meta.url) | ||||
| const publicResumeURL = new URL( | ||||
|   '../../public/curriculum-vitae.html', | ||||
| const jsonResumeThemeCustom = new URL('../', import.meta.url) | ||||
| const jsonResumeThemeCustomDist = new URL('./dist', jsonResumeThemeCustom) | ||||
| const publicResumeOutputURL = new URL( | ||||
|   '../../public/curriculum-vitae', | ||||
|   import.meta.url | ||||
| ) | ||||
|  | ||||
| const dataResumeStringJSON = await fs.promises.readFile(jsonResumeURL, { | ||||
|   encoding: 'utf-8' | ||||
| }) | ||||
| const dataResumeJSON = JSON.parse(dataResumeStringJSON) | ||||
| const dataResumeIndexHTML = await render(dataResumeJSON) | ||||
| await fs.promises.writeFile(publicResumeURL, dataResumeIndexHTML, { | ||||
|   encoding: 'utf-8' | ||||
| await build({ | ||||
|   root: fileURLToPath(jsonResumeThemeCustom) | ||||
| }) | ||||
|  | ||||
| console.log('Resume generated successfully!') | ||||
| console.log(`See it at ${publicResumeURL}`) | ||||
| await fs.promises.cp(jsonResumeThemeCustomDist, publicResumeOutputURL, { | ||||
|   recursive: true | ||||
| }) | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| @import 'npm:modern-normalize/modern-normalize.css'; | ||||
| @import 'modern-normalize/modern-normalize.css'; | ||||
| 
 | ||||
| body { | ||||
|   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", | ||||
|     "lint:commit": "commitlint", | ||||
|     "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:prettier": "prettier \".\" --check --ignore-path \".gitignore\"", | ||||
|     "lint:staged": "lint-staged", | ||||
| @@ -27,22 +27,21 @@ | ||||
|     "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\"", | ||||
|     "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", | ||||
|     "deploy": "vercel", | ||||
|     "postinstall": "husky install" | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@fontsource/montserrat": "4.5.11", | ||||
|     "@fortawesome/fontawesome-svg-core": "6.1.1", | ||||
|     "@fortawesome/free-brands-svg-icons": "6.1.1", | ||||
|     "@fortawesome/free-solid-svg-icons": "6.1.1", | ||||
|     "@fortawesome/fontawesome-svg-core": "6.1.2", | ||||
|     "@fortawesome/free-brands-svg-icons": "6.1.2", | ||||
|     "@fortawesome/free-solid-svg-icons": "6.1.2", | ||||
|     "@fortawesome/react-fontawesome": "0.2.0", | ||||
|     "classnames": "2.3.1", | ||||
|     "date-and-time": "2.4.0", | ||||
|     "clsx": "1.2.1", | ||||
|     "date-and-time": "2.4.1", | ||||
|     "gray-matter": "4.0.3", | ||||
|     "html-react-parser": "3.0.1", | ||||
|     "next": "12.2.3", | ||||
|     "next": "12.2.2", | ||||
|     "next-mdx-remote": "4.1.0", | ||||
|     "next-pwa": "5.5.4", | ||||
|     "next-themes": "0.2.0", | ||||
| @@ -69,16 +68,16 @@ | ||||
|     "@testing-library/jest-dom": "5.16.4", | ||||
|     "@testing-library/react": "13.3.0", | ||||
|     "@types/jest": "27.5.0", | ||||
|     "@types/node": "18.0.6", | ||||
|     "@types/node": "18.6.2", | ||||
|     "@types/react": "18.0.15", | ||||
|     "@types/unist": "2.0.6", | ||||
|     "@typescript-eslint/eslint-plugin": "5.30.7", | ||||
|     "@typescript-eslint/eslint-plugin": "5.31.0", | ||||
|     "autoprefixer": "10.4.7", | ||||
|     "cypress": "10.3.1", | ||||
|     "editorconfig-checker": "4.0.2", | ||||
|     "eslint": "8.20.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-plugin-import": "2.26.0", | ||||
|     "eslint-plugin-prettier": "4.2.1", | ||||
| @@ -89,16 +88,15 @@ | ||||
|     "jest": "27.5.1", | ||||
|     "jsonresume-theme-custom": "file:./jsonresume-theme-custom", | ||||
|     "lint-staged": "13.0.3", | ||||
|     "markdownlint-cli": "0.32.0", | ||||
|     "markdownlint-cli2": "0.5.0", | ||||
|     "next-secure-headers": "2.2.0", | ||||
|     "nodemon": "2.0.19", | ||||
|     "postcss": "8.4.14", | ||||
|     "prettier": "2.7.1", | ||||
|     "prettier-plugin-tailwindcss": "0.1.12", | ||||
|     "prettier-plugin-tailwindcss": "0.1.13", | ||||
|     "semantic-release": "19.0.3", | ||||
|     "start-server-and-test": "1.14.0", | ||||
|     "tailwindcss": "3.1.6", | ||||
|     "typescript": "4.7.4", | ||||
|     "vercel": "27.2.0" | ||||
|     "vercel": "27.3.0" | ||||
|   } | ||||
| } | ||||
|   | ||||