mirror of
https://github.com/lukevella/rallly.git
synced 2025-05-12 16:36:49 +02:00
🎨 Add linting and prettier to more places (#1432)
This commit is contained in:
parent
de6963db4f
commit
ee68d80026
70 changed files with 136 additions and 141 deletions
|
@ -9,8 +9,7 @@
|
|||
"start": "next start",
|
||||
"lint": "eslint .",
|
||||
"type-check": "tsc --pretty --noEmit",
|
||||
"i18n:scan": "i18next-scanner --config i18next-scanner.config.js",
|
||||
"prettier": "prettier --write ./src"
|
||||
"i18n:scan": "i18next-scanner --config i18next-scanner.config.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@rallly/billing": "*",
|
||||
|
|
|
@ -12,7 +12,7 @@ export default function BlogLayout({
|
|||
<div className="mx-auto max-w-2xl space-y-12">
|
||||
{children}
|
||||
<div className="overflow-hidden rounded-md border bg-gray-200/50 backdrop-blur-sm">
|
||||
<div className="flex flex-col gap-x-4 gap-y-2 p-6 pb-0 sm:flex-row">
|
||||
<div className="flex flex-col gap-x-4 gap-y-2 p-6 pb-0 sm:flex-row">
|
||||
<div>
|
||||
<NewspaperIcon className="size-6" />
|
||||
</div>
|
||||
|
|
|
@ -63,7 +63,7 @@ export const Footer: React.FunctionComponent = () => {
|
|||
return (
|
||||
<div className="mx-auto space-y-8">
|
||||
<div className="space-y-16 lg:flex lg:space-x-8 lg:space-y-0">
|
||||
<div className=" lg:w-2/6">
|
||||
<div className="lg:w-2/6">
|
||||
<Image
|
||||
src="/logo-grayscale.svg"
|
||||
width={140}
|
||||
|
|
|
@ -14,7 +14,7 @@ export const NavLink = ({
|
|||
<Link
|
||||
className={cn(
|
||||
"inline-flex items-center gap-x-2.5 rounded text-sm font-medium",
|
||||
isActive ? "" : "hover:text-primary text-muted-foreground ",
|
||||
isActive ? "" : "hover:text-primary text-muted-foreground",
|
||||
className,
|
||||
)}
|
||||
{...props}
|
||||
|
|
|
@ -126,7 +126,7 @@ export default async function Page({ params }: { params: { locale: string } }) {
|
|||
const { t } = await getTranslation(params.locale, ["common", "pricing"]);
|
||||
return (
|
||||
<article className="mx-auto max-w-3xl space-y-6">
|
||||
<header className="space-y-2 sm:p-6 sm:text-center ">
|
||||
<header className="space-y-2 sm:p-6 sm:text-center">
|
||||
<h1 className="text-2xl font-bold tracking-tight sm:text-4xl">
|
||||
<Trans
|
||||
t={t}
|
||||
|
|
|
@ -25,7 +25,7 @@ const ErrorPage: React.FunctionComponent<ComponentProps> = ({
|
|||
{icon || (
|
||||
<FileSearchIcon className="mb-4 inline-block size-24 text-gray-400" />
|
||||
)}
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold ">
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold">
|
||||
{title}
|
||||
</div>
|
||||
<p className="text-gray-600">{description}</p>
|
||||
|
|
|
@ -13,7 +13,7 @@ import { BonusItem } from "@/components/home/bonus-item";
|
|||
export async function Bonus({ t }: { t: TFunction }) {
|
||||
const userCount = await prisma.user.count();
|
||||
return (
|
||||
<div className="mx-auto flex flex-wrap justify-center gap-2 whitespace-nowrap text-center sm:grid-cols-4 sm:gap-4 sm:gap-x-8">
|
||||
<div className="mx-auto flex flex-wrap justify-center gap-2 whitespace-nowrap text-center sm:grid-cols-4 sm:gap-4 sm:gap-x-8">
|
||||
<BonusItem
|
||||
className="bg-indigo-600"
|
||||
icon={<Users2Icon className="size-4" />}
|
||||
|
|
|
@ -266,7 +266,7 @@ export const BigTestimonial = () => {
|
|||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: "all" }}
|
||||
className="flex flex-col items-center gap-y-8 "
|
||||
className="flex flex-col items-center gap-y-8"
|
||||
>
|
||||
<Image
|
||||
src="/static/images/stars-5.svg"
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { supportedLngs } from "@rallly/languages";
|
||||
import languageParser from "accept-language-parser";
|
||||
import type { NextRequest} from "next/server";
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
export async function getLocaleFromHeader(req: NextRequest) {
|
||||
|
|
|
@ -62,7 +62,7 @@
|
|||
@apply mb-6 leading-relaxed;
|
||||
}
|
||||
p:has(> img) {
|
||||
@apply flex items-center justify-center overflow-hidden rounded-xl border bg-gray-50 p-2;
|
||||
@apply flex items-center justify-center overflow-hidden rounded-xl border bg-gray-50 p-2;
|
||||
}
|
||||
img {
|
||||
@apply mx-auto rounded-lg border;
|
||||
|
@ -126,7 +126,7 @@
|
|||
}
|
||||
|
||||
.btn-default {
|
||||
@apply btn bg-white/50 text-gray-700 hover:bg-gray-50 hover:shadow-sm active:bg-gray-200 active:shadow-none;
|
||||
@apply btn bg-white/50 text-gray-700 hover:bg-gray-50 hover:shadow-sm active:bg-gray-200 active:shadow-none;
|
||||
}
|
||||
.btn-danger {
|
||||
text-shadow: rgb(0 0 0 / 20%) 0px 1px 1px;
|
||||
|
|
|
@ -4,11 +4,11 @@
|
|||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["src/*"],
|
||||
"~/*": ["public/*"],
|
||||
"~/*": ["public/*"]
|
||||
},
|
||||
"checkJs": false,
|
||||
"strictNullChecks": true,
|
||||
"strictNullChecks": true
|
||||
},
|
||||
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
3
apps/web/declarations/next-auth.d.ts
vendored
3
apps/web/declarations/next-auth.d.ts
vendored
|
@ -1,9 +1,8 @@
|
|||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import type { TimeFormat } from "@rallly/database";
|
||||
import { extend } from "lodash";
|
||||
import type { DefaultSession, DefaultUser } from "next-auth";
|
||||
import NextAuth from "next-auth";
|
||||
import type { DefaultJWT} from "next-auth/jwt";
|
||||
import type { DefaultJWT } from "next-auth/jwt";
|
||||
import { JWT } from "next-auth/jwt";
|
||||
|
||||
declare module "next-auth" {
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
"lint": "eslint .",
|
||||
"type-check": "tsc --pretty --noEmit",
|
||||
"i18n:scan": "i18next-scanner --config i18next-scanner.config.js",
|
||||
"prettier": "prettier --write ./src",
|
||||
"test:integration": "NODE_ENV=test playwright test",
|
||||
"test:unit": "vitest run",
|
||||
"test": "yarn test:unit && yarn test:e2e",
|
||||
|
|
|
@ -16,5 +16,4 @@ Sentry.init({
|
|||
|
||||
// Uncomment the line below to enable Spotlight (https://spotlightjs.com)
|
||||
// spotlight: process.env.NODE_ENV === 'development',
|
||||
|
||||
});
|
||||
|
|
|
@ -24,7 +24,7 @@ export function MenuItem({
|
|||
isCurrent
|
||||
? "bg-gray-200 text-indigo-600"
|
||||
: "hover:text-primary text-gray-700",
|
||||
"group flex items-center gap-x-3 rounded-md px-3 py-2 text-sm font-semibold leading-6",
|
||||
"group flex items-center gap-x-3 rounded-md px-3 py-2 text-sm font-semibold leading-6",
|
||||
)}
|
||||
>
|
||||
<Icon
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
"use client";
|
||||
import { usePostHog } from "@rallly/posthog/client";
|
||||
import { Button } from "@rallly/ui/button";
|
||||
import type {
|
||||
DialogProps} from "@rallly/ui/dialog";
|
||||
import type { DialogProps } from "@rallly/ui/dialog";
|
||||
import {
|
||||
Dialog,
|
||||
DialogClose,
|
||||
|
|
|
@ -63,7 +63,7 @@ export function Sidebar() {
|
|||
const { user } = useUser();
|
||||
const posthog = usePostHog();
|
||||
return (
|
||||
<nav className="flex flex-1 flex-col ">
|
||||
<nav className="flex flex-1 flex-col">
|
||||
<ul role="list" className="flex flex-1 flex-col gap-y-7">
|
||||
<li>
|
||||
<ul role="list" className="-mx-2 space-y-1">
|
||||
|
|
|
@ -14,7 +14,7 @@ export default async function Page() {
|
|||
<div className="space-y-8">
|
||||
<div className="space-y-4 text-center">
|
||||
<FileSearchIcon className="mb-4 inline-block size-24 text-gray-400" />
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold ">
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold">
|
||||
{t("errors_notFoundTitle")}
|
||||
</div>
|
||||
<p className="text-gray-600">{t("errors_notFoundDescription")}</p>
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
"use client";
|
||||
import { usePostHog } from "@rallly/posthog/client";
|
||||
import { Button } from "@rallly/ui/button";
|
||||
import type {
|
||||
DialogProps} from "@rallly/ui/dialog";
|
||||
import type { DialogProps } from "@rallly/ui/dialog";
|
||||
import {
|
||||
Dialog,
|
||||
DialogClose,
|
||||
|
|
|
@ -13,11 +13,8 @@ import Link from "next/link";
|
|||
import { useRouter } from "next/navigation";
|
||||
import { useForm } from "react-hook-form";
|
||||
|
||||
import type {
|
||||
PollDetailsData} from "@/components/forms/poll-details-form";
|
||||
import {
|
||||
PollDetailsForm,
|
||||
} from "@/components/forms/poll-details-form";
|
||||
import type { PollDetailsData } from "@/components/forms/poll-details-form";
|
||||
import { PollDetailsForm } from "@/components/forms/poll-details-form";
|
||||
import { useUpdatePollMutation } from "@/components/poll/mutations";
|
||||
import { usePoll } from "@/components/poll-context";
|
||||
import { Trans } from "@/components/trans";
|
||||
|
|
|
@ -6,11 +6,8 @@ import Link from "next/link";
|
|||
import { useRouter } from "next/navigation";
|
||||
import { useForm } from "react-hook-form";
|
||||
|
||||
import type {
|
||||
PollSettingsFormData} from "@/components/forms/poll-settings";
|
||||
import {
|
||||
PollSettingsForm
|
||||
} from "@/components/forms/poll-settings";
|
||||
import type { PollSettingsFormData } from "@/components/forms/poll-settings";
|
||||
import { PollSettingsForm } from "@/components/forms/poll-settings";
|
||||
import { useUpdatePollMutation } from "@/components/poll/mutations";
|
||||
import { Trans } from "@/components/trans";
|
||||
import { usePoll } from "@/contexts/poll";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import type { NextRequest} from "next/server";
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import { resetUser } from "@/app/guest";
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { GetObjectCommand } from "@aws-sdk/client-s3";
|
||||
import type { NextRequest} from "next/server";
|
||||
import type { NextRequest } from "next/server";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
import { env } from "@/env";
|
||||
|
|
|
@ -4,7 +4,11 @@ import * as Sentry from "@sentry/nextjs";
|
|||
import NextError from "next/error";
|
||||
import { useEffect } from "react";
|
||||
|
||||
export default function GlobalError({ error }: { error: Error & { digest?: string } }) {
|
||||
export default function GlobalError({
|
||||
error,
|
||||
}: {
|
||||
error: Error & { digest?: string };
|
||||
}) {
|
||||
useEffect(() => {
|
||||
Sentry.captureException(error);
|
||||
}, [error]);
|
||||
|
|
|
@ -9,15 +9,8 @@ import {
|
|||
DropdownMenuTrigger,
|
||||
} from "@rallly/ui/dropdown-menu";
|
||||
import { Icon } from "@rallly/ui/icon";
|
||||
import type {
|
||||
CalendarEvent} from "calendar-link";
|
||||
import {
|
||||
google,
|
||||
ics,
|
||||
office365,
|
||||
outlook,
|
||||
yahoo,
|
||||
} from "calendar-link";
|
||||
import type { CalendarEvent } from "calendar-link";
|
||||
import { google, ics, office365, outlook, yahoo } from "calendar-link";
|
||||
import { DownloadIcon, PlusIcon } from "lucide-react";
|
||||
import Image from "next/image";
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ const CookieConsentPopover = () => {
|
|||
Cookies.set("rallly_cookie_consent", "1", { expires: 365 });
|
||||
setVisible(false);
|
||||
}}
|
||||
className="bg-primary-600 hover:bg-primary-600/90 focus:ring-primary-200 active:bg-primary-600/90 grow rounded-md px-5 py-1 font-semibold text-white shadow-sm transition-all focus:ring-2"
|
||||
className="bg-primary-600 hover:bg-primary-600/90 focus:ring-primary-200 active:bg-primary-600/90 grow rounded-md px-5 py-1 font-semibold text-white shadow-sm transition-all focus:ring-2"
|
||||
>
|
||||
OK
|
||||
</button>
|
||||
|
|
|
@ -21,7 +21,7 @@ import { useUser } from "@/components/user-provider";
|
|||
import { trpc } from "@/trpc/client";
|
||||
import { setCookie } from "@/utils/cookies";
|
||||
|
||||
import type { NewEventData} from "./forms";
|
||||
import type { NewEventData } from "./forms";
|
||||
import { PollDetailsForm, PollOptionsForm } from "./forms";
|
||||
|
||||
const required = <T,>(v: T | undefined): T => {
|
||||
|
|
|
@ -229,7 +229,7 @@ function DiscussionInner() {
|
|||
</Badge>
|
||||
) : null}
|
||||
</Participant>
|
||||
<div className="flex items-center gap-2 text-sm ">
|
||||
<div className="flex items-center gap-2 text-sm">
|
||||
<div className="text-gray-500">
|
||||
{dayjs(comment.createdAt).fromNow()}
|
||||
</div>
|
||||
|
|
|
@ -21,7 +21,7 @@ const ErrorPage: React.FunctionComponent<ComponentProps> = ({
|
|||
<div className="space-y-8">
|
||||
<div className="space-y-4 text-center">
|
||||
<Icon className="mb-4 inline-block size-24 text-gray-400" />
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold ">
|
||||
<div className="text-primary-600 mb-2 text-3xl font-bold">
|
||||
{title}
|
||||
</div>
|
||||
<p className="text-gray-600">{description}</p>
|
||||
|
|
|
@ -101,7 +101,7 @@ const WeekCalendar: React.FunctionComponent<DateTimePickerProps> = ({
|
|||
<div
|
||||
// onClick prop doesn't work properly. Seems like some other element is cancelling the event before it reaches this element
|
||||
onMouseUp={props.onClick}
|
||||
className="text-primary-500 border-primary-300 hover:border-primary-400 hover:text-primary-600 group absolute ml-1 flex max-h-full flex-col justify-between overflow-hidden rounded-lg border border-dashed bg-white/50 p-1 text-xs shadow-sm hover:cursor-pointer"
|
||||
className="text-primary-500 border-primary-300 hover:border-primary-400 hover:text-primary-600 group absolute ml-1 flex max-h-full flex-col justify-between overflow-hidden rounded-lg border border-dashed bg-white/50 p-1 text-xs shadow-sm hover:cursor-pointer"
|
||||
style={{
|
||||
top: `calc(${props.style?.top}% + 4px)`,
|
||||
height: `calc(${props.style?.height}% - 8px)`,
|
||||
|
@ -127,7 +127,7 @@ const WeekCalendar: React.FunctionComponent<DateTimePickerProps> = ({
|
|||
header: function Header({ date }: any) {
|
||||
return (
|
||||
<span className="w-full rounded-md text-center text-sm tracking-tight">
|
||||
<span className="mr-1.5 font-normal opacity-50">
|
||||
<span className="mr-1.5 font-normal opacity-50">
|
||||
{dayjs(date).format("ddd")}
|
||||
</span>
|
||||
<span className="font-medium">
|
||||
|
@ -143,7 +143,7 @@ const WeekCalendar: React.FunctionComponent<DateTimePickerProps> = ({
|
|||
children?: React.ReactNode;
|
||||
}) {
|
||||
return (
|
||||
<div className="h-6 text-xs leading-none text-gray-500">
|
||||
<div className="h-6 text-xs leading-none text-gray-500">
|
||||
{children}
|
||||
</div>
|
||||
);
|
||||
|
|
|
@ -54,7 +54,7 @@ const Setting = ({ children }: React.PropsWithChildren) => {
|
|||
<label
|
||||
className={cn(
|
||||
"cursor-pointer bg-white hover:bg-gray-50 active:bg-gray-100",
|
||||
"flex select-none justify-between gap-x-4 gap-y-2.5 rounded-md border p-3 sm:flex-row ",
|
||||
"flex select-none justify-between gap-x-4 gap-y-2.5 rounded-md border p-3 sm:flex-row",
|
||||
)}
|
||||
>
|
||||
{children}
|
||||
|
|
|
@ -31,7 +31,7 @@ import { Input } from "@rallly/ui/input";
|
|||
import { PencilIcon, TagIcon, TrashIcon } from "lucide-react";
|
||||
import { useTranslation } from "next-i18next";
|
||||
import React from "react";
|
||||
import type { SubmitHandler} from "react-hook-form";
|
||||
import type { SubmitHandler } from "react-hook-form";
|
||||
import { useForm } from "react-hook-form";
|
||||
import { useMount } from "react-use";
|
||||
import { z } from "zod";
|
||||
|
|
|
@ -2,13 +2,8 @@
|
|||
|
||||
import { pricingData } from "@rallly/billing/pricing";
|
||||
import { Badge } from "@rallly/ui/badge";
|
||||
import type {
|
||||
DialogProps} from "@rallly/ui/dialog";
|
||||
import {
|
||||
Dialog,
|
||||
DialogContent,
|
||||
useDialog,
|
||||
} from "@rallly/ui/dialog";
|
||||
import type { DialogProps } from "@rallly/ui/dialog";
|
||||
import { Dialog, DialogContent, useDialog } from "@rallly/ui/dialog";
|
||||
import { RadioGroup, RadioGroupItem } from "@rallly/ui/radio-group";
|
||||
import { m } from "framer-motion";
|
||||
import { CheckIcon } from "lucide-react";
|
||||
|
|
|
@ -8,10 +8,9 @@ import React from "react";
|
|||
import type { GetPollApiResponse, Vote } from "@/trpc/client/types";
|
||||
import type {
|
||||
ParsedDateOption,
|
||||
ParsedTimeSlotOption} from "@/utils/date-time-utils";
|
||||
import {
|
||||
getDuration
|
||||
ParsedTimeSlotOption,
|
||||
} from "@/utils/date-time-utils";
|
||||
import { getDuration } from "@/utils/date-time-utils";
|
||||
import { useDayjs } from "@/utils/dayjs";
|
||||
|
||||
import ErrorPage from "./error-page";
|
||||
|
|
|
@ -291,7 +291,7 @@ const DesktopPoll: React.FunctionComponent = () => {
|
|||
"scrollbar-thin hover:scrollbar-thumb-gray-400 scrollbar-thumb-gray-300 scrollbar-track-gray-100 relative z-10 flex-grow overflow-auto scroll-smooth",
|
||||
)}
|
||||
>
|
||||
<table className="w-full table-auto border-separate border-spacing-0 bg-gray-50 ">
|
||||
<table className="w-full table-auto border-separate border-spacing-0 bg-gray-50">
|
||||
<thead>
|
||||
<PollHeader />
|
||||
</thead>
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import { cn } from "@rallly/ui";
|
||||
import { Button } from "@rallly/ui/button";
|
||||
import type {
|
||||
DialogProps} from "@rallly/ui/dialog";
|
||||
import type { DialogProps } from "@rallly/ui/dialog";
|
||||
import {
|
||||
Dialog,
|
||||
DialogClose,
|
||||
|
|
|
@ -28,7 +28,7 @@ const Steps: React.FunctionComponent<StepsProps> = ({
|
|||
return (
|
||||
<span
|
||||
key={i}
|
||||
className={clsx("h-2 w-2 rounded-full transition-all", {
|
||||
className={clsx("h-2 w-2 rounded-full transition-all", {
|
||||
"bg-primary-400": i <= current,
|
||||
"bg-gray-300": i > current,
|
||||
"ring-primary-200 animate-pulse ring-4": i === current,
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
.input {
|
||||
@apply appearance-none border px-2 text-gray-800 placeholder:text-gray-500;
|
||||
@apply focus-visible:ring-offset-input-background focus-visible:ring-1 focus-visible:ring-offset-1;
|
||||
@apply focus-visible:border-primary-400 focus-visible:ring-primary-100;
|
||||
@apply focus-visible:border-primary-400 focus-visible:ring-primary-100;
|
||||
}
|
||||
input.input {
|
||||
@apply h-9;
|
||||
|
@ -64,7 +64,7 @@
|
|||
}
|
||||
|
||||
.btn-default {
|
||||
@apply btn bg-white/50 text-gray-700 hover:bg-gray-50 hover:shadow-sm active:bg-gray-200 active:shadow-none;
|
||||
@apply btn bg-white/50 text-gray-700 hover:bg-gray-50 hover:shadow-sm active:bg-gray-200 active:shadow-none;
|
||||
}
|
||||
.btn-danger {
|
||||
text-shadow: rgb(0 0 0 / 20%) 0px 1px 1px;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import type { Page} from "@playwright/test";
|
||||
import type { Page } from "@playwright/test";
|
||||
import { expect, test } from "@playwright/test";
|
||||
import type { MailServer } from "smtp-tester";
|
||||
import smtpTester from "smtp-tester";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import type { Page} from "@playwright/test";
|
||||
import type { Page } from "@playwright/test";
|
||||
import { expect, test } from "@playwright/test";
|
||||
import type { MailServer } from "smtp-tester";
|
||||
import smtpTester from "smtp-tester";
|
||||
|
|
|
@ -3,22 +3,17 @@
|
|||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["src/*"],
|
||||
"@/*": ["src/*"]
|
||||
},
|
||||
"strictNullChecks": true,
|
||||
"types": ["vitest/globals"],
|
||||
"types": ["vitest/globals"]
|
||||
},
|
||||
"include": [
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
"**/*.js",
|
||||
".next/types/**/*.ts",
|
||||
"vitest.config.mts",
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
".next/**/*",
|
||||
"playwright-report",
|
||||
"test-results",
|
||||
"vitest.config.mts"
|
||||
],
|
||||
"exclude": ["node_modules", ".next/**/*", "playwright-report", "test-results"]
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
"lint": "turbo lint",
|
||||
"i18n:scan": "turbo i18n:scan",
|
||||
"type-check": "turbo type-check",
|
||||
"prettier": "prettier --write .",
|
||||
"format": "prettier --write .",
|
||||
"release": "./scripts/create-release.sh",
|
||||
"sherif": "npx sherif@latest",
|
||||
"sherif:fix": "npx sherif@latest --fix"
|
||||
|
@ -44,8 +44,8 @@
|
|||
"framer-motion": "^10.16.4",
|
||||
"next": "^14.2.13",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prettier": "^3.2.4",
|
||||
"prettier-plugin-tailwindcss": "^0.5.11",
|
||||
"prettier": "^3.3.3",
|
||||
"prettier-plugin-tailwindcss": "^0.6.8",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"tailwindcss": "^3.4.4",
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
/** @type {import("eslint").Linter.Config} */
|
||||
module.exports = {
|
||||
...require("@rallly/eslint-config")(__dirname),
|
||||
};
|
||||
module.exports = require("@rallly/eslint-config/preset")(__dirname);
|
||||
|
|
|
@ -10,12 +10,16 @@
|
|||
},
|
||||
"scripts": {
|
||||
"normalize-subscription-metadata": "dotenv -e ../../.env -- tsx ./src/scripts/normalize-metadata.ts",
|
||||
"type-check": "tsc --pretty --noEmit"
|
||||
"type-check": "tsc --pretty --noEmit",
|
||||
"lint": "eslint ./src"
|
||||
},
|
||||
"dependencies": {
|
||||
"@radix-ui/react-radio-group": "^1.2.0",
|
||||
"@rallly/ui": "*",
|
||||
"next": "*",
|
||||
"stripe": "^13.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rallly/eslint-config": "*"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"extends": "@rallly/tsconfig/next.json",
|
||||
"include": ["**/*.ts", "**/*.tsx", "**/*.js"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"extends": "@rallly/tsconfig/next.json",
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
/** @type {import("eslint").Linter.Config} */
|
||||
module.exports = {
|
||||
...require("@rallly/eslint-config/preset")(__dirname),
|
||||
};
|
||||
module.exports = require("@rallly/eslint-config/preset")(__dirname);
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import type {
|
||||
LinkProps,
|
||||
SectionProps,
|
||||
TextProps} from "@react-email/components";
|
||||
TextProps,
|
||||
} from "@react-email/components";
|
||||
import {
|
||||
Button as UnstyledButton,
|
||||
Heading as UnstyledHeading,
|
||||
Link as UnstyledLink,
|
||||
Section as UnstyledSection,
|
||||
Text as UnstyledText
|
||||
Text as UnstyledText,
|
||||
} from "@react-email/components";
|
||||
|
||||
import type { EmailContext } from "../types";
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import { Trans } from "react-i18next/TransWithoutContext";
|
||||
|
||||
import type {
|
||||
NotificationBaseProps,
|
||||
} from "../components/notification-email";
|
||||
import type { NotificationBaseProps } from "../components/notification-email";
|
||||
import NotificationEmail from "../components/notification-email";
|
||||
import { Heading, Text } from "../components/styled-components";
|
||||
import type { EmailContext } from "../types";
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"strictNullChecks": true,
|
||||
"resolveJsonModule": true,
|
||||
"resolveJsonModule": true
|
||||
},
|
||||
"files": ["i18next.d.ts"],
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules", ".react-email"],
|
||||
"exclude": ["node_modules", ".react-email"]
|
||||
}
|
||||
|
|
8
packages/eslint-config/.eslintrc.js
Normal file
8
packages/eslint-config/.eslintrc.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
/** @type {import("eslint").Linter.Config} */
|
||||
module.exports = {
|
||||
root: true,
|
||||
extends: ["turbo"],
|
||||
env: {
|
||||
node: true,
|
||||
},
|
||||
};
|
|
@ -18,7 +18,7 @@ module.exports = function (workspaceDirPath) {
|
|||
},
|
||||
parserOptions: {
|
||||
tsconfigRootDir: workspaceDirPath,
|
||||
project: `${workspaceDirPath}/tsconfig.json`,
|
||||
project: workspaceDirPath + "/tsconfig.json",
|
||||
},
|
||||
overrides: [
|
||||
{
|
||||
|
@ -28,6 +28,14 @@ module.exports = function (workspaceDirPath) {
|
|||
extends: ["plugin:@typescript-eslint/recommended"],
|
||||
rules: {
|
||||
"@typescript-eslint/no-unused-vars": "error",
|
||||
"@typescript-eslint/consistent-type-imports": [
|
||||
"error",
|
||||
{
|
||||
prefer: "type-imports",
|
||||
fixStyle: "separate-type-imports",
|
||||
disallowTypeAnnotations: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
|
@ -39,7 +47,6 @@ module.exports = function (workspaceDirPath) {
|
|||
"import/no-duplicates": "error",
|
||||
"no-console": ["error", { allow: ["warn", "error", "info"] }],
|
||||
"no-unused-vars": "error",
|
||||
"@typescript-eslint/consistent-type-imports": "error",
|
||||
},
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"extends": "@rallly/tsconfig/next.json",
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"extends": "@rallly/tsconfig/base.json",
|
||||
"include": ["**/*.ts"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
"./client": "./src/client/index.ts",
|
||||
"./next/middleware": "./src/next/middleware.ts"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint ./src",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"dependencies": {
|
||||
"posthog-js": "^1.178.0",
|
||||
"posthog-node": "^4.2.1"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { NextResponse } from "next/server";
|
||||
import type { NextResponse } from "next/server";
|
||||
|
||||
import { POSTHOG_BOOTSTAP_DATA_COOKIE_NAME } from "../constants";
|
||||
|
||||
const posthogApiKey = process.env.NEXT_PUBLIC_POSTHOG_API_KEY;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"extends": "@rallly/tsconfig/next.json",
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
|
@ -81,4 +81,4 @@ const AvatarFallback = React.forwardRef<
|
|||
});
|
||||
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
||||
|
||||
export { Avatar, AvatarFallback,AvatarImage };
|
||||
export { Avatar, AvatarFallback, AvatarImage };
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
import { Slot } from "@radix-ui/react-slot";
|
||||
import type {VariantProps } from "class-variance-authority";
|
||||
import type { VariantProps } from "class-variance-authority";
|
||||
import { cva } from "class-variance-authority";
|
||||
import * as React from "react";
|
||||
|
||||
import type { ComponentPropsWithout, RemovedProps } from "./helpers/component-props";
|
||||
import type {
|
||||
ComponentPropsWithout,
|
||||
RemovedProps,
|
||||
} from "./helpers/component-props";
|
||||
import { cn } from "./lib/utils";
|
||||
|
||||
type FlexElement = React.ElementRef<"div">;
|
||||
|
|
|
@ -1,15 +1,8 @@
|
|||
import type * as LabelPrimitive from "@radix-ui/react-label";
|
||||
import { Slot } from "@radix-ui/react-slot";
|
||||
import * as React from "react";
|
||||
import type {
|
||||
ControllerProps,
|
||||
FieldPath,
|
||||
FieldValues} from "react-hook-form";
|
||||
import {
|
||||
Controller,
|
||||
FormProvider,
|
||||
useFormContext,
|
||||
} from "react-hook-form";
|
||||
import type { ControllerProps, FieldPath, FieldValues } from "react-hook-form";
|
||||
import { Controller, FormProvider, useFormContext } from "react-hook-form";
|
||||
|
||||
import { Label } from "./label";
|
||||
import { cn } from "./lib/utils";
|
||||
|
|
|
@ -186,4 +186,4 @@ function useToast() {
|
|||
};
|
||||
}
|
||||
|
||||
export { toast,useToast };
|
||||
export { toast, useToast };
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
"use client";
|
||||
import { Slot } from "@radix-ui/react-slot";
|
||||
import type {VariantProps } from "class-variance-authority";
|
||||
import type { VariantProps } from "class-variance-authority";
|
||||
import { cva } from "class-variance-authority";
|
||||
|
||||
import { cn } from "./lib/utils";
|
||||
|
|
|
@ -11,7 +11,7 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
|
|||
className={cn(
|
||||
"border-input placeholder:text-muted-foreground flex min-h-[80px] rounded-md border bg-white px-2 py-2 text-sm disabled:cursor-not-allowed disabled:opacity-50",
|
||||
"focus-visible:ring-offset-input-background focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-offset-1",
|
||||
"focus-visible:border-primary-400 focus-visible:ring-primary-100",
|
||||
"focus-visible:border-primary-400 focus-visible:ring-primary-100",
|
||||
className,
|
||||
)}
|
||||
ref={ref}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import * as ToastPrimitives from "@radix-ui/react-toast";
|
||||
import { type VariantProps,cva } from "class-variance-authority";
|
||||
import type { VariantProps } from "class-variance-authority";
|
||||
import { cva } from "class-variance-authority";
|
||||
import { X } from "lucide-react";
|
||||
import * as React from "react";
|
||||
|
||||
|
|
|
@ -5,9 +5,9 @@
|
|||
"paths": {
|
||||
"@/utils": ["src/lib/utils.ts"],
|
||||
"@/components/*": ["src/*"],
|
||||
"@/ui/*": ["src/*"],
|
||||
},
|
||||
"@/ui/*": ["src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"exclude": ["node_modules"],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
|
|
2
packages/utils/.eslintrc.js
Normal file
2
packages/utils/.eslintrc.js
Normal file
|
@ -0,0 +1,2 @@
|
|||
/** @type {import("eslint").Linter.Config} */
|
||||
module.exports = require("@rallly/eslint-config/preset")(__dirname);
|
|
@ -1,10 +1,11 @@
|
|||
{
|
||||
"name": "@rallly/utils",
|
||||
"type": "module",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"test:unit": "vitest run"
|
||||
"test:unit": "vitest run",
|
||||
"lint": "eslint ./src",
|
||||
"type-check": "tsc --noEmit"
|
||||
},
|
||||
"exports": {
|
||||
"./*": "./src/*.ts"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"compilerOptions": {
|
||||
"types": ["vitest/globals"],
|
||||
"types": ["vitest/globals"]
|
||||
},
|
||||
"extends": "@rallly/tsconfig/base.json",
|
||||
"include": ["**/*.ts", "**/*.tsx"],
|
||||
"include": ["**/*.ts", "**/*.tsx"]
|
||||
}
|
||||
|
|
|
@ -57,6 +57,9 @@
|
|||
"i18n:scan": {
|
||||
"inputs": ["src/**", "i18next-scanner.config.js"],
|
||||
"outputs": ["public/locales/**"]
|
||||
},
|
||||
"format": {
|
||||
"cache": false
|
||||
}
|
||||
},
|
||||
"globalEnv": [
|
||||
|
|
16
yarn.lock
16
yarn.lock
|
@ -12770,15 +12770,15 @@ prelude-ls@^1.2.1:
|
|||
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
|
||||
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
|
||||
|
||||
prettier-plugin-tailwindcss@^0.5.11:
|
||||
version "0.5.11"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.11.tgz#1aa9308c3285b3cb7942aaeaec8d0e0775ac54d0"
|
||||
integrity sha512-AvI/DNyMctyyxGOjyePgi/gqj5hJYClZ1avtQvLlqMT3uDZkRbi4HhGUpok3DRzv9z7Lti85Kdj3s3/1CeNI0w==
|
||||
prettier-plugin-tailwindcss@^0.6.8:
|
||||
version "0.6.8"
|
||||
resolved "https://registry.yarnpkg.com/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.8.tgz#8a178e1679e3f941cc9de396f109c6cffea676d8"
|
||||
integrity sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==
|
||||
|
||||
prettier@^3.2.4:
|
||||
version "3.2.4"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283"
|
||||
integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==
|
||||
prettier@^3.3.3:
|
||||
version "3.3.3"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
|
||||
integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
|
||||
|
||||
pretty-format@^3.8.0:
|
||||
version "3.8.0"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue