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 (
-