create-einja-app 0.1.1

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 (235) hide show
  1. package/README.md +307 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +1041 -0
  4. package/dist/cli.js.map +1 -0
  5. package/package.json +62 -0
  6. package/templates/turborepo-pandacss/.biomeignore +15 -0
  7. package/templates/turborepo-pandacss/.claude/hooks/einja/biome-format.sh +49 -0
  8. package/templates/turborepo-pandacss/.claude/hooks/einja/design-doc-check.sh +61 -0
  9. package/templates/turborepo-pandacss/.claude/hooks/einja/detect-secrets.sh +62 -0
  10. package/templates/turborepo-pandacss/.claude/hooks/einja/large-file-warning.sh +42 -0
  11. package/templates/turborepo-pandacss/.claude/hooks/einja/playwright-resize.sh +36 -0
  12. package/templates/turborepo-pandacss/.claude/hooks/einja/typecheck.sh +37 -0
  13. package/templates/turborepo-pandacss/.claude/hooks/einja/unset-volta-recursion.sh +32 -0
  14. package/templates/turborepo-pandacss/.claude/hooks/einja/validate-git-commit.sh +239 -0
  15. package/templates/turborepo-pandacss/.claude/hooks/einja/warn-index-ts.sh +34 -0
  16. package/templates/turborepo-pandacss/.claude/hooks/einja/warn-relative-import.sh +48 -0
  17. package/templates/turborepo-pandacss/.claude/settings.json +174 -0
  18. package/templates/turborepo-pandacss/.claude/skills/create-einja-app-release/SKILL.md +186 -0
  19. package/templates/turborepo-pandacss/.claude/skills/dev-cli-release/SKILL.md +173 -0
  20. package/templates/turborepo-pandacss/.cursor/commands/spec-create.md +227 -0
  21. package/templates/turborepo-pandacss/.cursor/commands/start-dev.md +98 -0
  22. package/templates/turborepo-pandacss/.cursor/commands/task-exec.md +287 -0
  23. package/templates/turborepo-pandacss/.cursor/commands/task-vibe-kanban-loop.md +532 -0
  24. package/templates/turborepo-pandacss/.cursor/commands/update-docs-by-task-specs.md +448 -0
  25. package/templates/turborepo-pandacss/.cursor/mcp.json +45 -0
  26. package/templates/turborepo-pandacss/.cursor/rules/api-rules.mdc +171 -0
  27. package/templates/turborepo-pandacss/.cursor/rules/api-test-rules.mdc +181 -0
  28. package/templates/turborepo-pandacss/.cursor/rules/base-code.mdc +70 -0
  29. package/templates/turborepo-pandacss/.cursor/rules/base-commit-rules.mdc +174 -0
  30. package/templates/turborepo-pandacss/.cursor/rules/base-design.mdc +12 -0
  31. package/templates/turborepo-pandacss/.cursor/rules/base-rules.mdc +231 -0
  32. package/templates/turborepo-pandacss/.cursor/rules/error-handling-rules.mdc +188 -0
  33. package/templates/turborepo-pandacss/.cursor/rules/refactor-rules.mdc +93 -0
  34. package/templates/turborepo-pandacss/.dockerignore +126 -0
  35. package/templates/turborepo-pandacss/.einja-sync.json +35 -0
  36. package/templates/turborepo-pandacss/.env.ci +25 -0
  37. package/templates/turborepo-pandacss/.env.example +35 -0
  38. package/templates/turborepo-pandacss/.env.personal.example +27 -0
  39. package/templates/turborepo-pandacss/.envrc +4 -0
  40. package/templates/turborepo-pandacss/.gitattributes +5 -0
  41. package/templates/turborepo-pandacss/.husky/pre-commit +1 -0
  42. package/templates/turborepo-pandacss/.lintstagedrc.js +24 -0
  43. package/templates/turborepo-pandacss/.mcp.json +45 -0
  44. package/templates/turborepo-pandacss/.node-version +1 -0
  45. package/templates/turborepo-pandacss/.templateignore +60 -0
  46. package/templates/turborepo-pandacss/.vscode/extensions.json +3 -0
  47. package/templates/turborepo-pandacss/CLAUDE.md +415 -0
  48. package/templates/turborepo-pandacss/README.md +322 -0
  49. package/templates/turborepo-pandacss/apps/web/middleware.ts +28 -0
  50. package/templates/turborepo-pandacss/apps/web/next.config.ts +10 -0
  51. package/templates/turborepo-pandacss/apps/web/package.json +80 -0
  52. package/templates/turborepo-pandacss/apps/web/panda.config.ts +114 -0
  53. package/templates/turborepo-pandacss/apps/web/postcss.config.cjs +6 -0
  54. package/templates/turborepo-pandacss/apps/web/public/file.svg +1 -0
  55. package/templates/turborepo-pandacss/apps/web/public/globe.svg +1 -0
  56. package/templates/turborepo-pandacss/apps/web/public/next.svg +1 -0
  57. package/templates/turborepo-pandacss/apps/web/public/vercel.svg +1 -0
  58. package/templates/turborepo-pandacss/apps/web/public/window.svg +1 -0
  59. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/dashboard/page.tsx +79 -0
  60. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/data/_components/UserTable.tsx +203 -0
  61. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/data/page.tsx +57 -0
  62. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/layout-client.tsx +31 -0
  63. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/layout.tsx +17 -0
  64. package/templates/turborepo-pandacss/apps/web/src/app/(authenticated)/profile/page.tsx +59 -0
  65. package/templates/turborepo-pandacss/apps/web/src/app/api/auth/[...nextauth]/route.ts +3 -0
  66. package/templates/turborepo-pandacss/apps/web/src/app/api/auth/signup/route.ts +70 -0
  67. package/templates/turborepo-pandacss/apps/web/src/app/error.tsx +106 -0
  68. package/templates/turborepo-pandacss/apps/web/src/app/favicon.ico +0 -0
  69. package/templates/turborepo-pandacss/apps/web/src/app/global-error.tsx +110 -0
  70. package/templates/turborepo-pandacss/apps/web/src/app/globals.css +121 -0
  71. package/templates/turborepo-pandacss/apps/web/src/app/layout.tsx +28 -0
  72. package/templates/turborepo-pandacss/apps/web/src/app/not-found.tsx +54 -0
  73. package/templates/turborepo-pandacss/apps/web/src/app/page.module.css +165 -0
  74. package/templates/turborepo-pandacss/apps/web/src/app/page.test.tsx +52 -0
  75. package/templates/turborepo-pandacss/apps/web/src/app/page.tsx +284 -0
  76. package/templates/turborepo-pandacss/apps/web/src/app/signin/page.tsx +296 -0
  77. package/templates/turborepo-pandacss/apps/web/src/app/signup/page.tsx +395 -0
  78. package/templates/turborepo-pandacss/apps/web/src/application/use-cases/UserUseCases.test.ts +229 -0
  79. package/templates/turborepo-pandacss/apps/web/src/application/use-cases/UserUseCases.ts +115 -0
  80. package/templates/turborepo-pandacss/apps/web/src/components/auth/login-button.tsx +35 -0
  81. package/templates/turborepo-pandacss/apps/web/src/components/auth/logout-button.tsx +24 -0
  82. package/templates/turborepo-pandacss/apps/web/src/components/auth/user-avatar.test.tsx +68 -0
  83. package/templates/turborepo-pandacss/apps/web/src/components/auth/user-avatar.tsx +43 -0
  84. package/templates/turborepo-pandacss/apps/web/src/components/dashboard/dashboard-stats.tsx +128 -0
  85. package/templates/turborepo-pandacss/apps/web/src/components/providers/query-provider.tsx +30 -0
  86. package/templates/turborepo-pandacss/apps/web/src/components/providers/session-provider.tsx +12 -0
  87. package/templates/turborepo-pandacss/apps/web/src/components/shared/Sidebar.tsx +175 -0
  88. package/templates/turborepo-pandacss/apps/web/src/components/shared/header.tsx +166 -0
  89. package/templates/turborepo-pandacss/apps/web/src/components/ui/accordion.tsx +64 -0
  90. package/templates/turborepo-pandacss/apps/web/src/components/ui/alert-dialog.tsx +135 -0
  91. package/templates/turborepo-pandacss/apps/web/src/components/ui/alert.tsx +60 -0
  92. package/templates/turborepo-pandacss/apps/web/src/components/ui/aspect-ratio.tsx +9 -0
  93. package/templates/turborepo-pandacss/apps/web/src/components/ui/avatar.tsx +41 -0
  94. package/templates/turborepo-pandacss/apps/web/src/components/ui/badge.tsx +39 -0
  95. package/templates/turborepo-pandacss/apps/web/src/components/ui/breadcrumb.tsx +101 -0
  96. package/templates/turborepo-pandacss/apps/web/src/components/ui/button.tsx +56 -0
  97. package/templates/turborepo-pandacss/apps/web/src/components/ui/card.tsx +75 -0
  98. package/templates/turborepo-pandacss/apps/web/src/components/ui/checkbox.tsx +29 -0
  99. package/templates/turborepo-pandacss/apps/web/src/components/ui/data-table.tsx +189 -0
  100. package/templates/turborepo-pandacss/apps/web/src/components/ui/dialog-hook.tsx +210 -0
  101. package/templates/turborepo-pandacss/apps/web/src/components/ui/dialog.tsx +129 -0
  102. package/templates/turborepo-pandacss/apps/web/src/components/ui/drawer.tsx +124 -0
  103. package/templates/turborepo-pandacss/apps/web/src/components/ui/dropdown-menu.tsx +228 -0
  104. package/templates/turborepo-pandacss/apps/web/src/components/ui/form.tsx +152 -0
  105. package/templates/turborepo-pandacss/apps/web/src/components/ui/hover-card.tsx +38 -0
  106. package/templates/turborepo-pandacss/apps/web/src/components/ui/input.tsx +21 -0
  107. package/templates/turborepo-pandacss/apps/web/src/components/ui/label.tsx +21 -0
  108. package/templates/turborepo-pandacss/apps/web/src/components/ui/pagination.tsx +105 -0
  109. package/templates/turborepo-pandacss/apps/web/src/components/ui/popover.tsx +42 -0
  110. package/templates/turborepo-pandacss/apps/web/src/components/ui/progress.tsx +28 -0
  111. package/templates/turborepo-pandacss/apps/web/src/components/ui/select.tsx +170 -0
  112. package/templates/turborepo-pandacss/apps/web/src/components/ui/separator.tsx +28 -0
  113. package/templates/turborepo-pandacss/apps/web/src/components/ui/skeleton.tsx +13 -0
  114. package/templates/turborepo-pandacss/apps/web/src/components/ui/sonner.tsx +25 -0
  115. package/templates/turborepo-pandacss/apps/web/src/components/ui/table.tsx +92 -0
  116. package/templates/turborepo-pandacss/apps/web/src/components/ui/tabs.tsx +54 -0
  117. package/templates/turborepo-pandacss/apps/web/src/components/ui/textarea.tsx +18 -0
  118. package/templates/turborepo-pandacss/apps/web/src/components/ui/tooltip.tsx +57 -0
  119. package/templates/turborepo-pandacss/apps/web/src/components/ui/typography.tsx +158 -0
  120. package/templates/turborepo-pandacss/apps/web/src/lib/auth/guard.ts +36 -0
  121. package/templates/turborepo-pandacss/apps/web/src/lib/auth/index.ts +22 -0
  122. package/templates/turborepo-pandacss/apps/web/src/lib/prisma.ts +3 -0
  123. package/templates/turborepo-pandacss/apps/web/src/lib/utils.ts +6 -0
  124. package/templates/turborepo-pandacss/apps/web/test/globals.d.ts +1 -0
  125. package/templates/turborepo-pandacss/apps/web/test/matchers.d.ts +1 -0
  126. package/templates/turborepo-pandacss/apps/web/test/setup.ts +22 -0
  127. package/templates/turborepo-pandacss/apps/web/tsconfig.json +37 -0
  128. package/templates/turborepo-pandacss/apps/web/vitest.config.ts +20 -0
  129. package/templates/turborepo-pandacss/apps/web/vitest.d.ts +2 -0
  130. package/templates/turborepo-pandacss/biome.json +60 -0
  131. package/templates/turborepo-pandacss/components.json +21 -0
  132. package/templates/turborepo-pandacss/docker-compose.yml +27 -0
  133. package/templates/turborepo-pandacss/middleware.ts +32 -0
  134. package/templates/turborepo-pandacss/next.config.ts +10 -0
  135. package/templates/turborepo-pandacss/package-lock.json +9346 -0
  136. package/templates/turborepo-pandacss/package.json +64 -0
  137. package/templates/turborepo-pandacss/packages/config/package.json +41 -0
  138. package/templates/turborepo-pandacss/packages/config/panda.config.ts +114 -0
  139. package/templates/turborepo-pandacss/packages/config/src/index.ts +24 -0
  140. package/templates/turborepo-pandacss/packages/config/src/worktree-config-loader.ts +129 -0
  141. package/templates/turborepo-pandacss/packages/config/src/worktree-config.ts +75 -0
  142. package/templates/turborepo-pandacss/packages/config/tsconfig.build.json +19 -0
  143. package/templates/turborepo-pandacss/packages/config/tsconfig.json +24 -0
  144. package/templates/turborepo-pandacss/packages/config/typescript/base.json +19 -0
  145. package/templates/turborepo-pandacss/packages/front-core/package.json +24 -0
  146. package/templates/turborepo-pandacss/packages/front-core/src/auth/config.ts +84 -0
  147. package/templates/turborepo-pandacss/packages/front-core/src/auth/index.ts +5 -0
  148. package/templates/turborepo-pandacss/packages/front-core/src/auth/types/next-auth.d.ts +20 -0
  149. package/templates/turborepo-pandacss/packages/front-core/src/auth/utils.ts +29 -0
  150. package/templates/turborepo-pandacss/packages/front-core/src/context/index.ts +2 -0
  151. package/templates/turborepo-pandacss/packages/front-core/src/hooks/index.ts +2 -0
  152. package/templates/turborepo-pandacss/packages/front-core/src/index.ts +4 -0
  153. package/templates/turborepo-pandacss/packages/front-core/src/utils/index.ts +2 -0
  154. package/templates/turborepo-pandacss/packages/front-core/tsconfig.json +14 -0
  155. package/templates/turborepo-pandacss/packages/server-core/package.json +32 -0
  156. package/templates/turborepo-pandacss/packages/server-core/prisma/schema.prisma +102 -0
  157. package/templates/turborepo-pandacss/packages/server-core/prisma/seed.ts +67 -0
  158. package/templates/turborepo-pandacss/packages/server-core/prisma.config.ts +8 -0
  159. package/templates/turborepo-pandacss/packages/server-core/src/__generated__/fabbrica/index.d.ts +270 -0
  160. package/templates/turborepo-pandacss/packages/server-core/src/__generated__/fabbrica/index.js +484 -0
  161. package/templates/turborepo-pandacss/packages/server-core/src/core/result.test.ts +78 -0
  162. package/templates/turborepo-pandacss/packages/server-core/src/core/result.ts +53 -0
  163. package/templates/turborepo-pandacss/packages/server-core/src/domain/.gitkeep +0 -0
  164. package/templates/turborepo-pandacss/packages/server-core/src/domain/entities/User.test.ts +232 -0
  165. package/templates/turborepo-pandacss/packages/server-core/src/domain/entities/User.ts +105 -0
  166. package/templates/turborepo-pandacss/packages/server-core/src/domain/repository-interfaces/IUserRepository.ts +101 -0
  167. package/templates/turborepo-pandacss/packages/server-core/src/infrastructure/database/client.ts +15 -0
  168. package/templates/turborepo-pandacss/packages/server-core/src/infrastructure/database/mappers/UserMapper.test.ts +278 -0
  169. package/templates/turborepo-pandacss/packages/server-core/src/infrastructure/database/mappers/UserMapper.ts +103 -0
  170. package/templates/turborepo-pandacss/packages/server-core/src/infrastructure/database/repositories/UserRepository.test.ts +317 -0
  171. package/templates/turborepo-pandacss/packages/server-core/src/infrastructure/database/repositories/UserRepository.ts +169 -0
  172. package/templates/turborepo-pandacss/packages/server-core/src/testing/factories/index.ts +22 -0
  173. package/templates/turborepo-pandacss/packages/server-core/src/testing/factories/user.factory.ts +123 -0
  174. package/templates/turborepo-pandacss/packages/server-core/src/testing/fixtures/users.ts +92 -0
  175. package/templates/turborepo-pandacss/packages/server-core/src/testing/helpers/date.ts +49 -0
  176. package/templates/turborepo-pandacss/packages/server-core/src/testing/helpers/password.ts +50 -0
  177. package/templates/turborepo-pandacss/packages/server-core/src/testing/index.ts +26 -0
  178. package/templates/turborepo-pandacss/packages/server-core/tsconfig.json +14 -0
  179. package/templates/turborepo-pandacss/packages/server-core/vitest.config.ts +15 -0
  180. package/templates/turborepo-pandacss/packages/ui/package.json +37 -0
  181. package/templates/turborepo-pandacss/packages/ui/src/accordion.tsx +66 -0
  182. package/templates/turborepo-pandacss/packages/ui/src/alert-dialog.tsx +157 -0
  183. package/templates/turborepo-pandacss/packages/ui/src/alert.tsx +66 -0
  184. package/templates/turborepo-pandacss/packages/ui/src/aspect-ratio.tsx +11 -0
  185. package/templates/turborepo-pandacss/packages/ui/src/avatar.tsx +53 -0
  186. package/templates/turborepo-pandacss/packages/ui/src/badge.tsx +46 -0
  187. package/templates/turborepo-pandacss/packages/ui/src/breadcrumb.tsx +108 -0
  188. package/templates/turborepo-pandacss/packages/ui/src/button.tsx +59 -0
  189. package/templates/turborepo-pandacss/packages/ui/src/card.tsx +92 -0
  190. package/templates/turborepo-pandacss/packages/ui/src/checkbox.tsx +32 -0
  191. package/templates/turborepo-pandacss/packages/ui/src/data-table.tsx +216 -0
  192. package/templates/turborepo-pandacss/packages/ui/src/dialog-hook.tsx +226 -0
  193. package/templates/turborepo-pandacss/packages/ui/src/dialog.tsx +143 -0
  194. package/templates/turborepo-pandacss/packages/ui/src/drawer.tsx +135 -0
  195. package/templates/turborepo-pandacss/packages/ui/src/dropdown-menu.tsx +257 -0
  196. package/templates/turborepo-pandacss/packages/ui/src/form.tsx +168 -0
  197. package/templates/turborepo-pandacss/packages/ui/src/hover-card.tsx +44 -0
  198. package/templates/turborepo-pandacss/packages/ui/src/input.tsx +21 -0
  199. package/templates/turborepo-pandacss/packages/ui/src/label.tsx +24 -0
  200. package/templates/turborepo-pandacss/packages/ui/src/lib/utils.ts +6 -0
  201. package/templates/turborepo-pandacss/packages/ui/src/pagination.tsx +126 -0
  202. package/templates/turborepo-pandacss/packages/ui/src/popover.tsx +48 -0
  203. package/templates/turborepo-pandacss/packages/ui/src/progress.tsx +31 -0
  204. package/templates/turborepo-pandacss/packages/ui/src/select.tsx +185 -0
  205. package/templates/turborepo-pandacss/packages/ui/src/separator.tsx +28 -0
  206. package/templates/turborepo-pandacss/packages/ui/src/skeleton.tsx +13 -0
  207. package/templates/turborepo-pandacss/packages/ui/src/sonner.tsx +25 -0
  208. package/templates/turborepo-pandacss/packages/ui/src/table.tsx +116 -0
  209. package/templates/turborepo-pandacss/packages/ui/src/tabs.tsx +66 -0
  210. package/templates/turborepo-pandacss/packages/ui/src/textarea.tsx +18 -0
  211. package/templates/turborepo-pandacss/packages/ui/src/tooltip.tsx +61 -0
  212. package/templates/turborepo-pandacss/packages/ui/src/typography.tsx +187 -0
  213. package/templates/turborepo-pandacss/packages/ui/tsconfig.json +20 -0
  214. package/templates/turborepo-pandacss/panda.config.ts +114 -0
  215. package/templates/turborepo-pandacss/pnpm-lock.yaml +9032 -0
  216. package/templates/turborepo-pandacss/pnpm-workspace.yaml +11 -0
  217. package/templates/turborepo-pandacss/postcss.config.cjs +6 -0
  218. package/templates/turborepo-pandacss/prisma/schema.prisma +82 -0
  219. package/templates/turborepo-pandacss/public/file.svg +1 -0
  220. package/templates/turborepo-pandacss/public/globe.svg +1 -0
  221. package/templates/turborepo-pandacss/public/next.svg +1 -0
  222. package/templates/turborepo-pandacss/public/vercel.svg +1 -0
  223. package/templates/turborepo-pandacss/public/window.svg +1 -0
  224. package/templates/turborepo-pandacss/scripts/cli-template-update.ts +387 -0
  225. package/templates/turborepo-pandacss/scripts/env-show.ts +129 -0
  226. package/templates/turborepo-pandacss/scripts/env.ts +555 -0
  227. package/templates/turborepo-pandacss/scripts/init.sh +92 -0
  228. package/templates/turborepo-pandacss/scripts/setup-dev.ts +640 -0
  229. package/templates/turborepo-pandacss/scripts/template-update.ts +277 -0
  230. package/templates/turborepo-pandacss/scripts/worktree/dev.ts +872 -0
  231. package/templates/turborepo-pandacss/test/globals.d.ts +1 -0
  232. package/templates/turborepo-pandacss/test/setup.ts +22 -0
  233. package/templates/turborepo-pandacss/tsconfig.json +46 -0
  234. package/templates/turborepo-pandacss/turbo.json +57 -0
  235. package/templates/turborepo-pandacss/vitest.config.ts +20 -0
