diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml index ecc799951bec5..1a4aa5d3efe58 100644 --- a/.github/workflows/deploy-preview.yml +++ b/.github/workflows/deploy-preview.yml @@ -1,6 +1,7 @@ name: Deploy Preview on: + # zizmor: ignore[dangerous-triggers] workflow_run: workflows: ["Deploy"] types: [completed] @@ -23,6 +24,9 @@ jobs: timeout-minutes: 10 permissions: pull-requests: write + env: + HEAD_SHA: ${{ github.event.workflow_run.head_sha }} + RUN_URL: "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" steps: - name: Download PR metadata uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 @@ -41,17 +45,17 @@ jobs: - name: Comment deployment in progress uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + PR_NUMBER: ${{ steps.metadata.outputs.pr_number }} + PREVIEW_URL: ${{ steps.metadata.outputs.preview_url }} with: script: | - const prNumber = parseInt('${{ steps.metadata.outputs.pr_number }}', 10); - const previewUrl = '${{ steps.metadata.outputs.preview_url }}'; - const commitSHA = '${{ github.event.workflow_run.head_sha }}'; - const runUrl = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'; + const prNumber = parseInt(process.env.PR_NUMBER, 10); const body = `**Preview deployment**\n\n` + `🔄 Deployment in progress...\n\n` - + `- **Latest commit:** ${commitSHA}\n` - + `- **Preview:** ${previewUrl}\n` - + `- **Workflow run:** [View logs](${runUrl})`; + + `- **Latest commit:** ${process.env.HEAD_SHA}\n` + + `- **Preview:** ${process.env.PREVIEW_URL}\n` + + `- **Workflow run:** [View logs](${process.env.RUN_URL})`; const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, @@ -92,17 +96,17 @@ jobs: - name: Comment deployment complete if: success() uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + PR_NUMBER: ${{ steps.metadata.outputs.pr_number }} + PREVIEW_URL: ${{ steps.metadata.outputs.preview_url }} with: script: | - const prNumber = parseInt('${{ steps.metadata.outputs.pr_number }}', 10); - const previewUrl = '${{ steps.metadata.outputs.preview_url }}'; - const commitSHA = '${{ github.event.workflow_run.head_sha }}'; - const runUrl = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'; + const prNumber = parseInt(process.env.PR_NUMBER, 10); const body = `**Preview deployment**\n\n` + `✅ Deployment complete!\n\n` - + `- **Latest commit:** ${commitSHA}\n` - + `- **Preview:** ${previewUrl}\n` - + `- **Workflow run:** [View logs](${runUrl})`; + + `- **Latest commit:** ${process.env.HEAD_SHA}\n` + + `- **Preview:** ${process.env.PREVIEW_URL}\n` + + `- **Workflow run:** [View logs](${process.env.RUN_URL})`; const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, @@ -121,15 +125,15 @@ jobs: - name: Comment deployment failed if: failure() uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + env: + PR_NUMBER: ${{ steps.metadata.outputs.pr_number }} with: script: | - const prNumber = parseInt('${{ steps.metadata.outputs.pr_number }}', 10); - const commitSHA = '${{ github.event.workflow_run.head_sha }}'; - const runUrl = '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'; + const prNumber = parseInt(process.env.PR_NUMBER, 10); const body = `**Preview deployment**\n\n` + `❌ Deployment failed!\n\n` - + `- **Latest commit:** ${commitSHA}\n` - + `- **Workflow run:** [View logs](${runUrl})`; + + `- **Latest commit:** ${process.env.HEAD_SHA}\n` + + `- **Workflow run:** [View logs](${process.env.RUN_URL})`; const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, diff --git a/.github/workflows/lunaria.yml b/.github/workflows/lunaria.yml index f951b3afb88d8..643bcbf9c481d 100644 --- a/.github/workflows/lunaria.yml +++ b/.github/workflows/lunaria.yml @@ -33,6 +33,6 @@ jobs: uses: ./.github/actions/install - name: Generate Lunaria Overview - uses: lunariajs/action@4911ad0736d1e3b20af4cb70f5079aea2327ed8e # astro-docs + uses: lunariajs/action@e5ab09c3c8353fa80786d8c2149873ba3978a3a7 # v0.2.0 with: token: ${{ secrets.FREDKBOT_GITHUB_TOKEN }} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a661afd021a08..efcd78b0134e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -160,7 +160,7 @@ git checkout -b add/partial-hydration-typo-fix ``` ### Opening a PR -One you have made your changes using any of the above methods, you’re ready to create a “Pull Request!” +Once you have made your changes using any of the above methods, you’re ready to create a “Pull Request!” This will let the Astro docs team know you have some changes to propose. At this point we can give you feedback and might request changes. For translations, we like to have at least one other person who knows the language you are translating into review the PR. diff --git a/lunaria.config.ts b/lunaria.config.ts index aaddd51d5dfa2..17741d053b718 100644 --- a/lunaria.config.ts +++ b/lunaria.config.ts @@ -1,3 +1,4 @@ +import { html } from '@lunariajs/core'; import { defineConfig } from '@lunariajs/core/config'; export default defineConfig({ @@ -132,4 +133,43 @@ export default defineConfig({ 'i18nIgnore', ], }, + dashboard: { + title: 'Astro Docs Translation Status', + description: + 'Translation progress tracker for the Astro Docs site. See how much has been translated in your language and get involved!', + site: 'https://i18n.docs.astro.build/', + basesToHide: ['src/content/docs/en/', 'src/i18n/en/', 'src/content/docs/', 'src/content/'], + customCss: ['./scripts/lunaria/styles.css'], + favicon: { + external: [ + { link: 'https://docs.astro.build/favicon.ico', type: 'image/x-icon' }, + { link: 'https://docs.astro.build/favicon.svg', type: 'image/svg+xml' }, + ], + }, + ui: { + 'statusByLocale.heading': 'Translation progress by locale', + 'statusByLocale.outdatedLocalizationLink': 'outdated translation', + 'statusByLocale.incompleteLocalizationLink': 'incomplete translation', + 'statusByLocale.completeLocalization': 'This translation is complete, amazing job! 🎉', + 'statusByFile.heading': 'Translation status by file', + }, + }, + renderer: { + slots: { + head: () => html``, + afterTitle: () => html` +
+ If you're interested in helping us translate + docs.astro.build into one of the languages listed + below, you've come to the right place! This auto-updating page always lists all the + content that could use your help right now. +
++ Before starting, please read our + i18n Guide + to learn about our translation process and how you can get involved. +
+ `, + }, + }, }); diff --git a/package.json b/package.json index ec2d650f0790f..7cfdc1e610e2e 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@astrojs/sitemap": "^3.7.3", "@astrojs/starlight": "^0.42.0", "@expressive-code/plugin-collapsible-sections": "^0.44.1", - "@lunariajs/core": "https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c", + "@lunariajs/core": "^0.2.0", "canvas-confetti": "^1.6.0", "jsdoc-api": "^9.3.5", "satteri": "^0.10.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23891b363ad0f..0e6cac730c021 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,13 +19,13 @@ importers: version: 3.7.3 '@astrojs/starlight': specifier: ^0.42.0 - version: 0.42.0(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3))(typescript@6.0.3) + version: 0.42.0(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1))(typescript@6.0.3) '@expressive-code/plugin-collapsible-sections': specifier: ^0.44.1 version: 0.44.1 '@lunariajs/core': - specifier: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c - version: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c + specifier: ^0.2.0 + version: 0.2.0 canvas-confetti: specifier: ^1.6.0 version: 1.6.0 @@ -62,16 +62,16 @@ importers: version: 24.12.2 '@typescript-eslint/parser': specifier: ^8.59.3 - version: 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + version: 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) astro: specifier: ^7.2.10 - version: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3) + version: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1) astro-eslint-parser: specifier: ^1.4.0 version: 1.4.0 astro-og-canvas: specifier: ^0.11.1 - version: 0.11.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3)) + version: 0.11.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1)) canvaskit-wasm: specifier: ^0.41.1 version: 0.41.1 @@ -83,10 +83,10 @@ importers: version: 5.0.3 eslint: specifier: ^10.3.0 - version: 10.3.0(jiti@2.3.3) + version: 10.3.0(jiti@2.7.0) eslint-plugin-astro: specifier: ^1.6.0 - version: 1.7.0(eslint@10.3.0(jiti@2.3.3)) + version: 1.7.0(eslint@10.3.0(jiti@2.7.0)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -122,7 +122,7 @@ importers: version: 6.0.3 typescript-eslint: specifier: ^8.59.3 - version: 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + version: 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) wrangler: specifier: ^4.99.0 version: 4.99.0 @@ -1269,10 +1269,10 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@lunariajs/core@https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c': - resolution: {tarball: https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c} - version: 0.1.1 + '@lunariajs/core@0.2.0': + resolution: {integrity: sha512-JuQsDStxiznw4Km0ab/FNH2VxVfWm08oJdjevRUOY7duN6nPKvBkk9rvXD6zPDlvauPWTf9RFuJ3lD4l+o9M4g==} engines: {node: '>=18.17.0'} + hasBin: true '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} @@ -1483,6 +1483,12 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@simple-git/args-pathspec@1.0.3': + resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} + + '@simple-git/argv-parser@1.1.1': + resolution: {integrity: sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==} + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -1962,6 +1968,10 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + cookie-es@1.2.3: resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} @@ -2112,6 +2122,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2386,6 +2399,10 @@ packages: resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} engines: {node: '>=20.20.0'} + gettext-parser@9.1.1: + resolution: {integrity: sha512-ZLeqWPz9OMNrTgMuww0C22kkcNqis+e4059R94t7L7ERlZ2rUNpiDbaAUus+esBC6uBAQWbS9N+R5vJIJg//lw==} + engines: {node: '>=20'} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -2502,6 +2519,10 @@ packages: typescript: optional: true + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2596,8 +2617,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@2.3.3: - resolution: {integrity: sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-yaml@3.14.1: @@ -3089,8 +3110,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - p-all@5.0.0: - resolution: {integrity: sha512-pofqu/1FhCVa+78xNAptCGc9V45exFz2pvBRyIvgXkNM0Rh18Py7j8pQuSjA+zpabI46v9hRjNWmL9EAFcEbpw==} + p-all@5.0.1: + resolution: {integrity: sha512-LMT7WX9ZSaq3J1zjloApkIVmtz0ZdMFSIqbuiEa3txGYPLjUPOvgOPOx3nFjo+f37ZYL+1aY666I2SG7GVwLOA==} engines: {node: '>=16'} p-limit@1.3.0: @@ -3206,6 +3227,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -3384,6 +3409,9 @@ packages: s.color@0.0.15: resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sass-formatter@0.7.6: resolution: {integrity: sha512-hXdxU6PCkiV3XAiSnX+XLqz2ohHoEnVUlrd8LEVMAI80uB1+OTScIkH9n6qQwImZpTye1r1WG1rbGUteHNhoHg==} @@ -3443,8 +3471,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-git@3.27.0: - resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==} + simple-git@3.36.0: + resolution: {integrity: sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -4046,6 +4074,11 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yaml@2.9.1: + resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@22.0.0: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} @@ -4068,12 +4101,12 @@ packages: youch@4.1.0-beta.10: resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.6.2: + resolution: {integrity: sha512-lh5RCAGFa1Cm2hjtNwLQhSs/AsqdWnTQaBER9fEwN/88pSh7KOtJavtBx/0VlkN/uFd61SwYmljLMDAsHlvzBQ==} + zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} @@ -4335,11 +4368,11 @@ snapshots: github-slugger: 2.0.0 satteri: 0.10.5 - '@astrojs/mdx@8.0.0(@astrojs/markdown-satteri@0.4.0)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3))': + '@astrojs/mdx@8.0.0(@astrojs/markdown-satteri@0.4.0)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1))': dependencies: '@astrojs/internal-helpers': 0.11.0 '@astrojs/markdown-satteri': 0.4.0 - astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3) + astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1) es-module-lexer: 2.0.0 '@astrojs/prism@4.0.2': @@ -4352,17 +4385,17 @@ snapshots: stream-replace-string: 2.0.0 zod: 4.3.6 - '@astrojs/starlight@0.42.0(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3))(typescript@6.0.3)': + '@astrojs/starlight@0.42.0(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1))(typescript@6.0.3)': dependencies: '@astrojs/markdown-satteri': 0.4.0 - '@astrojs/mdx': 8.0.0(@astrojs/markdown-satteri@0.4.0)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3)) + '@astrojs/mdx': 8.0.0(@astrojs/markdown-satteri@0.4.0)(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1)) '@astrojs/sitemap': 3.7.3 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.5 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3) - astro-expressive-code: 0.44.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3)) + astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1) + astro-expressive-code: 0.44.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1)) bcp-47: 2.1.0 hast-util-format: 1.1.0 hast-util-select: 6.0.4 @@ -4732,9 +4765,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.3.3))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0(jiti@2.7.0))': dependencies: - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -5040,19 +5073,20 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@lunariajs/core@https://pkg.pr.new/lunariajs/lunaria/@lunariajs/core@722c34c': + '@lunariajs/core@0.2.0': dependencies: consola: 3.4.2 - jiti: 2.3.3 - js-yaml: 4.3.1 - neotraverse: 0.6.18 - p-all: 5.0.0 + gettext-parser: 9.1.1 + jiti: 2.7.0 + neotraverse: 1.0.1 + p-all: 5.0.1 path-to-regexp: 6.3.0 - picomatch: 4.0.4 - simple-git: 3.27.0 + picomatch: 4.0.7 + simple-git: 3.36.0 tinyglobby: 0.2.17 ultramatter: 0.0.4 - zod: 3.25.76 + yaml: 2.9.1 + zod: 4.6.2 transitivePeerDependencies: - supports-color @@ -5224,6 +5258,12 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@simple-git/args-pathspec@1.0.3': {} + + '@simple-git/argv-parser@1.1.1': + dependencies: + '@simple-git/args-pathspec': 1.0.3 + '@sindresorhus/is@7.2.0': {} '@speed-highlight/core@1.2.16': {} @@ -5422,15 +5462,15 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3))(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/scope-manager': 8.59.3 - '@typescript-eslint/type-utils': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + '@typescript-eslint/type-utils': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.3 - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -5438,14 +5478,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3)': + '@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/scope-manager': 8.59.3 '@typescript-eslint/types': 8.59.3 '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) '@typescript-eslint/visitor-keys': 8.59.3 debug: 4.4.3 - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5468,13 +5508,13 @@ snapshots: dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@typescript-eslint/types': 8.59.3 '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: @@ -5497,13 +5537,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3)': + '@typescript-eslint/utils@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.59.3 '@typescript-eslint/types': 8.59.3 '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -5659,20 +5699,20 @@ snapshots: transitivePeerDependencies: - supports-color - astro-expressive-code@0.44.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3)): + astro-expressive-code@0.44.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1)): dependencies: - astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3) + astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1) rehype-expressive-code: 0.44.1 url-extras: 0.1.0 - astro-og-canvas@0.11.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3)): + astro-og-canvas@0.11.1(astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1)): dependencies: - astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3) + astro: 7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1) canvaskit-wasm: 0.41.1 deterministic-object-hash: 2.0.2 entities: 8.0.0 - astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.3.3)(yaml@2.8.3): + astro@7.2.10(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3)(@types/node@24.12.2)(jiti@2.7.0)(yaml@2.9.1): dependencies: '@astrojs/compiler-rs': 0.4.0(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.3) '@astrojs/internal-helpers': 0.11.0 @@ -5722,8 +5762,8 @@ snapshots: ultrahtml: 1.6.0 unifont: 0.7.5 unstorage: 1.17.5 - vite: 8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.3.3)(yaml@2.8.3) - vitefu: 1.1.2(vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.3.3)(yaml@2.8.3)) + vite: 8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.1) + vitefu: 1.1.2(vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.1)) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.3.6 @@ -5903,6 +5943,8 @@ snapshots: consola@3.4.2: {} + content-type@1.0.5: {} + cookie-es@1.2.3: {} cookie@1.1.1: {} @@ -6038,6 +6080,10 @@ snapshots: emoji-regex@9.2.2: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + entities@4.5.0: {} entities@6.0.0: {} @@ -6126,19 +6172,19 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.6.4(eslint@10.3.0(jiti@2.3.3)): + eslint-compat-utils@0.6.4(eslint@10.3.0(jiti@2.7.0)): dependencies: - eslint: 10.3.0(jiti@2.3.3) + eslint: 10.3.0(jiti@2.7.0) semver: 7.8.5 - eslint-plugin-astro@1.7.0(eslint@10.3.0(jiti@2.3.3)): + eslint-plugin-astro@1.7.0(eslint@10.3.0(jiti@2.7.0)): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@jridgewell/sourcemap-codec': 1.5.5 '@typescript-eslint/types': 8.59.3 astro-eslint-parser: 1.4.0 - eslint: 10.3.0(jiti@2.3.3) - eslint-compat-utils: 0.6.4(eslint@10.3.0(jiti@2.3.3)) + eslint: 10.3.0(jiti@2.7.0) + eslint-compat-utils: 0.6.4(eslint@10.3.0(jiti@2.7.0)) globals: 16.5.0 postcss: 8.5.15 postcss-selector-parser: 7.0.0 @@ -6163,9 +6209,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.3.0(jiti@2.3.3): + eslint@10.3.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.3.3)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 @@ -6196,7 +6242,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.3.3 + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -6368,6 +6414,11 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + gettext-parser@9.1.1: + dependencies: + content-type: 1.0.5 + encoding: 0.1.13 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -6542,6 +6593,10 @@ snapshots: optionalDependencies: typescript: 6.0.3 + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -6610,7 +6665,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.3.3: {} + jiti@2.7.0: {} js-yaml@3.14.1: dependencies: @@ -7265,7 +7320,7 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - p-all@5.0.0: + p-all@5.0.1: dependencies: p-map: 6.0.0 @@ -7381,6 +7436,8 @@ snapshots: picomatch@4.0.4: {} + picomatch@4.0.7: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -7584,6 +7641,8 @@ snapshots: s.color@0.0.15: {} + safer-buffer@2.1.2: {} + sass-formatter@0.7.6: dependencies: suf-log: 2.5.3 @@ -7712,10 +7771,12 @@ snapshots: signal-exit@4.1.0: {} - simple-git@3.27.0: + simple-git@3.36.0: dependencies: '@kwsites/file-exists': 1.1.1 '@kwsites/promise-deferred': 1.1.1 + '@simple-git/args-pathspec': 1.0.3 + '@simple-git/argv-parser': 1.1.1 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -7975,13 +8036,13 @@ snapshots: dependencies: semver: 7.8.5 - typescript-eslint@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3): + typescript-eslint@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3))(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) - '@typescript-eslint/parser': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.59.3(@typescript-eslint/parser@8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/typescript-estree': 8.59.3(typescript@6.0.3) - '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.3.3))(typescript@6.0.3) - eslint: 10.3.0(jiti@2.3.3) + '@typescript-eslint/utils': 8.59.3(eslint@10.3.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.3.0(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -8129,7 +8190,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.3.3)(yaml@2.8.3): + vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -8140,12 +8201,12 @@ snapshots: '@types/node': 24.12.2 esbuild: 0.28.1 fsevents: 2.3.3 - jiti: 2.3.3 - yaml: 2.8.3 + jiti: 2.7.0 + yaml: 2.9.1 - vitefu@1.1.2(vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.3.3)(yaml@2.8.3)): + vitefu@1.1.2(vite@8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.1)): optionalDependencies: - vite: 8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.3.3)(yaml@2.8.3) + vite: 8.0.16(@types/node@24.12.2)(esbuild@0.28.1)(jiti@2.7.0)(yaml@2.9.1) volar-service-css@0.0.70(@volar/language-service@2.4.28): dependencies: @@ -8322,6 +8383,8 @@ snapshots: yaml@2.8.3: {} + yaml@2.9.1: {} + yargs-parser@22.0.0: {} yargs@18.1.0: @@ -8350,10 +8413,10 @@ snapshots: cookie: 1.1.1 youch-core: 0.3.3 - zod@3.25.76: {} - zod@4.3.6: {} + zod@4.6.2: {} + zwitch@1.0.5: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3721b47ebc6a4..4b55438004fed 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,6 +17,7 @@ minimumReleaseAgeExclude: - '@astrojs/mdx@8.0.0' - '@astrojs/starlight@0.42.0' - '@astrojs/internal-helpers@0.11.0' + - '@lunariajs/core@0.2.0' # We don’t need to run these build scripts, so explicitly disallow them as a minor security measure. allowBuilds: diff --git a/public/logos/hackmd.svg b/public/logos/hackmd.svg new file mode 100644 index 0000000000000..7cf83b6e9b8ea --- /dev/null +++ b/public/logos/hackmd.svg @@ -0,0 +1,9 @@ + diff --git a/public/logos/ishosting.svg b/public/logos/ishosting.svg new file mode 100644 index 0000000000000..90cf199e085d4 --- /dev/null +++ b/public/logos/ishosting.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scripts/lunaria.mts b/scripts/lunaria.mts index 394a3d0d9d1a7..66349446b4cf5 100644 --- a/scripts/lunaria.mts +++ b/scripts/lunaria.mts @@ -1,13 +1,12 @@ -import { createLunaria } from '@lunariajs/core'; +import { createLunaria, generateDashboard } from '@lunariajs/core'; import { mkdirSync, writeFileSync } from 'node:fs'; -import { Page, SvgSummary } from './lunaria/components.ts'; +import { join } from 'node:path'; +import { SvgSummary } from './lunaria/summary.ts'; const lunaria = await createLunaria(); const status = await lunaria.getFullStatus(); -const html = Page(lunaria.config, status, lunaria); -const svg = SvgSummary(lunaria.config, status); - -mkdirSync('dist/lunaria', { recursive: true }); -writeFileSync('dist/lunaria/index.html', html); -writeFileSync('dist/lunaria/summary.svg', svg); +const outDir = lunaria.config.outDir; +mkdirSync(outDir, { recursive: true }); +writeFileSync(join(outDir, 'index.html'), generateDashboard(lunaria.config, status)); +writeFileSync(join(outDir, 'summary.svg'), SvgSummary(lunaria.config, status)); diff --git a/scripts/lunaria/components.ts b/scripts/lunaria/components.ts deleted file mode 100644 index fed41a17bfc3c..0000000000000 --- a/scripts/lunaria/components.ts +++ /dev/null @@ -1,434 +0,0 @@ -import { - createLunaria, - type Locale, - type LunariaConfig, - type LunariaStatus, - type StatusEntry, -} from '@lunariajs/core'; -import { BaseStyles, CustomStyles } from './styles.ts'; - -export function html( - strings: TemplateStringsArray, - ...values: ((string | number) | (string | number)[])[] -) { - const treatedValues = values.map((value) => (Array.isArray(value) ? value.join('') : value)); - - return String.raw({ raw: strings }, ...treatedValues); -} - -type LunariaInstance = AwaitedThis translation is complete, amazing job! 🎉
` - : ''} -| ${col} | `)} -
|---|
- If you're interested in helping us translate - docs.astro.build into one of the languages listed below, - you've come to the right place! This auto-updating page always lists all the content that could - use your help right now. -
-- Before starting, please read our - i18n Guide - to learn about our translation process and how you can get involved. -
-`; - -/** - * Build an SVG file showing a summary of each language’s translation progress. - */ -export const SvgSummary = (config: LunariaConfig, status: LunariaStatus): string => { - const localeHeight = 56; // Each locale’s summary is 56px high. - const svgHeight = localeHeight * Math.ceil(config.locales.length / 2); - return html``; -}; - -function SvgLocaleSummary( - status: LunariaStatus, - { label, lang }: Locale -): { svg: string; progress: number } { - const missingFiles = status.filter( - (file) => - file.localizations.find((localization) => localization.lang === lang)?.status === 'missing' - ); - const outdatedFiles = status.filter((file) => { - const localization = file.localizations.find((localization) => localization.lang === lang); - if (!localization || localization.status === 'missing') { - return false; - } else if (file.type === 'dictionary') { - return 'missingKeys' in localization ? localization.missingKeys.length > 0 : false; - } else { - return ( - localization.status === 'outdated' || - ('missingKeys' in localization && localization.missingKeys.length > 0) - ); - } - }); - - const doneLength = status.length - outdatedFiles.length - missingFiles.length; - const barWidth = 184; - const doneFraction = doneLength / status.length; - const outdatedFraction = outdatedFiles.length / status.length; - const doneWidth = (doneFraction * barWidth).toFixed(2); - const outdatedWidth = ((outdatedFraction + doneFraction) * barWidth).toFixed(2); - - return { - progress: doneFraction, - svg: html`