diff --git a/.changeset/great-teachers-yell.md b/.changeset/great-teachers-yell.md new file mode 100644 index 0000000000..216ee4239e --- /dev/null +++ b/.changeset/great-teachers-yell.md @@ -0,0 +1,4 @@ +--- +--- + +chore: add integration test for the `create fuels` template diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4b1bdde058..07a62aa31f 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -83,6 +83,21 @@ jobs: FUEL_TESTNET_NETWORK_URL: ${{ secrets.FUEL_TESTNET_NETWORK_URL }} PUBLISHED_NPM_VERSION: ${{ steps.release.outputs.published_version }} + create-fuels-template-integration: + timeout-minutes: 10 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Test Setup + uses: ./.github/actions/test-setup + + - name: Run UI tests + run: sh ./scripts/create-fuels-template-integration.sh + test: if: github.base_ref == 'master' || github.ref_name == 'master' runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 42c77f2332..6ad54f9c6b 100644 --- a/.gitignore +++ b/.gitignore @@ -160,3 +160,7 @@ Forc.lock .fuel-core/configs/chainConfig.json .fuel-core/configs/metadata.json .fuel-core/configs/stateConfig.json +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/package.json b/package.json index bba36a2413..f4312be948 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@fuel-ts/utils": "workspace:*", "@internal/tsup": "workspace:*", "@istanbuljs/nyc-config-typescript": "^1.0.2", + "@playwright/test": "^1.44.0", "@types/node": "18.15.3", "@types/node-fetch": "^2.6.2", "@types/web": "^0.0.65", diff --git a/playwright-tests/create-fuels.test.ts b/playwright-tests/create-fuels.test.ts new file mode 100644 index 0000000000..147c30dfa0 --- /dev/null +++ b/playwright-tests/create-fuels.test.ts @@ -0,0 +1,27 @@ +import { test, expect } from '@playwright/test'; + +test('counter contract - increment function call works properly', async ({ page }) => { + await page.goto('http://127.0.0.1:3000/', { waitUntil: 'networkidle' }); + + await page.waitForTimeout(2000); + + const topUpWalletButton = page.getByText('Top-up Wallet'); + await topUpWalletButton.click(); + + const welcomeToFuelText = page.getByText('Welcome to Fuel'); + await expect(welcomeToFuelText).toBeVisible(); + + await page.waitForTimeout(2000); + + await page.reload(); + + await page.waitForTimeout(5000); + + const incrementButton = page.getByText('Increment Counter'); + await incrementButton.click(); + + await page.waitForTimeout(2000); + + const counter = page.getByTestId('counter'); + await expect(counter).toBeVisible(); +}); diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000000..a5ce6fb9b9 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,30 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './playwright-tests', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f4c16d7f1..5d6587161b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,6 +46,9 @@ importers: '@istanbuljs/nyc-config-typescript': specifier: ^1.0.2 version: 1.0.2(nyc@15.1.0) + '@playwright/test': + specifier: ^1.44.0 + version: 1.44.0 '@types/node': specifier: 18.15.3 version: 18.15.3 @@ -63,7 +66,7 @@ importers: version: 6.9.1(eslint@8.52.0)(typescript@5.2.2) '@vitest/browser': specifier: ^1.6.0 - version: 1.6.0(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) + version: 1.6.0(playwright@1.44.0)(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) '@vitest/coverage-istanbul': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@18.15.3)(@vitest/browser@1.6.0)(jsdom@16.7.0)(terser@5.18.2)) @@ -192,7 +195,7 @@ importers: version: link:../../packages/fuels next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.2(@babel/core@7.23.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: ^18.2 version: 18.2.0 @@ -265,7 +268,7 @@ importers: version: link:../../packages/fuels next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.2(@babel/core@7.23.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -403,7 +406,7 @@ importers: version: link:../../packages/fuels next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.2(@babel/core@7.23.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: ^18 version: 18.2.0 @@ -1139,7 +1142,7 @@ importers: version: link:../../packages/fuels next: specifier: 14.2.2 - version: 14.2.2(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 14.2.2(@babel/core@7.23.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: specifier: ^18.2 version: 18.2.0 @@ -3593,6 +3596,11 @@ packages: resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.44.0': + resolution: {integrity: sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==} + engines: {node: '>=16'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.10': resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} @@ -4823,6 +4831,7 @@ packages: abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -6233,6 +6242,7 @@ packages: domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} @@ -6432,11 +6442,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} - engines: {node: '>=6.0'} - hasBin: true - escodegen@2.1.0: resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} engines: {node: '>=6.0'} @@ -7052,6 +7057,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -8283,10 +8293,6 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -9096,10 +9102,6 @@ packages: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -9413,6 +9415,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.44.0: + resolution: {integrity: sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==} + engines: {node: '>=16'} + hasBin: true + + playwright@1.44.0: + resolution: {integrity: sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==} + engines: {node: '>=16'} + hasBin: true + pluralize@2.0.0: resolution: {integrity: sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==} @@ -9877,10 +9889,6 @@ packages: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} engines: {node: '>=10'} - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -11414,10 +11422,6 @@ packages: resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} hasBin: true - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -12040,10 +12044,6 @@ packages: engines: {node: '>=8'} hasBin: true - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -15028,8 +15028,8 @@ snapshots: '@jridgewell/source-map@0.3.3': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.4.14': {} @@ -15328,6 +15328,10 @@ snapshots: picocolors: 1.0.0 tslib: 2.6.0 + '@playwright/test@1.44.0': + dependencies: + playwright: 1.44.0 + '@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.11.0)(type-fest@3.1.0)(webpack-dev-server@4.15.1(webpack@5.88.0(esbuild@0.17.19)))(webpack@5.88.0(esbuild@0.17.19))': dependencies: ansi-html-community: 0.0.8 @@ -16036,7 +16040,7 @@ snapshots: '@types/eslint@8.40.2': dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 '@types/json-schema': 7.0.12 '@types/estree@0.0.39': {} @@ -16581,13 +16585,14 @@ snapshots: vite: 5.2.10(@types/node@20.11.13)(terser@5.18.2) vue: 3.4.15(typescript@5.2.2) - '@vitest/browser@1.6.0(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2))': + '@vitest/browser@1.6.0(playwright@1.44.0)(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2))': dependencies: '@vitest/utils': 1.6.0 magic-string: 0.30.5 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.11.13)(@vitest/browser@1.6.0)(jsdom@16.7.0)(terser@5.18.2) + vitest: 1.6.0(@types/node@18.15.3)(@vitest/browser@1.6.0)(jsdom@16.7.0)(terser@5.18.2) optionalDependencies: + playwright: 1.44.0 webdriverio: 8.36.1(typescript@5.2.2) '@vitest/coverage-istanbul@1.6.0(vitest@1.6.0(@types/node@18.15.3)(@vitest/browser@1.6.0)(jsdom@16.7.0)(terser@5.18.2))': @@ -18930,15 +18935,6 @@ snapshots: escape-string-regexp@4.0.0: {} - escodegen@2.0.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - escodegen@2.1.0: dependencies: esprima: 4.0.1 @@ -19974,6 +19970,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -21414,7 +21413,7 @@ snapshots: data-urls: 2.0.0 decimal.js: 10.4.3 domexception: 2.0.1 - escodegen: 2.0.0 + escodegen: 2.1.0 form-data: 3.0.1 html-encoding-sniffer: 2.0.1 http-proxy-agent: 4.0.1 @@ -21562,11 +21561,6 @@ snapshots: leven@3.1.0: {} - levn@0.3.0: - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -22163,7 +22157,7 @@ snapshots: netmask@2.0.2: {} - next@14.2.2(@babel/core@7.23.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + next@14.2.2(@babel/core@7.23.3)(@playwright/test@1.44.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: '@next/env': 14.2.2 '@swc/helpers': 0.5.5 @@ -22184,6 +22178,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 14.2.2 '@next/swc-win32-ia32-msvc': 14.2.2 '@next/swc-win32-x64-msvc': 14.2.2 + '@playwright/test': 1.44.0 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -22494,15 +22489,6 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 2.2.0 - optionator@0.8.3: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -22813,6 +22799,14 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.44.0: {} + + playwright@1.44.0: + dependencies: + playwright-core: 1.44.0 + optionalDependencies: + fsevents: 2.3.2 + pluralize@2.0.0: {} portfinder@1.0.32: @@ -23299,8 +23293,6 @@ snapshots: path-exists: 4.0.0 which-pm: 2.0.0 - prelude-ls@1.1.2: {} - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -24889,7 +24881,7 @@ snapshots: terser@5.18.2: dependencies: '@jridgewell/source-map': 0.3.3 - acorn: 8.9.0 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -25248,10 +25240,6 @@ snapshots: turbo-windows-64: 1.13.3 turbo-windows-arm64: 1.13.3 - type-check@0.3.2: - dependencies: - prelude-ls: 1.1.2 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -25723,7 +25711,7 @@ snapshots: why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 18.15.3 - '@vitest/browser': 1.6.0(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) + '@vitest/browser': 1.6.0(playwright@1.44.0)(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) jsdom: 16.7.0 transitivePeerDependencies: - less @@ -25758,7 +25746,7 @@ snapshots: why-is-node-running: 2.2.2 optionalDependencies: '@types/node': 20.11.13 - '@vitest/browser': 1.6.0(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) + '@vitest/browser': 1.6.0(playwright@1.44.0)(vitest@1.6.0)(webdriverio@8.36.1(typescript@5.2.2)) jsdom: 16.7.0 transitivePeerDependencies: - less @@ -26099,8 +26087,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - word-wrap@1.2.3: {} - wordwrap@1.0.0: {} workbox-background-sync@6.6.0: diff --git a/scripts/create-fuels-template-integration.sh b/scripts/create-fuels-template-integration.sh new file mode 100644 index 0000000000..5f9fd52e6b --- /dev/null +++ b/scripts/create-fuels-template-integration.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +(cd templates/nextjs && pnpm run fuels:dev) & +cp templates/nextjs/.env.example templates/nextjs/.env.local +(cd templates/nextjs && pnpm run dev) & +pnpm exec playwright install --with-deps +pnpm exec playwright test \ No newline at end of file diff --git a/templates/nextjs/src/pages/index.tsx b/templates/nextjs/src/pages/index.tsx index 1a26a38e8a..75505c0ded 100644 --- a/templates/nextjs/src/pages/index.tsx +++ b/templates/nextjs/src/pages/index.tsx @@ -82,7 +82,9 @@ export default function Home() { <>

Counter

- {counter} + + {counter} +