@@ -0,0 +1,158 @@
1
+ import { Slot } from "@radix-ui/react-slot";
2
+ import { type VariantProps, cva } from "class-variance-authority";
3
+ import type React from "react";
4
+
5
+ import { cn } from "{{packageName}}/ui/utils";
6
+
7
+ const typographyVariants = cva("", {
8
+ variants: {
9
+ variant: {
10
+ h1: "scroll-m-20 text-4xl font-extrabold tracking-tight lg:text-5xl",
11
+ h2: "scroll-m-20 border-b pb-2 text-3xl font-semibold tracking-tight first:mt-0",
12
+ h3: "scroll-m-20 text-2xl font-semibold tracking-tight",
13
+ h4: "scroll-m-20 text-xl font-semibold tracking-tight",
14
+ h5: "scroll-m-20 text-lg font-semibold tracking-tight",
15
+ h6: "scroll-m-20 text-base font-semibold tracking-tight",
16
+ p: "leading-7 [&:not(:first-child)]:mt-6",
17
+ blockquote: "mt-6 border-l-2 pl-6 italic",
18
+ code: "relative rounded bg-muted px-[0.3rem] py-[0.2rem] font-mono text-sm font-semibold",
19
+ lead: "text-xl text-muted-foreground",
20
+ large: "text-lg font-semibold",
21
+ small: "text-sm font-medium leading-none",
22
+ muted: "text-sm text-muted-foreground",
23
+ },
24
+ align: {
25
+ left: "text-left",
26
+ center: "text-center",
27
+ right: "text-right",
28
+ justify: "text-justify",
29
+ },
30
+ color: {
31
+ default: "",
32
+ muted: "text-muted-foreground",
33
+ primary: "text-primary",
34
+ secondary: "text-secondary-foreground",
35
+ accent: "text-accent-foreground",
36
+ destructive: "text-destructive",
37
+ },
38
+ },
39
+ defaultVariants: {
40
+ variant: "p",
41
+ align: "left",
42
+ color: "default",
43
+ },
44
+ });
45
+
46
+ interface TypographyProps
47
+ extends Omit<React.HTMLAttributes<HTMLElement>, "color">,
48
+ VariantProps<typeof typographyVariants> {
49
+ asChild?: boolean;
50
+ as?: React.ElementType;
51
+ }
52
+
53
+ function Typography({
54
+ className,
55
+ variant,
56
+ align,
57
+ color,
58
+ asChild = false,
59
+ as,
60
+ ...props
61
+ }: TypographyProps) {
62
+ const Component = asChild ? Slot : as || getDefaultElement(variant || "p");
63
+
64
+ return (
65
+ <Component
66
+ className={cn(typographyVariants({ variant, align, color }), className)}
67
+ {...props}
68
+ />
69
+ );
70
+ }
71
+
72
+ function getDefaultElement(variant: string): React.ElementType {
73
+ switch (variant) {
74
+ case "h1":
75
+ case "h2":
76
+ case "h3":
77
+ case "h4":
78
+ case "h5":
79
+ case "h6":
80
+ return variant;
81
+ case "blockquote":
82
+ return "blockquote";
83
+ case "code":
84
+ return "code";
85
+ default:
86
+ return "p";
87
+ }
88
+ }
89
+
90
+ // 個別のコンポーネントも提供
91
+ const H1 = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLHeadingElement>, "color">) => (
92
+ <Typography variant="h1" as="h1" className={className} {...props} />
93
+ );
94
+
95
+ const H2 = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLHeadingElement>, "color">) => (
96
+ <Typography variant="h2" as="h2" className={className} {...props} />
97
+ );
98
+
99
+ const H3 = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLHeadingElement>, "color">) => (
100
+ <Typography variant="h3" as="h3" className={className} {...props} />
101
+ );
102
+
103
+ const H4 = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLHeadingElement>, "color">) => (
104
+ <Typography variant="h4" as="h4" className={className} {...props} />
105
+ );
106
+
107
+ const P = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLParagraphElement>, "color">) => (
108
+ <Typography variant="p" as="p" className={className} {...props} />
109
+ );
110
+
111
+ const Lead = ({
112
+ className,
113
+ ...props
114
+ }: Omit<React.HTMLAttributes<HTMLParagraphElement>, "color">) => (
115
+ <Typography variant="lead" as="p" className={className} {...props} />
116
+ );
117
+
118
+ const Large = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLDivElement>, "color">) => (
119
+ <Typography variant="large" as="div" className={className} {...props} />
120
+ );
121
+
122
+ const Small = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLElement>, "color">) => (
123
+ <Typography variant="small" as="small" className={className} {...props} />
124
+ );
125
+
126
+ const Muted = ({
127
+ className,
128
+ ...props
129
+ }: Omit<React.HTMLAttributes<HTMLParagraphElement>, "color">) => (
130
+ <Typography variant="muted" as="p" className={className} {...props} />
131
+ );
132
+
133
+ const Blockquote = ({
134
+ className,
135
+ ...props
136
+ }: Omit<React.HTMLAttributes<HTMLQuoteElement>, "color">) => (
137
+ <Typography variant="blockquote" as="blockquote" className={className} {...props} />
138
+ );
139
+
140
+ const InlineCode = ({ className, ...props }: Omit<React.HTMLAttributes<HTMLElement>, "color">) => (
141
+ <Typography variant="code" as="code" className={className} {...props} />
142
+ );
143
+
144
+ export {
145
+ Typography,
146
+ typographyVariants,
147
+ H1,
148
+ H2,
149
+ H3,
150
+ H4,
151
+ P,
152
+ Lead,
153
+ Large,
154
+ Small,
155
+ Muted,
156
+ Blockquote,
157
+ InlineCode,
158
+ };
@@ -0,0 +1,36 @@
1
+ import type { Session } from "next-auth";
2
+ import { redirect } from "next/navigation";
3
+ import React from "react";
4
+ import { auth } from "./index";
5
+
6
+ /**
7
+ * 認証が必要なページコンポーネント用の高階関数
8
+ * セッションを自動的に注入し、未認証時は/signinにリダイレクト
9
+ */
10
+ export function withAuth<P extends Record<string, unknown> = Record<string, unknown>>(
11
+ Component: (props: P & { session: Session }) => React.JSX.Element | Promise<React.JSX.Element>
12
+ ) {
13
+ return async function AuthenticatedComponent(props: P) {
14
+ const session = await auth();
15
+
16
+ if (!session) {
17
+ redirect("/signin");
18
+ }
19
+
20
+ return React.createElement(Component, { ...props, session });
21
+ };
22
+ }
23
+
24
+ /**
25
+ * 認証チェック用のユーティリティ関数
26
+ * セッションを取得し、ない場合は/signinにリダイレクト
27
+ */
28
+ export async function requireAuth() {
29
+ const session = await auth();
30
+
31
+ if (!session) {
32
+ redirect("/signin");
33
+ }
34
+
35
+ return session;
36
+ }
@@ -0,0 +1,22 @@
1
+ import { baseAuthOptions, mergeAuthOptions } from "{{packageName}}/front-core/auth";
2
+ import NextAuth from "next-auth";
3
+
4
+ /**
5
+ * アプリ固有のNextAuth設定
6
+ * baseAuthOptionsを拡張してアプリ固有の設定を追加
7
+ */
8
+ const authOptions = mergeAuthOptions(baseAuthOptions, {
9
+ pages: {
10
+ signIn: "/signin",
11
+ },
12
+ callbacks: {
13
+ async redirect({ url, baseUrl }) {
14
+ if (url.startsWith(baseUrl)) {
15
+ return url;
16
+ }
17
+ return `${baseUrl}/dashboard`;
18
+ },
19
+ },
20
+ });
21
+
22
+ export const { handlers, signIn, signOut, auth } = NextAuth(authOptions);
@@ -0,0 +1,3 @@
1
+ import { prisma } from "{{packageName}}/server-core/infrastructure/database/client";
2
+
3
+ export { prisma };
@@ -0,0 +1,6 @@
1
+ import { type ClassValue, clsx } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs));
6
+ }
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom/vitest";
@@ -0,0 +1 @@
1
+ import "@testing-library/jest-dom/vitest";
@@ -0,0 +1,22 @@
1
+ import { cleanup } from "@testing-library/react";
2
+ import { afterEach, expect, vi } from "vitest";
3
+ import "@testing-library/jest-dom/vitest";
4
+
5
+ // Next.jsの設定モック
6
+ Object.defineProperty(window, "matchMedia", {
7
+ writable: true,
8
+ value: vi.fn().mockImplementation((query) => ({
9
+ matches: false,
10
+ media: query,
11
+ onchange: null,
12
+ addListener: vi.fn(),
13
+ removeListener: vi.fn(),
14
+ addEventListener: vi.fn(),
15
+ removeEventListener: vi.fn(),
16
+ dispatchEvent: vi.fn(),
17
+ })),
18
+ });
19
+
20
+ afterEach(() => {
21
+ cleanup();
22
+ });
@@ -0,0 +1,37 @@
1
+ {
2
+ "extends": "@repo/config/typescript",
3
+ "compilerOptions": {
4
+ "plugins": [
5
+ {
6
+ "name": "next"
7
+ }
8
+ ],
9
+ "paths": {
10
+ "@/*": [
11
+ "./src/*"
12
+ ],
13
+ "@/styled-system/*": [
14
+ "./styled-system/*"
15
+ ],
16
+ "styled-system/*": [
17
+ "./styled-system/*"
18
+ ]
19
+ }
20
+ },
21
+ "include": [
22
+ "next-env.d.ts",
23
+ "vitest.d.ts",
24
+ "test/matchers.d.ts",
25
+ "**/*.ts",
26
+ "**/*.tsx",
27
+ ".next/types/**/*.ts",
28
+ "../../packages/front-core/src/auth/types/**/*.d.ts"
29
+ ],
30
+ "exclude": [
31
+ "node_modules",
32
+ "**/*.test.ts",
33
+ "**/*.test.tsx",
34
+ "**/*.spec.ts",
35
+ "**/*.spec.tsx"
36
+ ]
37
+ }
@@ -0,0 +1,20 @@
1
+ /// <reference types="vitest" />
2
+ /// <reference types="@testing-library/jest-dom/vitest" />
3
+ import path from "node:path";
4
+ import { defineConfig } from "vitest/config";
5
+
6
+ export default defineConfig({
7
+ test: {
8
+ globals: true,
9
+ environment: "jsdom",
10
+ setupFiles: ["./test/setup.ts"],
11
+ typecheck: {
12
+ tsconfig: "./tsconfig.json",
13
+ },
14
+ },
15
+ resolve: {
16
+ alias: {
17
+ "@": path.resolve(__dirname, "./src"),
18
+ },
19
+ },
20
+ });
@@ -0,0 +1,2 @@
1
+ /// <reference types="vitest" />
2
+ /// <reference types="@testing-library/jest-dom/vitest" />
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json",
3
+ "vcs": {
4
+ "enabled": false,
5
+ "clientKind": "git",
6
+ "useIgnoreFile": false
7
+ },
8
+ "files": {
9
+ "ignoreUnknown": false,
10
+ "ignore": [
11
+ "**/node_modules",
12
+ "**/.next",
13
+ "**/.turbo",
14
+ "**/dist",
15
+ "**/build",
16
+ "**/.cache",
17
+ "**/coverage",
18
+ "**/.vercel",
19
+ "**/.pnpm-store",
20
+ "**/styled-system",
21
+ "**/test-results",
22
+ "**/playwright-report",
23
+ "**/.claude"
24
+ ]
25
+ },
26
+ "formatter": {
27
+ "indentStyle": "space",
28
+ "lineWidth": 100
29
+ },
30
+ "linter": {
31
+ "rules": {
32
+ "recommended": true,
33
+ "suspicious": {
34
+ "noExplicitAny": "error"
35
+ },
36
+ "complexity": {
37
+ "noForEach": "off"
38
+ },
39
+ "style": {
40
+ "useImportType": "error",
41
+ "useConst": "error",
42
+ "noParameterAssign": "error",
43
+ "useAsConstAssertion": "error",
44
+ "useDefaultParameterLast": "error",
45
+ "useEnumInitializers": "error",
46
+ "useSelfClosingElements": "error",
47
+ "useSingleVarDeclarator": "error",
48
+ "noUnusedTemplateLiteral": "error",
49
+ "useNumberNamespace": "error",
50
+ "noInferrableTypes": "error",
51
+ "noUselessElse": "error"
52
+ }
53
+ }
54
+ },
55
+ "javascript": {
56
+ "formatter": {
57
+ "trailingCommas": "es5"
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils",
16
+ "ui": "@/components/ui",
17
+ "lib": "@/lib",
18
+ "hooks": "@/hooks"
19
+ },
20
+ "iconLibrary": "lucide"
21
+ }
@@ -0,0 +1,27 @@
1
+ services:
2
+ # PostgreSQL Database for local development
3
+ # 全ワークツリーで共有する単一インスタンス
4
+ # データベース名で分離: main, feature_xxx など
5
+ postgres:
6
+ image: postgres:15-alpine
7
+ container_name: ${POSTGRES_CONTAINER_NAME:-einja-management-postgres}
8
+ restart: unless-stopped
9
+ environment:
10
+ POSTGRES_DB: main
11
+ POSTGRES_USER: postgres
12
+ POSTGRES_PASSWORD: postgres
13
+ # Collation問題を防ぐための設定
14
+ # DockerコンテナとmacOSホスト間のロケール差異を防ぎ、Prisma Migrateを正常動作させる
15
+ POSTGRES_INITDB_ARGS: "--locale=C.UTF-8 --encoding=UTF8"
16
+ ports:
17
+ - "${POSTGRES_PORT:-25432}:5432"
18
+ volumes:
19
+ - postgres_data:/var/lib/postgresql/data
20
+ healthcheck:
21
+ test: ["CMD-SHELL", "pg_isready -U postgres"]
22
+ interval: 30s
23
+ timeout: 10s
24
+ retries: 5
25
+
26
+ volumes:
27
+ postgres_data:
@@ -0,0 +1,32 @@
1
+ import { auth } from "@/lib/auth";
2
+
3
+ export default auth((req) => {
4
+ const { nextUrl } = req;
5
+ const isLoggedIn = !!req.auth;
6
+
7
+ // Protected routes that require authentication
8
+ const protectedRoutes = ["/dashboard", "/profile"];
9
+ const isProtectedRoute = protectedRoutes.some((route) =>
10
+ nextUrl.pathname.startsWith(route),
11
+ );
12
+
13
+ // Public routes that authenticated users shouldn't access
14
+ const publicRoutes = ["/signin", "/signup"];
15
+ const isPublicRoute = publicRoutes.some((route) =>
16
+ nextUrl.pathname.startsWith(route),
17
+ );
18
+
19
+ // Redirect authenticated users away from public routes to dashboard
20
+ if (isLoggedIn && isPublicRoute) {
21
+ return Response.redirect(new URL("/dashboard", nextUrl));
22
+ }
23
+
24
+ // Redirect unauthenticated users to signin
25
+ if (!isLoggedIn && isProtectedRoute) {
26
+ return Response.redirect(new URL("/signin", nextUrl));
27
+ }
28
+ });
29
+
30
+ export const config = {
31
+ matcher: ["/((?!api|_next/static|_next/image|favicon.ico).*)"],
32
+ };
@@ -0,0 +1,10 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {
4
+ eslint: {
5
+ ignoreDuringBuilds: true,
6
+ },
7
+ output: "standalone",
8
+ };
9
+
10
+ export default nextConfig;