arkos 2.0.0-next.13 → 2.0.0-next.16
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/README.md +144 -145
- package/cli.js +1 -0
- package/dist/cjs/app.js +7 -0
- package/dist/cjs/app.js.map +1 -1
- package/dist/cjs/exports/error-handler/index.js +15 -0
- package/dist/cjs/exports/error-handler/index.js.map +1 -1
- package/dist/cjs/modules/auth/auth.router.js +3 -0
- package/dist/cjs/modules/auth/auth.router.js.map +1 -1
- package/dist/cjs/modules/auth/auth.service.js +2 -0
- package/dist/cjs/modules/auth/auth.service.js.map +1 -1
- package/dist/cjs/modules/base/base.controller.js +15 -3
- package/dist/cjs/modules/base/base.controller.js.map +1 -1
- package/dist/cjs/modules/base/base.middlewares.js +19 -12
- package/dist/cjs/modules/base/base.middlewares.js.map +1 -1
- package/dist/cjs/modules/base/base.service.js +5 -1
- package/dist/cjs/modules/base/base.service.js.map +1 -1
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js +9 -0
- package/dist/cjs/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/cjs/modules/error-handler/error-handler.controller.js +25 -42
- package/dist/cjs/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js +0 -1
- package/dist/cjs/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/cjs/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/cjs/modules/error-handler/utils/errors.js +158 -0
- package/dist/cjs/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js +39 -0
- package/dist/cjs/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/cjs/modules/file-upload/file-upload.controller.js +10 -14
- package/dist/cjs/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/cjs/modules/file-upload/file-upload.router.js +2 -0
- package/dist/cjs/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/cjs/modules/swagger/swagger.router.js +8 -2
- package/dist/cjs/modules/swagger/swagger.router.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js +18 -0
- package/dist/cjs/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js +5 -5
- package/dist/cjs/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/cjs/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/cjs/types/arkos-prisma-input.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/types/router-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js +86 -28
- package/dist/cjs/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/cjs/utils/arkos-router/index.js +11 -7
- 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/types/upload-config.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +34 -28
- package/dist/cjs/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js +9 -6
- package/dist/cjs/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js +334 -77
- package/dist/cjs/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/cjs/utils/bundler.js.map +1 -1
- package/dist/cjs/utils/cli/build.js +2 -3
- package/dist/cjs/utils/cli/build.js.map +1 -1
- package/dist/cjs/utils/cli/dev.js +11 -6
- package/dist/cjs/utils/cli/dev.js.map +1 -1
- package/dist/cjs/utils/cli/export-auth-action.js +5 -4
- package/dist/cjs/utils/cli/export-auth-action.js.map +1 -1
- package/dist/cjs/utils/cli/generate.js +6 -8
- package/dist/cjs/utils/cli/generate.js.map +1 -1
- package/dist/cjs/utils/cli/index.js +22 -19
- package/dist/cjs/utils/cli/index.js.map +1 -1
- package/dist/cjs/utils/cli/start.js +4 -2
- 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/template-generator/templates/generate-controller-template.js +19 -7
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js +7 -6
- package/dist/cjs/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js +4 -4
- package/dist/cjs/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
- package/dist/cjs/utils/cli/utils/template-generators.js +0 -6
- package/dist/cjs/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/cjs/utils/define-config.js +5 -0
- package/dist/cjs/utils/define-config.js.map +1 -1
- package/dist/cjs/utils/dotenv.helpers.js +0 -6
- package/dist/cjs/utils/dotenv.helpers.js.map +1 -1
- package/dist/cjs/utils/features/api.features.js +23 -5
- package/dist/cjs/utils/features/api.features.js.map +1 -1
- package/dist/cjs/utils/helpers/arkos-config.helpers.js +22 -2
- package/dist/cjs/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/exit-error.js +1 -0
- package/dist/cjs/utils/helpers/exit-error.js.map +1 -1
- package/dist/cjs/utils/helpers/fs.helpers.js +25 -24
- package/dist/cjs/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/global.helpers.js +3 -2
- package/dist/cjs/utils/helpers/global.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/prisma.helpers.js +4 -5
- package/dist/cjs/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/cjs/utils/helpers/url-helpers.js +14 -0
- package/dist/cjs/utils/helpers/url-helpers.js.map +1 -0
- package/dist/cjs/utils/initialize-app.js +35 -6
- package/dist/cjs/utils/initialize-app.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/cjs/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/cjs/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/cjs/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/cjs/utils/setup-app.js +58 -41
- package/dist/cjs/utils/setup-app.js.map +1 -1
- package/dist/esm/app.js +6 -0
- package/dist/esm/app.js.map +1 -1
- package/dist/esm/exports/error-handler/index.js +1 -0
- package/dist/esm/exports/error-handler/index.js.map +1 -1
- package/dist/esm/modules/auth/auth.router.js +3 -0
- package/dist/esm/modules/auth/auth.router.js.map +1 -1
- package/dist/esm/modules/auth/auth.service.js +2 -0
- package/dist/esm/modules/auth/auth.service.js.map +1 -1
- package/dist/esm/modules/base/base.controller.js +15 -3
- package/dist/esm/modules/base/base.controller.js.map +1 -1
- package/dist/esm/modules/base/base.middlewares.js +19 -12
- package/dist/esm/modules/base/base.middlewares.js.map +1 -1
- package/dist/esm/modules/base/base.service.js +5 -1
- package/dist/esm/modules/base/base.service.js.map +1 -1
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js +9 -0
- package/dist/esm/modules/base/utils/helpers/base.service.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/error-handler.controller.js +22 -42
- package/dist/esm/modules/error-handler/error-handler.controller.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/app-error.js +0 -1
- package/dist/esm/modules/error-handler/utils/app-error.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js +8 -9
- package/dist/esm/modules/error-handler/utils/error-handler.helpers.js.map +1 -1
- package/dist/esm/modules/error-handler/utils/errors.js +127 -0
- package/dist/esm/modules/error-handler/utils/errors.js.map +1 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js +34 -0
- package/dist/esm/modules/error-handler/utils/multer-error-handler.js.map +1 -0
- package/dist/esm/modules/file-upload/file-upload.controller.js +10 -14
- package/dist/esm/modules/file-upload/file-upload.controller.js.map +1 -1
- package/dist/esm/modules/file-upload/file-upload.router.js +2 -0
- package/dist/esm/modules/file-upload/file-upload.router.js.map +1 -1
- package/dist/esm/modules/swagger/swagger.router.js +8 -2
- package/dist/esm/modules/swagger/swagger.router.js.map +1 -1
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js +18 -0
- package/dist/esm/modules/swagger/utils/get-open-api-login-html.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js +5 -5
- package/dist/esm/modules/swagger/utils/helpers/get-swagger-default-configs.js.map +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js +1 -1
- package/dist/esm/modules/swagger/utils/helpers/openapi-schema-converter.js.map +1 -1
- package/dist/esm/types/arkos-prisma-input.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/types/router-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js +86 -28
- package/dist/esm/utils/arkos-router/arkos-router-openapi-manager.js.map +1 -1
- package/dist/esm/utils/arkos-router/index.js +11 -7
- 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/types/upload-config.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js +34 -28
- package/dist/esm/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/index.js +9 -6
- package/dist/esm/utils/arkos-router/utils/helpers/index.js.map +1 -1
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js +334 -77
- package/dist/esm/utils/arkos-router/utils/helpers/upload-manager.js.map +1 -1
- package/dist/esm/utils/bundler.js.map +1 -1
- package/dist/esm/utils/cli/build.js +3 -4
- package/dist/esm/utils/cli/build.js.map +1 -1
- package/dist/esm/utils/cli/dev.js +12 -7
- package/dist/esm/utils/cli/dev.js.map +1 -1
- package/dist/esm/utils/cli/export-auth-action.js +5 -4
- package/dist/esm/utils/cli/export-auth-action.js.map +1 -1
- package/dist/esm/utils/cli/generate.js +6 -8
- package/dist/esm/utils/cli/generate.js.map +1 -1
- package/dist/esm/utils/cli/index.js +22 -19
- package/dist/esm/utils/cli/index.js.map +1 -1
- package/dist/esm/utils/cli/start.js +4 -2
- 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/template-generator/templates/generate-controller-template.js +16 -7
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-controller-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js +7 -6
- package/dist/esm/utils/cli/utils/template-generator/templates/generate-multiple-components.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js +4 -4
- package/dist/esm/utils/cli/utils/template-generator/templates/policy-template.js.map +1 -1
- package/dist/esm/utils/cli/utils/template-generators.js +0 -6
- package/dist/esm/utils/cli/utils/template-generators.js.map +1 -1
- package/dist/esm/utils/define-config.js +5 -0
- package/dist/esm/utils/define-config.js.map +1 -1
- package/dist/esm/utils/dotenv.helpers.js +0 -6
- package/dist/esm/utils/dotenv.helpers.js.map +1 -1
- package/dist/esm/utils/features/api.features.js +23 -5
- package/dist/esm/utils/features/api.features.js.map +1 -1
- package/dist/esm/utils/helpers/arkos-config.helpers.js +20 -2
- package/dist/esm/utils/helpers/arkos-config.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/exit-error.js +1 -0
- package/dist/esm/utils/helpers/exit-error.js.map +1 -1
- package/dist/esm/utils/helpers/fs.helpers.js +25 -24
- package/dist/esm/utils/helpers/fs.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/global.helpers.js +1 -1
- package/dist/esm/utils/helpers/global.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/prisma.helpers.js +4 -5
- package/dist/esm/utils/helpers/prisma.helpers.js.map +1 -1
- package/dist/esm/utils/helpers/url-helpers.js +11 -0
- package/dist/esm/utils/helpers/url-helpers.js.map +1 -0
- package/dist/esm/utils/initialize-app.js +35 -6
- package/dist/esm/utils/initialize-app.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js +12 -6
- package/dist/esm/utils/prisma/prisma-json-schema-generator.js.map +1 -1
- package/dist/esm/utils/prisma/prisma-schema-parser.js +10 -3
- package/dist/esm/utils/prisma/prisma-schema-parser.js.map +1 -1
- package/dist/esm/utils/setup-app.js +59 -42
- package/dist/esm/utils/setup-app.js.map +1 -1
- package/dist/types/app.d.ts +5 -6
- package/dist/types/exports/error-handler/index.d.ts +1 -0
- package/dist/types/modules/auth/auth.service.d.ts +2 -6
- package/dist/types/modules/base/base.service.d.ts +2 -1
- package/dist/types/modules/error-handler/utils/app-error.d.ts +0 -2
- package/dist/types/modules/error-handler/utils/error-handler.helpers.d.ts +1 -1
- package/dist/types/modules/error-handler/utils/errors.d.ts +176 -0
- package/dist/types/modules/error-handler/utils/multer-error-handler.d.ts +7 -0
- package/dist/types/modules/file-upload/file-upload.controller.d.ts +0 -1
- package/dist/types/modules/swagger/utils/helpers/get-swagger-default-configs.d.ts +48 -2
- package/dist/types/types/arkos-prisma-input.d.ts +3 -2
- package/dist/types/types/index.d.ts +0 -21
- package/dist/types/types/new-arkos-config.d.ts +183 -14
- package/dist/types/types/router-config.d.ts +1 -1
- package/dist/types/utils/arkos-router/arkos-router-openapi-manager.d.ts +14 -1
- package/dist/types/utils/arkos-router/index.d.ts +76 -8
- package/dist/types/utils/arkos-router/types/index.d.ts +19 -6
- package/dist/types/utils/arkos-router/types/upload-config.d.ts +63 -7
- package/dist/types/utils/arkos-router/utils/helpers/apply-arkos-router-proxy.d.ts +1 -1
- package/dist/types/utils/arkos-router/utils/helpers/index.d.ts +2 -0
- package/dist/types/utils/arkos-router/utils/helpers/upload-manager.d.ts +0 -36
- package/dist/types/utils/bundler.d.ts +1 -1
- package/dist/types/utils/cli/generate.d.ts +0 -1
- package/dist/types/utils/cli/start.d.ts +1 -1
- package/dist/types/utils/helpers/arkos-config.helpers.d.ts +2 -0
- package/dist/types/utils/helpers/fs.helpers.d.ts +1 -1
- package/dist/types/utils/helpers/global.helpers.d.ts +1 -0
- package/dist/types/utils/helpers/url-helpers.d.ts +1 -0
- package/dist/types/utils/prisma/prisma-schema-parser.d.ts +1 -0
- package/package.json +15 -15
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -39
- package/dist/cjs/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -32
- package/dist/cjs/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js +0 -36
- package/dist/esm/utils/cli/utils/template-generator/templates/route-hook.template.js.map +0 -1
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js +0 -29
- package/dist/esm/utils/cli/utils/template-generator/templates/service-hook.template.js.map +0 -1
- package/dist/types/utils/cli/utils/template-generator/templates/route-hook.template.d.ts +0 -2
- package/dist/types/utils/cli/utils/template-generator/templates/service-hook.template.d.ts +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-manager.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/upload-manager.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,+DAA+D,CAAC;AACvE,OAAO,EAIL,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,QAAQ,MAAM,mDAAmD,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mEAAmE,CAAC;AAC3E,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAElE,SAAS,kBAAkB,CAAC,IAAyB;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,YAAY,CAAC;IAC9E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;IACjC,WAAW,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,EAAE,aAAa,IAAI,UAAU,CAAC;QAC1E,IAAI,SAAS,GACV,GAAG,CAAC,OAAO,CAAC,cAAc,CAAY,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;QAExC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAChC,IAAI,CAAC,IAAI,CACP,OAAO,CAAC,GAAG,EAAE,EACb,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EACnC,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAChC,CACF,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnD,EAAE,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC1B,CAAC;IACD,QAAQ,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,EAAE,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,YAAY,GAAG,GAAG,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,aAAa;IAAnB;QAuUU,eAAU,GAAG,CACnB,CAAM,EACN,IAAS,EACT,EAAO,EACP,gBAAmC,EACnC,EAAE;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1D,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;gBACjC,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;;gBACxC,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE5C,IAAI,SAAS;gBAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;;gBAE5B,EAAE,CACA,IAAI,QAAQ,CACV,4CAA4C,MAAM,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChH,GAAG,EACH,oBAAoB,EACpB,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,CAChC,CACF,CAAC;QACN,CAAC,CAAC;IACJ,CAAC;IA7VS,SAAS,CAAC,EAChB,OAAO,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,EACzB,gBAAgB,GAAG,IAAI,GAIxB;QACC,OAAO,MAAM,CAAC;YACZ,OAAO;YACP,UAAU,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,gBAAgB,CAAC;YAClD,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,MAAoB;QAChC,IAAI,MAAM,CAAC;QACX,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC1B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACxD,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO;YAC9B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAC1C,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,QAAQ,IAAI,CAAC,CACrB,CAAC;;YACC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,MAAoB,EAAE,WAAoB;QACrD,OAAO,UAAU,CACf,CAAC,GAAiB,EAAE,GAAkB,EAAE,IAAuB,EAAE,EAAE;YACjE,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9C,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;YAC/C,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;gBACjC,IAAI,GAAG;oBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;gBAE1B,IAAI,WAAW,EAAE,CAAC;oBAChB,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;oBAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAC3B,OAAO,CAAC,GAAG,EAAE,EACb,iBAAiB,CAAC,OAAO,EAAE,aAAc,CAAC,EAC1C,iBAAiB,CAAC,WAAW,CAAC,CAC/B,CAAC;oBACF,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;wBACjD,IAAI,KAAK;4BAAE,MAAM,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAClD,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAED,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;IAiCD,qBAAqB,CAAC,YAA0B;QAC9C,OAAO,UAAU,CAAC,CAAC,GAAiB,EAAE,CAAM,EAAE,IAAuB,EAAE,EAAE;YACvE,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAa,EAAE,CAAC;YAEhC,IAAI,YAAY,CAAC,QAAQ,KAAK,KAAK;gBAAE,OAAO,IAAI,EAAE,CAAC;YAEnD,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CACT,0BAA0B,YAAY,CAAC,KAAK,cAAc,CAC3D,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,IAAI,YAAY,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACtE,MAAM,CAAC,IAAI,CACT,0BAA0B,YAAY,CAAC,KAAK,uBAAuB,CACpE,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;iBAAM,IAAI,YAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1C,IACE,CAAC,GAAG,CAAC,KAAK;oBACV,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;oBAC7B,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EACxB,CAAC;oBACD,MAAM,CAAC,IAAI,CACT,uEAAuE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3H,CAAC;oBACF,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;wBACxC,MAAM,aAAa,GAAI,GAAG,CAAC,KAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACrD,IACE,CAAC,aAAa;4BACd,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;4BAC7B,aAAa,CAAC,MAAM,KAAK,CAAC,EAC1B,CAAC;4BACD,MAAM,CAAC,IAAI,CACT,0BAA0B,KAAK,CAAC,IAAI,uBAAuB,CAC5D,CAAC;4BACF,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,IAAI,QAAQ,CAChB,MAAM,CAAC,CAAC,CAAC,EACT,GAAG,EACH,UAAU,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,EAClE;oBACE,MAAM;iBACP,CACF,CAAC;YACJ,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,MAAoB;QACpC,OAAO,KAAK,EACV,GAAQ,EACR,GAAiB,EACjB,CAAgB,EAChB,IAAuB,EACvB,EAAE;YACF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAyB,EAAE,EAAE;gBACrD,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CACP,0BAA0B,IAAI,CAAC,IAAI,YAAY,KAAK,CAAC,OAAO,EAAE,EAC9D,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACzC,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC3B,OAAO,GAAG,CAAC,IAAI,CAAC;gBAClB,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBAC7B,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;oBACzB,CAAC;oBACD,OAAO,GAAG,CAAC,KAAK,CAAC;gBACnB,CAAC;qBAAM,IACL,MAAM,CAAC,IAAI,KAAK,QAAQ;oBACxB,GAAG,CAAC,KAAK;oBACT,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EACzB,CAAC;oBACD,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBAClC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;4BACxC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;wBACzB,CAAC;oBACH,CAAC;oBACD,OAAO,GAAG,CAAC,KAAK,CAAC;gBACnB,CAAC;YACH,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,MAAoB;QACnC,OAAO,UAAU,CACf,CAAC,GAAiB,EAAE,CAAgB,EAAE,IAAuB,EAAE,EAAE;YAC/D,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;YAErC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAU,EAAE;gBACjD,IAAI,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAClC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,UAAU,EAAE,aAAc,CAAC,CACjE,CAAC;gBACF,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;gBAEjE,OAAO,QAAQ;qBACZ,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC;qBAC7B,OAAO,CAAC,IAAI,iBAAiB,EAAE,EAAE,EAAE,CAAC;qBACpC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;qBAC9B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACzB,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,CAAC,IAAyB,EAAU,EAAE;gBACzD,MAAM,YAAY,GAAG,oBAAoB,CACvC,IAAI,CAAC,IAAI,EACT,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,CACtC,CAAC;gBAEF,OAAO,GAAG,OAAO,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GACpD,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,EAChE,EAAE,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,cAAc,GAAG,CAAC,IAAyB,EAAO,EAAE;gBACxD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBAE9B,IAAY,CAAC,GAAG,GAAG,GAAG,CAAC;gBACvB,IAAY,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;oBAAE,OAAO,SAAS,CAAC;gBACpD,IAAI,MAAM,CAAC,YAAY,KAAK,UAAU,IAAI,CAAC,MAAM,CAAC,YAAY;oBAC5D,OAAO,CACL,CAAC,SAAS,KAAK,GAAG;wBAChB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;4BACzB,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAClD,CAAC;gBACJ,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;oBAAE,OAAO,GAAG,CAAC;gBAC9C,IAAI,MAAM,CAAC,YAAY,KAAK,MAAM;oBAAE,OAAO,IAAI,CAAC;gBAEhD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;YAEF,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,IAAY,EAAE,KAAU,EAAE,EAAE;gBAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAE3C,IAAI,OAAO,GAAG,GAAG,CAAC;gBAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;wBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,CAAC;oBACD,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;gBAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtC,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;YAC3B,CAAC,CAAC;YAEF,IAAI,CAAC;gBACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAEvC,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACxC,MAAM,UAAU,GAAQ,EAAE,CAAC;wBAC3B,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;wBAChD,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;qBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK;yBACrB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;yBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;oBAElC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACtC,MAAM,UAAU,GAAQ,EAAE,CAAC;wBAC3B,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;wBACjD,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;qBAAM,IACL,MAAM,CAAC,IAAI,KAAK,QAAQ;oBACxB,GAAG,CAAC,KAAK;oBACT,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EACzB,CAAC;oBACD,MAAM,UAAU,GAAQ,EAAE,CAAC;oBAE3B,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;wBAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;wBACnC,MAAM,MAAM,GAAG,KAAK;6BACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;6BACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;wBAElC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACtB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;4BAC/D,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;oBAED,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACvC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;oBACnD,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,MAAM,IAAI,QAAQ,CAChB,uCAAuC,GAAG,CAAC,OAAO,EAAE,EACpD,GAAG,EACH,4BAA4B,CAC7B,CAAC;YACJ,CAAC;YAED,IAAI,EAAE,CAAC;QACT,CAAC,CACF,CAAC;IACJ,CAAC;CA8BF;AAED,MAAM,aAAa,GAAG,IAAI,aAAa,EAAE,CAAC;AAE1C,eAAe,aAAa,CAAC","sourcesContent":["import multer from \"multer\";\nimport { UploadConfig } from \"../../types/upload-config\";\nimport {\n documentsExtensions,\n imagesExtenstions,\n videosExtensions,\n} from \"../../../../modules/file-upload/utils/helpers/file-extensions\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n getArkosConfig,\n} from \"../../../../exports\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { removeBothSlashes } from \"../../../helpers/text.helpers\";\nimport { promisify } from \"util\";\nimport sheu from \"../../../sheu\";\nimport AppError from \"../../../../modules/error-handler/utils/app-error\";\nimport { RequestHandler } from \"express\";\nimport {\n extractRequestInfo,\n generateRelativePath,\n} from \"../../../../modules/file-upload/utils/helpers/file-upload.helpers\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\nimport { pascalCase } from \"../../../helpers/change-case.helpers\";\n\nfunction determineUploadDir(file: Express.Multer.File) {\n if (file.mimetype.includes?.(\"image\")) return \"/images\";\n if (file.mimetype.includes?.(\"video\")) return \"/videos\";\n if (imagesExtenstions.has(file.mimetype.split(\"/\")[1])) return \"/images\";\n if (videosExtensions.has(file.mimetype.split(\"/\")[1])) return \"/videos\";\n if (documentsExtensions.has(file.mimetype.split(\"/\")[1])) return \"/documents\";\n return \"/files\";\n}\n\nconst storage = multer.diskStorage({\n destination: (req, file, cb) => {\n const arkosConfig = getArkosConfig();\n const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || \"/uploads\";\n let uploadDir =\n (req.headers[\"x-upload-dir\"] as string) || determineUploadDir(file);\n req.headers[\"x-upload-dir\"] = uploadDir;\n\n const fullUploadDir = path.resolve(\n path.join(\n process.cwd(),\n baseUploadDir.replaceAll(\"//\", \"/\"),\n uploadDir.replaceAll(\"//\", \"/\")\n )\n );\n\n if (!fs.existsSync(fullUploadDir))\n fs.mkdirSync(fullUploadDir, { recursive: true });\n\n cb(null, fullUploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n});\n\nclass UploadManager {\n private getUpload({\n maxSize = 1024 * 1024 * 5,\n allowedFileTypes = /.*/,\n }: {\n maxSize?: number;\n allowedFileTypes?: string[] | RegExp;\n }): multer.Multer {\n return multer({\n storage,\n fileFilter: (req, file, cb) =>\n this.fileFilter(req, file, cb, allowedFileTypes),\n limits: { fileSize: maxSize },\n });\n }\n\n getMiddleware(config: UploadConfig): RequestHandler {\n let upload;\n if (config.type === \"single\")\n upload = this.getUpload(config)[config.type](config.field);\n else if (config.type === \"array\")\n upload = this.getUpload(config)[config.type](\n config.field,\n config.maxCount || 5\n );\n else upload = this.getUpload(config)[config.type](config.fields);\n return upload;\n }\n\n handleUpload(config: UploadConfig, oldFilePath?: string) {\n return catchAsync(\n (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const middleware = this.getMiddleware(config);\n req.headers[\"x-upload-dir\"] = config.uploadDir;\n middleware(req, res, async (err) => {\n if (err) return next(err);\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n sheu.warn(err);\n }\n }\n\n next();\n });\n }\n );\n }\n\n /**\n * Validates that all required upload files are present in the request.\n * Checks req.file or req.files based on upload configuration type.\n *\n * @param {UploadConfig} uploadConfig - The upload configuration from config.experimental.uploads\n * @throws {AppError} If required files are missing\n *\n * @example\n * // Single file upload - checks req.file\n * validateRequiredFiles(\n * { type: 'single', field: 'avatar', required: true },\n * req,\n * '/users/:id/avatar'\n * )\n *\n * @example\n * // Array file upload - checks req.files array\n * validateRequiredFiles(\n * { type: 'array', field: 'photos', required: true },\n * req,\n * '/gallery/upload'\n * )\n *\n * @example\n * // Multiple fields - checks req.files object\n * validateRequiredFiles(\n * { type: 'fields', fields: [{ name: 'avatar' }, { name: 'resume' }], required: true },\n * req,\n * '/profile/upload'\n * )\n */\n validateRequiredFiles(uploadConfig: UploadConfig) {\n return catchAsync((req: ArkosRequest, _: any, next: ArkosNextFunction) => {\n const errors: string[] = [];\n const errorCodes: string[] = [];\n\n if (uploadConfig.required === false) return next();\n\n if (uploadConfig.type === \"single\") {\n if (!req.file) {\n errors.push(\n `Required upload field '${uploadConfig.field}' is missing`\n );\n errorCodes.push(uploadConfig.field);\n }\n } else if (uploadConfig.type === \"array\") {\n if (!req.files || !Array.isArray(req.files) || req.files.length === 0) {\n errors.push(\n `Required upload field '${uploadConfig.field}' is missing or empty`\n );\n errorCodes.push(uploadConfig.field);\n }\n } else if (uploadConfig.type === \"fields\") {\n if (\n !req.files ||\n typeof req.files !== \"object\" ||\n Array.isArray(req.files)\n ) {\n errors.push(\n `Required upload fields are missing. Expected an object with fields: ${uploadConfig.fields.map((f) => f.name).join(\", \")}`\n );\n errorCodes.push(...uploadConfig.fields.map((f) => f.name));\n } else {\n for (const field of uploadConfig.fields) {\n const filesForField = (req.files as any)[field.name];\n if (\n !filesForField ||\n !Array.isArray(filesForField) ||\n filesForField.length === 0\n ) {\n errors.push(\n `Required upload field '${field.name}' is missing or empty`\n );\n errorCodes.push(field.name);\n }\n }\n }\n }\n\n if (errors.length > 0) {\n throw new AppError(\n errors[0],\n 400,\n `Missing${pascalCase(errorCodes[0]).replaceAll(\"_\", \"\")}FileField`,\n {\n errors,\n }\n );\n }\n\n next();\n });\n }\n\n handleFileCleanup(config: UploadConfig) {\n return async (\n err: any,\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const deleteFile = async (file: Express.Multer.File) => {\n try {\n await fs.promises.unlink(file.path);\n } catch (error: any) {\n sheu.warn(\n `Failed to delete file: ${file.path} because ${error.message}`,\n { timestamp: true }\n );\n }\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n await deleteFile(req.file);\n delete req.file;\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n for (const file of req.files) {\n await deleteFile(file);\n }\n delete req.files;\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n for (const fieldName in req.files) {\n for (const file of req.files[fieldName]) {\n await deleteFile(file);\n }\n }\n delete req.files;\n }\n } catch (error: any) {\n sheu.warn(`File cleanup error: ${error.message}`, { timestamp: true });\n }\n\n next(err);\n };\n }\n\n handlePostUpload(config: UploadConfig) {\n return catchAsync(\n (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n const arkosConfig = getArkosConfig();\n\n const normalizePath = (filePath: string): string => {\n let fullBaseUploadDir = path.resolve(\n path.join(process.cwd(), arkosConfig.fileUpload?.baseUploadDir!)\n );\n fullBaseUploadDir = fullBaseUploadDir.replace(process.cwd(), \"\");\n\n return filePath\n .replaceAll(process.cwd(), \"\")\n .replace(`/${fullBaseUploadDir}`, \"\")\n .replace(fullBaseUploadDir, \"\")\n .replace(/\\\\/g, \"/\");\n };\n\n const buildFileURL = (file: Express.Multer.File): string => {\n const relativePath = generateRelativePath(\n file.path,\n req.headers[\"x-upload-dir\"] as string\n );\n\n return `${baseURL}${baseRoute === \"/\" ? \"\" : baseRoute}${\n relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`\n }`;\n };\n\n const getAttachValue = (file: Express.Multer.File): any => {\n const url = buildFileURL(file);\n\n (file as any).url = url;\n (file as any).pathname = normalizePath(file.path);\n if (config.attachToBody === false) return undefined;\n if (config.attachToBody === \"pathname\" || !config.attachToBody)\n return (\n (baseRoute === \"/\"\n ? \"\"\n : baseRoute.startsWith(\"/\")\n ? baseRoute\n : `/${baseRoute}`) + normalizePath(file.path)\n );\n if (config.attachToBody === \"url\") return url;\n if (config.attachToBody === \"file\") return file;\n\n return undefined;\n };\n\n const setNestedValue = (obj: any, path: string, value: any) => {\n const keys = path.match(/[^\\[\\]]+/g) || [];\n\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n }\n current = current[key];\n }\n\n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n const value = getAttachValue(req.file);\n\n if (value !== undefined && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, value);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (config.type === \"array\" && Array.isArray(req.files)) {\n const values = req.files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0 && config.field) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, values);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n const bodyUpdate: any = {};\n\n for (const fieldName in req.files) {\n const files = req.files[fieldName];\n const values = files\n .map((file) => getAttachValue(file))\n .filter((v) => v !== undefined);\n\n if (values.length > 0) {\n const valueToAttach = values.length === 1 ? values[0] : values;\n setNestedValue(bodyUpdate, fieldName, valueToAttach);\n }\n }\n\n if (Object.keys(bodyUpdate).length > 0) {\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n }\n } catch (err: any) {\n throw new AppError(\n `File uploads post processing failed ${err.message}`,\n 500,\n \"FileUploadPostProcessError\"\n );\n }\n\n next();\n }\n );\n }\n\n /**\n * Validates the file's type and MIME type.\n * @param {Express.Multer.File} file - The uploaded file.\n * @param {Function} cb - The callback function to indicate if file is valid.\n */\n private fileFilter = (\n _: any,\n file: any,\n cb: any,\n allowedFileTypes: string[] | RegExp\n ) => {\n const ext = path.extname(file.originalname).toLowerCase();\n let isAllowed = false;\n if (Array.isArray(allowedFileTypes))\n isAllowed = allowedFileTypes.includes(ext);\n else isAllowed = allowedFileTypes.test(ext);\n\n if (isAllowed) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n}\n\nconst uploadManager = new UploadManager();\n\nexport default uploadManager;\n"]}
|
|
1
|
+
{"version":3,"file":"upload-manager.js","sourceRoot":"","sources":["../../../../../../src/utils/arkos-router/utils/helpers/upload-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import multer from \"multer\";\nimport {\n ArkosRouterBaseUploadConfig,\n UploadConfig,\n UploadConfigFieldEntry,\n} from \"../../types/upload-config\";\nimport {\n documentsExtensions,\n imagesExtenstions,\n videosExtensions,\n} from \"../../../../modules/file-upload/utils/helpers/file-extensions\";\nimport {\n ArkosNextFunction,\n ArkosRequest,\n ArkosResponse,\n getArkosConfig,\n} from \"../../../../exports\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport { removeBothSlashes } from \"../../../helpers/text.helpers\";\nimport { promisify } from \"util\";\nimport sheu from \"../../../sheu\";\nimport AppError from \"../../../../modules/error-handler/utils/app-error\";\nimport { RequestHandler } from \"express\";\nimport {\n extractRequestInfo,\n generateRelativePath,\n} from \"../../../../modules/file-upload/utils/helpers/file-upload.helpers\";\nimport deepmerge from \"../../../helpers/deepmerge.helper\";\nimport { catchAsync } from \"../../../../exports/error-handler\";\n\nfunction determineUploadDir(file: Express.Multer.File) {\n if (file.mimetype.includes?.(\"image\")) return \"/images\";\n if (file.mimetype.includes?.(\"video\")) return \"/videos\";\n if (imagesExtenstions.has(file.mimetype.split(\"/\")[1])) return \"/images\";\n if (videosExtensions.has(file.mimetype.split(\"/\")[1])) return \"/videos\";\n if (documentsExtensions.has(file.mimetype.split(\"/\")[1])) return \"/documents\";\n return \"/files\";\n}\n\nconst storage = multer.diskStorage({\n destination: (req, file, cb) => {\n const arkosConfig = getArkosConfig();\n const baseUploadDir = arkosConfig.fileUpload?.baseUploadDir || \"/uploads\";\n let uploadDir =\n (req.headers[\"x-upload-dir\"] as string) || determineUploadDir(file);\n req.headers[\"x-upload-dir\"] = uploadDir;\n\n const fullUploadDir = path.resolve(\n path.join(\n process.cwd(),\n baseUploadDir.replaceAll(\"//\", \"/\"),\n uploadDir.replaceAll(\"//\", \"/\")\n )\n );\n\n if (!fs.existsSync(fullUploadDir))\n fs.mkdirSync(fullUploadDir, { recursive: true });\n\n cb(null, fullUploadDir);\n },\n filename: (_, file, cb) => {\n const uniqueSuffix = Date.now() + \"-\" + Math.round(Math.random() * 1e9);\n const ext = path.extname(file.originalname);\n cb(null, `${file.originalname.replace(ext, \"\")}-${uniqueSuffix}${ext}`);\n },\n});\n\n/**\n * Returns true if a bracket-notation path contains at least one `[]` array marker.\n * e.g. \"banners[][images]\" → true, \"profile[photo]\" → false\n */\nfunction isNestedArrayPath(fieldPath: string): boolean {\n return fieldPath.includes(\"[]\");\n}\n\n/**\n * Converts a config bracket path (e.g. \"banners[][images]\") into a RegExp\n * that matches what the client actually sends (e.g. \"banners[0][images]\").\n * `[]` in the pattern matches `[<digits>]`.\n */\nfunction buildPathMatcher(pattern: string): RegExp {\n const escaped = pattern\n .replace(/\\[]/g, \"\\x00\")\n .replace(/[\\[\\]]/g, \"\\\\$&\")\n .replace(/\\x00/g, \"\\\\[\\\\d+\\\\]\");\n return new RegExp(`^${escaped}$`);\n}\n/**\n * Extracts the numeric index from a segment like \"[0]\", \"[12]\", etc.\n */\nfunction extractIndex(segment: string): number {\n return parseInt(segment.replace(/\\[|\\]/g, \"\"), 10);\n}\n\n/**\n * Given a client-sent key like \"banners[0][images]\" and a pattern like\n * \"banners[][images]\", extracts an ordered list of array indices.\n */\nfunction extractIndices(key: string, pattern: string): number[] {\n const patternParts = pattern.match(/\\[[^\\]]*\\]/g) || [];\n const keyParts = key.match(/\\[[^\\]]*\\]/g) || [];\n const indices: number[] = [];\n for (let i = 0; i < patternParts.length; i++) {\n if (patternParts[i] === \"[]\") {\n indices.push(extractIndex(keyParts[i]));\n }\n }\n return indices;\n}\n\n/**\n * Groups files from req.files by their array indices for a given pattern.\n */\nfunction groupFilesByPattern(\n files: { [fieldname: string]: Express.Multer.File[] },\n pattern: string\n): Map<string, Express.Multer.File[]> {\n const matcher = buildPathMatcher(pattern);\n const groups = new Map<string, Express.Multer.File[]>();\n\n for (const key of Object.keys(files)) {\n if (!matcher.test(key)) continue;\n const indices = extractIndices(key, pattern);\n const groupKey = indices.join(\",\");\n if (!groups.has(groupKey)) groups.set(groupKey, []);\n groups.get(groupKey)!.push(...files[key]);\n }\n\n return groups;\n}\n\n/**\n * Validates file type and size for files that bypass multer's own fileFilter\n * (i.e. nested array path fields handled via .any()).\n */\nfunction validateFileConstraints(\n file: Express.Multer.File,\n allowedFileTypes?: string[] | RegExp,\n maxSize?: number\n): string | null {\n if (maxSize && file.size > maxSize) {\n return `File '${file.originalname}' exceeds the maximum allowed size of ${maxSize} bytes`;\n }\n\n if (allowedFileTypes) {\n const ext = path.extname(file.originalname).toLowerCase();\n const allowed = Array.isArray(allowedFileTypes)\n ? allowedFileTypes.includes(ext)\n : allowedFileTypes.test(ext);\n if (!allowed) {\n return `File type '${ext}' is not allowed for '${file.originalname}'`;\n }\n }\n\n return null;\n}\n\n/**\n * Flattens a fields config for multer's fields() call.\n */\nfunction flattenFieldsForMulter(\n fields: UploadConfigFieldEntry[]\n): { name: string; maxCount: number }[] {\n return fields.map((field) => ({\n name: field.name,\n maxCount:\n \"type\" in field && field.type === \"single\" ? 1 : (field.maxCount ?? 5),\n }));\n}\n\n/**\n * Returns true if any field path uses nested array bracket notation.\n */\nfunction configHasNestedArrayPaths(config: UploadConfig): boolean {\n if (config.type === \"single\" || config.type === \"array\") {\n return isNestedArrayPath(config.field);\n }\n if (config.type === \"fields\") {\n return config.fields.some((f) => isNestedArrayPath(f.name));\n }\n return false;\n}\n\n/**\n * Narrows a field entry to its typed props.\n * Legacy entries ({ name, maxCount } with no type) are treated as array with defaults.\n */\nfunction resolveFieldEntry(\n field: UploadConfigFieldEntry,\n config: ArkosRouterBaseUploadConfig = {}\n): {\n name: string;\n type: \"single\" | \"array\";\n required: boolean;\n minCount: number | undefined;\n maxCount: number | undefined;\n allowedFileTypes: string[] | RegExp | undefined;\n maxSize: number | undefined;\n attachToBody: ArkosRouterBaseUploadConfig[\"attachToBody\"];\n} {\n const isLegacy = !(\"type\" in field) || field.type === undefined;\n if (isLegacy) {\n return {\n ...config,\n name: field.name,\n type: \"array\",\n required: !!config.required,\n minCount: field.minCount,\n maxCount: field.maxCount,\n allowedFileTypes: config.allowedFileTypes,\n maxSize: config.maxSize,\n attachToBody: config.attachToBody,\n };\n }\n\n if (field.type === \"single\") {\n return {\n name: field.name,\n type: \"single\",\n required: field.required !== false,\n minCount: undefined,\n maxCount: undefined,\n allowedFileTypes: field.allowedFileTypes,\n maxSize: field.maxSize,\n attachToBody: field.attachToBody,\n };\n }\n\n // type === \"array\"\n return {\n name: field.name,\n type: \"array\",\n required: field.required !== false,\n minCount: field.minCount,\n maxCount: field.maxCount,\n allowedFileTypes: field.allowedFileTypes,\n maxSize: field.maxSize,\n attachToBody: field.attachToBody,\n };\n}\n\nclass UploadManager {\n private getUpload({\n maxSize = 1024 * 1024 * 5,\n allowedFileTypes = /.*/,\n }: {\n maxSize?: number;\n allowedFileTypes?: string[] | RegExp;\n }): multer.Multer {\n return multer({\n storage,\n fileFilter: (req, file, cb) =>\n this.fileFilter(req, file, cb, allowedFileTypes),\n limits: { fileSize: maxSize },\n });\n }\n\n getMiddleware(config: UploadConfig): RequestHandler {\n if (configHasNestedArrayPaths(config)) {\n return multer({ storage }).any();\n }\n\n if (config.type === \"single\") {\n return this.getUpload(config).single(config.field);\n } else if (config.type === \"array\") {\n return this.getUpload(config).array(config.field, config.maxCount ?? 5);\n } else {\n const multerOptions =\n \"maxSize\" in config || \"allowedFileTypes\" in config\n ? {\n maxSize: (config as any).maxSize,\n allowedFileTypes: (config as any).allowedFileTypes,\n }\n : {};\n return this.getUpload(multerOptions).fields(\n flattenFieldsForMulter(config.fields)\n );\n }\n }\n\n handleUpload(config: UploadConfig, oldFilePath?: string) {\n return catchAsync(\n (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {\n const middleware = this.getMiddleware(config);\n req.headers[\"x-upload-dir\"] =\n \"uploadDir\" in config ? config.uploadDir : undefined;\n middleware(req, res, async (err) => {\n if (err) return next(err);\n\n // .any() gives req.files as File[] — normalize to { [fieldname]: File[] }\n // so groupFilesByPattern works correctly for nested array paths\n if (configHasNestedArrayPaths(config) && Array.isArray(req.files)) {\n const normalized: { [fieldname: string]: Express.Multer.File[] } =\n {};\n for (const file of req.files) {\n if (!normalized[file.fieldname]) normalized[file.fieldname] = [];\n normalized[file.fieldname].push(file);\n }\n req.files = normalized;\n }\n\n if (oldFilePath) {\n const { fileUpload: configs } = getArkosConfig();\n const filePath = path.resolve(\n process.cwd(),\n removeBothSlashes(configs?.baseUploadDir!),\n removeBothSlashes(oldFilePath)\n );\n try {\n const stats = await promisify(fs.stat)(filePath);\n if (stats) await promisify(fs.unlink)(filePath);\n } catch (err) {\n sheu.warn(err);\n }\n }\n\n next();\n });\n }\n );\n }\n\n validateRequiredFiles(uploadConfig: UploadConfig) {\n return catchAsync((req: ArkosRequest, _: any, next: ArkosNextFunction) => {\n const errors: string[] = [];\n const errorCodes: string[] = [];\n\n const addError = (msg: string, code: string) => {\n errors.push(msg);\n errorCodes.push(code);\n };\n\n const validateField = (\n field: string,\n type: \"single\" | \"array\",\n required: boolean,\n minCount: number | undefined,\n maxCount: number | undefined,\n allowedFileTypes: string[] | RegExp | undefined,\n maxSize: number | undefined\n ) => {\n const isNested = isNestedArrayPath(field);\n\n if (isNested) {\n const filesObj = req.files as {\n [fieldname: string]: Express.Multer.File[];\n };\n if (!filesObj || Array.isArray(filesObj)) {\n if (required)\n addError(`Required field '${field}' is missing`, field);\n return;\n }\n\n const groups = groupFilesByPattern(filesObj, field);\n\n if (groups.size === 0) {\n if (required)\n addError(`Required field '${field}' is missing`, field);\n return;\n }\n\n for (const [groupKey, groupFiles] of groups) {\n const label = `'${field}' (group ${groupKey})`;\n\n if (type === \"single\" && groupFiles.length !== 1) {\n addError(`Field ${label} must have exactly 1 file`, field);\n }\n\n if (type === \"array\") {\n if (minCount && groupFiles.length < minCount) {\n addError(\n `Field ${label} requires at least ${minCount} files, got ${groupFiles.length}`,\n field\n );\n }\n if (maxCount && groupFiles.length > maxCount) {\n addError(\n `Field ${label} allows at most ${maxCount} files, got ${groupFiles.length}`,\n field\n );\n }\n }\n\n for (const file of groupFiles) {\n const err = validateFileConstraints(\n file,\n allowedFileTypes,\n maxSize\n );\n if (err) addError(err, field);\n }\n }\n } else {\n if (type === \"single\") {\n if (required && !req.file) {\n addError(`Required upload field '${field}' is missing`, field);\n }\n } else {\n const filesObj = req.files as {\n [fieldname: string]: Express.Multer.File[];\n };\n const files = Array.isArray(req.files)\n ? req.files\n : filesObj?.[field];\n\n if (!files || files.length === 0) {\n if (required)\n addError(\n `Required upload field '${field}' is missing or empty`,\n field\n );\n } else if (!Array.isArray(files)) {\n if (required)\n addError(`Malformed upload field '${field}'`, field);\n } else {\n if (minCount && files.length < minCount) {\n addError(\n `Field '${field}' requires at least ${minCount} files, got ${files.length}`,\n field\n );\n }\n }\n }\n }\n };\n\n if (uploadConfig.type === \"single\") {\n validateField(\n uploadConfig.field,\n \"single\",\n uploadConfig.required !== false,\n undefined,\n undefined,\n isNestedArrayPath(uploadConfig.field)\n ? uploadConfig.allowedFileTypes\n : undefined,\n isNestedArrayPath(uploadConfig.field)\n ? uploadConfig.maxSize\n : undefined\n );\n } else if (uploadConfig.type === \"array\") {\n validateField(\n uploadConfig.field,\n \"array\",\n uploadConfig.required !== false,\n uploadConfig.minCount,\n uploadConfig.maxCount,\n isNestedArrayPath(uploadConfig.field)\n ? uploadConfig.allowedFileTypes\n : undefined,\n isNestedArrayPath(uploadConfig.field)\n ? uploadConfig.maxSize\n : undefined\n );\n } else if (uploadConfig.type === \"fields\") {\n for (const fieldEntry of uploadConfig.fields) {\n const resolved = resolveFieldEntry(fieldEntry, uploadConfig);\n validateField(\n resolved.name,\n resolved.type,\n resolved.required,\n resolved.minCount,\n resolved.maxCount,\n isNestedArrayPath(resolved.name)\n ? resolved.allowedFileTypes\n : undefined,\n isNestedArrayPath(resolved.name) ? resolved.maxSize : undefined\n );\n }\n }\n\n if (errors.length > 0) {\n throw new AppError(\n errors[0],\n 400,\n uploadConfig.type !== \"single\"\n ? `MissingUploadFields`\n : `MissingUploadField`,\n { errors }\n );\n }\n\n next();\n });\n }\n\n handleFileCleanup(config: UploadConfig) {\n return async (\n err: any,\n req: ArkosRequest,\n _: ArkosResponse,\n next: ArkosNextFunction\n ) => {\n const deleteFile = async (file: Express.Multer.File) => {\n try {\n await fs.promises.unlink(file.path);\n } catch (error: any) {\n sheu.warn(\n `Failed to delete file: ${file.path} because ${error.message}`,\n { timestamp: true }\n );\n }\n };\n\n try {\n if (config.type === \"single\" && req.file) {\n await deleteFile(req.file);\n delete req.file;\n } else if (\n (config.type === \"array\" || configHasNestedArrayPaths(config)) &&\n Array.isArray(req.files)\n ) {\n for (const file of req.files) {\n await deleteFile(file);\n }\n delete req.files;\n } else if (\n config.type === \"fields\" &&\n req.files &&\n !Array.isArray(req.files)\n ) {\n for (const fieldName in req.files) {\n for (const file of req.files[fieldName]) {\n await deleteFile(file);\n }\n }\n delete req.files;\n }\n } catch (error: any) {\n sheu.warn(`File cleanup error: ${error.message}`, { timestamp: true });\n }\n\n next(err);\n };\n }\n\n handlePostUpload(config: UploadConfig) {\n return catchAsync(\n (req: ArkosRequest, _: ArkosResponse, next: ArkosNextFunction) => {\n const { baseURL, baseRoute } = extractRequestInfo(req);\n const arkosConfig = getArkosConfig();\n\n const normalizePath = (filePath: string): string => {\n let fullBaseUploadDir = path.resolve(\n path.join(process.cwd(), arkosConfig.fileUpload?.baseUploadDir!)\n );\n fullBaseUploadDir = fullBaseUploadDir.replace(process.cwd(), \"\");\n return filePath\n .replaceAll(process.cwd(), \"\")\n .replace(`/${fullBaseUploadDir}`, \"\")\n .replace(fullBaseUploadDir, \"\")\n .replace(/\\\\/g, \"/\");\n };\n\n const buildFileURL = (file: Express.Multer.File): string => {\n const relativePath = generateRelativePath(\n file.path,\n req.headers[\"x-upload-dir\"] as string\n );\n return `${baseURL}${baseRoute === \"/\" ? \"\" : baseRoute}${\n relativePath.startsWith(\"/\") ? relativePath : `/${relativePath}`\n }`;\n };\n\n const getAttachValue = (\n file: Express.Multer.File,\n attachToBody: ArkosRouterBaseUploadConfig[\"attachToBody\"]\n ): any => {\n const url = buildFileURL(file);\n (file as any).url = url;\n (file as any).pathname = normalizePath(file.path);\n\n if (attachToBody === false) return undefined;\n if (attachToBody === \"url\") return url;\n if (attachToBody === \"file\") return file;\n\n return (\n (baseRoute === \"/\"\n ? \"\"\n : baseRoute.startsWith(\"/\")\n ? baseRoute\n : `/${baseRoute}`) + normalizePath(file.path)\n );\n };\n\n const setNestedValue = (obj: any, path: string, value: any) => {\n const keys = path.match(/[^\\[\\]]+/g) || [];\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n if (!current[key]) {\n const nextKey = keys[i + 1];\n current[key] = /^\\d+$/.test(nextKey) ? [] : {};\n }\n current = current[key];\n }\n const lastKey = keys[keys.length - 1];\n current[lastKey] = value;\n };\n\n /**\n * Reconstructs nested array structure from grouped files.\n *\n * Pattern: \"banners[][images]\"\n * Groups: { \"0\": [file1, file2], \"1\": [file3] }\n *\n * Result in req.body:\n * banners: [\n * { images: [\"path1\", \"path2\"] },\n * { images: [\"path3\"] }\n * ]\n */\n const reconstructNestedArrayPath = (\n pattern: string,\n filesObj: { [fieldname: string]: Express.Multer.File[] },\n attachToBody: ArkosRouterBaseUploadConfig[\"attachToBody\"],\n type: \"single\" | \"array\",\n sharedBodyUpdate?: any\n ) => {\n const groups = groupFilesByPattern(filesObj, pattern);\n if (groups.size === 0) return;\n\n // Parse the pattern to build the reconstruction path.\n // Split into segments: static keys and [] markers.\n // e.g. \"banners[][images]\" → [\"banners\", \"[]\", \"images\"]\n const segments = pattern.match(/[^\\[\\]]+|\\[\\]/g) || [];\n\n // Sort group keys so indices are in order\n const sortedGroups = [...groups.entries()].sort((a, b) => {\n const ai = a[0].split(\",\").map(Number);\n const bi = b[0].split(\",\").map(Number);\n for (let i = 0; i < Math.min(ai.length, bi.length); i++) {\n if (ai[i] !== bi[i]) return ai[i] - bi[i];\n }\n return 0;\n });\n\n const bodyUpdate = sharedBodyUpdate ?? {};\n\n for (const [groupKey, groupFiles] of sortedGroups) {\n const indices = groupKey.split(\",\").map(Number);\n let indexCounter = 0;\n\n // Build the concrete path for this group by replacing [] with actual indices\n const concretePath = segments\n .map((seg) => {\n if (seg === \"[]\") return `[${indices[indexCounter++]}]`;\n return seg;\n })\n .reduce((acc, seg, i) => {\n if (i === 0) return seg;\n if (seg.startsWith(\"[\")) return acc + seg;\n return acc + `[${seg}]`;\n }, \"\");\n\n const values = groupFiles\n .map((f) => getAttachValue(f, attachToBody))\n .filter((v) => v !== undefined);\n\n if (values.length === 0) continue;\n\n const valueToSet = type === \"single\" ? values[0] : values;\n setNestedValue(bodyUpdate, concretePath, valueToSet);\n }\n\n if (!sharedBodyUpdate) {\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n };\n\n try {\n if (config.type === \"single\") {\n if (isNestedArrayPath(config.field)) {\n const filesObj = req.files as {\n [fieldname: string]: Express.Multer.File[];\n };\n if (filesObj && !Array.isArray(filesObj)) {\n reconstructNestedArrayPath(\n config.field,\n filesObj,\n config.attachToBody,\n \"single\"\n );\n }\n } else if (req.file) {\n const value = getAttachValue(req.file, config.attachToBody);\n if (value !== undefined) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, value);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n }\n } else if (config.type === \"array\") {\n if (isNestedArrayPath(config.field)) {\n const filesObj = req.files as {\n [fieldname: string]: Express.Multer.File[];\n };\n if (filesObj && !Array.isArray(filesObj)) {\n reconstructNestedArrayPath(\n config.field,\n filesObj,\n config.attachToBody,\n \"array\"\n );\n }\n } else if (Array.isArray(req.files)) {\n const values = req.files\n .map((file) => getAttachValue(file, config.attachToBody))\n .filter((v) => v !== undefined);\n if (values.length > 0) {\n const bodyUpdate: any = {};\n setNestedValue(bodyUpdate, config.field, values);\n req.body = deepmerge(req.body || {}, bodyUpdate);\n }\n }\n } else if (config.type === \"fields\") {\n const filesObj = req.files as {\n [fieldname: string]: Express.Multer.File[];\n };\n if (!filesObj || Array.isArray(filesObj)) return next();\n\n const bodyUpdate: any = {};\n const configAttachToBody =\n \"attachToBody\" in config ? config.attachToBody : undefined;\n\n for (const fieldEntry of config.fields) {\n const resolved = resolveFieldEntry(fieldEntry);\n\n if (isNestedArrayPath(resolved.name)) {\n reconstructNestedArrayPath(\n resolved.name,\n filesObj,\n resolved.attachToBody ?? configAttachToBody,\n resolved.type,\n bodyUpdate\n );\n } else {\n const files = filesObj[resolved.name];\n if (!files || files.length === 0) continue;\n\n const attachTo = resolved.attachToBody ?? configAttachToBody;\n const values = files\n .map((f) => getAttachValue(f, attachTo))\n .filter((v) => v !== undefined);\n\n if (values.length === 0) continue;\n\n const valueToAttach =\n resolved.type === \"single\" ? values[0] : values;\n setNestedValue(bodyUpdate, resolved.name, valueToAttach);\n }\n }\n\n if (Object.keys(bodyUpdate).length > 0) {\n req.body = deepmerge(req.body || {}, bodyUpdate, {\n arrayMerge: (target, source) => {\n const result = [...target];\n source.forEach((item, i) => {\n result[i] = result[i] ? deepmerge(result[i], item) : item;\n });\n return result;\n },\n });\n }\n }\n } catch (err: any) {\n throw new AppError(\n `File uploads post processing failed ${err.message}`,\n 500,\n \"FileUploadPostProcessError\"\n );\n }\n\n next();\n }\n );\n }\n\n private fileFilter = (\n _: any,\n file: any,\n cb: any,\n allowedFileTypes: string[] | RegExp\n ) => {\n const ext = path.extname(file.originalname).toLowerCase();\n let isAllowed = false;\n if (Array.isArray(allowedFileTypes))\n isAllowed = allowedFileTypes.includes(ext);\n else isAllowed = allowedFileTypes.test(ext);\n\n if (isAllowed) cb(null, true);\n else\n cb(\n new AppError(\n `File type not allowed, allowed files are ${String(allowedFileTypes).replaceAll(\"/\", \"\").split(\"|\").join(\", \")}`,\n 400,\n \"FileTypeNotAllowed\",\n { filename: file.originalname }\n )\n );\n };\n}\n\nconst uploadManager = new UploadManager();\n\nexport default uploadManager;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../src/utils/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\n/**\n * Options for configuring a bundle run.\n */\ninterface BundlerOptions {\n /** Output file extension: \".js\" | \".cjs\" | \".mjs\" */\n ext: string;\n /** Directory containing the compiled output files to process */\n outDir: string;\n /** Source root directory used to resolve tsconfig paths. Defaults to process.cwd() */\n rootDir?: string;\n /** Explicit path to tsconfig.json or jsconfig.json. Auto-detected from rootDir if omitted */\n configPath?: string;\n}\n\n/**\n * Resolved path aliases and base URL extracted from tsconfig/jsconfig.\n */\ninterface ResolvedPaths {\n /** Absolute path used as the base for resolving alias targets */\n baseUrl: string;\n /** Map of alias patterns to their target path arrays, e.g. { \"@/*\": [\"src/*\"] } */\n paths: Record<string, string[]>;\n}\n\n/**\n * A pre-compiled alias entry for efficient matching at runtime.\n */\ninterface CompiledAlias {\n /** The alias prefix, e.g. \"@\" for \"@/*\" or \"@utils\" for \"@utils/*\" */\n prefix: string;\n /** Whether the alias uses a wildcard, e.g. \"@/*\" vs \"@root\" */\n isWildcard: boolean;\n /** Ordered list of target paths to try when the alias matches */\n targets: string[];\n}\n\n/**\n * Post-compilation import rewriter and alias resolver.\n *\n * Recursively processes all `.js`, `.cjs`, and `.mjs` files in the output\n * directory, rewriting:\n * - Relative imports to include the correct file extension\n * - Directory imports to use `/index.ext`\n * - Path aliases defined in tsconfig/jsconfig `paths` to relative paths\n *\n * Bare node_modules specifiers (e.g. `\"express\"`, `\"@prisma/client\"`) are\n * left untouched.\n *\n * @example\n * ```ts\n * const bundler = new Bundler();\n *\n * bundler.bundle({\n * ext: \".js\",\n * outDir: \"./dist\",\n * rootDir: \"./\",\n * configPath: \"./tsconfig.json\",\n * });\n * ```\n */\nexport class Bundler {\n /**\n * Regexes for matching all import/export/require statement forms.\n * Defined as static to avoid recreation per file processed.\n */\n private static readonly IMPORT_REGEXES = [\n /from\\s+['\"]([^'\"]+)['\"]/g,\n /import\\s+['\"]([^'\"]+)['\"]/g,\n /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n\n /**\n * Pre-compiles path alias patterns into a lookup-friendly structure\n * so alias matching during processing is O(n) over aliases rather than\n * re-parsing patterns per import.\n */\n private compileAliases(resolvedPaths: ResolvedPaths): CompiledAlias[] {\n return Object.entries(resolvedPaths.paths).map(([pattern, targets]) => {\n const isWildcard = pattern.endsWith(\"/*\");\n return {\n prefix: isWildcard ? pattern.slice(0, -2) : pattern,\n isWildcard,\n targets,\n };\n });\n }\n\n /**\n * Loads and parses the tsconfig/jsconfig file, resolving any `extends` chain.\n * Falls back to `{ baseUrl: rootDir, paths: {} }` if no config is found.\n *\n * @param rootDir - Absolute root directory\n * @param configPath - Explicit config path, or undefined to auto-detect\n */\n private loadConfig(rootDir: string, configPath?: string): ResolvedPaths {\n const resolved = configPath\n ? path.resolve(configPath)\n : this.findConfig(rootDir);\n\n if (!resolved || !fs.existsSync(resolved)) {\n return { baseUrl: rootDir, paths: {} };\n }\n\n return this.parseConfig(resolved, rootDir);\n }\n\n /**\n * Searches for a tsconfig.json or jsconfig.json in the given directory.\n * Prefers tsconfig.json over jsconfig.json.\n *\n * @param dir - Directory to search in\n * @returns Absolute path to the config file, or null if not found\n */\n private findConfig(dir: string): string | null {\n for (const name of [\"tsconfig.json\", \"jsconfig.json\"]) {\n const candidate = path.join(dir, name);\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n }\n\n /**\n * Recursively parses a tsconfig/jsconfig file, following `extends` chains\n * and merging `paths` with child config taking precedence over parent.\n *\n * @param configPath - Absolute path to the config file to parse\n * @param rootDir - Absolute root directory used as fallback baseUrl\n */\n private parseConfig(configPath: string, rootDir: string): ResolvedPaths {\n const configDir = path.dirname(configPath);\n const raw = this.readJsonWithComments(configPath);\n\n let base: ResolvedPaths = { baseUrl: rootDir, paths: {} };\n\n if (raw.extends) {\n const isPackage = !raw.extends.startsWith(\".\");\n const parentPath = isPackage\n ? this.resolveNodeModulesConfig(raw.extends, rootDir)\n : path.resolve(configDir, raw.extends);\n\n if (parentPath && fs.existsSync(parentPath)) {\n base = this.parseConfig(parentPath, rootDir);\n }\n }\n\n const co = raw.compilerOptions || {};\n const baseUrl = co.baseUrl\n ? path.resolve(configDir, co.baseUrl)\n : base.baseUrl;\n\n return {\n baseUrl,\n paths: { ...base.paths, ...(co.paths || {}) },\n };\n }\n\n /**\n * Resolves a tsconfig `extends` value that points to a node_modules package,\n * e.g. `\"@tsconfig/node18/tsconfig.json\"`.\n *\n * @param extendsValue - The raw extends string from tsconfig\n * @param rootDir - Root directory to resolve from\n * @returns Absolute path to the resolved config file, or null if not found\n */\n private resolveNodeModulesConfig(\n extendsValue: string,\n rootDir: string\n ): string | null {\n try {\n return require.resolve(extendsValue, { paths: [rootDir] });\n } catch {\n return null;\n }\n }\n\n /**\n * Reads a JSON file that may contain comments and trailing commas\n * (as tsconfig/jsconfig files allow) and returns the parsed object.\n *\n * @param filePath - Absolute path to the JSON file\n * @returns Parsed object, or empty object if parsing fails\n */\n private readJsonWithComments(filePath: string): any {\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(\n raw\n .replace(\n /(\"(?:[^\"\\\\]|\\\\.)*\")|\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g,\n (_, str) => str ?? \"\"\n )\n .replace(/,(\\s*[}\\]])/g, \"$1\")\n );\n }\n\n /**\n * Resolves a single import path to its final rewritten form.\n *\n * Resolution order:\n * 1. Relative imports (`./`, `../`) — extension is added via `addExtension`\n * 2. Aliased imports — matched against compiled aliases and converted to relative paths\n * 3. Bare specifiers (`express`, `@prisma/client`) — returned untouched\n *\n * @param importPath - The raw import string from source code\n * @param fileDir - Absolute directory of the file containing the import\n * @param ext - The output file extension\n * @param resolvedPaths - Resolved baseUrl and paths from tsconfig\n * @param compiledAliases - Pre-compiled alias entries\n */\n\n private resolveImport(\n importPath: string,\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n ext: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[]\n ): string {\n if (importPath.startsWith(\".\") || importPath.startsWith(\"/\")) {\n return this.addExtension(importPath, fileDir, ext);\n }\n\n for (const alias of compiledAliases) {\n if (alias.isWildcard) {\n if (!importPath.startsWith(alias.prefix + \"/\")) continue;\n const remainder = importPath.slice(alias.prefix.length + 1);\n\n for (const target of alias.targets) {\n const absoluteSource = path.resolve(\n resolvedPaths.baseUrl,\n target.replace(\"*\", remainder)\n );\n const fileDirInSource = this.getFileDirInSource(\n fileDir,\n rootOutDir,\n rootDir,\n resolvedPaths.baseUrl\n );\n return this.addExtension(\n this.toRelative(fileDirInSource, absoluteSource),\n fileDir,\n ext\n );\n }\n } else {\n if (importPath !== alias.prefix) continue;\n for (const target of alias.targets) {\n const absoluteSource = path.resolve(resolvedPaths.baseUrl, target);\n const fileDirInSource = this.getFileDirInSource(\n fileDir,\n rootOutDir,\n rootDir,\n resolvedPaths.baseUrl\n );\n return this.addExtension(\n this.toRelative(fileDirInSource, absoluteSource),\n fileDir,\n ext\n );\n }\n }\n }\n\n return importPath;\n }\n\n private getFileDirInSource(\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n baseUrl: string\n ): string {\n const relToRootDir = path.relative(rootDir, rootOutDir);\n if (!relToRootDir) return baseUrl;\n\n // First component of relToRootDir is the dist folder name (e.g. \"dist\")\n const distFolderName = relToRootDir.split(path.sep)[0];\n const distRoot = path.join(rootDir, distFolderName);\n const relFromDistRoot = path.relative(distRoot, fileDir);\n return path.resolve(baseUrl, relFromDistRoot);\n }\n\n /**\n * Appends the configured extension to an import path if not already present.\n * If the path resolves to a directory containing an `index` file, appends\n * `/index.ext` instead.\n *\n * @param importPath - The relative import path to fix\n * @param fileDir - Absolute directory of the file containing the import\n * @param ext - The output file extension\n */\n private addExtension(\n importPath: string,\n fileDir: string,\n ext: string\n ): string {\n if (importPath.endsWith(ext)) return importPath;\n\n const absolute = path.resolve(fileDir, importPath);\n if (fs.existsSync(absolute + \"/index\" + ext)) {\n return importPath + \"/index\" + ext;\n }\n\n return importPath + ext;\n }\n\n /**\n * Converts an absolute path to a relative path from a given directory,\n * ensuring the result always starts with `./` or `../`.\n *\n * @param fromDir - The directory to compute the relative path from\n * @param toPath - The absolute target path\n * @returns A POSIX-style relative path\n */\n private toRelative(fromDir: string, toPath: string): string {\n const rel = path.relative(fromDir, toPath).replace(/\\\\/g, \"/\");\n return rel.startsWith(\".\") ? rel : \"./\" + rel;\n }\n\n /**\n * Rewrites all import/export/require statements in a string of JS source code.\n * Each regex is reset before use since they are stateful with the `/g` flag.\n *\n * @param content - Raw file content to process\n * @param fileDir - Absolute directory of the file being processed\n * @param ext - The output file extension\n * @param resolvedPaths - Resolved baseUrl and paths from tsconfig\n * @param compiledAliases - Pre-compiled alias entries\n */\n private rewriteImports(\n content: string,\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n ext: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[]\n ): string {\n for (const regex of Bundler.IMPORT_REGEXES) {\n regex.lastIndex = 0;\n content = content.replace(regex, (match, p) => {\n const fixed = this.resolveImport(\n p,\n fileDir,\n rootOutDir,\n rootDir,\n ext,\n resolvedPaths,\n compiledAliases\n );\n return fixed === p ? match : match.replace(p, fixed);\n });\n }\n return content;\n }\n\n /**\n * Recursively processes all `.js`, `.cjs`, and `.mjs` files in the output\n * directory, rewriting imports in-place. Files whose content is unchanged\n * are not written back to disk.\n *\n * @param options - Configuration options for this bundle run\n */\n bundle(options: BundlerOptions): void {\n const rootDir = path.resolve(options.rootDir || process.cwd());\n const outDir = path.resolve(options.outDir);\n const resolvedPaths = this.loadConfig(rootDir, options.configPath);\n const compiledAliases = this.compileAliases(resolvedPaths);\n\n this._bundleDir(\n options.ext,\n outDir,\n rootDir,\n resolvedPaths,\n compiledAliases,\n outDir\n );\n }\n\n /**\n * Internal recursive directory walker, separated so that `bundle()` only\n * resolves config once at the top level rather than on every recursion.\n */\n private _bundleDir(\n ext: string,\n rootOutDir: string,\n rootDir: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[],\n dir: string\n ): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n this._bundleDir(\n ext,\n rootOutDir,\n rootDir,\n resolvedPaths,\n compiledAliases,\n fullPath\n );\n } else if (/\\.(js|cjs|mjs)$/.test(entry.name)) {\n const content = fs.readFileSync(fullPath, \"utf8\");\n const updated = this.rewriteImports(\n content,\n path.dirname(fullPath),\n rootOutDir,\n rootDir,\n ext,\n resolvedPaths,\n compiledAliases\n );\n if (updated !== content) fs.writeFileSync(fullPath, updated);\n }\n }\n }\n}\n\nexport const bundler = new Bundler();\n"]}
|
|
1
|
+
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../../../src/utils/bundler.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\n\n/**\n * Options for configuring a bundle run.\n */\ninterface BundlerOptions {\n /** Output file extension: \".js\" | \".cjs\" | \".mjs\" */\n ext: string;\n /** Directory containing the compiled output files to process */\n outDir: string;\n /** Source root directory used to resolve tsconfig paths. Defaults to process.cwd() */\n rootDir?: string;\n /** Explicit path to tsconfig.json or jsconfig.json. Auto-detected from rootDir if omitted */\n configPath?: string;\n}\n\n/**\n * Resolved path aliases and base URL extracted from tsconfig/jsconfig.\n */\ninterface ResolvedPaths {\n /** Absolute path used as the base for resolving alias targets */\n baseUrl: string;\n /** Map of alias patterns to their target path arrays, e.g. { \"@/*\": [\"src/*\"] } */\n paths: Record<string, string[]>;\n}\n\n/**\n * A pre-compiled alias entry for efficient matching at runtime.\n */\ninterface CompiledAlias {\n /** The alias prefix, e.g. \"@\" for \"@/*\" or \"@utils\" for \"@utils/*\" */\n prefix: string;\n /** Whether the alias uses a wildcard, e.g. \"@/*\" vs \"@root\" */\n isWildcard: boolean;\n /** Ordered list of target paths to try when the alias matches */\n targets: string[];\n}\n\n/**\n * Post-compilation import rewriter and alias resolver.\n *\n * Recursively processes all `.js`, `.cjs`, and `.mjs` files in the output\n * directory, rewriting:\n * - Relative imports to include the correct file extension\n * - Directory imports to use `/index.ext`\n * - Path aliases defined in tsconfig/jsconfig `paths` to relative paths\n *\n * Bare node_modules specifiers (e.g. `\"express\"`, `\"@prisma/client\"`) are\n * left untouched.\n *\n * @example\n * ```ts\n * const bundler = new Bundler();\n *\n * bundler.bundle({\n * ext: \".js\",\n * outDir: \"./dist\",\n * rootDir: \"./\",\n * configPath: \"./tsconfig.json\",\n * });\n * ```\n */\nexport class Bundler {\n /**\n * Regexes for matching all import/export/require statement forms.\n * Defined as static to avoid recreation per file processed.\n */\n private static readonly IMPORT_REGEXES = [\n /from\\s+['\"]([^'\"]+)['\"]/g,\n /import\\s+['\"]([^'\"]+)['\"]/g,\n /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g,\n ];\n\n /**\n * Pre-compiles path alias patterns into a lookup-friendly structure\n * so alias matching during processing is O(n) over aliases rather than\n * re-parsing patterns per import.\n */\n private compileAliases(resolvedPaths: ResolvedPaths): CompiledAlias[] {\n return Object.entries(resolvedPaths.paths).map(([pattern, targets]) => {\n const isWildcard = pattern.endsWith(\"/*\");\n return {\n prefix: isWildcard ? pattern.slice(0, -2) : pattern,\n isWildcard,\n targets,\n };\n });\n }\n\n /**\n * Loads and parses the tsconfig/jsconfig file, resolving any `extends` chain.\n * Falls back to `{ baseUrl: rootDir, paths: {} }` if no config is found.\n *\n * @param rootDir - Absolute root directory\n * @param configPath - Explicit config path, or undefined to auto-detect\n */\n private loadConfig(rootDir: string, configPath?: string): ResolvedPaths {\n const resolved = configPath\n ? path.resolve(configPath)\n : this.findConfig(rootDir);\n\n if (!resolved || !fs.existsSync(resolved)) {\n return { baseUrl: rootDir, paths: {} };\n }\n\n return this.parseConfig(resolved, rootDir);\n }\n\n /**\n * Searches for a tsconfig.json or jsconfig.json in the given directory.\n * Prefers tsconfig.json over jsconfig.json.\n *\n * @param dir - Directory to search in\n * @returns Absolute path to the config file, or null if not found\n */\n private findConfig(dir: string): string | null {\n for (const name of [\"tsconfig.json\", \"jsconfig.json\"]) {\n const candidate = path.join(dir, name);\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n }\n\n /**\n * Recursively parses a tsconfig/jsconfig file, following `extends` chains\n * and merging `paths` with child config taking precedence over parent.\n *\n * @param configPath - Absolute path to the config file to parse\n * @param rootDir - Absolute root directory used as fallback baseUrl\n */\n private parseConfig(configPath: string, rootDir: string): ResolvedPaths {\n const configDir = path.dirname(configPath);\n const raw = this.readJsonWithComments(configPath);\n\n let base: ResolvedPaths = { baseUrl: rootDir, paths: {} };\n\n if (raw.extends) {\n const isPackage = !raw.extends.startsWith(\".\");\n const parentPath = isPackage\n ? this.resolveNodeModulesConfig(raw.extends, rootDir)\n : path.resolve(configDir, raw.extends);\n\n if (parentPath && fs.existsSync(parentPath)) {\n base = this.parseConfig(parentPath, rootDir);\n }\n }\n\n const co = raw.compilerOptions || {};\n const baseUrl = co.baseUrl\n ? path.resolve(configDir, co.baseUrl)\n : base.baseUrl;\n\n return {\n baseUrl,\n paths: { ...base.paths, ...(co.paths || {}) },\n };\n }\n\n /**\n * Resolves a tsconfig `extends` value that points to a node_modules package,\n * e.g. `\"@tsconfig/node18/tsconfig.json\"`.\n *\n * @param extendsValue - The raw extends string from tsconfig\n * @param rootDir - Root directory to resolve from\n * @returns Absolute path to the resolved config file, or null if not found\n */\n private resolveNodeModulesConfig(\n extendsValue: string,\n rootDir: string\n ): string | null {\n try {\n return require.resolve(extendsValue, { paths: [rootDir] });\n } catch {\n return null;\n }\n }\n\n /**\n * Reads a JSON file that may contain comments and trailing commas\n * (as tsconfig/jsconfig files allow) and returns the parsed object.\n *\n * @param filePath - Absolute path to the JSON file\n * @returns Parsed object, or empty object if parsing fails\n */\n readJsonWithComments(filePath: string): any {\n const raw = fs.readFileSync(filePath, \"utf8\");\n return JSON.parse(\n raw\n .replace(\n /(\"(?:[^\"\\\\]|\\\\.)*\")|\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g,\n (_, str) => str ?? \"\"\n )\n .replace(/,(\\s*[}\\]])/g, \"$1\")\n );\n }\n\n /**\n * Resolves a single import path to its final rewritten form.\n *\n * Resolution order:\n * 1. Relative imports (`./`, `../`) — extension is added via `addExtension`\n * 2. Aliased imports — matched against compiled aliases and converted to relative paths\n * 3. Bare specifiers (`express`, `@prisma/client`) — returned untouched\n *\n * @param importPath - The raw import string from source code\n * @param fileDir - Absolute directory of the file containing the import\n * @param ext - The output file extension\n * @param resolvedPaths - Resolved baseUrl and paths from tsconfig\n * @param compiledAliases - Pre-compiled alias entries\n */\n\n private resolveImport(\n importPath: string,\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n ext: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[]\n ): string {\n if (importPath.startsWith(\".\") || importPath.startsWith(\"/\")) {\n return this.addExtension(importPath, fileDir, ext);\n }\n\n for (const alias of compiledAliases) {\n if (alias.isWildcard) {\n if (!importPath.startsWith(alias.prefix + \"/\")) continue;\n const remainder = importPath.slice(alias.prefix.length + 1);\n\n for (const target of alias.targets) {\n const absoluteSource = path.resolve(\n resolvedPaths.baseUrl,\n target.replace(\"*\", remainder)\n );\n const fileDirInSource = this.getFileDirInSource(\n fileDir,\n rootOutDir,\n rootDir,\n resolvedPaths.baseUrl\n );\n return this.addExtension(\n this.toRelative(fileDirInSource, absoluteSource),\n fileDir,\n ext\n );\n }\n } else {\n if (importPath !== alias.prefix) continue;\n for (const target of alias.targets) {\n const absoluteSource = path.resolve(resolvedPaths.baseUrl, target);\n const fileDirInSource = this.getFileDirInSource(\n fileDir,\n rootOutDir,\n rootDir,\n resolvedPaths.baseUrl\n );\n return this.addExtension(\n this.toRelative(fileDirInSource, absoluteSource),\n fileDir,\n ext\n );\n }\n }\n }\n\n return importPath;\n }\n\n private getFileDirInSource(\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n baseUrl: string\n ): string {\n const relToRootDir = path.relative(rootDir, rootOutDir);\n if (!relToRootDir) return baseUrl;\n\n // First component of relToRootDir is the dist folder name (e.g. \"dist\")\n const distFolderName = relToRootDir.split(path.sep)[0];\n const distRoot = path.join(rootDir, distFolderName);\n const relFromDistRoot = path.relative(distRoot, fileDir);\n return path.resolve(baseUrl, relFromDistRoot);\n }\n\n /**\n * Appends the configured extension to an import path if not already present.\n * If the path resolves to a directory containing an `index` file, appends\n * `/index.ext` instead.\n *\n * @param importPath - The relative import path to fix\n * @param fileDir - Absolute directory of the file containing the import\n * @param ext - The output file extension\n */\n private addExtension(\n importPath: string,\n fileDir: string,\n ext: string\n ): string {\n if (importPath.endsWith(ext)) return importPath;\n\n const absolute = path.resolve(fileDir, importPath);\n if (fs.existsSync(absolute + \"/index\" + ext)) {\n return importPath + \"/index\" + ext;\n }\n\n return importPath + ext;\n }\n\n /**\n * Converts an absolute path to a relative path from a given directory,\n * ensuring the result always starts with `./` or `../`.\n *\n * @param fromDir - The directory to compute the relative path from\n * @param toPath - The absolute target path\n * @returns A POSIX-style relative path\n */\n private toRelative(fromDir: string, toPath: string): string {\n const rel = path.relative(fromDir, toPath).replace(/\\\\/g, \"/\");\n return rel.startsWith(\".\") ? rel : \"./\" + rel;\n }\n\n /**\n * Rewrites all import/export/require statements in a string of JS source code.\n * Each regex is reset before use since they are stateful with the `/g` flag.\n *\n * @param content - Raw file content to process\n * @param fileDir - Absolute directory of the file being processed\n * @param ext - The output file extension\n * @param resolvedPaths - Resolved baseUrl and paths from tsconfig\n * @param compiledAliases - Pre-compiled alias entries\n */\n private rewriteImports(\n content: string,\n fileDir: string,\n rootOutDir: string,\n rootDir: string,\n ext: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[]\n ): string {\n for (const regex of Bundler.IMPORT_REGEXES) {\n regex.lastIndex = 0;\n content = content.replace(regex, (match, p) => {\n const fixed = this.resolveImport(\n p,\n fileDir,\n rootOutDir,\n rootDir,\n ext,\n resolvedPaths,\n compiledAliases\n );\n return fixed === p ? match : match.replace(p, fixed);\n });\n }\n return content;\n }\n\n /**\n * Recursively processes all `.js`, `.cjs`, and `.mjs` files in the output\n * directory, rewriting imports in-place. Files whose content is unchanged\n * are not written back to disk.\n *\n * @param options - Configuration options for this bundle run\n */\n bundle(options: BundlerOptions): void {\n const rootDir = path.resolve(options.rootDir || process.cwd());\n const outDir = path.resolve(options.outDir);\n const resolvedPaths = this.loadConfig(rootDir, options.configPath);\n const compiledAliases = this.compileAliases(resolvedPaths);\n\n this._bundleDir(\n options.ext,\n outDir,\n rootDir,\n resolvedPaths,\n compiledAliases,\n outDir\n );\n }\n\n /**\n * Internal recursive directory walker, separated so that `bundle()` only\n * resolves config once at the top level rather than on every recursion.\n */\n private _bundleDir(\n ext: string,\n rootOutDir: string,\n rootDir: string,\n resolvedPaths: ResolvedPaths,\n compiledAliases: CompiledAlias[],\n dir: string\n ): void {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n this._bundleDir(\n ext,\n rootOutDir,\n rootDir,\n resolvedPaths,\n compiledAliases,\n fullPath\n );\n } else if (/\\.(js|cjs|mjs)$/.test(entry.name)) {\n const content = fs.readFileSync(fullPath, \"utf8\");\n const updated = this.rewriteImports(\n content,\n path.dirname(fullPath),\n rootOutDir,\n rootDir,\n ext,\n resolvedPaths,\n compiledAliases\n );\n if (updated !== content) fs.writeFileSync(fullPath, updated);\n }\n }\n }\n}\n\nexport const bundler = new Bundler();\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import fs from "fs";
|
|
3
|
-
import { execSync } from "child_process";
|
|
3
|
+
import { execFileSync, execSync } from "child_process";
|
|
4
4
|
import { getUserFileExtension } from "../helpers/fs.helpers.js";
|
|
5
5
|
import { loadEnvironmentVariables } from "../dotenv.helpers.js";
|
|
6
6
|
import { detectPackageManagerFromUserAgent } from "../helpers/global.helpers.js";
|
|
@@ -66,8 +66,7 @@ function buildTypeScriptProject(options, moduleType) {
|
|
|
66
66
|
let tsconfig = {};
|
|
67
67
|
try {
|
|
68
68
|
if (fs.existsSync(tsconfigPath)) {
|
|
69
|
-
|
|
70
|
-
tsconfig = JSON.parse(tsconfigContent);
|
|
69
|
+
tsconfig = bundler.readJsonWithComments(tsconfigPath);
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
catch (error) {
|
|
@@ -85,7 +84,7 @@ function buildTypeScriptProject(options, moduleType) {
|
|
|
85
84
|
fs.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));
|
|
86
85
|
try {
|
|
87
86
|
removeDir(BUILD_DIR);
|
|
88
|
-
|
|
87
|
+
execFileSync("tsc", ["-p", tempTsconfigPath], {
|
|
89
88
|
stdio: "inherit",
|
|
90
89
|
cwd: process.cwd(),
|
|
91
90
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/utils/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport { detectPackageManagerFromUserAgent } from \"../helpers/global.helpers\";\nimport sheu from \"../sheu\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\nimport { removeDir } from \"../remove-dir\";\nimport { bundler } from \"../bundler\";\n\nconst BUILD_DIR = \".build\";\nconst MODULE_TYPES = [\"cjs\", \"esm\"] as const;\ntype ModuleType = (typeof MODULE_TYPES)[number];\n\ninterface BuildOptions {\n config?: string;\n module?: string;\n}\n\n/**\n * Main build function for the arkos CLI\n */\nexport function buildCommand(options: BuildOptions = {}) {\n process.env.NO_CLI = \"true\";\n const fileExt = getUserFileExtension();\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"production\";\n process.env.ARKOS_BUILD = \"true\";\n\n const envFiles = loadEnvironmentVariables();\n const moduleType = validateModuleType(options.module);\n\n try {\n watermarkStamper.stamp({\n envFiles,\n });\n\n console.info(`\\n Creating an optimized production build...`);\n\n ensureBuildDir();\n\n if (fileExt === \"ts\") buildTypeScriptProject(options, moduleType);\n else buildJavaScriptProject(options, moduleType);\n\n const packageManger = detectPackageManagerFromUserAgent();\n\n console.info(`\\n\\x1b[1m\\x1b[32m Build complete!\\x1b[0m\\n`);\n console.info(` \\x1b[1mNext step:\\x1b[0m`);\n console.info(\n ` Run it using \\x1b[1m\\x1b[36m${packageManger} run start\\x1b[0m\\n`\n );\n } catch (err: any) {\n console.info(\"\");\n sheu.error(`Build failed: ${err?.message}`);\n console.error(err);\n process.exit(1);\n }\n}\n\n/**\n * Validates and normalizes module type option\n */\nfunction validateModuleType(moduleType?: string): ModuleType {\n if (!moduleType) return \"cjs\";\n\n const normalizedType = moduleType.toLowerCase();\n\n if (normalizedType === \"cjs\" || normalizedType === \"commonjs\") return \"cjs\";\n else if ([\"esm\", \"es\", \"es2020\", \"esnext\", \"module\"].includes(normalizedType))\n return \"esm\";\n\n sheu.warn(`Unrecognized module type \"${moduleType}\", defaulting to \"cjs\"`);\n return \"cjs\";\n}\n\n/**\n * Ensure the build directory exists\n */\nfunction ensureBuildDir() {\n if (!fs.existsSync(BUILD_DIR)) fs.mkdirSync(BUILD_DIR, { recursive: true });\n\n for (const moduleType of MODULE_TYPES) {\n const moduleDir = path.join(BUILD_DIR, moduleType);\n if (!fs.existsSync(moduleDir)) {\n fs.mkdirSync(moduleDir, { recursive: true });\n }\n }\n}\n\n/**\n * Build a TypeScript project\n */\nfunction buildTypeScriptProject(options: BuildOptions, moduleType: ModuleType) {\n const tsconfigPath = path.join(\n process.cwd(),\n options.config || \"tsconfig.json\"\n );\n let tsconfig: any = {};\n\n try {\n if (fs.existsSync(tsconfigPath)) {\n const tsconfigContent = fs.readFileSync(tsconfigPath, \"utf8\");\n tsconfig = JSON.parse(tsconfigContent);\n }\n } catch (error) {\n console.error(\"❌ Error reading tsconfig.json:\", error);\n }\n\n const tempTsconfig = {\n ...tsconfig,\n compilerOptions: {\n ...(tsconfig.compilerOptions || {}),\n rootDir: \".\",\n outDir: path.join(`./${BUILD_DIR}`),\n },\n };\n\n const tempTsconfigPath = path.join(\n process.cwd(),\n `tsconfig.arkos-build.json`\n );\n fs.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));\n\n try {\n removeDir(BUILD_DIR);\n execSync(`npx tsc -p ${tempTsconfigPath}`, {\n stdio: \"inherit\",\n cwd: process.cwd(),\n });\n\n copyAllNonSourceFiles(moduleType, [\".ts\", \".tsx\"]);\n bundler.bundle({\n ext: \".js\",\n outDir: path.join(process.cwd(), BUILD_DIR),\n rootDir: process.cwd(),\n configPath: tempTsconfigPath,\n });\n\n cleanupTempConfig(tempTsconfigPath);\n } catch (error) {\n cleanupTempConfig(tempTsconfigPath);\n throw error;\n }\n}\n\n/**\n * Build a JavaScript project\n */\nfunction buildJavaScriptProject(_: BuildOptions, moduleType: ModuleType) {\n const targetDir = path.join(BUILD_DIR);\n\n try {\n if (moduleType === \"esm\") {\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n\n console.info(\"Note: .cjs files are skipped in ESM build\");\n } else {\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.cjs\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n }\n\n copyAllNonSourceFiles(moduleType, [\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n ]);\n\n bundler.bundle({\n ext: \".js\",\n outDir: path.join(process.cwd(), BUILD_DIR),\n rootDir: process.cwd(),\n });\n // createModulePackageJson(moduleType);\n } catch (error: any) {\n console.info(error.stack);\n console.error(\"❌ Error building JavaScript project:\", error.stack);\n throw error;\n }\n}\n\n/**\n * Copy all non-source code files to the build directory\n * This function will copy everything except the specified source file extensions\n */\nfunction copyAllNonSourceFiles(_: ModuleType, skipExtensions: string[]) {\n const targetDir = path.join(BUILD_DIR);\n const sourceDir = \"src\";\n\n try {\n // Recursive function to copy files\n function copyDirRecursive(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const sourcePath = path.join(dir, item);\n const targetPath = path.join(\n targetDir,\n dir.replace(sourceDir, \"\"),\n item\n );\n\n // Get file stats\n const stats = fs.statSync(sourcePath);\n\n if (stats.isDirectory()) {\n // Ensure target directory exists\n if (!fs.existsSync(targetPath)) {\n fs.mkdirSync(targetPath, { recursive: true });\n }\n // Recurse into subdirectory\n copyDirRecursive(sourcePath);\n } else if (stats.isFile()) {\n // Check if this is a file we should skip\n const ext = path.extname(item).toLowerCase();\n if (!skipExtensions.includes(ext)) {\n // Ensure the target directory exists\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n // Copy the file\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n }\n\n // Start copying from src directory\n copyDirRecursive(sourceDir);\n\n // Copy project root files if needed\n const rootFilesToCopy = [\"arkos.config.js\"];\n\n for (const file of rootFilesToCopy) {\n if (fs.existsSync(path.join(process.cwd(), file))) {\n fs.copyFileSync(\n path.join(process.cwd(), file),\n path.join(targetDir, file)\n );\n }\n }\n\n // console.info(`Copied all non-source files to ${targetDir}`);\n } catch (error) {\n console.warn(\"Warning: Error copying project files:\", error);\n console.error(error);\n }\n}\n\n/**\n * Clean up temporary tsconfig\n */\nfunction cleanupTempConfig(configPath: string) {\n try {\n if (fs.existsSync(configPath)) fs.unlinkSync(configPath);\n } catch (error) {\n console.warn(\"Warning: Error cleaning up temporary config:\", error);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../../src/utils/cli/build.ts"],"names":[],"mappings":"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","sourcesContent":["import path from \"path\";\nimport fs from \"fs\";\nimport { execFileSync, execSync } from \"child_process\";\nimport { getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport { detectPackageManagerFromUserAgent } from \"../helpers/global.helpers\";\nimport sheu from \"../sheu\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\nimport { removeDir } from \"../remove-dir\";\nimport { bundler } from \"../bundler\";\n\nconst BUILD_DIR = \".build\";\nconst MODULE_TYPES = [\"cjs\", \"esm\"] as const;\ntype ModuleType = (typeof MODULE_TYPES)[number];\n\ninterface BuildOptions {\n config?: string;\n module?: string;\n}\n\n/**\n * Main build function for the arkos CLI\n */\nexport function buildCommand(options: BuildOptions = {}) {\n process.env.NO_CLI = \"true\";\n const fileExt = getUserFileExtension();\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"production\";\n process.env.ARKOS_BUILD = \"true\";\n\n const envFiles = loadEnvironmentVariables();\n const moduleType = validateModuleType(options.module);\n\n try {\n watermarkStamper.stamp({\n envFiles,\n });\n\n console.info(`\\n Creating an optimized production build...`);\n\n ensureBuildDir();\n\n if (fileExt === \"ts\") buildTypeScriptProject(options, moduleType);\n else buildJavaScriptProject(options, moduleType);\n\n const packageManger = detectPackageManagerFromUserAgent();\n\n console.info(`\\n\\x1b[1m\\x1b[32m Build complete!\\x1b[0m\\n`);\n console.info(` \\x1b[1mNext step:\\x1b[0m`);\n console.info(\n ` Run it using \\x1b[1m\\x1b[36m${packageManger} run start\\x1b[0m\\n`\n );\n } catch (err: any) {\n console.info(\"\");\n sheu.error(`Build failed: ${err?.message}`);\n console.error(err);\n process.exit(1);\n }\n}\n\n/**\n * Validates and normalizes module type option\n */\nfunction validateModuleType(moduleType?: string): ModuleType {\n if (!moduleType) return \"cjs\";\n\n const normalizedType = moduleType.toLowerCase();\n\n if (normalizedType === \"cjs\" || normalizedType === \"commonjs\") return \"cjs\";\n else if ([\"esm\", \"es\", \"es2020\", \"esnext\", \"module\"].includes(normalizedType))\n return \"esm\";\n\n sheu.warn(`Unrecognized module type \"${moduleType}\", defaulting to \"cjs\"`);\n return \"cjs\";\n}\n\n/**\n * Ensure the build directory exists\n */\nfunction ensureBuildDir() {\n if (!fs.existsSync(BUILD_DIR)) fs.mkdirSync(BUILD_DIR, { recursive: true });\n\n for (const moduleType of MODULE_TYPES) {\n const moduleDir = path.join(BUILD_DIR, moduleType);\n if (!fs.existsSync(moduleDir)) {\n fs.mkdirSync(moduleDir, { recursive: true });\n }\n }\n}\n\n/**\n * Build a TypeScript project\n */\nfunction buildTypeScriptProject(options: BuildOptions, moduleType: ModuleType) {\n const tsconfigPath = path.join(\n process.cwd(),\n options.config || \"tsconfig.json\"\n );\n let tsconfig: any = {};\n try {\n if (fs.existsSync(tsconfigPath)) {\n tsconfig = bundler.readJsonWithComments(tsconfigPath);\n }\n } catch (error) {\n console.error(\"❌ Error reading tsconfig.json:\", error);\n }\n\n const tempTsconfig = {\n ...tsconfig,\n compilerOptions: {\n ...(tsconfig.compilerOptions || {}),\n rootDir: \".\",\n outDir: path.join(`./${BUILD_DIR}`),\n },\n };\n\n const tempTsconfigPath = path.join(\n process.cwd(),\n `tsconfig.arkos-build.json`\n );\n fs.writeFileSync(tempTsconfigPath, JSON.stringify(tempTsconfig, null, 2));\n\n try {\n removeDir(BUILD_DIR);\n execFileSync(\"tsc\", [\"-p\", tempTsconfigPath], {\n stdio: \"inherit\",\n cwd: process.cwd(),\n });\n\n copyAllNonSourceFiles(moduleType, [\".ts\", \".tsx\"]);\n bundler.bundle({\n ext: \".js\",\n outDir: path.join(process.cwd(), BUILD_DIR),\n rootDir: process.cwd(),\n configPath: tempTsconfigPath,\n });\n\n cleanupTempConfig(tempTsconfigPath);\n } catch (error) {\n cleanupTempConfig(tempTsconfigPath);\n throw error;\n }\n}\n\n/**\n * Build a JavaScript project\n */\nfunction buildJavaScriptProject(_: BuildOptions, moduleType: ModuleType) {\n const targetDir = path.join(BUILD_DIR);\n\n try {\n if (moduleType === \"esm\") {\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n\n console.info(\"Note: .cjs files are skipped in ESM build\");\n } else {\n execSync(\n `npx copyfiles -u 0 \"src/**/*.js\" \"src/**/*.jsx\" \"src/**/*.cjs\" \"src/**/*.mjs\" ${targetDir}`,\n {\n stdio: \"inherit\",\n cwd: process.cwd(),\n }\n );\n }\n\n copyAllNonSourceFiles(moduleType, [\n \".js\",\n \".jsx\",\n \".mjs\",\n \".cjs\",\n \".ts\",\n \".tsx\",\n ]);\n\n bundler.bundle({\n ext: \".js\",\n outDir: path.join(process.cwd(), BUILD_DIR),\n rootDir: process.cwd(),\n });\n // createModulePackageJson(moduleType);\n } catch (error: any) {\n console.info(error.stack);\n console.error(\"❌ Error building JavaScript project:\", error.stack);\n throw error;\n }\n}\n\n/**\n * Copy all non-source code files to the build directory\n * This function will copy everything except the specified source file extensions\n */\nfunction copyAllNonSourceFiles(_: ModuleType, skipExtensions: string[]) {\n const targetDir = path.join(BUILD_DIR);\n const sourceDir = \"src\";\n\n try {\n // Recursive function to copy files\n function copyDirRecursive(dir: string) {\n if (!fs.existsSync(dir)) return;\n\n const items = fs.readdirSync(dir);\n\n for (const item of items) {\n const sourcePath = path.join(dir, item);\n const targetPath = path.join(\n targetDir,\n dir.replace(sourceDir, \"\"),\n item\n );\n\n // Get file stats\n const stats = fs.statSync(sourcePath);\n\n if (stats.isDirectory()) {\n // Ensure target directory exists\n if (!fs.existsSync(targetPath)) {\n fs.mkdirSync(targetPath, { recursive: true });\n }\n // Recurse into subdirectory\n copyDirRecursive(sourcePath);\n } else if (stats.isFile()) {\n // Check if this is a file we should skip\n const ext = path.extname(item).toLowerCase();\n if (!skipExtensions.includes(ext)) {\n // Ensure the target directory exists\n const targetDir = path.dirname(targetPath);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n // Copy the file\n fs.copyFileSync(sourcePath, targetPath);\n }\n }\n }\n }\n\n // Start copying from src directory\n copyDirRecursive(sourceDir);\n\n // Copy project root files if needed\n const rootFilesToCopy = [\"arkos.config.js\"];\n\n for (const file of rootFilesToCopy) {\n if (fs.existsSync(path.join(process.cwd(), file))) {\n fs.copyFileSync(\n path.join(process.cwd(), file),\n path.join(targetDir, file)\n );\n }\n }\n\n // console.info(`Copied all non-source files to ${targetDir}`);\n } catch (error) {\n console.warn(\"Warning: Error copying project files:\", error);\n console.error(error);\n }\n}\n\n/**\n * Clean up temporary tsconfig\n */\nfunction cleanupTempConfig(configPath: string) {\n try {\n if (fs.existsSync(configPath)) fs.unlinkSync(configPath);\n } catch (error) {\n console.warn(\"Warning: Error cleaning up temporary config:\", error);\n }\n}\n"]}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { spawn, execSync } from "child_process";
|
|
2
|
-
import { getUserFileExtension } from "../helpers/fs.helpers.js";
|
|
2
|
+
import { fullCleanCwd, getUserFileExtension } from "../helpers/fs.helpers.js";
|
|
3
3
|
import { loadEnvironmentVariables } from "../dotenv.helpers.js";
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import sheu from "../sheu.js";
|
|
7
7
|
import portAndHostAllocator from "../features/port-and-host-allocator.js";
|
|
8
8
|
import watermarkStamper from "./utils/watermark-stamper.js";
|
|
9
|
+
import { getArkosConfig } from "../helpers/arkos-config.helpers.js";
|
|
9
10
|
let child = null;
|
|
10
11
|
let envFiles;
|
|
11
12
|
export async function devCommand(options = {}) {
|
|
@@ -17,14 +18,18 @@ export async function devCommand(options = {}) {
|
|
|
17
18
|
let restartTimeout = null;
|
|
18
19
|
try {
|
|
19
20
|
const { port, host } = options;
|
|
20
|
-
const
|
|
21
|
-
const entryPoint = path.resolve(process.cwd(),
|
|
21
|
+
const config = getArkosConfig();
|
|
22
|
+
const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint);
|
|
22
23
|
if (!fs.existsSync(entryPoint)) {
|
|
23
|
-
console.error(`Could not find application entry point at ${entryPoint}`);
|
|
24
|
+
console.error(`Could not find application entry point at ${fullCleanCwd(entryPoint).replaceAll(/^\/+/g, "")}`);
|
|
24
25
|
return process.exit(1);
|
|
25
26
|
}
|
|
27
|
+
const fileExt = getUserFileExtension();
|
|
28
|
+
const entryPointRelative = path.relative(process.cwd(), entryPoint);
|
|
26
29
|
const baseServiceTypesPath = path.resolve(process.cwd(), `node_modules/@arkosjs/generated/cjs/index.js`);
|
|
27
|
-
if (fileExt === "ts" &&
|
|
30
|
+
if (fileExt === "ts" &&
|
|
31
|
+
!fs.existsSync(baseServiceTypesPath) &&
|
|
32
|
+
fs.existsSync(path.resolve(path.join(process.cwd(), "prisma")))) {
|
|
28
33
|
const answer = await new Promise((resolve) => {
|
|
29
34
|
sheu.warn('Missing base services types please run "npx arkos prisma generate" to generate and sync the types from @prisma/client');
|
|
30
35
|
process.stdout.write(`\n${sheu.green("?", { bold: true })} Would you like to run "npx arkos prisma generate"? (Y/n): `);
|
|
@@ -64,7 +69,7 @@ export async function devCommand(options = {}) {
|
|
|
64
69
|
}
|
|
65
70
|
const env = getEnv();
|
|
66
71
|
if (fileExt === "ts") {
|
|
67
|
-
child = spawn("npx", ["tsx-strict", "--watch",
|
|
72
|
+
child = spawn("npx", ["tsx-strict", "--watch", entryPointRelative], {
|
|
68
73
|
stdio: "inherit",
|
|
69
74
|
env,
|
|
70
75
|
shell: true,
|
|
@@ -72,7 +77,7 @@ export async function devCommand(options = {}) {
|
|
|
72
77
|
}
|
|
73
78
|
else {
|
|
74
79
|
env.TSX_TSCONFIG_PATH = "./jsconfig.json";
|
|
75
|
-
child = spawn("npx", ["tsx-strict", "--no-type-check", "--watch",
|
|
80
|
+
child = spawn("npx", ["tsx-strict", "--no-type-check", "--watch", entryPointRelative], {
|
|
76
81
|
stdio: "inherit",
|
|
77
82
|
env,
|
|
78
83
|
shell: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess, execSync } from \"child_process\";\nimport { fullCleanCwd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n process.env.NO_CLI = \"true\";\n\n if (!process.env.NODE_ENV) process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n\n const config = getArkosConfig();\n\n const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint!);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(\n `Could not find application entry point at ${fullCleanCwd(entryPoint).replaceAll(/^\\/+/g, \"\")}`\n );\n return process.exit(1);\n }\n\n const fileExt = getUserFileExtension();\n\n const entryPointRelative = path.relative(process.cwd(), entryPoint);\n\n const baseServiceTypesPath = path.resolve(\n process.cwd(),\n `node_modules/@arkosjs/generated/cjs/index.js`\n );\n if (\n fileExt === \"ts\" &&\n !fs.existsSync(baseServiceTypesPath) &&\n fs.existsSync(path.resolve(path.join(process.cwd(), \"prisma\")))\n ) {\n const answer = await new Promise<boolean>((resolve) => {\n sheu.warn(\n 'Missing base services types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client'\n );\n process.stdout.write(\n `\\n${sheu.green(\"?\", { bold: true })} Would you like to run \"npx arkos prisma generate\"? (Y/n): `\n );\n process.stdin.once(\"data\", (data) => {\n const result = data.toString().trim().toLowerCase();\n process.stdin.pause();\n resolve(result === \"y\" || result.length === 0);\n });\n });\n\n if (answer) {\n console.info(\"\\nSyncing base service with @prisma/client...\");\n console.log(\"\");\n execSync(`npx arkos prisma generate`);\n } else\n throw Error(\n 'Missing BaseService types please run \"npx arkos prisma generate\" to generate and sync the types from @prisma/client, see more at https://www.arkosjs.com/docs/tooling/cli/overviewarkos-cli#typescript-types-generation.'\n );\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n CLI: \"false\",\n }) as { [x: string]: string };\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n watermarkStamper.stamp({\n ...hostAndPort,\n envFiles,\n });\n\n process.env.__PORT = hostAndPort.port || \"\";\n process.env.__HOST = hostAndPort.host || \"\";\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPointRelative], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n env.TSX_TSCONFIG_PATH = \"./jsconfig.json\";\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPointRelative],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n }\n };\n\n startServer();\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n sheu.error(\"Development server failed to start:\");\n console.error(error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
2
|
import { loadEnvironmentVariables } from "../dotenv.helpers.js";
|
|
3
|
-
import { getUserFileExtension } from "../helpers/fs.helpers.js";
|
|
4
3
|
import path from "path";
|
|
5
4
|
import fs from "fs";
|
|
6
5
|
import watermarkStamper from "./utils/watermark-stamper.js";
|
|
6
|
+
import { getArkosConfig } from "../helpers/arkos-config.helpers.js";
|
|
7
7
|
export default async function exportAuthActionCommand(options) {
|
|
8
8
|
process.env.NO_CLI = "true";
|
|
9
9
|
process.env.CLI_COMMAND = "EXPORT_AUTH_ACTION";
|
|
@@ -13,12 +13,13 @@ export default async function exportAuthActionCommand(options) {
|
|
|
13
13
|
const envFiles = loadEnvironmentVariables() || [];
|
|
14
14
|
let child = null;
|
|
15
15
|
try {
|
|
16
|
-
const
|
|
17
|
-
const entryPoint = path.resolve(process.cwd(),
|
|
16
|
+
const config = getArkosConfig();
|
|
17
|
+
const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint);
|
|
18
18
|
if (!fs.existsSync(entryPoint)) {
|
|
19
19
|
console.error(`Could not find application entry point at ${entryPoint}`);
|
|
20
20
|
process.exit(1);
|
|
21
21
|
}
|
|
22
|
+
const entryPointRelative = path.relative(process.cwd(), entryPoint);
|
|
22
23
|
const getEnv = () => ({
|
|
23
24
|
NODE_ENV: "development",
|
|
24
25
|
...process.env,
|
|
@@ -30,7 +31,7 @@ export default async function exportAuthActionCommand(options) {
|
|
|
30
31
|
child = null;
|
|
31
32
|
}
|
|
32
33
|
const env = getEnv();
|
|
33
|
-
child = spawn("npx", ["tsx-strict", "--no-type-check",
|
|
34
|
+
child = spawn("npx", ["tsx-strict", "--no-type-check", entryPointRelative], {
|
|
34
35
|
stdio: "inherit",
|
|
35
36
|
env,
|
|
36
37
|
shell: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-auth-action.js","sourceRoot":"","sources":["../../../../src/utils/cli/export-auth-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,
|
|
1
|
+
{"version":3,"file":"export-auth-action.js","sourceRoot":"","sources":["../../../../src/utils/cli/export-auth-action.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChildProcess, spawn } from \"child_process\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\nimport { getArkosConfig } from \"../helpers/arkos-config.helpers\";\n\nexport default async function exportAuthActionCommand(options: {\n overwrite?: boolean;\n path?: string;\n}) {\n process.env.NO_CLI = \"true\";\n process.env.CLI_COMMAND = \"EXPORT_AUTH_ACTION\";\n process.env.CLI_COMMAND_OPTIONS = JSON.stringify(options);\n\n if (!process.env.NODE_ENV) process.env.NODE_ENV = \"development\";\n\n const envFiles = loadEnvironmentVariables() || [];\n let child: ChildProcess | null = null;\n\n try {\n const config = getArkosConfig();\n\n const entryPoint = path.resolve(process.cwd(), config.source?.entryPoint!);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n process.exit(1);\n }\n\n const entryPointRelative = path.relative(process.cwd(), entryPoint);\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n CLI: \"false\",\n }) as { [x: string]: string };\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", entryPointRelative],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n\n if (child)\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n };\n\n startServer();\n\n watermarkStamper.stamp({\n envFiles,\n });\n\n const cleanup = () => {\n if (child) {\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n console.error(\"Development server failed to start:\", error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n"]}
|
|
@@ -14,17 +14,18 @@ export const kebabPrismaModels = prismaSchemaParser
|
|
|
14
14
|
.map((val) => kebabCase(val));
|
|
15
15
|
export const knownModules = [...kebabPrismaModels, "file-upload", "auth"];
|
|
16
16
|
const generateFile = async (options, config) => {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
const rawName = options.module || options.model;
|
|
18
|
+
if (rawName?.includes(",")) {
|
|
19
|
+
const moduleNames = rawName
|
|
19
20
|
.split(",")
|
|
20
21
|
.map((m) => m.trim())
|
|
21
22
|
.filter(Boolean);
|
|
22
23
|
let totalFail = 0;
|
|
23
24
|
for (const moduleName of moduleNames) {
|
|
24
25
|
try {
|
|
25
|
-
await generateFile({ ...options,
|
|
26
|
+
await generateFile({ ...options, module: moduleName, model: undefined }, config);
|
|
26
27
|
}
|
|
27
|
-
catch
|
|
28
|
+
catch {
|
|
28
29
|
totalFail++;
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -32,12 +33,9 @@ const generateFile = async (options, config) => {
|
|
|
32
33
|
process.exit(1);
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
|
-
const modelName = options.module || options.model;
|
|
36
|
-
if (modelName?.includes(","))
|
|
37
|
-
throw ExitError("Multiple modules are not supported with -m/--module. Use -ms/--modules instead.\n" +
|
|
38
|
-
"Example: arkos g router -ms post,user,auth");
|
|
39
36
|
if (options.module && options.model)
|
|
40
37
|
throw ExitError("You must either pass --module or --model, prefer --module to align with future updates.");
|
|
38
|
+
const modelName = rawName;
|
|
41
39
|
if (!modelName?.trim())
|
|
42
40
|
throw new Error("Module name is required!");
|
|
43
41
|
const isAllowedModule = config.allowedModules === "*" ||
|