arkos 1.4.11-beta → 1.4.12-beta

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 (95) hide show
  1. package/dist/cjs/components/arkos-policy/index.js +38 -0
  2. package/dist/cjs/components/arkos-policy/index.js.map +1 -0
  3. package/dist/cjs/{types/arkos-prisma-input.bak.js → components/arkos-policy/types.js} +1 -1
  4. package/dist/cjs/components/arkos-policy/types.js.map +1 -0
  5. package/dist/cjs/exports/config.js +6 -0
  6. package/dist/cjs/exports/config.js.map +1 -0
  7. package/dist/cjs/modules/auth/auth.service.js +1 -1
  8. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  9. package/dist/cjs/modules/error-handler/error-handler.controller.js +1 -1
  10. package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
  11. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +288 -0
  12. package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
  13. package/dist/cjs/types/arkos-config/utils.js +3 -0
  14. package/dist/cjs/types/arkos-config/utils.js.map +1 -0
  15. package/dist/cjs/types/arkos-prisma-input.js.map +1 -1
  16. package/dist/cjs/types/arkos.js +3 -0
  17. package/dist/cjs/types/arkos.js.map +1 -0
  18. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +152 -0
  19. package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
  20. package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
  21. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
  22. package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  23. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
  24. package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  25. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +51 -0
  26. package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
  27. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
  28. package/dist/cjs/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  29. package/dist/cjs/utils/features/api.features.js +0 -3
  30. package/dist/cjs/utils/features/api.features.js.map +1 -1
  31. package/dist/cjs/utils/helpers/api.features.helpers.js +20 -0
  32. package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
  33. package/dist/cjs/utils/helpers/exit-error.js +12 -0
  34. package/dist/cjs/utils/helpers/exit-error.js.map +1 -0
  35. package/dist/cjs/utils/initialize-app.js +56 -0
  36. package/dist/cjs/utils/initialize-app.js.map +1 -0
  37. package/dist/cjs/utils/setup-app.js +119 -0
  38. package/dist/cjs/utils/setup-app.js.map +1 -0
  39. package/dist/esm/components/arkos-policy/index.js +32 -0
  40. package/dist/esm/components/arkos-policy/index.js.map +1 -0
  41. package/dist/esm/components/arkos-policy/types.js +2 -0
  42. package/dist/esm/components/arkos-policy/types.js.map +1 -0
  43. package/dist/esm/exports/config.js +3 -0
  44. package/dist/esm/exports/config.js.map +1 -0
  45. package/dist/esm/modules/auth/auth.service.js +1 -1
  46. package/dist/esm/modules/auth/auth.service.js.map +1 -1
  47. package/dist/esm/modules/error-handler/error-handler.controller.js +1 -1
  48. package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
  49. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +285 -0
  50. package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -0
  51. package/dist/esm/types/arkos-config/utils.js +2 -0
  52. package/dist/esm/types/arkos-config/utils.js.map +1 -0
  53. package/dist/esm/types/arkos-prisma-input.js.map +1 -1
  54. package/dist/esm/types/arkos.js +2 -0
  55. package/dist/esm/types/arkos.js.map +1 -0
  56. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +146 -0
  57. package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -0
  58. package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
  59. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js +208 -0
  60. package/dist/esm/utils/cli/utils/template-generator/templates/class-validator-dto-generator.js.map +1 -1
  61. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +143 -39
  62. package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
  63. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +45 -0
  64. package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -0
  65. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js +169 -0
  66. package/dist/esm/utils/cli/utils/template-generator/templates/zod-schema-generator.js.map +1 -1
  67. package/dist/esm/utils/features/api.features.js +0 -3
  68. package/dist/esm/utils/features/api.features.js.map +1 -1
  69. package/dist/esm/utils/helpers/api.features.helpers.js +20 -0
  70. package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
  71. package/dist/esm/utils/helpers/exit-error.js +6 -0
  72. package/dist/esm/utils/helpers/exit-error.js.map +1 -0
  73. package/dist/esm/utils/initialize-app.js +50 -0
  74. package/dist/esm/utils/initialize-app.js.map +1 -0
  75. package/dist/esm/utils/setup-app.js +113 -0
  76. package/dist/esm/utils/setup-app.js.map +1 -0
  77. package/dist/types/components/arkos-policy/index.d.ts +31 -0
  78. package/dist/types/components/arkos-policy/types.d.ts +21 -0
  79. package/dist/types/exports/config.d.ts +2 -0
  80. package/dist/types/modules/swagger/utils/get-open-api-login-html.d.ts +1 -0
  81. package/dist/types/types/arkos-config/utils.d.ts +31 -0
  82. package/dist/types/types/arkos-prisma-input.d.ts +1 -1
  83. package/dist/types/types/arkos.d.ts +31 -0
  84. package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +7 -0
  85. package/dist/types/utils/cli/utils/template-generator/templates/class-validator-dto-generator.d.ts +4 -0
  86. package/dist/types/utils/cli/utils/template-generator/templates/policy-template.d.ts +2 -0
  87. package/dist/types/utils/cli/utils/template-generator/templates/zod-schema-generator.d.ts +4 -0
  88. package/dist/types/utils/helpers/exit-error.d.ts +1 -0
  89. package/dist/types/utils/initialize-app.d.ts +2 -0
  90. package/dist/types/utils/setup-app.d.ts +2 -0
  91. package/package.json +55 -55
  92. package/dist/cjs/types/arkos-prisma-input.bak.js.map +0 -1
  93. package/dist/esm/types/arkos-prisma-input.bak.js +0 -2
  94. package/dist/esm/types/arkos-prisma-input.bak.js.map +0 -1
  95. package/dist/types/types/arkos-prisma-input.bak.d.ts +0 -237
