Skip to content
Draft
Show file tree
Hide file tree
Changes from all 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
8 changes: 3 additions & 5 deletions .env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,11 @@ DATABASE_URL=postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@${DATABASE_HOST}
GOOGLE_CLIENT_ID=xxxx
GOOGLE_CLIENT_SECRET=xxxx

# NextAuth.js
NEXTAUTH_URL=${NEXT_PUBLIC_SITE_URL}
# https://next-auth.js.org/configuration/options#secret
# Better Auth
BETTER_AUTH_URL=${NEXT_PUBLIC_SITE_URL}
# you must generate a new secret
# error: "ikm" must be at least one byte in length'
# $ openssl rand -base64 32
NEXTAUTH_SECRET=TKDdLVjf7cTyTs5oWVpv04senu6fia4RGQbYHRQIR5Q=
BETTER_AUTH_SECRET=TKDdLVjf7cTyTs5oWVpv04senu6fia4RGQbYHRQIR5Q=

# start: otel #
# OpenTelemetry
Expand Down
5 changes: 3 additions & 2 deletions .env.test
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
GOOGLE_CLIENT_ID=dummy
GOOGLE_CLIENT_SECRET=dummy

# NextAuth.js
NEXTAUTH_TEST_MODE=true
# Better Auth
BETTER_AUTH_URL=http://localhost:3000
BETTER_AUTH_SECRET=test_secret_key_for_testing_only

# start: stripe #
# Stripe
Expand Down
6 changes: 4 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ jobs:
--build-arg GOOGLE_CLIENT_ID=${{env.GOOGLE_CLIENT_ID}} \
--build-arg GOOGLE_CLIENT_SECRET=${{env.GOOGLE_CLIENT_SECRET}} \
--build-arg NEXT_PUBLIC_SITE_URL=${{env.NEXT_PUBLIC_SITE_URL}} \
--build-arg NEXTAUTH_SECRET=${{env.NEXTAUTH_SECRET}} \
--build-arg BETTER_AUTH_SECRET=${{env.BETTER_AUTH_SECRET}} \
--build-arg BETTER_AUTH_URL=${{env.BETTER_AUTH_URL}} \
--build-arg TRACE_EXPORTER_URL=${{env.TRACE_EXPORTER_URL}} \
--build-arg STRIPE_PRICE_ID=${{env.STRIPE_PRICE_ID}} \
--build-arg STRIPE_SECRET_KEY=${{env.STRIPE_SECRET_KEY}} \
Expand All @@ -84,7 +85,8 @@ jobs:
DATABASE_HOST: host.docker.internal
DATABASE_PORT: 5432
DATABASE_SCHEMA: public
NEXTAUTH_SECRET: TKDdLVjf7cTyTs5oWVpv04senu6fia4RGQbYHRQIR5Q=
BETTER_AUTH_SECRET: TKDdLVjf7cTyTs5oWVpv04senu6fia4RGQbYHRQIR5Q=
BETTER_AUTH_URL: http://localhost:3000
GOOGLE_CLIENT_ID: dummy
GOOGLE_CLIENT_SECRET: dummy
# start: otel #
Expand Down
7 changes: 4 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ ARG DATABASE_SCHEMA=''
ARG GOOGLE_CLIENT_ID=''
ARG GOOGLE_CLIENT_SECRET=''
ARG NEXT_PUBLIC_SITE_URL=''
ARG NEXTAUTH_SECRET=''
ARG BETTER_AUTH_SECRET=''
ARG BETTER_AUTH_URL=''
# start: otel #
ARG TRACE_EXPORTER_URL=''
# end: otel #
Expand All @@ -30,8 +31,8 @@ ENV DATABASE_SCHEMA=$DATABASE_SCHEMA
ENV GOOGLE_CLIENT_ID=$GOOGLE_CLIENT_ID
ENV GOOGLE_CLIENT_SECRET=$GOOGLE_CLIENT_SECRET
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL
ENV NEXTAUTH_SECRET=$NEXTAUTH_SECRET
ENV NEXTAUTH_URL=$NEXT_PUBLIC_SITE_URL
ENV BETTER_AUTH_SECRET=$BETTER_AUTH_SECRET
ENV BETTER_AUTH_URL=$BETTER_AUTH_URL
# start: otel #
ENV TRACE_EXPORTER_URL=$TRACE_EXPORTER_URL
# end: otel #
Expand Down
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@

Installing this template automatically sets up the following libraries/tools. By saving you significant effort, it allows you to focus entirely on writing your product code.🤗

