diff --git a/.drone/README.md b/.drone/README.md deleted file mode 100644 index d89b30bcc..000000000 --- a/.drone/README.md +++ /dev/null @@ -1,10 +0,0 @@ -When updating the drone.yml file the file must be re-signed using `yarn drone`. This is limited to Grafana employees for security reasons. - -Drone environment variables will need to be setup beforehand. - -``` -export DRONE_SERVER= -export DRONE_TOKEN= -``` - -These can be found at https://drone.grafana.net/account diff --git a/.drone/drone.yml b/.drone/drone.yml deleted file mode 100644 index 0563e91ad..000000000 --- a/.drone/drone.yml +++ /dev/null @@ -1,148 +0,0 @@ ---- -name: test -kind: pipeline -type: docker - -trigger: - event: - exclude: - - push - - tag - include: - - pull_request - -steps: - - name: install-dependencies - image: node:lts-bookworm - commands: - - yarn install --frozen-lockfile - - - name: build - image: node:lts-bookworm - depends_on: - - install-dependencies - commands: - - yarn build - - - name: lint - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:lint - - - name: circular-dependencies-test - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:circular-deps - - - name: unit-tests - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:test - - - name: e2e-tests - image: cypress/included:10.8.0 - depends_on: - - build - commands: - - yarn quality:e2e:ci - environment: - IS_TEST: 1 - -services: - - name: database - image: postgres:latest - environment: - POSTGRES_DB: demo - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - ---- -name: release -kind: pipeline -type: docker - -trigger: - event: - exclude: - - push - - pull_request - include: - - tag - -steps: - - name: install-dependencies - image: node:lts-bookworm - commands: - - yarn install --frozen-lockfile - - - name: build - image: node:lts-bookworm - depends_on: - - install-dependencies - commands: - - yarn build - - - name: lint - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:lint - - - name: circular-dependencies-test - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:circular-deps - - - name: unit-tests - image: node:lts-bookworm - depends_on: - - build - commands: - - yarn quality:test - - - name: e2e-tests - image: cypress/included:10.8.0 - depends_on: - - build - commands: - - yarn quality:e2e:ci - environment: - IS_TEST: 1 - - - name: publish - image: node:lts-bookworm - depends_on: - - lint - - circular-dependencies-test - - unit-tests - - e2e-tests - commands: - - git fetch --tags - - echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > .npmrc - - yarn run publish from-git --yes --no-verify-access - environment: - NPM_TOKEN: - from_secret: NPM_TOKEN - -services: - - name: database - image: postgres:latest - environment: - POSTGRES_DB: demo - POSTGRES_PASSWORD: postgres - POSTGRES_USER: postgres - ---- -kind: signature -hmac: 0d50a79bb37cf63e4529edb813871ed5a78738c633fa41e17cd976b7526e82dc - -... diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml index ab16e8d8b..aedb331d6 100644 --- a/.github/dependabot.yaml +++ b/.github/dependabot.yaml @@ -17,3 +17,18 @@ updates: ignore: - dependency-name: 'ua-parser-js' versions: ['2.x'] + - package-ecosystem: 'docker' + directory: '/' + schedule: + interval: 'daily' + commit-message: + prefix: 'chore' + include: 'scope' + # github actions + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'daily' + commit-message: + prefix: 'chore' + include: 'scope' diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 000000000..d52e278d2 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,83 @@ +name: Pull Request + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/jod' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + - name: Lint + run: yarn quality:lint + + - name: Check circular dependencies + run: yarn quality:circular-deps + + - name: Unit tests + run: yarn quality:test + + e2e: + runs-on: ubuntu-latest + container: + image: cypress/browsers + options: --user 1001 + + services: + database: + image: postgres:latest + env: + POSTGRES_DB: demo + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/iron' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + - name: E2E tests + uses: cypress-io/github-action@v6 + env: + DATABASE_HOST: database + DATABASE_PORT: 5432 + DATABASE_NAME: demo + DATABASE_USER: postgres + DATABASE_PASSWORD: postgres + IS_TEST: 1 + with: + command: yarn quality:e2e:ci + install: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..76a720eb9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,114 @@ +name: Release + +on: + push: + tags: + - '*' + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/*' + cache: 'yarn' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + - name: Lint + run: yarn quality:lint + + - name: Check circular dependencies + run: yarn quality:circular-deps + + - name: Unit tests + run: yarn quality:test + + e2e: + runs-on: ubuntu-latest + container: + image: cypress/browsers:22.12.0 + options: --user 1001 + needs: test + + services: + database: + image: postgres:latest + env: + POSTGRES_DB: demo + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/iron' + cache: 'yarn' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + - name: E2E tests + uses: cypress-io/github-action@v6 + env: + DATABASE_HOST: database + DATABASE_PORT: 5432 + DATABASE_NAME: demo + DATABASE_USER: postgres + DATABASE_PASSWORD: postgres + IS_TEST: 1 + with: + command: yarn quality:e2e:ci + install: false + + publish: + runs-on: ubuntu-latest + needs: [test, e2e] + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 'lts/iron' + cache: 'yarn' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + - name: Publish + run: yarn run publish from-git --yes --no-verify-access + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/Dockerfile b/Dockerfile index 3eaa3087b..a54c2b349 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine +FROM node:20-alpine ARG DEMO_DEMO_PATH ARG DEMO_PACKAGES_CORE_PATH diff --git a/demo/src/client/components/Navbar/Navbar.tsx b/demo/src/client/components/Navbar/Navbar.tsx index 82cf44b94..206d11383 100644 --- a/demo/src/client/components/Navbar/Navbar.tsx +++ b/demo/src/client/components/Navbar/Navbar.tsx @@ -1,7 +1,5 @@ import type { MouseEventHandler } from 'react'; -import Container from 'react-bootstrap/Container'; -import Nav from 'react-bootstrap/Nav'; -import BootstrapNavbar from 'react-bootstrap/Navbar'; +import { Navbar as BootstrapNavbar, Container, Nav } from 'react-bootstrap'; import { LinkContainer } from 'react-router-bootstrap'; import { useAppSelector } from '../../hooks'; diff --git a/demo/src/client/index.tsx b/demo/src/client/index.tsx index c12512156..34313321d 100644 --- a/demo/src/client/index.tsx +++ b/demo/src/client/index.tsx @@ -1,5 +1,5 @@ import { StrictMode } from 'react'; -import SSRProvider from 'react-bootstrap/SSRProvider'; +import { SSRProvider } from 'react-bootstrap'; import { hydrateRoot } from 'react-dom/client'; import { HelmetProvider } from 'react-helmet-async'; import { Provider as ReduxProvider } from 'react-redux'; diff --git a/demo/src/client/layouts/GeneralLayout/GeneralLayout.tsx b/demo/src/client/layouts/GeneralLayout/GeneralLayout.tsx index 74f554e71..c52724c4d 100644 --- a/demo/src/client/layouts/GeneralLayout/GeneralLayout.tsx +++ b/demo/src/client/layouts/GeneralLayout/GeneralLayout.tsx @@ -1,5 +1,5 @@ import type { MouseEvent } from 'react'; -import Container from 'react-bootstrap/Container'; +import { Container } from 'react-bootstrap'; import { Outlet, useNavigate } from 'react-router-dom'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/ArticleAdd/ArticleAddForm.tsx b/demo/src/client/pages/ArticleAdd/ArticleAddForm.tsx index d4e0b4847..e8756814e 100644 --- a/demo/src/client/pages/ArticleAdd/ArticleAddForm.tsx +++ b/demo/src/client/pages/ArticleAdd/ArticleAddForm.tsx @@ -1,7 +1,5 @@ import { useEffect } from 'react'; -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; -import Form from 'react-bootstrap/Form'; +import { Alert, Button, Form } from 'react-bootstrap'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; diff --git a/demo/src/client/pages/ArticleView/ArticleView.tsx b/demo/src/client/pages/ArticleView/ArticleView.tsx index a0160248f..7365df335 100644 --- a/demo/src/client/pages/ArticleView/ArticleView.tsx +++ b/demo/src/client/pages/ArticleView/ArticleView.tsx @@ -1,4 +1,4 @@ -import Container from 'react-bootstrap/Container'; +import { Container } from 'react-bootstrap'; import { useParams } from 'react-router-dom'; import { useGetArticleQuery } from '../../api'; diff --git a/demo/src/client/pages/ArticleView/CommentAddForm.tsx b/demo/src/client/pages/ArticleView/CommentAddForm.tsx index df89f0b8f..b947a1ff2 100644 --- a/demo/src/client/pages/ArticleView/CommentAddForm.tsx +++ b/demo/src/client/pages/ArticleView/CommentAddForm.tsx @@ -1,7 +1,5 @@ import { useEffect } from 'react'; -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; -import Form from 'react-bootstrap/Form'; +import { Alert, Button, Form } from 'react-bootstrap'; import { useForm } from 'react-hook-form'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Articles/Articles.tsx b/demo/src/client/pages/Articles/Articles.tsx index 213f8d679..6c44fa26b 100644 --- a/demo/src/client/pages/Articles/Articles.tsx +++ b/demo/src/client/pages/Articles/Articles.tsx @@ -1,6 +1,5 @@ import { useState } from 'react'; -import Container from 'react-bootstrap/Container'; -import Pagination from 'react-bootstrap/Pagination'; +import { Container, Pagination } from 'react-bootstrap'; import { Link } from 'react-router-dom'; import { withFaroProfiler } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/ConsoleInstrumentation.tsx b/demo/src/client/pages/Features/ConsoleInstrumentation.tsx index 28700aeda..7b6ca8e5b 100644 --- a/demo/src/client/pages/Features/ConsoleInstrumentation.tsx +++ b/demo/src/client/pages/Features/ConsoleInstrumentation.tsx @@ -1,7 +1,5 @@ import { useState } from 'react'; -import Button from 'react-bootstrap/Button'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; -import Form from 'react-bootstrap/Form'; +import { Button, ButtonGroup, Form } from 'react-bootstrap'; import { faro, LogLevel } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/Counter.tsx b/demo/src/client/pages/Features/Counter.tsx index a0642c903..3c53d85e1 100644 --- a/demo/src/client/pages/Features/Counter.tsx +++ b/demo/src/client/pages/Features/Counter.tsx @@ -1,4 +1,4 @@ -import Button from 'react-bootstrap/Button'; +import { Button } from 'react-bootstrap'; import { withFaroErrorBoundary, withFaroProfiler } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/ErrorInstrumentation.tsx b/demo/src/client/pages/Features/ErrorInstrumentation.tsx index a3fa93112..62b05b300 100644 --- a/demo/src/client/pages/Features/ErrorInstrumentation.tsx +++ b/demo/src/client/pages/Features/ErrorInstrumentation.tsx @@ -1,5 +1,4 @@ -import Button from 'react-bootstrap/Button'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; +import { Button, ButtonGroup } from 'react-bootstrap'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/Events.tsx b/demo/src/client/pages/Features/Events.tsx index 4b38e360f..06da151c4 100644 --- a/demo/src/client/pages/Features/Events.tsx +++ b/demo/src/client/pages/Features/Events.tsx @@ -1,5 +1,4 @@ -import Button from 'react-bootstrap/Button'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; +import { Button, ButtonGroup } from 'react-bootstrap'; import { createSession, faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/Features.tsx b/demo/src/client/pages/Features/Features.tsx index c503dd3df..bacbb48f5 100644 --- a/demo/src/client/pages/Features/Features.tsx +++ b/demo/src/client/pages/Features/Features.tsx @@ -1,4 +1,4 @@ -import Container from 'react-bootstrap/Container'; +import { Container } from 'react-bootstrap'; import { Page } from '../../components'; diff --git a/demo/src/client/pages/Features/MetricsMeasurements.tsx b/demo/src/client/pages/Features/MetricsMeasurements.tsx index 8f350dc8b..c46db375d 100644 --- a/demo/src/client/pages/Features/MetricsMeasurements.tsx +++ b/demo/src/client/pages/Features/MetricsMeasurements.tsx @@ -1,5 +1,4 @@ -import Button from 'react-bootstrap/Button'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; +import { Button, ButtonGroup } from 'react-bootstrap'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Features/TracingInstrumentation.tsx b/demo/src/client/pages/Features/TracingInstrumentation.tsx index 74cdef99a..2ee507cc6 100644 --- a/demo/src/client/pages/Features/TracingInstrumentation.tsx +++ b/demo/src/client/pages/Features/TracingInstrumentation.tsx @@ -1,6 +1,5 @@ import { SpanStatusCode } from '@opentelemetry/api'; -import Button from 'react-bootstrap/Button'; -import ButtonGroup from 'react-bootstrap/ButtonGroup'; +import { Button, ButtonGroup } from 'react-bootstrap'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/client/pages/Login/LoginForm.tsx b/demo/src/client/pages/Login/LoginForm.tsx index 80b4e9fdd..bf0fdf2ff 100644 --- a/demo/src/client/pages/Login/LoginForm.tsx +++ b/demo/src/client/pages/Login/LoginForm.tsx @@ -1,7 +1,5 @@ import { useEffect } from 'react'; -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; -import Form from 'react-bootstrap/Form'; +import { Alert, Button, Form } from 'react-bootstrap'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; diff --git a/demo/src/client/pages/Register/RegisterForm.tsx b/demo/src/client/pages/Register/RegisterForm.tsx index a9eca6222..c26cfedfc 100644 --- a/demo/src/client/pages/Register/RegisterForm.tsx +++ b/demo/src/client/pages/Register/RegisterForm.tsx @@ -1,7 +1,5 @@ import { useEffect } from 'react'; -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; -import Form from 'react-bootstrap/Form'; +import { Alert, Button, Form } from 'react-bootstrap'; import { useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; diff --git a/demo/src/client/pages/Seed/Seed.tsx b/demo/src/client/pages/Seed/Seed.tsx index 9386fcece..401db7e1c 100644 --- a/demo/src/client/pages/Seed/Seed.tsx +++ b/demo/src/client/pages/Seed/Seed.tsx @@ -1,5 +1,4 @@ -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; +import { Alert, Button } from 'react-bootstrap'; import { faro } from '@grafana/faro-react'; diff --git a/demo/src/server/routes/render/renderToString.tsx b/demo/src/server/routes/render/renderToString.tsx index 6f61d8f39..ad7e1335e 100644 --- a/demo/src/server/routes/render/renderToString.tsx +++ b/demo/src/server/routes/render/renderToString.tsx @@ -1,5 +1,5 @@ import { StrictMode } from 'react'; -import SSRProvider from 'react-bootstrap/SSRProvider'; +import { SSRProvider } from 'react-bootstrap'; import { renderToString as reactRenderToString } from 'react-dom/server'; import { HelmetProvider } from 'react-helmet-async'; import type { FilledContext } from 'react-helmet-async';