@@ -1 +1 @@
1
- {"version":3,"file":"arkos-prisma-input.js","sourceRoot":"","sources":["../../../src/types/arkos-prisma-input.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Helper type to exclude properties from T that exist in U\n * Used internally by XOR to create mutually exclusive types\n */\ntype Without<T, U> = {\n [P in Exclude<keyof T, keyof U>]?: never;\n};\n/**\n * XOR (Exclusive OR) type for mutually exclusive union types\n * Ensures that properties from T and U cannot be mixed together\n * @see https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\ntype XOR<T, U> = T extends object\n ? U extends object\n ? (Without<T, U> & U) | (Without<U, T> & T)\n : U\n : T;\ntype Unpack<T> = T;\n/**\n * Checks if a field is an array relation (one-to-many or many-to-many)\n * Identified by the presence of createMany property\n */\nexport type IsArrayRelation<T> =\n Exclude<T, undefined> extends never\n ? false\n : Exclude<T, undefined> extends { createMany?: any }\n ? true\n : false;\n/**\n * Checks if a field is an object relation (one-to-one or many-to-one)\n * Identified by the presence of relation operations without being an array\n */\nexport type IsObjectRelation<T> =\n Exclude<T, undefined> extends Array<any>\n ? false\n : Exclude<T, undefined> extends\n | {\n create?: any;\n }\n | {\n connect?: any;\n }\n | {\n connectOrCreate?: any;\n }\n | {\n update?: any;\n }\n | {\n delete?: any;\n }\n | {\n disconnect?: any;\n }\n ? true\n : false;\ntype ExtractCreateTypeArray<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? U extends Array<infer I>\n ? (Omit<I, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : never\n : never;\ntype ExtractConnectTypeArray<\n T,\n A extends\n | \"connect\"\n | \"delete\"\n | \"update\"\n | \"disconnect\"\n | \"deleteMany\"\n | \"set\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n })[]\n : never\n : never;\ntype ExtractUpdateTypeArray<T> =\n Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n update?: infer U;\n }\n ? U extends Array<infer UpdateItem>\n ? UpdateItem extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : U extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : never\n : never;\ntype ExtractCreateTypeObject<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n }\n : never\n : never\n : never;\ntype ExtractConnectTypeObject<\n T,\n A extends \"connect\" | \"delete\" | \"update\" | \"disconnect\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n }\n : never\n : never\n : never;\ntype ExtractUpdateTypeObject<T> =\n Exclude<T, undefined> extends {\n update?: infer U;\n }\n ? U extends {\n where: infer W;\n data: infer D;\n }\n ? (W & D) & {\n apiAction?: \"update\";\n }\n : Exclude<Extract<U, object>, Array<any>> & {\n apiAction?: \"update\";\n }\n : never;\ntype FlattenArrayRelation<T> =\n | (ExtractCreateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeArray<T>>)\n | (ExtractConnectTypeArray<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeArray<T, \"connect\">>)\n | (ExtractUpdateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeArray<T>>)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n deleteMany?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"deleteMany\">> & {\n apiAction: \"deleteMany\";\n }\n : never\n : never);\ntype FlattenObjectRelation<T> =\n | (ExtractCreateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeObject<T>>)\n | (ExtractConnectTypeObject<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeObject<T, \"connect\">>)\n | (ExtractUpdateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeObject<T>>)\n | (Exclude<T, undefined> extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never);\ntype StripPrismaFilters<T> = T extends\n | {\n equals?: any;\n }\n | {\n in?: any;\n }\n | {\n notIn?: any;\n }\n | {\n lt?: any;\n }\n | {\n lte?: any;\n }\n | {\n gt?: any;\n }\n | {\n gte?: any;\n }\n | {\n AND?: any;\n }\n | {\n OR?: any;\n }\n | {\n NOT?: any;\n }\n ? never\n : T;\ntype FlattenRelations<T> = {\n [K in keyof T]: IsArrayRelation<T[K]> extends true\n ? FlattenArrayRelation<T[K]>\n : IsObjectRelation<T[K]> extends true\n ? XOR<FlattenObjectRelation<T[K]>, T[K]>\n : StripPrismaFilters<T[K]> extends never\n ? never\n : T[K] extends object\n ? T[K] extends Date | null | undefined\n ? T[K]\n : FlattenRelations<StripPrismaFilters<T[K]>>\n : StripPrismaFilters<T[K]>;\n};\n/**\n * Flattens Prisma relation inputs into a simpler, developer-friendly format\n *\n * Transforms Prisma's nested relation format:\n * ```typescript\n * { posts: { create: [...], connect: [...], update: [...] } }\n * ```\n *\n * Into a flattened format with optional apiAction discriminators:\n * ```typescript\n * { posts: [\n * { title: \"New Post\" }, // auto-detected as create\n * { id: 1 }, // auto-detected as connect\n * { id: 2, title: \"Updated\", apiAction: \"update\" }\n * ]}\n * ```\n *\n * @see {@link https://wwww.arkosjs.com/docs/api-reference/arkos-prisma-input}\n * @template T - The Prisma input type (e.g., Prisma.UserCreateInput)\n * @returns A flattened version of the input type with simplified relation handling\n */\nexport type ArkosPrismaInput<T> = FlattenRelations<T>;\n"]}
1
+ {"version":3,"file":"arkos-prisma-input.js","sourceRoot":"","sources":["../../../src/types/arkos-prisma-input.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Helper type to exclude properties from T that exist in U\n * Used internally by XOR to create mutually exclusive types\n */\ntype Without<T, U> = {\n [P in Exclude<keyof T, keyof U>]?: never;\n};\n/**\n * XOR (Exclusive OR) type for mutually exclusive union types\n * Ensures that properties from T and U cannot be mixed together\n * @see https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\ntype XOR<T, U> = T extends object\n ? U extends object\n ? (Without<T, U> & U) | (Without<U, T> & T)\n : U\n : T;\ntype Unpack<T> = T;\n/**\n * Checks if a field is an array relation (one-to-many or many-to-many)\n * Identified by the presence of createMany property\n */\nexport type IsArrayRelation<T> =\n Exclude<T, undefined> extends never\n ? false\n : Exclude<T, undefined> extends { createMany?: any }\n ? true\n : false;\n/**\n * Checks if a field is an object relation (one-to-one or many-to-one)\n * Identified by the presence of relation operations without being an array\n */\nexport type IsObjectRelation<T> =\n Exclude<T, undefined> extends Array<any>\n ? false\n : Exclude<T, undefined> extends\n | {\n create?: any;\n }\n | {\n connect?: any;\n }\n | {\n connectOrCreate?: any;\n }\n | {\n update?: any;\n }\n | {\n delete?: any;\n }\n | {\n disconnect?: any;\n }\n ? true\n : false;\ntype ExtractCreateTypeArray<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? U extends Array<infer I>\n ? (Omit<I, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n })[]\n : never\n : never;\ntype ExtractConnectTypeArray<\n T,\n A extends\n | \"connect\"\n | \"delete\"\n | \"update\"\n | \"disconnect\"\n | \"deleteMany\"\n | \"set\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Extract<C, Array<any>> extends Array<infer U>\n ? (Omit<U, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n })[]\n : never\n : never;\ntype ExtractUpdateTypeArray<T> =\n Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n update?: infer U;\n }\n ? U extends Array<infer UpdateItem>\n ? UpdateItem extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : U extends {\n where: infer W;\n data: infer D;\n }\n ? ((W & D) & {\n apiAction?: \"update\";\n })[]\n : never\n : never\n : never;\ntype ExtractCreateTypeObject<T> =\n Exclude<T, undefined> extends {\n create?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: \"create\";\n }\n : never\n : never\n : never;\ntype ExtractConnectTypeObject<\n T,\n A extends \"connect\" | \"delete\" | \"update\" | \"disconnect\",\n> =\n Exclude<T, undefined> extends {\n [k in A]?: infer C;\n }\n ? Exclude<\n Extract<Exclude<C, undefined>, object>,\n Array<any>\n > extends infer Obj\n ? Obj extends object\n ? Omit<Obj, \"OR\" | \"AND\" | \"NOT\"> & {\n apiAction?: A;\n }\n : never\n : never\n : never;\ntype ExtractUpdateTypeObject<T> =\n Exclude<T, undefined> extends {\n update?: infer U;\n }\n ? U extends {\n where: infer W;\n data: infer D;\n }\n ? (W & D) & {\n apiAction?: \"update\";\n }\n : Exclude<Extract<U, object>, Array<any>> & {\n apiAction?: \"update\";\n }\n : never;\ntype FlattenArrayRelation<T> =\n | (ExtractCreateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeArray<T>>)\n | (ExtractConnectTypeArray<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeArray<T, \"connect\">>)\n | (ExtractUpdateTypeArray<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeArray<T>>)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never\n : never)\n | (Exclude<T, undefined> extends Array<infer Item>\n ? Item extends {\n deleteMany?: any;\n }\n ? FlattenRelations<ExtractConnectTypeArray<T, \"deleteMany\">> & {\n apiAction: \"deleteMany\";\n }\n : never\n : never);\ntype FlattenObjectRelation<T> =\n | (ExtractCreateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractCreateTypeObject<T>>)\n | (ExtractConnectTypeObject<T, \"connect\"> extends never\n ? never\n : FlattenRelations<ExtractConnectTypeObject<T, \"connect\">>)\n | (ExtractUpdateTypeObject<T> extends never\n ? never\n : FlattenRelations<ExtractUpdateTypeObject<T>>)\n | (Exclude<T, undefined> extends {\n delete?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"delete\">> & {\n apiAction: \"delete\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n disconnect?: any;\n }\n ? FlattenRelations<ExtractConnectTypeObject<T, \"disconnect\">> & {\n apiAction: \"disconnect\";\n }\n : never)\n | (Exclude<T, undefined> extends {\n set?: infer S;\n }\n ? Unpack<S> & {\n apiAction?: \"set\";\n }\n : never);\ntype StripPrismaFilters<T> = T extends\n | {\n equals?: any;\n }\n | {\n in?: any;\n }\n | {\n notIn?: any;\n }\n | {\n lt?: any;\n }\n | {\n lte?: any;\n }\n | {\n gt?: any;\n }\n | {\n gte?: any;\n }\n | {\n AND?: any;\n }\n | {\n OR?: any;\n }\n | {\n NOT?: any;\n }\n ? never\n : T;\ntype FlattenRelations<T> = {\n [K in keyof T]: IsArrayRelation<T[K]> extends true\n ? FlattenArrayRelation<T[K]>\n : IsObjectRelation<T[K]> extends true\n ? XOR<FlattenObjectRelation<T[K]>, T[K]>\n : StripPrismaFilters<T[K]> extends never\n ? never\n : T[K] extends object\n ? T[K] extends Date | null | undefined\n ? T[K]\n : FlattenRelations<StripPrismaFilters<T[K]>>\n : StripPrismaFilters<T[K]>;\n};\n/**\n * Flattens Prisma relation inputs into a simpler, developer-friendly format\n *\n * Transforms Prisma's nested relation format:\n * ```typescript\n * { posts: { create: [...], connect: [...], update: [...] } }\n * ```\n *\n * Into a flattened format with optional apiAction discriminators:\n * ```typescript\n * { posts: [\n * { title: \"New Post\" }, // auto-detected as create\n * { id: 1 }, // auto-detected as connect\n * { id: 2, title: \"Updated\", apiAction: \"update\" }\n * ]}\n * ```\n *\n * @see {@link https://wwww.arkosjs.com/docs/reference/arkos-prisma-input}\n * @template T - The Prisma input type (e.g., Prisma.UserCreateInput)\n * @returns A flattened version of the input type with simplified relation handling\n */\nexport type ArkosPrismaInput<T> = FlattenRelations<T>;\n"]}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=arkos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkos.js","sourceRoot":"","sources":["../../../src/types/arkos.ts"],"names":[],"mappings":"","sourcesContent":["import { Express } from \"express\";\nimport { IncomingMessage, Server, ServerResponse } from \"http\";\nimport { IArkosRouter } from \"../exports\";\n\ntype ArkosRouterMethods =\n | \"get\"\n | \"post\"\n | \"put\"\n | \"patch\"\n | \"delete\"\n | \"options\"\n | \"head\"\n | \"all\"\n | \"use\"\n | \"trace\"\n | \"route\";\n\nexport interface Arkos\n extends Omit<Express, \"listen\" | ArkosRouterMethods>,\n Pick<IArkosRouter, ArkosRouterMethods> {\n (req: IncomingMessage, res: ServerResponse): void;\n /**\n * Applies all loaded items to the app by adding them as middleware,\n * routers, or handlers at the end of the stack.\n *\n * This ensures that Arkos internals always run after user middleware/routes.\n * Automatically called before listen() if not called manually.\n */\n build(): Promise<this>;\n /**\n * Starts the server using Arkos-managed port and host configuration.\n * Automatically calls build() if not called manually.\n *\n * @param callback Optional callback invoked once server starts\n */\n listen(callback?: (error?: Error) => void): Promise<Server>;\n /**\n * Starts the server using Arkos-managed port and host configuration.\n * app.build() must be called before this.\n *\n * @param server {Server} - Optional callback invoked once server starts\n * @param callback Optional callback invoked once server starts\n */\n listen(server: Server, callback?: (error?: Error) => void): Promise<Server>;\n}\n"]}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.applyArkosRouterProxy = applyArkosRouterProxy;
7
+ const route_config_validator_1 = __importDefault(require("../../route-config-validator.js"));
8
+ const _1 = require("./index.js");
9
+ const fs_helpers_1 = require("../../../helpers/fs.helpers.js");
10
+ const server_1 = require("../../../../server.js");
11
+ const route_config_registry_1 = __importDefault(require("../../route-config-registry.js"));
12
+ const error_handler_1 = require("../../../../exports/error-handler/index.js");
13
+ const deepmerge_helper_1 = __importDefault(require("../../../helpers/deepmerge.helper.js"));
14
+ const exit_error_1 = __importDefault(require("../../../helpers/exit-error.js"));
15
+ const upload_manager_1 = __importDefault(require("./upload-manager.js"));
16
+ function applyArkosRouterProxy(target, options, name = "ArkosRouter()") {
17
+ return new Proxy(target, {
18
+ get(target, prop, receiver) {
19
+ const originalMethod = Reflect.get(target, prop, receiver);
20
+ const httpMethods = [
21
+ "get",
22
+ "post",
23
+ "put",
24
+ "patch",
25
+ "delete",
26
+ "all",
27
+ "head",
28
+ "trace",
29
+ "options",
30
+ ];
31
+ if (prop === "use") {
32
+ return function (config, ...handlers) {
33
+ if (!config ||
34
+ typeof config !== "object" ||
35
+ Array.isArray(config) ||
36
+ typeof config === "function")
37
+ return originalMethod.call(target, config, ...handlers);
38
+ if (config.disabled)
39
+ return;
40
+ const useConfig = config;
41
+ const path = useConfig.path
42
+ ? (0, _1.applyPrefix)(options?.prefix, useConfig.path)
43
+ : undefined;
44
+ const arkosConfig = (0, server_1.getArkosConfig)();
45
+ const authenticationConfig = arkosConfig.authentication;
46
+ if (useConfig.authentication && !authenticationConfig?.mode)
47
+ throw (0, exit_error_1.default)(`Trying to authenticate route use${path ? ` ${path}` : ""} without choosing an authentication mode under arkos.config.${(0, fs_helpers_1.getUserFileExtension)()}
48
+
49
+ For further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`);
50
+ const middlewareStack = (0, _1.getMiddlewareStack)(useConfig);
51
+ const allHandlers = [...middlewareStack, ...handlers];
52
+ return path
53
+ ? originalMethod.call(target, path, ...allHandlers)
54
+ : originalMethod.call(target, ...allHandlers);
55
+ };
56
+ }
57
+ if (prop === "route") {
58
+ return function (path) {
59
+ const routeChain = {};
60
+ httpMethods.forEach((method) => {
61
+ routeChain[method] = function (config, ...handlers) {
62
+ const fullConfig = {
63
+ ...config,
64
+ ...(options?.openapi
65
+ ? {
66
+ experimental: {
67
+ openapi: options.openapi,
68
+ },
69
+ }
70
+ : {}),
71
+ path,
72
+ };
73
+ receiver[method](fullConfig, ...handlers);
74
+ return routeChain;
75
+ };
76
+ });
77
+ return routeChain;
78
+ };
79
+ }
80
+ if (httpMethods.includes(prop)) {
81
+ return function (config, ...handlers) {
82
+ if (config.disabled)
83
+ return;
84
+ if (!route_config_validator_1.default.isArkosRouteConfig(config))
85
+ throw Error(`First argument of ${name}.${prop}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === "object" ? JSON.stringify(config, null, 2) : config}`);
86
+ const path = (0, _1.applyPrefix)(options?.prefix, config.path);
87
+ config = {
88
+ ...config,
89
+ ...(options?.openapi
90
+ ? {
91
+ experimental: {
92
+ ...config?.experimental,
93
+ openapi: (0, deepmerge_helper_1.default)(options.openapi || {}, config?.experimental?.openapi || {}),
94
+ },
95
+ }
96
+ : {}),
97
+ path,
98
+ };
99
+ if ([null, undefined].includes(path))
100
+ throw Error("Please pass valid value for path field to use in your route");
101
+ const method = prop;
102
+ const UndefinedHandlerError = (handler) => Error(`Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`);
103
+ if (handlers.length > 0) {
104
+ const flattenHandlers = (arr) => {
105
+ return arr.reduce((flat, item) => {
106
+ return flat.concat(Array.isArray(item) ? flattenHandlers(item) : item);
107
+ }, []);
108
+ };
109
+ const flatHandlers = flattenHandlers(handlers);
110
+ handlers = flatHandlers.map((handler) => {
111
+ if (!handler)
112
+ throw UndefinedHandlerError(handler);
113
+ if (typeof handler !== "function") {
114
+ throw UndefinedHandlerError(handler);
115
+ }
116
+ return (0, error_handler_1.catchAsync)(handler, {
117
+ type: handler.length > 3 ? "error" : "normal",
118
+ });
119
+ });
120
+ const finalHandler = handlers[handlers.length - 1];
121
+ route_config_registry_1.default.register(finalHandler, config, method);
122
+ }
123
+ const arkosConfig = (0, server_1.getArkosConfig)();
124
+ const validationConfig = arkosConfig.validation;
125
+ const authenticationConfig = arkosConfig.authentication;
126
+ const strictValidation = validationConfig?.strict;
127
+ const route = `${method.toUpperCase()} ${path}`;
128
+ if (strictValidation &&
129
+ (!("validation" in config) ||
130
+ ("validation" in config &&
131
+ !config.validation &&
132
+ config.validation !== undefined)))
133
+ throw Error("When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.");
134
+ if (!validationConfig?.resolver &&
135
+ Object.keys(config.validation || {}).length > 0)
136
+ throw Error(`Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`);
137
+ if (config.authentication && !authenticationConfig?.mode)
138
+ throw Error(`Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${(0, fs_helpers_1.getUserFileExtension)()}
139
+
140
+ For further help see https://www.arkosjs.com/docs/core-concepts/authentication-system.`);
141
+ handlers = [...(0, _1.getMiddlewareStack)(config), ...handlers];
142
+ if (config.experimental?.uploads &&
143
+ config.experimental.uploads.deleteOnError !== false)
144
+ handlers.push((0, error_handler_1.catchAsync)(upload_manager_1.default.handleFileCleanup(config.experimental.uploads), { type: "error" }));
145
+ return originalMethod.call(target, path, ...handlers);
146
+ };
147
+ }
148
+ return originalMethod;
149
+ },
150
+ });
151
+ }
152
+ //# sourceMappingURL=apply-arkos-router-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-arkos-router-proxy.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { RouterOptions } from \"express\";\nimport {\n ArkosAnyRequestHandler,\n ArkosRouteConfig,\n ArkosUseConfig,\n IArkosRoute,\n PathParams,\n} from \"../../types\";\nimport RouteConfigValidator from \"../../route-config-validator\";\nimport { applyPrefix, getMiddlewareStack } from \".\";\nimport { getUserFileExtension } from \"../../../helpers/fs.helpers\";\nimport { getArkosConfig } from \"../../../../server\";\nimport RouteConfigRegistry from \"../../route-config-registry\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\nimport ExitError from \"../../../helpers/exit-error\";\nimport uploadManager from \"./upload-manager\";\n\nexport function applyArkosRouterProxy<T extends object>(\n target: T,\n options?: RouterOptions & {\n prefix?: string | RegExp | Array<string | RegExp>;\n openapi?: { tags?: string[] };\n },\n name: \"app\" | \"ArkosRouter()\" = \"ArkosRouter()\"\n): T {\n return new Proxy(target, {\n get(target, prop, receiver) {\n const originalMethod = Reflect.get(target, prop, receiver) as Function;\n\n const httpMethods = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"all\",\n \"head\",\n \"trace\",\n \"options\",\n ] as const;\n\n if (prop === \"use\") {\n return function (\n config: ArkosUseConfig | PathParams | ArkosAnyRequestHandler,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n // if not an ArkosUseConfig object, fall through to native Express use\n if (\n !config ||\n typeof config !== \"object\" ||\n Array.isArray(config) ||\n typeof config === \"function\"\n )\n return originalMethod.call(target, config, ...handlers);\n\n if ((config as ArkosUseConfig).disabled) return;\n\n const useConfig = config as ArkosUseConfig;\n const path = useConfig.path\n ? applyPrefix(options?.prefix, useConfig.path)\n : undefined;\n\n const arkosConfig = getArkosConfig();\n const authenticationConfig = arkosConfig.authentication;\n\n if (useConfig.authentication && !authenticationConfig?.mode)\n throw ExitError(\n `Trying to authenticate route use${path ? ` ${path}` : \"\"} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication/setup.`\n );\n\n const middlewareStack = getMiddlewareStack(useConfig);\n\n const allHandlers = [...middlewareStack, ...handlers];\n\n return path\n ? originalMethod.call(target, path, ...allHandlers)\n : originalMethod.call(target, ...allHandlers);\n };\n }\n\n if (prop === \"route\") {\n return function (path: PathParams) {\n const routeChain: any = {};\n\n httpMethods.forEach((method) => {\n routeChain[method] = function (\n config: ArkosAnyRequestHandler | Omit<ArkosRouteConfig, \"path\">,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n const fullConfig: ArkosRouteConfig = {\n ...config,\n ...(options?.openapi\n ? {\n experimental: {\n openapi: options.openapi,\n },\n }\n : {}),\n path,\n };\n\n receiver[method](fullConfig, ...handlers);\n\n return routeChain as IArkosRoute;\n };\n });\n\n return routeChain;\n };\n }\n\n if (httpMethods.includes(prop as any)) {\n return function (\n config: ArkosRouteConfig,\n ...handlers: ArkosAnyRequestHandler[]\n ) {\n if (config.disabled) return;\n\n if (!RouteConfigValidator.isArkosRouteConfig(config))\n throw Error(\n `First argument of ${name}.${prop as string}() must be a valid ArkosRouteConfig object with path field, but recevied ${typeof config === \"object\" ? JSON.stringify(config, null, 2) : config}`\n );\n\n const path = applyPrefix(options?.prefix, config.path);\n\n config = {\n ...config,\n ...(options?.openapi\n ? {\n experimental: {\n ...config?.experimental,\n openapi: deepmerge(\n options.openapi || {},\n config?.experimental?.openapi || {}\n ),\n },\n }\n : {}),\n path,\n };\n\n if ([null, undefined].includes(path as any))\n throw Error(\n \"Please pass valid value for path field to use in your route\"\n );\n\n const method = prop as string;\n const UndefinedHandlerError = (handler: any) =>\n Error(\n `Wrong value for handler in route ${method.toUpperCase()} ${path}, recevied ${handler}.`\n );\n\n if (handlers.length > 0) {\n const flattenHandlers = (arr: any[]): ArkosAnyRequestHandler[] => {\n return arr.reduce((flat, item) => {\n return flat.concat(\n Array.isArray(item) ? flattenHandlers(item) : item\n );\n }, []);\n };\n\n const flatHandlers = flattenHandlers(handlers);\n\n handlers = flatHandlers.map((handler: ArkosAnyRequestHandler) => {\n if (!handler) throw UndefinedHandlerError(handler);\n\n if (typeof handler !== \"function\") {\n throw UndefinedHandlerError(handler);\n }\n\n return catchAsync(handler, {\n type: handler.length > 3 ? \"error\" : \"normal\",\n });\n });\n\n const finalHandler = handlers[handlers.length - 1];\n RouteConfigRegistry.register(finalHandler, config, method);\n }\n\n const arkosConfig = getArkosConfig();\n const validationConfig = arkosConfig.validation;\n const authenticationConfig = arkosConfig.authentication;\n const strictValidation = validationConfig?.strict;\n const route = `${method.toUpperCase()} ${path}`;\n\n if (\n strictValidation &&\n (!(\"validation\" in config) ||\n (\"validation\" in config &&\n !config.validation &&\n config.validation !== undefined))\n )\n throw Error(\n \"When using strict validation you must either pass { validation: false } in order to explicitly tell that no input will be received, or pass `undefined` for each input type e.g { validation: { query: undefined } } in order to deny the input of given request input.\"\n );\n\n if (\n !validationConfig?.resolver &&\n Object.keys(config.validation || {}).length > 0\n )\n throw Error(\n `Trying to pass validators into route ${route} config validation option without choosing a validation resolver under arkos.init({ validation: { resolver: '' } })`\n );\n\n if (config.authentication && !authenticationConfig?.mode)\n throw Error(\n `Trying to authenticate route ${route} without choosing an authentication mode under arkos.config.${getUserFileExtension()}\n\nFor further help see https://www.arkosjs.com/docs/core-concepts/authentication-system.`\n );\n\n handlers = [...getMiddlewareStack(config), ...handlers];\n\n if (\n config.experimental?.uploads &&\n config.experimental.uploads.deleteOnError !== false\n )\n handlers.push(\n catchAsync(\n uploadManager.handleFileCleanup(config.experimental.uploads),\n { type: \"error\" }\n )\n );\n\n return originalMethod.call(target, path, ...handlers);\n };\n }\n // }\n return originalMethod;\n },\n });\n}\n"]}
@@ -19,6 +19,6 @@ function killServerChildProcess() {
19
19
  (0, start_1.killProductionServerChildProcess)();
20
20
  }
