mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2026-07-24 17:03:55 +10:00
refactor(v4.0.0-alpha): beginning of a new era
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"extends": ["../../.eslintrc.json"],
|
||||
"ignorePatterns": ["!**/*"],
|
||||
"overrides": [
|
||||
{
|
||||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.ts", "*.tsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.js", "*.jsx"],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": ["*.json"],
|
||||
"parser": "jsonc-eslint-parser",
|
||||
"rules": {
|
||||
"@nx/dependency-checks": [
|
||||
"error",
|
||||
{
|
||||
"ignoredFiles": ["{projectRoot}/vite.config.{js,ts,mjs,mts}"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"jsc": {
|
||||
"target": "es2017",
|
||||
"parser": {
|
||||
"syntax": "typescript",
|
||||
"decorators": true,
|
||||
"dynamicImport": true
|
||||
},
|
||||
"transform": {
|
||||
"decoratorMetadata": true,
|
||||
"legacyDecorator": true
|
||||
},
|
||||
"keepClassNames": true,
|
||||
"externalHelpers": true,
|
||||
"loose": true
|
||||
},
|
||||
"module": {
|
||||
"type": "commonjs"
|
||||
},
|
||||
"sourceMaps": true,
|
||||
"exclude": [
|
||||
"jest.config.ts",
|
||||
".*\\.spec.tsx?$",
|
||||
".*\\.test.tsx?$",
|
||||
"./src/jest-setup.ts$",
|
||||
"./**/jest-setup.ts$",
|
||||
".*.js$"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "@reactive-resume/dto",
|
||||
"version": "0.0.1",
|
||||
"private": false,
|
||||
"type": "commonjs",
|
||||
"main": "./src/index.js",
|
||||
"typings": "./src/index.d.ts",
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"dependencies": {
|
||||
"@swc/helpers": "~0.5.2",
|
||||
"nestjs-zod": "^3.0.0",
|
||||
"@reactive-resume/utils": "*",
|
||||
"@reactive-resume/schema": "*",
|
||||
"@prisma/client": "^5.4.2"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"name": "dto",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "libs/dto/src",
|
||||
"projectType": "library",
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:swc",
|
||||
"outputs": ["{options.outputPath}"],
|
||||
"options": {
|
||||
"outputPath": "dist/libs/dto",
|
||||
"main": "libs/dto/src/index.ts",
|
||||
"tsConfig": "libs/dto/tsconfig.lib.json",
|
||||
"assets": ["libs/dto/*.md"]
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": ["{options.outputFile}"],
|
||||
"options": {
|
||||
"lintFilePatterns": ["libs/dto/**/*.ts", "libs/dto/package.json"]
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"executor": "@nx/vite:test",
|
||||
"outputs": ["{options.reportsDirectory}"],
|
||||
"options": {
|
||||
"passWithNoTests": true,
|
||||
"reportsDirectory": "../../coverage/libs/dto"
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": ["frontend", "backend"]
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const forgotPasswordSchema = z.object({ email: z.string().email() });
|
||||
|
||||
export class ForgotPasswordDto extends createZodDto(forgotPasswordSchema) {}
|
||||
@@ -0,0 +1,8 @@
|
||||
export * from "./forgot-password";
|
||||
export * from "./login";
|
||||
export * from "./message";
|
||||
export * from "./register";
|
||||
export * from "./reset-password";
|
||||
export * from "./response";
|
||||
export * from "./two-factor";
|
||||
export * from "./update-password";
|
||||
@@ -0,0 +1,22 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
import { usernameSchema } from "../user";
|
||||
|
||||
export const loginSchema = z
|
||||
.object({
|
||||
identifier: z.string(),
|
||||
password: z.password().min(6),
|
||||
})
|
||||
.refine(
|
||||
(value) => {
|
||||
if (value.identifier.includes("@")) {
|
||||
return z.string().email().parse(value.identifier);
|
||||
} else {
|
||||
return usernameSchema.parse(value.identifier);
|
||||
}
|
||||
},
|
||||
{ message: "InvalidCredentials" },
|
||||
);
|
||||
|
||||
export class LoginDto extends createZodDto(loginSchema) {}
|
||||
@@ -0,0 +1,6 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const messageSchema = z.object({ message: z.string() });
|
||||
|
||||
export class MessageDto extends createZodDto(messageSchema) {}
|
||||
@@ -0,0 +1,10 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
import { userSchema } from "../user";
|
||||
|
||||
export const registerSchema = userSchema
|
||||
.pick({ name: true, email: true, username: true, language: true })
|
||||
.extend({ password: z.password().min(6) });
|
||||
|
||||
export class RegisterDto extends createZodDto(registerSchema) {}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const resetPasswordSchema = z.object({
|
||||
token: z.string(),
|
||||
password: z.password().min(6),
|
||||
});
|
||||
|
||||
export class ResetPasswordDto extends createZodDto(resetPasswordSchema) {}
|
||||
@@ -0,0 +1,11 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
import { userSchema } from "../user";
|
||||
|
||||
export const authResponseSchema = z.object({
|
||||
status: z.enum(["authenticated", "2fa_required"]),
|
||||
user: userSchema,
|
||||
});
|
||||
|
||||
export class AuthResponseDto extends createZodDto(authResponseSchema) {}
|
||||
@@ -0,0 +1,23 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const twoFactorSchema = z.object({
|
||||
code: z
|
||||
.string()
|
||||
.length(6)
|
||||
.regex(/^[0-9]+$/, { message: "code must be a 6 digit number" }),
|
||||
});
|
||||
|
||||
export class TwoFactorDto extends createZodDto(twoFactorSchema) {}
|
||||
|
||||
export const backupCodesSchema = z.object({
|
||||
backupCodes: z.array(z.string().length(10)),
|
||||
});
|
||||
|
||||
export class BackupCodesDto extends createZodDto(backupCodesSchema) {}
|
||||
|
||||
export const twoFactorBackupSchema = z.object({
|
||||
code: z.string().length(10),
|
||||
});
|
||||
|
||||
export class TwoFactorBackupDto extends createZodDto(twoFactorBackupSchema) {}
|
||||
@@ -0,0 +1,8 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const updatePasswordSchema = z.object({
|
||||
password: z.string().min(6),
|
||||
});
|
||||
|
||||
export class UpdatePasswordDto extends createZodDto(updatePasswordSchema) {}
|
||||
@@ -0,0 +1,4 @@
|
||||
export * from "./auth";
|
||||
export * from "./resume";
|
||||
export * from "./statistics";
|
||||
export * from "./user";
|
||||
@@ -0,0 +1,11 @@
|
||||
import { kebabCase } from "@reactive-resume/utils";
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const createResumeSchema = z.object({
|
||||
title: z.string().min(1),
|
||||
slug: z.string().min(1).transform(kebabCase),
|
||||
visibility: z.enum(["public", "private"]).default("private"),
|
||||
});
|
||||
|
||||
export class CreateResumeDto extends createZodDto(createResumeSchema) {}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { idSchema } from "@reactive-resume/schema";
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const deleteResumeSchema = z.object({
|
||||
id: idSchema,
|
||||
});
|
||||
|
||||
export class DeleteResumeDto extends createZodDto(deleteResumeSchema) {}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { resumeDataSchema } from "@reactive-resume/schema";
|
||||
import { kebabCase } from "@reactive-resume/utils";
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const importResumeSchema = z.object({
|
||||
title: z.string().optional(),
|
||||
slug: z.string().min(1).transform(kebabCase).optional(),
|
||||
visibility: z.enum(["public", "private"]).default("private").optional(),
|
||||
data: resumeDataSchema,
|
||||
});
|
||||
|
||||
export class ImportResumeDto extends createZodDto(importResumeSchema) {}
|
||||
@@ -0,0 +1,6 @@
|
||||
export * from "./create";
|
||||
export * from "./delete";
|
||||
export * from "./import";
|
||||
export * from "./resume";
|
||||
export * from "./update";
|
||||
export * from "./url";
|
||||
@@ -0,0 +1,19 @@
|
||||
import { defaultResumeData, idSchema, resumeDataSchema } from "@reactive-resume/schema";
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
import { userSchema } from "../user";
|
||||
|
||||
export const resumeSchema = z.object({
|
||||
id: idSchema,
|
||||
title: z.string(),
|
||||
slug: z.string(),
|
||||
data: resumeDataSchema.default(defaultResumeData),
|
||||
visibility: z.enum(["private", "public"]).default("private"),
|
||||
userId: idSchema,
|
||||
user: userSchema.optional(),
|
||||
createdAt: z.date().or(z.dateString()),
|
||||
updatedAt: z.date().or(z.dateString()),
|
||||
});
|
||||
|
||||
export class ResumeDto extends createZodDto(resumeSchema) {}
|
||||
@@ -0,0 +1,7 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
|
||||
import { resumeSchema } from "./resume";
|
||||
|
||||
export const updateResumeSchema = resumeSchema;
|
||||
|
||||
export class UpdateResumeDto extends createZodDto(updateResumeSchema) {}
|
||||
@@ -0,0 +1,6 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const urlSchema = z.object({ url: z.string().url() });
|
||||
|
||||
export class UrlDto extends createZodDto(urlSchema) {}
|
||||
@@ -0,0 +1,9 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const statisticsSchema = z.object({
|
||||
views: z.number().int().default(0),
|
||||
downloads: z.number().int().default(0),
|
||||
});
|
||||
|
||||
export class StatisticsDto extends createZodDto(statisticsSchema) {}
|
||||
@@ -0,0 +1,2 @@
|
||||
export * from "./update-user";
|
||||
export * from "./user";
|
||||
@@ -0,0 +1,13 @@
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
|
||||
import { userSchema } from "./user";
|
||||
|
||||
export const updateUserSchema = userSchema.partial().pick({
|
||||
name: true,
|
||||
language: true,
|
||||
username: true,
|
||||
email: true,
|
||||
picture: true,
|
||||
});
|
||||
|
||||
export class UpdateUserDto extends createZodDto(updateUserSchema) {}
|
||||
@@ -0,0 +1,31 @@
|
||||
import type { Prisma } from "@prisma/client";
|
||||
import { idSchema } from "@reactive-resume/schema";
|
||||
import { createZodDto } from "nestjs-zod/dto";
|
||||
import { z } from "nestjs-zod/z";
|
||||
|
||||
export const usernameSchema = z
|
||||
.string()
|
||||
.min(3)
|
||||
.max(255)
|
||||
.regex(/^[a-z0-9._-]+$/, {
|
||||
message:
|
||||
"Usernames can only contain lowercase letters, numbers, periods, hyphens, and underscores.",
|
||||
});
|
||||
|
||||
export const userSchema = z.object({
|
||||
id: idSchema,
|
||||
name: z.string().min(3).max(255),
|
||||
picture: z.literal("").or(z.null()).or(z.string().url()),
|
||||
username: usernameSchema,
|
||||
email: z.string().email(),
|
||||
language: z.string().default("en"),
|
||||
emailVerified: z.boolean().default(false),
|
||||
twoFactorEnabled: z.boolean().default(false),
|
||||
provider: z.enum(["email", "github", "google"]).default("email"),
|
||||
createdAt: z.date().or(z.dateString()),
|
||||
updatedAt: z.date().or(z.dateString()),
|
||||
});
|
||||
|
||||
export class UserDto extends createZodDto(userSchema) {}
|
||||
|
||||
export type UserWithSecrets = Prisma.UserGetPayload<{ include: { secrets: true } }>;
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"extends": "../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"noImplicitOverride": true,
|
||||
"noPropertyAccessFromIndexSignature": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true
|
||||
},
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
},
|
||||
{
|
||||
"path": "./tsconfig.spec.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["src/**/*.ts"],
|
||||
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../dist/out-tsc",
|
||||
"types": ["vitest/globals", "vitest/importMeta", "vite/client", "node", "vitest"]
|
||||
},
|
||||
"include": [
|
||||
"vite.config.ts",
|
||||
"src/**/*.test.ts",
|
||||
"src/**/*.spec.ts",
|
||||
"src/**/*.test.tsx",
|
||||
"src/**/*.spec.tsx",
|
||||
"src/**/*.test.js",
|
||||
"src/**/*.spec.js",
|
||||
"src/**/*.test.jsx",
|
||||
"src/**/*.spec.jsx",
|
||||
"src/**/*.d.ts"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import { nxViteTsPaths } from "@nx/vite/plugins/nx-tsconfig-paths.plugin";
|
||||
import { defineConfig } from "vite";
|
||||
|
||||
export default defineConfig({
|
||||
cacheDir: "../../node_modules/.vite/dto",
|
||||
|
||||
plugins: [nxViteTsPaths()],
|
||||
|
||||
test: {
|
||||
globals: true,
|
||||
environment: "jsdom",
|
||||
cache: { dir: "../../node_modules/.vitest" },
|
||||
include: ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user