From d079a2b2ac8830af805e706792ccb2e870d73c80 Mon Sep 17 00:00:00 2001 From: Alexandre Marques Date: Sun, 19 Jan 2025 15:10:42 +0000 Subject: [PATCH 1/8] chore: prepare readme --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b6fc3be..f557881 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,14 @@ The main goal is to provide a better way to explore tech companies in Portugal. +## Monorepo structure 📦 + +- `apps/web`: The main web app + ## 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 From bea6bddfa7888bf58c6d905700948d011279d72a Mon Sep 17 00:00:00 2001 From: Alexandre Marques Date: Mon, 20 Jan 2025 18:08:49 +0000 Subject: [PATCH 2/8] wip: integrate turbo monorepo --- .env.example | 2 - .github/workflows/ci.yml | 44 ++ .gitignore | 27 +- components.json => apps/web/components.json | 0 next.config.ts => apps/web/next.config.ts | 0 apps/web/package.json | 54 ++ .../web/postcss.config.js | 0 .../web/public}/assets/images/bg-header.webp | Bin .../web/public}/assets/images/empty.png | Bin .../web/public}/assets/images/logo.png | Bin .../web/src}/app/(companies-list)/layout.tsx | 2 +- .../web/src}/app/(companies-list)/page.tsx | 0 {src => apps/web/src}/app/api/og/_utils.ts | 2 +- {src => apps/web/src}/app/api/og/route.tsx | 0 .../web/src}/app/company/[slug]/layout.tsx | 0 .../web/src}/app/company/[slug]/not-found.tsx | 0 .../web/src}/app/company/[slug]/page.tsx | 0 {src => apps/web/src}/app/company/sitemap.ts | 0 {src => apps/web/src}/app/error.tsx | 0 {src => apps/web/src}/app/favicon.ico | Bin {src => apps/web/src}/app/globals.css | 0 {src => apps/web/src}/app/layout.tsx | 0 {src => apps/web/src}/app/not-found.tsx | 0 {src => apps/web/src}/app/robots.ts | 0 {src => apps/web/src}/app/sitemap.ts | 0 .../web/src}/components/CompaniesHeader.tsx | 0 .../web/src}/components/CompaniesList.tsx | 0 .../src}/components/CompaniesListFooter.tsx | 0 .../src}/components/CompaniesListHeader.tsx | 0 .../web/src}/components/CompanyItem.tsx | 0 .../web/src}/components/CopyUrlButton.tsx | 0 .../web/src}/components/EmptyState.tsx | 0 .../web/src}/components/ExploreButton.tsx | 0 .../src}/components/FeaturedSideSection.tsx | 0 .../web/src}/components/FiltersButton.tsx | 0 .../src}/components/FiltersPanelButton.tsx | 0 {src => apps/web/src}/components/Footer.tsx | 0 .../web/src}/components/HotFeaturedBadge.tsx | 0 {src => apps/web/src}/components/Navbar.tsx | 0 .../src}/components/NoCompaniesResults.tsx | 0 .../web/src}/components/SearchSideBar.tsx | 0 {src => apps/web/src}/components/SideBar.tsx | 0 .../components/hooks/useSearchQueryParams.tsx | 0 .../ui/AnimatedCompaniesFeatures.tsx | 0 {src => apps/web/src}/components/ui/badge.tsx | 0 .../web/src}/components/ui/button.tsx | 0 {src => apps/web/src}/components/ui/card.tsx | 0 .../web/src}/components/ui/dot-pattern.tsx | 0 {src => apps/web/src}/components/ui/input.tsx | 0 {src => apps/web/src}/components/ui/label.tsx | 0 .../src}/components/ui/retro-container.tsx | 0 .../web/src}/components/ui/select.tsx | 0 .../web/src}/components/ui/skeleton.tsx | 0 {src => apps/web/src}/lib/featured.ts | 0 {src => apps/web/src}/lib/fonts.ts | 0 {src => apps/web/src}/lib/metadata.ts | 0 {src => apps/web/src}/lib/parser.ts | 0 {src => apps/web/src}/lib/parser/companies.ts | 0 {src => apps/web/src}/lib/search-params.ts | 0 {src => apps/web/src}/lib/types.ts | 0 {src => apps/web/src}/lib/utils.ts | 0 .../web/tailwind.config.ts | 0 apps/web/tsconfig.json | 17 + biome.json | 3 +- package-lock.json | 575 ++++-------------- package.json | 68 +-- src/components/ui/chart.tsx | 365 ----------- src/components/ui/collapsible.tsx | 11 - tooling/typescript/base.json | 18 + tooling/typescript/nextjs.json | 17 + tooling/typescript/package.json | 5 + tooling/typescript/react-lib.json | 8 + tsconfig.json | 27 - turbo.json | 59 ++ 74 files changed, 390 insertions(+), 914 deletions(-) delete mode 100644 .env.example create mode 100644 .github/workflows/ci.yml rename components.json => apps/web/components.json (100%) rename next.config.ts => apps/web/next.config.ts (100%) create mode 100644 apps/web/package.json rename postcss.config.js => apps/web/postcss.config.js (100%) rename {public => apps/web/public}/assets/images/bg-header.webp (100%) rename {public => apps/web/public}/assets/images/empty.png (100%) rename {public => apps/web/public}/assets/images/logo.png (100%) rename {src => apps/web/src}/app/(companies-list)/layout.tsx (95%) rename {src => apps/web/src}/app/(companies-list)/page.tsx (100%) rename {src => apps/web/src}/app/api/og/_utils.ts (95%) rename {src => apps/web/src}/app/api/og/route.tsx (100%) rename {src => apps/web/src}/app/company/[slug]/layout.tsx (100%) rename {src => apps/web/src}/app/company/[slug]/not-found.tsx (100%) rename {src => apps/web/src}/app/company/[slug]/page.tsx (100%) rename {src => apps/web/src}/app/company/sitemap.ts (100%) rename {src => apps/web/src}/app/error.tsx (100%) rename {src => apps/web/src}/app/favicon.ico (100%) rename {src => apps/web/src}/app/globals.css (100%) rename {src => apps/web/src}/app/layout.tsx (100%) rename {src => apps/web/src}/app/not-found.tsx (100%) rename {src => apps/web/src}/app/robots.ts (100%) rename {src => apps/web/src}/app/sitemap.ts (100%) rename {src => apps/web/src}/components/CompaniesHeader.tsx (100%) rename {src => apps/web/src}/components/CompaniesList.tsx (100%) rename {src => apps/web/src}/components/CompaniesListFooter.tsx (100%) rename {src => apps/web/src}/components/CompaniesListHeader.tsx (100%) rename {src => apps/web/src}/components/CompanyItem.tsx (100%) rename {src => apps/web/src}/components/CopyUrlButton.tsx (100%) rename {src => apps/web/src}/components/EmptyState.tsx (100%) rename {src => apps/web/src}/components/ExploreButton.tsx (100%) rename {src => apps/web/src}/components/FeaturedSideSection.tsx (100%) rename {src => apps/web/src}/components/FiltersButton.tsx (100%) rename {src => apps/web/src}/components/FiltersPanelButton.tsx (100%) rename {src => apps/web/src}/components/Footer.tsx (100%) rename {src => apps/web/src}/components/HotFeaturedBadge.tsx (100%) rename {src => apps/web/src}/components/Navbar.tsx (100%) rename {src => apps/web/src}/components/NoCompaniesResults.tsx (100%) rename {src => apps/web/src}/components/SearchSideBar.tsx (100%) rename {src => apps/web/src}/components/SideBar.tsx (100%) rename {src => apps/web/src}/components/hooks/useSearchQueryParams.tsx (100%) rename {src => apps/web/src}/components/ui/AnimatedCompaniesFeatures.tsx (100%) rename {src => apps/web/src}/components/ui/badge.tsx (100%) rename {src => apps/web/src}/components/ui/button.tsx (100%) rename {src => apps/web/src}/components/ui/card.tsx (100%) rename {src => apps/web/src}/components/ui/dot-pattern.tsx (100%) rename {src => apps/web/src}/components/ui/input.tsx (100%) rename {src => apps/web/src}/components/ui/label.tsx (100%) rename {src => apps/web/src}/components/ui/retro-container.tsx (100%) rename {src => apps/web/src}/components/ui/select.tsx (100%) rename {src => apps/web/src}/components/ui/skeleton.tsx (100%) rename {src => apps/web/src}/lib/featured.ts (100%) rename {src => apps/web/src}/lib/fonts.ts (100%) rename {src => apps/web/src}/lib/metadata.ts (100%) rename {src => apps/web/src}/lib/parser.ts (100%) rename {src => apps/web/src}/lib/parser/companies.ts (100%) rename {src => apps/web/src}/lib/search-params.ts (100%) rename {src => apps/web/src}/lib/types.ts (100%) rename {src => apps/web/src}/lib/utils.ts (100%) rename tailwind.config.ts => apps/web/tailwind.config.ts (100%) create mode 100644 apps/web/tsconfig.json delete mode 100644 src/components/ui/chart.tsx delete mode 100644 src/components/ui/collapsible.tsx create mode 100644 tooling/typescript/base.json create mode 100644 tooling/typescript/nextjs.json create mode 100644 tooling/typescript/package.json create mode 100644 tooling/typescript/react-lib.json delete mode 100644 tsconfig.json create mode 100644 turbo.json 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..e7971a2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,44 @@ +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 + + - 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/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..bd04597 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,54 @@ +{ + "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": "tsc --noEmit", + "clean": "git clean -xdf .next .turbo node_modules", + "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..0469418 --- /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", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "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..c34bec6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,7 +6,20 @@ "packages": { "": { "name": "tech-companies-portugal", - "version": "0.0.0", + "workspaces": [ + "apps/*", + "tooling/*" + ], + "devDependencies": { + "@biomejs/biome": "1.9.4", + "turbo": "2.3.3" + }, + "engines": { + "node": ">=22" + } + }, + "apps/web": { + "name": "@tech-companies-portugal/web", "dependencies": { "@radix-ui/react-collapsible": "1.1.2", "@radix-ui/react-label": "2.1.1", @@ -32,18 +45,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 +250,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 +1536,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 +2281,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 +2444,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 +3412,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 +3826,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 +4217,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 +4558,9 @@ "engines": { "node": ">= 14" } + }, + "tooling/typescript": { + "name": "@tech-companies-portugal/typescript" } } } 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 ( -