@alfredmouelle/create-stack 0.1.0 → 0.1.2
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/README.md +101 -40
- package/_stack/apps/next-base/.turbo/turbo-typecheck.log +1 -0
- package/_stack/apps/next-base/.vscode/settings.json +35 -0
- package/_stack/apps/next-base/.zed/settings.json +45 -0
- package/_stack/apps/next-base/src/components/ui/spinner.tsx +1 -1
- package/_stack/apps/next-base/src/emails/components/components.tsx +4 -2
- package/_stack/apps/next-base/src/emails/components/context.tsx +3 -1
- package/_stack/apps/next-base/src/emails/components/theme.ts +6 -7
- package/_stack/apps/next-base/src/env.ts +2 -3
- package/_stack/apps/next-base/src/lib/date.ts +1 -1
- package/_stack/apps/next-base/src/server/auth/guards.ts +1 -1
- package/_stack/apps/next-base/src/server/better-auth/config.ts +1 -1
- package/_stack/apps/next-base/src/server/better-auth/server.ts +2 -2
- package/_stack/apps/next-base/src/server/db/schemas/index.ts +1 -1
- package/_stack/apps/next-base/src/server/db/seed.ts +2 -2
- package/_stack/apps/next-base/src/server/email/adapters/resend/index.ts +3 -3
- package/_stack/apps/next-base/src/server/email/core/address.ts +3 -3
- package/_stack/apps/next-base/src/server/email/core/port.ts +13 -20
- package/_stack/apps/next-base/src/server/email/core/render.ts +2 -2
- package/_stack/apps/next-base/src/server/email/factory.ts +7 -9
- package/_stack/apps/next-base/src/server/email/index.ts +1 -1
- package/_stack/apps/next-base/src/trpc/react.tsx +2 -2
- package/_stack/apps/next-base/src/trpc/server.ts +1 -1
- package/_stack/apps/tanstack-base/.turbo/turbo-typecheck.log +1 -0
- package/_stack/apps/tanstack-base/.vscode/settings.json +35 -0
- package/_stack/apps/tanstack-base/.zed/settings.json +45 -0
- package/_stack/apps/tanstack-base/src/components/form/text-field.tsx +1 -1
- package/_stack/apps/tanstack-base/src/components/ui/spinner.tsx +1 -1
- package/_stack/apps/tanstack-base/src/emails/components/components.tsx +2 -2
- package/_stack/apps/tanstack-base/src/emails/components/context.tsx +1 -1
- package/_stack/apps/tanstack-base/src/emails/components/theme.ts +6 -7
- package/_stack/apps/tanstack-base/src/env.ts +2 -6
- package/_stack/apps/tanstack-base/src/lib/date.ts +1 -1
- package/_stack/apps/tanstack-base/src/routes/__root.tsx +1 -1
- package/_stack/apps/tanstack-base/src/routes/_authed.tsx +1 -4
- package/_stack/apps/tanstack-base/src/routes/api/auth/$.ts +1 -1
- package/_stack/apps/tanstack-base/src/routes/api.trpc.$.tsx +1 -2
- package/_stack/apps/tanstack-base/src/server/better-auth/config.ts +1 -1
- package/_stack/apps/tanstack-base/src/server/better-auth/session.ts +12 -5
- package/_stack/apps/tanstack-base/src/server/db/schemas/index.ts +1 -1
- package/_stack/apps/tanstack-base/src/server/db/seed.ts +2 -2
- package/_stack/apps/tanstack-base/src/server/email/adapters/resend/index.ts +3 -3
- package/_stack/apps/tanstack-base/src/server/email/core/address.ts +3 -3
- package/_stack/apps/tanstack-base/src/server/email/core/port.ts +12 -22
- package/_stack/apps/tanstack-base/src/server/email/core/render.ts +1 -1
- package/_stack/apps/tanstack-base/src/server/email/factory.ts +7 -8
- package/_stack/apps/tanstack-base/src/server/email/index.ts +1 -1
- package/_stack/packages/mailer/src/adapters/brevo/index.ts +3 -3
- package/_stack/packages/mailer/src/adapters/resend/index.ts +3 -3
- package/_stack/packages/mailer/src/adapters/ses/config.ts +3 -3
- package/_stack/packages/mailer/src/adapters/ses/index.ts +4 -5
- package/index.mjs +33 -44
- package/lib/build.mjs +7 -15
- package/lib/env.mjs +5 -6
- package/lib/foundations.mjs +35 -0
- package/lib/identity.mjs +4 -5
- package/lib/mailer.mjs +9 -13
- package/lib/paths.mjs +15 -0
- package/lib/scaffold.mjs +65 -10
- package/lib/strip.mjs +9 -24
- package/lib/util.mjs +8 -9
- package/package.json +1 -1
- package/_stack/packages/analytics/capability.json +0 -26
- package/_stack/packages/cache/capability.json +0 -21
- package/_stack/packages/error-tracking/capability.json +0 -21
- package/_stack/packages/jobs/capability.json +0 -26
- package/_stack/packages/logger/capability.json +0 -21
- package/_stack/packages/mailer/capability.json +0 -28
- package/_stack/packages/storage/capability.json +0 -32
- package/_stack/patterns/README.md +0 -58
- package/_stack/patterns/_baseline/env.ts +0 -31
- package/_stack/patterns/_baseline/tsconfig.json +0 -27
- package/_stack/patterns/better-auth/pattern.json +0 -73
- package/_stack/patterns/better-auth-next/pattern.json +0 -76
- package/_stack/patterns/data-table/pattern.json +0 -43
- package/_stack/patterns/drizzle/pattern.json +0 -61
- package/_stack/patterns/trpc/pattern.json +0 -61
- package/_stack/patterns/trpc-next/pattern.json +0 -64
- package/lib/manifests.mjs +0 -61
- /package/{_stack/patterns/_baseline → templates}/README-author.md +0 -0
- /package/{_stack/patterns/_baseline → templates}/biome.jsonc +0 -0
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../capability.schema.json",
|
|
3
|
-
"name": "error-tracking",
|
|
4
|
-
"description": "Error reporting behind a swappable port. Capture exceptions, messages, breadcrumbs and user context, then ship them to a provider.",
|
|
5
|
-
"port": "src/core/port.ts",
|
|
6
|
-
"defaultAdapter": "sentry",
|
|
7
|
-
"adapters": {
|
|
8
|
-
"sentry": {
|
|
9
|
-
"deps": ["@sentry/node"],
|
|
10
|
-
"env": ["SENTRY_DSN", "SENTRY_ENVIRONMENT"],
|
|
11
|
-
"files": ["src/adapters/sentry"]
|
|
12
|
-
},
|
|
13
|
-
"console": {
|
|
14
|
-
"deps": [],
|
|
15
|
-
"env": [],
|
|
16
|
-
"files": ["src/adapters/console"]
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"sharedDeps": ["valibot"],
|
|
20
|
-
"sharedFiles": ["src/core", "src/index.ts"]
|
|
21
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../capability.schema.json",
|
|
3
|
-
"name": "jobs",
|
|
4
|
-
"description": "Background jobs / events behind a swappable port. Event-driven: define jobs against named events and trigger them; the adapter handles delivery and execution.",
|
|
5
|
-
"port": "src/core/port.ts",
|
|
6
|
-
"defaultAdapter": "inngest",
|
|
7
|
-
"adapters": {
|
|
8
|
-
"inngest": {
|
|
9
|
-
"deps": ["inngest"],
|
|
10
|
-
"env": ["INNGEST_EVENT_KEY", "INNGEST_SIGNING_KEY"],
|
|
11
|
-
"files": ["src/adapters/inngest"]
|
|
12
|
-
},
|
|
13
|
-
"trigger": {
|
|
14
|
-
"deps": ["@trigger.dev/sdk"],
|
|
15
|
-
"env": ["TRIGGER_SECRET_KEY"],
|
|
16
|
-
"files": ["src/adapters/trigger"]
|
|
17
|
-
},
|
|
18
|
-
"memory": {
|
|
19
|
-
"deps": [],
|
|
20
|
-
"env": [],
|
|
21
|
-
"files": ["src/adapters/memory"]
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"sharedDeps": ["valibot"],
|
|
25
|
-
"sharedFiles": ["src/core", "src/index.ts"]
|
|
26
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../capability.schema.json",
|
|
3
|
-
"name": "logger",
|
|
4
|
-
"description": "Structured logging behind a swappable port. Application code depends only on the Logger interface; pick an adapter (pino, console) at the composition root.",
|
|
5
|
-
"port": "src/core/port.ts",
|
|
6
|
-
"defaultAdapter": "pino",
|
|
7
|
-
"adapters": {
|
|
8
|
-
"pino": {
|
|
9
|
-
"deps": ["pino"],
|
|
10
|
-
"env": [],
|
|
11
|
-
"files": ["src/adapters/pino"]
|
|
12
|
-
},
|
|
13
|
-
"console": {
|
|
14
|
-
"deps": [],
|
|
15
|
-
"env": [],
|
|
16
|
-
"files": ["src/adapters/console"]
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
"sharedDeps": ["valibot"],
|
|
20
|
-
"sharedFiles": ["src/core", "src/index.ts"]
|
|
21
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../capability.schema.json",
|
|
3
|
-
"name": "mailer",
|
|
4
|
-
"description": "Transactional email. Bodies are always React Email components, rendered to HTML + plain text.",
|
|
5
|
-
"port": "src/core/port.ts",
|
|
6
|
-
"factory": "src/factory.ts",
|
|
7
|
-
"defaultAdapter": "resend",
|
|
8
|
-
"adapters": {
|
|
9
|
-
"resend": {
|
|
10
|
-
"deps": ["resend"],
|
|
11
|
-
"env": ["RESEND_API_KEY"],
|
|
12
|
-
"files": ["src/adapters/resend"]
|
|
13
|
-
},
|
|
14
|
-
"brevo": {
|
|
15
|
-
"deps": ["@getbrevo/brevo"],
|
|
16
|
-
"env": ["BREVO_API_KEY"],
|
|
17
|
-
"files": ["src/adapters/brevo"]
|
|
18
|
-
},
|
|
19
|
-
"ses": {
|
|
20
|
-
"deps": ["@aws-sdk/client-sesv2"],
|
|
21
|
-
"env": ["AWS_REGION", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
|
|
22
|
-
"files": ["src/adapters/ses"]
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
"sharedDeps": ["valibot", "@react-email/render"],
|
|
26
|
-
"peerDeps": ["react", "react-dom"],
|
|
27
|
-
"sharedFiles": ["src/core", "src/factory.ts", "src/index.ts"]
|
|
28
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../capability.schema.json",
|
|
3
|
-
"name": "storage",
|
|
4
|
-
"description": "Object storage behind a swappable port: put/get/delete/exists plus signed URLs. Adapters for S3, Cloudflare R2, Google Cloud Storage and the local filesystem.",
|
|
5
|
-
"port": "src/core/port.ts",
|
|
6
|
-
"factory": "src/index.ts",
|
|
7
|
-
"defaultAdapter": "s3",
|
|
8
|
-
"adapters": {
|
|
9
|
-
"s3": {
|
|
10
|
-
"deps": ["@aws-sdk/client-s3", "@aws-sdk/s3-request-presigner"],
|
|
11
|
-
"env": ["S3_BUCKET", "S3_REGION", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"],
|
|
12
|
-
"files": ["src/adapters/s3"]
|
|
13
|
-
},
|
|
14
|
-
"r2": {
|
|
15
|
-
"deps": ["@aws-sdk/client-s3", "@aws-sdk/s3-request-presigner"],
|
|
16
|
-
"env": ["R2_BUCKET", "R2_ACCOUNT_ID", "R2_ACCESS_KEY_ID", "R2_SECRET_ACCESS_KEY"],
|
|
17
|
-
"files": ["src/adapters/r2", "src/adapters/s3"]
|
|
18
|
-
},
|
|
19
|
-
"gcs": {
|
|
20
|
-
"deps": ["@google-cloud/storage"],
|
|
21
|
-
"env": ["GCS_BUCKET", "GOOGLE_CLOUD_PROJECT"],
|
|
22
|
-
"files": ["src/adapters/gcs"]
|
|
23
|
-
},
|
|
24
|
-
"local": {
|
|
25
|
-
"deps": [],
|
|
26
|
-
"env": ["STORAGE_LOCAL_DIR"],
|
|
27
|
-
"files": ["src/adapters/local"]
|
|
28
|
-
}
|
|
29
|
-
},
|
|
30
|
-
"sharedDeps": ["valibot"],
|
|
31
|
-
"sharedFiles": ["src/core", "src/index.ts"]
|
|
32
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
# Patterns
|
|
2
|
-
|
|
3
|
-
Foundational, framework-coupled **patterns** the `bootstrap` skill vendors into a
|
|
4
|
-
freshly scaffolded app — the counterpart to `packages/` (swappable capabilities).
|
|
5
|
-
|
|
6
|
-
A *capability* is a provider behind a port (mailer, storage, …), swappable by
|
|
7
|
-
changing one line. A *pattern* is a foundation you don't swap but always set up
|
|
8
|
-
the same way: tRPC wiring, the better-auth instance, the Drizzle client. They are
|
|
9
|
-
**framework-coupled** (currently `tanstack-start`, mirrored from the reference
|
|
10
|
-
base apps) and depend on each other.
|
|
11
|
-
|
|
12
|
-
**The code lives in the base apps, not here.** `patterns/` is a pure *manifest
|
|
13
|
-
layer*: each `pattern.json` describes a foundation (how to detect it, its deps,
|
|
14
|
-
env, framework, dependencies) and lists the files that make it up — by pointing
|
|
15
|
-
**into the base apps** (`apps/tanstack-base`, `apps/next-base`), the single source
|
|
16
|
-
of truth. No code is duplicated.
|
|
17
|
-
|
|
18
|
-
Each pattern is `<name>/pattern.json` (see `../pattern.schema.json`).
|
|
19
|
-
`_baseline/` is special: real always-applied config files (Biome, tsconfig, env
|
|
20
|
-
skeleton, the `# Author` README footer) that a standalone fork needs but the base
|
|
21
|
-
apps don't carry on their own (they inherit the monorepo's Biome).
|
|
22
|
-
|
|
23
|
-
## How the skills use these
|
|
24
|
-
|
|
25
|
-
The manifests drive two flows:
|
|
26
|
-
|
|
27
|
-
- **bootstrap — create mode** (empty folder): fork a base app, then *strip* every
|
|
28
|
-
foundation/capability the user didn't pick, using each manifest's `files`/`deps`/
|
|
29
|
-
`env` to know its exact footprint.
|
|
30
|
-
- **bootstrap — existing project / add-capability**: match each manifest's `detect`
|
|
31
|
-
against the project → the opt-in set, then *vendor* the listed files (copied from
|
|
32
|
-
the base apps) + deps + env, wire `integratesWith` when both sides are opt-in, and
|
|
33
|
-
pull required `capabilities`. A pattern not referenced is never pulled.
|
|
34
|
-
|
|
35
|
-
## Available patterns
|
|
36
|
-
|
|
37
|
-
- **drizzle** — Drizzle ORM + drizzle-kit (Postgres). Client, schema barrel,
|
|
38
|
-
cursor pagination, seed harness.
|
|
39
|
-
- **better-auth** — better-auth v1 with the Drizzle adapter. Email+password,
|
|
40
|
-
verification, optional Google OAuth, rate limiting, auth tables, client +
|
|
41
|
-
session helpers, route guard. `dependsOn` drizzle; needs the mailer + email-kit
|
|
42
|
-
capabilities.
|
|
43
|
-
- **trpc** — tRPC v11 + TanStack React Query. Context, procedure tiers, error
|
|
44
|
-
formatter, client + SSR caller, fetch handler. `dependsOn` drizzle,
|
|
45
|
-
`integratesWith` better-auth.
|
|
46
|
-
- **data-table** — headless tables with TanStack Table (table + skeleton
|
|
47
|
-
primitives, DataTable, InfiniteDataTable, SortableHeader). `framework: agnostic`
|
|
48
|
-
— works in both Next and TanStack Start.
|
|
49
|
-
|
|
50
|
-
Next.js variants (App Router) of the framework-coupled patterns:
|
|
51
|
-
|
|
52
|
-
- **better-auth-next** — better-auth with `next/headers` session, `toNextJsHandler`
|
|
53
|
-
catch-all, server-component guards (`requireAuth`).
|
|
54
|
-
- **trpc-next** — tRPC with the classic `api.x.useQuery` hooks (createTRPCReact) +
|
|
55
|
-
RSC hydration. `integratesWith` better-auth-next.
|
|
56
|
-
|
|
57
|
-
bootstrap picks the variant matching the project's framework: `trpc`/`better-auth`
|
|
58
|
-
for TanStack Start, `trpc-next`/`better-auth-next` for Next.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { createEnv } from '@t3-oss/env-core';
|
|
2
|
-
import * as v from 'valibot';
|
|
3
|
-
|
|
4
|
-
/** Makes a var required only in production (optional in dev/test). */
|
|
5
|
-
export const requiredInProduction = <T extends v.GenericSchema>(schema: T) =>
|
|
6
|
-
process.env.NODE_ENV === 'production' ? schema : v.optional(schema);
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Typed environment. Start minimal — patterns (drizzle, better-auth, …) and
|
|
10
|
-
* capabilities (add-capability) extend the `server` block and `runtimeEnv` with
|
|
11
|
-
* the keys they need.
|
|
12
|
-
*/
|
|
13
|
-
export const env = createEnv({
|
|
14
|
-
shared: {
|
|
15
|
-
NODE_ENV: v.optional(
|
|
16
|
-
v.picklist(['development', 'test', 'production']),
|
|
17
|
-
'development',
|
|
18
|
-
),
|
|
19
|
-
},
|
|
20
|
-
|
|
21
|
-
server: {
|
|
22
|
-
// Extended by patterns/capabilities (DATABASE_URL, BETTER_AUTH_SECRET, …).
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
runtimeEnv: {
|
|
26
|
-
NODE_ENV: process.env.NODE_ENV,
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
skipValidation: !!process.env.SKIP_ENV_VALIDATION,
|
|
30
|
-
emptyStringAsUndefined: true,
|
|
31
|
-
});
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"include": ["**/*.ts", "**/*.tsx"],
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"target": "ES2022",
|
|
5
|
-
"jsx": "react-jsx",
|
|
6
|
-
"module": "ESNext",
|
|
7
|
-
"paths": {
|
|
8
|
-
"~/*": ["./src/*"]
|
|
9
|
-
},
|
|
10
|
-
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
11
|
-
"types": ["vite/client"],
|
|
12
|
-
|
|
13
|
-
/* Bundler mode */
|
|
14
|
-
"moduleResolution": "bundler",
|
|
15
|
-
"allowImportingTsExtensions": true,
|
|
16
|
-
"verbatimModuleSyntax": true,
|
|
17
|
-
"noEmit": true,
|
|
18
|
-
|
|
19
|
-
/* Linting */
|
|
20
|
-
"skipLibCheck": true,
|
|
21
|
-
"strict": true,
|
|
22
|
-
"noUnusedLocals": true,
|
|
23
|
-
"noUnusedParameters": true,
|
|
24
|
-
"noFallthroughCasesInSwitch": true,
|
|
25
|
-
"noUncheckedSideEffectImports": true
|
|
26
|
-
}
|
|
27
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "better-auth",
|
|
4
|
-
"description": "better-auth v1 with the Drizzle adapter (Postgres). Email+password, email verification, optional Google OAuth, rate limiting and TanStack Start cookies. Ships auth tables, server/client instances, session helpers and a route guard.",
|
|
5
|
-
"framework": "tanstack-start",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"better-auth"
|
|
9
|
-
],
|
|
10
|
-
"files": []
|
|
11
|
-
},
|
|
12
|
-
"dependsOn": [
|
|
13
|
-
"drizzle"
|
|
14
|
-
],
|
|
15
|
-
"integratesWith": [
|
|
16
|
-
"trpc"
|
|
17
|
-
],
|
|
18
|
-
"capabilities": [
|
|
19
|
-
"mailer",
|
|
20
|
-
"email-kit"
|
|
21
|
-
],
|
|
22
|
-
"deps": [
|
|
23
|
-
"better-auth"
|
|
24
|
-
],
|
|
25
|
-
"env": [
|
|
26
|
-
"BETTER_AUTH_URL",
|
|
27
|
-
"BETTER_AUTH_SECRET",
|
|
28
|
-
"BETTER_AUTH_GOOGLE_CLIENT_ID",
|
|
29
|
-
"BETTER_AUTH_GOOGLE_CLIENT_SECRET"
|
|
30
|
-
],
|
|
31
|
-
"files": [
|
|
32
|
-
{
|
|
33
|
-
"from": "apps/tanstack-base/src/server/better-auth/config.ts",
|
|
34
|
-
"to": "<srcRoot>/server/better-auth/config.ts"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"from": "apps/tanstack-base/src/server/better-auth/client.ts",
|
|
38
|
-
"to": "<srcRoot>/server/better-auth/client.ts"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"from": "apps/tanstack-base/src/server/better-auth/session.ts",
|
|
42
|
-
"to": "<srcRoot>/server/better-auth/session.ts"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"from": "apps/tanstack-base/src/server/better-auth/emails.tsx",
|
|
46
|
-
"to": "<srcRoot>/server/better-auth/emails.tsx"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"from": "apps/tanstack-base/src/server/better-auth/index.ts",
|
|
50
|
-
"to": "<srcRoot>/server/better-auth/index.ts"
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"from": "apps/tanstack-base/src/server/db/schemas/auth.schema.ts",
|
|
54
|
-
"to": "<srcRoot>/server/db/schemas/auth.schema.ts"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"from": "apps/tanstack-base/src/routes/api/auth/$.ts",
|
|
58
|
-
"to": "<srcRoot>/routes/api/auth/$.ts"
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
"from": "apps/tanstack-base/src/routes/_authed.tsx",
|
|
62
|
-
"to": "<srcRoot>/routes/_authed.tsx"
|
|
63
|
-
}
|
|
64
|
-
],
|
|
65
|
-
"wiring": [
|
|
66
|
-
"Append `export * from './auth.schema'` to <srcRoot>/server/db/schemas/index.ts (created by the drizzle pattern).",
|
|
67
|
-
"emails.tsx imports ~/server/email (mailer capability) and ~/emails/{reset-password,verify-email} (email-kit). Ensure both capabilities are added; create the two templates if missing."
|
|
68
|
-
],
|
|
69
|
-
"notes": [
|
|
70
|
-
"Auth tables (user/session/account/verification) live in auth.schema.ts; better-auth manages them via the Drizzle adapter. Add custom user columns via `additionalFields` in config.ts mirrored in auth.schema.ts.",
|
|
71
|
-
"BETTER_AUTH_SECRET is read implicitly from env by better-auth; the rest are validated in env.ts."
|
|
72
|
-
]
|
|
73
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "better-auth-next",
|
|
4
|
-
"description": "better-auth v1 for Next.js App Router with the Drizzle adapter. Email+password + verification, optional Google OAuth, session via next/headers (react cache), toNextJsHandler catch-all route, and server-component guards. The Next counterpart of the `better-auth` pattern.",
|
|
5
|
-
"framework": "next",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"better-auth"
|
|
9
|
-
],
|
|
10
|
-
"files": [
|
|
11
|
-
"src/app/api/auth/[...all]/route.ts"
|
|
12
|
-
]
|
|
13
|
-
},
|
|
14
|
-
"dependsOn": [
|
|
15
|
-
"drizzle"
|
|
16
|
-
],
|
|
17
|
-
"integratesWith": [
|
|
18
|
-
"trpc-next"
|
|
19
|
-
],
|
|
20
|
-
"capabilities": [
|
|
21
|
-
"mailer",
|
|
22
|
-
"email-kit"
|
|
23
|
-
],
|
|
24
|
-
"deps": [
|
|
25
|
-
"better-auth"
|
|
26
|
-
],
|
|
27
|
-
"env": [
|
|
28
|
-
"BETTER_AUTH_URL",
|
|
29
|
-
"BETTER_AUTH_SECRET",
|
|
30
|
-
"BETTER_AUTH_GOOGLE_CLIENT_ID",
|
|
31
|
-
"BETTER_AUTH_GOOGLE_CLIENT_SECRET"
|
|
32
|
-
],
|
|
33
|
-
"files": [
|
|
34
|
-
{
|
|
35
|
-
"from": "apps/next-base/src/server/better-auth/config.ts",
|
|
36
|
-
"to": "<srcRoot>/server/better-auth/config.ts"
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"from": "apps/next-base/src/server/better-auth/client.ts",
|
|
40
|
-
"to": "<srcRoot>/server/better-auth/client.ts"
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"from": "apps/next-base/src/server/better-auth/server.ts",
|
|
44
|
-
"to": "<srcRoot>/server/better-auth/server.ts"
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
"from": "apps/next-base/src/server/better-auth/emails.tsx",
|
|
48
|
-
"to": "<srcRoot>/server/better-auth/emails.tsx"
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"from": "apps/next-base/src/server/better-auth/index.ts",
|
|
52
|
-
"to": "<srcRoot>/server/better-auth/index.ts"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"from": "apps/next-base/src/server/auth/guards.ts",
|
|
56
|
-
"to": "<srcRoot>/server/auth/guards.ts"
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"from": "apps/next-base/src/server/db/schemas/auth.schema.ts",
|
|
60
|
-
"to": "<srcRoot>/server/db/schemas/auth.schema.ts"
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"from": "apps/next-base/src/app/api/auth/[...all]/route.ts",
|
|
64
|
-
"to": "<srcRoot>/app/api/auth/[...all]/route.ts"
|
|
65
|
-
}
|
|
66
|
-
],
|
|
67
|
-
"wiring": [
|
|
68
|
-
"Append `export * from './auth.schema'` to <srcRoot>/server/db/schemas/index.ts (created by the drizzle pattern).",
|
|
69
|
-
"emails.tsx imports ~/server/email (mailer) and ~/emails/{reset-password,verify-email} (email-kit) — add both capabilities and the two templates.",
|
|
70
|
-
"Auth pages live in app/auth/* (server pages) with forms in app/auth/_components/* ('use client', shadcn Form + react-hook-form + valibot)."
|
|
71
|
-
],
|
|
72
|
-
"notes": [
|
|
73
|
-
"No tanstackStartCookies — cookies are handled by toNextJsHandler. getSession uses next/headers + react cache (server.ts). Protect Server Components/pages with requireAuth() from server/auth/guards.",
|
|
74
|
-
"Add custom user columns via `additionalFields` in config.ts mirrored in auth.schema.ts."
|
|
75
|
-
]
|
|
76
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "data-table",
|
|
4
|
-
"description": "Headless data tables with TanStack Table: shadcn table + skeleton primitives, a DataTable (loading + empty states), an InfiniteDataTable and a SortableHeader.",
|
|
5
|
-
"framework": "agnostic",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"@tanstack/react-table"
|
|
9
|
-
],
|
|
10
|
-
"files": []
|
|
11
|
-
},
|
|
12
|
-
"dependsOn": [],
|
|
13
|
-
"deps": [
|
|
14
|
-
"@tanstack/react-table"
|
|
15
|
-
],
|
|
16
|
-
"env": [],
|
|
17
|
-
"files": [
|
|
18
|
-
{
|
|
19
|
-
"from": "apps/tanstack-base/src/components/ui/table.tsx",
|
|
20
|
-
"to": "<srcRoot>/components/ui/table.tsx"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
"from": "apps/tanstack-base/src/components/ui/skeleton.tsx",
|
|
24
|
-
"to": "<srcRoot>/components/ui/skeleton.tsx"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"from": "apps/tanstack-base/src/components/data-table.tsx",
|
|
28
|
-
"to": "<srcRoot>/components/data-table.tsx"
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
"from": "apps/tanstack-base/src/components/infinite-data-table.tsx",
|
|
32
|
-
"to": "<srcRoot>/components/infinite-data-table.tsx"
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"from": "apps/tanstack-base/src/components/sortable-header.tsx",
|
|
36
|
-
"to": "<srcRoot>/components/sortable-header.tsx"
|
|
37
|
-
}
|
|
38
|
-
],
|
|
39
|
-
"notes": [
|
|
40
|
-
"Pure React + TanStack Table — works in both Next App Router and TanStack Start. Needs shadcn (cn util + Button); the table/skeleton primitives are vendored here.",
|
|
41
|
-
"On Next.js, the component that builds the table (calls useReactTable) must be a client component ('use client')."
|
|
42
|
-
]
|
|
43
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "drizzle",
|
|
4
|
-
"description": "Drizzle ORM + drizzle-kit (Postgres / node-postgres). DB client, schema barrel, cursor (keyset) pagination helpers and a seed harness.",
|
|
5
|
-
"framework": "tanstack-start",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"drizzle-orm"
|
|
9
|
-
],
|
|
10
|
-
"files": [
|
|
11
|
-
"drizzle.config.ts"
|
|
12
|
-
]
|
|
13
|
-
},
|
|
14
|
-
"dependsOn": [],
|
|
15
|
-
"deps": [
|
|
16
|
-
"drizzle-orm",
|
|
17
|
-
"pg"
|
|
18
|
-
],
|
|
19
|
-
"devDeps": [
|
|
20
|
-
"drizzle-kit",
|
|
21
|
-
"dotenv",
|
|
22
|
-
"tsx",
|
|
23
|
-
"@types/pg",
|
|
24
|
-
"@faker-js/faker"
|
|
25
|
-
],
|
|
26
|
-
"env": [
|
|
27
|
-
"DATABASE_URL"
|
|
28
|
-
],
|
|
29
|
-
"scripts": {
|
|
30
|
-
"db:generate": "drizzle-kit generate",
|
|
31
|
-
"db:migrate": "drizzle-kit migrate",
|
|
32
|
-
"db:push": "drizzle-kit push",
|
|
33
|
-
"db:studio": "drizzle-kit studio",
|
|
34
|
-
"db:seed": "tsx src/server/db/seed.ts"
|
|
35
|
-
},
|
|
36
|
-
"files": [
|
|
37
|
-
{
|
|
38
|
-
"from": "apps/tanstack-base/drizzle.config.ts",
|
|
39
|
-
"to": "drizzle.config.ts"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"from": "apps/tanstack-base/src/server/db/index.ts",
|
|
43
|
-
"to": "<srcRoot>/server/db/index.ts"
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"from": "apps/tanstack-base/src/server/db/keyset.ts",
|
|
47
|
-
"to": "<srcRoot>/server/db/keyset.ts"
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"from": "apps/tanstack-base/src/server/db/seed.ts",
|
|
51
|
-
"to": "<srcRoot>/server/db/seed.ts"
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
"from": "apps/tanstack-base/src/server/db/schemas/index.ts",
|
|
55
|
-
"to": "<srcRoot>/server/db/schemas/index.ts"
|
|
56
|
-
}
|
|
57
|
-
],
|
|
58
|
-
"notes": [
|
|
59
|
-
"drizzle.config.ts globs ./src/server/db/schemas/*.schema.ts — adjust the path if the project's source root is not ./src."
|
|
60
|
-
]
|
|
61
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "trpc",
|
|
4
|
-
"description": "tRPC v11 + TanStack React Query. Context with session injection, public/protected procedures, valibot error formatter, batch-stream client, SSR caller and a fetch route handler.",
|
|
5
|
-
"framework": "tanstack-start",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"@trpc/server"
|
|
9
|
-
],
|
|
10
|
-
"files": []
|
|
11
|
-
},
|
|
12
|
-
"dependsOn": [
|
|
13
|
-
"drizzle"
|
|
14
|
-
],
|
|
15
|
-
"integratesWith": [
|
|
16
|
-
"better-auth"
|
|
17
|
-
],
|
|
18
|
-
"deps": [
|
|
19
|
-
"@trpc/server",
|
|
20
|
-
"@trpc/client",
|
|
21
|
-
"@trpc/tanstack-react-query",
|
|
22
|
-
"@tanstack/react-query",
|
|
23
|
-
"superjson",
|
|
24
|
-
"valibot"
|
|
25
|
-
],
|
|
26
|
-
"env": [],
|
|
27
|
-
"files": [
|
|
28
|
-
{
|
|
29
|
-
"from": "apps/tanstack-base/src/server/api/trpc.ts",
|
|
30
|
-
"to": "<srcRoot>/server/api/trpc.ts"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"from": "apps/tanstack-base/src/server/api/root.ts",
|
|
34
|
-
"to": "<srcRoot>/server/api/root.ts"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"from": "apps/tanstack-base/src/server/api/routers/health.router.ts",
|
|
38
|
-
"to": "<srcRoot>/server/api/routers/health.router.ts"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"from": "apps/tanstack-base/src/routes/api.trpc.$.tsx",
|
|
42
|
-
"to": "<srcRoot>/routes/api.trpc.$.tsx"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"from": "apps/tanstack-base/src/trpc/react.tsx",
|
|
46
|
-
"to": "<srcRoot>/trpc/react.tsx"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"from": "apps/tanstack-base/src/trpc/query-client.ts",
|
|
50
|
-
"to": "<srcRoot>/trpc/query-client.ts"
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"from": "apps/tanstack-base/src/trpc/server.ts",
|
|
54
|
-
"to": "<srcRoot>/trpc/server.ts"
|
|
55
|
-
}
|
|
56
|
-
],
|
|
57
|
-
"notes": [
|
|
58
|
-
"trpc.ts integrates with better-auth: it imports `auth` and injects `session` into the context. If the better-auth pattern is NOT opt-in, strip those imports, the `session` from the context, and protectedProcedure — keep publicProcedure + the timing middleware.",
|
|
59
|
-
"Wire TRPCReactProvider + createQueryClient into the app's root route, and getServerHelpers for SSR preloading (see tanstack-base's router for the exact root wiring)."
|
|
60
|
-
]
|
|
61
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "../../pattern.schema.json",
|
|
3
|
-
"name": "trpc-next",
|
|
4
|
-
"description": "tRPC v11 for Next.js App Router — the classic `api.x.useQuery` / `useMutation` hooks (createTRPCReact) plus RSC hydration (createHydrationHelpers). The Next counterpart of the `trpc` pattern.",
|
|
5
|
-
"framework": "next",
|
|
6
|
-
"detect": {
|
|
7
|
-
"deps": [
|
|
8
|
-
"@trpc/react-query"
|
|
9
|
-
],
|
|
10
|
-
"files": []
|
|
11
|
-
},
|
|
12
|
-
"dependsOn": [
|
|
13
|
-
"drizzle"
|
|
14
|
-
],
|
|
15
|
-
"integratesWith": [
|
|
16
|
-
"better-auth-next"
|
|
17
|
-
],
|
|
18
|
-
"deps": [
|
|
19
|
-
"@trpc/server",
|
|
20
|
-
"@trpc/client",
|
|
21
|
-
"@trpc/react-query",
|
|
22
|
-
"@tanstack/react-query",
|
|
23
|
-
"superjson",
|
|
24
|
-
"valibot"
|
|
25
|
-
],
|
|
26
|
-
"env": [],
|
|
27
|
-
"files": [
|
|
28
|
-
{
|
|
29
|
-
"from": "apps/next-base/src/server/api/trpc.ts",
|
|
30
|
-
"to": "<srcRoot>/server/api/trpc.ts"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"from": "apps/next-base/src/server/api/root.ts",
|
|
34
|
-
"to": "<srcRoot>/server/api/root.ts"
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
"from": "apps/next-base/src/server/api/routers/health.router.ts",
|
|
38
|
-
"to": "<srcRoot>/server/api/routers/health.router.ts"
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
"from": "apps/next-base/src/trpc/react.tsx",
|
|
42
|
-
"to": "<srcRoot>/trpc/react.tsx"
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
"from": "apps/next-base/src/trpc/query-client.ts",
|
|
46
|
-
"to": "<srcRoot>/trpc/query-client.ts"
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"from": "apps/next-base/src/trpc/server.ts",
|
|
50
|
-
"to": "<srcRoot>/trpc/server.ts"
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"from": "apps/next-base/src/app/api/trpc/[trpc]/route.ts",
|
|
54
|
-
"to": "<srcRoot>/app/api/trpc/[trpc]/route.ts"
|
|
55
|
-
}
|
|
56
|
-
],
|
|
57
|
-
"wiring": [
|
|
58
|
-
"Wrap the app in <TRPCReactProvider> in app/layout.tsx (it's a client component)."
|
|
59
|
-
],
|
|
60
|
-
"notes": [
|
|
61
|
-
"Client usage: `api.<router>.<proc>.useQuery()` / `.useMutation()` from ~/trpc/react. RSC usage: `import { api, HydrateClient } from '~/trpc/server'` for prefetch + hydrate.",
|
|
62
|
-
"trpc.ts context calls better-auth getSession; if better-auth-next is NOT opt-in, strip the auth import, `session` from the context, and protectedProcedure."
|
|
63
|
-
]
|
|
64
|
-
}
|