arkos 1.4.0-canary.91 → 1.4.1-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.
- package/dist/cjs/app.js +1 -1
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.controller.js +1 -1
- package/dist/cjs/modules/auth/auth.controller.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +3 -4
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js +56 -8
- package/dist/cjs/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/cjs/modules/base/base.controller.js +6 -3
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +17 -5
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +2 -2
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/cjs/modules/swagger/swagger.router.js +6 -4
- package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js +7 -0
- package/dist/cjs/modules/swagger/utils/built-in-route-path-object-manager.js.map +1 -0
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +326 -183
- package/dist/cjs/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +374 -288
- package/dist/cjs/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +1 -5
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +280 -243
- package/dist/cjs/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/cjs/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js +8 -6
- package/dist/cjs/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/cjs/server.js +17 -15
- package/dist/cjs/server.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/new-arkos-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +50 -10
- package/dist/cjs/utils/arkos-router/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/types/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +11 -0
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +18 -57
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/export-auth-action.js +1 -1
- package/dist/cjs/utils/cli/export-auth-action.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +3 -3
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +1 -1
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +19 -12
- package/dist/cjs/utils/cli/start.js.map +1 -1
- package/dist/cjs/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js +51 -6
- package/dist/cjs/utils/cli/utils/runtime-cli-commander.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +3 -3
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +3 -3
- package/dist/cjs/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js +6 -3
- package/dist/cjs/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js +3 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/cjs/utils/dotenv.helpers.js +15 -7
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/api.features.helpers.js +174 -81
- package/dist/cjs/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +40 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/routers.helpers.js +0 -1
- package/dist/cjs/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +19 -4
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/validate-dto.js +1 -5
- package/dist/cjs/utils/validate-dto.js.map +1 -1
- package/dist/cjs/utils/validate-schema.js +2 -7
- package/dist/cjs/utils/validate-schema.js.map +1 -1
- package/dist/esm/app.js +1 -1
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.controller.js +1 -1
- package/dist/esm/modules/auth/auth.controller.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +4 -5
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/auth/utils/services/auth-action.service.js +56 -5
- package/dist/esm/modules/auth/utils/services/auth-action.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +6 -3
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +17 -5
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +2 -2
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/catch-async.js.map +1 -1
- package/dist/esm/modules/swagger/swagger.router.js +6 -4
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js +5 -0
- package/dist/esm/modules/swagger/utils/built-in-route-path-object-manager.js.map +1 -0
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js +326 -183
- package/dist/esm/modules/swagger/utils/helpers/get-authentication-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js +374 -288
- package/dist/esm/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +1 -2
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js +280 -243
- package/dist/esm/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js +3 -0
- package/dist/esm/modules/swagger/utils/helpers/missing-json-schemas-generator.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js +8 -6
- package/dist/esm/modules/swagger/utils/helpers/swagger.router.helpers.js.map +1 -1
- package/dist/esm/server.js +17 -15
- package/dist/esm/server.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/new-arkos-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +51 -11
- package/dist/esm/utils/arkos-router/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/types/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +10 -0
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +19 -58
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/export-auth-action.js +1 -1
- package/dist/esm/utils/cli/export-auth-action.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +3 -3
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +1 -1
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/start.js +19 -12
- package/dist/esm/utils/cli/start.js.map +1 -1
- package/dist/esm/utils/cli/utils/cli.helpers.js +1 -1
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js +52 -7
- package/dist/esm/utils/cli/utils/runtime-cli-commander.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js +3 -3
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/create-dto-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js +3 -3
- package/dist/esm/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js +6 -3
- package/dist/esm/utils/cli/utils/template-generator/templates/middlewares-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js +3 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/router-template.js.map +1 -1
- package/dist/esm/utils/dotenv.helpers.js +15 -7
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/api.features.helpers.js +174 -81
- package/dist/esm/utils/helpers/api.features.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +39 -1
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/routers.helpers.js +0 -1
- package/dist/esm/utils/helpers/routers.helpers.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +19 -4
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/validate-dto.js +1 -2
- package/dist/esm/utils/validate-dto.js.map +1 -1
- package/dist/esm/utils/validate-schema.js +2 -4
- package/dist/esm/utils/validate-schema.js.map +1 -1
- package/dist/types/exports/index.d.ts +2 -1
- package/dist/types/modules/auth/auth.router.d.ts +1 -1
- package/dist/types/modules/auth/auth.service.d.ts +2 -2
- package/dist/types/modules/base/base.router.d.ts +1 -1
- package/dist/types/modules/swagger/utils/built-in-route-path-object-manager.d.ts +4 -0
- package/dist/types/modules/swagger/utils/helpers/get-authentication-json-schema-paths.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/get-file-upload-json-schema-paths.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/json-schema-generators/prisma-models/generate-prisma-model-main-routes-paths.d.ts +1 -1
- package/dist/types/modules/swagger/utils/helpers/swagger.router.helpers.d.ts +1 -1
- package/dist/types/types/index.d.ts +5 -5
- package/dist/types/types/new-arkos-config.d.ts +1 -1
- package/dist/types/utils/arkos-router/index.d.ts +2 -1
- package/dist/types/utils/arkos-router/types/index.d.ts +15 -14
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +1 -0
- package/dist/types/utils/cli/dev.d.ts +1 -1
- package/dist/types/utils/cli/start.d.ts +1 -1
- package/dist/types/utils/helpers/prisma.helpers.d.ts +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n // ALL relations are optional in update DTO\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n // ALL fields are optional in update DTO\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Update${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n // ALL fields in update DTO are optional\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \", { each: true }\" : \"\";\n\n // User module special cases - keep validations even though optional\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber({}${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"update-dto-template.js","sourceRoot":"","sources":["../../../../../../../../src/utils/cli/utils/template-generator/templates/class-validator/update-dto-template.ts"],"names":[],"mappings":"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","sourcesContent":["import prismaSchemaParser from \"../../../../../prisma/prisma-schema-parser\";\nimport { PrismaField, PrismaModel } from \"../../../../../prisma/types\";\nimport { getUserFileExtension } from \"../../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../../template-generators\";\n\nexport function generateUpdateDtoTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for update-dto template\");\n\n const model = prismaSchemaParser.models.find(\n (m) => m.name.toLowerCase() === modelName.pascal.toLowerCase()\n );\n\n if (!model)\n throw new Error(`Model ${modelName.pascal} not found in Prisma schema`);\n\n const ext = getUserFileExtension();\n const isTypeScript = ext === \"ts\";\n const restrictedFields = [\"id\", \"createdAt\", \"updatedAt\", \"deletedAt\"];\n const isUserModule = modelName.kebab === \"user\";\n const enumsUsed = new Set<string>();\n const validatorsUsed = new Set<string>();\n const transformersUsed = new Set<string>();\n const nestedDtoClasses: string[] = [];\n\n let dtoFields: string[] = [];\n\n for (const field of model.fields) {\n if (field.isId || restrictedFields.includes(field.name)) {\n continue;\n }\n\n const isForeignKey = model.fields.some(\n (f) => f.foreignKeyField === field.name\n );\n if (isForeignKey) {\n continue;\n }\n\n if (field.isRelation) {\n if (field.isArray) continue;\n\n const referencedModel = prismaSchemaParser.models.find(\n (m) => m.name === field.type\n );\n\n if (referencedModel) {\n // ALL relations are optional in update DTO\n validatorsUsed.add(\"IsOptional\");\n validatorsUsed.add(\"ValidateNested\");\n transformersUsed.add(\"Type\");\n\n const relationDtoName = `${referencedModel.name}ForUpdate${modelName.pascal}Dto`;\n\n // Generate the nested DTO class inline\n const nestedDtoClass = generateNestedDtoClass(\n field,\n referencedModel,\n relationDtoName,\n validatorsUsed,\n enumsUsed,\n isTypeScript\n );\n nestedDtoClasses.push(nestedDtoClass);\n\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(\n ` @IsOptional()\\n @ValidateNested()\\n @Type(() => ${relationDtoName})\\n ${field.name}${typeModifier}: ${relationDtoName};`\n );\n }\n continue;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n enumsUsed.add(field.type);\n }\n\n const { decorators, type } = generateClassValidatorField(\n field,\n isUserModule,\n validatorsUsed\n );\n // ALL fields are optional in update DTO\n const typeModifier = isTypeScript ? \"?\" : \"\";\n dtoFields.push(`${decorators} ${field.name}${typeModifier}: ${type};`);\n }\n\n const enumImports =\n enumsUsed.size > 0\n ? `import { ${Array.from(enumsUsed).join(\", \")} } from \"@prisma/client\";\\n`\n : \"\";\n\n const validatorImports =\n validatorsUsed.size > 0\n ? `import { ${Array.from(validatorsUsed).join(\", \")} } from \"class-validator\";\\n`\n : \"\";\n\n const transformerImports =\n transformersUsed.size > 0\n ? `import { ${Array.from(transformersUsed).join(\", \")} } from \"class-transformer\";\\n`\n : \"\";\n\n const nestedDtoSection =\n nestedDtoClasses.length > 0 ? `\\n${nestedDtoClasses.join(\"\\n\\n\")}\\n` : \"\";\n\n return `${validatorImports}${transformerImports}${enumImports}${nestedDtoSection}\nexport default class Update${modelName.pascal}Dto {\n${dtoFields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateNestedDtoClass(\n field: PrismaField,\n referencedModel: PrismaModel,\n dtoName: string,\n validatorsUsed: Set<string>,\n enumsUsed: Set<string>,\n isTypeScript: boolean\n): string {\n const fields: string[] = [];\n\n const refFieldName = field.foreignReferenceField || \"id\";\n const refFieldAsPrismaField = referencedModel.fields.find(\n (f) => f.name === refFieldName\n );\n\n if (refFieldAsPrismaField) {\n if (prismaSchemaParser.isEnum(refFieldAsPrismaField.type))\n enumsUsed.add(refFieldAsPrismaField.type);\n\n const { decorators, type } = generateClassValidatorField(\n refFieldAsPrismaField,\n false,\n validatorsUsed\n );\n const typeModifier = isTypeScript ? \"!\" : \"\";\n fields.push(\n `${decorators} ${refFieldAsPrismaField.name}${typeModifier}: ${type};`\n );\n }\n\n return `class ${dtoName} {\n${fields.join(\"\\n\\n\")}\n}`;\n}\n\nfunction generateClassValidatorField(\n field: PrismaField,\n isUserModule: boolean,\n validatorsUsed: Set<string>\n): { decorators: string; type: string } {\n let decorators: string[] = [];\n let type = mapPrismaTypeToTS(field.type);\n\n // ALL fields in update DTO are optional\n decorators.push(\"@IsOptional()\");\n validatorsUsed.add(\"IsOptional\");\n\n if (field.isArray) {\n decorators.push(\"@IsArray()\");\n validatorsUsed.add(\"IsArray\");\n type = `${type}[]`;\n }\n\n if (prismaSchemaParser.isEnum(field.type)) {\n decorators.push(\n `@IsEnum(${field.type}${field.isArray ? \", { each: true }\" : \"\"})`\n );\n validatorsUsed.add(\"IsEnum\");\n type = field.isArray ? `${field.type}[]` : field.type;\n } else {\n const fieldValidators = getValidatorsForType(field, isUserModule);\n decorators.push(...fieldValidators);\n fieldValidators.forEach((decorator) => {\n const validatorName = decorator.match(/@(\\w+)/)?.[1];\n if (validatorName) validatorsUsed.add(validatorName);\n });\n }\n\n return {\n decorators:\n decorators.map((d) => ` ${d}`).join(\"\\n\") +\n (decorators.length > 0 ? \"\\n\" : \"\"),\n type,\n };\n}\n\nfunction getValidatorsForType(\n field: PrismaField,\n isUserModule: boolean\n): string[] {\n const validators: string[] = [];\n const arrayEach = field.isArray ? \"{ each: true }\" : \"\";\n\n // User module special cases - keep validations even though optional\n if (isUserModule) {\n if (field.name === \"email\") {\n return [\"@IsEmail()\"]; // Only IsEmail, no IsString\n } else if (field.name === \"password\") {\n return [\n \"@IsString()\",\n \"@MinLength(8)\",\n '@Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\\\\d)/, { message: \"Password must contain at least one uppercase letter, one lowercase letter, and one number\" })',\n ];\n }\n }\n\n switch (field.type) {\n case \"String\":\n validators.push(`@IsString(${arrayEach})`);\n break;\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Boolean\":\n validators.push(`@IsBoolean(${arrayEach})`);\n break;\n case \"DateTime\":\n validators.push(`@IsDate(${arrayEach})`);\n break;\n case \"BigInt\":\n validators.push(`@IsNumber(${arrayEach})`);\n break;\n case \"Json\":\n validators.push(`@IsObject(${arrayEach})`);\n break;\n case \"Bytes\":\n break;\n default:\n break;\n }\n\n return validators;\n}\n\nfunction mapPrismaTypeToTS(prismaType: string): string {\n switch (prismaType) {\n case \"String\":\n return \"string\";\n case \"Int\":\n case \"Float\":\n case \"Decimal\":\n return \"number\";\n case \"Boolean\":\n return \"boolean\";\n case \"DateTime\":\n return \"Date\";\n case \"Json\":\n return \"any\";\n case \"Bytes\":\n return \"Buffer\";\n case \"BigInt\":\n return \"bigint\";\n default:\n // For enums and unknown types, return as any\n return prismaSchemaParser.isEnum(prismaType) ? prismaType : \"any\";\n }\n}\n"]}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.generateMiddlewaresTemplate = generateMiddlewaresTemplate;
|
|
4
|
-
const fs_helpers_1 = require("../../../../helpers/fs.helpers");
|
|
5
4
|
function generateMiddlewaresTemplate(options) {
|
|
6
5
|
const { modelName } = options;
|
|
7
|
-
const ext = (0, fs_helpers_1.getUserFileExtension)();
|
|
8
|
-
const isTypeScript = ext === "ts";
|
|
9
6
|
if (!modelName)
|
|
10
7
|
throw new Error("Module name is required for middleware template");
|
|
11
8
|
const isAuth = modelName.camel === "auth";
|
|
@@ -35,6 +32,12 @@ export const afterSignup = []
|
|
|
35
32
|
|
|
36
33
|
export const onSignupError = []
|
|
37
34
|
|
|
35
|
+
export const beforeUpdateMe = []
|
|
36
|
+
|
|
37
|
+
export const afterUpdateMe = []
|
|
38
|
+
|
|
39
|
+
export const onUpdateMeError = []
|
|
40
|
+
|
|
38
41
|
export const beforeUpdatePassword = []
|
|
39
42
|
|
|
40
43
|
export const afterUpdatePassword = []
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middlewares-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/middlewares-template.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"middlewares-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/middlewares-template.ts"],"names":[],"mappings":";;AAEA,kEA0HC;AA1HD,SAAgB,2BAA2B,CAAC,OAAwB;IAClE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,KAAK,MAAM,CAAC;IAC1C,MAAM,YAAY,GAChB,SAAS,CAAC,KAAK,KAAK,YAAY,IAAI,SAAS,CAAC,KAAK,KAAK,aAAa,CAAC;IAExE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCV,CAAC;IACA,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;;;;;;;;;;;;;;;;;;;;;CAqBV,CAAC;IACA,CAAC;IAED,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CR,CAAC;AACF,CAAC","sourcesContent":["import { TemplateOptions } from \"../../template-generators\";\n\nexport function generateMiddlewaresTemplate(options: TemplateOptions): string {\n const { modelName } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for middleware template\");\n\n const isAuth = modelName.camel === \"auth\";\n const isFileUpload =\n modelName.camel === \"fileUpload\" || modelName.camel === \"file-upload\";\n\n if (isAuth) {\n return `export const beforeGetMe = []\n\nexport const afterGetMe = []\n\nexport const onGetMeError = []\n\nexport const beforeLogin = []\n\nexport const afterLogin = []\n\nexport const onLoginError = []\n\nexport const beforeLogout = []\n\nexport const afterLogout = []\n\nexport const onLogoutError = []\n\nexport const beforeSignup = []\n\nexport const afterSignup = []\n\nexport const onSignupError = []\n\nexport const beforeUpdateMe = []\n\nexport const afterUpdateMe = []\n\nexport const onUpdateMeError = []\n\nexport const beforeUpdatePassword = []\n\nexport const afterUpdatePassword = []\n\nexport const onUpdatePasswordError = []\n`;\n }\n\n if (isFileUpload) {\n return `export const beforeFindF]ile = []\n\nexport const onFindFileError = []\n\nexport const beforeUploadFile = []\n\nexport const afterUploadFile = []\n\nexport const onUploadFileError = []\n\nexport const beforeUpdateFile = []\n\nexport const afterUpdateFile = []\n\nexport const onUpdateFileError = []\n\nexport const beforeDeleteFile = []\n\nexport const afterDeleteFile = []\n\nexport const onDeleteFileError = []\n`;\n }\n\n return `export const beforeCreateOne = []\n\nexport const afterCreateOne = []\n\nexport const onCreateOneError = []\n\nexport const beforeFindOne = []\n\nexport const afterFindOne = []\n\nexport const onFindOneError = []\n\nexport const beforeFindMany = []\n\nexport const afterFindMany = []\n\nexport const onFindManyError = []\n\nexport const beforeUpdateOne = []\n\nexport const afterUpdateOne = []\n\nexport const onUpdateOneError = []\n\nexport const beforeDeleteOne = []\n\nexport const afterDeleteOne = []\n\nexport const onDeleteOneError = []\n\nexport const beforeCreateMany = []\n\nexport const afterCreateMany = []\n\nexport const onCreateManyError = []\n\nexport const beforeUpdateMany = []\n\nexport const afterUpdateMany = []\n\nexport const onUpdateManyError = []\n\nexport const beforeDeleteMany = []\n\nexport const afterDeleteMany = []\n\nexport const onDeleteManyError = []\n`;\n}\n"]}
|
|
@@ -8,7 +8,9 @@ function generateRouterTemplate(options) {
|
|
|
8
8
|
throw new Error("Module name is required for router template");
|
|
9
9
|
const ext = (0, fs_helpers_1.getUserFileExtension)();
|
|
10
10
|
const controllerPath = imports?.controller || `./${modelName.kebab}.controller.${ext}`;
|
|
11
|
-
const routerConfigTsType = ext === "ts"
|
|
11
|
+
const routerConfigTsType = ext === "ts"
|
|
12
|
+
? `: RouterConfig<${["file-upload", "auth"].includes(modelName.kebab) ? modelName.kebab : "prisma"}>`
|
|
13
|
+
: "";
|
|
12
14
|
const routerConfigTsTypeImport = ext === "ts" ? "import { RouterConfig } from 'arkos'" : "";
|
|
13
15
|
const controllerExists = (0, fs_helpers_1.checkFileExists)(controllerPath);
|
|
14
16
|
const controllerImportLine = controllerExists
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/router-template.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"router-template.js","sourceRoot":"","sources":["../../../../../../../src/utils/cli/utils/template-generator/templates/router-template.ts"],"names":[],"mappings":";;AAMA,wDAsDC;AA5DD,+DAGwC;AAGxC,SAAgB,sBAAsB,CAAC,OAAwB;IAC7D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEvC,IAAI,CAAC,SAAS;QACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,IAAA,iCAAoB,GAAE,CAAC;IACnC,MAAM,cAAc,GAClB,OAAO,EAAE,UAAU,IAAI,KAAK,SAAS,CAAC,KAAK,eAAe,GAAG,EAAE,CAAC;IAElE,MAAM,kBAAkB,GACtB,GAAG,KAAK,IAAI;QACV,CAAC,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG;QACrG,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,wBAAwB,GAC5B,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,gBAAgB,GAAG,IAAA,4BAAe,EAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,oBAAoB,GAAG,gBAAgB;QAC3C,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG;QACL,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,oBACvB,OAAO,EAAE,UAAU;YACnB,KAAK,SAAS,CAAC,KAAK,cAAc,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAClE,GAAG,CAAC;IAER,MAAM,qBAAqB,GAAG,GAAG,SAAS,CAAC,KAAK,wBAAwB,CAAC;IAEzE,OAAO;EACP,oBAAoB;EACpB,wBAAwB;;qBAEL,kBAAkB;;QAE/B,SAAS,CAAC,KAAK;;EAErB,SAAS,CAAC,KAAK;;;2DAG0C,SAAS,CAAC,KAAK;;;;;;;IAOtE,qBAAqB;;;iBAGR,SAAS,CAAC,KAAK;CAC/B,CAAC;AACF,CAAC","sourcesContent":["import {\n checkFileExists,\n getUserFileExtension,\n} from \"../../../../helpers/fs.helpers\";\nimport { TemplateOptions } from \"../../template-generators\";\n\nexport function generateRouterTemplate(options: TemplateOptions): string {\n const { modelName, imports } = options;\n\n if (!modelName)\n throw new Error(\"Module name is required for router template\");\n\n const ext = getUserFileExtension();\n const controllerPath =\n imports?.controller || `./${modelName.kebab}.controller.${ext}`;\n\n const routerConfigTsType =\n ext === \"ts\"\n ? `: RouterConfig<${[\"file-upload\", \"auth\"].includes(modelName.kebab) ? modelName.kebab : \"prisma\"}>`\n : \"\";\n const routerConfigTsTypeImport =\n ext === \"ts\" ? \"import { RouterConfig } from 'arkos'\" : \"\";\n\n const controllerExists = checkFileExists(controllerPath);\n\n const controllerImportLine = controllerExists\n ? `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`\n : `import ${modelName.camel}Controller from \"${\n imports?.controller ||\n `./${modelName.kebab}.controller${ext === \"js\" ? \".\" + \"js\" : \"\"}`\n }\"`;\n\n const controllerHandlerLine = `${modelName.camel}Controller.someHandler`;\n\n return `import { ArkosRouter } from 'arkos'\n${controllerImportLine}\n${routerConfigTsTypeImport}\n\nexport const config${routerConfigTsType} = { }\n\nconst ${modelName.camel}Router = ArkosRouter()\n\n${modelName.camel}Router.get(\n {\n path: \"/custom-endpoint\",\n authentication: { action: \"CustomAction\", resource: \"${modelName.kebab}\" },\n validation: {},\n experimental: {\n openapi: {},\n // uploads: {}\n }\n },\n ${controllerHandlerLine}\n)\n\nexport default ${modelName.camel}Router\n`;\n}\n"]}
|
|
@@ -7,23 +7,31 @@ exports.loadEnvironmentVariables = loadEnvironmentVariables;
|
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
10
|
+
const sheu_1 = __importDefault(require("./sheu"));
|
|
10
11
|
function loadEnvironmentVariables() {
|
|
11
12
|
const ENV = process.env.NODE_ENV;
|
|
12
13
|
const cwd = process.cwd();
|
|
13
14
|
let loadedEnvs = [];
|
|
14
15
|
const envFiles = [
|
|
15
|
-
path_1.default.resolve(cwd, `.env.defaults`),
|
|
16
|
-
path_1.default.resolve(cwd, `.env.${ENV}`),
|
|
17
|
-
path_1.default.resolve(cwd, `.env.${ENV}.local`),
|
|
18
|
-
path_1.default.resolve(cwd, ".env.local"),
|
|
19
16
|
path_1.default.resolve(cwd, ".env"),
|
|
17
|
+
path_1.default.resolve(cwd, ".env.local"),
|
|
18
|
+
...(ENV
|
|
19
|
+
? [
|
|
20
|
+
path_1.default.resolve(cwd, `.env.${ENV}`),
|
|
21
|
+
path_1.default.resolve(cwd, `.env.${ENV}.local`),
|
|
22
|
+
]
|
|
23
|
+
: []),
|
|
20
24
|
];
|
|
21
25
|
envFiles.forEach((filePath) => {
|
|
22
26
|
if (fs_1.default.existsSync(filePath)) {
|
|
23
27
|
if (process.env.ARKOS_BUILD === "true" && filePath.endsWith(".local"))
|
|
24
|
-
|
|
28
|
+
sheu_1.default.warn(`Skipping the local ${filePath.replace(cwd, "").replace("/", "")} files in production build`);
|
|
25
29
|
else {
|
|
26
|
-
const result = dotenv_1.default.config({
|
|
30
|
+
const result = dotenv_1.default.config({
|
|
31
|
+
path: filePath,
|
|
32
|
+
override: true,
|
|
33
|
+
quiet: true,
|
|
34
|
+
});
|
|
27
35
|
if (result.error) {
|
|
28
36
|
console.warn(`Warning: Error loading ${filePath}`, result.error);
|
|
29
37
|
}
|
|
@@ -39,6 +47,6 @@ function loadEnvironmentVariables() {
|
|
|
39
47
|
throw new Error(`Missing required environment variables: ${missingVars.join(", ")}`);
|
|
40
48
|
}
|
|
41
49
|
if (loadedEnvs)
|
|
42
|
-
return loadedEnvs;
|
|
50
|
+
return loadedEnvs.reverse();
|
|
43
51
|
}
|
|
44
52
|
//# sourceMappingURL=dotenv.helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dotenv.helpers.js","sourceRoot":"","sources":["../../../src/utils/dotenv.helpers.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"dotenv.helpers.js","sourceRoot":"","sources":["../../../src/utils/dotenv.helpers.ts"],"names":[],"mappings":";;;;;AAcA,4DAkDC;AAhED,gDAAwB;AACxB,4CAAoB;AACpB,oDAA4B;AAC5B,kDAA0B;AAW1B,SAAgB,wBAAwB;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,UAAU,GAAa,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG;QACf,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QACzB,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC;QAC/B,GAAG,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC;gBAChC,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,QAAQ,CAAC;aACvC;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IAEF,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5B,IAAI,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACnE,cAAI,CAAC,IAAI,CACP,sBAAsB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,4BAA4B,CAC7F,CAAC;iBACC,CAAC;gBACJ,MAAM,MAAM,GAAG,gBAAM,CAAC,MAAM,CAAC;oBAC3B,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI;oBACd,KAAK,EAAE,IAAI;iBACL,CAAC,CAAC;gBAEV,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,OAAO,CAAC,IAAI,CAAC,0BAA0B,QAAQ,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,CAAC;;oBAAM,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5E,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CACX,yCAAyC,EACzC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,IAAI,KAAK,CACb,2CAA2C,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;AAC9C,CAAC","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport dotenv from \"dotenv\";\nimport sheu from \"./sheu\";\n\n/**\n * Loads environment variables in a prioritized order\n * 1. Base defaults (.env.defaults) - lowest priority\n * 2. Environment-specific (.env.{NODE_ENV})\n * 3. Environment-specific local (.env.{NODE_ENV}.local)\n * 4. Local environment overrides (.env.local)\n * 5. Main .env file (.env)\n * 6. Process environment variables - highest priority (already loaded by Node)\n */\nexport function loadEnvironmentVariables() {\n const ENV = process.env.NODE_ENV;\n const cwd = process.cwd();\n let loadedEnvs: string[] = [];\n\n const envFiles = [\n path.resolve(cwd, \".env\"),\n path.resolve(cwd, \".env.local\"),\n ...(ENV\n ? [\n path.resolve(cwd, `.env.${ENV}`),\n path.resolve(cwd, `.env.${ENV}.local`),\n ]\n : []),\n ];\n\n envFiles.forEach((filePath) => {\n if (fs.existsSync(filePath)) {\n if (process.env.ARKOS_BUILD === \"true\" && filePath.endsWith(\".local\"))\n sheu.warn(\n `Skipping the local ${filePath.replace(cwd, \"\").replace(\"/\", \"\")} files in production build`\n );\n else {\n const result = dotenv.config({\n path: filePath,\n override: true,\n quiet: true,\n } as any);\n\n if (result.error) {\n console.warn(`Warning: Error loading ${filePath}`, result.error);\n } else loadedEnvs.push(filePath);\n }\n }\n });\n\n const requiredVars = [\"DATABASE_URL\"];\n const missingVars = requiredVars.filter((varName) => !process.env[varName]);\n\n if (missingVars.length > 0) {\n console.error(\n \"Missing required environment variables:\",\n missingVars.join(\", \")\n );\n throw new Error(\n `Missing required environment variables: ${missingVars.join(\", \")}`\n );\n }\n\n if (loadedEnvs) return loadedEnvs.reverse();\n}\n"]}
|
|
@@ -5,6 +5,168 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.parseQueryParamsWithModifiers = parseQueryParamsWithModifiers;
|
|
7
7
|
const deepmerge_helper_1 = __importDefault(require("./deepmerge.helper"));
|
|
8
|
+
function parseKey(key) {
|
|
9
|
+
const fields = [];
|
|
10
|
+
let i = 0;
|
|
11
|
+
while (i < key.length) {
|
|
12
|
+
if (key[i] === "_" && key[i + 1] === "_") {
|
|
13
|
+
i += 2;
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (key[i] === "[") {
|
|
17
|
+
const closingBracket = key.indexOf("]", i);
|
|
18
|
+
if (closingBracket === -1)
|
|
19
|
+
break;
|
|
20
|
+
const bracketContent = key.substring(i + 1, closingBracket);
|
|
21
|
+
if (bracketContent) {
|
|
22
|
+
fields.push(bracketContent);
|
|
23
|
+
}
|
|
24
|
+
i = closingBracket + 1;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
let nextDelimiter = key.length;
|
|
28
|
+
const nextUnderscore = key.indexOf("__", i);
|
|
29
|
+
const nextBracket = key.indexOf("[", i);
|
|
30
|
+
if (nextUnderscore !== -1 && nextUnderscore < nextDelimiter) {
|
|
31
|
+
nextDelimiter = nextUnderscore;
|
|
32
|
+
}
|
|
33
|
+
if (nextBracket !== -1 && nextBracket < nextDelimiter) {
|
|
34
|
+
nextDelimiter = nextBracket;
|
|
35
|
+
}
|
|
36
|
+
const fieldName = key.substring(i, nextDelimiter);
|
|
37
|
+
if (fieldName) {
|
|
38
|
+
fields.push(fieldName);
|
|
39
|
+
}
|
|
40
|
+
i = nextDelimiter;
|
|
41
|
+
}
|
|
42
|
+
if (fields.length === 0)
|
|
43
|
+
return { fields: [], operator: null };
|
|
44
|
+
const possibleOperators = [
|
|
45
|
+
"icontains",
|
|
46
|
+
"contains",
|
|
47
|
+
"in",
|
|
48
|
+
"notIn",
|
|
49
|
+
"hasSome",
|
|
50
|
+
"hasEvery",
|
|
51
|
+
"or",
|
|
52
|
+
"isNull",
|
|
53
|
+
"isEmpty",
|
|
54
|
+
"gt",
|
|
55
|
+
"gte",
|
|
56
|
+
"lt",
|
|
57
|
+
"lte",
|
|
58
|
+
"equals",
|
|
59
|
+
"startsWith",
|
|
60
|
+
"endsWith",
|
|
61
|
+
"not",
|
|
62
|
+
"some",
|
|
63
|
+
"none",
|
|
64
|
+
"every",
|
|
65
|
+
];
|
|
66
|
+
const lastField = fields[fields.length - 1];
|
|
67
|
+
if (possibleOperators.includes(lastField)) {
|
|
68
|
+
const operator = fields.pop();
|
|
69
|
+
return { fields, operator };
|
|
70
|
+
}
|
|
71
|
+
return { fields, operator: null };
|
|
72
|
+
}
|
|
73
|
+
function buildNestedObject(fields, operator, value, fieldConfig) {
|
|
74
|
+
if (fields.length === 0)
|
|
75
|
+
return {};
|
|
76
|
+
const firstField = fields[0];
|
|
77
|
+
if (firstField === "orderBy" && fields.length === 2 && !operator) {
|
|
78
|
+
return {
|
|
79
|
+
orderBy: {
|
|
80
|
+
[fields[1]]: value,
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (fields.length === 1 && !operator) {
|
|
85
|
+
if (typeof value === "object" && value !== null) {
|
|
86
|
+
return { [firstField]: value };
|
|
87
|
+
}
|
|
88
|
+
const convertedValue = typeof value === "string"
|
|
89
|
+
? convertValue(value, firstField, fieldConfig)
|
|
90
|
+
: value;
|
|
91
|
+
return { [firstField]: convertedValue };
|
|
92
|
+
}
|
|
93
|
+
if (operator === "or") {
|
|
94
|
+
const values = Array.isArray(value) ? value : value.toString().split(",");
|
|
95
|
+
return {
|
|
96
|
+
OR: values.map((val) => {
|
|
97
|
+
const nested = {};
|
|
98
|
+
let current = nested;
|
|
99
|
+
for (let i = 0; i < fields.length - 1; i++) {
|
|
100
|
+
current[fields[i]] = {};
|
|
101
|
+
current = current[fields[i]];
|
|
102
|
+
}
|
|
103
|
+
current[fields[fields.length - 1]] = {
|
|
104
|
+
equals: convertValue(typeof val === "string" ? val.trim() : val, fields[0], fieldConfig),
|
|
105
|
+
};
|
|
106
|
+
return nested;
|
|
107
|
+
}),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const result = {};
|
|
111
|
+
let current = result;
|
|
112
|
+
for (let i = 0; i < fields.length - 1; i++) {
|
|
113
|
+
current[fields[i]] = {};
|
|
114
|
+
current = current[fields[i]];
|
|
115
|
+
}
|
|
116
|
+
const lastField = fields[fields.length - 1];
|
|
117
|
+
if (!operator) {
|
|
118
|
+
current[lastField] = {
|
|
119
|
+
equals: convertValue(value, fields[0], fieldConfig),
|
|
120
|
+
};
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
const stringValue = typeof value === "string" ? value : value?.toString();
|
|
124
|
+
switch (operator) {
|
|
125
|
+
case "icontains":
|
|
126
|
+
current[lastField] = {
|
|
127
|
+
contains: stringValue,
|
|
128
|
+
mode: "insensitive",
|
|
129
|
+
};
|
|
130
|
+
break;
|
|
131
|
+
case "contains":
|
|
132
|
+
current[lastField] = {
|
|
133
|
+
contains: stringValue,
|
|
134
|
+
mode: "sensitive",
|
|
135
|
+
};
|
|
136
|
+
break;
|
|
137
|
+
case "in":
|
|
138
|
+
case "notIn":
|
|
139
|
+
const inValues = Array.isArray(value) ? value : stringValue.split(",");
|
|
140
|
+
current[lastField] = {
|
|
141
|
+
[operator]: inValues.map((v) => convertValue(typeof v === "string" ? v.trim() : v, fields[0], fieldConfig)),
|
|
142
|
+
};
|
|
143
|
+
break;
|
|
144
|
+
case "hasSome":
|
|
145
|
+
case "hasEvery":
|
|
146
|
+
const arrayValues = Array.isArray(value) ? value : stringValue.split(",");
|
|
147
|
+
current[lastField] = {
|
|
148
|
+
[operator]: arrayValues.map((v) => convertValue(typeof v === "string" ? v.trim() : v, fields[0], fieldConfig)),
|
|
149
|
+
};
|
|
150
|
+
break;
|
|
151
|
+
case "isNull":
|
|
152
|
+
current[lastField] = {
|
|
153
|
+
equals: stringValue?.toLowerCase() === "true" ? null : undefined,
|
|
154
|
+
};
|
|
155
|
+
break;
|
|
156
|
+
case "isEmpty":
|
|
157
|
+
current[lastField] = {
|
|
158
|
+
equals: stringValue?.toLowerCase() === "true" ? "" : undefined,
|
|
159
|
+
};
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
current[lastField] = {
|
|
163
|
+
[operator]: value === null
|
|
164
|
+
? null
|
|
165
|
+
: convertValue(stringValue, fields[0], fieldConfig),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
8
170
|
const DEFAULT_FIELD_CONFIG = {
|
|
9
171
|
dateFields: ["createdAt", "updatedAt", "deletedAt", "date"],
|
|
10
172
|
booleanFields: ["isActive", "isDeleted", "isPublished", "isArchived"],
|
|
@@ -14,98 +176,29 @@ function parseQueryParamsWithModifiers(query, fieldConfig = DEFAULT_FIELD_CONFIG
|
|
|
14
176
|
const entries = Object.entries(JSON.parse(JSON.stringify(query)));
|
|
15
177
|
let result = {};
|
|
16
178
|
for (const [key, value] of entries) {
|
|
17
|
-
|
|
18
|
-
if (!value && value !== false && value !== "false" && parts.length < 2)
|
|
179
|
+
if (value === undefined)
|
|
19
180
|
continue;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
typeof value === "string" && !Number.isNaN(value)
|
|
25
|
-
? convertValue(stringValue, parts[0], fieldConfig)
|
|
26
|
-
: value;
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
const fieldName = parts[0];
|
|
30
|
-
if (fieldName === "orderBy" && parts.length === 2) {
|
|
31
|
-
currentResult.orderBy = {};
|
|
32
|
-
currentResult.orderBy[parts[1]] = stringValue;
|
|
33
|
-
}
|
|
34
|
-
else if (parts.length === 1) {
|
|
35
|
-
currentResult[fieldName] = {
|
|
36
|
-
equals: convertValue(stringValue, fieldName, fieldConfig),
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
let nestedObj = {};
|
|
41
|
-
let currentLevel = nestedObj;
|
|
42
|
-
let currentKey = fieldName;
|
|
43
|
-
for (let i = 1; i < parts.length - 1; i++) {
|
|
44
|
-
currentLevel[currentKey] = {};
|
|
45
|
-
currentLevel = currentLevel[currentKey];
|
|
46
|
-
currentKey = parts[i];
|
|
47
|
-
}
|
|
48
|
-
const lastOperator = parts[parts.length - 1];
|
|
49
|
-
switch (lastOperator) {
|
|
50
|
-
case "icontains":
|
|
51
|
-
currentLevel[currentKey] = {
|
|
52
|
-
contains: stringValue,
|
|
53
|
-
mode: "insensitive",
|
|
54
|
-
};
|
|
55
|
-
break;
|
|
56
|
-
case "contains":
|
|
57
|
-
currentLevel[currentKey] = {
|
|
58
|
-
contains: stringValue,
|
|
59
|
-
mode: "sensitive",
|
|
60
|
-
};
|
|
61
|
-
break;
|
|
62
|
-
case "in":
|
|
63
|
-
case "notIn":
|
|
64
|
-
currentLevel[currentKey] = {
|
|
65
|
-
[lastOperator]: stringValue
|
|
66
|
-
.split(",")
|
|
67
|
-
.map((v) => convertValue(v.trim(), fieldName, fieldConfig)),
|
|
68
|
-
};
|
|
69
|
-
break;
|
|
70
|
-
case "or":
|
|
71
|
-
const values = stringValue.split(",");
|
|
72
|
-
nestedObj.OR = values.map((val) => ({
|
|
73
|
-
[fieldName]: {
|
|
74
|
-
equals: convertValue(val.trim(), fieldName, fieldConfig),
|
|
75
|
-
},
|
|
76
|
-
}));
|
|
77
|
-
break;
|
|
78
|
-
case "isNull":
|
|
79
|
-
currentLevel[currentKey] = {
|
|
80
|
-
equals: stringValue.toLowerCase() === "true" ? null : undefined,
|
|
81
|
-
};
|
|
82
|
-
break;
|
|
83
|
-
case "isEmpty":
|
|
84
|
-
currentLevel[currentKey] = {
|
|
85
|
-
equals: stringValue.toLowerCase() === "true" ? "" : undefined,
|
|
86
|
-
};
|
|
87
|
-
break;
|
|
88
|
-
default:
|
|
89
|
-
currentLevel[currentKey] = {
|
|
90
|
-
[lastOperator]: convertValue(stringValue, fieldName, fieldConfig),
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
currentResult = nestedObj;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
181
|
+
const { fields, operator } = parseKey(key);
|
|
182
|
+
if (fields.length === 0)
|
|
183
|
+
continue;
|
|
184
|
+
const currentResult = buildNestedObject(fields, operator, value, fieldConfig);
|
|
96
185
|
result = (0, deepmerge_helper_1.default)(result, currentResult);
|
|
97
186
|
}
|
|
98
187
|
return result;
|
|
99
188
|
}
|
|
100
189
|
function convertValue(value, fieldName, config) {
|
|
190
|
+
if (typeof value !== "string") {
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
101
193
|
if (config.dateFields?.includes?.(fieldName) && value) {
|
|
102
194
|
return new Date(value);
|
|
103
195
|
}
|
|
104
|
-
if (config.booleanFields?.includes?.(fieldName)
|
|
196
|
+
if (config.booleanFields?.includes?.(fieldName)) {
|
|
105
197
|
return value.toLowerCase() === "true";
|
|
106
198
|
}
|
|
107
|
-
if (config.numericFields?.includes?.(fieldName)
|
|
108
|
-
|
|
199
|
+
if (config.numericFields?.includes?.(fieldName)) {
|
|
200
|
+
const num = Number(value);
|
|
201
|
+
return isNaN(num) ? value : num;
|
|
109
202
|
}
|
|
110
203
|
return value;
|
|
111
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.features.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/api.features.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"./deepmerge.helper\";\n\n/**\n * Configuration types for field type mapping\n */\ninterface FieldConfig {\n dateFields: string[];\n booleanFields: string[];\n numericFields: string[];\n}\n\n/**\n * Type for the structured filter object returned by the parser\n */\ntype ParsedFilter = {\n [key: string]: any;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n OR?: Record<string, any>[];\n};\n\n/**\n * Default configuration for field types\n */\nconst DEFAULT_FIELD_CONFIG: FieldConfig = {\n dateFields: [\"createdAt\", \"updatedAt\", \"deletedAt\", \"date\"],\n booleanFields: [\"isActive\", \"isDeleted\", \"isPublished\", \"isArchived\"],\n numericFields: [\"age\", \"price\", \"quantity\", \"amount\", \"rating\"],\n};\n\n/**\n * Parses query parameters into a structured filter object compatible with Prisma queries.\n * Supports various operators and data type conversions with deep merge strategy.\n *\n * @param query - Object containing query parameters\n * @param fieldConfig - Optional configuration for field type mapping\n * @returns Structured filter object for database queries\n *\n * @example\n * // Basic usage\n * parseQueryParamsWithModifiers({ name__contains: 'john' })\n * // => { name: { contains: 'john', mode: 'sensitive' } }\n *\n * @example\n * // Deep merge example\n * parseQueryParamsWithModifiers({\n * 'some__data': '1',\n * 'some__info': '2'\n * })\n * // => { some: { data: '1', info: '2' } }\n *\n * @example\n * // Complex query\n * parseQueryParamsWithModifiers({\n * name__not__equals: 'john',\n * age__gt: '25',\n * tags__in: 'tag1,tag2',\n * orderBy__createdAt: 'desc'\n * })\n */\nexport function parseQueryParamsWithModifiers(\n query: Record<string, any>,\n fieldConfig: FieldConfig = DEFAULT_FIELD_CONFIG\n): ParsedFilter {\n const entries = Object.entries(JSON.parse(JSON.stringify(query)));\n let result: ParsedFilter = {};\n\n for (const [key, value] of entries) {\n const parts = key.split(\"__\");\n if (!value && value !== false && value !== \"false\" && parts.length < 2)\n continue;\n\n const stringValue = Array.isArray(value) ? value[0]?.toString() : value;\n\n let currentResult: any = {};\n\n if (parts.length < 2) {\n currentResult[key] =\n typeof value === \"string\" && !Number.isNaN(value)\n ? convertValue(stringValue, parts[0], fieldConfig)\n : value;\n } else {\n const fieldName = parts[0];\n\n if (fieldName === \"orderBy\" && parts.length === 2) {\n currentResult.orderBy = {};\n currentResult.orderBy[parts[1]] = stringValue as \"asc\" | \"desc\";\n } else if (parts.length === 1) {\n currentResult[fieldName] = {\n equals: convertValue(stringValue, fieldName, fieldConfig),\n };\n } else {\n let nestedObj: any = {};\n let currentLevel = nestedObj;\n let currentKey = fieldName;\n\n for (let i = 1; i < parts.length - 1; i++) {\n currentLevel[currentKey] = {};\n currentLevel = currentLevel[currentKey];\n currentKey = parts[i];\n }\n\n const lastOperator = parts[parts.length - 1];\n\n switch (lastOperator) {\n case \"icontains\":\n currentLevel[currentKey] = {\n contains: stringValue,\n mode: \"insensitive\",\n };\n break;\n\n case \"contains\":\n currentLevel[currentKey] = {\n contains: stringValue,\n mode: \"sensitive\",\n };\n break;\n\n case \"in\":\n case \"notIn\":\n currentLevel[currentKey] = {\n [lastOperator]: stringValue\n .split(\",\")\n .map((v: string) =>\n convertValue(v.trim(), fieldName, fieldConfig)\n ),\n };\n break;\n\n case \"or\":\n const values: string[] = stringValue.split(\",\");\n nestedObj.OR = values.map((val) => ({\n [fieldName]: {\n equals: convertValue(val.trim(), fieldName, fieldConfig),\n },\n }));\n break;\n\n case \"isNull\":\n currentLevel[currentKey] = {\n equals: stringValue.toLowerCase() === \"true\" ? null : undefined,\n };\n break;\n\n case \"isEmpty\":\n currentLevel[currentKey] = {\n equals: stringValue.toLowerCase() === \"true\" ? \"\" : undefined,\n };\n break;\n\n default:\n currentLevel[currentKey] = {\n [lastOperator]: convertValue(stringValue, fieldName, fieldConfig),\n };\n }\n\n currentResult = nestedObj;\n }\n }\n\n // Deep merge the current result with the accumulated result\n result = deepmerge(result, currentResult);\n }\n\n return result;\n}\n\n/**\n * Converts string values to appropriate types based on field configuration\n *\n * @example\n * // Example usage:\n * const query = {\n * name__not__equals: 'uanela',\n * email__contains: 'example.com',\n * description__icontains: 'test',\n * age__gt: '25',\n * status: 'active',\n * tags__in: 'tag1,tag2,tag3',\n * createdAt__gt: '2024-01-01',\n * isActive: 'true',\n * orderBy__createdAt: 'desc',\n * some__data: '1',\n * some__info: '2'\n * };\n *\n * const result = parseQueryParamsWithModifiers(query);\n * // Result will properly merge nested objects instead of overwriting\n */\nfunction convertValue(\n value: string,\n fieldName: string,\n config: FieldConfig\n): any {\n // Handle date fields\n if (config.dateFields?.includes?.(fieldName) && value) {\n return new Date(value);\n }\n\n // Handle boolean fields\n if (config.booleanFields?.includes?.(fieldName) && value) {\n return value.toLowerCase() === \"true\";\n }\n\n // Handle numeric fields\n if (config.numericFields?.includes?.(fieldName) && value) {\n return Number(value);\n }\n\n return value;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.features.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/api.features.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import deepmerge from \"./deepmerge.helper\";\n\nfunction parseKey(key: string): { fields: string[]; operator: string | null } {\n const fields: string[] = [];\n let i = 0;\n\n while (i < key.length) {\n if (key[i] === \"_\" && key[i + 1] === \"_\") {\n i += 2;\n continue;\n }\n\n if (key[i] === \"[\") {\n const closingBracket = key.indexOf(\"]\", i);\n if (closingBracket === -1) break;\n\n const bracketContent = key.substring(i + 1, closingBracket);\n if (bracketContent) {\n fields.push(bracketContent);\n }\n i = closingBracket + 1;\n continue;\n }\n\n let nextDelimiter = key.length;\n const nextUnderscore = key.indexOf(\"__\", i);\n const nextBracket = key.indexOf(\"[\", i);\n\n if (nextUnderscore !== -1 && nextUnderscore < nextDelimiter) {\n nextDelimiter = nextUnderscore;\n }\n if (nextBracket !== -1 && nextBracket < nextDelimiter) {\n nextDelimiter = nextBracket;\n }\n\n const fieldName = key.substring(i, nextDelimiter);\n if (fieldName) {\n fields.push(fieldName);\n }\n i = nextDelimiter;\n }\n\n if (fields.length === 0) return { fields: [], operator: null };\n\n const possibleOperators = [\n \"icontains\",\n \"contains\",\n \"in\",\n \"notIn\",\n \"hasSome\",\n \"hasEvery\",\n \"or\",\n \"isNull\",\n \"isEmpty\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"equals\",\n \"startsWith\",\n \"endsWith\",\n \"not\",\n \"some\",\n \"none\",\n \"every\",\n ];\n\n const lastField = fields[fields.length - 1];\n if (possibleOperators.includes(lastField)) {\n const operator = fields.pop()!;\n return { fields, operator };\n }\n\n return { fields, operator: null };\n}\n\nfunction buildNestedObject(\n fields: string[],\n operator: string | null,\n value: any,\n fieldConfig: FieldConfig\n): any {\n if (fields.length === 0) return {};\n\n const firstField = fields[0];\n\n if (firstField === \"orderBy\" && fields.length === 2 && !operator) {\n return {\n orderBy: {\n [fields[1]]: value as \"asc\" | \"desc\",\n },\n };\n }\n\n if (fields.length === 1 && !operator) {\n if (typeof value === \"object\" && value !== null) {\n return { [firstField]: value };\n }\n\n const convertedValue =\n typeof value === \"string\"\n ? convertValue(value, firstField, fieldConfig)\n : value;\n return { [firstField]: convertedValue };\n }\n\n if (operator === \"or\") {\n const values = Array.isArray(value) ? value : value.toString().split(\",\");\n\n return {\n OR: values.map((val: any) => {\n const nested: any = {};\n let current = nested;\n\n for (let i = 0; i < fields.length - 1; i++) {\n current[fields[i]] = {};\n current = current[fields[i]];\n }\n\n current[fields[fields.length - 1]] = {\n equals: convertValue(\n typeof val === \"string\" ? val.trim() : val,\n fields[0],\n fieldConfig\n ),\n };\n\n return nested;\n }),\n };\n }\n\n const result: any = {};\n let current = result;\n\n for (let i = 0; i < fields.length - 1; i++) {\n current[fields[i]] = {};\n current = current[fields[i]];\n }\n\n const lastField = fields[fields.length - 1];\n\n if (!operator) {\n current[lastField] = {\n equals: convertValue(value, fields[0], fieldConfig),\n };\n return result;\n }\n\n const stringValue = typeof value === \"string\" ? value : value?.toString();\n\n switch (operator) {\n case \"icontains\":\n current[lastField] = {\n contains: stringValue,\n mode: \"insensitive\",\n };\n break;\n\n case \"contains\":\n current[lastField] = {\n contains: stringValue,\n mode: \"sensitive\",\n };\n break;\n\n case \"in\":\n case \"notIn\":\n const inValues = Array.isArray(value) ? value : stringValue.split(\",\");\n\n current[lastField] = {\n [operator]: inValues.map((v: any) =>\n convertValue(\n typeof v === \"string\" ? v.trim() : v,\n fields[0],\n fieldConfig\n )\n ),\n };\n break;\n\n case \"hasSome\":\n case \"hasEvery\":\n const arrayValues = Array.isArray(value) ? value : stringValue.split(\",\");\n\n current[lastField] = {\n [operator]: arrayValues.map((v: any) =>\n convertValue(\n typeof v === \"string\" ? v.trim() : v,\n fields[0],\n fieldConfig\n )\n ),\n };\n break;\n\n case \"isNull\":\n current[lastField] = {\n equals: stringValue?.toLowerCase() === \"true\" ? null : undefined,\n };\n break;\n\n case \"isEmpty\":\n current[lastField] = {\n equals: stringValue?.toLowerCase() === \"true\" ? \"\" : undefined,\n };\n break;\n\n default:\n current[lastField] = {\n [operator]:\n value === null\n ? null\n : convertValue(stringValue, fields[0], fieldConfig),\n };\n }\n\n return result;\n}\n\n/**\n * Configuration types for field type mapping\n */\ninterface FieldConfig {\n dateFields: string[];\n booleanFields: string[];\n numericFields: string[];\n}\n\n/**\n * Type for the structured filter object returned by the parser\n */\ntype ParsedFilter = {\n [key: string]: any;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n OR?: Record<string, any>[];\n};\n\n/**\n * Default configuration for field types\n */\nconst DEFAULT_FIELD_CONFIG: FieldConfig = {\n dateFields: [\"createdAt\", \"updatedAt\", \"deletedAt\", \"date\"],\n booleanFields: [\"isActive\", \"isDeleted\", \"isPublished\", \"isArchived\"],\n numericFields: [\"age\", \"price\", \"quantity\", \"amount\", \"rating\"],\n};\n\n/**\n * Parses query parameters into a structured filter object compatible with Prisma queries.\n * Supports various operators and data type conversions with deep merge strategy.\n *\n * @param query - Object containing query parameters\n * @param fieldConfig - Optional configuration for field type mapping\n * @returns Structured filter object for database queries\n *\n * @example\n * // Basic usage\n * parseQueryParamsWithModifiers({ name__contains: 'john' })\n * // => { name: { contains: 'john', mode: 'sensitive' } }\n *\n * @example\n * // Deep merge example\n * parseQueryParamsWithModifiers({\n * 'some__data': '1',\n * 'some__info': '2'\n * })\n * // => { some: { data: '1', info: '2' } }\n *\n * @example\n * // Complex query\n * parseQueryParamsWithModifiers({\n * name__not__equals: 'john',\n * age__gt: '25',\n * tags__in: 'tag1,tag2',\n * orderBy__createdAt: 'desc'\n * })\n */\nexport function parseQueryParamsWithModifiers(\n query: Record<string, any>,\n fieldConfig: FieldConfig = DEFAULT_FIELD_CONFIG\n): ParsedFilter {\n const entries = Object.entries(JSON.parse(JSON.stringify(query)));\n let result: ParsedFilter = {};\n\n for (const [key, value] of entries) {\n if (value === undefined) continue;\n\n const { fields, operator } = parseKey(key);\n\n if (fields.length === 0) continue;\n\n const currentResult = buildNestedObject(\n fields,\n operator,\n value,\n fieldConfig\n );\n result = deepmerge(result, currentResult);\n }\n\n return result;\n}\n\n/**\n * Converts string values to appropriate types based on field configuration\n *\n * @example\n * // Example usage:\n * const query = {\n * name__not__equals: 'uanela',\n * email__contains: 'example.com',\n * description__icontains: 'test',\n * age__gt: '25',\n * status: 'active',\n * tags__in: 'tag1,tag2,tag3',\n * createdAt__gt: '2024-01-01',\n * isActive: 'true',\n * orderBy__createdAt: 'desc',\n * some__data: '1',\n * some__info: '2'\n * };\n *\n * const result = parseQueryParamsWithModifiers(query);\n * // Result will properly merge nested objects instead of overwriting\n */\nfunction convertValue(\n value: string,\n fieldName: string,\n config: FieldConfig\n): any {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (config.dateFields?.includes?.(fieldName) && value) {\n return new Date(value);\n }\n\n if (config.booleanFields?.includes?.(fieldName)) {\n return value.toLowerCase() === \"true\";\n }\n\n if (config.numericFields?.includes?.(fieldName)) {\n const num = Number(value);\n return isNaN(num) ? value : num;\n }\n\n return value;\n}\n"]}
|
|
@@ -5,11 +5,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.prismaInstance = void 0;
|
|
7
7
|
exports.loadPrismaModule = loadPrismaModule;
|
|
8
|
+
exports.handlePrismaGet = handlePrismaGet;
|
|
8
9
|
exports.getPrismaInstance = getPrismaInstance;
|
|
9
10
|
const fs_1 = __importDefault(require("fs"));
|
|
10
11
|
const app_error_1 = __importDefault(require("../../modules/error-handler/utils/app-error"));
|
|
11
12
|
const fs_helpers_1 = require("./fs.helpers");
|
|
12
13
|
const global_helpers_1 = require("./global.helpers");
|
|
14
|
+
const prisma_schema_parser_1 = __importDefault(require("../prisma/prisma-schema-parser"));
|
|
15
|
+
const arkos_config_helpers_1 = require("./arkos-config.helpers");
|
|
16
|
+
const sheu_1 = __importDefault(require("../sheu"));
|
|
13
17
|
exports.prismaInstance = null;
|
|
14
18
|
async function loadPrismaModule() {
|
|
15
19
|
if (!exports.prismaInstance) {
|
|
@@ -34,7 +38,42 @@ async function loadPrismaModule() {
|
|
|
34
38
|
}
|
|
35
39
|
return exports.prismaInstance;
|
|
36
40
|
}
|
|
41
|
+
function handlePrismaGet(target, prop, receiver) {
|
|
42
|
+
const originalProperty = Reflect.get(target, prop, receiver);
|
|
43
|
+
const isModel = prisma_schema_parser_1.default
|
|
44
|
+
.getModelsAsArrayOfStrings()
|
|
45
|
+
.find((m) => m.toLowerCase() === prop?.toLowerCase?.());
|
|
46
|
+
if (isModel && originalProperty) {
|
|
47
|
+
return new Proxy(originalProperty, {
|
|
48
|
+
get(modelTarget, methodName, modelReceiver) {
|
|
49
|
+
const originalMethod = Reflect.get(modelTarget, methodName, modelReceiver);
|
|
50
|
+
if (typeof originalMethod === "function") {
|
|
51
|
+
return function (...args) {
|
|
52
|
+
const config = (0, arkos_config_helpers_1.getArkosConfig)();
|
|
53
|
+
const debugLevel = config.debugging?.requests?.level || 0;
|
|
54
|
+
if (debugLevel >= 3) {
|
|
55
|
+
const queryArgs = args[0];
|
|
56
|
+
if (queryArgs && Object.keys(queryArgs).length > 0) {
|
|
57
|
+
sheu_1.default.debug(`Final Prisma Args\n${JSON.stringify(queryArgs, null, 2)}`, { timestamp: true });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
sheu_1.default.debug(`Final Prisma Args - Empty`, { timestamp: true });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return originalMethod.apply(modelTarget, args);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return originalMethod;
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
return originalProperty;
|
|
71
|
+
}
|
|
37
72
|
function getPrismaInstance() {
|
|
38
|
-
|
|
73
|
+
if (!exports.prismaInstance)
|
|
74
|
+
return null;
|
|
75
|
+
return new Proxy(exports.prismaInstance, {
|
|
76
|
+
get: handlePrismaGet,
|
|
77
|
+
});
|
|
39
78
|
}
|
|
40
79
|
//# sourceMappingURL=prisma.helpers.js.map
|