From af175e078c97de1834f160b1e207c16ef13c75f8 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 30 Apr 2026 14:39:38 +0200 Subject: [PATCH] feature: cleanup helloWorld, focus event nomme, tests extractProjectName --- package-lock.json | 4 +-- package.json | 6 +--- src/extension.ts | 10 ++---- src/test/extension.test.ts | 45 +++++++++++++++++++++------ todo.txt | 62 ++++++-------------------------------- 5 files changed, 50 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index 65b34a3..7e0f234 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "vscodestat", - "version": "1.1.161", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "vscodestat", - "version": "1.1.161", + "version": "1.2.0", "license": "ISC", "devDependencies": { "@types/mocha": "^10.0.10", diff --git a/package.json b/package.json index 8856540..abdafcf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vscodestat", "displayName": "vscodestat", - "version": "1.1.161", + "version": "1.2.0", "description": "", "categories": [ "Other" @@ -25,10 +25,6 @@ }, "contributes": { "commands": [ - { - "command": "vscodestat.helloWorld", - "title": "Hello World" - }, { "command": "vscodestat.setUrl", "title": "setUrl" diff --git a/src/extension.ts b/src/extension.ts index 96ba009..f3e039d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,12 +3,6 @@ import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { console.log('Congratulations, your extension "vscodestat" is now active!'); - // crée une commande de test - const disposable = vscode.commands.registerCommand('vscodestat.helloWorld', () => { - vscode.window.showInformationMessage('Hello World from vscodestat!'); - }); - context.subscriptions.push(disposable); - // commande pour definir l'url const disposable2 = vscode.commands.registerCommand('vscodestat.setUrl', async () => { const url = await vscode.window.showInputBox({ @@ -58,7 +52,7 @@ export function activate(context: vscode.ExtensionContext) { // detecte un focus / blur de la fenetre vscode vscode.window.onDidChangeWindowState(async event => { console.log('Window state changed:', event.focused); - await makeHttpRequest({ focus: event.focused }); + await makeHttpRequest({ event: 'focus', focused: event.focused }); }); } @@ -69,7 +63,7 @@ export function deactivate() { } * /root/docker/monitoringserver/controller/homeController.js * => monitoringserver */ -function extractProjectName(path: string) { +export function extractProjectName(path: string) { // des c'est l'un des fois l'autre ? // /root/docker/vscodestat/src/extension.ts // \root\docker\vscodestat\src\extension.ts diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts index 4ca0ab4..463cf9b 100644 --- a/src/test/extension.test.ts +++ b/src/test/extension.test.ts @@ -1,15 +1,40 @@ import * as assert from 'assert'; +import { extractProjectName } from '../extension.js'; -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -import * as vscode from 'vscode'; -// import * as myExtension from '../../extension'; +suite('extractProjectName', () => { + test('extrait le nom de projet depuis un path Linux /root/docker/X', () => { + assert.strictEqual( + extractProjectName('/root/docker/vscodestat/src/extension.ts'), + 'vscodestat' + ); + }); -suite('Extension Test Suite', () => { - vscode.window.showInformationMessage('Start all tests.'); + test('extrait le nom de projet depuis un path Windows \\root\\docker\\X', () => { + assert.strictEqual( + extractProjectName('C:\\root\\docker\\monitoringserver\\controller\\homeController.js'), + 'monitoringserver' + ); + }); - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)); - assert.strictEqual(-1, [1, 2, 3].indexOf(0)); - }); + test('retourne null pour un path hors /docker/', () => { + assert.strictEqual(extractProjectName('/home/user/projet/file.js'), null); + }); + + test('retourne null pour un path vide', () => { + assert.strictEqual(extractProjectName(''), null); + }); + + test('extrait correctement quand le chemin contient docker plusieurs fois', () => { + assert.strictEqual( + extractProjectName('/root/docker/flatbay/lib/docker/foo.js'), + 'flatbay' + ); + }); + + test('gere les paths avec tirets et chiffres', () => { + assert.strictEqual( + extractProjectName('/root/docker/gextra6/bin/console'), + 'gextra6' + ); + }); }); diff --git a/todo.txt b/todo.txt index 8e5e1f3..8ba87d1 100644 --- a/todo.txt +++ b/todo.txt @@ -8,7 +8,6 @@ l'activite du user dans VSCode : - focus/blur de la fenetre (event 'focus') Envoie un POST JSON a la URL configuree (`vscodestat.url`). -113 lignes TypeScript, version 1.1.159 (vsix 1.1.141 commit). NB : extension force-installed dans les containers vscode + vscodeluigi (cf vscode/todo.txt). C'est l'extension de monitoring activite dev. @@ -29,7 +28,7 @@ SECURITE session, user peut tweak. A documenter le comportement. [ ] makeHttpRequest envoie au serveur l'event sans auth (RGPD) - src/extension.ts:97-118 : `fetch(url, { method: 'POST', + src/extension.ts : `fetch(url, { method: 'POST', headers: ..., body: JSON.stringify(json) })`. Pas de token. Cote serveur (cf monitoringserver/todo.txt), `/vscodestat` est aussi sans auth => tout le monde peut envoyer des metriques. @@ -40,7 +39,7 @@ SECURITE : doit etre dans le declaration des traitements RH. [ ] extractProjectName fuite des paths potentiellement sensibles - src/extension.ts:73-81 : + src/extension.ts : const match = path.match(/\/docker\/([^/]+)/); if (match) return match[1]; Si un user ouvre un fichier hors `/docker/X/...`, le @@ -48,13 +47,6 @@ SECURITE envoye. Pas un leak direct, mais combine au tracking precis, profile complet de l'activite hors-projet. -[ ] Pas de cap sur la frequence des events - src/extension.ts:39-49 : `onDidChangeActiveTextEditor` => - chaque alt-tab entre fichiers => 1 POST. Si user est tres - actif, 100+ POST par minute. Pas de debounce. Cote - monitoringserver, idem aucun rate-limit (cf monitoringserver/ - todo.txt). Risque d'epuisement bande passante / spam serveur. - [ ] Le user peut DISABLE l'extension volontairement Standard VSCode : un user peut desactiver toute extension. Le force-install au boot du container la re-active, mais @@ -68,77 +60,43 @@ SECURITE BUGS / FRAGILITE ---------------- -[ ] vscodestat-1.1.141.vsix commit dans le repo mais version 1.1.159 - package.json:4 : "version": "1.1.159" mais le vsix commit est - 1.1.141. Decalage. Si on installe le vsix, c'est l'ancienne - version qui est appliquee (vscode/bin/entrypoint.sh:25 : - `code-server --install-extension /opt/vsix/vscodestat.vsix`). - A rebuild + republier le vsix avec la version courante. - [ ] /opt/vsix/vscodestat.vsix : binaire du dossier autre Cf vscode/todo.txt. Le vsix est COPIE dans l'image vscode (Dockerfile:48). Si le vsix de ce repo est modifie mais pas rebuild dans vscode/, decalage permanent. -[ ] event 'open' sur changement d'onglet, pas vraie ouverture - src/extension.ts:39 : `onDidChangeActiveTextEditor`. Fire - aussi sur le simple alt-tab entre 2 fichiers deja ouverts. - Donc l'event 'open' est mal nomme (en realite "focus de tab"). - A renommer 'tab_focus' ou similar. - -[ ] event 'focus' sans event name - src/extension.ts:55 : `await makeHttpRequest({ focus: event. - focused })`. Pas de `event: 'focus'`. Cote serveur, comment - distinguer ? Cf monitoringserver/homeController.js:78 : - `eventName: req.body.name`. Donc le `focus` event ne match - pas la convention serveur. - [ ] Pas de batching Chaque event = 1 fetch. Pas de queue + flush periodique. Si reseau down, perte d'events (pas de retry). A capper. [ ] makeHttpRequest catch silencieux - src/extension.ts:114-117 : catch + console.error. Pas de + src/extension.ts : catch + console.error. Pas de retry, pas de notification user. Si serveur down, events perdus. [ ] extractProjectName : path Windows hardcode au regex - src/extension.ts:79-80 : replace `\\` -> `/` puis match + src/extension.ts : replace `\\` -> `/` puis match `/docker/(...)/`. OK pour les conventions /root/docker, mais si project hors `docker/`, retourne null. A clarifier. -[ ] Pas de tests unitaires sur extractProjectName - Function pure, faciles a tester. Pas de tests dans src/test/ - visible. A check. - CODE MORT / POLLUTION --------------------- -[ ] vscodestat-1.1.141.vsix commit - Binaire commit dans git. A scrub si rebuild a chaque release. - -[ ] vscodestat.helloWorld command - src/extension.ts:7-10. Demo command standard de yeoman. - Inutile en prod. A delete. +[ ] vscodestat-1.1.X.vsix commit + Binaire commit dans git. A scrub si rebuild a chaque release + (drone publie deja sur Gitea, le vsix repo n'est utilise que + pour le `cp` vers vscode/). Decision : soit on automatise le + cp via un wget Gitea dans vscode/README, soit on le garde a + jour manuellement. CONVENTIONS ----------- -[ ] Mauvaise pratique : version vsix decalee - 1.1.141 vs 1.1.159 dans package.json. - [ ] Pas de README detaille sur l'integration serveur README mentionne juste "Sample url". A documenter le format JSON envoye et le comportement. DECISION SUGGEREE ----------------- -[ ] Rebuild + republier le vsix a la version courante - Production decalee de 18 versions (1.1.141 vs 1.1.159). - [ ] Documenter le scope RGPD du tracking Si l'extension force-installed est obligatoire pour tracker l'activite des employes (Thomas, Luigi), declaration RGPD requise (RGPD art 13). - -[ ] Considerer un rate-limit cote client - Debounce sur onDidChangeActiveTextEditor (ex: 1s) pour - eviter le spam.