diff --git a/.devcontainer/.vscode/settings.json b/.devcontainer/.vscode/settings.json
index bd95f0d..0fb9141 100644
--- a/.devcontainer/.vscode/settings.json
+++ b/.devcontainer/.vscode/settings.json
@@ -11,11 +11,7 @@
"vue.complete.casing.props": "camel",
"typescript.updateImportsOnFileMove.enabled": "always",
"typescript.suggest.autoImports": true,
- "eslint.validate": [
- "javascript",
- "typescript",
- "vue"
- ],
+ "eslint.validate": ["javascript", "typescript", "vue"],
"files.associations": {
"*.vue": "vue"
},
@@ -23,9 +19,7 @@
"vue-html": "html",
"vue": "html"
},
- "i18n-ally.localesPaths": [
- "src/i18n/locales"
- ],
+ "i18n-ally.localesPaths": ["src/i18n/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.displayLanguage": "en",
"i18n-ally.sourceLanguage": "en",
@@ -34,4 +28,4 @@
"prettier.singleQuote": true,
"prettier.printWidth": 100,
"prettier.trailingComma": "none"
-}
\ No newline at end of file
+}
diff --git a/.devcontainer/README.md b/.devcontainer/README.md
index 3ee9666..3ed1b8a 100644
--- a/.devcontainer/README.md
+++ b/.devcontainer/README.md
@@ -13,7 +13,7 @@ This directory contains an ultra-minimal development container configuration for
### Essential VS Code Extensions (6 extensions)
- **Vue.js Core**: Volar + TypeScript Vue Plugin
-- **Code Quality**: ESLint + Prettier (matches your project config)
+- **Code Quality**: ESLint + Prettier (matches your project config)
- **i18n Support**: i18n Ally (your project uses French/English)
- **Testing**: Playwright (for your E2E tests)
@@ -43,7 +43,7 @@ This directory contains an ultra-minimal development container configuration for
The container will automatically:
- Pull the official Node.js 22 image
-- Install all 6 essential extensions
+- Install all 6 essential extensions
- Run `npm install` to set up dependencies
- Install Playwright browsers with `npx playwright install --with-deps`
- Forward port 5173 for the Vite dev server
@@ -52,7 +52,7 @@ The container will automatically:
```bash
npm run dev # Start Vite dev server
-npm run build # Build for production
+npm run build # Build for production
npm run test:unit # Run Vitest unit tests
npm run test:e2e # Run Playwright e2e tests
npm run lint # ESLint checking
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index cd4ea32..a729b2f 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -40,11 +40,7 @@
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
- "eslint.validate": [
- "javascript",
- "typescript",
- "vue"
- ],
+ "eslint.validate": ["javascript", "typescript", "vue"],
// File associations
"files.associations": {
"*.vue": "vue"
@@ -55,18 +51,13 @@
"vue": "html"
},
// i18n Ally configuration for your project structure
- "i18n-ally.localesPaths": [
- "src/i18n/locales"
- ],
+ "i18n-ally.localesPaths": ["src/i18n/locales"],
"i18n-ally.keystyle": "nested"
}
}
},
// Forward essential development ports
- "forwardPorts": [
- 5173,
- 4173
- ],
+ "forwardPorts": [5173, 4173],
"portsAttributes": {
"5173": {
"label": "Vite Dev Server",
@@ -79,4 +70,4 @@
},
// Install dependencies after container creation
"postCreateCommand": "npm install"
-}
\ No newline at end of file
+}
diff --git a/.github/workflows/accessibility.yml b/.github/workflows/accessibility.yml
new file mode 100644
index 0000000..ec81dfb
--- /dev/null
+++ b/.github/workflows/accessibility.yml
@@ -0,0 +1,68 @@
+name: Accessibility Tests
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - 'src/**'
+ - 'public/**'
+ - 'package.json'
+ - 'vite.config.*'
+ - 'tsconfig.*'
+ - 'index.html'
+ - 'env.d.ts'
+ - 'e2e/**'
+ - 'playwright.config.*'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ accessibility:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22'
+ cache: 'npm'
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build project
+ run: npm run build
+
+ - name: Install Playwright browsers
+ run: npx playwright install --with-deps
+
+ - name: Install wait-on
+ run: npm install -g wait-on
+
+ - name: Start preview server and run tests
+ run: |
+ # Start the preview server
+ npm run preview &
+ SERVER_PID=$!
+
+ # Wait for the server to be ready (timeout after 60s)
+ wait-on -t 60000 http://localhost:4173/gluko/ || {
+ echo "Server failed to start"
+ kill $SERVER_PID
+ exit 1
+ }
+
+ # Run the tests
+ npx playwright test e2e/accessibility.spec.ts
+ TEST_EXIT_CODE=$?
+
+ # Clean up the server
+ kill $SERVER_PID
+
+ # Exit with the test exit code
+ exit $TEST_EXIT_CODE
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..728b260
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,29 @@
+name: Build
+
+on:
+ workflow_run:
+ workflows: ['Code Quality Checks']
+ types:
+ - completed
+ branches:
+ - main
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ if: ${{ github.event.workflow_run.conclusion == 'success' }}
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22'
+ - name: Install dependencies
+ run: npm ci
+ - name: Build project
+ run: npm run build
diff --git a/.github/workflows/code_quality.yml b/.github/workflows/code_quality.yml
new file mode 100644
index 0000000..8df0d8f
--- /dev/null
+++ b/.github/workflows/code_quality.yml
@@ -0,0 +1,43 @@
+name: Code Quality Checks
+
+on:
+ pull_request:
+ branches:
+ - main
+ paths:
+ - 'src/**'
+ - 'public/**'
+ - 'package.json'
+ - 'vite.config.*'
+ - 'tsconfig.*'
+ - 'index.html'
+ - 'env.d.ts'
+ - '.eslintrc.*'
+ - '.prettier*'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ code-quality:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '22'
+ - name: Install dependencies
+ run: npm ci --ignore-scripts --no-optional
+ - name: Run ESLint
+ run: npm run lint
+ - name: Install and Run Markdownlint
+ run: |
+ npm install -g markdownlint-cli
+ markdownlint '**/*.md' --ignore 'node_modules/**' --config .markdownlint.json
+ - name: Run Prettier
+ run: npx prettier --check .
+ - name: Run TypeScript type check
+ run: npm run type-check
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..9e4fd3b
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,100 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+#
+name: 'CodeQL Advanced'
+
+on:
+ push:
+ branches: ['main']
+ pull_request:
+ branches: ['main']
+ schedule:
+ - cron: '42 15 * * 3'
+
+jobs:
+ analyze:
+ name: Analyze (${{ matrix.language }})
+ # Runner size impacts CodeQL analysis time. To learn more, please see:
+ # - https://gh.io/recommended-hardware-resources-for-running-codeql
+ # - https://gh.io/supported-runners-and-hardware-resources
+ # - https://gh.io/using-larger-runners (GitHub.com only)
+ # Consider using larger runners or machines with greater resources for possible analysis time improvements.
+ runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
+ permissions:
+ # required for all workflows
+ security-events: write
+
+ # required to fetch internal or private CodeQL packs
+ packages: read
+
+ # only required for workflows in private repositories
+ actions: read
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - language: actions
+ build-mode: none
+ - language: javascript-typescript
+ build-mode: none
+ # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift'
+ # Use `c-cpp` to analyze code written in C, C++ or both
+ # Use 'java-kotlin' to analyze code written in Java, Kotlin or both
+ # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
+ # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis,
+ # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning.
+ # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how
+ # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Add any setup steps before running the `github/codeql-action/init` action.
+ # This includes steps like installing compilers or runtimes (`actions/setup-node`
+ # or others). This is typically only required for manual builds.
+ # - name: Setup runtime (example)
+ # uses: actions/setup-example@v1
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+ build-mode: ${{ matrix.build-mode }}
+ # If you wish to specify custom queries, you can do so here or in a config file.
+ # By default, queries listed here will override any specified in a config file.
+ # Prefix the list here with "+" to use these queries and those in the config file.
+
+ # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
+ # queries: security-extended,security-and-quality
+
+ # If the analyze step fails for one of the languages you are analyzing with
+ # "We were unable to automatically build your code", modify the matrix above
+ # to set the build mode to "manual" for that language. Then modify this step
+ # to build your code.
+ # ℹ️ Command-line programs to run using the OS shell.
+ # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
+ - if: matrix.build-mode == 'manual'
+ shell: bash
+ run: |
+ echo 'If you are using a "manual" build mode for one or more of the' \
+ 'languages you are analyzing, replace this with the commands to build' \
+ 'your code, for example:'
+ echo ' make bootstrap'
+ echo ' make release'
+ exit 1
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
+ with:
+ category: '/language:${{matrix.language}}'
diff --git a/.github/workflows/static.yml b/.github/workflows/deploy_static_site.yml
similarity index 90%
rename from .github/workflows/static.yml
rename to .github/workflows/deploy_static_site.yml
index 7739663..5ab855f 100644
--- a/.github/workflows/static.yml
+++ b/.github/workflows/deploy_static_site.yml
@@ -5,6 +5,14 @@ on:
# Runs on pushes targeting the default branch
push:
branches: ['main']
+ paths:
+ - 'src/**'
+ - 'public/**'
+ - 'package.json'
+ - 'vite.config.*'
+ - 'tsconfig.*'
+ - 'index.html'
+ - 'env.d.ts'
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..00e59df
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,4 @@
+{
+ "MD013": false,
+ "default": true
+}
diff --git a/.prettierrc.json b/.prettierrc.json
index 66e2335..ecdf3e0 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -5,4 +5,4 @@
"singleQuote": true,
"printWidth": 100,
"trailingComma": "none"
-}
\ No newline at end of file
+}
diff --git a/README.md b/README.md
index 7bdd8bd..3797a11 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,12 @@
# Gluko
-[](https://github.com/gcharest/gluko/actions/workflows/static.yml)
+[](https://github.com/gcharest/gluko/actions/workflows/static.yml)
+[](https://github.com/gcharest/gluko/actions/workflows/code_quality.yml)
+[](https://github.com/gcharest/gluko/actions/workflows/accessibility.yml)
+[](https://github.com/gcharest/gluko/actions/workflows/codeql.yml)
-Gluko is a web application designed to help individuals and families more accurately calculate the carbohydrate content in their meals. By providing an easy-to-use interface and leveraging the [Canadian Nutrient File database](https://food-nutrition.canada.ca/cnf-fce/?lang=eng), Gluko simplifies carb counting and ensures precision in determining the carb factor of various nutrients.
+Gluko is a web application designed to help individuals and families more accurately calculate the carbohydrate content in their meals.
+By providing an easy-to-use interface and leveraging the [Canadian Nutrient File database](https://food-nutrition.canada.ca/cnf-fce/?lang=eng), Gluko simplifies carb counting and ensures precision in determining the carb factor of various nutrients.
## Features
diff --git a/e2e/accessibility.spec.ts b/e2e/accessibility.spec.ts
new file mode 100644
index 0000000..0b710d5
--- /dev/null
+++ b/e2e/accessibility.spec.ts
@@ -0,0 +1,125 @@
+import { test, expect } from '@playwright/test'
+import AxeBuilder from '@axe-core/playwright'
+
+test.describe('Accessibility Tests', () => {
+ test('Home page should not have any automatically detectable accessibility issues', async ({
+ page
+ }) => {
+ await page.goto('/gluko/', { waitUntil: 'networkidle' })
+ await page.waitForSelector('main', { state: 'visible' })
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze()
+ expect(accessibilityScanResults.violations).toEqual([])
+ })
+
+ test('Calculator page should not have any automatically detectable accessibility issues', async ({
+ page
+ }) => {
+ // Use the configured base URL and wait for navigation
+ await page.goto('/gluko/calculator', { waitUntil: 'networkidle' })
+ // Add a small wait to ensure dynamic content is loaded
+ await page.waitForSelector('main', { state: 'visible' })
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze()
+ expect(accessibilityScanResults.violations).toEqual([])
+ })
+
+ test('Carb Factor page should not have any automatically detectable accessibility issues', async ({
+ page
+ }) => {
+ await page.goto('/gluko/carb-factor', { waitUntil: 'networkidle' })
+ await page.waitForSelector('main', { state: 'visible' })
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze()
+ expect(accessibilityScanResults.violations).toEqual([])
+ })
+
+ test('History page should not have any automatically detectable accessibility issues', async ({
+ page
+ }) => {
+ await page.goto('/gluko/history', { waitUntil: 'networkidle' })
+ await page.waitForSelector('main', { state: 'visible' })
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze()
+ expect(accessibilityScanResults.violations).toEqual([])
+ })
+
+ test('About page should not have any automatically detectable accessibility issues', async ({
+ page
+ }) => {
+ await page.goto('/gluko/about', { waitUntil: 'networkidle' })
+ await page.waitForSelector('main', { state: 'visible' })
+ const accessibilityScanResults = await new AxeBuilder({ page }).analyze()
+ expect(accessibilityScanResults.violations).toEqual([])
+ })
+})
+
+// Extended tests for common interactive components
+test.describe('Component-specific Accessibility Tests', () => {
+ // TODO fix the issues in the test logic; nav menu is actually accessible with keyboard
+ // test('Navigation menu should be keyboard accessible', async ({ page }) => {
+ // // Set mobile viewport to ensure navigation button is visible
+ // await page.setViewportSize({ width: 390, height: 844 }) // iPhone 12 dimensions
+ // await page.goto('/gluko/', { waitUntil: 'networkidle' })
+ // await page.waitForLoadState('domcontentloaded')
+
+ // // Check if the skip link is the first focusable element
+ // await page.keyboard.press('Tab')
+ // const focusedElement = await page.evaluate(() => document.activeElement?.id)
+ // expect(focusedElement).toBe('skip-to-content')
+
+ // // Check if the main navigation is accessible
+ // const nav = await page.getByRole('navigation', { name: /Main navigation|Navigation principale/ })
+ // expect(await nav.isVisible()).toBeTruthy()
+
+ // // Check for ARIA labels in navigation
+ // await page.waitForSelector('button.navbar-toggler', { state: 'visible' })
+ // const menuButton = await page.getByRole('button', { name: /Toggle navigation|Basculer la navigation/ })
+ // await expect(menuButton).toBeVisible()
+
+ // // Test initial state
+ // await expect(menuButton).toHaveAttribute('aria-expanded', 'false')
+
+ // // Test keyboard accessibility of the menu button
+ // await menuButton.focus()
+ // await expect(menuButton).toBeFocused()
+
+ // // Click menu button to show navigation
+ // await menuButton.click()
+
+ // // Wait for offcanvas to be visible
+ // await page.waitForSelector('.offcanvas.show', { state: 'visible', timeout: 1000 })
+
+ // // Verify each navigation item is present and can be focused
+ // for (const linkText of ['Calculateur de glucides', 'Historique des repas', 'Facteur glucidique', 'À propos']) {
+ // await page.keyboard.press('Tab')
+ // const link = page.getByRole('link', { name: linkText })
+ // await expect(link).toBeVisible()
+ // await expect(link).toBeFocused()
+ // }
+ // })
+
+ test('Language toggler should be properly labeled', async ({ page }) => {
+ await page.goto('/gluko/', { waitUntil: 'networkidle' })
+ const languageToggler = await page.getByRole('button', {
+ name: /Change Language|Changer la langue/
+ })
+ expect(await languageToggler.isVisible()).toBeTruthy()
+ })
+
+ test('Theme toggler should be properly labeled', async ({ page }) => {
+ await page.goto('/gluko/', { waitUntil: 'networkidle' })
+ const themeToggler = await page.getByRole('button', { name: /Toggle theme|Changer le thème/ })
+ expect(await themeToggler.isVisible()).toBeTruthy()
+ })
+
+ test('Calculator form controls should be properly labeled', async ({ page }) => {
+ await page.goto('/gluko/calculator', { waitUntil: 'networkidle' })
+
+ // Check if nutrient inputs are properly labeled
+ const nutrientInputs = await page.getByRole('textbox')
+ for (const input of await nutrientInputs.all()) {
+ const label = await input.evaluate((el) => {
+ const id = el.id
+ return id ? document.querySelector(`label[for="${id}"]`)?.textContent : null
+ })
+ expect(label).toBeTruthy()
+ }
+ })
+})
diff --git a/e2e/installation.spec.ts b/e2e/installation.spec.ts
index 7a86208..6f4e2a5 100644
--- a/e2e/installation.spec.ts
+++ b/e2e/installation.spec.ts
@@ -1,7 +1,7 @@
-import { test } from '@playwright/test';
+import { test } from '@playwright/test'
test('verify playwright installation', async ({ page }) => {
// Try to navigate to a simple page
- await page.goto('https://example.com');
- console.log('Successfully loaded a page');
-});
\ No newline at end of file
+ await page.goto('https://example.com')
+ console.log('Successfully loaded a page')
+})
diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json
index db381a7..f31fe71 100644
--- a/e2e/tsconfig.json
+++ b/e2e/tsconfig.json
@@ -1,6 +1,4 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
- "include": [
- "./**/*"
- ]
-}
\ No newline at end of file
+ "include": ["./**/*"]
+}
diff --git a/e2e/vue.spec.ts b/e2e/vue.spec.ts
index b558d83..f330e7f 100644
--- a/e2e/vue.spec.ts
+++ b/e2e/vue.spec.ts
@@ -1,49 +1,51 @@
-import { test, expect } from '@playwright/test';
+import { test, expect } from '@playwright/test'
test.describe('Homepage', () => {
test('should display the calculator in French by default', async ({ page }) => {
- await page.goto('/');
+ await page.goto('/')
// Use a more specific selector that only targets the main content heading
- await expect(page.getByRole('heading', { level: 1 }).first()).toHaveText('Calculateur de glucides');
- });
+ await expect(page.getByRole('heading', { level: 1 }).first()).toHaveText(
+ 'Calculateur de glucides'
+ )
+ })
test('should switch language when toggling to English', async ({ page }) => {
- await page.goto('/');
+ await page.goto('/')
// Click the language toggler component first
- const languageToggler = page.locator('#language-toggler');
- await languageToggler.waitFor({ state: 'visible' });
- await languageToggler.click();
+ const languageToggler = page.locator('#language-toggler')
+ await languageToggler.waitFor({ state: 'visible' })
+ await languageToggler.click()
// Now click the English option in the dropdown
- const englishOption = page.getByRole('button', { name: 'English' });
- await englishOption.waitFor({ state: 'visible' });
- await englishOption.click();
+ const englishOption = page.getByRole('button', { name: 'English' })
+ await englishOption.waitFor({ state: 'visible' })
+ await englishOption.click()
// Verify the title has changed to English
- await expect(page.getByRole('heading', { level: 1 }).first()).toHaveText('Carbs Counter');
- });
+ await expect(page.getByRole('heading', { level: 1 }).first()).toHaveText('Carbs Counter')
+ })
test('should have working navigation links', async ({ page }) => {
- await page.goto('/');
+ await page.goto('/')
// Check that all main navigation links are present
- const nav = page.locator('nav[aria-label="Navigation principale"]');
- await expect(nav).toBeVisible();
- await expect(nav).toContainText('Gluko');
- await expect(nav).toContainText('Facteur glucidique');
- await expect(nav).toContainText('À propos');
+ const nav = page.locator('nav[aria-label="Navigation principale"]')
+ await expect(nav).toBeVisible()
+ await expect(nav).toContainText('Gluko')
+ await expect(nav).toContainText('Facteur glucidique')
+ await expect(nav).toContainText('À propos')
// Test navigation to Carb Factor page
- await page.getByRole('link', { name: 'Facteur glucidique' }).click();
- await expect(page).toHaveURL(/.*\/carb-factor/);
+ await page.getByRole('link', { name: 'Facteur glucidique' }).click()
+ await expect(page).toHaveURL(/.*\/carb-factor/)
// Test navigation to About page
- await page.getByRole('link', { name: 'À propos' }).click();
- await expect(page).toHaveURL(/.*\/about/);
+ await page.getByRole('link', { name: 'À propos' }).click()
+ await expect(page).toHaveURL(/.*\/about/)
// Test navigation back to home
- await page.getByRole('link', { name: 'Gluko' }).click();
- await expect(page).toHaveURL(/.*\/$/);
- });
-});
+ await page.getByRole('link', { name: 'Gluko' }).click()
+ await expect(page).toHaveURL(/.*\/$/)
+ })
+})
diff --git a/env.d.ts b/env.d.ts
index 9dd5d79..6082e71 100644
--- a/env.d.ts
+++ b/env.d.ts
@@ -1,4 +1,4 @@
///