@fdm-monster/server 1.9.4 → 2.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/.env.template +8 -7
- package/.yarn/install-state.gz +0 -0
- package/CONTRIBUTING.md +5 -5
- package/README.md +9 -8
- package/RELEASE_NOTES.MD +52 -0
- package/SECURITY.md +1 -1
- package/biome.json +8 -5
- package/dist/consoles/download-github-releases.js +3 -3
- package/dist/consoles/launch-http-servers.js +4 -4
- package/dist/consoles/launch-http-servers.js.map +1 -1
- package/dist/consoles/mock-bambu.server.js +50 -30
- package/dist/consoles/mock-bambu.server.js.map +1 -1
- package/dist/consoles/mock-camera/default-image.js +13 -0
- package/dist/consoles/mock-camera/default-image.js.map +1 -0
- package/dist/consoles/mock-camera/mock-camera.server.js +160 -0
- package/dist/consoles/mock-camera/mock-camera.server.js.map +1 -0
- package/dist/consoles/mock-octoprint.server.js +281 -73
- package/dist/consoles/mock-octoprint.server.js.map +1 -1
- package/dist/consoles/mock-prusalink.server.js +17 -17
- package/dist/consoles/mock-prusalink.server.js.map +1 -1
- package/dist/consoles/typeorm-create.js +135 -0
- package/dist/consoles/typeorm-create.js.map +1 -0
- package/dist/consoles/typeorm-generate.js +8 -8
- package/dist/consoles/typeorm-generate.js.map +1 -1
- package/dist/consoles/utils/api-messages.js.map +1 -1
- package/dist/constants/authorization.constants.js +25 -31
- package/dist/constants/authorization.constants.js.map +1 -1
- package/dist/constants/event.constants.js.map +1 -1
- package/dist/constants/server-settings.constants.js +3 -19
- package/dist/constants/server-settings.constants.js.map +1 -1
- package/dist/container.js +43 -59
- package/dist/container.js.map +1 -1
- package/dist/container.tokens.js +9 -6
- package/dist/container.tokens.js.map +1 -1
- package/dist/controllers/auth.controller.js +1 -1
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/controllers/batch-call.controller.js +7 -25
- package/dist/controllers/batch-call.controller.js.map +1 -1
- package/dist/controllers/file-storage.controller.js +248 -0
- package/dist/controllers/file-storage.controller.js.map +1 -0
- package/dist/controllers/first-time-setup.controller.js +6 -5
- package/dist/controllers/first-time-setup.controller.js.map +1 -1
- package/dist/controllers/floor.controller.js +12 -12
- package/dist/controllers/floor.controller.js.map +1 -1
- package/dist/controllers/metrics.controller.js.map +1 -1
- package/dist/controllers/print-job.controller.js +666 -0
- package/dist/controllers/print-job.controller.js.map +1 -0
- package/dist/controllers/print-queue.controller.js +375 -0
- package/dist/controllers/print-queue.controller.js.map +1 -0
- package/dist/controllers/printer-files.controller.js +88 -59
- package/dist/controllers/printer-files.controller.js.map +1 -1
- package/dist/controllers/printer-settings.controller.js +0 -21
- package/dist/controllers/printer-settings.controller.js.map +1 -1
- package/dist/controllers/{printer-group.controller.js → printer-tag.controller.js} +51 -34
- package/dist/controllers/printer-tag.controller.js.map +1 -0
- package/dist/controllers/printer.controller.js +21 -7
- package/dist/controllers/printer.controller.js.map +1 -1
- package/dist/controllers/server-private.controller.js +2 -1
- package/dist/controllers/server-private.controller.js.map +1 -1
- package/dist/controllers/server-public.controller.js +11 -15
- package/dist/controllers/server-public.controller.js.map +1 -1
- package/dist/controllers/settings.controller.js +0 -68
- package/dist/controllers/settings.controller.js.map +1 -1
- package/dist/controllers/slicer-compat.controller.js +216 -0
- package/dist/controllers/slicer-compat.controller.js.map +1 -0
- package/dist/controllers/user.controller.js +8 -12
- package/dist/controllers/user.controller.js.map +1 -1
- package/dist/controllers/validation/batch-controller.validation.js +13 -13
- package/dist/controllers/validation/batch-controller.validation.js.map +1 -1
- package/dist/controllers/validation/generic.validation.js +4 -8
- package/dist/controllers/validation/generic.validation.js.map +1 -1
- package/dist/controllers/validation/printer-files-controller.validation.js +2 -2
- package/dist/controllers/validation/user-controller.validation.js +14 -9
- package/dist/controllers/validation/user-controller.validation.js.map +1 -1
- package/dist/data-source.js +25 -12
- package/dist/data-source.js.map +1 -1
- package/dist/entities/camera-stream.entity.js +2 -1
- package/dist/entities/camera-stream.entity.js.map +1 -1
- package/dist/entities/floor.entity.js +3 -5
- package/dist/entities/floor.entity.js.map +1 -1
- package/dist/entities/index.js +15 -11
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/print-job.entity.js +195 -0
- package/dist/entities/print-job.entity.js.map +1 -0
- package/dist/entities/{printer-group.entity.js → printer-tag.entity.js} +17 -17
- package/dist/entities/printer-tag.entity.js.map +1 -0
- package/dist/entities/printer.entity.js +4 -10
- package/dist/entities/printer.entity.js.map +1 -1
- package/dist/entities/settings.entity.js +3 -12
- package/dist/entities/settings.entity.js.map +1 -1
- package/dist/entities/{group.entity.js → tag.entity.js} +15 -8
- package/dist/entities/tag.entity.js.map +1 -0
- package/dist/handlers/logging/file-logging.transport.js.map +1 -1
- package/dist/handlers/logging/static.logger.js.map +1 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/authenticate.js +4 -4
- package/dist/middleware/authenticate.js.map +1 -1
- package/dist/middleware/database.js +1 -1
- package/dist/middleware/exception.filter.js +114 -90
- package/dist/middleware/exception.filter.js.map +1 -1
- package/dist/middleware/global.middleware.js +10 -18
- package/dist/middleware/global.middleware.js.map +1 -1
- package/dist/middleware/param-converter.middleware.js +5 -13
- package/dist/middleware/param-converter.middleware.js.map +1 -1
- package/dist/middleware/passport.js +2 -2
- package/dist/middleware/passport.js.map +1 -1
- package/dist/middleware/printer-resolver.js.map +1 -1
- package/dist/middleware/printer.js +3 -2
- package/dist/middleware/printer.js.map +1 -1
- package/dist/middleware/socketio.middleware.js.map +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js +1 -1
- package/dist/migrations/1745141688926-AddPrinterUsernamePassword.js.map +1 -1
- package/dist/migrations/1766576698569-DropPermissions.js +28 -0
- package/dist/migrations/1766576698569-DropPermissions.js.map +1 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js +186 -0
- package/dist/migrations/1767278216516-ChangeCameraPrinterOnDeleteSetNull.js.map +1 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js +31 -0
- package/dist/migrations/1767279607392-DropCustomGcode.js.map +1 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js +37 -0
- package/dist/migrations/1767291804417-DropPrintCompletions.js.map +1 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js +88 -0
- package/dist/migrations/1767352862576-DropSettingsFileClean.js.map +1 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js +107 -0
- package/dist/migrations/1767355639023-ChangeFloorLevelToOrder.js.map +1 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js +62 -0
- package/dist/migrations/1767370191762-ChangeFloorNonUniqueOrder.js.map +1 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js +86 -0
- package/dist/migrations/1767432108916-RenameGroupToTag.js.map +1 -0
- package/dist/migrations/1767451444137-AddPrintJob.js +207 -0
- package/dist/migrations/1767451444137-AddPrintJob.js.map +1 -0
- package/dist/server.constants.js +9 -17
- package/dist/server.constants.js.map +1 -1
- package/dist/server.core.js +3 -7
- package/dist/server.core.js.map +1 -1
- package/dist/server.env.js +4 -49
- package/dist/server.env.js.map +1 -1
- package/dist/server.host.js +26 -44
- package/dist/server.host.js.map +1 -1
- package/dist/services/authentication/auth.service.js.map +1 -1
- package/dist/services/authentication/jwt.service.js.map +1 -1
- package/dist/services/bambu/bambu-ftp.adapter.js +3 -3
- package/dist/services/bambu/bambu-ftp.adapter.js.map +1 -1
- package/dist/services/bambu/bambu-mqtt.adapter.js +74 -77
- package/dist/services/bambu/bambu-mqtt.adapter.js.map +1 -1
- package/dist/services/bambu/bambu.client.js.map +1 -1
- package/dist/services/bambu.api.js +11 -0
- package/dist/services/bambu.api.js.map +1 -1
- package/dist/services/core/batch-call.service.js +0 -25
- package/dist/services/core/batch-call.service.js.map +1 -1
- package/dist/services/core/multer.service.js +5 -9
- package/dist/services/core/multer.service.js.map +1 -1
- package/dist/services/core/yaml.service.js +219 -187
- package/dist/services/core/yaml.service.js.map +1 -1
- package/dist/services/file-analysis.service.js +146 -0
- package/dist/services/file-analysis.service.js.map +1 -0
- package/dist/services/file-storage.service.js +386 -0
- package/dist/services/file-storage.service.js.map +1 -0
- package/dist/services/interfaces/camera-stream.dto.js +2 -2
- package/dist/services/interfaces/camera-stream.dto.js.map +1 -1
- package/dist/services/interfaces/floor.dto.js +3 -3
- package/dist/services/interfaces/floor.dto.js.map +1 -1
- package/dist/services/interfaces/{printer-group.dto.js → printer-tag.dto.js} +9 -8
- package/dist/services/interfaces/printer-tag.dto.js.map +1 -0
- package/dist/services/interfaces/{print-completion.interface.js → printer-tag.service.interface.js} +1 -1
- package/dist/services/interfaces/{printer-group.service.interface.js.map → printer-tag.service.interface.js.map} +1 -1
- package/dist/services/interfaces/printer.dto.js +2 -2
- package/dist/services/interfaces/printer.dto.js.map +1 -1
- package/dist/services/interfaces/refresh-token.dto.js.map +1 -1
- package/dist/services/interfaces/role.dto.js.map +1 -1
- package/dist/services/interfaces/settings.dto.js +0 -1
- package/dist/services/interfaces/settings.dto.js.map +1 -1
- package/dist/services/interfaces/{group.dto.js → tag.dto.js} +1 -1
- package/dist/services/interfaces/tag.dto.js.map +1 -0
- package/dist/services/interfaces/user.dto.js.map +1 -1
- package/dist/services/moonraker/constants/moonraker-event.dto.js.map +1 -1
- package/dist/services/moonraker/moonraker-websocket.adapter.js.map +1 -1
- package/dist/services/moonraker/moonraker.client.js.map +1 -1
- package/dist/services/moonraker.api.js +3 -0
- package/dist/services/moonraker.api.js.map +1 -1
- package/dist/services/octoprint/dto/files/gcode-analysis.dto.js.map +1 -0
- package/dist/services/octoprint/dto/octoprint-event.dto.js.map +1 -1
- package/dist/services/octoprint/octoprint-api.routes.js +0 -7
- package/dist/services/octoprint/octoprint-api.routes.js.map +1 -1
- package/dist/services/octoprint/octoprint-websocket.adapter.js.map +1 -1
- package/dist/services/octoprint/octoprint.client.js +0 -4
- package/dist/services/octoprint/octoprint.client.js.map +1 -1
- package/dist/services/octoprint.api.js +3 -0
- package/dist/services/octoprint.api.js.map +1 -1
- package/dist/services/orm/base.service.js.map +1 -1
- package/dist/services/orm/camera-stream.service.js.map +1 -1
- package/dist/services/orm/floor-position.service.js.map +1 -1
- package/dist/services/orm/floor.service.js +12 -19
- package/dist/services/orm/floor.service.js.map +1 -1
- package/dist/services/orm/permission.service.js +3 -54
- package/dist/services/orm/permission.service.js.map +1 -1
- package/dist/services/orm/print-job.service.js +539 -0
- package/dist/services/orm/print-job.service.js.map +1 -0
- package/dist/services/orm/printer-tag.service.js +120 -0
- package/dist/services/orm/printer-tag.service.js.map +1 -0
- package/dist/services/orm/printer.service.js.map +1 -1
- package/dist/services/orm/refresh-token.service.js.map +1 -1
- package/dist/services/orm/role.service.js +25 -39
- package/dist/services/orm/role.service.js.map +1 -1
- package/dist/services/orm/settings.service.js +4 -15
- package/dist/services/orm/settings.service.js.map +1 -1
- package/dist/services/orm/user.service.js +17 -13
- package/dist/services/orm/user.service.js.map +1 -1
- package/dist/services/print-file-downloader.service.js +169 -0
- package/dist/services/print-file-downloader.service.js.map +1 -0
- package/dist/services/print-queue.service.js +268 -0
- package/dist/services/print-queue.service.js.map +1 -0
- package/dist/services/printer-api.factory.js +1 -1
- package/dist/services/printer-api.factory.js.map +1 -1
- package/dist/services/printer-api.interface.js.map +1 -1
- package/dist/services/prusa-link/constants/prusalink-event.dto.js.map +1 -1
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js +1 -3
- package/dist/services/prusa-link/prusa-link-http-polling.adapter.js.map +1 -1
- package/dist/services/prusa-link/prusa-link.api.js +4 -1
- package/dist/services/prusa-link/prusa-link.api.js.map +1 -1
- package/dist/services/prusa-link/utils/prusa-link-http-client.builder.js.map +1 -1
- package/dist/services/validators/floor-service.validation.js +25 -31
- package/dist/services/validators/floor-service.validation.js.map +1 -1
- package/dist/services/validators/print-job.validation.js +31 -0
- package/dist/services/validators/print-job.validation.js.map +1 -0
- package/dist/services/validators/settings-service.validation.js +0 -22
- package/dist/services/validators/settings-service.validation.js.map +1 -1
- package/dist/services/validators/user-service.validation.js +15 -10
- package/dist/services/validators/user-service.validation.js.map +1 -1
- package/dist/services/validators/yaml-service.validation.js +8 -14
- package/dist/services/validators/yaml-service.validation.js.map +1 -1
- package/dist/shared/load-controllers.js +2 -1
- package/dist/shared/load-controllers.js.map +1 -1
- package/dist/shared/runtime-settings.migration.js +1 -11
- package/dist/shared/runtime-settings.migration.js.map +1 -1
- package/dist/shared/websocket-rpc-extended.adapter.js +13 -4
- package/dist/shared/websocket-rpc-extended.adapter.js.map +1 -1
- package/dist/shared/websocket.adapter.js.map +1 -1
- package/dist/state/file-upload-tracker.cache.js.map +1 -1
- package/dist/state/file.cache.js +6 -6
- package/dist/state/file.cache.js.map +1 -1
- package/dist/state/floor.store.js +3 -10
- package/dist/state/floor.store.js.map +1 -1
- package/dist/state/printer-events.cache.js +180 -20
- package/dist/state/printer-events.cache.js.map +1 -1
- package/dist/state/printer-files.store.js.map +1 -1
- package/dist/state/printer-socket.store.js +25 -20
- package/dist/state/printer-socket.store.js.map +1 -1
- package/dist/state/printer-thumbnail.cache.js +98 -188
- package/dist/state/printer-thumbnail.cache.js.map +1 -1
- package/dist/state/printer.cache.js +3 -13
- package/dist/state/printer.cache.js.map +1 -1
- package/dist/state/settings.store.js +4 -42
- package/dist/state/settings.store.js.map +1 -1
- package/dist/state/socket-io.gateway.js +1 -1
- package/dist/state/socket-io.gateway.js.map +1 -1
- package/dist/state/test-printer-socket.store.js +6 -3
- package/dist/state/test-printer-socket.store.js.map +1 -1
- package/dist/tasks/boot.task.js +11 -91
- package/dist/tasks/boot.task.js.map +1 -1
- package/dist/tasks/print-job-analysis.task.js +116 -0
- package/dist/tasks/print-job-analysis.task.js.map +1 -0
- package/dist/tasks/printer-files-load.task.js +29 -0
- package/dist/tasks/printer-files-load.task.js.map +1 -0
- package/dist/tasks/socketio.task.js +1 -1
- package/dist/tasks/socketio.task.js.map +1 -1
- package/dist/tasks.js +3 -2
- package/dist/tasks.js.map +1 -1
- package/dist/utils/cache/key-diff.cache.js +20 -61
- package/dist/utils/cache/key-diff.cache.js.map +1 -1
- package/dist/utils/parsers/3mf.parser.js +337 -0
- package/dist/utils/parsers/3mf.parser.js.map +1 -0
- package/dist/utils/parsers/bgcode.parser.js +223 -0
- package/dist/utils/parsers/bgcode.parser.js.map +1 -0
- package/dist/utils/parsers/gcode.parser.js +254 -0
- package/dist/utils/parsers/gcode.parser.js.map +1 -0
- package/dist/utils/swagger/decorators.js +39 -0
- package/dist/utils/swagger/decorators.js.map +1 -0
- package/dist/utils/swagger/generator.js +196 -0
- package/dist/utils/swagger/generator.js.map +1 -0
- package/dist/utils/swagger/swagger.js +93 -0
- package/dist/utils/swagger/swagger.js.map +1 -0
- package/package.json +24 -30
- package/dist/controllers/custom-gcode.controller.js +0 -150
- package/dist/controllers/custom-gcode.controller.js.map +0 -1
- package/dist/controllers/print-completion.controller.js +0 -118
- package/dist/controllers/print-completion.controller.js.map +0 -1
- package/dist/controllers/printer-group.controller.js.map +0 -1
- package/dist/entities/custom-gcode.entity.js +0 -49
- package/dist/entities/custom-gcode.entity.js.map +0 -1
- package/dist/entities/group.entity.js.map +0 -1
- package/dist/entities/permission.entity.js +0 -37
- package/dist/entities/permission.entity.js.map +0 -1
- package/dist/entities/print-completion.entity.js +0 -90
- package/dist/entities/print-completion.entity.js.map +0 -1
- package/dist/entities/printer-group.entity.js.map +0 -1
- package/dist/models/Auth/Permission.js +0 -20
- package/dist/models/Auth/Permission.js.map +0 -1
- package/dist/models/Auth/RefreshToken.js +0 -41
- package/dist/models/Auth/RefreshToken.js.map +0 -1
- package/dist/models/Auth/Role.js +0 -20
- package/dist/models/Auth/Role.js.map +0 -1
- package/dist/models/Auth/User.js +0 -49
- package/dist/models/Auth/User.js.map +0 -1
- package/dist/models/CameraStream.js +0 -49
- package/dist/models/CameraStream.js.map +0 -1
- package/dist/models/CustomGcode.js +0 -28
- package/dist/models/CustomGcode.js.map +0 -1
- package/dist/models/Floor.js +0 -33
- package/dist/models/Floor.js.map +0 -1
- package/dist/models/FloorPrinter.js +0 -38
- package/dist/models/FloorPrinter.js.map +0 -1
- package/dist/models/PrintCompletion.js +0 -40
- package/dist/models/PrintCompletion.js.map +0 -1
- package/dist/models/Printer.js +0 -78
- package/dist/models/Printer.js.map +0 -1
- package/dist/models/Settings.js +0 -150
- package/dist/models/Settings.js.map +0 -1
- package/dist/models/index.js +0 -54
- package/dist/models/index.js.map +0 -1
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js +0 -45
- package/dist/mongo-migrations/20210713120034-printers-settingsapperance-apikey.js.map +0 -1
- package/dist/mongo-migrations/20210907173950-printers-enabled.js +0 -35
- package/dist/mongo-migrations/20210907173950-printers-enabled.js.map +0 -1
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js +0 -35
- package/dist/mongo-migrations/20211029110742-user-password-passwordhash.js.map +0 -1
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js +0 -60
- package/dist/mongo-migrations/20230414141005-floor-remove-groupinfloor.js.map +0 -1
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js +0 -30
- package/dist/mongo-migrations/20230427202911-printer-remove-sortindex.js.map +0 -1
- package/dist/mongo-migrations/20230716065316-user-remove-name.js +0 -30
- package/dist/mongo-migrations/20230716065316-user-remove-name.js.map +0 -1
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js +0 -35
- package/dist/mongo-migrations/20231111081809-printer-flatten-name.js.map +0 -1
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js +0 -41
- package/dist/mongo-migrations/20231111082521-printer-remove-settingsappearance.js.map +0 -1
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js +0 -41
- package/dist/mongo-migrations/20231202183902-printer-files-simpler.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.dto.js +0 -18
- package/dist/services/interfaces/custom-gcode.dto.js.map +0 -1
- package/dist/services/interfaces/custom-gcode.service.interface.js +0 -6
- package/dist/services/interfaces/custom-gcode.service.interface.js.map +0 -1
- package/dist/services/interfaces/gcode-analysis.dto.js.map +0 -1
- package/dist/services/interfaces/group.dto.js.map +0 -1
- package/dist/services/interfaces/permission.dto.js +0 -16
- package/dist/services/interfaces/permission.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion-context.dto.js +0 -6
- package/dist/services/interfaces/print-completion-context.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.dto.js +0 -38
- package/dist/services/interfaces/print-completion.dto.js.map +0 -1
- package/dist/services/interfaces/print-completion.interface.js.map +0 -1
- package/dist/services/interfaces/printer-group.dto.js.map +0 -1
- package/dist/services/interfaces/printer-group.service.interface.js +0 -6
- package/dist/services/mongoose/camera-stream.service.js +0 -67
- package/dist/services/mongoose/camera-stream.service.js.map +0 -1
- package/dist/services/mongoose/custom-gcode.service.js +0 -50
- package/dist/services/mongoose/custom-gcode.service.js.map +0 -1
- package/dist/services/mongoose/floor.service.js +0 -139
- package/dist/services/mongoose/floor.service.js.map +0 -1
- package/dist/services/mongoose/permission.service.js +0 -73
- package/dist/services/mongoose/permission.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.service.js +0 -134
- package/dist/services/mongoose/print-completion.service.js.map +0 -1
- package/dist/services/mongoose/print-completion.shared.js +0 -59
- package/dist/services/mongoose/print-completion.shared.js.map +0 -1
- package/dist/services/mongoose/printer.service.js +0 -216
- package/dist/services/mongoose/printer.service.js.map +0 -1
- package/dist/services/mongoose/refresh-token.service.js +0 -104
- package/dist/services/mongoose/refresh-token.service.js.map +0 -1
- package/dist/services/mongoose/role.service.js +0 -132
- package/dist/services/mongoose/role.service.js.map +0 -1
- package/dist/services/mongoose/settings.service.js +0 -124
- package/dist/services/mongoose/settings.service.js.map +0 -1
- package/dist/services/mongoose/user.service.js +0 -180
- package/dist/services/mongoose/user.service.js.map +0 -1
- package/dist/services/orm/custom-gcode.service.js +0 -42
- package/dist/services/orm/custom-gcode.service.js.map +0 -1
- package/dist/services/orm/print-completion.service.js +0 -87
- package/dist/services/orm/print-completion.service.js.map +0 -1
- package/dist/services/orm/printer-group.service.js +0 -109
- package/dist/services/orm/printer-group.service.js.map +0 -1
- package/dist/services/validators/camera-service.validation.js +0 -19
- package/dist/services/validators/camera-service.validation.js.map +0 -1
- package/dist/services/validators/print-completion-service.validation.js +0 -33
- package/dist/services/validators/print-completion-service.validation.js.map +0 -1
- package/dist/shared.constants.js +0 -15
- package/dist/shared.constants.js.map +0 -1
- package/dist/tasks/print-completion.socketio.task.js +0 -91
- package/dist/tasks/print-completion.socketio.task.js.map +0 -1
- package/dist/tasks/printer-file-clean.task.js +0 -74
- package/dist/tasks/printer-file-clean.task.js.map +0 -1
- package/migrate-mongo-config.js +0 -45
- /package/dist/services/{interfaces → octoprint/dto/files}/gcode-analysis.dto.js +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GCodeParser", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return GCodeParser;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _promises = /*#__PURE__*/ _interop_require_wildcard(require("node:fs/promises"));
|
|
12
|
+
const _nodereadline = /*#__PURE__*/ _interop_require_wildcard(require("node:readline"));
|
|
13
|
+
const _nodefs = require("node:fs");
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
15
|
+
if (typeof WeakMap !== "function") return null;
|
|
16
|
+
var cacheBabelInterop = new WeakMap();
|
|
17
|
+
var cacheNodeInterop = new WeakMap();
|
|
18
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
19
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
20
|
+
})(nodeInterop);
|
|
21
|
+
}
|
|
22
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
23
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
24
|
+
return obj;
|
|
25
|
+
}
|
|
26
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
27
|
+
return {
|
|
28
|
+
default: obj
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
32
|
+
if (cache && cache.has(obj)) {
|
|
33
|
+
return cache.get(obj);
|
|
34
|
+
}
|
|
35
|
+
var newObj = {
|
|
36
|
+
__proto__: null
|
|
37
|
+
};
|
|
38
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
39
|
+
for(var key in obj){
|
|
40
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
41
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
42
|
+
if (desc && (desc.get || desc.set)) {
|
|
43
|
+
Object.defineProperty(newObj, key, desc);
|
|
44
|
+
} else {
|
|
45
|
+
newObj[key] = obj[key];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
newObj.default = obj;
|
|
50
|
+
if (cache) {
|
|
51
|
+
cache.set(obj, newObj);
|
|
52
|
+
}
|
|
53
|
+
return newObj;
|
|
54
|
+
}
|
|
55
|
+
class GCodeParser {
|
|
56
|
+
maxHeaderLinesToRead = 500;
|
|
57
|
+
maxFooterLinesToRead = 500;
|
|
58
|
+
async parse(filePath) {
|
|
59
|
+
const stats = await _promises.stat(filePath);
|
|
60
|
+
const fileName = filePath.split(/[/\\]/).pop() || filePath;
|
|
61
|
+
const metadata = await this.extractMetadata(filePath);
|
|
62
|
+
const thumbnails = await this.extractThumbnails(filePath);
|
|
63
|
+
const normalized = {
|
|
64
|
+
fileName,
|
|
65
|
+
fileFormat: "gcode",
|
|
66
|
+
fileSize: stats.size,
|
|
67
|
+
gcodePrintTimeSeconds: this.parseTime(metadata.estimated_printing_time_normal_mode || metadata.estimated_printing_time || metadata.print_time),
|
|
68
|
+
nozzleDiameterMm: this.parseFloat(metadata.nozzle_diameter),
|
|
69
|
+
filamentDiameterMm: this.parseFloat(metadata.filament_diameter),
|
|
70
|
+
filamentDensityGramsCm3: this.parseFloat(metadata.filament_density),
|
|
71
|
+
filamentUsedMm: this.parseFloat(metadata.filament_used_mm),
|
|
72
|
+
filamentUsedCm3: this.parseFloat(metadata.filament_used_cm3),
|
|
73
|
+
filamentUsedGrams: this.parseFloat(metadata.filament_used_g),
|
|
74
|
+
totalFilamentUsedGrams: this.parseFloat(metadata.total_filament_used_g || metadata.filament_used_g),
|
|
75
|
+
layerHeight: this.parseFloat(metadata.layer_height),
|
|
76
|
+
firstLayerHeight: this.parseFloat(metadata.first_layer_height || metadata.initial_layer_height),
|
|
77
|
+
bedTemperature: this.parseFloat(metadata.bed_temperature || metadata.first_layer_bed_temperature),
|
|
78
|
+
nozzleTemperature: this.parseFloat(metadata.temperature || metadata.first_layer_temperature),
|
|
79
|
+
fillDensity: metadata.fill_density || null,
|
|
80
|
+
filamentType: metadata.filament_type || null,
|
|
81
|
+
printerModel: metadata.printer_model || metadata.printer_name || null,
|
|
82
|
+
slicerVersion: metadata.generated_by || metadata.slicer_version || null,
|
|
83
|
+
maxLayerZ: this.parseFloat(metadata.max_layer_z),
|
|
84
|
+
totalLayers: this.parseInt(metadata.total_layers) || this.parseInt(metadata.layer_count),
|
|
85
|
+
generatedBy: metadata.generated_by,
|
|
86
|
+
thumbnails: thumbnails.length > 0 ? thumbnails.map((t)=>({
|
|
87
|
+
width: t.width,
|
|
88
|
+
height: t.height,
|
|
89
|
+
format: t.format,
|
|
90
|
+
dataLength: t.data?.length || 0
|
|
91
|
+
})) : undefined
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
raw: {
|
|
95
|
+
_thumbnails: thumbnails,
|
|
96
|
+
metadata
|
|
97
|
+
},
|
|
98
|
+
normalized
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async extractMetadata(filePath) {
|
|
102
|
+
const metadata = {};
|
|
103
|
+
await this.extractMetadataFromStart(filePath, metadata);
|
|
104
|
+
await this.extractMetadataFromEnd(filePath, metadata);
|
|
105
|
+
return metadata;
|
|
106
|
+
}
|
|
107
|
+
async extractMetadataFromStart(filePath, metadata) {
|
|
108
|
+
let linesRead = 0;
|
|
109
|
+
const fileStream = (0, _nodefs.createReadStream)(filePath);
|
|
110
|
+
const rl = _nodereadline.createInterface({
|
|
111
|
+
input: fileStream,
|
|
112
|
+
crlfDelay: Infinity
|
|
113
|
+
});
|
|
114
|
+
for await (const line of rl){
|
|
115
|
+
if (linesRead >= this.maxHeaderLinesToRead) break;
|
|
116
|
+
linesRead++;
|
|
117
|
+
this.parseMetadataLine(line, metadata);
|
|
118
|
+
}
|
|
119
|
+
rl.close();
|
|
120
|
+
fileStream.close();
|
|
121
|
+
}
|
|
122
|
+
async extractMetadataFromEnd(filePath, metadata) {
|
|
123
|
+
const stats = await _promises.stat(filePath);
|
|
124
|
+
const fileSize = stats.size;
|
|
125
|
+
const estimatedBytes = this.maxFooterLinesToRead * 50;
|
|
126
|
+
const startPosition = Math.max(0, fileSize - estimatedBytes);
|
|
127
|
+
const fileHandle = await _promises.open(filePath, 'r');
|
|
128
|
+
try {
|
|
129
|
+
const buffer = Buffer.alloc(estimatedBytes);
|
|
130
|
+
const { bytesRead } = await fileHandle.read(buffer, 0, estimatedBytes, startPosition);
|
|
131
|
+
const text = buffer.toString('utf8', 0, bytesRead);
|
|
132
|
+
const lines = text.split('\n');
|
|
133
|
+
for (const line of lines){
|
|
134
|
+
this.parseMetadataLine(line, metadata);
|
|
135
|
+
}
|
|
136
|
+
} finally{
|
|
137
|
+
await fileHandle.close();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
parseMetadataLine(line, metadata) {
|
|
141
|
+
if (!line.startsWith(";")) return;
|
|
142
|
+
const generatedByMatch = line.match(/^;\s*generated by\s+([^\s]+)/i);
|
|
143
|
+
if (generatedByMatch && !metadata.generated_by) {
|
|
144
|
+
metadata.generated_by = generatedByMatch[1];
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const prusaMatch = line.match(/^;\s*([^=]+?)\s*=\s*(.+)$/);
|
|
148
|
+
if (prusaMatch) {
|
|
149
|
+
let key = prusaMatch[1].trim().toLowerCase().replace(/\s+/g, "_");
|
|
150
|
+
let value = prusaMatch[2].trim();
|
|
151
|
+
key = key.replace(/\[([^\]]+)\]/g, (_, unit)=>'_' + unit.replace(/\^/g, ''));
|
|
152
|
+
key = key.replace(/\(([^)]+)\)/g, (_, content)=>'_' + content.replace(/\s+/g, '_'));
|
|
153
|
+
key = key.replace(/_+/g, '_');
|
|
154
|
+
if (!metadata[key]) {
|
|
155
|
+
metadata[key] = value.trim();
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const curaMatch = line.match(/^;([A-Z_]+):(.+)$/);
|
|
160
|
+
if (curaMatch) {
|
|
161
|
+
const [, key, value] = curaMatch;
|
|
162
|
+
const normalizedKey = key.toLowerCase();
|
|
163
|
+
if (!metadata[normalizedKey]) {
|
|
164
|
+
metadata[normalizedKey] = value.trim();
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const s3dMatch = line.match(/^;\s*([^:]+?):\s*(.+)$/);
|
|
169
|
+
if (s3dMatch) {
|
|
170
|
+
const [, key, value] = s3dMatch;
|
|
171
|
+
const normalizedKey = key.trim().toLowerCase().replace(/\s+/g, "_");
|
|
172
|
+
if (!metadata[normalizedKey]) {
|
|
173
|
+
metadata[normalizedKey] = value.trim();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async extractThumbnails(filePath) {
|
|
178
|
+
const thumbnails = [];
|
|
179
|
+
let linesRead = 0;
|
|
180
|
+
let inThumbnail = false;
|
|
181
|
+
let thumbnailData = [];
|
|
182
|
+
let currentWidth = 0;
|
|
183
|
+
let currentHeight = 0;
|
|
184
|
+
let currentFormat = "PNG";
|
|
185
|
+
const fileStream = (0, _nodefs.createReadStream)(filePath);
|
|
186
|
+
const rl = _nodereadline.createInterface({
|
|
187
|
+
input: fileStream,
|
|
188
|
+
crlfDelay: Infinity
|
|
189
|
+
});
|
|
190
|
+
for await (const line of rl){
|
|
191
|
+
if (linesRead >= this.maxHeaderLinesToRead && !inThumbnail) break;
|
|
192
|
+
linesRead++;
|
|
193
|
+
const thumbnailStart = line.match(/;\s*thumbnail begin (\d+)x(\d+)\s*(\w+)?/i);
|
|
194
|
+
if (thumbnailStart) {
|
|
195
|
+
inThumbnail = true;
|
|
196
|
+
currentWidth = parseInt(thumbnailStart[1]);
|
|
197
|
+
currentHeight = parseInt(thumbnailStart[2]);
|
|
198
|
+
const thirdParam = thumbnailStart[3];
|
|
199
|
+
if (thirdParam && /^(PNG|JPG|JPEG|QOI)$/i.test(thirdParam)) {
|
|
200
|
+
currentFormat = thirdParam.toUpperCase();
|
|
201
|
+
} else {
|
|
202
|
+
currentFormat = "PNG";
|
|
203
|
+
}
|
|
204
|
+
thumbnailData = [];
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (inThumbnail) {
|
|
208
|
+
if (line.match(/;\s*thumbnail end/i)) {
|
|
209
|
+
thumbnails.push({
|
|
210
|
+
width: currentWidth,
|
|
211
|
+
height: currentHeight,
|
|
212
|
+
format: currentFormat.toUpperCase(),
|
|
213
|
+
data: thumbnailData.join("")
|
|
214
|
+
});
|
|
215
|
+
inThumbnail = false;
|
|
216
|
+
thumbnailData = [];
|
|
217
|
+
} else if (line.startsWith(";")) {
|
|
218
|
+
const data = line.substring(1).trim();
|
|
219
|
+
if (data) {
|
|
220
|
+
thumbnailData.push(data);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
rl.close();
|
|
226
|
+
fileStream.close();
|
|
227
|
+
return thumbnails;
|
|
228
|
+
}
|
|
229
|
+
parseFloat(value) {
|
|
230
|
+
if (!value) return null;
|
|
231
|
+
const num = parseFloat(value);
|
|
232
|
+
return isNaN(num) ? null : num;
|
|
233
|
+
}
|
|
234
|
+
parseInt(value) {
|
|
235
|
+
if (!value) return null;
|
|
236
|
+
const num = parseInt(value, 10);
|
|
237
|
+
return isNaN(num) ? null : num;
|
|
238
|
+
}
|
|
239
|
+
parseTime(value) {
|
|
240
|
+
if (!value) return null;
|
|
241
|
+
const match = value.match(/(?:(\d+)h)?(?:\s*(\d+)m)?(?:\s*(\d+)s)?/);
|
|
242
|
+
if (match && (match[1] || match[2] || match[3])) {
|
|
243
|
+
const hours = parseInt(match[1] || "0");
|
|
244
|
+
const minutes = parseInt(match[2] || "0");
|
|
245
|
+
const secs = parseInt(match[3] || "0");
|
|
246
|
+
return hours * 3600 + minutes * 60 + secs;
|
|
247
|
+
}
|
|
248
|
+
const seconds = parseFloat(value);
|
|
249
|
+
if (!isNaN(seconds)) return seconds;
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=gcode.parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/parsers/gcode.parser.ts"],"names":["GCodeParser","maxHeaderLinesToRead","maxFooterLinesToRead","parse","filePath","stats","fs","stat","fileName","split","pop","metadata","extractMetadata","thumbnails","extractThumbnails","normalized","fileFormat","fileSize","size","gcodePrintTimeSeconds","parseTime","estimated_printing_time_normal_mode","estimated_printing_time","print_time","nozzleDiameterMm","parseFloat","nozzle_diameter","filamentDiameterMm","filament_diameter","filamentDensityGramsCm3","filament_density","filamentUsedMm","filament_used_mm","filamentUsedCm3","filament_used_cm3","filamentUsedGrams","filament_used_g","totalFilamentUsedGrams","total_filament_used_g","layerHeight","layer_height","firstLayerHeight","first_layer_height","initial_layer_height","bedTemperature","bed_temperature","first_layer_bed_temperature","nozzleTemperature","temperature","first_layer_temperature","fillDensity","fill_density","filamentType","filament_type","printerModel","printer_model","printer_name","slicerVersion","generated_by","slicer_version","maxLayerZ","max_layer_z","totalLayers","parseInt","total_layers","layer_count","generatedBy","length","map","t","width","height","format","dataLength","data","undefined","raw","_thumbnails","extractMetadataFromStart","extractMetadataFromEnd","linesRead","fileStream","createReadStream","rl","readline","createInterface","input","crlfDelay","Infinity","line","parseMetadataLine","close","estimatedBytes","startPosition","Math","max","fileHandle","open","buffer","Buffer","alloc","bytesRead","read","text","toString","lines","startsWith","generatedByMatch","match","prusaMatch","key","trim","toLowerCase","replace","value","_","unit","content","curaMatch","normalizedKey","s3dMatch","inThumbnail","thumbnailData","currentWidth","currentHeight","currentFormat","thumbnailStart","thirdParam","test","toUpperCase","push","join","substring","num","isNaN","hours","minutes","secs","seconds"],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get API_METADATA_KEY () {
|
|
13
|
+
return API_METADATA_KEY;
|
|
14
|
+
},
|
|
15
|
+
get ApiOperation () {
|
|
16
|
+
return ApiOperation;
|
|
17
|
+
},
|
|
18
|
+
get ApiProperty () {
|
|
19
|
+
return ApiProperty;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
require("reflect-metadata");
|
|
23
|
+
const API_METADATA_KEY = "Router Config";
|
|
24
|
+
function ApiProperty(options = {}) {
|
|
25
|
+
return function(target, propertyKey) {
|
|
26
|
+
const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
|
|
27
|
+
metadata[propertyKey] = options;
|
|
28
|
+
Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function ApiOperation(options = {}) {
|
|
32
|
+
return function(target, propertyKey, descriptor) {
|
|
33
|
+
const metadata = Reflect.getMetadata(API_METADATA_KEY, target.constructor) || {};
|
|
34
|
+
metadata[`${propertyKey}:operation`] = options;
|
|
35
|
+
Reflect.defineMetadata(API_METADATA_KEY, metadata, target.constructor);
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/swagger/decorators.ts"],"names":["API_METADATA_KEY","ApiOperation","ApiProperty","options","target","propertyKey","metadata","Reflect","getMetadata","defineMetadata","descriptor"],"mappings":";;;;;;;;;;;QAGaA;eAAAA;;QAwBGC;eAAAA;;QARAC;eAAAA;;;QAlBT;AAEA,MAAMF,mBAAmB;AAgBzB,SAASE,YAAYC,UAA8B,CAAC,CAAC;IAC1D,OAAO,SAAUC,MAAW,EAAEC,WAAmB;QAC/C,MAAMC,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAACD,YAAY,GAAGF;QACxBI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF;AAEO,SAASH,aAAaE,UAA+B,CAAC,CAAC;IAC5D,OAAO,SAAUC,MAAW,EAAEC,WAAmB,EAAEK,UAA8B;QAC/E,MAAMJ,WAAWC,QAAQC,WAAW,CAACR,kBAAkBI,OAAO,WAAW,KAAK,CAAC;QAC/EE,QAAQ,CAAC,GAAGD,YAAY,UAAU,CAAC,CAAC,GAAGF;QACvCI,QAAQE,cAAc,CAACT,kBAAkBM,UAAUF,OAAO,WAAW;IACvE;AACF"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "SwaggerGenerator", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return SwaggerGenerator;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _decorators = require("./decorators");
|
|
12
|
+
const _awilixexpress = require("awilix-express");
|
|
13
|
+
class SwaggerGenerator {
|
|
14
|
+
logger;
|
|
15
|
+
constructor(logger){
|
|
16
|
+
this.logger = logger;
|
|
17
|
+
}
|
|
18
|
+
openApiDoc = {
|
|
19
|
+
openapi: "3.1.0",
|
|
20
|
+
info: {
|
|
21
|
+
title: "FDM Monster API",
|
|
22
|
+
version: process.env.npm_package_version || "2.0.0",
|
|
23
|
+
description: "FDM Monster is a bulk OctoPrint, Klipper, PrusaLink and BambuLab manager to set up, configure and monitor 3D printers. Our aim is to provide neat overview over your farm.",
|
|
24
|
+
license: {
|
|
25
|
+
name: "AGPL-3.0-or-later",
|
|
26
|
+
url: "https://www.gnu.org/licenses/agpl-3.0.en.html"
|
|
27
|
+
},
|
|
28
|
+
contact: {
|
|
29
|
+
name: "FDM Monster GitHub",
|
|
30
|
+
url: "https://github.com/fdm-monster/fdm-monster"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
servers: [
|
|
34
|
+
{
|
|
35
|
+
url: "/api",
|
|
36
|
+
description: "API Server"
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
paths: {},
|
|
40
|
+
components: {
|
|
41
|
+
schemas: {},
|
|
42
|
+
securitySchemes: {
|
|
43
|
+
bearerAuth: {
|
|
44
|
+
type: "http",
|
|
45
|
+
scheme: "bearer",
|
|
46
|
+
bearerFormat: "JWT",
|
|
47
|
+
description: "Enter your JWT token"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
security: [
|
|
52
|
+
{
|
|
53
|
+
bearerAuth: []
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
};
|
|
57
|
+
async generate() {
|
|
58
|
+
try {
|
|
59
|
+
const routePath = "../../controllers";
|
|
60
|
+
const discoveredControllers = (0, _awilixexpress.findControllers)(`${routePath}/*.controller.js`, {
|
|
61
|
+
cwd: __dirname,
|
|
62
|
+
ignore: [
|
|
63
|
+
"**/*.map",
|
|
64
|
+
"**/*.d.ts"
|
|
65
|
+
],
|
|
66
|
+
absolute: true
|
|
67
|
+
});
|
|
68
|
+
for (const registration of discoveredControllers){
|
|
69
|
+
await this.processController(registration);
|
|
70
|
+
}
|
|
71
|
+
this.logger.log(`Generated OpenAPI spec with ${Object.keys(this.openApiDoc.paths || {}).length} paths`);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
this.logger.error("Failed to generate swagger specification", error);
|
|
74
|
+
}
|
|
75
|
+
return this.openApiDoc;
|
|
76
|
+
}
|
|
77
|
+
async processController(prototype) {
|
|
78
|
+
for (const [methodName, methodConfig] of prototype.state.methods){
|
|
79
|
+
if (methodConfig.paths.length > 0) {
|
|
80
|
+
await this.processMethod(prototype, prototype.state.root, methodName, methodConfig);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async processMethod(controller, root, methodName, methodConfig) {
|
|
85
|
+
if (!methodName) return;
|
|
86
|
+
const method = methodName.toString();
|
|
87
|
+
const name = method.toLowerCase();
|
|
88
|
+
for (let methodPath of methodConfig.paths){
|
|
89
|
+
methodPath = root.paths[0] + methodPath;
|
|
90
|
+
methodPath = methodPath.replaceAll(/:([a-zA-Z0-9_]+)/g, "{$1}");
|
|
91
|
+
const metadata = Reflect.getMetadata(_decorators.API_METADATA_KEY, controller.target);
|
|
92
|
+
for (const verb of methodConfig.verbs){
|
|
93
|
+
const key = `${name}:operation`;
|
|
94
|
+
const description = metadata?.hasOwnProperty(key) ? metadata[key] : null;
|
|
95
|
+
const httpMethod = verb.toLowerCase();
|
|
96
|
+
const operationObject = {
|
|
97
|
+
tags: [
|
|
98
|
+
controller.target.name
|
|
99
|
+
],
|
|
100
|
+
summary: description?.summary ?? method,
|
|
101
|
+
description: description?.description ?? "",
|
|
102
|
+
responses: description?.responses ?? {
|
|
103
|
+
"200": {
|
|
104
|
+
description: "Successful response"
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
operationObject.parameters = this.extractPathParameters(methodPath);
|
|
109
|
+
const paramTypes = Reflect.getMetadata("design:paramtypes", controller.target, name);
|
|
110
|
+
const returnType = Reflect.getMetadata("design:returntype", controller.target, name);
|
|
111
|
+
if (paramTypes) {
|
|
112
|
+
const additionalParams = this.processParameterTypes(paramTypes);
|
|
113
|
+
operationObject.parameters = [
|
|
114
|
+
...operationObject.parameters,
|
|
115
|
+
...additionalParams
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
if (returnType && operationObject.responses?.["200"]) {
|
|
119
|
+
operationObject.responses["200"].content = {
|
|
120
|
+
"application/json": {
|
|
121
|
+
schema: this.processReturnType(returnType)
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const operation = {
|
|
126
|
+
[httpMethod]: operationObject
|
|
127
|
+
};
|
|
128
|
+
this.openApiDoc.paths ??= {};
|
|
129
|
+
this.openApiDoc.paths[methodPath] = {
|
|
130
|
+
...this.openApiDoc.paths[methodPath] || {},
|
|
131
|
+
...operation
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
extractPathParameters(path) {
|
|
137
|
+
const paramRegex = /\{([a-zA-Z0-9_]+)\}/g;
|
|
138
|
+
const params = [];
|
|
139
|
+
let match;
|
|
140
|
+
while((match = paramRegex.exec(path)) !== null){
|
|
141
|
+
const paramName = match[1];
|
|
142
|
+
params.push({
|
|
143
|
+
name: paramName,
|
|
144
|
+
in: "path",
|
|
145
|
+
required: true,
|
|
146
|
+
schema: {
|
|
147
|
+
type: "string"
|
|
148
|
+
},
|
|
149
|
+
description: `The ${paramName} parameter`
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
return params;
|
|
153
|
+
}
|
|
154
|
+
processParameterTypes(types) {
|
|
155
|
+
return types.map((type)=>this.createParameterDefinition(type));
|
|
156
|
+
}
|
|
157
|
+
processReturnType(type) {
|
|
158
|
+
return this.createSchemaDefinition(type);
|
|
159
|
+
}
|
|
160
|
+
createSchemaDefinition(type) {
|
|
161
|
+
return {
|
|
162
|
+
type: "object",
|
|
163
|
+
properties: this.getTypeProperties(type)
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
createParameterDefinition(type) {
|
|
167
|
+
return {
|
|
168
|
+
in: "body",
|
|
169
|
+
schema: this.createSchemaDefinition(type)
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
getTypeProperties(type) {
|
|
173
|
+
const properties = {};
|
|
174
|
+
const metadata = Reflect.getMetadata(_decorators.API_METADATA_KEY, type) || {};
|
|
175
|
+
Object.keys(metadata).forEach((key)=>{
|
|
176
|
+
properties[key] = {
|
|
177
|
+
type: this.getPropertyType(metadata[key].type),
|
|
178
|
+
description: metadata[key].description,
|
|
179
|
+
example: metadata[key].example
|
|
180
|
+
};
|
|
181
|
+
});
|
|
182
|
+
return properties;
|
|
183
|
+
}
|
|
184
|
+
getPropertyType(type) {
|
|
185
|
+
const typeMap = {
|
|
186
|
+
String: "string",
|
|
187
|
+
Number: "number",
|
|
188
|
+
Boolean: "boolean",
|
|
189
|
+
Object: "object",
|
|
190
|
+
Array: "array"
|
|
191
|
+
};
|
|
192
|
+
return typeMap[type?.name] || "string";
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/swagger/generator.ts"],"names":["SwaggerGenerator","logger","openApiDoc","openapi","info","title","version","process","env","npm_package_version","description","license","name","url","contact","servers","paths","components","schemas","securitySchemes","bearerAuth","type","scheme","bearerFormat","security","generate","routePath","discoveredControllers","findControllers","cwd","__dirname","ignore","absolute","registration","processController","log","Object","keys","length","error","prototype","methodName","methodConfig","state","methods","processMethod","root","controller","method","toString","toLowerCase","methodPath","replaceAll","metadata","Reflect","getMetadata","API_METADATA_KEY","target","verb","verbs","key","hasOwnProperty","httpMethod","operationObject","tags","summary","responses","parameters","extractPathParameters","paramTypes","returnType","additionalParams","processParameterTypes","content","schema","processReturnType","operation","path","paramRegex","params","match","exec","paramName","push","in","required","types","map","createParameterDefinition","createSchemaDefinition","properties","getTypeProperties","forEach","getPropertyType","example","typeMap","String","Number","Boolean","Array"],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "setupSwagger", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return setupSwagger;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _generator = require("./generator");
|
|
12
|
+
const _express = require("express");
|
|
13
|
+
const _nodepath = require("node:path");
|
|
14
|
+
const _serverconstants = require("../../server.constants");
|
|
15
|
+
const _fsutils = require("../fs.utils");
|
|
16
|
+
const _promises = require("node:fs/promises");
|
|
17
|
+
function getSwaggerUiDistPath() {
|
|
18
|
+
try {
|
|
19
|
+
return (0, _nodepath.dirname)(require.resolve("swagger-ui-dist/package.json"));
|
|
20
|
+
} catch {
|
|
21
|
+
return (0, _nodepath.join)(process.cwd(), "node_modules", "swagger-ui-dist");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function generateSwaggerHTML() {
|
|
25
|
+
return `
|
|
26
|
+
<!DOCTYPE html>
|
|
27
|
+
<html lang="en">
|
|
28
|
+
<head>
|
|
29
|
+
<meta charset="UTF-8">
|
|
30
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
31
|
+
<title>FDM Monster API Documentation</title>
|
|
32
|
+
<link rel="stylesheet" href="/api-docs/static/swagger-ui.css" />
|
|
33
|
+
<style>
|
|
34
|
+
html { box-sizing: border-box; overflow: -moz-scrollbars-vertical; overflow-y: scroll; }
|
|
35
|
+
*, *:before, *:after { box-sizing: inherit; }
|
|
36
|
+
body { margin: 0; padding: 0; }
|
|
37
|
+
</style>
|
|
38
|
+
</head>
|
|
39
|
+
<body>
|
|
40
|
+
<div id="swagger-ui"></div>
|
|
41
|
+
<script src="/api-docs/static/swagger-ui-bundle.js"></script>
|
|
42
|
+
<script src="/api-docs/static/swagger-ui-standalone-preset.js"></script>
|
|
43
|
+
<script>
|
|
44
|
+
window.onload = function() {
|
|
45
|
+
window.ui = SwaggerUIBundle({
|
|
46
|
+
url: '/api-docs/swagger.json',
|
|
47
|
+
dom_id: '#swagger-ui',
|
|
48
|
+
deepLinking: true,
|
|
49
|
+
presets: [
|
|
50
|
+
SwaggerUIBundle.presets.apis,
|
|
51
|
+
SwaggerUIStandalonePreset
|
|
52
|
+
],
|
|
53
|
+
plugins: [
|
|
54
|
+
SwaggerUIBundle.plugins.DownloadUrl
|
|
55
|
+
],
|
|
56
|
+
layout: "StandaloneLayout"
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
</script>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
|
62
|
+
`.trim();
|
|
63
|
+
}
|
|
64
|
+
async function setupSwagger(app, logger) {
|
|
65
|
+
const generator = new _generator.SwaggerGenerator(logger);
|
|
66
|
+
const specification = await generator.generate();
|
|
67
|
+
const generateJsonFile = process.env[_serverconstants.AppConstants.GENERATE_SWAGGER_JSON] === "true";
|
|
68
|
+
if (generateJsonFile) {
|
|
69
|
+
try {
|
|
70
|
+
const mediaPath = (0, _nodepath.join)((0, _fsutils.superRootPath)(), _serverconstants.AppConstants.defaultFileStorageFolder);
|
|
71
|
+
(0, _fsutils.ensureDirExists)(mediaPath);
|
|
72
|
+
const swaggerJsonPath = (0, _nodepath.join)(mediaPath, "swagger.json");
|
|
73
|
+
const jsonContent = JSON.stringify(specification, null, 2);
|
|
74
|
+
await (0, _promises.writeFile)(swaggerJsonPath, jsonContent, "utf-8");
|
|
75
|
+
logger.log(`Swagger JSON file generated at: ${swaggerJsonPath}`);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
logger.error("Failed to generate swagger.json file", error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const swaggerUiPath = getSwaggerUiDistPath();
|
|
81
|
+
app.use("/api-docs/static", (0, _express.static)(swaggerUiPath));
|
|
82
|
+
app.get("/api-docs/swagger.json", (_req, res)=>{
|
|
83
|
+
res.setHeader("Content-Type", "application/json");
|
|
84
|
+
res.send(specification);
|
|
85
|
+
});
|
|
86
|
+
app.get("/api-docs", (_req, res)=>{
|
|
87
|
+
res.setHeader("Content-Type", "text/html");
|
|
88
|
+
res.send(generateSwaggerHTML());
|
|
89
|
+
});
|
|
90
|
+
return specification;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=swagger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/swagger/swagger.ts"],"names":["setupSwagger","getSwaggerUiDistPath","dirname","require","resolve","join","process","cwd","generateSwaggerHTML","trim","app","logger","generator","SwaggerGenerator","specification","generate","generateJsonFile","env","AppConstants","GENERATE_SWAGGER_JSON","mediaPath","superRootPath","defaultFileStorageFolder","ensureDirExists","swaggerJsonPath","jsonContent","JSON","stringify","writeFile","log","error","swaggerUiPath","use","expressStatic","get","_req","res","setHeader","send"],"mappings":";;;;+BA6DsBA;;;eAAAA;;;2BA7DW;yBACoB;0BACvB;iCACD;yBACkB;0BAErB;AAG1B,SAASC;IACP,IAAI;QAEF,OAAOC,IAAAA,iBAAO,EAACC,QAAQC,OAAO,CAAC;IACjC,EAAE,OAAM;QAEN,OAAOC,IAAAA,cAAI,EAACC,QAAQC,GAAG,IAAI,gBAAgB;IAC7C;AACF;AAGA,SAASC;IACP,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCR,CAAC,CAACC,IAAI;AACR;AAEO,eAAeT,aAAaU,GAAgB,EAAEC,MAAqB;IACxE,MAAMC,YAAY,IAAIC,2BAAgB,CAACF;IACvC,MAAMG,gBAAgB,MAAMF,UAAUG,QAAQ;IAG9C,MAAMC,mBAAmBV,QAAQW,GAAG,CAACC,6BAAY,CAACC,qBAAqB,CAAC,KAAK;IAE7E,IAAIH,kBAAkB;QACpB,IAAI;YACF,MAAMI,YAAYf,IAAAA,cAAI,EAACgB,IAAAA,sBAAa,KAAIH,6BAAY,CAACI,wBAAwB;YAC7EC,IAAAA,wBAAe,EAACH;YAEhB,MAAMI,kBAAkBnB,IAAAA,cAAI,EAACe,WAAW;YACxC,MAAMK,cAAcC,KAAKC,SAAS,CAACb,eAAe,MAAM;YAExD,MAAMc,IAAAA,mBAAS,EAACJ,iBAAiBC,aAAa;YAC9Cd,OAAOkB,GAAG,CAAC,CAAC,gCAAgC,EAAEL,iBAAiB;QACjE,EAAE,OAAOM,OAAO;YACdnB,OAAOmB,KAAK,CAAC,wCAAwCA;QACvD;IACF;IAGA,MAAMC,gBAAgB9B;IACtBS,IAAIsB,GAAG,CAAC,oBAAoBC,IAAAA,eAAa,EAACF;IAG1CrB,IAAIwB,GAAG,CAAC,0BAA0B,CAACC,MAAMC;QACvCA,IAAIC,SAAS,CAAC,gBAAgB;QAC9BD,IAAIE,IAAI,CAACxB;IACX;IAGAJ,IAAIwB,GAAG,CAAC,aAAa,CAACC,MAAMC;QAC1BA,IAAIC,SAAS,CAAC,gBAAgB;QAC9BD,IAAIE,IAAI,CAAC9B;IACX;IAEA,OAAOM;AACT"}
|