mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2026-04-11 14:21:55 +08:00
[repo] move to Oxlint
This commit is contained in:
parent
84a4ad84d8
commit
fa1ec6c7ec
90
.oxlintrc.json
Normal file
90
.oxlintrc.json
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
||||||
|
"plugins": ["typescript", "react"],
|
||||||
|
"categories": {
|
||||||
|
"correctness": "error"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"next": {
|
||||||
|
"rootDir": ["apps/portal/"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ignorePatterns": [
|
||||||
|
".next/**",
|
||||||
|
".turbo/**",
|
||||||
|
".cache/**",
|
||||||
|
"dist/**",
|
||||||
|
"dist-ssr/**",
|
||||||
|
"coverage/**",
|
||||||
|
"public/dist/**",
|
||||||
|
"server/dist/**",
|
||||||
|
"apps/portal/build/**",
|
||||||
|
"apps/portal/out/**",
|
||||||
|
"apps/portal/prisma/**",
|
||||||
|
"apps/website/.docusaurus/**",
|
||||||
|
"apps/website/.cache-loader/**",
|
||||||
|
"apps/website/experimental/**"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"camelcase": ["error", { "properties": "never", "ignoreDestructuring": true }],
|
||||||
|
"capitalized-comments": [
|
||||||
|
"error",
|
||||||
|
"always",
|
||||||
|
{ "ignoreConsecutiveComments": true }
|
||||||
|
],
|
||||||
|
"curly": "error",
|
||||||
|
"eqeqeq": ["error", "smart"],
|
||||||
|
"func-names": ["error", "as-needed"],
|
||||||
|
"func-style": ["error", "declaration", { "allowArrowFunctions": true }],
|
||||||
|
"guard-for-in": "error",
|
||||||
|
"init-declarations": "error",
|
||||||
|
"no-console": ["error", { "allow": ["warn", "error", "info"] }],
|
||||||
|
"no-else-return": ["error", { "allowElseIf": false }],
|
||||||
|
"no-lonely-if": "error",
|
||||||
|
"no-shadow": "off",
|
||||||
|
"no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
|
||||||
|
"operator-assignment": "error",
|
||||||
|
"prefer-const": "error",
|
||||||
|
"prefer-destructuring": ["error", { "object": true }],
|
||||||
|
"radix": "error",
|
||||||
|
"react/button-has-type": "error",
|
||||||
|
"react/display-name": "off",
|
||||||
|
"react/exhaustive-deps": "off",
|
||||||
|
"react/jsx-boolean-value": ["error", "always"],
|
||||||
|
"react/jsx-curly-brace-presence": [
|
||||||
|
"error",
|
||||||
|
{ "props": "never", "children": "never" }
|
||||||
|
],
|
||||||
|
"react/jsx-no-useless-fragment": "error",
|
||||||
|
"react/no-array-index-key": "error",
|
||||||
|
"react/no-unescaped-entities": "off",
|
||||||
|
"react/react-in-jsx-scope": "off",
|
||||||
|
"react/void-dom-elements-no-children": "error",
|
||||||
|
"typescript/array-type": [
|
||||||
|
"error",
|
||||||
|
{ "default": "generic", "readonly": "generic" }
|
||||||
|
],
|
||||||
|
"typescript/ban-ts-comment": "off",
|
||||||
|
"typescript/consistent-generic-constructors": ["error", "constructor"],
|
||||||
|
"typescript/consistent-indexed-object-style": ["error", "record"],
|
||||||
|
"typescript/consistent-type-definitions": ["error", "type"],
|
||||||
|
"typescript/consistent-type-imports": "error",
|
||||||
|
"typescript/dot-notation": "error",
|
||||||
|
"typescript/no-duplicate-enum-values": "error",
|
||||||
|
"typescript/no-explicit-any": "off",
|
||||||
|
"typescript/no-for-in-array": "error",
|
||||||
|
"typescript/prefer-optional-chain": "error",
|
||||||
|
"typescript/require-array-sort-compare": "error",
|
||||||
|
"typescript/restrict-plus-operands": "error"
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["apps/portal/**/*.{js,jsx,ts,tsx}"],
|
||||||
|
"plugins": ["typescript", "react", "nextjs"],
|
||||||
|
"rules": {
|
||||||
|
"nextjs/no-html-link-for-pages": "off",
|
||||||
|
"nextjs/no-img-element": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
3
.vscode/extensions.json
vendored
Normal file
3
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"recommendations": ["oxc.oxc-vscode"]
|
||||||
|
}
|
||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -7,14 +7,13 @@
|
|||||||
"editor.formatOnSaveMode": "file",
|
"editor.formatOnSaveMode": "file",
|
||||||
"javascript.format.enable": true,
|
"javascript.format.enable": true,
|
||||||
"json.format.enable": true,
|
"json.format.enable": true,
|
||||||
"eslint.format.enable": false,
|
|
||||||
"css.format.enable": true,
|
"css.format.enable": true,
|
||||||
"css.format.newlineBetweenRules": true,
|
"css.format.newlineBetweenRules": true,
|
||||||
"css.format.newlineBetweenSelectors": true,
|
"css.format.newlineBetweenSelectors": true,
|
||||||
"css.format.preserveNewLines": true,
|
"css.format.preserveNewLines": true,
|
||||||
"typescript.format.enable": true,
|
"typescript.format.enable": true,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll": true
|
"source.fixAll.oxc": "always"
|
||||||
},
|
},
|
||||||
"[prisma]": {
|
"[prisma]": {
|
||||||
"editor.defaultFormatter": "Prisma.prisma"
|
"editor.defaultFormatter": "Prisma.prisma"
|
||||||
|
|||||||
@ -1,11 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
extends: ['tih'],
|
|
||||||
parserOptions: {
|
|
||||||
tsconfigRootDir: __dirname,
|
|
||||||
project: ['./tsconfig.json'],
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
'@typescript-eslint/ban-ts-comment': 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
import { env } from './src/env/server.mjs';
|
import './src/env/server.mjs';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Don't be scared of the generics here.
|
* Don't be scared of the generics here.
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint",
|
"lint": "oxlint next.config.mjs src",
|
||||||
"tsc": "tsc",
|
"tsc": "tsc",
|
||||||
"postinstall": "prisma generate",
|
"postinstall": "prisma generate",
|
||||||
"seed": "ts-node prisma/seed.ts",
|
"seed": "ts-node prisma/seed.ts",
|
||||||
|
|||||||
2
apps/portal/src/env/server.mjs
vendored
2
apps/portal/src/env/server.mjs
vendored
@ -19,7 +19,7 @@ if (_serverEnv.success === false) {
|
|||||||
/**
|
/**
|
||||||
* Validate that server-side environment variables are not exposed to the client.
|
* Validate that server-side environment variables are not exposed to the client.
|
||||||
*/
|
*/
|
||||||
for (let key of Object.keys(_serverEnv.data)) {
|
for (const key of Object.keys(_serverEnv.data)) {
|
||||||
if (key.startsWith('NEXT_PUBLIC_')) {
|
if (key.startsWith('NEXT_PUBLIC_')) {
|
||||||
console.warn('❌ You are exposing a server-side env-variable:', key);
|
console.warn('❌ You are exposing a server-side env-variable:', key);
|
||||||
|
|
||||||
|
|||||||
56
apps/portal/src/types/offers.d.ts
vendored
56
apps/portal/src/types/offers.d.ts
vendored
@ -1,9 +1,9 @@
|
|||||||
import type { JobType } from '@prisma/client';
|
import type { JobType } from '@prisma/client';
|
||||||
|
|
||||||
export type Profile = {
|
export type Profile = {
|
||||||
analysis: ProfileAnalysis?;
|
analysis?: ProfileAnalysis | null;
|
||||||
background: Background?;
|
background?: Background | null;
|
||||||
editToken: string?;
|
editToken?: string | null;
|
||||||
id: string;
|
id: string;
|
||||||
isEditable: boolean;
|
isEditable: boolean;
|
||||||
isSaved: boolean;
|
isSaved: boolean;
|
||||||
@ -20,15 +20,15 @@ export type Background = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type Experience = {
|
export type Experience = {
|
||||||
company: OffersCompany?;
|
company?: OffersCompany | null;
|
||||||
durationInMonths: number?;
|
durationInMonths?: number | null;
|
||||||
id: string;
|
id: string;
|
||||||
jobType: JobType?;
|
jobType?: JobType | null;
|
||||||
level: string?;
|
level?: string | null;
|
||||||
location: Location?;
|
location?: Location | null;
|
||||||
monthlySalary: Valuation?;
|
monthlySalary?: Valuation | null;
|
||||||
title: string?;
|
title?: string | null;
|
||||||
totalCompensation: Valuation?;
|
totalCompensation?: Valuation | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type OffersCompany = {
|
export type OffersCompany = {
|
||||||
@ -50,12 +50,12 @@ export type Valuation = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type Education = {
|
export type Education = {
|
||||||
endDate: Date?;
|
endDate?: Date | null;
|
||||||
field: string?;
|
field?: string | null;
|
||||||
id: string;
|
id: string;
|
||||||
school: string?;
|
school?: string | null;
|
||||||
startDate: Date?;
|
startDate?: Date | null;
|
||||||
type: string?;
|
type?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type SpecificYoe = {
|
export type SpecificYoe = {
|
||||||
@ -87,16 +87,16 @@ export type ProfileOffer = {
|
|||||||
location: Location;
|
location: Location;
|
||||||
monthYearReceived: Date;
|
monthYearReceived: Date;
|
||||||
negotiationStrategy: string;
|
negotiationStrategy: string;
|
||||||
offersFullTime: FullTime?;
|
offersFullTime?: FullTime | null;
|
||||||
offersIntern: Intern?;
|
offersIntern?: Intern | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type FullTime = {
|
export type FullTime = {
|
||||||
baseSalary: Valuation?;
|
baseSalary?: Valuation | null;
|
||||||
bonus: Valuation?;
|
bonus?: Valuation | null;
|
||||||
id: string;
|
id: string;
|
||||||
level: string;
|
level: string;
|
||||||
stocks: Valuation?;
|
stocks?: Valuation | null;
|
||||||
title: string;
|
title: string;
|
||||||
totalCompensation: Valuation;
|
totalCompensation: Valuation;
|
||||||
};
|
};
|
||||||
@ -113,17 +113,17 @@ export type Reply = {
|
|||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
id: string;
|
id: string;
|
||||||
message: string;
|
message: string;
|
||||||
replies: Array<Reply>?;
|
replies?: Array<Reply> | null;
|
||||||
replyingToId: string?;
|
replyingToId?: string | null;
|
||||||
user: User?;
|
user?: User | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type User = {
|
export type User = {
|
||||||
email: string?;
|
email?: string | null;
|
||||||
emailVerified: Date?;
|
emailVerified?: Date | null;
|
||||||
id: string;
|
id: string;
|
||||||
image: string?;
|
image?: string | null;
|
||||||
name: string?;
|
name?: string | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GetOffersResponse = {
|
export type GetOffersResponse = {
|
||||||
|
|||||||
8
apps/portal/src/types/resume-comments.d.ts
vendored
8
apps/portal/src/types/resume-comments.d.ts
vendored
@ -9,18 +9,18 @@ export type ResumeComment = Readonly<{
|
|||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
description: string;
|
description: string;
|
||||||
id: string;
|
id: string;
|
||||||
parentId: string?;
|
parentId?: string | null;
|
||||||
resumeId: string;
|
resumeId: string;
|
||||||
section: ResumesSection;
|
section: ResumesSection;
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
user: {
|
user: {
|
||||||
image: string?;
|
image?: string | null;
|
||||||
name: string?;
|
name?: string | null;
|
||||||
userId: string;
|
userId: string;
|
||||||
};
|
};
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type ResumeCommentVote = Readonly<{
|
export type ResumeCommentVote = Readonly<{
|
||||||
numVotes: number;
|
numVotes: number;
|
||||||
userVote: ResumesCommentVote?;
|
userVote?: ResumesCommentVote | null;
|
||||||
}>;
|
}>;
|
||||||
|
|||||||
2
apps/portal/src/types/resume.d.ts
vendored
2
apps/portal/src/types/resume.d.ts
vendored
@ -1,5 +1,5 @@
|
|||||||
export type Resume = {
|
export type Resume = {
|
||||||
additionalInfo: string?;
|
additionalInfo?: string | null;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
experience: string;
|
experience: string;
|
||||||
id: string;
|
id: string;
|
||||||
|
|||||||
@ -184,7 +184,7 @@ module.exports = {
|
|||||||
path: './contents',
|
path: './contents',
|
||||||
routeBasePath: '/',
|
routeBasePath: '/',
|
||||||
sidebarPath: require.resolve('./sidebars.js'),
|
sidebarPath: require.resolve('./sidebars.js'),
|
||||||
// showLastUpdateAuthor: true,
|
// ShowLastUpdateAuthor: true,
|
||||||
showLastUpdateTime: true,
|
showLastUpdateTime: true,
|
||||||
},
|
},
|
||||||
theme: {
|
theme: {
|
||||||
|
|||||||
@ -7,6 +7,7 @@
|
|||||||
"start": "docusaurus start",
|
"start": "docusaurus start",
|
||||||
"dev": "docusaurus start",
|
"dev": "docusaurus start",
|
||||||
"build": "docusaurus build",
|
"build": "docusaurus build",
|
||||||
|
"lint": "oxlint docusaurus.config.js sidebars.js src",
|
||||||
"swizzle": "docusaurus swizzle",
|
"swizzle": "docusaurus swizzle",
|
||||||
"deploy": "docusaurus deploy"
|
"deploy": "docusaurus deploy"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -70,27 +70,6 @@ function GreatFrontEnd({ position }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function AlgoMonster({ position }) {
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
className={clsx(styles.container, styles.backgroundAlgoMonster)}
|
|
||||||
href="https://shareasale.com/r.cfm?b=1873647&u=3114753&m=114505&urllink=&afftrack="
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener"
|
|
||||||
onClick={() => {
|
|
||||||
window.gtag('event', `algomonster.${position}.click`);
|
|
||||||
}}>
|
|
||||||
<p className={styles.tagline}>
|
|
||||||
<strong className={styles.title}>
|
|
||||||
Stop grinding mindlessly. Study with a plan
|
|
||||||
</strong>
|
|
||||||
Developed by Google engineers, <u>AlgoMonster</u> is the fastest way to
|
|
||||||
get a software engineering job. <u>Check it out for free!</u>
|
|
||||||
</p>
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function DesignGurusSystemDesign({ position }) {
|
function DesignGurusSystemDesign({ position }) {
|
||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
@ -177,21 +156,6 @@ export default React.memo(function SidebarAd({ position }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (
|
|
||||||
// path.includes('coding') ||
|
|
||||||
// path.includes('best-practice-questions') ||
|
|
||||||
// path.includes('mock-interviews') ||
|
|
||||||
// path.includes('algorithms')
|
|
||||||
// ) {
|
|
||||||
// return rand < 0.3 ? (
|
|
||||||
// <Interviewingio key={Math.random()} position={position} />
|
|
||||||
// ) : rand < 0.6 ? (
|
|
||||||
// <AlgoMonster key={Math.random()} position={position} />
|
|
||||||
// ) : (
|
|
||||||
// <DesignGurusCoding key={Math.random()} position={position} />
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
return rand < 0.5 ? (
|
return rand < 0.5 ? (
|
||||||
<FAANGTechLeads key={Math.random()} position={position} />
|
<FAANGTechLeads key={Math.random()} position={position} />
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import Layout from '@theme/Layout';
|
import Layout from '@theme/Layout';
|
||||||
import BrowserOnly from '@docusaurus/BrowserOnly';
|
|
||||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||||
import Link from '@docusaurus/Link';
|
import Link from '@docusaurus/Link';
|
||||||
import useBaseUrl from '@docusaurus/useBaseUrl';
|
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||||
@ -11,11 +10,10 @@ import successStories from '../data/successStories';
|
|||||||
|
|
||||||
const BLIND_75_URL =
|
const BLIND_75_URL =
|
||||||
'https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-75-LeetCode-Questions-to-Save-Your-Time-OaM1orEU';
|
'https://www.teamblind.com/post/New-Year-Gift---Curated-List-of-Top-75-LeetCode-Questions-to-Save-Your-Time-OaM1orEU';
|
||||||
const BLIND_OFFER_NUMBERS_URL =
|
|
||||||
'https://www.teamblind.com/post/Sharing-my-offer-numbers-from-big-companies-for-your-reference-yNgqUPQR';
|
|
||||||
|
|
||||||
const FEATURES = [
|
const FEATURES = [
|
||||||
{
|
{
|
||||||
|
id: 'zero-to-hero',
|
||||||
title: <>💯 Go From zero to hero</>,
|
title: <>💯 Go From zero to hero</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -26,6 +24,7 @@ const FEATURES = [
|
|||||||
link: '/software-engineering-interview-guide/',
|
link: '/software-engineering-interview-guide/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 'curated-practice',
|
||||||
title: <>📝 Curated practice questions</>,
|
title: <>📝 Curated practice questions</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -39,6 +38,7 @@ const FEATURES = [
|
|||||||
link: '/coding-interview-study-plan/',
|
link: '/coding-interview-study-plan/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 'best-practices',
|
||||||
title: <>📋 Interview best practices</>,
|
title: <>📋 Interview best practices</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -49,6 +49,7 @@ const FEATURES = [
|
|||||||
link: '/coding-interview-cheatsheet/',
|
link: '/coding-interview-cheatsheet/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 'algorithm-tips',
|
||||||
title: <>💁♀️ Practical algorithm tips</>,
|
title: <>💁♀️ Practical algorithm tips</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -59,6 +60,7 @@ const FEATURES = [
|
|||||||
link: '/algorithms/study-cheatsheet/',
|
link: '/algorithms/study-cheatsheet/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 'behavioral',
|
||||||
title: <>💬 Behavioral questions</>,
|
title: <>💬 Behavioral questions</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -69,6 +71,7 @@ const FEATURES = [
|
|||||||
link: '/behavioral-interview-questions/',
|
link: '/behavioral-interview-questions/',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
id: 'tested',
|
||||||
title: <>🧪 Tested and proven</>,
|
title: <>🧪 Tested and proven</>,
|
||||||
description: (
|
description: (
|
||||||
<>
|
<>
|
||||||
@ -220,48 +223,6 @@ function WhatIsThisSection() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function RoraSection() {
|
|
||||||
// Because the SSR and client output can differ and hydration doesn't patch attribute differences,
|
|
||||||
// we'll render this on the browser only.
|
|
||||||
return (
|
|
||||||
<BrowserOnly>
|
|
||||||
{() => (
|
|
||||||
<div className={clsx('padding-vert--lg', styles.sectionSponsor)}>
|
|
||||||
<div className="container">
|
|
||||||
<div className="row">
|
|
||||||
<div className="col col--8 col--offset-2">
|
|
||||||
<div className="margin-vert--lg text--center">
|
|
||||||
<div>
|
|
||||||
<h2 className={styles.sectionSponsorTitle}>
|
|
||||||
<strong>
|
|
||||||
Get paid more. Receive risk-free salary negotiation
|
|
||||||
advice from Rora. You pay nothing unless your offer is
|
|
||||||
increased.
|
|
||||||
</strong>
|
|
||||||
</h2>
|
|
||||||
<div className="margin-vert--lg">
|
|
||||||
<a
|
|
||||||
className="button button--secondary button--lg"
|
|
||||||
href="https://www.teamrora.com/?utm_source=techinterviewhandbook&utm_medium=referral&utm_content=website_homepage"
|
|
||||||
rel="noopener"
|
|
||||||
target="_blank"
|
|
||||||
onClick={() => {
|
|
||||||
window.gtag('event', 'rora.homepage.click');
|
|
||||||
}}>
|
|
||||||
Get risk-free negotiation advice →
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</BrowserOnly>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function HowToUseStep({ index, title, ctaLink, contents }) {
|
function HowToUseStep({ index, title, ctaLink, contents }) {
|
||||||
return (
|
return (
|
||||||
<div className={clsx('card', styles.howToUseStep)}>
|
<div className={clsx('card', styles.howToUseStep)}>
|
||||||
@ -273,8 +234,8 @@ function HowToUseStep({ index, title, ctaLink, contents }) {
|
|||||||
</div>
|
</div>
|
||||||
<div className="card__body">
|
<div className="card__body">
|
||||||
<ul>
|
<ul>
|
||||||
{contents.map((content, i) => (
|
{contents.map((content) => (
|
||||||
<li key={i}>{content}</li>
|
<li key={content}>{content}</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@ -325,9 +286,9 @@ function HowToUseSection() {
|
|||||||
index={1}
|
index={1}
|
||||||
title={<>Prepare a FAANG-ready resume</>}
|
title={<>Prepare a FAANG-ready resume</>}
|
||||||
contents={[
|
contents={[
|
||||||
<>Create an ATS-proof resume</>,
|
'Create an ATS-proof resume',
|
||||||
<>Software engineering specific resume content</>,
|
'Software engineering specific resume content',
|
||||||
<>Optimizing and testing your resume</>,
|
'Optimizing and testing your resume',
|
||||||
]}
|
]}
|
||||||
ctaLink="/resume/"
|
ctaLink="/resume/"
|
||||||
/>
|
/>
|
||||||
@ -338,10 +299,10 @@ function HowToUseSection() {
|
|||||||
index={2}
|
index={2}
|
||||||
title={<>Ace the interviews</>}
|
title={<>Ace the interviews</>}
|
||||||
contents={[
|
contents={[
|
||||||
<>Step-by-step coding interview preparation</>,
|
'Step-by-step coding interview preparation',
|
||||||
<>Algorithms deep dive</>,
|
'Algorithms deep dive',
|
||||||
<>System design interview preparation</>,
|
'System design interview preparation',
|
||||||
<>Behavioral interview preparation</>,
|
'Behavioral interview preparation',
|
||||||
]}
|
]}
|
||||||
ctaLink="/coding-interview-prep/"
|
ctaLink="/coding-interview-prep/"
|
||||||
/>
|
/>
|
||||||
@ -352,8 +313,8 @@ function HowToUseSection() {
|
|||||||
index={3}
|
index={3}
|
||||||
title={<>Negotiate the best offer</>}
|
title={<>Negotiate the best offer</>}
|
||||||
contents={[
|
contents={[
|
||||||
<>Negotiation strategies for software engineers</>,
|
'Negotiation strategies for software engineers',
|
||||||
<>Guide on how compensation works for software engineers</>,
|
'Guide on how compensation works for software engineers',
|
||||||
]}
|
]}
|
||||||
ctaLink="/understanding-compensation/"
|
ctaLink="/understanding-compensation/"
|
||||||
/>
|
/>
|
||||||
@ -363,10 +324,7 @@ function HowToUseSection() {
|
|||||||
<HowToUseStep
|
<HowToUseStep
|
||||||
index={4}
|
index={4}
|
||||||
title={<>Prepare for the job</>}
|
title={<>Prepare for the job</>}
|
||||||
contents={[
|
contents={['How to choose between companies', 'Guide to engineering levels']}
|
||||||
<>How to choose between companies</>,
|
|
||||||
<>Guide to engineering levels</>,
|
|
||||||
]}
|
|
||||||
ctaLink="/choosing-between-companies"
|
ctaLink="/choosing-between-companies"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -394,9 +352,9 @@ function FeaturesSection() {
|
|||||||
We have everything you need - all straight to the point
|
We have everything you need - all straight to the point
|
||||||
</h3>
|
</h3>
|
||||||
<div className={clsx('row', styles.featuresRow)}>
|
<div className={clsx('row', styles.featuresRow)}>
|
||||||
{FEATURES.map(({ title, description, link }, idx) => (
|
{FEATURES.map(({ id, title, description, link }) => (
|
||||||
<div
|
<div
|
||||||
key={idx}
|
key={id}
|
||||||
className={clsx(
|
className={clsx(
|
||||||
'col',
|
'col',
|
||||||
'col--4',
|
'col--4',
|
||||||
@ -471,7 +429,7 @@ function GreatFrontEndSection() {
|
|||||||
<div className="margin-vert--lg text--center">
|
<div className="margin-vert--lg text--center">
|
||||||
<div>
|
<div>
|
||||||
<h2>
|
<h2>
|
||||||
<span class="badge badge--secondary">
|
<span className="badge badge--secondary">
|
||||||
LeetCode for Front End Interviews
|
LeetCode for Front End Interviews
|
||||||
</span>
|
</span>
|
||||||
</h2>
|
</h2>
|
||||||
|
|||||||
@ -21,6 +21,7 @@
|
|||||||
"tsc": "turbo tsc"
|
"tsc": "turbo tsc"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"oxlint": "^1.56.0",
|
||||||
"oxfmt": "^0.41.0",
|
"oxfmt": "^0.41.0",
|
||||||
"turbo": "2.8.20"
|
"turbo": "2.8.20"
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,148 +0,0 @@
|
|||||||
/* eslint-disable sort-keys-fix/sort-keys-fix */
|
|
||||||
|
|
||||||
const OFF = 0;
|
|
||||||
const WARN = 1;
|
|
||||||
const ERROR = 2;
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
plugins: [
|
|
||||||
'@typescript-eslint',
|
|
||||||
'simple-import-sort',
|
|
||||||
'sort-keys-fix',
|
|
||||||
'typescript-sort-keys',
|
|
||||||
],
|
|
||||||
extends: [
|
|
||||||
'next/core-web-vitals',
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
settings: {
|
|
||||||
react: {
|
|
||||||
version: 'detect',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
camelcase: [ERROR, { properties: 'never', ignoreDestructuring: true }],
|
|
||||||
'capitalized-comments': [
|
|
||||||
ERROR,
|
|
||||||
'always',
|
|
||||||
{ ignoreConsecutiveComments: true },
|
|
||||||
],
|
|
||||||
'consistent-this': ERROR,
|
|
||||||
curly: ERROR,
|
|
||||||
'dot-notation': ERROR,
|
|
||||||
eqeqeq: [ERROR, 'smart'],
|
|
||||||
'func-name-matching': ERROR,
|
|
||||||
'func-names': [ERROR, 'as-needed'],
|
|
||||||
'func-style': [ERROR, 'declaration', { allowArrowFunctions: true }],
|
|
||||||
'guard-for-in': ERROR,
|
|
||||||
'init-declarations': ERROR,
|
|
||||||
'no-console': [ERROR, { allow: ['warn', 'error', 'info'] }],
|
|
||||||
'no-else-return': [ERROR, { allowElseIf: false }],
|
|
||||||
'no-extra-boolean-cast': ERROR,
|
|
||||||
'no-lonely-if': ERROR,
|
|
||||||
'no-shadow': OFF,
|
|
||||||
'no-unused-vars': OFF, // Use @typescript-eslint/no-unused-vars instead.
|
|
||||||
'object-shorthand': ERROR,
|
|
||||||
'one-var': [ERROR, 'never'],
|
|
||||||
'operator-assignment': ERROR,
|
|
||||||
'prefer-arrow-callback': ERROR,
|
|
||||||
'prefer-const': ERROR,
|
|
||||||
'prefer-destructuring': [
|
|
||||||
ERROR,
|
|
||||||
{
|
|
||||||
object: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
radix: ERROR,
|
|
||||||
'spaced-comment': ERROR,
|
|
||||||
|
|
||||||
'react/button-has-type': ERROR,
|
|
||||||
'react/display-name': OFF,
|
|
||||||
'react/destructuring-assignment': [ERROR, 'always'],
|
|
||||||
// 'react/hook-use-state': ERROR,
|
|
||||||
'react/no-array-index-key': ERROR,
|
|
||||||
'react/no-unescaped-entities': OFF,
|
|
||||||
'react/void-dom-elements-no-children': ERROR,
|
|
||||||
|
|
||||||
'react/jsx-boolean-value': [ERROR, 'always'],
|
|
||||||
'react/jsx-curly-brace-presence': [
|
|
||||||
ERROR,
|
|
||||||
{ props: 'never', children: 'never' },
|
|
||||||
],
|
|
||||||
'react/jsx-no-useless-fragment': ERROR,
|
|
||||||
'react/jsx-sort-props': [
|
|
||||||
ERROR,
|
|
||||||
{
|
|
||||||
callbacksLast: true,
|
|
||||||
shorthandFirst: true,
|
|
||||||
reservedFirst: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
'@next/next/no-img-element': OFF,
|
|
||||||
'@next/next/no-html-link-for-pages': OFF,
|
|
||||||
|
|
||||||
'@typescript-eslint/array-type': [
|
|
||||||
ERROR,
|
|
||||||
{ default: 'generic', readonly: 'generic' },
|
|
||||||
],
|
|
||||||
'@typescript-eslint/consistent-generic-constructors': [
|
|
||||||
ERROR,
|
|
||||||
'constructor',
|
|
||||||
],
|
|
||||||
'@typescript-eslint/consistent-indexed-object-style': [ERROR, 'record'],
|
|
||||||
'@typescript-eslint/consistent-type-definitions': [ERROR, 'type'],
|
|
||||||
'@typescript-eslint/consistent-type-imports': ERROR,
|
|
||||||
'@typescript-eslint/no-duplicate-enum-values': ERROR,
|
|
||||||
'@typescript-eslint/no-for-in-array': ERROR,
|
|
||||||
'@typescript-eslint/no-non-null-assertion': OFF,
|
|
||||||
'@typescript-eslint/no-unused-vars': [ERROR, { argsIgnorePattern: '^_' }],
|
|
||||||
'@typescript-eslint/no-shadow': ERROR,
|
|
||||||
'@typescript-eslint/prefer-optional-chain': ERROR,
|
|
||||||
'@typescript-eslint/require-array-sort-compare': ERROR,
|
|
||||||
'@typescript-eslint/restrict-plus-operands': ERROR,
|
|
||||||
'@typescript-eslint/sort-type-union-intersection-members': ERROR,
|
|
||||||
|
|
||||||
// Sorting
|
|
||||||
'typescript-sort-keys/interface': ERROR,
|
|
||||||
'typescript-sort-keys/string-enum': ERROR,
|
|
||||||
'sort-keys-fix/sort-keys-fix': ERROR,
|
|
||||||
'simple-import-sort/exports': WARN,
|
|
||||||
'simple-import-sort/imports': [
|
|
||||||
WARN,
|
|
||||||
{
|
|
||||||
groups: [
|
|
||||||
// Ext library & side effect imports.
|
|
||||||
['^~?\\w', '^\\u0000', '^@'],
|
|
||||||
// Lib and hooks.
|
|
||||||
['^~/lib', '^~/hooks'],
|
|
||||||
// Static data.
|
|
||||||
['^~/data'],
|
|
||||||
// Components.
|
|
||||||
['^~/components'],
|
|
||||||
// Other imports.
|
|
||||||
['^~/'],
|
|
||||||
// Relative paths up until 3 level.
|
|
||||||
[
|
|
||||||
'^\\./?$',
|
|
||||||
'^\\.(?!/?$)',
|
|
||||||
'^\\.\\./?$',
|
|
||||||
'^\\.\\.(?!/?$)',
|
|
||||||
'^\\.\\./\\.\\./?$',
|
|
||||||
'^\\.\\./\\.\\.(?!/?$)',
|
|
||||||
'^\\.\\./\\.\\./\\.\\./?$',
|
|
||||||
'^\\.\\./\\.\\./\\.\\.(?!/?$)',
|
|
||||||
],
|
|
||||||
['^~/types'],
|
|
||||||
// {s}css files
|
|
||||||
['^.+\\.s?css$'],
|
|
||||||
// Others that don't fit in.
|
|
||||||
['^'],
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "eslint-config-tih",
|
|
||||||
"version": "0.0.0",
|
|
||||||
"private": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index.js",
|
|
||||||
"dependencies": {
|
|
||||||
"@typescript-eslint/eslint-plugin": "^5.33.0",
|
|
||||||
"@typescript-eslint/parser": "^5.33.0",
|
|
||||||
"eslint-config-next": "^12.3.1",
|
|
||||||
"eslint-config-prettier": "^8.5.0",
|
|
||||||
"eslint-config-turbo": "latest",
|
|
||||||
"eslint-plugin-react": "7.28.0",
|
|
||||||
"eslint-plugin-simple-import-sort": "^7.0.0",
|
|
||||||
"eslint-plugin-sort-keys-fix": "^1.1.2",
|
|
||||||
"eslint-plugin-typescript-sort-keys": "^2.1.0"
|
|
||||||
},
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
1847
pnpm-lock.yaml
generated
1847
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
12
turbo.json
12
turbo.json
@ -16,17 +16,7 @@
|
|||||||
"dependsOn": []
|
"dependsOn": []
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
"dependsOn": ["^build"],
|
"outputs": []
|
||||||
"env": [
|
|
||||||
"DATABASE_URL",
|
|
||||||
"GITHUB_CLIENT_ID",
|
|
||||||
"GITHUB_CLIENT_SECRET",
|
|
||||||
"NEXTAUTH_SECRET",
|
|
||||||
"NEXTAUTH_URL",
|
|
||||||
"NODE_ENV",
|
|
||||||
"SUPABASE_ANON_KEY",
|
|
||||||
"SUPABASE_URL"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"tsc": {
|
"tsc": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user