@kvishal04/library-core 1.0.0
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 +458 -0
- package/dist/appConfig.d.ts +16 -0
- package/dist/appConfig.d.ts.map +1 -0
- package/dist/appConfig.js +37 -0
- package/dist/appConfig.js.map +1 -0
- package/dist/configmanager/index.d.ts +38 -0
- package/dist/configmanager/index.d.ts.map +1 -0
- package/dist/configmanager/index.js +52 -0
- package/dist/configmanager/index.js.map +1 -0
- package/dist/configmanager/src/events/config.events.d.ts +19 -0
- package/dist/configmanager/src/events/config.events.d.ts.map +1 -0
- package/dist/configmanager/src/events/config.events.js +22 -0
- package/dist/configmanager/src/events/config.events.js.map +1 -0
- package/dist/configmanager/src/models/config.cache.d.ts +16 -0
- package/dist/configmanager/src/models/config.cache.d.ts.map +1 -0
- package/dist/configmanager/src/models/config.cache.js +37 -0
- package/dist/configmanager/src/models/config.cache.js.map +1 -0
- package/dist/configmanager/src/models/config.meta.d.ts +13 -0
- package/dist/configmanager/src/models/config.meta.d.ts.map +1 -0
- package/dist/configmanager/src/models/config.meta.js +30 -0
- package/dist/configmanager/src/models/config.meta.js.map +1 -0
- package/dist/configmanager/src/models/config.registry.d.ts +29 -0
- package/dist/configmanager/src/models/config.registry.d.ts.map +1 -0
- package/dist/configmanager/src/models/config.registry.js +121 -0
- package/dist/configmanager/src/models/config.registry.js.map +1 -0
- package/dist/configmanager/src/routes.d.ts +4 -0
- package/dist/configmanager/src/routes.d.ts.map +1 -0
- package/dist/configmanager/src/routes.js +292 -0
- package/dist/configmanager/src/routes.js.map +1 -0
- package/dist/configmanager/src/service.d.ts +90 -0
- package/dist/configmanager/src/service.d.ts.map +1 -0
- package/dist/configmanager/src/service.js +163 -0
- package/dist/configmanager/src/service.js.map +1 -0
- package/dist/configmanager/src/types/api.types.d.ts +11 -0
- package/dist/configmanager/src/types/api.types.d.ts.map +1 -0
- package/dist/configmanager/src/types/api.types.js +4 -0
- package/dist/configmanager/src/types/api.types.js.map +1 -0
- package/dist/configmanager/src/types/config.meta.types.d.ts +12 -0
- package/dist/configmanager/src/types/config.meta.types.d.ts.map +1 -0
- package/dist/configmanager/src/types/config.meta.types.js +5 -0
- package/dist/configmanager/src/types/config.meta.types.js.map +1 -0
- package/dist/configmanager/src/types/config.types.d.ts +17 -0
- package/dist/configmanager/src/types/config.types.d.ts.map +1 -0
- package/dist/configmanager/src/types/config.types.js +5 -0
- package/dist/configmanager/src/types/config.types.js.map +1 -0
- package/dist/configmanager/src/utils/config.file.d.ts +72 -0
- package/dist/configmanager/src/utils/config.file.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.file.js +238 -0
- package/dist/configmanager/src/utils/config.file.js.map +1 -0
- package/dist/configmanager/src/utils/config.loader.d.ts +20 -0
- package/dist/configmanager/src/utils/config.loader.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.loader.js +116 -0
- package/dist/configmanager/src/utils/config.loader.js.map +1 -0
- package/dist/configmanager/src/utils/config.parser.d.ts +10 -0
- package/dist/configmanager/src/utils/config.parser.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.parser.js +52 -0
- package/dist/configmanager/src/utils/config.parser.js.map +1 -0
- package/dist/configmanager/src/utils/config.path.d.ts +18 -0
- package/dist/configmanager/src/utils/config.path.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.path.js +68 -0
- package/dist/configmanager/src/utils/config.path.js.map +1 -0
- package/dist/configmanager/src/utils/config.serializer.d.ts +15 -0
- package/dist/configmanager/src/utils/config.serializer.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.serializer.js +51 -0
- package/dist/configmanager/src/utils/config.serializer.js.map +1 -0
- package/dist/configmanager/src/utils/config.validator.d.ts +11 -0
- package/dist/configmanager/src/utils/config.validator.d.ts.map +1 -0
- package/dist/configmanager/src/utils/config.validator.js +20 -0
- package/dist/configmanager/src/utils/config.validator.js.map +1 -0
- package/dist/connectors.d.ts +4 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +29 -0
- package/dist/connectors.js.map +1 -0
- package/dist/constant.d.ts +43 -0
- package/dist/constant.d.ts.map +1 -0
- package/dist/constant.js +45 -0
- package/dist/constant.js.map +1 -0
- package/dist/crons/task-scheduler.cron.d.ts +2 -0
- package/dist/crons/task-scheduler.cron.d.ts.map +1 -0
- package/dist/crons/task-scheduler.cron.js +53 -0
- package/dist/crons/task-scheduler.cron.js.map +1 -0
- package/dist/db/index.d.ts +8 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +18 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/pool.d.ts +2 -0
- package/dist/db/pool.d.ts.map +1 -0
- package/dist/db/pool.js +8 -0
- package/dist/db/pool.js.map +1 -0
- package/dist/db/src/Controller.d.ts +22 -0
- package/dist/db/src/Controller.d.ts.map +1 -0
- package/dist/db/src/Controller.js +43 -0
- package/dist/db/src/Controller.js.map +1 -0
- package/dist/db/src/config/adaptor.base.d.ts +18 -0
- package/dist/db/src/config/adaptor.base.d.ts.map +1 -0
- package/dist/db/src/config/adaptor.base.js +64 -0
- package/dist/db/src/config/adaptor.base.js.map +1 -0
- package/dist/db/src/config/connection.db.d.ts +17 -0
- package/dist/db/src/config/connection.db.d.ts.map +1 -0
- package/dist/db/src/config/connection.db.js +25 -0
- package/dist/db/src/config/connection.db.js.map +1 -0
- package/dist/db/src/config/main.db.d.ts +7 -0
- package/dist/db/src/config/main.db.d.ts.map +1 -0
- package/dist/db/src/config/main.db.js +53 -0
- package/dist/db/src/config/main.db.js.map +1 -0
- package/dist/db/src/config/transaction.db.d.ts +11 -0
- package/dist/db/src/config/transaction.db.d.ts.map +1 -0
- package/dist/db/src/config/transaction.db.js +24 -0
- package/dist/db/src/config/transaction.db.js.map +1 -0
- package/dist/db/src/models/index.d.ts +4 -0
- package/dist/db/src/models/index.d.ts.map +1 -0
- package/dist/db/src/models/index.js +3 -0
- package/dist/db/src/models/index.js.map +1 -0
- package/dist/db/src/pool.d.ts +8 -0
- package/dist/db/src/pool.d.ts.map +1 -0
- package/dist/db/src/pool.js +34 -0
- package/dist/db/src/pool.js.map +1 -0
- package/dist/db/src/utils/binding.wrapper.d.ts +7 -0
- package/dist/db/src/utils/binding.wrapper.d.ts.map +1 -0
- package/dist/db/src/utils/binding.wrapper.js +28 -0
- package/dist/db/src/utils/binding.wrapper.js.map +1 -0
- package/dist/db/src/utils/logger.db.d.ts +11 -0
- package/dist/db/src/utils/logger.db.d.ts.map +1 -0
- package/dist/db/src/utils/logger.db.js +51 -0
- package/dist/db/src/utils/logger.db.js.map +1 -0
- package/dist/db/src/utils/result.wrapper.d.ts +9 -0
- package/dist/db/src/utils/result.wrapper.d.ts.map +1 -0
- package/dist/db/src/utils/result.wrapper.js +40 -0
- package/dist/db/src/utils/result.wrapper.js.map +1 -0
- package/dist/db.d.ts +10 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +20 -0
- package/dist/db.js.map +1 -0
- package/dist/defaults/application.config.d.ts +3 -0
- package/dist/defaults/application.config.d.ts.map +1 -0
- package/dist/defaults/application.config.js +35 -0
- package/dist/defaults/application.config.js.map +1 -0
- package/dist/encryption.d.ts +3 -0
- package/dist/encryption.d.ts.map +1 -0
- package/dist/encryption.js +30 -0
- package/dist/encryption.js.map +1 -0
- package/dist/excelUtil.d.ts +33 -0
- package/dist/excelUtil.d.ts.map +1 -0
- package/dist/excelUtil.js +197 -0
- package/dist/excelUtil.js.map +1 -0
- package/dist/geoLocation.d.ts +16 -0
- package/dist/geoLocation.d.ts.map +1 -0
- package/dist/geoLocation.js +38 -0
- package/dist/geoLocation.js.map +1 -0
- package/dist/imageResizer.d.ts +15 -0
- package/dist/imageResizer.d.ts.map +1 -0
- package/dist/imageResizer.js +47 -0
- package/dist/imageResizer.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/application.interfaces.d.ts +70 -0
- package/dist/interfaces/application.interfaces.d.ts.map +1 -0
- package/dist/interfaces/application.interfaces.js +3 -0
- package/dist/interfaces/application.interfaces.js.map +1 -0
- package/dist/middleware/application.middleware.d.ts +4 -0
- package/dist/middleware/application.middleware.d.ts.map +1 -0
- package/dist/middleware/application.middleware.js +14 -0
- package/dist/middleware/application.middleware.js.map +1 -0
- package/dist/middleware/auth.d.ts +19 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +191 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/core.middleware.d.ts +4 -0
- package/dist/middleware/core.middleware.d.ts.map +1 -0
- package/dist/middleware/core.middleware.js +8 -0
- package/dist/middleware/core.middleware.js.map +1 -0
- package/dist/middleware/error.d.ts +4 -0
- package/dist/middleware/error.d.ts.map +1 -0
- package/dist/middleware/error.js +9 -0
- package/dist/middleware/error.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +25 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/multipart.d.ts +6 -0
- package/dist/middleware/multipart.d.ts.map +1 -0
- package/dist/middleware/multipart.js +59 -0
- package/dist/middleware/multipart.js.map +1 -0
- package/dist/middleware/system.middleware.d.ts +4 -0
- package/dist/middleware/system.middleware.d.ts.map +1 -0
- package/dist/middleware/system.middleware.js +14 -0
- package/dist/middleware/system.middleware.js.map +1 -0
- package/dist/responseHandler.d.ts +46 -0
- package/dist/responseHandler.d.ts.map +1 -0
- package/dist/responseHandler.js +105 -0
- package/dist/responseHandler.js.map +1 -0
- package/dist/session.d.ts +59 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +262 -0
- package/dist/session.js.map +1 -0
- package/dist/spreadsheet/index.d.ts +15 -0
- package/dist/spreadsheet/index.d.ts.map +1 -0
- package/dist/spreadsheet/index.js +37 -0
- package/dist/spreadsheet/index.js.map +1 -0
- package/dist/spreadsheet/src/SpreadsheetRouter.d.ts +3 -0
- package/dist/spreadsheet/src/SpreadsheetRouter.d.ts.map +1 -0
- package/dist/spreadsheet/src/SpreadsheetRouter.js +262 -0
- package/dist/spreadsheet/src/SpreadsheetRouter.js.map +1 -0
- package/dist/spreadsheet/src/models/SpreadsheetTypes.d.ts +74 -0
- package/dist/spreadsheet/src/models/SpreadsheetTypes.d.ts.map +1 -0
- package/dist/spreadsheet/src/models/SpreadsheetTypes.js +3 -0
- package/dist/spreadsheet/src/models/SpreadsheetTypes.js.map +1 -0
- package/dist/spreadsheet/src/models/index.d.ts +2 -0
- package/dist/spreadsheet/src/models/index.d.ts.map +1 -0
- package/dist/spreadsheet/src/models/index.js +18 -0
- package/dist/spreadsheet/src/models/index.js.map +1 -0
- package/dist/spreadsheet/src/service/SpreadsheetService.d.ts +72 -0
- package/dist/spreadsheet/src/service/SpreadsheetService.d.ts.map +1 -0
- package/dist/spreadsheet/src/service/SpreadsheetService.js +232 -0
- package/dist/spreadsheet/src/service/SpreadsheetService.js.map +1 -0
- package/dist/spreadsheet/src/utils/styleUtils.d.ts +31 -0
- package/dist/spreadsheet/src/utils/styleUtils.d.ts.map +1 -0
- package/dist/spreadsheet/src/utils/styleUtils.js +84 -0
- package/dist/spreadsheet/src/utils/styleUtils.js.map +1 -0
- package/dist/system/config-manager/config-loader.d.ts +57 -0
- package/dist/system/config-manager/config-loader.d.ts.map +1 -0
- package/dist/system/config-manager/config-loader.js +217 -0
- package/dist/system/config-manager/config-loader.js.map +1 -0
- package/dist/system/config-manager/handlers/file.d.ts +4 -0
- package/dist/system/config-manager/handlers/file.d.ts.map +1 -0
- package/dist/system/config-manager/handlers/file.js +70 -0
- package/dist/system/config-manager/handlers/file.js.map +1 -0
- package/dist/system/config-manager/handlers/reload-configs.d.ts +4 -0
- package/dist/system/config-manager/handlers/reload-configs.d.ts.map +1 -0
- package/dist/system/config-manager/handlers/reload-configs.js +63 -0
- package/dist/system/config-manager/handlers/reload-configs.js.map +1 -0
- package/dist/system/config-manager/handlers/rename.d.ts +3 -0
- package/dist/system/config-manager/handlers/rename.d.ts.map +1 -0
- package/dist/system/config-manager/handlers/rename.js +80 -0
- package/dist/system/config-manager/handlers/rename.js.map +1 -0
- package/dist/system/config-manager/handlers/status.d.ts +3 -0
- package/dist/system/config-manager/handlers/status.d.ts.map +1 -0
- package/dist/system/config-manager/handlers/status.js +55 -0
- package/dist/system/config-manager/handlers/status.js.map +1 -0
- package/dist/system/config-manager/handlers/tree.d.ts +4 -0
- package/dist/system/config-manager/handlers/tree.d.ts.map +1 -0
- package/dist/system/config-manager/handlers/tree.js +64 -0
- package/dist/system/config-manager/handlers/tree.js.map +1 -0
- package/dist/system/config-manager/helpers.d.ts +20 -0
- package/dist/system/config-manager/helpers.d.ts.map +1 -0
- package/dist/system/config-manager/helpers.js +123 -0
- package/dist/system/config-manager/helpers.js.map +1 -0
- package/dist/system/config-manager/index.d.ts +3 -0
- package/dist/system/config-manager/index.d.ts.map +1 -0
- package/dist/system/config-manager/index.js +22 -0
- package/dist/system/config-manager/index.js.map +1 -0
- package/dist/system.applications/configure-app-cors.d.ts +3 -0
- package/dist/system.applications/configure-app-cors.d.ts.map +1 -0
- package/dist/system.applications/configure-app-cors.js +35 -0
- package/dist/system.applications/configure-app-cors.js.map +1 -0
- package/dist/system.applications/controller.d.ts +48 -0
- package/dist/system.applications/controller.d.ts.map +1 -0
- package/dist/system.applications/controller.js +165 -0
- package/dist/system.applications/controller.js.map +1 -0
- package/dist/system.applications/requestContext.d.ts +41 -0
- package/dist/system.applications/requestContext.d.ts.map +1 -0
- package/dist/system.applications/requestContext.js +78 -0
- package/dist/system.applications/requestContext.js.map +1 -0
- package/dist/system.applications/response.helpers.d.ts +22 -0
- package/dist/system.applications/response.helpers.d.ts.map +1 -0
- package/dist/system.applications/response.helpers.js +53 -0
- package/dist/system.applications/response.helpers.js.map +1 -0
- package/dist/system.applications/response.types.d.ts +33 -0
- package/dist/system.applications/response.types.d.ts.map +1 -0
- package/dist/system.applications/response.types.js +3 -0
- package/dist/system.applications/response.types.js.map +1 -0
- package/dist/system.applications/sessions.d.ts +29 -0
- package/dist/system.applications/sessions.d.ts.map +1 -0
- package/dist/system.applications/sessions.js +129 -0
- package/dist/system.applications/sessions.js.map +1 -0
- package/dist/system.applications/util.d.ts +7 -0
- package/dist/system.applications/util.d.ts.map +1 -0
- package/dist/system.applications/util.js +35 -0
- package/dist/system.applications/util.js.map +1 -0
- package/dist/types/response.types.d.ts +19 -0
- package/dist/types/response.types.d.ts.map +1 -0
- package/dist/types/response.types.js +3 -0
- package/dist/types/response.types.js.map +1 -0
- package/dist/util.d.ts +13 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +69 -0
- package/dist/util.js.map +1 -0
- package/dist/validator/index.d.ts +3 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +9 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/src/errors/validation.d.ts +6 -0
- package/dist/validator/src/errors/validation.d.ts.map +1 -0
- package/dist/validator/src/errors/validation.js +14 -0
- package/dist/validator/src/errors/validation.js.map +1 -0
- package/dist/validator/src/main.d.ts +61 -0
- package/dist/validator/src/main.d.ts.map +1 -0
- package/dist/validator/src/main.js +65 -0
- package/dist/validator/src/main.js.map +1 -0
- package/dist/validator/src/rules/array.d.ts +2 -0
- package/dist/validator/src/rules/array.d.ts.map +1 -0
- package/dist/validator/src/rules/array.js +15 -0
- package/dist/validator/src/rules/array.js.map +1 -0
- package/dist/validator/src/rules/between.d.ts +6 -0
- package/dist/validator/src/rules/between.d.ts.map +1 -0
- package/dist/validator/src/rules/between.js +15 -0
- package/dist/validator/src/rules/between.js.map +1 -0
- package/dist/validator/src/rules/boolean.d.ts +2 -0
- package/dist/validator/src/rules/boolean.d.ts.map +1 -0
- package/dist/validator/src/rules/boolean.js +15 -0
- package/dist/validator/src/rules/boolean.js.map +1 -0
- package/dist/validator/src/rules/check.d.ts +7 -0
- package/dist/validator/src/rules/check.d.ts.map +1 -0
- package/dist/validator/src/rules/check.js +15 -0
- package/dist/validator/src/rules/check.js.map +1 -0
- package/dist/validator/src/rules/custom.d.ts +15 -0
- package/dist/validator/src/rules/custom.d.ts.map +1 -0
- package/dist/validator/src/rules/custom.js +47 -0
- package/dist/validator/src/rules/custom.js.map +1 -0
- package/dist/validator/src/rules/email.d.ts +2 -0
- package/dist/validator/src/rules/email.d.ts.map +1 -0
- package/dist/validator/src/rules/email.js +15 -0
- package/dist/validator/src/rules/email.js.map +1 -0
- package/dist/validator/src/rules/enum.d.ts +6 -0
- package/dist/validator/src/rules/enum.d.ts.map +1 -0
- package/dist/validator/src/rules/enum.js +15 -0
- package/dist/validator/src/rules/enum.js.map +1 -0
- package/dist/validator/src/rules/file.d.ts +2 -0
- package/dist/validator/src/rules/file.d.ts.map +1 -0
- package/dist/validator/src/rules/file.js +29 -0
- package/dist/validator/src/rules/file.js.map +1 -0
- package/dist/validator/src/rules/notEmpty.d.ts +2 -0
- package/dist/validator/src/rules/notEmpty.d.ts.map +1 -0
- package/dist/validator/src/rules/notEmpty.js +15 -0
- package/dist/validator/src/rules/notEmpty.js.map +1 -0
- package/dist/validator/src/rules/number.d.ts +2 -0
- package/dist/validator/src/rules/number.d.ts.map +1 -0
- package/dist/validator/src/rules/number.js +15 -0
- package/dist/validator/src/rules/number.js.map +1 -0
- package/dist/validator/src/rules/object.d.ts +2 -0
- package/dist/validator/src/rules/object.d.ts.map +1 -0
- package/dist/validator/src/rules/object.js +15 -0
- package/dist/validator/src/rules/object.js.map +1 -0
- package/dist/validator/src/rules/pattern.d.ts +6 -0
- package/dist/validator/src/rules/pattern.d.ts.map +1 -0
- package/dist/validator/src/rules/pattern.js +15 -0
- package/dist/validator/src/rules/pattern.js.map +1 -0
- package/dist/validator/src/rules/phone.d.ts +2 -0
- package/dist/validator/src/rules/phone.d.ts.map +1 -0
- package/dist/validator/src/rules/phone.js +15 -0
- package/dist/validator/src/rules/phone.js.map +1 -0
- package/dist/validator/src/rules/required.d.ts +2 -0
- package/dist/validator/src/rules/required.d.ts.map +1 -0
- package/dist/validator/src/rules/required.js +12 -0
- package/dist/validator/src/rules/required.js.map +1 -0
- package/dist/validator/src/rules/string.d.ts +2 -0
- package/dist/validator/src/rules/string.d.ts.map +1 -0
- package/dist/validator/src/rules/string.js +15 -0
- package/dist/validator/src/rules/string.js.map +1 -0
- package/dist/validator/src/rules/url.d.ts +2 -0
- package/dist/validator/src/rules/url.d.ts.map +1 -0
- package/dist/validator/src/rules/url.js +15 -0
- package/dist/validator/src/rules/url.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import ExcelJS from 'exceljs';
|
|
2
|
+
export interface ColumnDef {
|
|
3
|
+
/** Column key – must match a property on the data rows */
|
|
4
|
+
key: string;
|
|
5
|
+
/** Header label shown in row 1 */
|
|
6
|
+
header: string;
|
|
7
|
+
/** Column width in characters (default 20) */
|
|
8
|
+
width?: number;
|
|
9
|
+
/** Optional number format string, e.g. "#,##0.00" or "dd/mm/yyyy" */
|
|
10
|
+
numFmt?: string;
|
|
11
|
+
/** Horizontal alignment */
|
|
12
|
+
alignment?: ExcelJS.Alignment['horizontal'];
|
|
13
|
+
}
|
|
14
|
+
export interface SheetDef {
|
|
15
|
+
/** Sheet tab name (max 31 chars) */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Row data – each object's keys must align with ColumnDef.key values */
|
|
18
|
+
rows: Record<string, any>[];
|
|
19
|
+
/**
|
|
20
|
+
* Column definitions.
|
|
21
|
+
* When omitted, columns are derived automatically from the first data row.
|
|
22
|
+
*/
|
|
23
|
+
columns?: ColumnDef[];
|
|
24
|
+
}
|
|
25
|
+
export type HeaderStyle = 'default' | 'dark' | 'minimal' | 'none';
|
|
26
|
+
export interface ReadSheetResult {
|
|
27
|
+
/** Sheet name */
|
|
28
|
+
name: string;
|
|
29
|
+
/** Parsed rows as plain objects keyed by the header row values */
|
|
30
|
+
rows: Record<string, any>[];
|
|
31
|
+
/** Total number of data rows (excludes header) */
|
|
32
|
+
rowCount: number;
|
|
33
|
+
/** Column headers found in row 1 */
|
|
34
|
+
headers: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface ReadWorkbookResult {
|
|
37
|
+
/** Number of sheets in the workbook */
|
|
38
|
+
sheetCount: number;
|
|
39
|
+
sheets: ReadSheetResult[];
|
|
40
|
+
}
|
|
41
|
+
export interface WriteOptions {
|
|
42
|
+
/** Header row style preset (default: "default") */
|
|
43
|
+
headerStyle?: HeaderStyle;
|
|
44
|
+
/** Freeze the first row so it stays visible while scrolling */
|
|
45
|
+
freezeHeader?: boolean;
|
|
46
|
+
/** Enable auto-filter on all header columns */
|
|
47
|
+
autoFilter?: boolean;
|
|
48
|
+
/** Workbook creator metadata */
|
|
49
|
+
creator?: string;
|
|
50
|
+
}
|
|
51
|
+
export interface CreateWorkbookOptions extends WriteOptions {
|
|
52
|
+
sheets: SheetDef[];
|
|
53
|
+
}
|
|
54
|
+
export interface AppendRowsOptions {
|
|
55
|
+
/** Absolute path to an existing .xlsx file */
|
|
56
|
+
filePath: string;
|
|
57
|
+
/** Target sheet name */
|
|
58
|
+
sheetName: string;
|
|
59
|
+
/** Rows to append */
|
|
60
|
+
rows: Record<string, any>[];
|
|
61
|
+
}
|
|
62
|
+
export interface UpdateCellOptions {
|
|
63
|
+
/** Absolute path to an existing .xlsx file */
|
|
64
|
+
filePath: string;
|
|
65
|
+
/** Target sheet name */
|
|
66
|
+
sheetName: string;
|
|
67
|
+
/** 1-based row index */
|
|
68
|
+
row: number;
|
|
69
|
+
/** 1-based column index or column letter (e.g. "C") */
|
|
70
|
+
col: number | string;
|
|
71
|
+
/** New cell value */
|
|
72
|
+
value: ExcelJS.CellValue;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=SpreadsheetTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpreadsheetTypes.d.ts","sourceRoot":"","sources":["../../../../core/spreadsheet/src/models/SpreadsheetTypes.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,MAAM,WAAW,SAAS;IACxB,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;CAC7C;AAID,MAAM,WAAW,QAAQ;IACvB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB;AAID,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAIlE,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAID,MAAM,WAAW,YAAY;IAC3B,mDAAmD;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,qBAAqB;IACrB,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpreadsheetTypes.js","sourceRoot":"","sources":["../../../../core/spreadsheet/src/models/SpreadsheetTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../core/spreadsheet/src/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./SpreadsheetTypes"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../core/spreadsheet/src/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,qDAAmC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { SheetDef, ReadSheetResult, ReadWorkbookResult, CreateWorkbookOptions, AppendRowsOptions, UpdateCellOptions, WriteOptions } from '../models/SpreadsheetTypes';
|
|
2
|
+
export declare class SpreadsheetService {
|
|
3
|
+
private initWorkbook;
|
|
4
|
+
private populateSheet;
|
|
5
|
+
/**
|
|
6
|
+
* Create an in-memory workbook buffer from one or more sheet definitions.
|
|
7
|
+
* Use this when you want to stream the file or upload it without saving to disk.
|
|
8
|
+
*/
|
|
9
|
+
createBuffer(opts: CreateWorkbookOptions): Promise<Buffer>;
|
|
10
|
+
/**
|
|
11
|
+
* Create a workbook and save it to the given absolute file path.
|
|
12
|
+
* Parent directories are created automatically.
|
|
13
|
+
*/
|
|
14
|
+
createFile(filePath: string, opts: CreateWorkbookOptions): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Read all sheets from an .xlsx file on disk.
|
|
17
|
+
* Each sheet is returned as an array of plain objects keyed by header values.
|
|
18
|
+
*/
|
|
19
|
+
readFile(filePath: string): Promise<ReadWorkbookResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Read all sheets from an .xlsx buffer (e.g. a multer upload).
|
|
22
|
+
*/
|
|
23
|
+
readBuffer(buffer: Buffer): Promise<ReadWorkbookResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Read a single named sheet from a file.
|
|
26
|
+
* Throws if the sheet is not found.
|
|
27
|
+
*/
|
|
28
|
+
readSheet(filePath: string, sheetName: string): Promise<ReadSheetResult>;
|
|
29
|
+
private parseWorkbook;
|
|
30
|
+
/**
|
|
31
|
+
* Append rows to an existing sheet in an .xlsx file on disk.
|
|
32
|
+
* Adds rows after the last occupied row; does not touch headers.
|
|
33
|
+
*/
|
|
34
|
+
appendRows(opts: AppendRowsOptions): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Update the value of a single cell in an existing .xlsx file.
|
|
37
|
+
*
|
|
38
|
+
* @param opts.row 1-based row index
|
|
39
|
+
* @param opts.col 1-based column index or letter (e.g. "C")
|
|
40
|
+
*/
|
|
41
|
+
updateCell(opts: UpdateCellOptions): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Remove a sheet from an existing .xlsx file by name.
|
|
44
|
+
*/
|
|
45
|
+
deleteSheet(filePath: string, sheetName: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Rename a sheet in an existing .xlsx file.
|
|
48
|
+
*/
|
|
49
|
+
renameSheet(filePath: string, oldName: string, newName: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Add a new sheet to an existing .xlsx file.
|
|
52
|
+
*/
|
|
53
|
+
addSheet(filePath: string, sheet: SheetDef, writeOpts?: WriteOptions): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Write a workbook directly to an Express `res` stream.
|
|
56
|
+
* Sets the appropriate Content-Type and Content-Disposition headers.
|
|
57
|
+
*
|
|
58
|
+
* @param res Express Response object
|
|
59
|
+
* @param opts Workbook creation options
|
|
60
|
+
* @param fileName Download filename (default: "export.xlsx")
|
|
61
|
+
*/
|
|
62
|
+
streamToResponse(res: any, opts: CreateWorkbookOptions, fileName?: string): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Convert a column letter (e.g. "A", "AB") to a 1-based column number.
|
|
65
|
+
*/
|
|
66
|
+
private colLetterToNumber;
|
|
67
|
+
/**
|
|
68
|
+
* List the sheet names in an .xlsx file without loading all data.
|
|
69
|
+
*/
|
|
70
|
+
listSheets(filePath: string): Promise<string[]>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=SpreadsheetService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpreadsheetService.d.ts","sourceRoot":"","sources":["../../../../core/spreadsheet/src/service/SpreadsheetService.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAIpC,qBAAa,kBAAkB;IAI7B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,aAAa;IA2BrB;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhE;;;OAGG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E;;;OAGG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAM7D;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAM7D;;;OAGG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAO9E,OAAO,CAAC,aAAa;IA0CrB;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBxD;;;;;OAKG;IACG,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxD;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpF;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,QAAQ,EACf,SAAS,GAAE,YAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC;IAYhB;;;;;;;OAOG;IACG,gBAAgB,CACpB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,SAAgB,GACvB,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAKtD"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SpreadsheetService = void 0;
|
|
7
|
+
const exceljs_1 = __importDefault(require("exceljs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const styleUtils_1 = require("../utils/styleUtils");
|
|
11
|
+
// ─── SpreadsheetService ───────────────────────────────────────────────────────
|
|
12
|
+
class SpreadsheetService {
|
|
13
|
+
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
14
|
+
initWorkbook(creator = 'SpreadsheetService') {
|
|
15
|
+
const wb = new exceljs_1.default.Workbook();
|
|
16
|
+
wb.creator = creator;
|
|
17
|
+
wb.created = new Date();
|
|
18
|
+
wb.modified = new Date();
|
|
19
|
+
return wb;
|
|
20
|
+
}
|
|
21
|
+
populateSheet(worksheet, sheet, opts = {}) {
|
|
22
|
+
const { rows, columns: colDefs } = sheet;
|
|
23
|
+
worksheet.columns = (0, styleUtils_1.buildColumns)(colDefs, rows[0]);
|
|
24
|
+
rows.forEach((row) => worksheet.addRow(row).commit());
|
|
25
|
+
(0, styleUtils_1.applyHeaderStyle)(worksheet, opts.headerStyle ?? 'default');
|
|
26
|
+
if (colDefs?.length)
|
|
27
|
+
(0, styleUtils_1.applyColumnStyles)(worksheet, colDefs);
|
|
28
|
+
if (opts.freezeHeader) {
|
|
29
|
+
worksheet.views = [{ state: 'frozen', ySplit: 1, xSplit: 0, topLeftCell: 'A2', activeCell: 'A2' }];
|
|
30
|
+
}
|
|
31
|
+
if (opts.autoFilter && rows.length) {
|
|
32
|
+
const lastCol = worksheet.columnCount;
|
|
33
|
+
worksheet.autoFilter = { from: 'A1', to: { row: 1, column: lastCol } };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// ─── Create ─────────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* Create an in-memory workbook buffer from one or more sheet definitions.
|
|
39
|
+
* Use this when you want to stream the file or upload it without saving to disk.
|
|
40
|
+
*/
|
|
41
|
+
async createBuffer(opts) {
|
|
42
|
+
const wb = this.initWorkbook(opts.creator);
|
|
43
|
+
for (const sheet of opts.sheets) {
|
|
44
|
+
const ws = wb.addWorksheet((0, styleUtils_1.sanitiseSheetName)(sheet.name));
|
|
45
|
+
this.populateSheet(ws, sheet, opts);
|
|
46
|
+
}
|
|
47
|
+
return wb.xlsx.writeBuffer().then((buf) => Buffer.from(buf));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a workbook and save it to the given absolute file path.
|
|
51
|
+
* Parent directories are created automatically.
|
|
52
|
+
*/
|
|
53
|
+
async createFile(filePath, opts) {
|
|
54
|
+
const wb = this.initWorkbook(opts.creator);
|
|
55
|
+
for (const sheet of opts.sheets) {
|
|
56
|
+
const ws = wb.addWorksheet((0, styleUtils_1.sanitiseSheetName)(sheet.name));
|
|
57
|
+
this.populateSheet(ws, sheet, opts);
|
|
58
|
+
}
|
|
59
|
+
await promises_1.default.mkdir(path_1.default.dirname(filePath), { recursive: true });
|
|
60
|
+
await wb.xlsx.writeFile(filePath);
|
|
61
|
+
}
|
|
62
|
+
// ─── Read ────────────────────────────────────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Read all sheets from an .xlsx file on disk.
|
|
65
|
+
* Each sheet is returned as an array of plain objects keyed by header values.
|
|
66
|
+
*/
|
|
67
|
+
async readFile(filePath) {
|
|
68
|
+
const wb = new exceljs_1.default.Workbook();
|
|
69
|
+
await wb.xlsx.readFile(filePath);
|
|
70
|
+
return this.parseWorkbook(wb);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Read all sheets from an .xlsx buffer (e.g. a multer upload).
|
|
74
|
+
*/
|
|
75
|
+
async readBuffer(buffer) {
|
|
76
|
+
const wb = new exceljs_1.default.Workbook();
|
|
77
|
+
await wb.xlsx.load(buffer);
|
|
78
|
+
return this.parseWorkbook(wb);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Read a single named sheet from a file.
|
|
82
|
+
* Throws if the sheet is not found.
|
|
83
|
+
*/
|
|
84
|
+
async readSheet(filePath, sheetName) {
|
|
85
|
+
const result = await this.readFile(filePath);
|
|
86
|
+
const sheet = result.sheets.find((s) => s.name === sheetName);
|
|
87
|
+
if (!sheet)
|
|
88
|
+
throw new Error(`Sheet "${sheetName}" not found in workbook`);
|
|
89
|
+
return sheet;
|
|
90
|
+
}
|
|
91
|
+
parseWorkbook(wb) {
|
|
92
|
+
const sheets = [];
|
|
93
|
+
wb.eachSheet((worksheet) => {
|
|
94
|
+
const allRows = [];
|
|
95
|
+
worksheet.eachRow((row) => allRows.push(row));
|
|
96
|
+
if (!allRows.length) {
|
|
97
|
+
sheets.push({ name: worksheet.name, rows: [], rowCount: 0, headers: [] });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Row 1 = headers
|
|
101
|
+
const headers = allRows[0].values
|
|
102
|
+
.slice(1) // exceljs row.values is 1-based (index 0 = undefined)
|
|
103
|
+
.map((v) => (v == null ? '' : String(v)));
|
|
104
|
+
const rows = [];
|
|
105
|
+
for (let i = 1; i < allRows.length; i++) {
|
|
106
|
+
const raw = allRows[i].values;
|
|
107
|
+
const record = {};
|
|
108
|
+
headers.forEach((header, idx) => {
|
|
109
|
+
const cell = raw[idx + 1];
|
|
110
|
+
// Unwrap rich-text objects
|
|
111
|
+
record[header] = cell?.richText
|
|
112
|
+
? cell.richText.map((r) => r.text).join('')
|
|
113
|
+
: cell ?? null;
|
|
114
|
+
});
|
|
115
|
+
rows.push(record);
|
|
116
|
+
}
|
|
117
|
+
sheets.push({ name: worksheet.name, rows, rowCount: rows.length, headers });
|
|
118
|
+
});
|
|
119
|
+
return { sheetCount: sheets.length, sheets };
|
|
120
|
+
}
|
|
121
|
+
// ─── Append ──────────────────────────────────────────────────────────────────
|
|
122
|
+
/**
|
|
123
|
+
* Append rows to an existing sheet in an .xlsx file on disk.
|
|
124
|
+
* Adds rows after the last occupied row; does not touch headers.
|
|
125
|
+
*/
|
|
126
|
+
async appendRows(opts) {
|
|
127
|
+
const { filePath, sheetName, rows } = opts;
|
|
128
|
+
if (!rows.length)
|
|
129
|
+
return;
|
|
130
|
+
const wb = new exceljs_1.default.Workbook();
|
|
131
|
+
await wb.xlsx.readFile(filePath);
|
|
132
|
+
const ws = wb.getWorksheet(sheetName);
|
|
133
|
+
if (!ws)
|
|
134
|
+
throw new Error(`Sheet "${sheetName}" not found in "${path_1.default.basename(filePath)}"`);
|
|
135
|
+
rows.forEach((row) => ws.addRow(row).commit());
|
|
136
|
+
await wb.xlsx.writeFile(filePath);
|
|
137
|
+
}
|
|
138
|
+
// ─── Update cell ─────────────────────────────────────────────────────────────
|
|
139
|
+
/**
|
|
140
|
+
* Update the value of a single cell in an existing .xlsx file.
|
|
141
|
+
*
|
|
142
|
+
* @param opts.row 1-based row index
|
|
143
|
+
* @param opts.col 1-based column index or letter (e.g. "C")
|
|
144
|
+
*/
|
|
145
|
+
async updateCell(opts) {
|
|
146
|
+
const { filePath, sheetName, row, col, value } = opts;
|
|
147
|
+
const wb = new exceljs_1.default.Workbook();
|
|
148
|
+
await wb.xlsx.readFile(filePath);
|
|
149
|
+
const ws = wb.getWorksheet(sheetName);
|
|
150
|
+
if (!ws)
|
|
151
|
+
throw new Error(`Sheet "${sheetName}" not found in "${path_1.default.basename(filePath)}"`);
|
|
152
|
+
ws.getCell(row, typeof col === 'string' ? this.colLetterToNumber(col) : col).value = value;
|
|
153
|
+
await wb.xlsx.writeFile(filePath);
|
|
154
|
+
}
|
|
155
|
+
// ─── Delete sheet ─────────────────────────────────────────────────────────────
|
|
156
|
+
/**
|
|
157
|
+
* Remove a sheet from an existing .xlsx file by name.
|
|
158
|
+
*/
|
|
159
|
+
async deleteSheet(filePath, sheetName) {
|
|
160
|
+
const wb = new exceljs_1.default.Workbook();
|
|
161
|
+
await wb.xlsx.readFile(filePath);
|
|
162
|
+
const ws = wb.getWorksheet(sheetName);
|
|
163
|
+
if (!ws)
|
|
164
|
+
throw new Error(`Sheet "${sheetName}" not found`);
|
|
165
|
+
wb.removeWorksheet(ws.id);
|
|
166
|
+
await wb.xlsx.writeFile(filePath);
|
|
167
|
+
}
|
|
168
|
+
// ─── Rename sheet ─────────────────────────────────────────────────────────────
|
|
169
|
+
/**
|
|
170
|
+
* Rename a sheet in an existing .xlsx file.
|
|
171
|
+
*/
|
|
172
|
+
async renameSheet(filePath, oldName, newName) {
|
|
173
|
+
const wb = new exceljs_1.default.Workbook();
|
|
174
|
+
await wb.xlsx.readFile(filePath);
|
|
175
|
+
const ws = wb.getWorksheet(oldName);
|
|
176
|
+
if (!ws)
|
|
177
|
+
throw new Error(`Sheet "${oldName}" not found`);
|
|
178
|
+
ws.name = (0, styleUtils_1.sanitiseSheetName)(newName);
|
|
179
|
+
await wb.xlsx.writeFile(filePath);
|
|
180
|
+
}
|
|
181
|
+
// ─── Add sheet ───────────────────────────────────────────────────────────────
|
|
182
|
+
/**
|
|
183
|
+
* Add a new sheet to an existing .xlsx file.
|
|
184
|
+
*/
|
|
185
|
+
async addSheet(filePath, sheet, writeOpts = {}) {
|
|
186
|
+
const wb = new exceljs_1.default.Workbook();
|
|
187
|
+
await wb.xlsx.readFile(filePath);
|
|
188
|
+
const ws = wb.addWorksheet((0, styleUtils_1.sanitiseSheetName)(sheet.name));
|
|
189
|
+
this.populateSheet(ws, sheet, writeOpts);
|
|
190
|
+
await wb.xlsx.writeFile(filePath);
|
|
191
|
+
}
|
|
192
|
+
// ─── Stream to response ───────────────────────────────────────────────────────
|
|
193
|
+
/**
|
|
194
|
+
* Write a workbook directly to an Express `res` stream.
|
|
195
|
+
* Sets the appropriate Content-Type and Content-Disposition headers.
|
|
196
|
+
*
|
|
197
|
+
* @param res Express Response object
|
|
198
|
+
* @param opts Workbook creation options
|
|
199
|
+
* @param fileName Download filename (default: "export.xlsx")
|
|
200
|
+
*/
|
|
201
|
+
async streamToResponse(res, opts, fileName = 'export.xlsx') {
|
|
202
|
+
const wb = this.initWorkbook(opts.creator);
|
|
203
|
+
for (const sheet of opts.sheets) {
|
|
204
|
+
const ws = wb.addWorksheet((0, styleUtils_1.sanitiseSheetName)(sheet.name));
|
|
205
|
+
this.populateSheet(ws, sheet, opts);
|
|
206
|
+
}
|
|
207
|
+
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
208
|
+
res.setHeader('Content-Disposition', `attachment; filename="${fileName}"`);
|
|
209
|
+
await wb.xlsx.write(res);
|
|
210
|
+
res.end();
|
|
211
|
+
}
|
|
212
|
+
// ─── Utility ──────────────────────────────────────────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Convert a column letter (e.g. "A", "AB") to a 1-based column number.
|
|
215
|
+
*/
|
|
216
|
+
colLetterToNumber(letter) {
|
|
217
|
+
return letter
|
|
218
|
+
.toUpperCase()
|
|
219
|
+
.split('')
|
|
220
|
+
.reduce((acc, ch) => acc * 26 + ch.charCodeAt(0) - 64, 0);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* List the sheet names in an .xlsx file without loading all data.
|
|
224
|
+
*/
|
|
225
|
+
async listSheets(filePath) {
|
|
226
|
+
const wb = new exceljs_1.default.Workbook();
|
|
227
|
+
await wb.xlsx.readFile(filePath);
|
|
228
|
+
return wb.worksheets.map((ws) => ws.name);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
exports.SpreadsheetService = SpreadsheetService;
|
|
232
|
+
//# sourceMappingURL=SpreadsheetService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpreadsheetService.js","sourceRoot":"","sources":["../../../../core/spreadsheet/src/service/SpreadsheetService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import ExcelJS from 'exceljs';
|
|
2
|
+
import type { ColumnDef, HeaderStyle } from '../models/SpreadsheetTypes';
|
|
3
|
+
/**
|
|
4
|
+
* Apply fill + font styling to a worksheet's header row.
|
|
5
|
+
*
|
|
6
|
+
* @param worksheet Target worksheet
|
|
7
|
+
* @param style Preset name ('default' | 'dark' | 'minimal' | 'none')
|
|
8
|
+
*/
|
|
9
|
+
export declare function applyHeaderStyle(worksheet: ExcelJS.Worksheet, style?: HeaderStyle): void;
|
|
10
|
+
/**
|
|
11
|
+
* Build the ExcelJS column definitions for a worksheet.
|
|
12
|
+
* When `colDefs` is supplied, uses those; otherwise derives columns
|
|
13
|
+
* from the keys of the first data row.
|
|
14
|
+
*
|
|
15
|
+
* @param colDefs Explicit column definitions (optional)
|
|
16
|
+
* @param firstRow First data row used to infer columns when colDefs is absent
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildColumns(colDefs?: ColumnDef[], firstRow?: Record<string, any>): Partial<ExcelJS.Column>[];
|
|
19
|
+
/**
|
|
20
|
+
* Apply column-level number formatting and alignment after rows are written.
|
|
21
|
+
* Only applied when explicit ColumnDef definitions are provided.
|
|
22
|
+
*
|
|
23
|
+
* @param worksheet Target worksheet
|
|
24
|
+
* @param colDefs Column definitions carrying numFmt / alignment
|
|
25
|
+
*/
|
|
26
|
+
export declare function applyColumnStyles(worksheet: ExcelJS.Worksheet, colDefs: ColumnDef[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Sanitise a sheet name to be valid in Excel (max 31 chars, no special chars).
|
|
29
|
+
*/
|
|
30
|
+
export declare function sanitiseSheetName(name: string): string;
|
|
31
|
+
//# sourceMappingURL=styleUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleUtils.d.ts","sourceRoot":"","sources":["../../../../core/spreadsheet/src/utils/styleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAgBzE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,KAAK,GAAE,WAAuB,GAC7B,IAAI,CAUN;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,OAAO,CAAC,EAAE,SAAS,EAAE,EACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAmB3B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,OAAO,EAAE,SAAS,EAAE,GACnB,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyHeaderStyle = applyHeaderStyle;
|
|
4
|
+
exports.buildColumns = buildColumns;
|
|
5
|
+
exports.applyColumnStyles = applyColumnStyles;
|
|
6
|
+
exports.sanitiseSheetName = sanitiseSheetName;
|
|
7
|
+
// ─── Header fill presets ──────────────────────────────────────────────────────
|
|
8
|
+
const HEADER_FILLS = {
|
|
9
|
+
default: { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFE0E0E0' } },
|
|
10
|
+
dark: { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FF2F75B6' } },
|
|
11
|
+
minimal: { type: 'pattern', pattern: 'solid', fgColor: { argb: 'FFF2F2F2' } },
|
|
12
|
+
};
|
|
13
|
+
const HEADER_FONTS = {
|
|
14
|
+
default: { bold: true, color: { argb: 'FF000000' } },
|
|
15
|
+
dark: { bold: true, color: { argb: 'FFFFFFFF' } },
|
|
16
|
+
minimal: { bold: true, color: { argb: 'FF333333' } },
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Apply fill + font styling to a worksheet's header row.
|
|
20
|
+
*
|
|
21
|
+
* @param worksheet Target worksheet
|
|
22
|
+
* @param style Preset name ('default' | 'dark' | 'minimal' | 'none')
|
|
23
|
+
*/
|
|
24
|
+
function applyHeaderStyle(worksheet, style = 'default') {
|
|
25
|
+
if (style === 'none')
|
|
26
|
+
return;
|
|
27
|
+
const headerRow = worksheet.getRow(1);
|
|
28
|
+
headerRow.font = HEADER_FONTS[style];
|
|
29
|
+
headerRow.fill = HEADER_FILLS[style];
|
|
30
|
+
headerRow.alignment = { vertical: 'middle', horizontal: 'left', wrapText: false };
|
|
31
|
+
headerRow.height = 20;
|
|
32
|
+
headerRow.commit();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Build the ExcelJS column definitions for a worksheet.
|
|
36
|
+
* When `colDefs` is supplied, uses those; otherwise derives columns
|
|
37
|
+
* from the keys of the first data row.
|
|
38
|
+
*
|
|
39
|
+
* @param colDefs Explicit column definitions (optional)
|
|
40
|
+
* @param firstRow First data row used to infer columns when colDefs is absent
|
|
41
|
+
*/
|
|
42
|
+
function buildColumns(colDefs, firstRow) {
|
|
43
|
+
if (colDefs?.length) {
|
|
44
|
+
return colDefs.map((c) => ({
|
|
45
|
+
key: c.key,
|
|
46
|
+
header: c.header,
|
|
47
|
+
width: c.width ?? 20,
|
|
48
|
+
...(c.numFmt && { style: { numFmt: c.numFmt } }),
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
if (firstRow) {
|
|
52
|
+
return Object.keys(firstRow).map((key) => ({
|
|
53
|
+
key,
|
|
54
|
+
header: key,
|
|
55
|
+
width: 20,
|
|
56
|
+
}));
|
|
57
|
+
}
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Apply column-level number formatting and alignment after rows are written.
|
|
62
|
+
* Only applied when explicit ColumnDef definitions are provided.
|
|
63
|
+
*
|
|
64
|
+
* @param worksheet Target worksheet
|
|
65
|
+
* @param colDefs Column definitions carrying numFmt / alignment
|
|
66
|
+
*/
|
|
67
|
+
function applyColumnStyles(worksheet, colDefs) {
|
|
68
|
+
colDefs.forEach((def, idx) => {
|
|
69
|
+
const col = worksheet.getColumn(idx + 1);
|
|
70
|
+
if (def.numFmt) {
|
|
71
|
+
col.numFmt = def.numFmt;
|
|
72
|
+
}
|
|
73
|
+
if (def.alignment) {
|
|
74
|
+
col.alignment = { horizontal: def.alignment };
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Sanitise a sheet name to be valid in Excel (max 31 chars, no special chars).
|
|
80
|
+
*/
|
|
81
|
+
function sanitiseSheetName(name) {
|
|
82
|
+
return name.replace(/[:\\/?*\[\]]/g, '').slice(0, 31) || 'Sheet';
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=styleUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleUtils.js","sourceRoot":"","sources":["../../../../core/spreadsheet/src/utils/styleUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Loader
|
|
3
|
+
*
|
|
4
|
+
* Scans all .config files under APP_CONFIG_ROOT recursively at startup,
|
|
5
|
+
* evaluates them (supports JS object expression format: `({...})`),
|
|
6
|
+
* and stores them in AppConfig as a key→value map where:
|
|
7
|
+
* key = relative path e.g. "myapp/all/vi.config"
|
|
8
|
+
* value = evaluated JS object from the file
|
|
9
|
+
*
|
|
10
|
+
* Usage anywhere in the app:
|
|
11
|
+
* import { getConfig, getAllConfigs, reloadConfigs } from '@server/core/config-loader';
|
|
12
|
+
* const viConfig = getConfig('myapp/all/vi.config');
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Loads (or reloads) all .config files from APP_CONFIG_ROOT into AppConfig.
|
|
16
|
+
* Called once at startup and again via the /reload-configs API.
|
|
17
|
+
* Returns the full map of { relativePath → configObject }.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadAllConfigs(): Record<string, any>;
|
|
20
|
+
/**
|
|
21
|
+
* Re-scans and re-evaluates all config files.
|
|
22
|
+
* Call this from the reload API after adding or editing a file.
|
|
23
|
+
*/
|
|
24
|
+
export declare function reloadConfigs(): Record<string, any>;
|
|
25
|
+
/**
|
|
26
|
+
* Reloads a single config file by its relative path into the in-memory map.
|
|
27
|
+
* Returns the updated config object, or null if the file doesn't exist.
|
|
28
|
+
*/
|
|
29
|
+
export declare function reloadConfig(relativePath: string): any;
|
|
30
|
+
/**
|
|
31
|
+
* Get a single config by its relative path.
|
|
32
|
+
* Returns null if not found — call reloadConfigs() first if you just added the file.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getConfig(relativePath: string): any;
|
|
35
|
+
/**
|
|
36
|
+
* Returns the full key→value map of all loaded configs.
|
|
37
|
+
* Functions inside configs (e.g. `load`) are present but will be stripped
|
|
38
|
+
* by JSON.stringify — use getConfig() and call them directly server-side.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getAllConfigs(): Record<string, any>;
|
|
41
|
+
/**
|
|
42
|
+
* Returns a JSON-safe summary of all loaded configs.
|
|
43
|
+
* Functions are replaced with the string "[Function]" so the output is serialisable.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getAllConfigsSafe(): Record<string, any>;
|
|
46
|
+
/**
|
|
47
|
+
* Renames a key inside the in-memory map: removes the old key and adds the
|
|
48
|
+
* evaluated content under the new key. The caller is responsible for the
|
|
49
|
+
* actual file rename on disk before calling this.
|
|
50
|
+
*/
|
|
51
|
+
export declare function renameConfigInMemory(oldRelativePath: string, newRelativePath: string): any;
|
|
52
|
+
/**
|
|
53
|
+
* Removes a single config from the in-memory map without touching the file.
|
|
54
|
+
* Call this when a config file is marked inactive.
|
|
55
|
+
*/
|
|
56
|
+
export declare function unloadConfig(relativePath: string): void;
|
|
57
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../core/system/config-manager/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAsCH;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAwCpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEnD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CA4BtD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQvD;AAeD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,GAAG,CAgB1F;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAQvD"}
|