Skip to content

Commit a60175c

Browse files
committed
Update project configuration and dependencies
- Added .idea/ to .gitignore to exclude IDE-specific files. - Updated Dockerfile to remove the frozen lockfile option and added a test step. - Modified package.json to include new scripts for linting and testing, and added vitest as a dev dependency. - Updated GitHub Actions workflow to run tests before building the application. - Removed unnecessary .idea configuration files. This commit enhances the development workflow and ensures that the project is better organized.
1 parent 864dccd commit a60175c

11 files changed

Lines changed: 799 additions & 35 deletions

File tree

.github/workflows/lint.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,8 @@ jobs:
1616
- name: Install app dependencies
1717
run: yarn install
1818

19-
- name: Lint /app
20-
run: yarn lint
19+
- name: Tests
20+
run: yarn test
21+
22+
- name: Build Nuxt
23+
run: yarn build

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
node_modules
22
.nuxt
3+
.idea/
34
.env
45
.DS_Store
56
src/components/.DS_Store
7+
.output/

.idea/.gitignore

Lines changed: 0 additions & 5 deletions
This file was deleted.

.idea/modules.xml

Lines changed: 0 additions & 8 deletions
This file was deleted.

.idea/sesame-gestion-mdp.iml

Lines changed: 0 additions & 12 deletions
This file was deleted.

.idea/vcs.xml

Lines changed: 0 additions & 6 deletions
This file was deleted.

Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,16 @@ RUN apt-get update && apt-get -y --no-install-recommends upgrade && apt-get inst
2424

2525
COPY . .
2626

27+
# Pas de --frozen-lockfile : le yarn.lock est synchronisé depuis le dépôt après « make exec » puis « yarn install » (bind-mount).
2728
RUN yarn install \
2829
--prefer-offline \
29-
--frozen-lockfile \
3030
--non-interactive \
3131
--production=false
3232
# && yarn cache clean \
3333
# && yarn autoclean --init \
3434
# && yarn autoclean --force
3535

36+
RUN yarn test
3637
RUN yarn build
3738

3839
EXPOSE 3000

