@alfredmouelle/create-stack 0.1.1 → 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.
Files changed (81) hide show
  1. package/README.md +8 -13
  2. package/_stack/apps/next-base/.turbo/turbo-typecheck.log +1 -0
  3. package/_stack/apps/next-base/.vscode/settings.json +35 -0
  4. package/_stack/apps/next-base/.zed/settings.json +45 -0
  5. package/_stack/apps/next-base/src/components/ui/spinner.tsx +1 -1
  6. package/_stack/apps/next-base/src/emails/components/components.tsx +2 -2
  7. package/_stack/apps/next-base/src/emails/components/context.tsx +1 -1
  8. package/_stack/apps/next-base/src/emails/components/theme.ts +6 -7
  9. package/_stack/apps/next-base/src/env.ts +2 -3
  10. package/_stack/apps/next-base/src/lib/date.ts +1 -1
  11. package/_stack/apps/next-base/src/server/auth/guards.ts +1 -1
  12. package/_stack/apps/next-base/src/server/better-auth/config.ts +1 -1
  13. package/_stack/apps/next-base/src/server/better-auth/server.ts +2 -2
  14. package/_stack/apps/next-base/src/server/db/schemas/index.ts +1 -1
  15. package/_stack/apps/next-base/src/server/db/seed.ts +2 -2
  16. package/_stack/apps/next-base/src/server/email/adapters/resend/index.ts +3 -3
  17. package/_stack/apps/next-base/src/server/email/core/address.ts +3 -3
  18. package/_stack/apps/next-base/src/server/email/core/port.ts +13 -20
  19. package/_stack/apps/next-base/src/server/email/core/render.ts +2 -2
  20. package/_stack/apps/next-base/src/server/email/factory.ts +7 -9
  21. package/_stack/apps/next-base/src/server/email/index.ts +1 -1
  22. package/_stack/apps/next-base/src/trpc/react.tsx +2 -2
  23. package/_stack/apps/next-base/src/trpc/server.ts +1 -1
  24. package/_stack/apps/tanstack-base/.turbo/turbo-typecheck.log +1 -0
  25. package/_stack/apps/tanstack-base/.vscode/settings.json +35 -0
  26. package/_stack/apps/tanstack-base/.zed/settings.json +45 -0
  27. package/_stack/apps/tanstack-base/src/components/form/text-field.tsx +1 -1
  28. package/_stack/apps/tanstack-base/src/components/ui/spinner.tsx +1 -1
  29. package/_stack/apps/tanstack-base/src/emails/components/components.tsx +2 -2
  30. package/_stack/apps/tanstack-base/src/emails/components/context.tsx +1 -1
  31. package/_stack/apps/tanstack-base/src/emails/components/theme.ts +6 -7
  32. package/_stack/apps/tanstack-base/src/env.ts +2 -6
  33. package/_stack/apps/tanstack-base/src/lib/date.ts +1 -1
  34. package/_stack/apps/tanstack-base/src/routes/__root.tsx +1 -1
  35. package/_stack/apps/tanstack-base/src/routes/_authed.tsx +1 -4
  36. package/_stack/apps/tanstack-base/src/routes/api/auth/$.ts +1 -1
  37. package/_stack/apps/tanstack-base/src/routes/api.trpc.$.tsx +1 -2
  38. package/_stack/apps/tanstack-base/src/server/better-auth/config.ts +1 -1
  39. package/_stack/apps/tanstack-base/src/server/better-auth/session.ts +6 -7
  40. package/_stack/apps/tanstack-base/src/server/db/schemas/index.ts +1 -1
  41. package/_stack/apps/tanstack-base/src/server/db/seed.ts +2 -2
  42. package/_stack/apps/tanstack-base/src/server/email/adapters/resend/index.ts +3 -3
  43. package/_stack/apps/tanstack-base/src/server/email/core/address.ts +3 -3
  44. package/_stack/apps/tanstack-base/src/server/email/core/port.ts +12 -22
  45. package/_stack/apps/tanstack-base/src/server/email/core/render.ts +1 -1
  46. package/_stack/apps/tanstack-base/src/server/email/factory.ts +7 -8
  47. package/_stack/apps/tanstack-base/src/server/email/index.ts +1 -1
  48. package/_stack/packages/mailer/src/adapters/brevo/index.ts +3 -3
  49. package/_stack/packages/mailer/src/adapters/resend/index.ts +3 -3
  50. package/_stack/packages/mailer/src/adapters/ses/config.ts +3 -3
  51. package/_stack/packages/mailer/src/adapters/ses/index.ts +4 -5
  52. package/index.mjs +30 -47
  53. package/lib/build.mjs +6 -14
  54. package/lib/env.mjs +5 -6
  55. package/lib/foundations.mjs +35 -0
  56. package/lib/identity.mjs +4 -5
  57. package/lib/mailer.mjs +9 -13
  58. package/lib/paths.mjs +15 -0
  59. package/lib/scaffold.mjs +11 -11
  60. package/lib/strip.mjs +9 -24
  61. package/lib/util.mjs +8 -9
  62. package/package.json +1 -1
  63. package/_stack/packages/analytics/capability.json +0 -26
  64. package/_stack/packages/cache/capability.json +0 -21
  65. package/_stack/packages/error-tracking/capability.json +0 -21
  66. package/_stack/packages/jobs/capability.json +0 -26
  67. package/_stack/packages/logger/capability.json +0 -21
  68. package/_stack/packages/mailer/capability.json +0 -28
  69. package/_stack/packages/storage/capability.json +0 -32
  70. package/_stack/patterns/README.md +0 -58
  71. package/_stack/patterns/_baseline/env.ts +0 -31
  72. package/_stack/patterns/_baseline/tsconfig.json +0 -27
  73. package/_stack/patterns/better-auth/pattern.json +0 -73
  74. package/_stack/patterns/better-auth-next/pattern.json +0 -76
  75. package/_stack/patterns/data-table/pattern.json +0 -43
  76. package/_stack/patterns/drizzle/pattern.json +0 -61
  77. package/_stack/patterns/trpc/pattern.json +0 -61
  78. package/_stack/patterns/trpc-next/pattern.json +0 -64
  79. package/lib/manifests.mjs +0 -61
  80. /package/{_stack/patterns/_baseline → templates}/README-author.md +0 -0
  81. /package/{_stack/patterns/_baseline → templates}/biome.jsonc +0 -0
