diff --git a/nx-dev/data-access-careers/.babelrc b/nx-dev/data-access-careers/.babelrc new file mode 100644 index 0000000000..1ea870ead4 --- /dev/null +++ b/nx-dev/data-access-careers/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nx/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/nx-dev/data-access-careers/.eslintrc.json b/nx-dev/data-access-careers/.eslintrc.json new file mode 100644 index 0000000000..a39ac5d057 --- /dev/null +++ b/nx-dev/data-access-careers/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/nx-dev/data-access-careers/README.md b/nx-dev/data-access-careers/README.md new file mode 100644 index 0000000000..336e17b49e --- /dev/null +++ b/nx-dev/data-access-careers/README.md @@ -0,0 +1,7 @@ +# data-access-careers + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test data-access-careers` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/nx-dev/data-access-careers/project.json b/nx-dev/data-access-careers/project.json new file mode 100644 index 0000000000..cd19835c30 --- /dev/null +++ b/nx-dev/data-access-careers/project.json @@ -0,0 +1,9 @@ +{ + "name": "data-access-careers", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "nx-dev/data-access-careers/src", + "projectType": "library", + "tags": ["scope:nx-dev", "type:data-access"], + "// targets": "to see all targets run: nx show project data-access-careers --web", + "targets": {} +} diff --git a/nx-dev/data-access-careers/src/lib/api.ts b/nx-dev/data-access-careers/src/lib/api.ts new file mode 100644 index 0000000000..bf4a0bf406 --- /dev/null +++ b/nx-dev/data-access-careers/src/lib/api.ts @@ -0,0 +1,19 @@ +import { Job, LeverJob } from './models'; + +export async function fetchJobsList(): Promise { + const apiUrl = 'https://api.lever.co/v0/postings/nrwl?mode=json'; + + const res = await fetch(apiUrl); + + if (res.ok) { + const data = (await res.json()) as LeverJob[]; + return data.map((job: LeverJob) => ({ + title: job.text, + location: job.categories.location, + team: job.categories.team, + url: job.hostedUrl, + })); + } else { + return []; + } +} diff --git a/nx-dev/data-access-careers/src/lib/models.ts b/nx-dev/data-access-careers/src/lib/models.ts new file mode 100644 index 0000000000..7d1f12bf6c --- /dev/null +++ b/nx-dev/data-access-careers/src/lib/models.ts @@ -0,0 +1,24 @@ +export interface LeverJob { + additional: string; + additionalPlain: string; + applyUrl: string; + categories: { + commitment: string; + location: string; + team: string; + }; + createdAt: number; + description: string; + descriptionPlain: string; + hostedUrl: string; + id: string; + lists: { text: string; content: string }[]; + text: string; +} + +export interface Job { + location: string; + team: string; + title: string; + url: string; +} diff --git a/nx-dev/data-access-careers/src/node.index.ts b/nx-dev/data-access-careers/src/node.index.ts new file mode 100644 index 0000000000..4ce30b6c9a --- /dev/null +++ b/nx-dev/data-access-careers/src/node.index.ts @@ -0,0 +1,2 @@ +export * from './lib/api'; +export * from './lib/models'; diff --git a/nx-dev/data-access-careers/tsconfig.json b/nx-dev/data-access-careers/tsconfig.json new file mode 100644 index 0000000000..95cfeb243d --- /dev/null +++ b/nx-dev/data-access-careers/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../tsconfig.base.json" +} diff --git a/nx-dev/data-access-careers/tsconfig.lib.json b/nx-dev/data-access-careers/tsconfig.lib.json new file mode 100644 index 0000000000..cfc4843293 --- /dev/null +++ b/nx-dev/data-access-careers/tsconfig.lib.json @@ -0,0 +1,24 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "node", + + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts" + ] + }, + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/nx-dev/nx-dev/app/careers/page.tsx b/nx-dev/nx-dev/app/careers/page.tsx new file mode 100644 index 0000000000..4d7d269a05 --- /dev/null +++ b/nx-dev/nx-dev/app/careers/page.tsx @@ -0,0 +1,31 @@ +import { + MakeADifference, + WhyJoinNx, + CurrentOpenings, + WhatWeOffer, +} from '@nx/nx-dev/ui-careers'; +import { DefaultLayout } from '@nx/nx-dev/ui-common'; + +import { fetchJobsList } from '@nx/nx-dev/data-access-careers/node-only'; + +async function getData() { + return await fetchJobsList(); +} + +export default async function CareersPage() { + const jobs = await getData(); + return ( + + +
+ +
+
+ +
+
+ +
+
+ ); +} diff --git a/nx-dev/nx-dev/app/layout.tsx b/nx-dev/nx-dev/app/layout.tsx index 4973c07e63..1239555862 100644 --- a/nx-dev/nx-dev/app/layout.tsx +++ b/nx-dev/nx-dev/app/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata, Viewport } from 'next'; -import { Header, Footer, AnnouncementBanner } from '@nx/nx-dev/ui-common'; +import { AnnouncementBanner } from '@nx/nx-dev/ui-common'; import AppRouterAnalytics from './app-router-analytics'; import GlobalScripts from './global-scripts'; diff --git a/nx-dev/ui-careers/.babelrc b/nx-dev/ui-careers/.babelrc new file mode 100644 index 0000000000..1ea870ead4 --- /dev/null +++ b/nx-dev/ui-careers/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nx/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/nx-dev/ui-careers/.eslintrc.json b/nx-dev/ui-careers/.eslintrc.json new file mode 100644 index 0000000000..a39ac5d057 --- /dev/null +++ b/nx-dev/ui-careers/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/nx-dev/ui-careers/README.md b/nx-dev/ui-careers/README.md new file mode 100644 index 0000000000..e809a4503e --- /dev/null +++ b/nx-dev/ui-careers/README.md @@ -0,0 +1,7 @@ +# ui-careers + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test ui-careers` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/nx-dev/ui-careers/project.json b/nx-dev/ui-careers/project.json new file mode 100644 index 0000000000..ebbc38ef6c --- /dev/null +++ b/nx-dev/ui-careers/project.json @@ -0,0 +1,9 @@ +{ + "name": "ui-careers", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "nx-dev/ui-careers/src", + "projectType": "library", + "tags": [], + "// targets": "to see all targets run: nx show project ui-careers --web", + "targets": {} +} diff --git a/nx-dev/ui-careers/src/index.ts b/nx-dev/ui-careers/src/index.ts new file mode 100644 index 0000000000..0b612b131a --- /dev/null +++ b/nx-dev/ui-careers/src/index.ts @@ -0,0 +1,4 @@ +export * from './lib/current-openings'; +export * from './lib/make-a-difference'; +export * from './lib/what-we-offer'; +export * from './lib/why-join-nx'; diff --git a/nx-dev/ui-careers/src/lib/current-openings.tsx b/nx-dev/ui-careers/src/lib/current-openings.tsx new file mode 100644 index 0000000000..e18bfe2457 --- /dev/null +++ b/nx-dev/ui-careers/src/lib/current-openings.tsx @@ -0,0 +1,57 @@ +import { SectionHeading } from '@nx/nx-dev/ui-common'; +import { Job } from '@nx/nx-dev/data-access-careers/node-only'; + +interface CurrentOpeningsProps { + jobs: Job[]; +} + +export async function CurrentOpenings({ jobs }: CurrentOpeningsProps) { + return ( +
+
+
+
+ + Current Openings + +
+ +
+ {jobs.map((post) => ( +
+

+ {post.title} +

+

+ {post.location} / {post.team} +

+ + Apply + +
+ ))} + {!jobs.length ? ( +
+

+ There are no job openings at this time. +

+
+ ) : null} +
+
+
+
+ ); +} diff --git a/nx-dev/ui-careers/src/lib/make-a-difference.tsx b/nx-dev/ui-careers/src/lib/make-a-difference.tsx new file mode 100644 index 0000000000..faed20a057 --- /dev/null +++ b/nx-dev/ui-careers/src/lib/make-a-difference.tsx @@ -0,0 +1,18 @@ +import { SectionHeading } from '@nx/nx-dev/ui-common'; + +export function MakeADifference() { + return ( +
+ + Make a difference + + + We build tools helping companies scale and modernize their development + practices. + +
+ ); +} diff --git a/nx-dev/ui-careers/src/lib/what-we-offer.tsx b/nx-dev/ui-careers/src/lib/what-we-offer.tsx new file mode 100644 index 0000000000..b555b75634 --- /dev/null +++ b/nx-dev/ui-careers/src/lib/what-we-offer.tsx @@ -0,0 +1,76 @@ +import { CheckIcon } from '@heroicons/react/24/outline'; +import { SectionHeading } from '@nx/nx-dev/ui-common'; + +const features = [ + { + name: 'Vacation and Sick Days', + description: + 'Four weeks of paid vacation + unlimited sick days. Paid regional holidays. Spend more time with your family and friends.', + }, + { + name: 'Remote Work', + description: + 'Office space paid for by the company in Phoenix. Or work from home, work from anywhere you want.', + }, + { + name: 'Competitive Salaries', + description: + 'We pay really well because we want you to live comfortably. Salaried employment with benefits - not hourly contracts.', + }, + { + name: 'Flexibility at Work', + description: + 'You control your work hours. Run an errand or walk your dog during the day if you need to.', + }, + { + name: 'Health, Dental, & Vision Insurance', + description: + 'We offer plans for all employees. Canadian employees also get an HSA account.', + }, + { + name: 'No Red Tape Attitude Towards Expenses', + description: + 'Get the best hardware, software, supplies & books. No pre-approval for small purchases. Phone and internet reimbursement.', + }, + { + name: 'Exceptional Career Development', + description: + 'Expenses and time off provided for conference attendance and speaking. Write blog posts and books. Meet exceptional folks leading software communities and build your reputation.', + }, +]; + +export function WhatWeOffer(): JSX.Element { + return ( +
+
+ + What we offer + + + Work/life, balanced + +
+ +
+
+ {features.map((feature) => ( +
+
+
+
+ {feature.description} +
+
+ ))} +
+
+
+ ); +} diff --git a/nx-dev/ui-careers/src/lib/why-join-nx.tsx b/nx-dev/ui-careers/src/lib/why-join-nx.tsx new file mode 100644 index 0000000000..c5dceb0b1c --- /dev/null +++ b/nx-dev/ui-careers/src/lib/why-join-nx.tsx @@ -0,0 +1,65 @@ +import { + BeakerIcon, + GlobeAltIcon, + UserGroupIcon, +} from '@heroicons/react/24/outline'; +import { SectionHeading } from '@nx/nx-dev/ui-common'; + +const features = [ + { + name: 'Live and work in places you love', + description: + "You get to decide when and how you work best. Whether you want to spend a week working remotely from a coffee shop in Barcelona, or you're a night owl who wants to work in the evening - it’s your choice. You know what makes you most productive and happy. Do that!", + icon: GlobeAltIcon, + }, + { + name: 'Work on open source and SaaS projects', + description: + "You can work on Nx and Lerna - open source build tools used by millions of developers. You can also work on Nx Cloud - a SaaS product. You won't be bored.", + icon: BeakerIcon, + }, + { + name: 'Trust your company and your colleagues', + description: + 'We value transparency and honesty. Everyone knows how much money the company is making. Everyone knows how much everyone else is making. We don’t have behind the scenes negotiations, departmental silos or company politics.', + icon: UserGroupIcon, + }, +]; + +export function WhyJoinNx(): JSX.Element { + return ( +
+
+
+ + Why join Nx? + + + We don’t care about your resume: where you worked at and how many + years of experience you have. What matters to us is whether you are + a great engineer who can do amazing work. + +
+ +
+ {features.map((feature) => ( +
+
+
+
+

{feature.description}

+
+
+ ))} +
+
+
+ ); +} diff --git a/nx-dev/ui-careers/tsconfig.json b/nx-dev/ui-careers/tsconfig.json new file mode 100644 index 0000000000..95cfeb243d --- /dev/null +++ b/nx-dev/ui-careers/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "allowJs": false, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ], + "extends": "../../tsconfig.base.json" +} diff --git a/nx-dev/ui-careers/tsconfig.lib.json b/nx-dev/ui-careers/tsconfig.lib.json new file mode 100644 index 0000000000..578a3fb7dd --- /dev/null +++ b/nx-dev/ui-careers/tsconfig.lib.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": [ + "node", + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts" + ] + }, + "exclude": [ + "jest.config.ts", + "src/**/*.spec.ts", + "src/**/*.test.ts", + "src/**/*.spec.tsx", + "src/**/*.test.tsx", + "src/**/*.spec.js", + "src/**/*.test.js", + "src/**/*.spec.jsx", + "src/**/*.test.jsx" + ], + "include": ["src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 616910cdd9..de81812c74 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -57,6 +57,9 @@ "@nx/node/*": ["packages/node/*"], "@nx/nuxt": ["packages/nuxt"], "@nx/nuxt/*": ["packages/nuxt/*"], + "@nx/nx-dev/data-access-careers/node-only": [ + "nx-dev/data-access-careers/src/node.index.ts" + ], "@nx/nx-dev/data-access-documents": [ "nx-dev/data-access-documents/src/index.ts" ], @@ -88,6 +91,7 @@ "@nx/nx-dev/models-package": ["nx-dev/models-package/src/index.ts"], "@nx/nx-dev/ui-animations": ["nx-dev/ui-animations/src/index.ts"], "@nx/nx-dev/ui-blog": ["nx-dev/ui-blog/src/index.ts"], + "@nx/nx-dev/ui-careers": ["nx-dev/ui-careers/src/index.ts"], "@nx/nx-dev/ui-cloud": ["nx-dev/ui-cloud/src/index.ts"], "@nx/nx-dev/ui-commands": ["nx-dev/ui-commands/src/index.ts"], "@nx/nx-dev/ui-common": ["nx-dev/ui-common/src/index.ts"],