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,484 @@
1
+ import { createInitializer, createScreener, getScalarFieldValueGenerator, normalizeResolver, normalizeList, getSequenceCounter, createCallbackChain, destructure } from "@quramy/prisma-fabbrica/lib/internal";
2
+ export { resetSequence, registerScalarFieldValueGenerator, resetScalarFieldValueGenerator } from "@quramy/prisma-fabbrica/lib/internal";
3
+ const initializer = createInitializer();
4
+ const { getClient } = initializer;
5
+ export const { initialize } = initializer;
6
+ const modelFieldDefinitions = [{
7
+ name: "User",
8
+ fields: [{
9
+ name: "accounts",
10
+ type: "Account",
11
+ relationName: "AccountToUser"
12
+ }, {
13
+ name: "sessions",
14
+ type: "Session",
15
+ relationName: "SessionToUser"
16
+ }, {
17
+ name: "Authenticator",
18
+ type: "Authenticator",
19
+ relationName: "AuthenticatorToUser"
20
+ }]
21
+ }, {
22
+ name: "Account",
23
+ fields: [{
24
+ name: "user",
25
+ type: "User",
26
+ relationName: "AccountToUser"
27
+ }]
28
+ }, {
29
+ name: "Session",
30
+ fields: [{
31
+ name: "user",
32
+ type: "User",
33
+ relationName: "SessionToUser"
34
+ }]
35
+ }, {
36
+ name: "VerificationToken",
37
+ fields: []
38
+ }, {
39
+ name: "Authenticator",
40
+ fields: [{
41
+ name: "user",
42
+ type: "User",
43
+ relationName: "AuthenticatorToUser"
44
+ }]
45
+ }];
46
+ function autoGenerateUserScalarsOrEnums({ seq }) {
47
+ return {
48
+ email: getScalarFieldValueGenerator().String({ modelName: "User", fieldName: "email", isId: false, isUnique: true, seq })
49
+ };
50
+ }
51
+ function defineUserFactoryInternal({ defaultData: defaultDataResolver, onAfterBuild, onBeforeCreate, onAfterCreate, traits: traitsDefs = {} }, defaultTransientFieldValues) {
52
+ const getFactoryWithTraits = (traitKeys = []) => {
53
+ const seqKey = {};
54
+ const getSeq = () => getSequenceCounter(seqKey);
55
+ const screen = createScreener("User", modelFieldDefinitions);
56
+ const handleAfterBuild = createCallbackChain([
57
+ onAfterBuild,
58
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterBuild; }),
59
+ ]);
60
+ const handleBeforeCreate = createCallbackChain([
61
+ ...traitKeys.slice().reverse().map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onBeforeCreate; }),
62
+ onBeforeCreate,
63
+ ]);
64
+ const handleAfterCreate = createCallbackChain([
65
+ onAfterCreate,
66
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterCreate; }),
67
+ ]);
68
+ const build = async (inputData = {}) => {
69
+ const seq = getSeq();
70
+ const requiredScalarData = autoGenerateUserScalarsOrEnums({ seq });
71
+ const resolveValue = normalizeResolver(defaultDataResolver !== null && defaultDataResolver !== void 0 ? defaultDataResolver : {});
72
+ const [transientFields, filteredInputData] = destructure(defaultTransientFieldValues, inputData);
73
+ const resolverInput = Object.assign({ seq }, transientFields);
74
+ const defaultData = await traitKeys.reduce(async (queue, traitKey) => {
75
+ var _a, _b;
76
+ const acc = await queue;
77
+ const resolveTraitValue = normalizeResolver((_b = (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {});
78
+ const traitData = await resolveTraitValue(resolverInput);
79
+ return Object.assign(Object.assign({}, acc), traitData);
80
+ }, resolveValue(resolverInput));
81
+ const defaultAssociations = {};
82
+ const data = Object.assign(Object.assign(Object.assign(Object.assign({}, requiredScalarData), defaultData), defaultAssociations), filteredInputData);
83
+ await handleAfterBuild(data, transientFields);
84
+ return data;
85
+ };
86
+ const buildList = (...args) => Promise.all(normalizeList(...args).map(data => build(data)));
87
+ const pickForConnect = (inputData) => ({
88
+ id: inputData.id
89
+ });
90
+ const create = async (inputData = {}) => {
91
+ const data = await build(Object.assign({}, inputData)).then(screen);
92
+ const [transientFields] = destructure(defaultTransientFieldValues, inputData);
93
+ await handleBeforeCreate(data, transientFields);
94
+ const createdData = await getClient().user.create({ data });
95
+ await handleAfterCreate(createdData, transientFields);
96
+ return createdData;
97
+ };
98
+ const createList = (...args) => Promise.all(normalizeList(...args).map(data => create(data)));
99
+ const createForConnect = (inputData = {}) => create(inputData).then(pickForConnect);
100
+ return {
101
+ _factoryFor: "User",
102
+ build,
103
+ buildList,
104
+ buildCreateInput: build,
105
+ pickForConnect,
106
+ create,
107
+ createList,
108
+ createForConnect,
109
+ };
110
+ };
111
+ const factory = getFactoryWithTraits();
112
+ const useTraits = (name, ...names) => {
113
+ return getFactoryWithTraits([name, ...names]);
114
+ };
115
+ return Object.assign(Object.assign({}, factory), { use: useTraits });
116
+ }
117
+ /**
118
+ * Define factory for {@link User} model.
119
+ *
120
+ * @param options
121
+ * @returns factory {@link UserFactoryInterface}
122
+ */
123
+ export const defineUserFactory = ((options) => {
124
+ return defineUserFactoryInternal(options !== null && options !== void 0 ? options : {}, {});
125
+ });
126
+ defineUserFactory.withTransientFields = defaultTransientFieldValues => options => defineUserFactoryInternal(options !== null && options !== void 0 ? options : {}, defaultTransientFieldValues);
127
+ function isAccountuserFactory(x) {
128
+ return (x === null || x === void 0 ? void 0 : x._factoryFor) === "User";
129
+ }
130
+ function autoGenerateAccountScalarsOrEnums({ seq }) {
131
+ return {
132
+ type: getScalarFieldValueGenerator().String({ modelName: "Account", fieldName: "type", isId: false, isUnique: false, seq }),
133
+ provider: getScalarFieldValueGenerator().String({ modelName: "Account", fieldName: "provider", isId: true, isUnique: false, seq }),
134
+ providerAccountId: getScalarFieldValueGenerator().String({ modelName: "Account", fieldName: "providerAccountId", isId: true, isUnique: false, seq })
135
+ };
136
+ }
137
+ function defineAccountFactoryInternal({ defaultData: defaultDataResolver, onAfterBuild, onBeforeCreate, onAfterCreate, traits: traitsDefs = {} }, defaultTransientFieldValues) {
138
+ const getFactoryWithTraits = (traitKeys = []) => {
139
+ const seqKey = {};
140
+ const getSeq = () => getSequenceCounter(seqKey);
141
+ const screen = createScreener("Account", modelFieldDefinitions);
142
+ const handleAfterBuild = createCallbackChain([
143
+ onAfterBuild,
144
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterBuild; }),
145
+ ]);
146
+ const handleBeforeCreate = createCallbackChain([
147
+ ...traitKeys.slice().reverse().map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onBeforeCreate; }),
148
+ onBeforeCreate,
149
+ ]);
150
+ const handleAfterCreate = createCallbackChain([
151
+ onAfterCreate,
152
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterCreate; }),
153
+ ]);
154
+ const build = async (inputData = {}) => {
155
+ const seq = getSeq();
156
+ const requiredScalarData = autoGenerateAccountScalarsOrEnums({ seq });
157
+ const resolveValue = normalizeResolver(defaultDataResolver);
158
+ const [transientFields, filteredInputData] = destructure(defaultTransientFieldValues, inputData);
159
+ const resolverInput = Object.assign({ seq }, transientFields);
160
+ const defaultData = await traitKeys.reduce(async (queue, traitKey) => {
161
+ var _a, _b;
162
+ const acc = await queue;
163
+ const resolveTraitValue = normalizeResolver((_b = (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {});
164
+ const traitData = await resolveTraitValue(resolverInput);
165
+ return Object.assign(Object.assign({}, acc), traitData);
166
+ }, resolveValue(resolverInput));
167
+ const defaultAssociations = {
168
+ user: isAccountuserFactory(defaultData.user) ? {
169
+ create: await defaultData.user.build()
170
+ } : defaultData.user
171
+ };
172
+ const data = Object.assign(Object.assign(Object.assign(Object.assign({}, requiredScalarData), defaultData), defaultAssociations), filteredInputData);
173
+ await handleAfterBuild(data, transientFields);
174
+ return data;
175
+ };
176
+ const buildList = (...args) => Promise.all(normalizeList(...args).map(data => build(data)));
177
+ const pickForConnect = (inputData) => ({
178
+ provider: inputData.provider,
179
+ providerAccountId: inputData.providerAccountId
180
+ });
181
+ const create = async (inputData = {}) => {
182
+ const data = await build(Object.assign({}, inputData)).then(screen);
183
+ const [transientFields] = destructure(defaultTransientFieldValues, inputData);
184
+ await handleBeforeCreate(data, transientFields);
185
+ const createdData = await getClient().account.create({ data });
186
+ await handleAfterCreate(createdData, transientFields);
187
+ return createdData;
188
+ };
189
+ const createList = (...args) => Promise.all(normalizeList(...args).map(data => create(data)));
190
+ const createForConnect = (inputData = {}) => create(inputData).then(pickForConnect);
191
+ return {
192
+ _factoryFor: "Account",
193
+ build,
194
+ buildList,
195
+ buildCreateInput: build,
196
+ pickForConnect,
197
+ create,
198
+ createList,
199
+ createForConnect,
200
+ };
201
+ };
202
+ const factory = getFactoryWithTraits();
203
+ const useTraits = (name, ...names) => {
204
+ return getFactoryWithTraits([name, ...names]);
205
+ };
206
+ return Object.assign(Object.assign({}, factory), { use: useTraits });
207
+ }
208
+ /**
209
+ * Define factory for {@link Account} model.
210
+ *
211
+ * @param options
212
+ * @returns factory {@link AccountFactoryInterface}
213
+ */
214
+ export const defineAccountFactory = ((options) => {
215
+ return defineAccountFactoryInternal(options, {});
216
+ });
217
+ defineAccountFactory.withTransientFields = defaultTransientFieldValues => options => defineAccountFactoryInternal(options, defaultTransientFieldValues);
218
+ function isSessionuserFactory(x) {
219
+ return (x === null || x === void 0 ? void 0 : x._factoryFor) === "User";
220
+ }
221
+ function autoGenerateSessionScalarsOrEnums({ seq }) {
222
+ return {
223
+ sessionToken: getScalarFieldValueGenerator().String({ modelName: "Session", fieldName: "sessionToken", isId: false, isUnique: true, seq }),
224
+ expires: getScalarFieldValueGenerator().DateTime({ modelName: "Session", fieldName: "expires", isId: false, isUnique: false, seq })
225
+ };
226
+ }
227
+ function defineSessionFactoryInternal({ defaultData: defaultDataResolver, onAfterBuild, onBeforeCreate, onAfterCreate, traits: traitsDefs = {} }, defaultTransientFieldValues) {
228
+ const getFactoryWithTraits = (traitKeys = []) => {
229
+ const seqKey = {};
230
+ const getSeq = () => getSequenceCounter(seqKey);
231
+ const screen = createScreener("Session", modelFieldDefinitions);
232
+ const handleAfterBuild = createCallbackChain([
233
+ onAfterBuild,
234
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterBuild; }),
235
+ ]);
236
+ const handleBeforeCreate = createCallbackChain([
237
+ ...traitKeys.slice().reverse().map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onBeforeCreate; }),
238
+ onBeforeCreate,
239
+ ]);
240
+ const handleAfterCreate = createCallbackChain([
241
+ onAfterCreate,
242
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterCreate; }),
243
+ ]);
244
+ const build = async (inputData = {}) => {
245
+ const seq = getSeq();
246
+ const requiredScalarData = autoGenerateSessionScalarsOrEnums({ seq });
247
+ const resolveValue = normalizeResolver(defaultDataResolver);
248
+ const [transientFields, filteredInputData] = destructure(defaultTransientFieldValues, inputData);
249
+ const resolverInput = Object.assign({ seq }, transientFields);
250
+ const defaultData = await traitKeys.reduce(async (queue, traitKey) => {
251
+ var _a, _b;
252
+ const acc = await queue;
253
+ const resolveTraitValue = normalizeResolver((_b = (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {});
254
+ const traitData = await resolveTraitValue(resolverInput);
255
+ return Object.assign(Object.assign({}, acc), traitData);
256
+ }, resolveValue(resolverInput));
257
+ const defaultAssociations = {
258
+ user: isSessionuserFactory(defaultData.user) ? {
259
+ create: await defaultData.user.build()
260
+ } : defaultData.user
261
+ };
262
+ const data = Object.assign(Object.assign(Object.assign(Object.assign({}, requiredScalarData), defaultData), defaultAssociations), filteredInputData);
263
+ await handleAfterBuild(data, transientFields);
264
+ return data;
265
+ };
266
+ const buildList = (...args) => Promise.all(normalizeList(...args).map(data => build(data)));
267
+ const pickForConnect = (inputData) => ({
268
+ sessionToken: inputData.sessionToken
269
+ });
270
+ const create = async (inputData = {}) => {
271
+ const data = await build(Object.assign({}, inputData)).then(screen);
272
+ const [transientFields] = destructure(defaultTransientFieldValues, inputData);
273
+ await handleBeforeCreate(data, transientFields);
274
+ const createdData = await getClient().session.create({ data });
275
+ await handleAfterCreate(createdData, transientFields);
276
+ return createdData;
277
+ };
278
+ const createList = (...args) => Promise.all(normalizeList(...args).map(data => create(data)));
279
+ const createForConnect = (inputData = {}) => create(inputData).then(pickForConnect);
280
+ return {
281
+ _factoryFor: "Session",
282
+ build,
283
+ buildList,
284
+ buildCreateInput: build,
285
+ pickForConnect,
286
+ create,
287
+ createList,
288
+ createForConnect,
289
+ };
290
+ };
291
+ const factory = getFactoryWithTraits();
292
+ const useTraits = (name, ...names) => {
293
+ return getFactoryWithTraits([name, ...names]);
294
+ };
295
+ return Object.assign(Object.assign({}, factory), { use: useTraits });
296
+ }
297
+ /**
298
+ * Define factory for {@link Session} model.
299
+ *
300
+ * @param options
301
+ * @returns factory {@link SessionFactoryInterface}
302
+ */
303
+ export const defineSessionFactory = ((options) => {
304
+ return defineSessionFactoryInternal(options, {});
305
+ });
306
+ defineSessionFactory.withTransientFields = defaultTransientFieldValues => options => defineSessionFactoryInternal(options, defaultTransientFieldValues);
307
+ function autoGenerateVerificationTokenScalarsOrEnums({ seq }) {
308
+ return {
309
+ identifier: getScalarFieldValueGenerator().String({ modelName: "VerificationToken", fieldName: "identifier", isId: true, isUnique: false, seq }),
310
+ token: getScalarFieldValueGenerator().String({ modelName: "VerificationToken", fieldName: "token", isId: true, isUnique: false, seq }),
311
+ expires: getScalarFieldValueGenerator().DateTime({ modelName: "VerificationToken", fieldName: "expires", isId: false, isUnique: false, seq })
312
+ };
313
+ }
314
+ function defineVerificationTokenFactoryInternal({ defaultData: defaultDataResolver, onAfterBuild, onBeforeCreate, onAfterCreate, traits: traitsDefs = {} }, defaultTransientFieldValues) {
315
+ const getFactoryWithTraits = (traitKeys = []) => {
316
+ const seqKey = {};
317
+ const getSeq = () => getSequenceCounter(seqKey);
318
+ const screen = createScreener("VerificationToken", modelFieldDefinitions);
319
+ const handleAfterBuild = createCallbackChain([
320
+ onAfterBuild,
321
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterBuild; }),
322
+ ]);
323
+ const handleBeforeCreate = createCallbackChain([
324
+ ...traitKeys.slice().reverse().map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onBeforeCreate; }),
325
+ onBeforeCreate,
326
+ ]);
327
+ const handleAfterCreate = createCallbackChain([
328
+ onAfterCreate,
329
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterCreate; }),
330
+ ]);
331
+ const build = async (inputData = {}) => {
332
+ const seq = getSeq();
333
+ const requiredScalarData = autoGenerateVerificationTokenScalarsOrEnums({ seq });
334
+ const resolveValue = normalizeResolver(defaultDataResolver !== null && defaultDataResolver !== void 0 ? defaultDataResolver : {});
335
+ const [transientFields, filteredInputData] = destructure(defaultTransientFieldValues, inputData);
336
+ const resolverInput = Object.assign({ seq }, transientFields);
337
+ const defaultData = await traitKeys.reduce(async (queue, traitKey) => {
338
+ var _a, _b;
339
+ const acc = await queue;
340
+ const resolveTraitValue = normalizeResolver((_b = (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {});
341
+ const traitData = await resolveTraitValue(resolverInput);
342
+ return Object.assign(Object.assign({}, acc), traitData);
343
+ }, resolveValue(resolverInput));
344
+ const defaultAssociations = {};
345
+ const data = Object.assign(Object.assign(Object.assign(Object.assign({}, requiredScalarData), defaultData), defaultAssociations), filteredInputData);
346
+ await handleAfterBuild(data, transientFields);
347
+ return data;
348
+ };
349
+ const buildList = (...args) => Promise.all(normalizeList(...args).map(data => build(data)));
350
+ const pickForConnect = (inputData) => ({
351
+ identifier: inputData.identifier,
352
+ token: inputData.token
353
+ });
354
+ const create = async (inputData = {}) => {
355
+ const data = await build(Object.assign({}, inputData)).then(screen);
356
+ const [transientFields] = destructure(defaultTransientFieldValues, inputData);
357
+ await handleBeforeCreate(data, transientFields);
358
+ const createdData = await getClient().verificationToken.create({ data });
359
+ await handleAfterCreate(createdData, transientFields);
360
+ return createdData;
361
+ };
362
+ const createList = (...args) => Promise.all(normalizeList(...args).map(data => create(data)));
363
+ const createForConnect = (inputData = {}) => create(inputData).then(pickForConnect);
364
+ return {
365
+ _factoryFor: "VerificationToken",
366
+ build,
367
+ buildList,
368
+ buildCreateInput: build,
369
+ pickForConnect,
370
+ create,
371
+ createList,
372
+ createForConnect,
373
+ };
374
+ };
375
+ const factory = getFactoryWithTraits();
376
+ const useTraits = (name, ...names) => {
377
+ return getFactoryWithTraits([name, ...names]);
378
+ };
379
+ return Object.assign(Object.assign({}, factory), { use: useTraits });
380
+ }
381
+ /**
382
+ * Define factory for {@link VerificationToken} model.
383
+ *
384
+ * @param options
385
+ * @returns factory {@link VerificationTokenFactoryInterface}
386
+ */
387
+ export const defineVerificationTokenFactory = ((options) => {
388
+ return defineVerificationTokenFactoryInternal(options !== null && options !== void 0 ? options : {}, {});
389
+ });
390
+ defineVerificationTokenFactory.withTransientFields = defaultTransientFieldValues => options => defineVerificationTokenFactoryInternal(options !== null && options !== void 0 ? options : {}, defaultTransientFieldValues);
391
+ function isAuthenticatoruserFactory(x) {
392
+ return (x === null || x === void 0 ? void 0 : x._factoryFor) === "User";
393
+ }
394
+ function autoGenerateAuthenticatorScalarsOrEnums({ seq }) {
395
+ return {
396
+ credentialID: getScalarFieldValueGenerator().String({ modelName: "Authenticator", fieldName: "credentialID", isId: true, isUnique: true, seq }),
397
+ providerAccountId: getScalarFieldValueGenerator().String({ modelName: "Authenticator", fieldName: "providerAccountId", isId: false, isUnique: false, seq }),
398
+ credentialPublicKey: getScalarFieldValueGenerator().String({ modelName: "Authenticator", fieldName: "credentialPublicKey", isId: false, isUnique: false, seq }),
399
+ counter: getScalarFieldValueGenerator().Int({ modelName: "Authenticator", fieldName: "counter", isId: false, isUnique: false, seq }),
400
+ credentialDeviceType: getScalarFieldValueGenerator().String({ modelName: "Authenticator", fieldName: "credentialDeviceType", isId: false, isUnique: false, seq }),
401
+ credentialBackedUp: getScalarFieldValueGenerator().Boolean({ modelName: "Authenticator", fieldName: "credentialBackedUp", isId: false, isUnique: false, seq })
402
+ };
403
+ }
404
+ function defineAuthenticatorFactoryInternal({ defaultData: defaultDataResolver, onAfterBuild, onBeforeCreate, onAfterCreate, traits: traitsDefs = {} }, defaultTransientFieldValues) {
405
+ const getFactoryWithTraits = (traitKeys = []) => {
406
+ const seqKey = {};
407
+ const getSeq = () => getSequenceCounter(seqKey);
408
+ const screen = createScreener("Authenticator", modelFieldDefinitions);
409
+ const handleAfterBuild = createCallbackChain([
410
+ onAfterBuild,
411
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterBuild; }),
412
+ ]);
413
+ const handleBeforeCreate = createCallbackChain([
414
+ ...traitKeys.slice().reverse().map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onBeforeCreate; }),
415
+ onBeforeCreate,
416
+ ]);
417
+ const handleAfterCreate = createCallbackChain([
418
+ onAfterCreate,
419
+ ...traitKeys.map(traitKey => { var _a; return (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.onAfterCreate; }),
420
+ ]);
421
+ const build = async (inputData = {}) => {
422
+ const seq = getSeq();
423
+ const requiredScalarData = autoGenerateAuthenticatorScalarsOrEnums({ seq });
424
+ const resolveValue = normalizeResolver(defaultDataResolver);
425
+ const [transientFields, filteredInputData] = destructure(defaultTransientFieldValues, inputData);
426
+ const resolverInput = Object.assign({ seq }, transientFields);
427
+ const defaultData = await traitKeys.reduce(async (queue, traitKey) => {
428
+ var _a, _b;
429
+ const acc = await queue;
430
+ const resolveTraitValue = normalizeResolver((_b = (_a = traitsDefs[traitKey]) === null || _a === void 0 ? void 0 : _a.data) !== null && _b !== void 0 ? _b : {});
431
+ const traitData = await resolveTraitValue(resolverInput);
432
+ return Object.assign(Object.assign({}, acc), traitData);
433
+ }, resolveValue(resolverInput));
434
+ const defaultAssociations = {
435
+ user: isAuthenticatoruserFactory(defaultData.user) ? {
436
+ create: await defaultData.user.build()
437
+ } : defaultData.user
438
+ };
439
+ const data = Object.assign(Object.assign(Object.assign(Object.assign({}, requiredScalarData), defaultData), defaultAssociations), filteredInputData);
440
+ await handleAfterBuild(data, transientFields);
441
+ return data;
442
+ };
443
+ const buildList = (...args) => Promise.all(normalizeList(...args).map(data => build(data)));
444
+ const pickForConnect = (inputData) => ({
445
+ userId: inputData.userId,
446
+ credentialID: inputData.credentialID
447
+ });
448
+ const create = async (inputData = {}) => {
449
+ const data = await build(Object.assign({}, inputData)).then(screen);
450
+ const [transientFields] = destructure(defaultTransientFieldValues, inputData);
451
+ await handleBeforeCreate(data, transientFields);
452
+ const createdData = await getClient().authenticator.create({ data });
453
+ await handleAfterCreate(createdData, transientFields);
454
+ return createdData;
455
+ };
456
+ const createList = (...args) => Promise.all(normalizeList(...args).map(data => create(data)));
457
+ const createForConnect = (inputData = {}) => create(inputData).then(pickForConnect);
458
+ return {
459
+ _factoryFor: "Authenticator",
460
+ build,
461
+ buildList,
462
+ buildCreateInput: build,
463
+ pickForConnect,
464
+ create,
465
+ createList,
466
+ createForConnect,
467
+ };
468
+ };
469
+ const factory = getFactoryWithTraits();
470
+ const useTraits = (name, ...names) => {
471
+ return getFactoryWithTraits([name, ...names]);
472
+ };
473
+ return Object.assign(Object.assign({}, factory), { use: useTraits });
474
+ }
475
+ /**
476
+ * Define factory for {@link Authenticator} model.
477
+ *
478
+ * @param options
479
+ * @returns factory {@link AuthenticatorFactoryInterface}
480
+ */
481
+ export const defineAuthenticatorFactory = ((options) => {
482
+ return defineAuthenticatorFactoryInternal(options, {});
483
+ });
484
+ defineAuthenticatorFactory.withTransientFields = defaultTransientFieldValues => options => defineAuthenticatorFactoryInternal(options, defaultTransientFieldValues);
@@ -0,0 +1,78 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { failure, isFailure, isSuccess, success } from "./result";
3
+
4
+ describe("Result型ユーティリティ", () => {
5
+ describe("success", () => {
6
+ it("payloadをラップした成功Resultを返す", () => {
7
+ // Given
8
+ const value = { id: "1", name: "test" };
9
+
10
+ // When
11
+ const result = success(value);
12
+
13
+ // Then
14
+ expect(result.isSuccess).toBe(true);
15
+ expect(result.value).toEqual(value);
16
+ });
17
+
18
+ it("プリミティブ値でも成功Resultを返す", () => {
19
+ // Given
20
+ const value = 42;
21
+
22
+ // When
23
+ const result = success(value);
24
+
25
+ // Then
26
+ expect(result.isSuccess).toBe(true);
27
+ expect(result.value).toBe(42);
28
+ });
29
+ });
30
+
31
+ describe("failure", () => {
32
+ it("エラーコンテキストを保持した失敗Resultを返す", () => {
33
+ // Given
34
+ const error = new Error("Something went wrong");
35
+
36
+ // When
37
+ const result = failure(error);
38
+
39
+ // Then
40
+ expect(result.isSuccess).toBe(false);
41
+ expect(result.error).toBe(error);
42
+ expect(result.error.message).toBe("Something went wrong");
43
+ });
44
+
45
+ it("カスタムエラー型も保持できる", () => {
46
+ // Given
47
+ type CustomError = { code: string; message: string };
48
+ const error: CustomError = { code: "NOT_FOUND", message: "User not found" };
49
+
50
+ // When
51
+ const result = failure(error);
52
+
53
+ // Then
54
+ expect(result.isSuccess).toBe(false);
55
+ expect(result.error).toEqual({ code: "NOT_FOUND", message: "User not found" });
56
+ });
57
+ });
58
+
59
+ describe("isSuccess / isFailure", () => {
60
+ it("isSuccessは成功Resultに対してtrueを返す", () => {
61
+ // Given
62
+ const result = success(42);
63
+
64
+ // When & Then
65
+ expect(isSuccess(result)).toBe(true);
66
+ expect(isFailure(result)).toBe(false);
67
+ });
68
+
69
+ it("isFailureは失敗Resultに対してtrueを返す", () => {
70
+ // Given
71
+ const result = failure(new Error("Failed"));
72
+
73
+ // When & Then
74
+ expect(isSuccess(result)).toBe(false);
75
+ expect(isFailure(result)).toBe(true);
76
+ });
77
+ });
78
+ });
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Result型
3
+ * 例外を使わないエラーハンドリングパターン
4
+ */
5
+
6
+ /**
7
+ * 成功を表す型
8
+ */
9
+ export type Success<T> = {
10
+ readonly isSuccess: true;
11
+ readonly value: T;
12
+ };
13
+
14
+ /**
15
+ * 失敗を表す型
16
+ */
17
+ export type Failure<E> = {
18
+ readonly isSuccess: false;
19
+ readonly error: E;
20
+ };
21
+
22
+ /**
23
+ * 成功または失敗を表すResult型
24
+ */
25
+ export type Result<T, E = Error> = Success<T> | Failure<E>;
26
+
27
+ /**
28
+ * 成功を生成する
29
+ */
30
+ export function success<T>(value: T): Success<T> {
31
+ return { isSuccess: true, value };
32
+ }
33
+
34
+ /**
35
+ * 失敗を生成する
36
+ */
37
+ export function failure<E>(error: E): Failure<E> {
38
+ return { isSuccess: false, error };
39
+ }
40
+
41
+ /**
42
+ * Resultが成功かどうかを判定する型ガード
43
+ */
44
+ export function isSuccess<T, E>(result: Result<T, E>): result is Success<T> {
45
+ return result.isSuccess;
46
+ }
47
+
48
+ /**
49
+ * Resultが失敗かどうかを判定する型ガード
50
+ */
51
+ export function isFailure<T, E>(result: Result<T, E>): result is Failure<E> {
52
+ return !result.isSuccess;
53
+ }