From 8251da83d64d54c762ee62e5a21eec095c4ce5a1 Mon Sep 17 00:00:00 2001 From: ArnaudTa <33383276+ArnaudTA@users.noreply.github.com> Date: Wed, 10 Jun 2026 10:33:15 +0200 Subject: [PATCH 1/2] fix: missing icons, update script --- apps/client/package.json | 3 +- apps/client/scripts/create-collections.js | 44 ++++++++++++++++++++--- apps/client/scripts/icons.js | 12 +++++-- apps/client/src/icon-collections.ts | 4 +-- pnpm-lock.yaml | 30 ++++++++++------ 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 5abb752ee3..edf889f415 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -15,7 +15,7 @@ "dev": "vite --mode=development", "format": "NODE_OPTIONS='--no-warnings=ExperimentalWarning' eslint ./ --fix", "format:style": "stylelint ./src/**/*.{css,vue} --fix", - "icons": "vue-dsfr-icons -s scripts/icons.js -t src/icon-collections.ts", + "icons": "node ./scripts/create-collections.js -s scripts/icons.js -t src/icon-collections.ts", "integ": "vite --mode=integration", "lint": "pnpm run --parallel \"/^lint:.*/\"", "lint:style": "stylelint ./src/**/*.{css,vue}", @@ -60,6 +60,7 @@ "@vitest/coverage-v8": "^4.1.5", "@vue/eslint-config-typescript": "^14.7.0", "chalk": "^5.6.2", + "commander": "^15.0.0", "eslint": "^10.1.0", "eslint-plugin-vue": "^10.8.0", "jsdom": "^25.0.1", diff --git a/apps/client/scripts/create-collections.js b/apps/client/scripts/create-collections.js index da1b4a6ef3..b2b6642138 100644 --- a/apps/client/scripts/create-collections.js +++ b/apps/client/scripts/create-collections.js @@ -1,17 +1,53 @@ #!env node +import { spawnSync } from 'node:child_process' +import fs from 'node:fs' import path from 'node:path' - import { createCustomCollectionFile } from '@gouvminint/vue-dsfr/meta' import { Command } from 'commander' -const program = new Command() +const grepResult = spawnSync('grep', [ + // recursive + '-r', + // exclude node_modules + '--exclude-dir=node_modules', + // exclude icons.js and icon-collections.ts files to avoid collecting icons that are not used in the project + '--exclude-dir=scripts', + '--exclude=icon-collections.ts', + // only print the matched part of the line + '-ohs', + // regex to match icon names starting with ri:icon-name + 'ri:[a-z0-9-]*', + // search in the whole project + '../..', +], { shell: false }) +const result = grepResult.stdout.toString() + .split('\n') + .filter(Boolean) + .sort() + .filter((value, index, self) => self.indexOf(value) === index) + .map(value => value.split(':')[1]) + .filter(Boolean) + .map(value => ` '${value}',`) + .join('\n') +console.log(result) + +// open console/apps/client/src/icons.js and replace the content with the result of the command above, then run `npm run icons` to generate the icon collections +// determine lines to replace in src/icons.js +const iconsFilePath = path.resolve(process.cwd(), 'scripts/icons.js') +const fileContent = fs.readFileSync(iconsFilePath, 'utf-8') +const startIndex = fileContent.indexOf('const riIconNames = [') +const endIndex = fileContent.indexOf(']', startIndex) + 1 +const newFileContent = `${fileContent.slice(0, startIndex)}const riIconNames = [\n${result}\n]${fileContent.slice(endIndex)}` +fs.writeFileSync(iconsFilePath, newFileContent) + +const transformIconsProgram = new Command() -program +transformIconsProgram .option('-s, --source ', 'Chemin vers le fichier de tuples [IconifyJSON, string[]]') .option('-t, --target ', 'Chemin vers le fichier destination (src/icons.ts par défaut)') .parse(process.argv) -const options = program.opts() +const options = transformIconsProgram.opts() if (options.source && options.target) { createCustomCollectionFile(path.resolve(process.cwd(), options.source), path.resolve(process.cwd(), options.target)) diff --git a/apps/client/scripts/icons.js b/apps/client/scripts/icons.js index c275232c2a..00ec240280 100644 --- a/apps/client/scripts/icons.js +++ b/apps/client/scripts/icons.js @@ -8,6 +8,8 @@ const riIconNames = [ 'account-circle-line', 'add-line', 'admin-line', + 'alert-line', + 'archive-line', 'arrow-drop-left-line', 'arrow-drop-right-line', 'arrow-go-back-line', @@ -17,6 +19,7 @@ const riIconNames = [ 'arrow-right-s-line', 'award-line', 'building-line', + 'check-line', 'checkbox-blank-circle-fill', 'checkbox-circle-line', 'clipboard-line', @@ -24,6 +27,7 @@ const riIconNames = [ 'code-s-slash-line', 'dashboard-line', 'delete-bin-7-line', + 'door-open-line', 'exchange-line', 'eye-line', 'eye-off-line', @@ -35,13 +39,14 @@ const riIconNames = [ 'focus-3-line', 'folder-line', 'folder-shield-2-line', - 'folders-line', 'folder-user-line', - 'github-line', + 'folders-line', 'git-merge-line', 'git-repository-private-line', + 'github-line', 'global-line', 'key-2-line', + 'links-line', 'loader-4-line', 'lock-line', 'lock-unlock-line', @@ -55,9 +60,10 @@ const riIconNames = [ 'send-plane-line', 'server-line', 'settings-3-line', + 'settings-5-line', 'shapes-line', 'shield-check-line', - 'sound-module-line', + 'shield-keyhole-line', 'stock-line', 'sun-line', 'team-line', diff --git a/apps/client/src/icon-collections.ts b/apps/client/src/icon-collections.ts index de8e82fe94..b10dfe7554 100644 --- a/apps/client/src/icon-collections.ts +++ b/apps/client/src/icon-collections.ts @@ -1,5 +1,5 @@ import type { IconifyJSON } from '@iconify/vue' -const collections: IconifyJSON[] = [{ prefix: 'ri', icons: { 'account-circle-line': { body: '' }, 'add-line': { body: '' }, 'admin-line': { body: '' }, 'arrow-drop-left-line': { body: '' }, 'arrow-drop-right-line': { body: '' }, 'arrow-go-back-line': { body: '' }, 'arrow-left-double-line': { body: '' }, 'arrow-right-double-line': { body: '' }, 'arrow-right-line': { body: '' }, 'arrow-right-s-line': { body: '' }, 'award-line': { body: '' }, 'building-line': { body: '' }, 'checkbox-blank-circle-fill': { body: '' }, 'checkbox-circle-line': { body: '' }, 'clipboard-line': { body: '' }, 'close-line': { body: '' }, 'code-s-slash-line': { body: '' }, 'dashboard-line': { body: '' }, 'delete-bin-7-line': { body: '' }, 'exchange-line': { body: '' }, 'eye-line': { body: '' }, 'eye-off-line': { body: '' }, 'file-download-line': { body: '' }, 'file-info-line': { body: '' }, 'filter-line': { body: '' }, 'filter-off-line': { body: '' }, 'flow-chart': { body: '' }, 'focus-3-line': { body: '' }, 'folder-line': { body: '' }, 'folder-shield-2-line': { body: '' }, 'folder-user-line': { body: '' }, 'folders-line': { body: '' }, 'git-merge-line': { body: '' }, 'git-repository-private-line': { body: '' }, 'github-line': { body: '' }, 'global-line': { body: '' }, 'key-2-line': { body: '' }, 'loader-4-line': { body: '' }, 'lock-line': { body: '' }, 'lock-unlock-line': { body: '' }, 'mail-line': { body: '' }, 'moon-clear-line': { body: '' }, 'newspaper-line': { body: '' }, 'pencil-line': { body: '' }, 'question-line': { body: '' }, 'refresh-line': { body: '' }, 'restart-line': { body: '' }, 'send-plane-line': { body: '' }, 'server-line': { body: '' }, 'settings-3-line': { body: '' }, 'shapes-line': { body: '' }, 'shield-check-line': { body: '' }, 'sound-module-line': { body: '' }, 'stock-line': { body: '' }, 'sun-line': { body: '' }, 'team-line': { body: '' }, 'tools-line': { body: '' }, 'upload-cloud-line': { body: '' }, 'user-add-line': { body: '' }, 'user-shared-2-line': { body: '' } }, width: 24, height: 24 }] -export const ri = { accountCircleLine: 'ri:account-circle-line', addLine: 'ri:add-line', adminLine: 'ri:admin-line', arrowDropLeftLine: 'ri:arrow-drop-left-line', arrowDropRightLine: 'ri:arrow-drop-right-line', arrowGoBackLine: 'ri:arrow-go-back-line', arrowLeftDoubleLine: 'ri:arrow-left-double-line', arrowRightDoubleLine: 'ri:arrow-right-double-line', arrowRightLine: 'ri:arrow-right-line', arrowRightSLine: 'ri:arrow-right-s-line', awardLine: 'ri:award-line', buildingLine: 'ri:building-line', checkboxBlankCircleFill: 'ri:checkbox-blank-circle-fill', checkboxCircleLine: 'ri:checkbox-circle-line', clipboardLine: 'ri:clipboard-line', closeLine: 'ri:close-line', codeSSlashLine: 'ri:code-s-slash-line', dashboardLine: 'ri:dashboard-line', deleteBin7Line: 'ri:delete-bin-7-line', exchangeLine: 'ri:exchange-line', eyeLine: 'ri:eye-line', eyeOffLine: 'ri:eye-off-line', fileDownloadLine: 'ri:file-download-line', fileInfoLine: 'ri:file-info-line', filterLine: 'ri:filter-line', filterOffLine: 'ri:filter-off-line', flowChart: 'ri:flow-chart', focus3Line: 'ri:focus-3-line', folderLine: 'ri:folder-line', folderShield2Line: 'ri:folder-shield-2-line', folderUserLine: 'ri:folder-user-line', foldersLine: 'ri:folders-line', gitMergeLine: 'ri:git-merge-line', gitRepositoryPrivateLine: 'ri:git-repository-private-line', githubLine: 'ri:github-line', globalLine: 'ri:global-line', key2Line: 'ri:key-2-line', loader4Line: 'ri:loader-4-line', lockLine: 'ri:lock-line', lockUnlockLine: 'ri:lock-unlock-line', mailLine: 'ri:mail-line', moonClearLine: 'ri:moon-clear-line', newspaperLine: 'ri:newspaper-line', pencilLine: 'ri:pencil-line', questionLine: 'ri:question-line', refreshLine: 'ri:refresh-line', restartLine: 'ri:restart-line', sendPlaneLine: 'ri:send-plane-line', serverLine: 'ri:server-line', settings3Line: 'ri:settings-3-line', shapesLine: 'ri:shapes-line', shieldCheckLine: 'ri:shield-check-line', soundModuleLine: 'ri:sound-module-line', stockLine: 'ri:stock-line', sunLine: 'ri:sun-line', teamLine: 'ri:team-line', toolsLine: 'ri:tools-line', uploadCloudLine: 'ri:upload-cloud-line', userAddLine: 'ri:user-add-line', userShared2Line: 'ri:user-shared-2-line' } as const +const collections: IconifyJSON[] = [{ prefix: 'ri', icons: { 'account-circle-line': { body: '' }, 'add-line': { body: '' }, 'admin-line': { body: '' }, 'alert-line': { body: '' }, 'archive-line': { body: '' }, 'arrow-drop-left-line': { body: '' }, 'arrow-drop-right-line': { body: '' }, 'arrow-go-back-line': { body: '' }, 'arrow-left-double-line': { body: '' }, 'arrow-right-double-line': { body: '' }, 'arrow-right-line': { body: '' }, 'arrow-right-s-line': { body: '' }, 'award-line': { body: '' }, 'building-line': { body: '' }, 'check-line': { body: '' }, 'checkbox-blank-circle-fill': { body: '' }, 'checkbox-circle-line': { body: '' }, 'clipboard-line': { body: '' }, 'close-line': { body: '' }, 'code-s-slash-line': { body: '' }, 'dashboard-line': { body: '' }, 'delete-bin-7-line': { body: '' }, 'door-open-line': { body: '' }, 'exchange-line': { body: '' }, 'eye-line': { body: '' }, 'eye-off-line': { body: '' }, 'file-download-line': { body: '' }, 'file-info-line': { body: '' }, 'filter-line': { body: '' }, 'filter-off-line': { body: '' }, 'flow-chart': { body: '' }, 'focus-3-line': { body: '' }, 'folder-line': { body: '' }, 'folder-shield-2-line': { body: '' }, 'folder-user-line': { body: '' }, 'folders-line': { body: '' }, 'git-merge-line': { body: '' }, 'git-repository-private-line': { body: '' }, 'github-line': { body: '' }, 'global-line': { body: '' }, 'key-2-line': { body: '' }, 'links-line': { body: '' }, 'loader-4-line': { body: '' }, 'lock-line': { body: '' }, 'lock-unlock-line': { body: '' }, 'mail-line': { body: '' }, 'moon-clear-line': { body: '' }, 'newspaper-line': { body: '' }, 'pencil-line': { body: '' }, 'question-line': { body: '' }, 'refresh-line': { body: '' }, 'restart-line': { body: '' }, 'send-plane-line': { body: '' }, 'server-line': { body: '' }, 'settings-3-line': { body: '' }, 'settings-5-line': { body: '' }, 'shapes-line': { body: '' }, 'shield-check-line': { body: '' }, 'shield-keyhole-line': { body: '' }, 'stock-line': { body: '' }, 'sun-line': { body: '' }, 'team-line': { body: '' }, 'tools-line': { body: '' }, 'upload-cloud-line': { body: '' }, 'user-add-line': { body: '' }, 'user-shared-2-line': { body: '' } }, width: 24, height: 24 }] +export const ri = { accountCircleLine: 'ri:account-circle-line', addLine: 'ri:add-line', adminLine: 'ri:admin-line', alertLine: 'ri:alert-line', archiveLine: 'ri:archive-line', arrowDropLeftLine: 'ri:arrow-drop-left-line', arrowDropRightLine: 'ri:arrow-drop-right-line', arrowGoBackLine: 'ri:arrow-go-back-line', arrowLeftDoubleLine: 'ri:arrow-left-double-line', arrowRightDoubleLine: 'ri:arrow-right-double-line', arrowRightLine: 'ri:arrow-right-line', arrowRightSLine: 'ri:arrow-right-s-line', awardLine: 'ri:award-line', buildingLine: 'ri:building-line', checkLine: 'ri:check-line', checkboxBlankCircleFill: 'ri:checkbox-blank-circle-fill', checkboxCircleLine: 'ri:checkbox-circle-line', clipboardLine: 'ri:clipboard-line', closeLine: 'ri:close-line', codeSSlashLine: 'ri:code-s-slash-line', dashboardLine: 'ri:dashboard-line', deleteBin7Line: 'ri:delete-bin-7-line', doorOpenLine: 'ri:door-open-line', exchangeLine: 'ri:exchange-line', eyeLine: 'ri:eye-line', eyeOffLine: 'ri:eye-off-line', fileDownloadLine: 'ri:file-download-line', fileInfoLine: 'ri:file-info-line', filterLine: 'ri:filter-line', filterOffLine: 'ri:filter-off-line', flowChart: 'ri:flow-chart', focus3Line: 'ri:focus-3-line', folderLine: 'ri:folder-line', folderShield2Line: 'ri:folder-shield-2-line', folderUserLine: 'ri:folder-user-line', foldersLine: 'ri:folders-line', gitMergeLine: 'ri:git-merge-line', gitRepositoryPrivateLine: 'ri:git-repository-private-line', githubLine: 'ri:github-line', globalLine: 'ri:global-line', key2Line: 'ri:key-2-line', linksLine: 'ri:links-line', loader4Line: 'ri:loader-4-line', lockLine: 'ri:lock-line', lockUnlockLine: 'ri:lock-unlock-line', mailLine: 'ri:mail-line', moonClearLine: 'ri:moon-clear-line', newspaperLine: 'ri:newspaper-line', pencilLine: 'ri:pencil-line', questionLine: 'ri:question-line', refreshLine: 'ri:refresh-line', restartLine: 'ri:restart-line', sendPlaneLine: 'ri:send-plane-line', serverLine: 'ri:server-line', settings3Line: 'ri:settings-3-line', settings5Line: 'ri:settings-5-line', shapesLine: 'ri:shapes-line', shieldCheckLine: 'ri:shield-check-line', shieldKeyholeLine: 'ri:shield-keyhole-line', stockLine: 'ri:stock-line', sunLine: 'ri:sun-line', teamLine: 'ri:team-line', toolsLine: 'ri:tools-line', uploadCloudLine: 'ri:upload-cloud-line', userAddLine: 'ri:user-add-line', userShared2Line: 'ri:user-shared-2-line' } as const export default collections diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a400ef6c6b..cba30716cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,6 +135,9 @@ importers: chalk: specifier: ^5.6.2 version: 5.6.2 + commander: + specifier: ^15.0.0 + version: 15.0.0 eslint: specifier: ^10.1.0 version: 10.3.0(jiti@2.6.1) @@ -197,7 +200,7 @@ importers: dependencies: '@cpn-console/argocd-plugin': specifier: workspace:^ - version: link:../../plugins/argocd + version: file:plugins/argocd(@types/node@24.12.0)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/gitlab-plugin': specifier: workspace:^ version: link:../../plugins/gitlab @@ -360,34 +363,34 @@ importers: dependencies: '@cpn-console/argocd-plugin': specifier: workspace:^ - version: link:../../plugins/argocd + version: file:plugins/argocd(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/gitlab-plugin': specifier: workspace:^ - version: link:../../plugins/gitlab + version: file:plugins/gitlab(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/harbor-plugin': specifier: workspace:^ - version: link:../../plugins/harbor + version: file:plugins/harbor(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/hooks': specifier: workspace:^ - version: link:../../packages/hooks + version: file:packages/hooks(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/keycloak-plugin': specifier: workspace:^ - version: link:../../plugins/keycloak + version: file:plugins/keycloak(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/logger': specifier: workspace:^ version: link:../../packages/logger '@cpn-console/nexus-plugin': specifier: workspace:^ - version: link:../../plugins/nexus + version: file:plugins/nexus(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/shared': specifier: workspace:^ - version: link:../../packages/shared + version: file:packages/shared(@types/node@22.19.15) '@cpn-console/sonarqube-plugin': specifier: workspace:^ - version: link:../../plugins/sonarqube + version: file:plugins/sonarqube(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/vault-plugin': specifier: workspace:^ - version: link:../../plugins/vault + version: file:plugins/vault(@types/node@22.19.15)(typescript@5.9.3)(vitest@4.1.5) '@fastify/cookie': specifier: ^9.4.0 version: 9.4.0 @@ -5135,6 +5138,10 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -10425,6 +10432,7 @@ snapshots: '@cpn-console/gitlab-plugin': file:plugins/gitlab(@types/node@24.12.0)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/hooks': file:packages/hooks(@types/node@24.12.0)(typescript@5.9.3)(vitest@4.1.5) '@cpn-console/keycloak-plugin': file:plugins/keycloak(@types/node@24.12.0)(typescript@5.9.3)(vitest@4.1.5) + '@cpn-console/logger': file:packages/logger '@cpn-console/shared': file:packages/shared(@types/node@24.12.0) '@cpn-console/vault-plugin': file:plugins/vault(@types/node@24.12.0)(typescript@5.9.3)(vitest@4.1.5) '@himenon/argocd-typescript-openapi': 1.2.2 @@ -15058,6 +15066,8 @@ snapshots: commander@14.0.3: {} + commander@15.0.0: {} + commander@2.20.3: {} commander@4.1.1: {} From 176458772e1bc9b415ccde646b620bf8cda5a03d Mon Sep 17 00:00:00 2001 From: ArnaudTa <33383276+ArnaudTA@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:59:20 +0200 Subject: [PATCH 2/2] docs: update documentation about icons --- apps/client/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/client/README.md b/apps/client/README.md index 00810a3778..b734c0c271 100644 --- a/apps/client/README.md +++ b/apps/client/README.md @@ -40,8 +40,11 @@ npm run build npm run preview ``` -## Récupérer toutes les icones du projets -`grep -r -oh "ri:[a-z0-9-]*" . | sort | uniq | cut -d ':' -f 2 | awk NF | awk '{print " \047" $1 "\047,"}'` +## Import des icones + +Utiliser `npm run icons` pour générer icon-collections.ts à partir des icônes utilisées dans le projet. Cette commande utilise un script qui recherche les icônes utilisées dans le projet et génère un fichier de collections d'icônes. + +Commiter les changements des deux fichiers ## Activation OpenCDS