refactor(v4.0.0-alpha): beginning of a new era

This commit is contained in:
Amruth Pillai
2023-11-05 12:31:42 +01:00
parent 0ba6a444e2
commit 22933bd412
505 changed files with 81829 additions and 0 deletions
+30
View File
@@ -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}"]
}
]
}
}
]
}
+29
View File
@@ -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$"
]
}
+18
View File
@@ -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"
}
}
+34
View File
@@ -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"]
}
+6
View File
@@ -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) {}
+8
View File
@@ -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";
+22
View File
@@ -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) {}
+6
View File
@@ -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) {}
+10
View File
@@ -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) {}
+9
View File
@@ -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) {}
+11
View File
@@ -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) {}
+23
View File
@@ -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) {}
+8
View File
@@ -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) {}
+4
View File
@@ -0,0 +1,4 @@
export * from "./auth";
export * from "./resume";
export * from "./statistics";
export * from "./user";
+11
View File
@@ -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) {}
+9
View File
@@ -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) {}
+13
View File
@@ -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) {}
+6
View File
@@ -0,0 +1,6 @@
export * from "./create";
export * from "./delete";
export * from "./import";
export * from "./resume";
export * from "./update";
export * from "./url";
+19
View File
@@ -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) {}
+7
View File
@@ -0,0 +1,7 @@
import { createZodDto } from "nestjs-zod/dto";
import { resumeSchema } from "./resume";
export const updateResumeSchema = resumeSchema;
export class UpdateResumeDto extends createZodDto(updateResumeSchema) {}
+6
View File
@@ -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) {}
+9
View File
@@ -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) {}
+2
View File
@@ -0,0 +1,2 @@
export * from "./update-user";
export * from "./user";
+13
View File
@@ -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) {}
+31
View File
@@ -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 } }>;
+22
View File
@@ -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"
}
]
}
+10
View File
@@ -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"]
}
+19
View File
@@ -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"
]
}
+15
View File
@@ -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}"],
},
});