diff --git a/.env.example b/.env.example deleted file mode 100644 index d0785c1..0000000 --- a/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -UPSTASH_REDIS_REST_URL= -UPSTASH_REDIS_REST_TOKEN= \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e6cfa2a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize] + +jobs: + check-and-test: + name: Check and Test + timeout-minutes: 15 + runs-on: ubuntu-latest + env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ vars.TURBO_TEAM }} + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'npm' + + - name: Install dependencies + run: npm install + + # Check: https://github.com/vercel/next.js/issues/53959 + # - name: Check types + # run: npm run check-types + + - name: Check linting + run: npm run lint + + - name: Run tests + run: npm run test + + + # automated-testing: + # name: E2E Testing \ No newline at end of file diff --git a/.gitignore b/.gitignore index 5ee4748..7f5ae2e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,29 +1,26 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies -/node_modules -/.pnp +node_modules +.pnp .pnp.js .yarn/install-state.gz # testing -/coverage +coverage # next.js -/.next/ -/out/ +.next/ +out/ # production -/build +build +dist # misc .DS_Store *.pem -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* # local env files .env*.local @@ -35,3 +32,13 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +# turbo +.turbo + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + diff --git a/.vscode/settings.json b/.vscode/settings.json index 16cd82e..374abcd 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,6 +3,6 @@ "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.organizeImports": "always", - "source.fixAll.eslint": "never" + "source.fixAll.biome": "always" } } diff --git a/README.md b/README.md index b6fc3be..228ed75 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,15 @@ The main goal is to provide a better way to explore tech companies in Portugal. +## Monorepo structure 📦 + +- `apps/web`: The main web app +- `tooling/typescript`: TypeScript configuration + ## Features 🚀 - List of tech companies in Portugal synced with the opensource [tech-companies-in-portugal](https://github.com/marmelo/tech-companies-in-portugal) repository -- Search capabilities +- Fast search capabilities - SEO friendly - Responsive design @@ -19,6 +24,8 @@ The main goal is to provide a better way to explore tech companies in Portugal. - [Biome](https://biomejs.dev/) - Formatting and linting - [Motion](https://motion.dev/) - Animation library - [Nuqs](https://nuqs.47ng.com) - URL query state management (client and server support + some other cool features out of the box) +- [Turbo](https://turbo.build/) - Monorepo build system +- [Vercel](https://vercel.com/) - Hosting and CI/CD ## How to contribute 🤝 diff --git a/components.json b/apps/web/components.json similarity index 100% rename from components.json rename to apps/web/components.json diff --git a/next.config.ts b/apps/web/next.config.ts similarity index 100% rename from next.config.ts rename to apps/web/next.config.ts diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..92ee215 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,55 @@ +{ + "name": "@tech-companies-portugal/web", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "next dev --turbopack", + "build": "next build", + "start": "next start", + "lint": "biome check .", + "format": "biome format --write .", + "check-types": "npm run ts:version && tsc --noEmit", + "clean": "git clean -xdf .next .turbo node_modules", + "ts:version": "tsc --version", + "test": "echo 'No tests to run'" + }, + "dependencies": { + "@radix-ui/react-collapsible": "1.1.2", + "@radix-ui/react-label": "2.1.1", + "@radix-ui/react-select": "2.1.4", + "@radix-ui/react-slot": "1.1.1", + "cheerio": "1.0.0-rc.12", + "class-variance-authority": "0.7.0", + "clsx": "2.1.0", + "date-fns": "3.3.1", + "geist": "1.3.1", + "lucide-react": "0.469.0", + "motion": "11.17.0", + "next": "15.1.4", + "nuqs": "2.3.1", + "react": "19.0.0", + "react-dom": "19.0.0", + "react-type-animation": "3.2.0", + "recharts": "2.15.0", + "sharp": "0.33.2", + "slugify": "1.6.6", + "tailwind-merge": "2.2.1", + "tailwindcss-animate": "1.0.7", + "use-debounce": "10.0.4" + }, + "devDependencies": { + "@tech-companies-portugal/typescript": "*", + "@types/node": "^20", + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", + "autoprefixer": "^10.0.1", + "postcss": "^8", + "tailwindcss": "^3.3.0", + "typescript": "^5" + }, + "overrides": { + "@types/react": "19.0.2", + "@types/react-dom": "19.0.2", + "react-is": "19.0.0" + } +} \ No newline at end of file diff --git a/postcss.config.js b/apps/web/postcss.config.js similarity index 100% rename from postcss.config.js rename to apps/web/postcss.config.js diff --git a/public/assets/images/bg-header.webp b/apps/web/public/assets/images/bg-header.webp similarity index 100% rename from public/assets/images/bg-header.webp rename to apps/web/public/assets/images/bg-header.webp diff --git a/public/assets/images/empty.png b/apps/web/public/assets/images/empty.png similarity index 100% rename from public/assets/images/empty.png rename to apps/web/public/assets/images/empty.png diff --git a/public/assets/images/logo.png b/apps/web/public/assets/images/logo.png similarity index 100% rename from public/assets/images/logo.png rename to apps/web/public/assets/images/logo.png diff --git a/src/app/(companies-list)/layout.tsx b/apps/web/src/app/(companies-list)/layout.tsx similarity index 95% rename from src/app/(companies-list)/layout.tsx rename to apps/web/src/app/(companies-list)/layout.tsx index dd99139..68c3c03 100644 --- a/src/app/(companies-list)/layout.tsx +++ b/apps/web/src/app/(companies-list)/layout.tsx @@ -16,7 +16,7 @@ export default function AppLayout({ children }: LayoutProps) { const AppLoading = () => { return ( -
+
diff --git a/src/app/(companies-list)/page.tsx b/apps/web/src/app/(companies-list)/page.tsx similarity index 100% rename from src/app/(companies-list)/page.tsx rename to apps/web/src/app/(companies-list)/page.tsx diff --git a/src/app/api/og/_utils.ts b/apps/web/src/app/api/og/_utils.ts similarity index 95% rename from src/app/api/og/_utils.ts rename to apps/web/src/app/api/og/_utils.ts index 2735c47..56df311 100644 --- a/src/app/api/og/_utils.ts +++ b/apps/web/src/app/api/og/_utils.ts @@ -10,7 +10,7 @@ export async function loadGoogleFont(font: string, text: string) { /src: url\((.+)\) format\('(opentype|truetype)'\)/, ); - if (resource) { + if (resource?.[1]) { const response = await fetch(resource[1]); if (response.status == 200) { return await response.arrayBuffer(); diff --git a/src/app/api/og/route.tsx b/apps/web/src/app/api/og/route.tsx similarity index 100% rename from src/app/api/og/route.tsx rename to apps/web/src/app/api/og/route.tsx diff --git a/src/app/company/[slug]/layout.tsx b/apps/web/src/app/company/[slug]/layout.tsx similarity index 100% rename from src/app/company/[slug]/layout.tsx rename to apps/web/src/app/company/[slug]/layout.tsx diff --git a/src/app/company/[slug]/not-found.tsx b/apps/web/src/app/company/[slug]/not-found.tsx similarity index 100% rename from src/app/company/[slug]/not-found.tsx rename to apps/web/src/app/company/[slug]/not-found.tsx diff --git a/src/app/company/[slug]/page.tsx b/apps/web/src/app/company/[slug]/page.tsx similarity index 100% rename from src/app/company/[slug]/page.tsx rename to apps/web/src/app/company/[slug]/page.tsx diff --git a/src/app/company/sitemap.ts b/apps/web/src/app/company/sitemap.ts similarity index 100% rename from src/app/company/sitemap.ts rename to apps/web/src/app/company/sitemap.ts diff --git a/src/app/error.tsx b/apps/web/src/app/error.tsx similarity index 100% rename from src/app/error.tsx rename to apps/web/src/app/error.tsx diff --git a/src/app/favicon.ico b/apps/web/src/app/favicon.ico similarity index 100% rename from src/app/favicon.ico rename to apps/web/src/app/favicon.ico diff --git a/src/app/globals.css b/apps/web/src/app/globals.css similarity index 100% rename from src/app/globals.css rename to apps/web/src/app/globals.css diff --git a/src/app/layout.tsx b/apps/web/src/app/layout.tsx similarity index 100% rename from src/app/layout.tsx rename to apps/web/src/app/layout.tsx diff --git a/src/app/not-found.tsx b/apps/web/src/app/not-found.tsx similarity index 100% rename from src/app/not-found.tsx rename to apps/web/src/app/not-found.tsx diff --git a/src/app/robots.ts b/apps/web/src/app/robots.ts similarity index 100% rename from src/app/robots.ts rename to apps/web/src/app/robots.ts diff --git a/src/app/sitemap.ts b/apps/web/src/app/sitemap.ts similarity index 100% rename from src/app/sitemap.ts rename to apps/web/src/app/sitemap.ts diff --git a/src/components/CompaniesHeader.tsx b/apps/web/src/components/CompaniesHeader.tsx similarity index 100% rename from src/components/CompaniesHeader.tsx rename to apps/web/src/components/CompaniesHeader.tsx diff --git a/src/components/CompaniesList.tsx b/apps/web/src/components/CompaniesList.tsx similarity index 100% rename from src/components/CompaniesList.tsx rename to apps/web/src/components/CompaniesList.tsx diff --git a/src/components/CompaniesListFooter.tsx b/apps/web/src/components/CompaniesListFooter.tsx similarity index 100% rename from src/components/CompaniesListFooter.tsx rename to apps/web/src/components/CompaniesListFooter.tsx diff --git a/src/components/CompaniesListHeader.tsx b/apps/web/src/components/CompaniesListHeader.tsx similarity index 100% rename from src/components/CompaniesListHeader.tsx rename to apps/web/src/components/CompaniesListHeader.tsx diff --git a/src/components/CompanyItem.tsx b/apps/web/src/components/CompanyItem.tsx similarity index 100% rename from src/components/CompanyItem.tsx rename to apps/web/src/components/CompanyItem.tsx diff --git a/src/components/CopyUrlButton.tsx b/apps/web/src/components/CopyUrlButton.tsx similarity index 100% rename from src/components/CopyUrlButton.tsx rename to apps/web/src/components/CopyUrlButton.tsx diff --git a/src/components/EmptyState.tsx b/apps/web/src/components/EmptyState.tsx similarity index 100% rename from src/components/EmptyState.tsx rename to apps/web/src/components/EmptyState.tsx diff --git a/src/components/ExploreButton.tsx b/apps/web/src/components/ExploreButton.tsx similarity index 100% rename from src/components/ExploreButton.tsx rename to apps/web/src/components/ExploreButton.tsx diff --git a/src/components/FeaturedSideSection.tsx b/apps/web/src/components/FeaturedSideSection.tsx similarity index 100% rename from src/components/FeaturedSideSection.tsx rename to apps/web/src/components/FeaturedSideSection.tsx diff --git a/src/components/FiltersButton.tsx b/apps/web/src/components/FiltersButton.tsx similarity index 100% rename from src/components/FiltersButton.tsx rename to apps/web/src/components/FiltersButton.tsx diff --git a/src/components/FiltersPanelButton.tsx b/apps/web/src/components/FiltersPanelButton.tsx similarity index 100% rename from src/components/FiltersPanelButton.tsx rename to apps/web/src/components/FiltersPanelButton.tsx diff --git a/src/components/Footer.tsx b/apps/web/src/components/Footer.tsx similarity index 100% rename from src/components/Footer.tsx rename to apps/web/src/components/Footer.tsx diff --git a/src/components/HotFeaturedBadge.tsx b/apps/web/src/components/HotFeaturedBadge.tsx similarity index 100% rename from src/components/HotFeaturedBadge.tsx rename to apps/web/src/components/HotFeaturedBadge.tsx diff --git a/src/components/Navbar.tsx b/apps/web/src/components/Navbar.tsx similarity index 100% rename from src/components/Navbar.tsx rename to apps/web/src/components/Navbar.tsx diff --git a/src/components/NoCompaniesResults.tsx b/apps/web/src/components/NoCompaniesResults.tsx similarity index 100% rename from src/components/NoCompaniesResults.tsx rename to apps/web/src/components/NoCompaniesResults.tsx diff --git a/src/components/SearchSideBar.tsx b/apps/web/src/components/SearchSideBar.tsx similarity index 100% rename from src/components/SearchSideBar.tsx rename to apps/web/src/components/SearchSideBar.tsx diff --git a/src/components/SideBar.tsx b/apps/web/src/components/SideBar.tsx similarity index 100% rename from src/components/SideBar.tsx rename to apps/web/src/components/SideBar.tsx diff --git a/src/components/hooks/useSearchQueryParams.tsx b/apps/web/src/components/hooks/useSearchQueryParams.tsx similarity index 100% rename from src/components/hooks/useSearchQueryParams.tsx rename to apps/web/src/components/hooks/useSearchQueryParams.tsx diff --git a/src/components/ui/AnimatedCompaniesFeatures.tsx b/apps/web/src/components/ui/AnimatedCompaniesFeatures.tsx similarity index 100% rename from src/components/ui/AnimatedCompaniesFeatures.tsx rename to apps/web/src/components/ui/AnimatedCompaniesFeatures.tsx diff --git a/src/components/ui/badge.tsx b/apps/web/src/components/ui/badge.tsx similarity index 100% rename from src/components/ui/badge.tsx rename to apps/web/src/components/ui/badge.tsx diff --git a/src/components/ui/button.tsx b/apps/web/src/components/ui/button.tsx similarity index 100% rename from src/components/ui/button.tsx rename to apps/web/src/components/ui/button.tsx diff --git a/src/components/ui/card.tsx b/apps/web/src/components/ui/card.tsx similarity index 100% rename from src/components/ui/card.tsx rename to apps/web/src/components/ui/card.tsx diff --git a/src/components/ui/dot-pattern.tsx b/apps/web/src/components/ui/dot-pattern.tsx similarity index 100% rename from src/components/ui/dot-pattern.tsx rename to apps/web/src/components/ui/dot-pattern.tsx diff --git a/src/components/ui/input.tsx b/apps/web/src/components/ui/input.tsx similarity index 100% rename from src/components/ui/input.tsx rename to apps/web/src/components/ui/input.tsx diff --git a/src/components/ui/label.tsx b/apps/web/src/components/ui/label.tsx similarity index 100% rename from src/components/ui/label.tsx rename to apps/web/src/components/ui/label.tsx diff --git a/src/components/ui/retro-container.tsx b/apps/web/src/components/ui/retro-container.tsx similarity index 100% rename from src/components/ui/retro-container.tsx rename to apps/web/src/components/ui/retro-container.tsx diff --git a/src/components/ui/select.tsx b/apps/web/src/components/ui/select.tsx similarity index 100% rename from src/components/ui/select.tsx rename to apps/web/src/components/ui/select.tsx diff --git a/src/components/ui/skeleton.tsx b/apps/web/src/components/ui/skeleton.tsx similarity index 100% rename from src/components/ui/skeleton.tsx rename to apps/web/src/components/ui/skeleton.tsx diff --git a/src/lib/featured.ts b/apps/web/src/lib/featured.ts similarity index 100% rename from src/lib/featured.ts rename to apps/web/src/lib/featured.ts diff --git a/src/lib/fonts.ts b/apps/web/src/lib/fonts.ts similarity index 100% rename from src/lib/fonts.ts rename to apps/web/src/lib/fonts.ts diff --git a/src/lib/metadata.ts b/apps/web/src/lib/metadata.ts similarity index 100% rename from src/lib/metadata.ts rename to apps/web/src/lib/metadata.ts diff --git a/src/lib/parser.ts b/apps/web/src/lib/parser.ts similarity index 100% rename from src/lib/parser.ts rename to apps/web/src/lib/parser.ts diff --git a/src/lib/parser/companies.ts b/apps/web/src/lib/parser/companies.ts similarity index 100% rename from src/lib/parser/companies.ts rename to apps/web/src/lib/parser/companies.ts diff --git a/src/lib/search-params.ts b/apps/web/src/lib/search-params.ts similarity index 100% rename from src/lib/search-params.ts rename to apps/web/src/lib/search-params.ts diff --git a/src/lib/types.ts b/apps/web/src/lib/types.ts similarity index 100% rename from src/lib/types.ts rename to apps/web/src/lib/types.ts diff --git a/src/lib/utils.ts b/apps/web/src/lib/utils.ts similarity index 100% rename from src/lib/utils.ts rename to apps/web/src/lib/utils.ts diff --git a/tailwind.config.ts b/apps/web/tailwind.config.ts similarity index 100% rename from tailwind.config.ts rename to apps/web/tailwind.config.ts diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..bb65cc3 --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,17 @@ +{ + "extends": "@tech-companies-portugal/typescript/nextjs.json", + "compilerOptions": { + "plugins": [ + { + "name": "next" + } + ], + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + }, + "target": "ES2017" + }, + "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx"], + "exclude": ["node_modules"] +} diff --git a/biome.json b/biome.json index 51b8251..da60109 100644 --- a/biome.json +++ b/biome.json @@ -39,6 +39,7 @@ "enabled": true, "rules": { "recommended": false, + "suspicious": {}, "style": { "useBlockStatements": "off" } @@ -57,4 +58,4 @@ "bracketSpacing": true } } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 127d99b..7001d19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,20 @@ "packages": { "": { "name": "tech-companies-portugal", + "workspaces": [ + "apps/*", + "tooling/*" + ], + "devDependencies": { + "@biomejs/biome": "1.9.4", + "turbo": "2.3.3" + }, + "engines": { + "node": ">=22" + } + }, + "apps/web": { + "name": "@tech-companies-portugal/web", "version": "0.0.0", "dependencies": { "@radix-ui/react-collapsible": "1.1.2", @@ -32,18 +46,14 @@ "use-debounce": "10.0.4" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@tech-companies-portugal/typescript": "*", "@types/node": "^20", "@types/react": "19.0.2", "@types/react-dom": "19.0.2", "autoprefixer": "^10.0.1", "postcss": "^8", "tailwindcss": "^3.3.0", - "tsx": "4.7.0", "typescript": "^5" - }, - "engines": { - "node": ">=22" } }, "node_modules/@alloc/quick-lru": { @@ -241,374 +251,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@floating-ui/core": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", @@ -1895,6 +1537,14 @@ "tslib": "^2.8.0" } }, + "node_modules/@tech-companies-portugal/typescript": { + "resolved": "tooling/typescript", + "link": true + }, + "node_modules/@tech-companies-portugal/web": { + "resolved": "apps/web", + "link": true + }, "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", @@ -2632,44 +2282,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -2833,18 +2445,6 @@ "node": ">=6" } }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, "node_modules/glob": { "version": "10.3.10", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", @@ -3813,9 +3413,10 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4226,15 +3827,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -4626,25 +4218,108 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "node_modules/turbo": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo/-/turbo-2.3.3.tgz", + "integrity": "sha512-DUHWQAcC8BTiUZDRzAYGvpSpGLiaOQPfYXlCieQbwUvmml/LRGIe3raKdrOPOoiX0DYlzxs2nH6BoWJoZrj8hA==", "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, + "license": "MIT", "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" + "turbo": "bin/turbo" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "turbo-darwin-64": "2.3.3", + "turbo-darwin-arm64": "2.3.3", + "turbo-linux-64": "2.3.3", + "turbo-linux-arm64": "2.3.3", + "turbo-windows-64": "2.3.3", + "turbo-windows-arm64": "2.3.3" } }, + "node_modules/turbo-darwin-64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.3.3.tgz", + "integrity": "sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-darwin-arm64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.3.3.tgz", + "integrity": "sha512-DYbQwa3NsAuWkCUYVzfOUBbSUBVQzH5HWUFy2Kgi3fGjIWVZOFk86ss+xsWu//rlEAfYwEmopigsPYSmW4X15A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-linux-64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.3.3.tgz", + "integrity": "sha512-eHj9OIB0dFaP6BxB88jSuaCLsOQSYWBgmhy2ErCu6D2GG6xW3b6e2UWHl/1Ho9FsTg4uVgo4DB9wGsKa5erjUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-linux-arm64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.3.3.tgz", + "integrity": "sha512-NmDE/NjZoDj1UWBhMtOPmqFLEBKhzGS61KObfrDEbXvU3lekwHeoPvAMfcovzswzch+kN2DrtbNIlz+/rp8OCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-windows-64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.3.3.tgz", + "integrity": "sha512-O2+BS4QqjK3dOERscXqv7N2GXNcqHr9hXumkMxDj/oGx9oCatIwnnwx34UmzodloSnJpgSqjl8iRWiY65SmYoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/turbo-windows-arm64": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.3.3.tgz", + "integrity": "sha512-dW4ZK1r6XLPNYLIKjC4o87HxYidtRRcBeo/hZ9Wng2XM/MqqYkAyzJXJGgRMsc0MMEN9z4+ZIfnSNBrA0b08ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -4884,6 +4559,10 @@ "engines": { "node": ">= 14" } + }, + "tooling/typescript": { + "name": "@tech-companies-portugal/typescript", + "version": "0.0.0" } } } diff --git a/package.json b/package.json index f4eb047..3c6cc4f 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,30 @@ { "name": "tech-companies-portugal", - "version": "0.0.0", "private": true, + "author": "Alexandre Marques", + "workspaces": [ + "apps/*", + "tooling/*" + ], + "description": "Monorepo for the Tech Companies in Portugal", "scripts": { - "dev": "next dev --turbopack", - "prebuild": "npm run lint", - "build": "next build", - "start": "next start", - "lint": "biome check --write ./", - "format": "biome format --write ./" + "build": "turbo build", + "clean": "git clean -xdf node_modules", + "clean:workspaces": "turbo clean", + "dev": "turbo dev --parallel", + "dev:web": "turbo dev --filter=@tech-companies-portugal/web", + "start:web": "turbo start --filter=@tech-companies-portugal/web", + "test": "turbo test --parallel", + "format": "biome format --write .", + "lint": "turbo lint", + "check-types": "turbo check-types" }, - "dependencies": { - "@radix-ui/react-collapsible": "1.1.2", - "@radix-ui/react-label": "2.1.1", - "@radix-ui/react-select": "2.1.4", - "@radix-ui/react-slot": "1.1.1", - "cheerio": "1.0.0-rc.12", - "class-variance-authority": "0.7.0", - "clsx": "2.1.0", - "date-fns": "3.3.1", - "geist": "1.3.1", - "lucide-react": "0.469.0", - "motion": "11.17.0", - "next": "15.1.4", - "nuqs": "2.3.1", - "react": "19.0.0", - "react-dom": "19.0.0", - "react-type-animation": "3.2.0", - "recharts": "2.15.0", - "sharp": "0.33.2", - "slugify": "1.6.6", - "tailwind-merge": "2.2.1", - "tailwindcss-animate": "1.0.7", - "use-debounce": "10.0.4" + "engines": { + "node": ">=22" }, "devDependencies": { "@biomejs/biome": "1.9.4", - "@types/node": "^20", - "@types/react": "19.0.2", - "@types/react-dom": "19.0.2", - "autoprefixer": "^10.0.1", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "tsx": "4.7.0", - "typescript": "^5" - }, - "engines": { - "node": ">=22" + "turbo": "2.3.3" }, - "overrides": { - "@types/react": "19.0.2", - "@types/react-dom": "19.0.2", - "react-is": "19.0.0" - } -} + "packageManager": "npm@10.9.0" +} \ No newline at end of file diff --git a/src/components/ui/chart.tsx b/src/components/ui/chart.tsx deleted file mode 100644 index 7206770..0000000 --- a/src/components/ui/chart.tsx +++ /dev/null @@ -1,365 +0,0 @@ -"use client"; - -import * as React from "react"; -import * as RechartsPrimitive from "recharts"; - -import { cn } from "@/lib/utils"; - -// Format: { THEME_NAME: CSS_SELECTOR } -const THEMES = { light: "", dark: ".dark" } as const; - -export type ChartConfig = { - [k in string]: { - label?: React.ReactNode; - icon?: React.ComponentType; - } & ( - | { color?: string; theme?: never } - | { color?: never; theme: Record } - ); -}; - -type ChartContextProps = { - config: ChartConfig; -}; - -const ChartContext = React.createContext(null); - -function useChart() { - const context = React.useContext(ChartContext); - - if (!context) { - throw new Error("useChart must be used within a "); - } - - return context; -} - -const ChartContainer = React.forwardRef< - HTMLDivElement, - React.ComponentProps<"div"> & { - config: ChartConfig; - children: React.ComponentProps< - typeof RechartsPrimitive.ResponsiveContainer - >["children"]; - } ->(({ id, className, children, config, ...props }, ref) => { - const uniqueId = React.useId(); - const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`; - - return ( - -
- - - {children} - -
-
- ); -}); -ChartContainer.displayName = "Chart"; - -const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => { - const colorConfig = Object.entries(config).filter( - ([, config]) => config.theme || config.color, - ); - - if (!colorConfig.length) { - return null; - } - - return ( -