@yosr-ai/template-next-fullstack 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +15 -2
- package/features/api-trpc/files/src/app/api/trpc/[trpc]/route.ts +15 -0
- package/features/api-trpc/files/src/app/trpc-provider.tsx +27 -0
- package/features/api-trpc/files/src/features/notes/components/note-form.tsx +48 -0
- package/features/api-trpc/files/src/server/api/context.ts +10 -0
- package/features/api-trpc/files/src/server/api/notes.test.ts +30 -0
- package/features/api-trpc/files/src/server/api/notes.ts +42 -0
- package/features/api-trpc/files/src/server/api/root.ts +8 -0
- package/features/api-trpc/files/src/server/api/trpc.ts +8 -0
- package/features/api-trpc/snippets/providers-imports.tsx +2 -0
- package/features/api-trpc/snippets/providers.tsx +1 -0
- package/features/auth-authjs/files/e2e/sign-in.spec.ts +10 -0
- package/features/auth-authjs/files/src/app/api/auth/[...nextauth]/route.ts +12 -0
- package/features/auth-authjs/files/src/app/auth-session-provider.tsx +8 -0
- package/features/auth-authjs/files/src/app/sign-in/page.tsx +19 -0
- package/features/auth-authjs/files/src/server/auth/config.ts +28 -0
- package/features/auth-authjs/files/src/server/auth/index.ts +15 -0
- package/features/auth-authjs/snippets/providers-imports.tsx +2 -0
- package/features/auth-authjs/snippets/providers.tsx +1 -0
- package/features/auth-authjs-drizzle/files/src/server/db/auth-tables.ts +86 -0
- package/features/auth-authjs-drizzle/snippets/adapter-db-imports.ts +8 -0
- package/features/auth-authjs-drizzle/snippets/adapter-imports.ts +1 -0
- package/features/auth-authjs-drizzle/snippets/adapter.ts +7 -0
- package/features/auth-authjs-drizzle/snippets/auth-tables.ts +7 -0
- package/features/auth-authjs-prisma/snippets/adapter-db-imports.ts +1 -0
- package/features/auth-authjs-prisma/snippets/adapter-imports.ts +1 -0
- package/features/auth-authjs-prisma/snippets/adapter.ts +1 -0
- package/features/auth-authjs-prisma/snippets/auth-models.prisma +58 -0
- package/features/auth-clerk/files/e2e/sign-in.spec.ts +15 -0
- package/features/auth-clerk/files/src/app/clerk-app-provider.tsx +13 -0
- package/features/auth-clerk/files/src/app/sign-in/[[...sign-in]]/page.tsx +18 -0
- package/features/auth-clerk/files/src/app/sign-up/[[...sign-up]]/page.tsx +18 -0
- package/features/auth-clerk/files/src/proxy.ts +24 -0
- package/features/auth-clerk/files/src/server/auth/index.ts +11 -0
- package/features/auth-clerk/snippets/providers-imports.tsx +2 -0
- package/features/auth-clerk/snippets/providers.tsx +1 -0
- package/features/deploy-docker/files/.dockerignore +6 -0
- package/features/deploy-docker/files/Dockerfile +24 -0
- package/features/deploy-docker/files/compose.yaml +6 -0
- package/features/deploy-docker-npm/files/Dockerfile +24 -0
- package/features/deploy-docker-postgres/snippets/postgres-service.yaml +4 -0
- package/features/deploy-vercel/snippets/readme-deploy.md +3 -0
- package/features/orm-drizzle/files/drizzle.config.ts +8 -0
- package/features/orm-drizzle/files/src/features/notes/notes-store.ts +21 -0
- package/features/orm-drizzle/files/src/server/db/index.ts +20 -0
- package/features/orm-drizzle/files/src/server/db/schema.ts +11 -0
- package/features/orm-drizzle/snippets/ci-e2e-setup.yaml +1 -0
- package/features/orm-drizzle/snippets/ci-job.yaml +11 -0
- package/features/orm-drizzle/snippets/readme-db.md +4 -0
- package/features/orm-prisma/files/prisma/schema.prisma +18 -0
- package/features/orm-prisma/files/prisma.config.ts +13 -0
- package/features/orm-prisma/files/src/features/notes/notes-store.ts +13 -0
- package/features/orm-prisma/files/src/server/db/index.ts +20 -0
- package/features/orm-prisma/snippets/ci-e2e-setup.yaml +1 -0
- package/features/orm-prisma/snippets/ci-job.yaml +11 -0
- package/features/orm-prisma/snippets/readme-db.md +4 -0
- package/features/payments-stripe/files/src/app/api/checkout/route.ts +27 -0
- package/features/payments-stripe/files/src/app/api/webhooks/stripe/route.ts +18 -0
- package/features/payments-stripe/files/src/server/billing/billing.test.ts +113 -0
- package/features/payments-stripe/files/src/server/billing/index.ts +102 -0
- package/features/payments-stripe/files/src/server/billing/stripe.ts +10 -0
- package/features/payments-stripe-drizzle/files/src/server/billing/store.ts +39 -0
- package/features/payments-stripe-drizzle/snippets/billing-tables.ts +13 -0
- package/features/payments-stripe-prisma/files/src/server/billing/store.ts +30 -0
- package/features/payments-stripe-prisma/snippets/billing-models.prisma +17 -0
- package/files/.env.example +1 -0
- package/files/.github/workflows/ci.yml +25 -0
- package/files/.prettierignore +7 -0
- package/files/.prettierrc.json +1 -0
- package/files/README.md +18 -0
- package/files/components.json +20 -0
- package/files/e2e/smoke.spec.ts +16 -0
- package/files/eslint.config.mjs +21 -0
- package/files/gitignore +25 -0
- package/files/next.config.ts +7 -0
- package/files/package.json +42 -0
- package/files/playwright.config.ts +20 -0
- package/files/pnpm-workspace.yaml +16 -0
- package/files/postcss.config.mjs +7 -0
- package/files/src/app/globals.css +68 -0
- package/files/src/app/layout.tsx +22 -0
- package/files/src/app/page.tsx +21 -0
- package/files/src/app/providers.tsx +15 -0
- package/files/src/components/ui/button.tsx +59 -0
- package/files/src/components/ui/input.tsx +21 -0
- package/files/src/features/notes/actions.ts +22 -0
- package/files/src/features/notes/components/note-form.tsx +32 -0
- package/files/src/features/notes/components/note-list.tsx +23 -0
- package/files/src/features/notes/create-note.test.ts +27 -0
- package/files/src/features/notes/create-note.ts +23 -0
- package/files/src/features/notes/note-schema.ts +13 -0
- package/files/src/features/notes/notes-store.ts +17 -0
- package/files/src/shared/utils.test.ts +13 -0
- package/files/src/shared/utils.ts +6 -0
- package/files/tsconfig.json +35 -0
- package/files/vitest.config.mts +9 -0
- package/package.json +26 -4
- package/rules/api-server-actions.md +1 -0
- package/rules/api-trpc.md +1 -0
- package/rules/architecture.md +11 -0
- package/rules/auth-authjs.md +1 -0
- package/rules/auth-clerk.md +1 -0
- package/rules/commands.md +5 -0
- package/rules/data-drizzle.md +1 -0
- package/rules/data-none.md +1 -0
- package/rules/data-prisma.md +1 -0
- package/rules/data-server-first.md +1 -0
- package/rules/errors-result.md +1 -0
- package/rules/errors-throw.md +1 -0
- package/rules/forms-zod.md +1 -0
- package/rules/layout-feature.md +5 -0
- package/rules/layout-flat.md +5 -0
- package/rules/layout-layer.md +6 -0
- package/rules/payments-stripe.md +1 -0
- package/rules/project-overview.md +5 -0
- package/rules/tests-colocated.md +1 -0
- package/rules/tests-folder.md +1 -0
- package/rules/tests-separate.md +1 -0
- package/rules/ui-shadcn.md +1 -0
- package/seed.template.json +1714 -0
- package/style/errors-result/files/src/features/notes/actions.ts +18 -0
- package/style/errors-result/files/src/features/notes/create-note.test.ts +30 -0
- package/style/errors-result/files/src/features/notes/create-note.ts +16 -0
- package/style/errors-result/files/src/shared/result.ts +12 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { revalidatePath } from "next/cache";
|
|
4
|
+
|
|
5
|
+
import { createNote } from "./create-note";
|
|
6
|
+
|
|
7
|
+
/** Server action for the note form. Returns an error message or null. */
|
|
8
|
+
export async function createNoteAction(
|
|
9
|
+
_previous: string | null,
|
|
10
|
+
formData: FormData,
|
|
11
|
+
): Promise<string | null> {
|
|
12
|
+
const result = await createNote({ title: formData.get("title") });
|
|
13
|
+
if (!result.ok) {
|
|
14
|
+
return result.error;
|
|
15
|
+
}
|
|
16
|
+
revalidatePath("/");
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { createNote } from "@domain/notes/create-note";
|
|
4
|
+
|
|
5
|
+
describe("createNote", () => {
|
|
6
|
+
it("stores a trimmed, valid note", async () => {
|
|
7
|
+
const insert = vi.fn(async (input: { title: string }) => ({
|
|
8
|
+
id: "1",
|
|
9
|
+
title: input.title,
|
|
10
|
+
createdAt: new Date(0),
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
const result = await createNote({ title: " Buy milk " }, insert);
|
|
14
|
+
|
|
15
|
+
expect(insert).toHaveBeenCalledWith({ title: "Buy milk" });
|
|
16
|
+
expect(result).toEqual({
|
|
17
|
+
ok: true,
|
|
18
|
+
value: { id: "1", title: "Buy milk", createdAt: new Date(0) },
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("returns an error for an empty title", async () => {
|
|
23
|
+
const insert = vi.fn();
|
|
24
|
+
|
|
25
|
+
const result = await createNote({ title: " " }, insert);
|
|
26
|
+
|
|
27
|
+
expect(result.ok).toBe(false);
|
|
28
|
+
expect(insert).not.toHaveBeenCalled();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { err, ok, type Result } from "@shared/result";
|
|
2
|
+
|
|
3
|
+
import { type Note, noteInputSchema } from "./note-schema";
|
|
4
|
+
import { insertNote } from "./notes-store";
|
|
5
|
+
|
|
6
|
+
/** Validates input and stores a note. Returns an error Result on bad input. */
|
|
7
|
+
export async function createNote(
|
|
8
|
+
input: unknown,
|
|
9
|
+
insert: typeof insertNote = insertNote,
|
|
10
|
+
): Promise<Result<Note>> {
|
|
11
|
+
const parsed = noteInputSchema.safeParse(input);
|
|
12
|
+
if (!parsed.success) {
|
|
13
|
+
return err(parsed.error.issues[0]?.message ?? "Invalid note");
|
|
14
|
+
}
|
|
15
|
+
return ok(await insert(parsed.data));
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Expected failures are returned, not thrown. Unexpected ones still throw. */
|
|
2
|
+
export type Result<T, E = string> =
|
|
3
|
+
| { ok: true; value: T }
|
|
4
|
+
| { ok: false; error: E };
|
|
5
|
+
|
|
6
|
+
export function ok<T>(value: T): Result<T, never> {
|
|
7
|
+
return { ok: true, value };
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function err<E>(error: E): Result<never, E> {
|
|
11
|
+
return { ok: false, error };
|
|
12
|
+
}
|