| | | | | |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **App** | <div align="center"><img src=".internal/site/src/public/images/libs/nextjs.png" alt="nextjs" width="44"><br>Next.js</div> | <div align="center"><img src=".internal/site/src/public/images/libs/tailwind.png" alt="tailwind" width="44"><br>Tailwind CSS</div> | <div align="center"><img src=".internal/site/src/public/images/libs/next-auth.png" alt="next-auth" width="44"><br>NextAuth.js</div> | <div align="center"><img src=".internal/site/src/public/images/libs/react-hook-form.png" alt="react-hook-form" width="44"><br>React Hook Form</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/zod.svg" alt="zod" width="44"><br>Zod </div> | <div align="center"><img src=".internal/site/src/public/images/libs/otel.png" alt="otel" width="44"><br>OpenTelemetry</div> | <div align="center"><img src=".internal/site/src/public/images/libs/prisma.png" alt="prisma" width="44"><br>Prisma</div> | <div align="center"><img src=".internal/site/src/public/images/libs/postgresql.png" alt="postgresql" width="44"><br>PostgreSQL</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/stripe.png" alt="stripe" width="44"><br>Stripe</div> | | |
| | | | |
| **Tools** | <div align="center"><img src=".internal/site/src/public/images/libs/typescript.png" alt="typescirpt" width="44"><br>TypeScript</div> | <div align="center"><img src=".internal/site/src/public/images/libs/pnpm.svg" alt="pnpm" width="44"><br>pnpm</div> | <div align="center"><img src=".internal/site/src/public/images/libs/biome.png" alt="biome" width="44"><br>Biome </div> | <div align="center"><img src=".internal/site/src/public/images/libs/prettier.png" alt="prettier" width="44"><br> Prettier</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/knip.png" alt="knip" width="44"><br>Knip</div> | <div align="center"><img src=".internal/site/src/public/images/libs/editorconfig.png" alt="editorconfig" width="44"><br> EditorConfig </div> | <div align="center"><img src=".internal/site/src/public/images/libs/lefthook.png" alt="lefthook" width="44"><br> lefthook</div> | <div align="center"><img src=".internal/site/src/public/images/libs/docker.png" alt="docker" width="44"><br> Docker </div> |
| | | | |
| **Testing** | <div align="center"><img src=".internal/site/src/public/images/libs/vitest.png" alt="vitest" width="44"><br> Vitest</div> | <div align="center"><img src=".internal/site/src/public/images/libs/testing-library.png" alt="testing-library" width="44"><br> Testing Library</div> | <div align="center"><img src=".internal/site/src/public/images/libs/playwright.png" alt="playwright" width="44"><br> Playwright</div> | <div align="center"><img src=".internal/site/src/public/images/libs/testcontainers.png" alt="testcontainers" width="44"><br> Testcontainers</div> |
| | | | | |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **App** | <div align="center"><img src=".internal/site/src/public/images/libs/nextjs.png" alt="nextjs" width="44"><br>Next.js</div> | <div align="center"><img src=".internal/site/src/public/images/libs/tailwind.png" alt="tailwind" width="44"><br>Tailwind CSS</div> | <div align="center"><img src=".internal/site/src/public/images/libs/better-auth.png" alt="better-auth" width="44"><br>Better Auth</div> | <div align="center"><img src=".internal/site/src/public/images/libs/react-hook-form.png" alt="react-hook-form" width="44"><br>React Hook Form</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/zod.svg" alt="zod" width="44"><br>Zod </div> | <div align="center"><img src=".internal/site/src/public/images/libs/otel.png" alt="otel" width="44"><br>OpenTelemetry</div> | <div align="center"><img src=".internal/site/src/public/images/libs/prisma.png" alt="prisma" width="44"><br>Prisma</div> | <div align="center"><img src=".internal/site/src/public/images/libs/postgresql.png" alt="postgresql" width="44"><br>PostgreSQL</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/stripe.png" alt="stripe" width="44"><br>Stripe</div> | | |
| | | | |
| **Tools** | <div align="center"><img src=".internal/site/src/public/images/libs/typescript.png" alt="typescirpt" width="44"><br>TypeScript</div> | <div align="center"><img src=".internal/site/src/public/images/libs/pnpm.svg" alt="pnpm" width="44"><br>pnpm</div> | <div align="center"><img src=".internal/site/src/public/images/libs/biome.png" alt="biome" width="44"><br>Biome </div> | <div align="center"><img src=".internal/site/src/public/images/libs/prettier.png" alt="prettier" width="44"><br> Prettier</div> |
| | <div align="center"><img src=".internal/site/src/public/images/libs/knip.png" alt="knip" width="44"><br>Knip</div> | <div align="center"><img src=".internal/site/src/public/images/libs/editorconfig.png" alt="editorconfig" width="44"><br> EditorConfig </div> | <div align="center"><img src=".internal/site/src/public/images/libs/lefthook.png" alt="lefthook" width="44"><br> lefthook</div> | <div align="center"><img src=".internal/site/src/public/images/libs/docker.png" alt="docker" width="44"><br> Docker </div> |
| | | | |
| **Testing** | <div align="center"><img src=".internal/site/src/public/images/libs/vitest.png" alt="vitest" width="44"><br> Vitest</div> | <div align="center"><img src=".internal/site/src/public/images/libs/testing-library.png" alt="testing-library" width="44"><br> Testing Library</div> | <div align="center"><img src=".internal/site/src/public/images/libs/playwright.png" alt="playwright" width="44"><br> Playwright</div> | <div align="center"><img src=".internal/site/src/public/images/libs/testcontainers.png" alt="testcontainers" width="44"><br> Testcontainers</div> |
| | | |
| **Others** | <div align="center"><img src=".internal/site/src/public/images/libs/github-actions.png" alt="actions" width="44"><br> GitHub Actions</div> | <div align="center"><img src=".internal/site/src/public/images/libs/renovate.png" alt="renovate" width="44"><br> Renovate</div> | <div align="center"><img src=".internal/site/src/public/images/libs/vscode.png" alt="vscode" width="44"><br> VSCode</div> |
| **Others** | <div align="center"><img src=".internal/site/src/public/images/libs/github-actions.png" alt="actions" width="44"><br> GitHub Actions</div> | <div align="center"><img src=".internal/site/src/public/images/libs/renovate.png" alt="renovate" width="44"><br> Renovate</div> | <div align="center"><img src=".internal/site/src/public/images/libs/vscode.png" alt="vscode" width="44"><br> VSCode</div> |

