diff --git a/package.json b/package.json index 7993871..94b8e7c 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "next build", "check-types": "tsc --noEmit", - "dev": "next dev", + "dev": "next dev --port 3001", "fetch-schema": "curl https://raw.githubusercontent.com/saleor/saleor/${npm_package_saleor_schemaVersion}/saleor/graphql/schema.graphql > ./schema.graphql", "gql-check": "gql.tada check", "gql-generate": "gql.tada generate output", diff --git a/src/components/form-button.tsx b/src/components/form-button.tsx index 6a1336c..f08160b 100644 --- a/src/components/form-button.tsx +++ b/src/components/form-button.tsx @@ -1,7 +1,6 @@ import { Loader2 } from "lucide-react"; -import React from "react"; -import { Button, ButtonProps } from "./ui/button"; +import { Button, type ButtonProps } from "./ui/button"; interface FormButtonProps extends ButtonProps { loading?: boolean; diff --git a/src/components/ui/form.tsx b/src/components/ui/form.tsx index 0710ab4..105229e 100644 --- a/src/components/ui/form.tsx +++ b/src/components/ui/form.tsx @@ -5,9 +5,9 @@ import { Slot } from "@radix-ui/react-slot"; import * as React from "react"; import { Controller, - ControllerProps, - FieldPath, - FieldValues, + type ControllerProps, + type FieldPath, + type FieldValues, FormProvider, useFormContext, } from "react-hook-form"; diff --git a/src/lib/logger.ts b/src/lib/logger.ts index e49536b..30f2fcb 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -1,4 +1,4 @@ -import { type ILogObj, ILogObjMeta, Logger } from "tslog"; +import { type ILogObj, type ILogObjMeta, Logger } from "tslog"; import { env } from "@/env"; @@ -46,18 +46,14 @@ export const logger = new Logger({ }); logger.attachTransport((log) => { - const { - message, - attributes, - _meta: { name }, - } = log as ILogObj & + const { message, attributes, meta } = log as ILogObj & ILogObjMeta & { message: string; attributes: Record; }; // eslint-disable-next-line no-console - console.log(`${name}: ${message}`, JSON.stringify(attributes, null, 2)); + console.log(`${meta?.name}: ${message}`, JSON.stringify(attributes, null, 2)); }); export const createLogger = (name: string, params?: Record) => diff --git a/src/modules/checkout-details/components/billing.tsx b/src/modules/checkout-details/components/billing.tsx index 008910b..876bde4 100644 --- a/src/modules/checkout-details/components/billing.tsx +++ b/src/modules/checkout-details/components/billing.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { useForm } from "react-hook-form"; import * as z from "zod"; diff --git a/src/modules/checkout-details/components/delivery-method.tsx b/src/modules/checkout-details/components/delivery-method.tsx index d695d08..7f6f82a 100644 --- a/src/modules/checkout-details/components/delivery-method.tsx +++ b/src/modules/checkout-details/components/delivery-method.tsx @@ -1,6 +1,6 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { useForm } from "react-hook-form"; import * as z from "zod"; @@ -68,7 +68,7 @@ export const DeliveryMethod = (props: { } // if there is only one shipping method, return its id if (shippingMethods.length === 1) { - return shippingMethods[0].id; + return shippingMethods[0]?.id; } // otherwise, return empty string return ""; diff --git a/src/modules/checkout-details/components/shipping.tsx b/src/modules/checkout-details/components/shipping.tsx index bbd7499..0f29825 100644 --- a/src/modules/checkout-details/components/shipping.tsx +++ b/src/modules/checkout-details/components/shipping.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { useForm } from "react-hook-form"; import * as z from "zod"; diff --git a/src/modules/dropin/actions/initalize-transaction.ts b/src/modules/dropin/actions/initalize-transaction.ts index 260dbae..34d7cbd 100644 --- a/src/modules/dropin/actions/initalize-transaction.ts +++ b/src/modules/dropin/actions/initalize-transaction.ts @@ -6,13 +6,10 @@ import { z } from "zod"; import { envUrlSchema } from "@/lib/env-url"; import { BaseError, UnknownError } from "@/lib/errors"; -import { createLogger } from "@/lib/logger"; import { actionClient } from "@/lib/safe-action"; import { InitalizeTransactionSchema } from "../schemas"; -const logger = createLogger("initalizeTransaction"); - const initalizeTransactionMutation = graphql(` mutation InitalizeTransaction( $checkoutId: ID! diff --git a/src/modules/dropin/actions/process-transaction.ts b/src/modules/dropin/actions/process-transaction.ts index 478e3b3..508d540 100644 --- a/src/modules/dropin/actions/process-transaction.ts +++ b/src/modules/dropin/actions/process-transaction.ts @@ -6,13 +6,10 @@ import { z } from "zod"; import { envUrlSchema } from "@/lib/env-url"; import { BaseError, UnknownError } from "@/lib/errors"; -import { createLogger } from "@/lib/logger"; import { actionClient } from "@/lib/safe-action"; import { TransactionProcessSchema } from "../schemas/transaction-process"; -const logger = createLogger("processTransaction"); - const processTransactionMutation = graphql(` mutation transactionProcess($transactionId: ID!, $data: JSON) { transactionProcess(id: $transactionId, data: $data) { diff --git a/src/modules/dropin/adyen/gateway-config-responses.ts b/src/modules/dropin/adyen/gateway-config-responses.ts index 7437e61..1588716 100644 --- a/src/modules/dropin/adyen/gateway-config-responses.ts +++ b/src/modules/dropin/adyen/gateway-config-responses.ts @@ -4,7 +4,7 @@ import { createLogger } from "@/lib/logger"; import { GiftCardBalanceResponseSchema, - InitalizePaymentGatewaySchemaType, + type InitalizePaymentGatewaySchemaType, OrderCancelResponseSchema, OrderCreateResponseSchema, } from "../schemas"; @@ -25,7 +25,7 @@ export class AdyenGiftCardBalanceResponse { ); } return new AdyenGiftCardBalanceResponse( - data.paymentGatewayInitialize.gatewayConfigs[0].data.giftCardBalanceResponse, + data.paymentGatewayInitialize.gatewayConfigs[0]?.data.giftCardBalanceResponse, ); } @@ -48,7 +48,7 @@ export class AdyenOrderCreateResponse { ); } return new AdyenOrderCreateResponse( - data.paymentGatewayInitialize.gatewayConfigs[0].data.orderCreateResponse, + data.paymentGatewayInitialize.gatewayConfigs[0]?.data.orderCreateResponse, ); } @@ -71,7 +71,7 @@ export class AdyenOrderCancelledResponse { ); } return new AdyenOrderCancelledResponse( - data.paymentGatewayInitialize.gatewayConfigs[0].data.orderCancelResponse, + data.paymentGatewayInitialize.gatewayConfigs[0]?.data.orderCancelResponse, ); } diff --git a/src/modules/dropin/components/adyen-dropin.tsx b/src/modules/dropin/components/adyen-dropin.tsx index 3e82079..2e2d375 100644 --- a/src/modules/dropin/components/adyen-dropin.tsx +++ b/src/modules/dropin/components/adyen-dropin.tsx @@ -2,12 +2,12 @@ import "@adyen/adyen-web/dist/adyen.css"; import AdyenCheckout from "@adyen/adyen-web"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { useEffect, useRef } from "react"; import { getAdyenDropinConfig } from "../adyen"; import { TotalPriceFragment } from "../fragments"; -import { InitalizePaymentGatewaySchemaType } from "../schemas"; +import { type InitalizePaymentGatewaySchemaType } from "../schemas"; export const AdyenDropin = (props: { initalizePaymentGatewayData: InitalizePaymentGatewaySchemaType; @@ -25,7 +25,8 @@ export const AdyenDropin = (props: { checkoutId, paymentGatewayId, } = props; - const gatewayConfig = gatewayConfigs[0]; + // there are always going to be at least one gateway config + const gatewayConfig = gatewayConfigs[0]!; const { clientKey, environment, paymentMethodsResponse } = gatewayConfig.data; const totalPrice = readFragment(TotalPriceFragment, totalPriceData); const dropinContainerRef = useRef(null); diff --git a/src/modules/environment/components/cart.tsx b/src/modules/environment/components/cart.tsx index 8db83cb..135f1fb 100644 --- a/src/modules/environment/components/cart.tsx +++ b/src/modules/environment/components/cart.tsx @@ -1,6 +1,6 @@ "use client"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import Image from "next/image"; import { useTransition } from "react"; @@ -27,7 +27,7 @@ export const Cart = (props: { const response = await createCheckout({ envUrl, channelSlug, - variantId: products[0].defaultVariant?.id ?? "", + variantId: products[0]?.defaultVariant?.id ?? "", }); if (response?.serverError) { diff --git a/src/modules/environment/components/environment.tsx b/src/modules/environment/components/environment.tsx index c26525f..69df02b 100644 --- a/src/modules/environment/components/environment.tsx +++ b/src/modules/environment/components/environment.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { FragmentOf } from "gql.tada"; +import { type FragmentOf } from "gql.tada"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; diff --git a/src/modules/payment-gateway/components/payment-gateway-select.tsx b/src/modules/payment-gateway/components/payment-gateway-select.tsx index 7b5f33a..196e07e 100644 --- a/src/modules/payment-gateway/components/payment-gateway-select.tsx +++ b/src/modules/payment-gateway/components/payment-gateway-select.tsx @@ -1,7 +1,7 @@ "use client"; import { zodResolver } from "@hookform/resolvers/zod"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { useForm } from "react-hook-form"; import { z } from "zod"; @@ -45,7 +45,7 @@ export const PaymentGatewaySelect = (props: { const getDefaultPaymentGatewayId = () => { // if there is only one available payment gateway, return its id if (availablePaymentGateways.length === 1) { - return availablePaymentGateways[0].id; + return availablePaymentGateways[0]?.id; } // otherwise, return empty string return ""; diff --git a/src/modules/summary/actions/get-checkout-summary.ts b/src/modules/summary/actions/get-checkout-summary.ts index c82772c..692b768 100644 --- a/src/modules/summary/actions/get-checkout-summary.ts +++ b/src/modules/summary/actions/get-checkout-summary.ts @@ -5,13 +5,10 @@ import { z } from "zod"; import { envUrlSchema } from "@/lib/env-url"; import { BaseError, UnknownError } from "@/lib/errors"; -import { createLogger } from "@/lib/logger"; import { actionClient } from "@/lib/safe-action"; import { CheckoutFragment } from "../fragments"; -const logger = createLogger("getCheckoutSummary"); - const GetCheckoutSummaryQuery = graphql( ` query getCheckoutSummary($checkoutId: ID!) { diff --git a/src/modules/summary/components/summary.tsx b/src/modules/summary/components/summary.tsx index 8eb26fd..6151490 100644 --- a/src/modules/summary/components/summary.tsx +++ b/src/modules/summary/components/summary.tsx @@ -1,7 +1,7 @@ "use client"; import { lightFormat } from "date-fns"; -import { FragmentOf, readFragment } from "gql.tada"; +import { type FragmentOf, readFragment } from "gql.tada"; import { Copy, SquareArrowOutUpRight } from "lucide-react"; import Link from "next/link"; import { useTransition } from "react"; diff --git a/tsconfig.json b/tsconfig.json index 1338796..19a1633 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,26 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, + "esModuleInterop": true, "skipLibCheck": true, + "allowJs": true, + "resolveJsonModule": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "incremental": true, + "strict": true, - "noEmit": true, - "esModuleInterop": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "module": "esnext", "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, + "noEmit": true, + + "lib": ["dom", "dom.iterable", "esnext"], "jsx": "preserve", - "incremental": true, + "plugins": [ { "name": "next"