arkos 1.0.1-beta → 1.0.2-alpha

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 (65) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/app.js +1 -1
  3. package/dist/cjs/app.js.map +1 -1
  4. package/dist/cjs/exports/services/index.js +3 -3
  5. package/dist/cjs/exports/services/index.js.map +1 -1
  6. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js +0 -1
  7. package/dist/cjs/modules/auth/__tests__/auth.controller.test.js.map +1 -1
  8. package/dist/cjs/modules/auth/__tests__/auth.service.test.js +470 -0
  9. package/dist/cjs/modules/auth/__tests__/auth.service.test.js.map +1 -0
  10. package/dist/cjs/modules/auth/auth.service.js +30 -9
  11. package/dist/cjs/modules/auth/auth.service.js.map +1 -1
  12. package/dist/cjs/modules/email/email.service.js +12 -7
  13. package/dist/cjs/modules/email/email.service.js.map +1 -1
  14. package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js +402 -0
  15. package/dist/cjs/modules/file-uploader/__tests__/file-uploader.service.test.js.map +1 -0
  16. package/dist/cjs/modules/file-uploader/file-uploader.controller.js +226 -0
  17. package/dist/cjs/modules/file-uploader/file-uploader.controller.js.map +1 -0
  18. package/dist/cjs/modules/file-uploader/file-uploader.router.js +50 -0
  19. package/dist/cjs/modules/file-uploader/file-uploader.router.js.map +1 -0
  20. package/dist/cjs/modules/file-uploader/file-uploader.service.js +299 -0
  21. package/dist/cjs/modules/file-uploader/file-uploader.service.js.map +1 -0
  22. package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js +164 -0
  23. package/dist/cjs/modules/file-uploader/utils/helpers/__tests__/file-uploader.helpers.test.js.map +1 -0
  24. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js +85 -0
  25. package/dist/cjs/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -0
  26. package/dist/cjs/server.js +1 -1
  27. package/dist/cjs/server.js.map +1 -1
  28. package/dist/cjs/types/arkos-config.js.map +1 -1
  29. package/dist/cjs/types/auth.js.map +1 -1
  30. package/dist/cjs/types/index.js.map +1 -1
  31. package/dist/cjs/utils/helpers/models.helpers.js +19 -6
  32. package/dist/cjs/utils/helpers/models.helpers.js.map +1 -1
  33. package/dist/es2020/app.js +1 -1
  34. package/dist/es2020/app.js.map +1 -1
  35. package/dist/es2020/exports/services/index.js +1 -1
  36. package/dist/es2020/exports/services/index.js.map +1 -1
  37. package/dist/es2020/modules/auth/auth.service.js +30 -9
  38. package/dist/es2020/modules/auth/auth.service.js.map +1 -1
  39. package/dist/es2020/modules/email/email.service.js +12 -7
  40. package/dist/es2020/modules/email/email.service.js.map +1 -1
  41. package/dist/es2020/modules/file-uploader/file-uploader.controller.js +220 -0
  42. package/dist/es2020/modules/file-uploader/file-uploader.controller.js.map +1 -0
  43. package/dist/es2020/modules/file-uploader/file-uploader.router.js +44 -0
  44. package/dist/es2020/modules/file-uploader/file-uploader.router.js.map +1 -0
  45. package/dist/es2020/modules/file-uploader/file-uploader.service.js +291 -0
  46. package/dist/es2020/modules/file-uploader/file-uploader.service.js.map +1 -0
  47. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js +77 -0
  48. package/dist/es2020/modules/file-uploader/utils/helpers/file-uploader.helpers.js.map +1 -0
  49. package/dist/es2020/server.js +1 -1
  50. package/dist/es2020/server.js.map +1 -1
  51. package/dist/es2020/types/arkos-config.js.map +1 -1
  52. package/dist/es2020/types/auth.js.map +1 -1
  53. package/dist/es2020/types/index.js.map +1 -1
  54. package/dist/es2020/utils/helpers/models.helpers.js +19 -6
  55. package/dist/es2020/utils/helpers/models.helpers.js.map +1 -1
  56. package/dist/types/exports/services/index.d.ts +1 -1
  57. package/dist/types/modules/email/email.service.d.ts +1 -2
  58. package/dist/types/modules/file-uploader/file-uploader.controller.d.ts +3 -0
  59. package/dist/types/modules/file-uploader/file-uploader.router.d.ts +3 -0
  60. package/dist/types/modules/file-uploader/file-uploader.service.d.ts +30 -0
  61. package/dist/types/modules/file-uploader/utils/helpers/file-uploader.helpers.d.ts +2 -0
  62. package/dist/types/types/arkos-config.d.ts +8 -1
  63. package/dist/types/types/auth.d.ts +2 -2
  64. package/dist/types/types/index.d.ts +1 -0
  65. package/package.json +6 -7
@@ -149,11 +149,24 @@ export function importPrismaModelModules(modelName) {
149
149
  const schemaFolderPath = process.env.PRISMA_SCHEMA_PATH || arkosEnv.PRISMA_SCHEMA_PATH;
150
150
  const prismaModelRelationFields = {};
151
151
  const prismaContent = [];
152
- const files = fs
153
- .readdirSync(schemaFolderPath)
154
- .filter((file) => file.endsWith(".prisma"));
152
+ function getAllPrismaFiles(dirPath, fileList = []) {
153
+ const files = fs.readdirSync(dirPath);
154
+ files === null || files === void 0 ? void 0 : files.forEach((file) => {
155
+ const filePath = path.join(dirPath, file);
156
+ const stat = fs.statSync(filePath);
157
+ if (stat.isDirectory() && file !== "migrations") {
158
+ fileList = getAllPrismaFiles(filePath, fileList);
159
+ }
160
+ else if (stat.isFile() && file.endsWith(".prisma")) {
161
+ fileList.push(filePath);
162
+ }
163
+ });
164
+ return fileList;
165
+ }
166
+ const prismaRootDir = "./prisma";
167
+ const files = getAllPrismaFiles(prismaRootDir);
155
168
  for (const file of files) {
156
- const filePath = path.join(schemaFolderPath, file);
169
+ const filePath = path.join(prismaRootDir, file);
157
170
  const stats = fs.statSync(filePath);
158
171
  if (stats.isFile()) {
159
172
  const content = fs.readFileSync(filePath, "utf-8");
@@ -172,7 +185,7 @@ for (const model of models) {
172
185
  const modelName = pascalCase(model);
173
186
  let modelFile;
174
187
  for (const file of files) {
175
- const filePath = path.join(schemaFolderPath, file);
188
+ const filePath = path.join(prismaRootDir, file);
176
189
  const stats = fs.statSync(filePath);
177
190
  if (stats.isFile()) {
178
191
  const content = fs.readFileSync(filePath, "utf-8");
@@ -186,7 +199,7 @@ for (const model of models) {
186
199
  if (!modelFile) {
187
200
  throw new Error(`Model ${modelName} not found`);
188
201
  }
189
- const content = fs.readFileSync(path.join(schemaFolderPath, modelFile), "utf-8");
202
+ const content = fs.readFileSync(path.join(prismaRootDir, modelFile), "utf-8");
190
203
  const modelStart = content.indexOf(`model ${modelName} {`);
191
204
  const modelEnd = content.indexOf("}", modelStart);
192
205
  const modelDefinition = content.slice(modelStart, modelEnd);
@@ -1 +1 @@
1
- {"version":3,"file":"models.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/models.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport arkosEnv from \"../arkos-env\";\nimport { userFileExtension } from \"./fs.helpers\";\n\nconst prismaModelsModules: Record<\n string,\n Awaited<ReturnType<typeof importPrismaModelModules>>\n> = {};\n\nexport function getModelModules(modelName: string) {\n return prismaModelsModules[kebabCase(modelName)];\n}\n\n/**\n * Dynamically imports model-specific modules like middlewares, auth configurations,\n * prisma query options, and DTOs for a given model.\n *\n * @param {string} modelName - The name of the model (e.g., \"User\", \"Post\").\n * @returns {Promise<Object>} An object containing the imported modules: `middlewares`, `authConfigs`, `prismaQueryOptions`, and `dtos`.\n */\nexport async function importPrismaModelModules(modelName: string) {\n const kebabModelName = kebabCase(modelName);\n const lowerModelName = modelName.toLowerCase();\n\n const moduleDir = path.resolve(process.cwd(), \"src\", \"modules\", modelName);\n const dtosDir = path.join(moduleDir, \"dtos\");\n const schemasDir = path.join(moduleDir, \"schemas\");\n\n const middlewaresFile = path.join(\n moduleDir,\n `${kebabModelName}.middlewares.${userFileExtension}`\n );\n const authConfigsFile = path.join(\n moduleDir,\n `${kebabModelName}.auth-configs.${userFileExtension}`\n );\n const prismaQueryOptionsFile = path.join(\n moduleDir,\n `${kebabModelName}.prisma-query-options.${userFileExtension}`\n );\n\n // Define DTO file paths\n const modelDtoFile = path.join(\n dtosDir,\n `${lowerModelName}.dto.${userFileExtension}`\n );\n const createDtoFile = path.join(\n dtosDir,\n `create-${lowerModelName}.dto.${userFileExtension}`\n );\n const updateDtoFile = path.join(\n dtosDir,\n `update-${lowerModelName}.dto.${userFileExtension}`\n );\n const queryDtoFile = path.join(\n dtosDir,\n `query-${lowerModelName}.dto.${userFileExtension}`\n );\n\n const modelSchemaFile = path.join(\n schemasDir,\n `${lowerModelName}.schema.${userFileExtension}`\n );\n const createSchemaFile = path.join(\n schemasDir,\n `create-${lowerModelName}.schema.${userFileExtension}`\n );\n const updateSchemaFile = path.join(\n schemasDir,\n `update-${lowerModelName}.schema.${userFileExtension}`\n );\n const querySchemaFile = path.join(\n schemasDir,\n `query-${lowerModelName}.schema.${userFileExtension}`\n );\n\n const result: {\n middlewares?: any;\n authConfigs?: any;\n prismaQueryOptions?: any;\n dtos: {\n create?: any;\n update?: any;\n query?: any;\n model?: any;\n };\n schemas: {\n create?: any;\n update?: any;\n query?: any;\n model?: any;\n };\n } = {\n dtos: {},\n schemas: {},\n };\n\n try {\n if (fs.existsSync(middlewaresFile)) {\n const middlewareModule = await import(middlewaresFile);\n result.middlewares = middlewareModule;\n }\n } catch (error) {\n console.error(\n `Error importing middlewares for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(authConfigsFile)) {\n const authConfigsModule = await import(authConfigsFile);\n result.authConfigs = authConfigsModule.default || authConfigsModule;\n }\n } catch (error) {\n console.error(\n `Error importing auth configs for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(prismaQueryOptionsFile)) {\n const prismaQueryOptionsModule = await import(prismaQueryOptionsFile);\n result.prismaQueryOptions =\n prismaQueryOptionsModule.default || prismaQueryOptionsModule;\n }\n } catch (error) {\n console.error(\n `Error importing prisma query options for model \"${modelName}\":`,\n error\n );\n }\n\n // Import DTOs\n const pascalModelName = pascalCase(modelName);\n try {\n if (fs.existsSync(modelDtoFile)) {\n const modelDtoModule = await import(modelDtoFile);\n result.dtos.model =\n modelDtoModule.default || modelDtoModule[`${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing model main DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(createDtoFile)) {\n const createDtoModule = await import(createDtoFile);\n result.dtos.create =\n createDtoModule.default ||\n createDtoModule[`Create${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing create DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(updateDtoFile)) {\n const updateDtoModule = await import(updateDtoFile);\n result.dtos.update =\n updateDtoModule.default ||\n updateDtoModule[`Update${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing update DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(queryDtoFile)) {\n const queryDtoModule = await import(queryDtoFile);\n result.dtos.query =\n queryDtoModule.default || queryDtoModule[`Query${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(`Error importing query DTO for model \"${modelName}\":`, error);\n }\n\n try {\n if (fs.existsSync(createSchemaFile)) {\n const createSchemaModule = await import(createSchemaFile);\n result.dtos.create =\n createSchemaModule.default ||\n createSchemaModule[`Create${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing create Schema for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(updateSchemaFile)) {\n const updateSchemaModule = await import(updateSchemaFile);\n result.dtos.update =\n updateSchemaModule.default ||\n updateSchemaModule[`Update${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing update Schema for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(querySchemaFile)) {\n const querySchemaModule = await import(querySchemaFile);\n result.dtos.query =\n querySchemaModule.default ||\n querySchemaModule[`Query${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing query Schema for model \"${modelName}\":`,\n error\n );\n }\n\n prismaModelsModules[modelName] = result;\n\n return result;\n}\n\nexport type ModelFieldDefition = {\n name: string;\n type: string;\n isUnique: boolean;\n};\n\n/**\n * Represents the structure of relation fields for Prisma models.\n * It includes both singular (one-to-one) and list (one-to-many) relationships.\n *\n * @typedef {Object} RelationFields\n * @property {Array<{name: string, type: string}>} singular - List of singular relationships.\n * @property {Array<{name: string, type: string}>} list - List of list relationships.\n */\nexport type RelationFields = {\n singular: Omit<ModelFieldDefition, \"isUnique\">[];\n list: Omit<ModelFieldDefition, \"isUnique\">[];\n};\n\nconst schemaFolderPath =\n process.env.PRISMA_SCHEMA_PATH || arkosEnv.PRISMA_SCHEMA_PATH;\n\n/**\n * Reads the Prisma schema files and extracts all model definitions,\n * identifying their relations (one-to-one and one-to-many).\n */\nconst prismaModelRelationFields: Record<string, RelationFields> = {};\n\nconst prismaContent: string[] = [];\n\nconst files = fs\n .readdirSync(schemaFolderPath)\n .filter((file) => file.endsWith(\".prisma\"));\n\nfor (const file of files) {\n const filePath = path.join(schemaFolderPath, file);\n const stats = fs.statSync(filePath);\n\n if (stats.isFile()) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n prismaContent.push(content);\n }\n}\n\nconst modelRegex = /model\\s+(\\w+)\\s*{/g;\nconst models: string[] = [];\nconst prismaModelsUniqueFields: Record<string, ModelFieldDefition[]> =\n [] as any;\n\nprismaContent.join(\"\\n\").replace(modelRegex, (_, modelName) => {\n if (!models.includes(modelName)) models.push(camelCase(modelName.trim()));\n return modelName;\n});\n\nfor (const model of models) {\n const modelName = pascalCase(model);\n\n let modelFile;\n for (const file of files) {\n const filePath = path.join(schemaFolderPath, file);\n const stats = fs.statSync(filePath);\n\n if (stats.isFile()) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n prismaContent.push(content);\n if (content.includes(`model ${modelName} {`)) {\n modelFile = file;\n break;\n }\n }\n }\n\n if (!modelFile) {\n throw new Error(`Model ${modelName} not found`);\n }\n\n const content = fs.readFileSync(\n path.join(schemaFolderPath, modelFile),\n \"utf-8\"\n );\n\n const modelStart = content.indexOf(`model ${modelName} {`);\n const modelEnd = content.indexOf(\"}\", modelStart);\n const modelDefinition = content.slice(modelStart, modelEnd);\n\n const relations: RelationFields = {\n singular: [],\n list: [],\n };\n const lines = modelDefinition.split(\"\\n\");\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (\n !trimmedLine ||\n trimmedLine.startsWith(\"model\") ||\n trimmedLine.startsWith(\"//\")\n )\n continue;\n\n const [fieldName, type] = trimmedLine.split(/\\s+/);\n const isUnique = trimmedLine.includes(\"@unique\");\n\n if (isUnique)\n prismaModelsUniqueFields[model] = [\n ...(prismaModelsUniqueFields[model] || []),\n { name: fieldName, type, isUnique },\n ];\n\n const cleanType = type?.replace(\"[]\", \"\").replace(\"?\", \"\");\n\n if (\n trimmedLine.includes(\"@relation\") ||\n trimmedLine.match(/\\s+\\w+(\\[\\])?(\\s+@|$)/) ||\n models.includes(camelCase(cleanType || \"\"))\n ) {\n const modelStart = content.indexOf(`enum ${cleanType} {`);\n\n if (\n !cleanType ||\n modelStart >= 0 ||\n cleanType === \"String\" ||\n cleanType === \"Int\" ||\n cleanType === \"Float\" ||\n cleanType === \"Boolean\" ||\n cleanType === \"DateTime\" ||\n cleanType === \"Bytes\" ||\n cleanType === \"Decimal\" ||\n cleanType === \"BigInt\" ||\n cleanType === \"Json\"\n ) {\n continue;\n }\n\n if (!type?.includes(\"[]\")) {\n relations.singular.push({\n name: fieldName,\n type: cleanType,\n });\n } else {\n relations.list.push({\n name: fieldName,\n type: cleanType,\n });\n }\n }\n\n prismaModelRelationFields[modelName] = relations;\n }\n}\n\n/**\n * Retrieves the relations for a given Prisma model.\n *\n * @param {string} modelName - The name of the model (e.g., \"User\").\n * @returns {RelationFields|undefined} The relation fields for the model, or `undefined` if no relations are found.\n */\nexport function getPrismaModelRelations(modelName: string) {\n modelName = pascalCase(modelName);\n if (!(modelName in prismaModelRelationFields)) return;\n return prismaModelRelationFields[modelName];\n}\n\n/**\n * Retrieves all the model names from the Prisma schema.\n *\n * @returns {string[]} An array of model names (e.g., [\"User\", \"Post\"]).\n */\nfunction getModels() {\n return models;\n}\n\n/** Retuns a given model unique fields\n * @param {string} modelName - The name of model in PascalCase\n * @returns {string[]} An array of all unique fields,\n */\nfunction getModelUniqueFields(modelName: string) {\n return prismaModelsUniqueFields[modelName];\n}\n\nexport { models, getModels, getModelUniqueFields, prismaModelRelationFields };\n"]}
1
+ {"version":3,"file":"models.helpers.js","sourceRoot":"","sources":["../../../../src/utils/helpers/models.helpers.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport {\n camelCase,\n kebabCase,\n pascalCase,\n} from \"../../utils/helpers/change-case.helpers\";\nimport arkosEnv from \"../arkos-env\";\nimport { userFileExtension } from \"./fs.helpers\";\n\nconst prismaModelsModules: Record<\n string,\n Awaited<ReturnType<typeof importPrismaModelModules>>\n> = {};\n\nexport function getModelModules(modelName: string) {\n return prismaModelsModules[kebabCase(modelName)];\n}\n\n/**\n * Dynamically imports model-specific modules like middlewares, auth configurations,\n * prisma query options, and DTOs for a given model.\n *\n * @param {string} modelName - The name of the model (e.g., \"User\", \"Post\").\n * @returns {Promise<Object>} An object containing the imported modules: `middlewares`, `authConfigs`, `prismaQueryOptions`, and `dtos`.\n */\nexport async function importPrismaModelModules(modelName: string) {\n const kebabModelName = kebabCase(modelName);\n const lowerModelName = modelName.toLowerCase();\n\n const moduleDir = path.resolve(process.cwd(), \"src\", \"modules\", modelName);\n const dtosDir = path.join(moduleDir, \"dtos\");\n const schemasDir = path.join(moduleDir, \"schemas\");\n\n const middlewaresFile = path.join(\n moduleDir,\n `${kebabModelName}.middlewares.${userFileExtension}`\n );\n const authConfigsFile = path.join(\n moduleDir,\n `${kebabModelName}.auth-configs.${userFileExtension}`\n );\n const prismaQueryOptionsFile = path.join(\n moduleDir,\n `${kebabModelName}.prisma-query-options.${userFileExtension}`\n );\n\n // Define DTO file paths\n const modelDtoFile = path.join(\n dtosDir,\n `${lowerModelName}.dto.${userFileExtension}`\n );\n const createDtoFile = path.join(\n dtosDir,\n `create-${lowerModelName}.dto.${userFileExtension}`\n );\n const updateDtoFile = path.join(\n dtosDir,\n `update-${lowerModelName}.dto.${userFileExtension}`\n );\n const queryDtoFile = path.join(\n dtosDir,\n `query-${lowerModelName}.dto.${userFileExtension}`\n );\n\n const modelSchemaFile = path.join(\n schemasDir,\n `${lowerModelName}.schema.${userFileExtension}`\n );\n const createSchemaFile = path.join(\n schemasDir,\n `create-${lowerModelName}.schema.${userFileExtension}`\n );\n const updateSchemaFile = path.join(\n schemasDir,\n `update-${lowerModelName}.schema.${userFileExtension}`\n );\n const querySchemaFile = path.join(\n schemasDir,\n `query-${lowerModelName}.schema.${userFileExtension}`\n );\n\n const result: {\n middlewares?: any;\n authConfigs?: any;\n prismaQueryOptions?: any;\n dtos: {\n create?: any;\n update?: any;\n query?: any;\n model?: any;\n };\n schemas: {\n create?: any;\n update?: any;\n query?: any;\n model?: any;\n };\n } = {\n dtos: {},\n schemas: {},\n };\n\n try {\n if (fs.existsSync(middlewaresFile)) {\n const middlewareModule = await import(middlewaresFile);\n result.middlewares = middlewareModule;\n }\n } catch (error) {\n console.error(\n `Error importing middlewares for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(authConfigsFile)) {\n const authConfigsModule = await import(authConfigsFile);\n result.authConfigs = authConfigsModule.default || authConfigsModule;\n }\n } catch (error) {\n console.error(\n `Error importing auth configs for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(prismaQueryOptionsFile)) {\n const prismaQueryOptionsModule = await import(prismaQueryOptionsFile);\n result.prismaQueryOptions =\n prismaQueryOptionsModule.default || prismaQueryOptionsModule;\n }\n } catch (error) {\n console.error(\n `Error importing prisma query options for model \"${modelName}\":`,\n error\n );\n }\n\n // Import DTOs\n const pascalModelName = pascalCase(modelName);\n try {\n if (fs.existsSync(modelDtoFile)) {\n const modelDtoModule = await import(modelDtoFile);\n result.dtos.model =\n modelDtoModule.default || modelDtoModule[`${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing model main DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(createDtoFile)) {\n const createDtoModule = await import(createDtoFile);\n result.dtos.create =\n createDtoModule.default ||\n createDtoModule[`Create${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing create DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(updateDtoFile)) {\n const updateDtoModule = await import(updateDtoFile);\n result.dtos.update =\n updateDtoModule.default ||\n updateDtoModule[`Update${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(\n `Error importing update DTO for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(queryDtoFile)) {\n const queryDtoModule = await import(queryDtoFile);\n result.dtos.query =\n queryDtoModule.default || queryDtoModule[`Query${pascalModelName}Dto`];\n }\n } catch (error) {\n console.error(`Error importing query DTO for model \"${modelName}\":`, error);\n }\n\n try {\n if (fs.existsSync(createSchemaFile)) {\n const createSchemaModule = await import(createSchemaFile);\n result.dtos.create =\n createSchemaModule.default ||\n createSchemaModule[`Create${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing create Schema for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(updateSchemaFile)) {\n const updateSchemaModule = await import(updateSchemaFile);\n result.dtos.update =\n updateSchemaModule.default ||\n updateSchemaModule[`Update${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing update Schema for model \"${modelName}\":`,\n error\n );\n }\n\n try {\n if (fs.existsSync(querySchemaFile)) {\n const querySchemaModule = await import(querySchemaFile);\n result.dtos.query =\n querySchemaModule.default ||\n querySchemaModule[`Query${pascalModelName}Schema`];\n }\n } catch (error) {\n console.error(\n `Error importing query Schema for model \"${modelName}\":`,\n error\n );\n }\n\n prismaModelsModules[modelName] = result;\n\n return result;\n}\n\nexport type ModelFieldDefition = {\n name: string;\n type: string;\n isUnique: boolean;\n};\n\n/**\n * Represents the structure of relation fields for Prisma models.\n * It includes both singular (one-to-one) and list (one-to-many) relationships.\n *\n * @typedef {Object} RelationFields\n * @property {Array<{name: string, type: string}>} singular - List of singular relationships.\n * @property {Array<{name: string, type: string}>} list - List of list relationships.\n */\nexport type RelationFields = {\n singular: Omit<ModelFieldDefition, \"isUnique\">[];\n list: Omit<ModelFieldDefition, \"isUnique\">[];\n};\n\nconst schemaFolderPath =\n process.env.PRISMA_SCHEMA_PATH || arkosEnv.PRISMA_SCHEMA_PATH;\n\n/**\n * Reads the Prisma schema files and extracts all model definitions,\n * identifying their relations (one-to-one and one-to-many).\n */\nconst prismaModelRelationFields: Record<string, RelationFields> = {};\n\nconst prismaContent: string[] = [];\n\nfunction getAllPrismaFiles(dirPath: string, fileList: string[] = []) {\n const files = fs.readdirSync(dirPath);\n\n files?.forEach((file) => {\n const filePath = path.join(dirPath, file);\n const stat = fs.statSync(filePath);\n\n // Skip migrations folder\n if (stat.isDirectory() && file !== \"migrations\") {\n fileList = getAllPrismaFiles(filePath, fileList);\n } else if (stat.isFile() && file.endsWith(\".prisma\")) {\n fileList.push(filePath);\n }\n });\n\n return fileList;\n}\n\nconst prismaRootDir = \"./prisma\"; // Adjust this path if needed\nconst files = getAllPrismaFiles(prismaRootDir);\n\nfor (const file of files) {\n const filePath = path.join(prismaRootDir, file);\n const stats = fs.statSync(filePath);\n\n if (stats.isFile()) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n prismaContent.push(content);\n }\n}\n\nconst modelRegex = /model\\s+(\\w+)\\s*{/g;\nconst models: string[] = [];\nconst prismaModelsUniqueFields: Record<string, ModelFieldDefition[]> =\n [] as any;\n\nprismaContent.join(\"\\n\").replace(modelRegex, (_, modelName) => {\n if (!models.includes(modelName)) models.push(camelCase(modelName.trim()));\n return modelName;\n});\n\nfor (const model of models) {\n const modelName = pascalCase(model);\n\n let modelFile;\n for (const file of files) {\n const filePath = path.join(prismaRootDir, file);\n const stats = fs.statSync(filePath);\n\n if (stats.isFile()) {\n const content = fs.readFileSync(filePath, \"utf-8\");\n prismaContent.push(content);\n if (content.includes(`model ${modelName} {`)) {\n modelFile = file;\n break;\n }\n }\n }\n\n if (!modelFile) {\n throw new Error(`Model ${modelName} not found`);\n }\n\n const content = fs.readFileSync(path.join(prismaRootDir, modelFile), \"utf-8\");\n\n const modelStart = content.indexOf(`model ${modelName} {`);\n const modelEnd = content.indexOf(\"}\", modelStart);\n const modelDefinition = content.slice(modelStart, modelEnd);\n\n const relations: RelationFields = {\n singular: [],\n list: [],\n };\n const lines = modelDefinition.split(\"\\n\");\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n\n if (\n !trimmedLine ||\n trimmedLine.startsWith(\"model\") ||\n trimmedLine.startsWith(\"//\")\n )\n continue;\n\n const [fieldName, type] = trimmedLine.split(/\\s+/);\n const isUnique = trimmedLine.includes(\"@unique\");\n\n if (isUnique)\n prismaModelsUniqueFields[model] = [\n ...(prismaModelsUniqueFields[model] || []),\n { name: fieldName, type, isUnique },\n ];\n\n const cleanType = type?.replace(\"[]\", \"\").replace(\"?\", \"\");\n\n if (\n trimmedLine.includes(\"@relation\") ||\n trimmedLine.match(/\\s+\\w+(\\[\\])?(\\s+@|$)/) ||\n models.includes(camelCase(cleanType || \"\"))\n ) {\n const modelStart = content.indexOf(`enum ${cleanType} {`);\n\n if (\n !cleanType ||\n modelStart >= 0 ||\n cleanType === \"String\" ||\n cleanType === \"Int\" ||\n cleanType === \"Float\" ||\n cleanType === \"Boolean\" ||\n cleanType === \"DateTime\" ||\n cleanType === \"Bytes\" ||\n cleanType === \"Decimal\" ||\n cleanType === \"BigInt\" ||\n cleanType === \"Json\"\n ) {\n continue;\n }\n\n if (!type?.includes(\"[]\")) {\n relations.singular.push({\n name: fieldName,\n type: cleanType,\n });\n } else {\n relations.list.push({\n name: fieldName,\n type: cleanType,\n });\n }\n }\n\n prismaModelRelationFields[modelName] = relations;\n }\n}\n\n/**\n * Retrieves the relations for a given Prisma model.\n *\n * @param {string} modelName - The name of the model (e.g., \"User\").\n * @returns {RelationFields|undefined} The relation fields for the model, or `undefined` if no relations are found.\n */\nexport function getPrismaModelRelations(modelName: string) {\n modelName = pascalCase(modelName);\n if (!(modelName in prismaModelRelationFields)) return;\n return prismaModelRelationFields[modelName];\n}\n\n/**\n * Retrieves all the model names from the Prisma schema.\n *\n * @returns {string[]} An array of model names (e.g., [\"User\", \"Post\"]).\n */\nfunction getModels() {\n return models;\n}\n\n/** Retuns a given model unique fields\n * @param {string} modelName - The name of model in PascalCase\n * @returns {string[]} An array of all unique fields,\n */\nfunction getModelUniqueFields(modelName: string) {\n return prismaModelsUniqueFields[modelName];\n}\n\nexport { models, getModels, getModelUniqueFields, prismaModelRelationFields };\n"]}
@@ -1,4 +1,4 @@
1
- import { getFileUploaderServices, FileUploaderService } from "./../../modules/file-upload/file-upload.service";
1
+ import { getFileUploaderServices, FileUploaderService } from "../../modules/file-uploader/file-uploader.service";
2
2
  import { EmailOptions } from "../../modules/email/email.service";
3
3
  import authService from "../../modules/auth/auth.service";
4
4
  import emailService, { EmailService } from "../../modules/email/email.service";
@@ -1,5 +1,4 @@
1
1
  import { Transporter } from "nodemailer";
2
- import { BaseService } from "../base/base.service";
3
2
  export type EmailOptions = {
4
3
  from?: string;
5
4
  to: string | string[];
@@ -17,7 +16,7 @@ export type SMTPConnectionOptions = {
17
16
  secure?: boolean;
18
17
  auth?: SMTPAuthOptions;
19
18
  };
20
- export declare class EmailService extends BaseService {
19
+ export declare class EmailService {
21
20
  private transporter;
22
21
  private defaultHost;
23
22
  private defaultPort;
@@ -0,0 +1,3 @@
1
+ export declare const uploadFile: (req: import("../../types").ArkosRequest, res: import("../../types").ArkosResponse, next: import("../../types").ArkosNextFunction) => Promise<void>;
2
+ export declare const deleteFile: (req: import("../../types").ArkosRequest, res: import("../../types").ArkosResponse, next: import("../../types").ArkosNextFunction) => Promise<void>;
3
+ export declare const streamFile: (req: import("../../types").ArkosRequest, res: import("../../types").ArkosResponse, next: import("../../types").ArkosNextFunction) => Promise<void>;
@@ -0,0 +1,3 @@
1
+ import { Router } from "express";
2
+ import { ArkosConfig } from "../../types/arkos-config";
3
+ export declare function getFileUploaderRouter({ fileUpload }: ArkosConfig): Promise<Router>;
@@ -0,0 +1,30 @@
1
+ import multer from "multer";
2
+ import { NextFunction } from "express";
3
+ import { ArkosRequest, ArkosResponse } from "../../types";
4
+ export declare class FileUploaderService {
5
+ private uploadDir;
6
+ private fileSizeLimit;
7
+ private allowedFileTypes;
8
+ private storage;
9
+ private maxCount;
10
+ constructor(uploadDir: string, fileSizeLimit?: number, allowedFileTypes?: RegExp, maxCount?: number);
11
+ private fileFilter;
12
+ getUploader(): multer.Multer;
13
+ handleSingleUpload(oldFilePath?: string): (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => void;
14
+ handleMultipleUpload(): (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => void;
15
+ handleDeleteSingleFile(oldFilePath: string): (req: ArkosRequest, res: ArkosResponse, next: NextFunction) => Promise<void>;
16
+ deleteFileByUrl(fileUrl: string): Promise<boolean>;
17
+ private getFieldName;
18
+ upload(req: ArkosRequest, res: ArkosResponse, options?: {
19
+ format?: string;
20
+ width?: number;
21
+ height?: number;
22
+ resizeTo?: number;
23
+ }): Promise<string | string[] | null>;
24
+ }
25
+ export declare const getFileUploaderServices: () => {
26
+ imageUploaderService: FileUploaderService;
27
+ videoUploaderService: FileUploaderService;
28
+ documentUploaderService: FileUploaderService;
29
+ fileUploaderService: FileUploaderService;
30
+ };
@@ -0,0 +1,2 @@
1
+ export declare const processFile: (filePath: string, baseURL: string, baseRoute: string, fileType: string) => Promise<string>;
2
+ export declare const processImage: (filePath: string, baseURL: string, baseRoute: string, options: Record<string, any>, fileType: string) => Promise<string | null>;
@@ -37,7 +37,7 @@ export type ArkosConfig = {
37
37
  baseUploadDir?: string;
38
38
  baseRoute?: string;
39
39
  expressStaticOptions?: Parameters<typeof express.static>[1];
40
- uploadRestrictions?: {
40
+ restrictions?: {
41
41
  images?: {
42
42
  maxCount?: number;
43
43
  maxSize?: number;
@@ -97,4 +97,11 @@ export type ArkosConfig = {
97
97
  };
98
98
  };
99
99
  configureApp?: (app: express.Express) => Promise<any> | any;
100
+ email?: {
101
+ host: string;
102
+ port?: number;
103
+ from: string;
104
+ password: string;
105
+ name?: string;
106
+ };
100
107
  };
@@ -1,14 +1,14 @@
1
1
  import { JwtPayload } from "jsonwebtoken";
2
2
  export type ControllerActions = "create" | "update" | "delete" | "view";
3
3
  export type AccessControlRules = {
4
- [key in ControllerActions]: any | any[];
4
+ [key in ControllerActions]: any[];
5
5
  };
6
6
  export type AuthenticationControlRules = {
7
7
  [key in ControllerActions]: boolean;
8
8
  };
9
9
  export type AuthConfigs = {
10
10
  authenticationControl?: boolean | Partial<AuthenticationControlRules>;
11
- accessControl?: any | any[] | Partial<AccessControlRules>;
11
+ accessControl?: any[] | Partial<AccessControlRules>;
12
12
  };
13
13
  export interface AuthJwtPayload extends JwtPayload {
14
14
  id?: number | string;
@@ -47,6 +47,7 @@ export interface AuthPermission {
47
47
  export interface User {
48
48
  id: string;
49
49
  isStaff: boolean;
50
+ isSuperUser: boolean;
50
51
  password: string;
51
52
  passwordChangedAt?: Date;
52
53
  deletedSelfAccountAt: Date;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.0.1-beta",
3
+ "version": "1.0.2-alpha",
4
4
  "description": "The Express & Prisma Framework For RESTful API",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/es2020/exports/index.js",
@@ -133,15 +133,13 @@
133
133
  "@typescript-eslint/eslint-plugin": "^6.0.0",
134
134
  "@typescript-eslint/parser": "^6.0.0",
135
135
  "bcrypt": "^5.1.1",
136
- "c8": "^10.1.3",
137
136
  "esbuild": "^0.25.1",
138
- "happy-dom": "^17.4.4",
139
137
  "jest": "^29.7.0",
138
+ "mimetype": "^0.0.8",
140
139
  "prisma": "^6.4.1",
141
140
  "ts-jest": "^29.3.1",
142
141
  "ts-node": "^10.9.2",
143
- "typescript": "^5.8.2",
144
- "vitest": "^3.0.9"
142
+ "typescript": "^5.8.2"
145
143
  },
146
144
  "dependencies": {
147
145
  "pluralize": "^8.0.0"
@@ -158,12 +156,13 @@
158
156
  "dotenv": "^16.4.7",
159
157
  "express": "^4.21.2",
160
158
  "express-rate-limit": "^7.5.0",
159
+ "html-to-text": "^9.0.5",
161
160
  "jsonwebtoken": "^9.0.2",
161
+ "mimetype": "^0.0.8",
162
162
  "multer": "1.4.5-lts.1",
163
163
  "nodemailer": "^6.10.0",
164
164
  "sharp": "^0.33.5",
165
- "zod": "^3.24.2",
166
- "html-to-text": "^9.0.5"
165
+ "zod": "^3.24.2"
167
166
  },
168
167
  "engines": {
169
168
  "node": ">=14.16"