Please read the features provided by this template first! 👉
[Challenges Solved](https://hiroppy.github.io/web-app-template/introduction/challenges-solved.html)
Expand Down
10 changes: 4 additions & 6 deletions e2e/dummyUsers.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
import type { User } from "next-auth";
import type { User } from "../src/app/_clients/betterAuth";

type RemoveNullish<T> = {
[K in keyof T]-?: NonNullable<T[K]>;
};

type NonNullableUser = RemoveNullish<User>;
type NonNullableUser = Required<
Pick<User, "id" | "name" | "email" | "image" | "role">
>;

export const user1: NonNullableUser = {
id: "id1",
Expand Down
14 changes: 9 additions & 5 deletions e2e/fixtures.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import AxeBuilder from "@axe-core/playwright";
import { test as base } from "@playwright/test";
import type { User } from "next-auth";
import type { User } from "../src/app/_clients/betterAuth";
import { setupDB } from "../tests/db.setup";
import { setupApp } from "./helpers/app";
import { registerUserToDB } from "./helpers/users";
Expand All @@ -21,7 +21,9 @@ export type TestFixtures = {
signInPage: SignInPage;
notFoundPage: NotFoundPage;
storageState: string;
registerToDB: (user: User) => Promise<void>;
registerToDB: (
user: Pick<User, "id" | "name" | "email" | "image" | "role">,
) => Promise<void>;
reset: () => Promise<void>;
a11y: () => AxeBuilder;
};
Expand Down Expand Up @@ -82,9 +84,11 @@ export const test = base.extend<TestFixtures, WorkerFixtures>({
},
],
registerToDB: async ({ reset, setup }, use) => {
await use(async (user: User) => {
await registerUserToDB(user, setup.dbURL);
});
await use(
async (user: Pick<User, "id" | "name" | "email" | "image" | "role">) => {
await registerUserToDB(user, setup.dbURL);
},
);
await reset();
},
reset: ({ context, setup }, use) => {
Expand Down
2 changes: 1 addition & 1 deletion e2e/helpers/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export async function setupApp(dbPort: number) {
const appPort = await getRandomPort();
const baseURL = `http://localhost:${appPort}`;
const cp = exec(
`NEXTAUTH_URL=${baseURL} DATABASE_PORT=${dbPort} pnpm start --port ${appPort}`,
`BETTER_AUTH_URL=${baseURL} DATABASE_PORT=${dbPort} pnpm start --port ${appPort}`,
);
await waitForHealth(baseURL);

Expand Down
Loading
Loading