Makefile

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
# Ports hôte → conteneur (Nuxt écoute sur 3000 ; pas d’API dans ce dépôt)
2+
APP_WEB_PORT = 3002
3+
APP_WEB_PORT_SECURE = 3443
4+
5+
APP_WEB_DEBUG_PORT = 24678
6+
7+
IMG_NAME = ghcr.io/libertech-fr/sesame-gestion-mdp
8+
BASE_NAME = sesame
9+
APP_NAME = sesame-gestion-mdp
10+
# Volume dédié : évite de monter les node_modules du mac dans le conteneur Linux.
11+
# Flux : pas de yarn install sur le Mac — make exec puis yarn install / yarn add (lockfile + package.json sur l’hôte via le montage).
12+
# Puis make build | make dev | make test (Vitest) | make verify (tests + build Nuxt).
13+
NODE_MODULES_VOLUME = sesame-gestion-mdp-node-modules
14+
15+
-include .env
16+
17+
# Apple Silicon / ARM64 : images Linux arm64 natives. Sinon linux/amd64. Surcharge possible dans .env (PLATFORM=…).
18+
UNAME_M := $(shell uname -m 2>/dev/null || echo unknown)
19+
ifeq ($(origin PLATFORM),undefined)
20+
PLATFORM := $(if $(filter arm64 aarch64,$(UNAME_M)),linux/arm64,linux/amd64)
21+
endif
22+
23+
GIT_BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown)
24+
GIT_COMMIT ?= $(shell git rev-parse HEAD 2>/dev/null || echo unknown)
25+
DOCKER_TAG ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo unknown)
26+
27+
CERT_DIR = ./certificates
28+
COMMON_NAME = localhost
29+
DAYS_VALID = 365
30+
31+
SESAME_SENTRY_DSN ?=
32+
33+
$(shell mkdir -p $(CERT_DIR))
34+
35+
.PHONY: network-dev
36+
network-dev: ## Créer le réseau Docker « dev » s’il n’existe pas
37+
@docker network inspect dev >/dev/null 2>&1 || docker network create dev
38+
39+
.DEFAULT_GOAL := help
40+
help:
41+
@printf "\033[33mUsage:\033[0m\n make [target] [arg=\"val\"...]\n\n\033[33mTargets:\033[0m\n"
42+
@grep -h -E '^[-a-zA-Z0-9_\.\/]+:.*?## .*$$' $(MAKEFILE_LIST) \
43+
| sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-18s\033[0m %s\n", $$1, $$2}'
44+
45+
build: ## Image Docker (Dockerfile : yarn test puis yarn build ; pas de tests dans le script build)
46+
@docker build --platform $(PLATFORM) -t $(IMG_NAME) --no-cache --progress=plain \
47+
--build-arg BUILD_VERSION=$(DOCKER_TAG) \
48+
--build-arg GIT_BRANCH=$(GIT_BRANCH) \
49+
--build-arg GIT_COMMIT=$(GIT_COMMIT) \
50+
--build-arg DOCKER_TAG=$(DOCKER_TAG) \
51+
.
52+
53+
# Mode « simulation » : image déjà buildée, env + certificats montés (sans écraser tout le code par le bind-mount complet)
54+
simulation: network-dev ## Lancer en NODE_ENV=production avec montages ciblés (.env, certificats, hash)
55+
@touch $(CURDIR)/.env.hash
56+
@docker run --rm -it \
57+
-e NODE_ENV=production \
58+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
59+
-e GIT_BRANCH=$(GIT_BRANCH) \
60+
-e GIT_COMMIT=$(GIT_COMMIT) \
61+
-e DOCKER_TAG=$(DOCKER_TAG) \
62+
--add-host host.docker.internal:host-gateway \
63+
--platform $(PLATFORM) \
64+
--network dev \
65+
--name $(APP_NAME) \
66+
-e SESAME_SENTRY_DSN=$(SESAME_SENTRY_DSN) \
67+
-p $(APP_WEB_PORT):3000 \
68+
-p $(APP_WEB_PORT_SECURE):3443 \
69+
-v $(CURDIR)/.env:/data/.env \
70+
-v $(CURDIR)/certificates:/data/certificates \
71+
-v $(CURDIR)/.env.hash:/data/.env.hash \
72+
$(IMG_NAME) yarn start:prod
73+
74+
prod: network-dev ## Production : bind-mount du dépôt sur /data
75+
@docker run --rm -it \
76+
-e NODE_ENV=production \
77+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
78+
-e GIT_BRANCH=$(GIT_BRANCH) \
79+
-e GIT_COMMIT=$(GIT_COMMIT) \
80+
-e DOCKER_TAG=$(DOCKER_TAG) \
81+
--add-host host.docker.internal:host-gateway \
82+
--platform $(PLATFORM) \
83+
--network dev \
84+
--name $(APP_NAME) \
85+
-e SESAME_SENTRY_DSN=$(SESAME_SENTRY_DSN) \
86+
-p $(APP_WEB_PORT):3000 \
87+
-p $(APP_WEB_PORT_SECURE):3443 \
88+
-v $(CURDIR):/data \
89+
$(IMG_NAME) yarn start:prod
90+
91+
dev: network-dev ## Développement : nuxt dev (deps : make exec → yarn install / yarn add)
92+
@docker run --rm -it \
93+
-e NODE_ENV=development \
94+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
95+
-e GIT_BRANCH=$(GIT_BRANCH) \
96+
-e GIT_COMMIT=$(GIT_COMMIT) \
97+
-e DOCKER_TAG=$(DOCKER_TAG) \
98+
--add-host host.docker.internal:host-gateway \
99+
--platform $(PLATFORM) \
100+
--network dev \
101+
--name $(APP_NAME) \
102+
-e SESAME_SENTRY_DSN=$(SESAME_SENTRY_DSN) \
103+
-p $(APP_WEB_PORT):3000 \
104+
-p $(APP_WEB_PORT_SECURE):3443 \
105+
-v $(CURDIR):/data \
106+
-v $(NODE_MODULES_VOLUME):/data/node_modules \
107+
$(IMG_NAME) yarn dev
108+
109+
debug: network-dev ## Idem dev + inspecteur Node (9229) ; deps via make exec → yarn install / yarn add
110+
@docker run --rm -it \
111+
-e NODE_ENV=development \
112+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
113+
-e GIT_BRANCH=$(GIT_BRANCH) \
114+
-e GIT_COMMIT=$(GIT_COMMIT) \
115+
-e DOCKER_TAG=$(DOCKER_TAG) \
116+
--add-host host.docker.internal:host-gateway \
117+
--platform $(PLATFORM) \
118+
--network dev \
119+
--name $(APP_NAME) \
120+
-e SESAME_SENTRY_DSN=$(SESAME_SENTRY_DSN) \
121+
-p $(APP_WEB_PORT):3000 \
122+
-p $(APP_WEB_PORT_SECURE):3443 \
123+
-p 9229:9229 \
124+
-p $(APP_WEB_DEBUG_PORT):24678 \
125+
-v $(CURDIR):/data \
126+
-v $(NODE_MODULES_VOLUME):/data/node_modules \
127+
$(IMG_NAME) sh -lc 'NODE_OPTIONS="--inspect=0.0.0.0:9229" yarn dev'
128+
129+
exec: network-dev ## Shell : yarn install, yarn add [-D] <pkg>, yarn remove… (package.json / lock sur l’hôte ; node_modules dans le volume)
130+
@docker run -it --rm \
131+
-e NODE_ENV=development \
132+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
133+
--add-host host.docker.internal:host-gateway \
134+
--platform $(PLATFORM) \
135+
--network dev \
136+
-e SESAME_SENTRY_DSN=$(SESAME_SENTRY_DSN) \
137+
-v $(CURDIR):/data \
138+
-v $(NODE_MODULES_VOLUME):/data/node_modules \
139+
$(IMG_NAME) bash
140+
141+
stop: ## Arrêter le conteneur applicatif
142+
@docker stop $(APP_NAME) || true
143+
144+
stop-all: ## Arrêter le conteneur applicatif (équivalent ici, pas de stack BDD dans ce dépôt)
145+
@docker stop $(APP_NAME) || true
146+
147+
run-lint: ## Rejouer le job GitHub Actions « lint-app » avec act (nécessite nektos/act)
148+
act --container-architecture=linux/amd64 -j lint-app
149+
150+
test: network-dev ## Tests : nuxt prepare + Vitest (pas de build Nuxt — voir make verify)
151+
@docker run --rm \
152+
-e NODE_ENV=development \
153+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
154+
--platform $(PLATFORM) \
155+
--network dev \
156+
-v $(CURDIR):/data \
157+
-v $(NODE_MODULES_VOLUME):/data/node_modules \
158+
-w /data \
159+
$(IMG_NAME) yarn test
160+
161+
verify: network-dev ## CI locale : yarn test puis yarn build (comme le workflow GitHub)
162+
@docker run --rm \
163+
-e NODE_ENV=development \
164+
-e NODE_TLS_REJECT_UNAUTHORIZED=0 \
165+
--platform $(PLATFORM) \
166+
--network dev \
167+
-v $(CURDIR):/data \
168+
-v $(NODE_MODULES_VOLUME):/data/node_modules \
169+
-w /data \
170+
$(IMG_NAME) sh -lc 'yarn test && yarn build'
171+
172+
ncu: ## Vérifier les mises à jour des dépendances
173+
@npx npm-check-updates
174+
175+
ncu-upgrade: ## Mettre à jour package.json vers les dernières versions
176+
@npx npm-check-updates -u
177+
178+
generate-ssl-cert: ## Générer les certificats HTTPS auto-signés
179+
@echo "Génération des certificats HTTPS auto-signés..."
180+
@openssl req -x509 \
181+
-newkey rsa:4096 \
182+
-keyout $(CERT_DIR)/server.key \
183+
-out $(CERT_DIR)/server.crt \
184+
-days $(DAYS_VALID) \
185+
-nodes \
186+
-subj "/CN=$(COMMON_NAME)"
187+
@chmod 600 $(CERT_DIR)/server.key
188+
@chmod 644 $(CERT_DIR)/server.crt
189+
@echo "Certificats générés avec succès dans $(CERT_DIR)"
190+
191+
clean-ssl-cert: ## Supprimer les certificats HTTPS locaux
192+
@rm -rf $(CERT_DIR)
193+
@echo "Certificats supprimés"
194+
195+
show-cert-info: ## Afficher les infos du certificat
196+
@openssl x509 -in $(CERT_DIR)/server.crt -text -noout
197+
198+
hibp-key-hex: ## Générer une clé 32 octets (64 caractères hex)
199+
@printf "SESAME_PASSWORD_HISTORY_HIBP_KEY=%s\n" "$$(openssl rand -hex 32)"
200+
201+
hibp-key-b64: ## Générer une clé 32 octets (base64)
202+
@printf "SESAME_PASSWORD_HISTORY_HIBP_KEY=%s\n" "$$(openssl rand -base64 32)"

package.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@
44
"type": "module",
55
"scripts": {
66
"build": "nuxt build",
7-
"dev": "nuxt dev",
7+
"dev": "nuxt dev --host 0.0.0.0",
8+
"lint": "yarn nuxt prepare",
9+
"test:unit": "yarn vitest run",
10+
"test": "yarn lint && yarn test:unit",
11+
"ci": "yarn test && yarn build",
812
"generate": "nuxt generate",
913
"preview": "nuxt preview",
1014
"postinstall": "nuxt prepare",
1115
"start:prod": "node start.mjs",
1216
"start": "node .output/server/index.mjs"
1317
},
18+
"devDependencies": {
19+
"vitest": "^3.2.4"
20+
},
1421
"dependencies": {
1522
"@nuxt-alt/proxy": "^2.5.8",
1623
"@quasar/extras": "^1.16.12",

vitest.config.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from 'vitest/config'
2+
3+
export default defineConfig({
4+
test: {
5+
environment: 'node',
6+
include: ['tests/**/*.spec.ts'],
7+
},
8+
})

0 commit comments

Comments
 (0)