21
21
  function getVersion() {
22
- return "1.4.11-beta";
22
+ return "1.4.12-beta";
23
23
  }
24
24
  //# sourceMappingURL=cli.helpers.js.map
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.ClassValidatorDtoGenerator = void 0;
7
7
  const prisma_schema_parser_1 = __importDefault(require("../../../../prisma/prisma-schema-parser.js"));
8
8
  const fs_helpers_1 = require("../../../../helpers/fs.helpers.js");
9
+ const arkos_config_helpers_1 = require("../../../../helpers/arkos-config.helpers.js");
9
10
  class ClassValidatorDtoGenerator {
10
11
  ensureCorrectOptions(options) {
11
12
  const { modelName } = options;
@@ -595,6 +596,213 @@ ${fields.join("\n\n")}
595
596
  return prisma_schema_parser_1.default.isEnum(prismaType) ? prismaType : "any";
596
597
  }
597
598
  }
599
+ generateLoginDto(_) {
600
+ const ext = (0, fs_helpers_1.getUserFileExtension)();
601
+ const isTypeScript = ext === "ts";
602
+ const allowedUsernames = (0, arkos_config_helpers_1.getArkosConfig)()?.authentication?.login
603
+ ?.allowedUsernames || ["username"];
604
+ const usernameFields = allowedUsernames.map((field) => {
605
+ const displayName = field.includes(".") ? field.split(".").pop() : field;
606
+ const typeModifier = isTypeScript ? "?" : "";
607
+ const emailDecorator = displayName === "email" ? "\n @IsEmail()" : "\n @IsString()";
608
+ return ` @IsOptional()${emailDecorator}\n ${displayName}${typeModifier}: string;`;
609
+ });
610
+ const validatorsUsed = new Set([
611
+ "IsOptional",
612
+ "IsNotEmpty",
613
+ "IsString",
614
+ "MinLength",
615
+ "Matches",
616
+ ]);
617
+ const hasEmail = allowedUsernames.some((f) => (f.includes(".") ? f.split(".").pop() : f) === "email");
618
+ if (hasEmail)
619
+ validatorsUsed.add("IsEmail");
620
+ const typeModifier = isTypeScript ? "!" : "";
621
+ return `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";
622
+
623
+ export default class LoginDto {
624
+ ${usernameFields.join("\n\n")}
625
+
626
+ @IsNotEmpty()
627
+ @IsString()
628
+ @MinLength(8)
629
+ @Matches(/[a-z]/, { message: "Must contain lowercase" })
630
+ @Matches(/[A-Z]/, { message: "Must contain uppercase" })
631
+ @Matches(/[0-9]/, { message: "Must contain number" })
632
+ password${typeModifier}: string;
633
+ }
634
+ `;
635
+ }
636
+ generateSignupDto(_) {
637
+ const ext = (0, fs_helpers_1.getUserFileExtension)();
638
+ const isTypeScript = ext === "ts";
639
+ const userModel = prisma_schema_parser_1.default.models.find((m) => m.name.toLowerCase() === "user");
640
+ if (!userModel)
641
+ throw new Error("User model not found in Prisma schema");
642
+ const restrictedFields = [
643
+ "id",
644
+ "createdAt",
645
+ "updatedAt",
646
+ "deletedAt",
647
+ "roles",
648
+ "role",
649
+ "isActive",
650
+ "isStaff",
651
+ "isSuperUser",
652
+ "passwordChangedAt",
653
+ "deletedSelfAccountAt",
654
+ "lastLoginAt",
655
+ ];
656
+ const enumsUsed = new Set();
657
+ const validatorsUsed = new Set();
658
+ const transformersUsed = new Set();
659
+ const nestedDtoClasses = [];
660
+ const dtoFields = [];
661
+ for (const field of userModel.fields) {
662
+ const isForeignKey = userModel.fields.some((f) => f.foreignKeyField === field.name);
663
+ if (field.isId || restrictedFields.includes(field.name) || isForeignKey)
664
+ continue;
665
+ if (field.isRelation) {
666
+ if (field.isArray)
667
+ continue;
668
+ const referencedModel = prisma_schema_parser_1.default.models.find((m) => m.name === field.type);
669
+ if (referencedModel) {
670
+ const isOptional = field.isOptional || field.defaultValue !== undefined;
671
+ if (isOptional)
672
+ validatorsUsed.add("IsOptional");
673
+ validatorsUsed.add("ValidateNested");
674
+ transformersUsed.add("Type");
675
+ const relationDtoName = `${referencedModel.name}ForSignupDto`;
676
+ const nestedDtoClass = this.generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
677
+ if (!dtoFields.find((d) => d.includes(relationDtoName)))
678
+ nestedDtoClasses.push(nestedDtoClass);
679
+ const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
680
+ dtoFields.push(` ${isOptional ? "@IsOptional()\n " : ""}@ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
681
+ }
682
+ continue;
683
+ }
684
+ if (prisma_schema_parser_1.default.isEnum(field.type))
685
+ enumsUsed.add(field.type);
686
+ if (field.name === "password") {
687
+ validatorsUsed.add("IsNotEmpty");
688
+ validatorsUsed.add("IsString");
689
+ validatorsUsed.add("MinLength");
690
+ validatorsUsed.add("Matches");
691
+ const typeModifier = isTypeScript ? "!" : "";
692
+ dtoFields.push(` @IsNotEmpty()\n @IsString()\n @MinLength(8)\n @Matches(/[a-z]/, { message: "Must contain lowercase" })\n @Matches(/[A-Z]/, { message: "Must contain uppercase" })\n @Matches(/[0-9]/, { message: "Must contain number" })\n ${field.name}${typeModifier}: string;`);
693
+ continue;
694
+ }
695
+ const { decorators, type } = this.generateClassValidatorField(field, true, validatorsUsed);
696
+ const isOptional = field.isOptional || field.defaultValue !== undefined;
697
+ const typeModifier = isTypeScript ? (isOptional ? "?" : "!") : "";
698
+ dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
699
+ }
700
+ const enumImports = enumsUsed.size > 0
701
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
702
+ : "";
703
+ const validatorImports = validatorsUsed.size > 0
704
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
705
+ : "";
706
+ const transformerImports = transformersUsed.size > 0
707
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
708
+ : "";
709
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
710
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
711
+ export default class SignupDto {
712
+ ${dtoFields.join("\n\n")}
713
+ }
714
+ `;
715
+ }
716
+ generateUpdateMeDto(_) {
717
+ const ext = (0, fs_helpers_1.getUserFileExtension)();
718
+ const isTypeScript = ext === "ts";
719
+ const userModel = prisma_schema_parser_1.default.models.find((m) => m.name.toLowerCase() === "user");
720
+ if (!userModel)
721
+ throw new Error("User model not found in Prisma schema");
722
+ const restrictedFields = [
723
+ "id",
724
+ "createdAt",
725
+ "updatedAt",
726
+ "deletedAt",
727
+ "roles",
728
+ "role",
729
+ "isActive",
730
+ "isStaff",
731
+ "isSuperUser",
732
+ "passwordChangedAt",
733
+ "deletedSelfAccountAt",
734
+ "lastLoginAt",
735
+ "password",
736
+ ];
737
+ const enumsUsed = new Set();
738
+ const validatorsUsed = new Set();
739
+ const transformersUsed = new Set();
740
+ const nestedDtoClasses = [];
741
+ const dtoFields = [];
742
+ for (const field of userModel.fields) {
743
+ const isForeignKey = userModel.fields.some((f) => f.foreignKeyField === field.name);
744
+ if (field.isId || restrictedFields.includes(field.name) || isForeignKey)
745
+ continue;
746
+ if (field.isRelation) {
747
+ if (field.isArray)
748
+ continue;
749
+ const referencedModel = prisma_schema_parser_1.default.models.find((m) => m.name === field.type);
750
+ if (referencedModel) {
751
+ validatorsUsed.add("IsOptional");
752
+ validatorsUsed.add("ValidateNested");
753
+ transformersUsed.add("Type");
754
+ const relationDtoName = `${referencedModel.name}ForUpdateMeDto`;
755
+ const nestedDtoClass = this.generateNestedDtoClass(field, referencedModel, relationDtoName, validatorsUsed, enumsUsed, isTypeScript);
756
+ if (!dtoFields.find((d) => d.includes(relationDtoName)))
757
+ nestedDtoClasses.push(nestedDtoClass);
758
+ const typeModifier = isTypeScript ? "?" : "";
759
+ dtoFields.push(` @IsOptional()\n @ValidateNested()\n @Type(() => ${relationDtoName})\n ${field.name}${typeModifier}: ${relationDtoName};`);
760
+ }
761
+ continue;
762
+ }
763
+ if (prisma_schema_parser_1.default.isEnum(field.type))
764
+ enumsUsed.add(field.type);
765
+ const { decorators, type } = this.generateClassValidatorFieldForUpdate(field, true, validatorsUsed);
766
+ const typeModifier = isTypeScript ? "?" : "";
767
+ dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);
768
+ }
769
+ const enumImports = enumsUsed.size > 0
770
+ ? `import { ${Array.from(enumsUsed).join(", ")} } from "@prisma/client";\n`
771
+ : "";
772
+ const validatorImports = validatorsUsed.size > 0
773
+ ? `import { ${Array.from(validatorsUsed).join(", ")} } from "class-validator";\n`
774
+ : "";
775
+ const transformerImports = transformersUsed.size > 0
776
+ ? `import { ${Array.from(transformersUsed).join(", ")} } from "class-transformer";\n`
777
+ : "";
778
+ const nestedDtoSection = nestedDtoClasses.length > 0 ? `\n${nestedDtoClasses.join("\n\n")}\n` : "";
779
+ return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}
780
+ export default class UpdateMeDto {
781
+ ${dtoFields.join("\n\n")}
782
+ }
783
+ `;
784
+ }
785
+ generateUpdatePasswordDto(_) {
786
+ const ext = (0, fs_helpers_1.getUserFileExtension)();
787
+ const isTypeScript = ext === "ts";
788
+ const typeModifier = isTypeScript ? "!" : "";
789
+ return `import { IsNotEmpty, IsString, MinLength, Matches } from "class-validator";
790
+
791
+ export default class UpdatePasswordDto {
792
+ @IsNotEmpty()
793
+ @IsString()
794
+ currentPassword${typeModifier}: string;
795
+
796
+ @IsNotEmpty()
797
+ @IsString()
798
+ @MinLength(8)
799
+ @Matches(/[a-z]/, { message: "Must contain lowercase" })
800
+ @Matches(/[A-Z]/, { message: "Must contain uppercase" })
801
+ @Matches(/[0-9]/, { message: "Must contain number" })
802
+ newPassword${typeModifier}: string;
803
+ }
804
+ `;
805
+ }
598
806
  }
599
807
  exports.ClassValidatorDtoGenerator = ClassValidatorDtoGenerator;
600
808
  const classValidatorDtoGenerator = new ClassValidatorDtoGenerator();