Skip to content
Merged

up #21

Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions bun.lock
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,23 @@
"typescript": "5.9.2",
},
},
"packages/config": {
"name": "@qco/config",
"version": "0.0.0",
"dependencies": {
"@t3-oss/env-core": "0.13.8",
"zod": "4.0.16",
},
"devDependencies": {
"@qco/eslint-config": "workspace:*",
"@qco/prettier-config": "workspace:*",
"@qco/tsconfig": "workspace:*",
"eslint": "9.32.0",
"prettier": "3.6.2",
"tsup": "8.5.0",
"typescript": "5.9.2",
},
},
"packages/db": {
"name": "@qco/db",
"version": "0.1.0",
Expand Down Expand Up @@ -283,10 +300,10 @@
"name": "@qco/emails",
"version": "1.0.0",
"dependencies": {
"@qco/config": "workspace:*",
"@qco/tsconfig": "workspace:*",
"@radix-ui/colors": "3.0.0",
"@react-email/components": "0.5.0",
"@t3-oss/env-core": "0.13.8",
"@tailwindcss/typography": "0.5.16",
"nodemailer": "^7.0.5",
"react": "19.1.1",
Expand All @@ -296,7 +313,6 @@
"sharp": "^0.34.3",
"tailwindcss": "4.1.11",
"tailwindcss-animate": "1.0.7",
"zod": "4.0.16",
},
"devDependencies": {
"@react-email/preview-server": "4.2.8",
Expand Down Expand Up @@ -420,6 +436,7 @@
"name": "@qco/web-api",
"version": "0.1.0",
"dependencies": {
"@qco/config": "workspace:*",
"@qco/db": "workspace:*",
"@qco/lib": "workspace:*",
"@qco/web-validators": "workspace:*",
Expand Down Expand Up @@ -1118,6 +1135,8 @@

"@qco/auth": ["@qco/auth@workspace:packages/auth"],

"@qco/config": ["@qco/config@workspace:packages/config"],

"@qco/db": ["@qco/db@workspace:packages/db"],

"@qco/emails": ["@qco/emails@workspace:packages/emails"],
Expand Down
2 changes: 0 additions & 2 deletions packages/auth/env.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { createEnv } from "@t3-oss/env-nextjs";
import { vercel } from "@t3-oss/env-nextjs/presets-zod";
import { z } from "zod";

export const env = createEnv({
extends: [vercel()],
server: {
AUTH_GOOGLE_CLIENT_ID: z.string().optional(),
AUTH_GOOGLE_CLIENT_SECRET: z.string().optional(),
Expand Down
35 changes: 35 additions & 0 deletions packages/config/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"name": "@qco/config",
"version": "0.0.0",
"private": true,
"type": "module",
"exports": {
".": {
"default": "./src/index.ts"
}
},
"scripts": {
"build": "tsup",
"clean": "git clean -xdf .cache .turbo dist node_modules",
"dev": "tsc",
"format": "prettier --check . --ignore-path ../../.gitignore",
"lint": "eslint",
"typecheck": "tsc --noEmit --emitDeclarationOnly false"
},
"dependencies": {
"@t3-oss/env-core": "0.13.8",
"zod": "4.0.16"
},
"devDependencies": {
"@qco/eslint-config": "workspace:*",
"@qco/prettier-config": "workspace:*",
"@qco/tsconfig": "workspace:*",
"eslint": "9.32.0",
"prettier": "3.6.2",
"tsup": "8.5.0",
"typescript": "5.9.2"
},
"prettier": "@qco/prettier-config"
}


29 changes: 29 additions & 0 deletions packages/config/src/env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { createEnv } from "@t3-oss/env-core";
import { z } from "zod";

export const env = createEnv({
server: {
NODE_ENV: z.enum(["development", "production", "test"]).optional(),
RESEND_API_KEY: z.string().optional(),
EMAIL_SANDBOX_ENABLED: z.string().optional(),
EMAIL_SANDBOX_HOST: z.string().optional(),
EMAIL_FROM: z.string().email().optional(),
SITE_NAME: z.string().default("QCO"),
SITE_URL: z.string().url().optional(),
},
client: {},
clientPrefix: "NEXT_PUBLIC_",
runtimeEnv: {
NODE_ENV: process.env.NODE_ENV,
RESEND_API_KEY: process.env.RESEND_API_KEY,
EMAIL_SANDBOX_ENABLED: process.env.EMAIL_SANDBOX_ENABLED,
EMAIL_SANDBOX_HOST: process.env.EMAIL_SANDBOX_HOST,
EMAIL_FROM: process.env.EMAIL_FROM,
SITE_NAME: process.env.SITE_NAME,
SITE_URL: process.env.SITE_URL,
},
skipValidation:
!!process.env.CI || process.env.npm_lifecycle_event === "lint",
});


3 changes: 3 additions & 0 deletions packages/config/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { env } from "./env";


7 changes: 7 additions & 0 deletions packages/config/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"extends": "@qco/tsconfig/internal-package.json",
"include": ["src"],
"exclude": ["node_modules"]
}


17 changes: 17 additions & 0 deletions packages/config/tsup.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { defineConfig } from "tsup";

export default defineConfig({
entry: ["src/index.ts"],
format: ["esm"],
dts: true,
splitting: false,
sourcemap: false,
clean: true,
minify: false,
external: [
"@t3-oss/env-core",
"zod"
],
});


2 changes: 1 addition & 1 deletion packages/emails/emails/admin-invitation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../tailwind";
import { env } from "../env";
import { env } from "@qco/config";

interface AdminInvitationEmailProps {
name: string;
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/auth/email-change-verification.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";

export default function EmailChangeVerification({ otp }: { otp: string }) {
return (
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/auth/email-verification.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";

interface EmailVerificationProps {
otp: string;
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/auth/otp-sign-in.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";

export default function OtpSignInEmail({
otp,
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/auth/password-reset.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";

export default function PasswordResetEmail({
username = "username",
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/auth/verification-otp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";

type VerificationType = "sign-in" | "email-verification" | "forget-password";

Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/orders/order-created.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
Text,
} from "@react-email/components";
import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";
import { translatePaymentMethod, translateShippingMethod } from "../../src/utils/order-status-translations";

const defaultOrderUrl = `${env.SITE_URL}/orders`;
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/orders/order-status-updated.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
Text,
} from "@react-email/components";
import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";
import { translateOrderStatus } from "../../src/utils/order-status-translations";

const defaultOrderUrl = `${env.SITE_URL}/orders`;
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/orders/order-updated.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
Text,
} from "@react-email/components";
import { emailTailwindConfig } from "../../tailwind";
import { env } from "../../env";
import { env } from "@qco/config";
import { translateOrderStatus } from "../../src/utils/order-status-translations";

const defaultOrderUrl = `${env.SITE_URL}/orders`;
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/emails/welcome.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
} from "@react-email/components";

import { emailTailwindConfig } from "../tailwind";
import { env } from "../env";
import { env } from "@qco/config";

export default function WelcomeEmail({ username = "username" }: { username: string }) {
return (
Expand Down
27 changes: 0 additions & 27 deletions packages/emails/env.ts

This file was deleted.

2 changes: 1 addition & 1 deletion packages/emails/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,4 @@ export { default as WelcomeEmail } from "./emails/welcome";
export * from "./src/utils";

export { sendEmail, sendEmailHtml } from "./send";
export { env } from "./env";
// env was moved to @qco/config to respect layered architecture
5 changes: 2 additions & 3 deletions packages/emails/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@
"with-env": "dotenv -e ../../.env --"
},
"dependencies": {
"@qco/config": "workspace:*",
"@qco/tsconfig": "workspace:*",
"@radix-ui/colors": "3.0.0",
"@react-email/components": "0.5.0",
"@t3-oss/env-core": "0.13.8",
"@tailwindcss/typography": "0.5.16",
"nodemailer": "^7.0.5",
"react": "19.1.1",
Expand All @@ -28,8 +28,7 @@
"resend": "^6.0.1",
"sharp": "^0.34.3",
"tailwindcss": "4.1.11",
"tailwindcss-animate": "1.0.7",
"zod": "4.0.16"
"tailwindcss-animate": "1.0.7"
},
"devDependencies": {
"@react-email/preview-server": "4.2.8",
Expand Down
2 changes: 1 addition & 1 deletion packages/emails/send.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type Mail from "nodemailer/lib/mailer";
import type React from "react";
import { Resend } from "resend";

import { env } from "./env";
import { env } from "@qco/config";

export const resend = env.RESEND_API_KEY
? new Resend(env.RESEND_API_KEY)
Expand Down
3 changes: 1 addition & 2 deletions packages/emails/tsup.config.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { defineConfig } from "tsup";
import { env } from "./env";

const isProduction = env.NODE_ENV === "production";
const isProduction = process.env.NODE_ENV === "production";

export default defineConfig({
entry: ["./emails/**/*.ts", "index.ts"],
Expand Down
1 change: 1 addition & 0 deletions packages/web-api/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"with-env": "bun run --env-file ../../.env"
},
"dependencies": {
"@qco/config": "workspace:*",
"@qco/db": "workspace:*",
"@qco/lib": "workspace:*",
"@qco/web-validators": "workspace:*",
Expand Down
12 changes: 6 additions & 6 deletions packages/web-api/src/lib/draft-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,15 @@ export function hasDraftChanges(
* Очищает пустые значения из данных черновика
*/
export function cleanDraftData(data: CheckoutDraftPartialValues): CheckoutDraftPartialValues {
const cleaned: CheckoutDraftPartialValues = {};
const cleaned: Record<string, unknown> = {};

for (const [key, value] of Object.entries(data)) {
if (value !== undefined && value !== null && value !== '') {
cleaned[key as keyof CheckoutDraftPartialValues] = value;
cleaned[key] = value as unknown;
}
}

return cleaned;
return cleaned as CheckoutDraftPartialValues;
}

/**
Expand All @@ -64,16 +64,16 @@ export function getChangedFields(
return currentData;
}

const changed: CheckoutDraftPartialValues = {};
const changed: Record<string, unknown> = {};

for (const [key, value] of Object.entries(currentData)) {
const originalValue = originalData[key as keyof CheckoutDraftPartialValues];
if (originalValue !== value) {
changed[key as keyof CheckoutDraftPartialValues] = value;
changed[key] = value as unknown;
}
}

return changed;
return changed as CheckoutDraftPartialValues;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ async function getVariantOptions(

// Форматируем опции варианта
const variantOptions = optionCombinations
.filter(combination => combination.option && combination.optionValue)
.map(combination => ({
.filter((combination: any) => combination.option && combination.optionValue)
.map((combination: any) => ({
name: combination.option!.name,
value: combination.optionValue!.displayName || combination.optionValue!.value,
slug: combination.option!.slug,
Expand Down
Loading
Loading