diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..4263485 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,68 @@ +stages: + - test + - build + - deploy + +variables: + NODE_VERSION: "20" + +.node_template: &node_template + image: node:${NODE_VERSION}-alpine + cache: + key: ${CI_COMMIT_REF_SLUG} + paths: + - node_modules/ + - ~/.cache/ + before_script: + - npm install -g bun + - bun install + +test: + <<: *node_template + stage: test + script: + - bun run lint + - bun run check + - bun run test --coverage + coverage: '/All files\s*\|\s*[\d.]+\s*\|\s*([\d.]+)/' + artifacts: + reports: + coverage_report: + coverage_format: cobertura + path: coverage/cobertura-coverage.xml + paths: + - coverage/ + expire_in: 1 week + only: + - main + - merge_requests + - branches + +build: + <<: *node_template + stage: build + script: + - bun run build + - bun run build:ldo + artifacts: + paths: + - dist/ + expire_in: 1 hour + only: + - main + - merge_requests + +pages: + <<: *node_template + stage: deploy + script: + - bun run build + - bun run build:ldo + - mkdir public + - cp -r dist/* public/ + artifacts: + paths: + - public + expire_in: 30 days + only: + - main \ No newline at end of file diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..2d78e3d --- /dev/null +++ b/jest.config.js @@ -0,0 +1,26 @@ +export default { + preset: 'ts-jest/presets/default-esm', + extensionsToTreatAsEsm: ['.ts', '.tsx'], + globals: { + 'ts-jest': { + useESM: true, + }, + }, + testEnvironment: 'jsdom', + moduleNameMapping: { + '^@/(.*)$': '/src/$1', + }, + setupFilesAfterEnv: ['/src/setupTests.ts'], + testMatch: [ + '/src/**/__tests__/**/*.(ts|tsx|js)', + '/src/**/?(*.)(spec|test).(ts|tsx|js)', + ], + collectCoverageFrom: [ + 'src/**/*.(ts|tsx)', + '!src/**/*.d.ts', + '!src/main.tsx', + '!src/vite-env.d.ts', + ], + coverageDirectory: 'coverage', + coverageReporters: ['text', 'lcov', 'html'], +}; \ No newline at end of file diff --git a/package.json b/package.json index 8451e79..87c3f01 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,10 @@ "check": "tsc --noEmit && eslint .", "build:ldo": "ldo build --input src/.shapes --output src/.ldo", "lint": "eslint .", - "preview": "vite preview" + "preview": "vite preview", + "test": "jest", + "test:watch": "jest --watch", + "test:coverage": "jest --coverage" }, "dependencies": { "@emotion/react": "^11.14.0", @@ -33,6 +36,10 @@ "devDependencies": { "@eslint/js": "^9.30.1", "@ldo/cli": "^1.0.0-alpha.15", + "@testing-library/jest-dom": "^6.4.2", + "@testing-library/react": "^14.2.1", + "@testing-library/user-event": "^14.5.2", + "@types/jest": "^29.5.12", "@types/jsonld": "^1.5.15", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", @@ -43,6 +50,9 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", + "jest": "^29.7.0", + "jest-environment-jsdom": "^29.7.0", + "ts-jest": "^29.1.2", "typescript": "~5.8.3", "typescript-eslint": "^8.35.1", "vite": "^6.0.0" diff --git a/src/setupTests.ts b/src/setupTests.ts new file mode 100644 index 0000000..331666c --- /dev/null +++ b/src/setupTests.ts @@ -0,0 +1 @@ +import '@testing-library/jest-dom'; \ No newline at end of file diff --git a/vite.config.ts b/vite.config.ts index ef75324..0b51728 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,6 +5,7 @@ import { resolve } from 'node:path' // https://vite.dev/config/ export default defineConfig({ plugins: [react()], + base: process.env.CI ? '/' : '/', resolve: { alias: { "@": resolve(__dirname, "src"),