@@ -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
- }
package/lib/manifests.mjs DELETED
@@ -1,61 +0,0 @@
1
- // Loads the stack's pattern + capability manifests so the CLI stays
2
- // data-driven (file lists, deps, env come from the manifests, not hardcoded).
3
- // Only the few code "seams" (trpc/auth wiring) are hardcoded in strip.mjs.
4
-
5
- import { existsSync, readdirSync } from 'node:fs'
6
- import { dirname, join, resolve } from 'node:path'
7
- import { fileURLToPath } from 'node:url'
8
- import { readJSON } from './util.mjs'
9
-
10
- const here = dirname(fileURLToPath(import.meta.url))
11
- // Published: assets are bundled into cli/_stack (see scripts/bundle.mjs).
12
- // Dev (inside the monorepo): read them straight from the repo root.
13
- const bundled = resolve(here, '..', '_stack')
14
- export const STACK_ROOT = existsSync(bundled) ? bundled : resolve(here, '..', '..')
15
-
16
- export const loadPatterns = () => {
17
- const dir = join(STACK_ROOT, 'patterns')
18
- const out = {}
19
- for (const name of readdirSync(dir)) {
20
- if (name.startsWith('_') || name === 'README.md') continue
21
- try {
22
- out[name] = readJSON(join(dir, name, 'pattern.json'))
23
- } catch {
24
- // not a pattern dir
25
- }
26
- }
27
- return out
28
- }
29
-
30
- export const loadCapabilities = () => {
31
- const dir = join(STACK_ROOT, 'packages')
32
- const out = {}
33
- for (const name of readdirSync(dir)) {
34
- try {
35
- out[name] = readJSON(join(dir, name, 'capability.json'))
36
- } catch {
37
- // not a capability package
38
- }
39
- }
40
- return out
41
- }
42
-
43
- /**
44
- * Logical foundations the wizard offers, mapped to the concrete manifest name
45
- * per framework. The base apps always contain ALL of these — selection = keep.
46
- */
47
- export const foundationManifest = (logical, framework) => {
48
- const next = framework === 'next'
49
- switch (logical) {
50
- case 'drizzle':
51
- return 'drizzle'
52
- case 'data-table':
53
- return 'data-table'
54
- case 'trpc':
55
- return next ? 'trpc-next' : 'trpc'
56
- case 'better-auth':
57
- return next ? 'better-auth-next' : 'better-auth'
58
- default:
59
- return logical
60
- }
61
- }