@warlock.js/core 4.1.15 → 4.2.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/CHANGELOG.md +24 -0
- package/LICENSE +21 -0
- package/esm/application/app.d.mts +1 -1
- package/esm/application/app.d.mts.map +1 -1
- package/esm/application/app.mjs +1 -1
- package/esm/application/app.mjs.map +1 -1
- package/esm/application/application-config-types.d.mts +1 -1
- package/esm/application/application-config-types.d.mts.map +1 -1
- package/esm/application/application.d.mts +1 -1
- package/esm/application/application.d.mts.map +1 -1
- package/esm/application/application.mjs +1 -1
- package/esm/application/application.mjs.map +1 -1
- package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
- package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
- package/esm/benchmark/benchmark-snapshots.mjs +1 -1
- package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
- package/esm/benchmark/benchmark.d.mts +1 -1
- package/esm/benchmark/benchmark.d.mts.map +1 -1
- package/esm/benchmark/benchmark.mjs +1 -1
- package/esm/benchmark/benchmark.mjs.map +1 -1
- package/esm/benchmark/channels/console.channel.d.mts +1 -1
- package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
- package/esm/benchmark/channels/console.channel.mjs +1 -1
- package/esm/benchmark/channels/console.channel.mjs.map +1 -1
- package/esm/benchmark/channels/noop.channel.d.mts +1 -1
- package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
- package/esm/benchmark/channels/noop.channel.mjs +1 -1
- package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
- package/esm/benchmark/profiler.d.mts +1 -1
- package/esm/benchmark/profiler.d.mts.map +1 -1
- package/esm/benchmark/profiler.mjs +1 -1
- package/esm/benchmark/profiler.mjs.map +1 -1
- package/esm/benchmark/types.d.mts +1 -1
- package/esm/benchmark/types.d.mts.map +1 -1
- package/esm/bootstrap/setup.d.mts +1 -1
- package/esm/bootstrap/setup.d.mts.map +1 -1
- package/esm/bootstrap/setup.mjs +1 -1
- package/esm/bootstrap/setup.mjs.map +1 -1
- package/esm/bootstrap.d.mts +1 -1
- package/esm/bootstrap.d.mts.map +1 -1
- package/esm/bootstrap.mjs +1 -1
- package/esm/bootstrap.mjs.map +1 -1
- package/esm/cache/database-cache-driver.d.mts +1 -1
- package/esm/cache/database-cache-driver.d.mts.map +1 -1
- package/esm/cache/database-cache-driver.mjs +1 -1
- package/esm/cache/database-cache-driver.mjs.map +1 -1
- package/esm/cache/index.mjs +1 -1
- package/esm/cache/index.mjs.map +1 -1
- package/esm/cli/cli-command.d.mts +1 -1
- package/esm/cli/cli-command.d.mts.map +1 -1
- package/esm/cli/cli-command.mjs +1 -1
- package/esm/cli/cli-command.mjs.map +1 -1
- package/esm/cli/types.d.mts +1 -1
- package/esm/cli/types.d.mts.map +1 -1
- package/esm/config/config-getter.d.mts +1 -1
- package/esm/config/config-getter.d.mts.map +1 -1
- package/esm/config/config-getter.mjs +6 -6
- package/esm/config/config-getter.mjs.map +1 -1
- package/esm/config/config-handlers.d.mts +1 -1
- package/esm/config/config-handlers.d.mts.map +1 -1
- package/esm/config/config-handlers.mjs +1 -1
- package/esm/config/config-handlers.mjs.map +1 -1
- package/esm/config/config-loader.d.mts +1 -1
- package/esm/config/config-loader.d.mts.map +1 -1
- package/esm/config/config-loader.mjs +3 -3
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/config/config-manager.mjs +1 -1
- package/esm/config/config-manager.mjs.map +1 -1
- package/esm/config/config-special-handlers.d.mts +1 -1
- package/esm/config/config-special-handlers.d.mts.map +1 -1
- package/esm/config/config-special-handlers.mjs +1 -1
- package/esm/config/config-special-handlers.mjs.map +1 -1
- package/esm/config/load-config-files.mjs +1 -1
- package/esm/config/load-config-files.mjs.map +1 -1
- package/esm/config/types.d.mts +1 -1
- package/esm/config/types.d.mts.map +1 -1
- package/esm/connectors/access-connector.d.mts +39 -0
- package/esm/connectors/access-connector.d.mts.map +1 -0
- package/esm/connectors/access-connector.mjs +54 -0
- package/esm/connectors/access-connector.mjs.map +1 -0
- package/esm/connectors/base-connector.d.mts +1 -1
- package/esm/connectors/base-connector.d.mts.map +1 -1
- package/esm/connectors/base-connector.mjs +1 -1
- package/esm/connectors/base-connector.mjs.map +1 -1
- package/esm/connectors/cache-connector.d.mts +1 -1
- package/esm/connectors/cache-connector.d.mts.map +1 -1
- package/esm/connectors/cache-connector.mjs +3 -3
- package/esm/connectors/cache-connector.mjs.map +1 -1
- package/esm/connectors/connectors-manager.d.mts +1 -1
- package/esm/connectors/connectors-manager.d.mts.map +1 -1
- package/esm/connectors/connectors-manager.mjs +5 -1
- package/esm/connectors/connectors-manager.mjs.map +1 -1
- package/esm/connectors/database-connector.d.mts +1 -1
- package/esm/connectors/database-connector.d.mts.map +1 -1
- package/esm/connectors/database-connector.mjs +3 -3
- package/esm/connectors/database-connector.mjs.map +1 -1
- package/esm/connectors/herald-connector.d.mts +1 -1
- package/esm/connectors/herald-connector.d.mts.map +1 -1
- package/esm/connectors/herald-connector.mjs +4 -4
- package/esm/connectors/herald-connector.mjs.map +1 -1
- package/esm/connectors/http-connector.d.mts +1 -1
- package/esm/connectors/http-connector.d.mts.map +1 -1
- package/esm/connectors/http-connector.mjs +8 -6
- package/esm/connectors/http-connector.mjs.map +1 -1
- package/esm/connectors/index.d.mts +2 -0
- package/esm/connectors/index.mjs +2 -0
- package/esm/connectors/logger-connector.d.mts +1 -1
- package/esm/connectors/logger-connector.d.mts.map +1 -1
- package/esm/connectors/logger-connector.mjs +3 -3
- package/esm/connectors/logger-connector.mjs.map +1 -1
- package/esm/connectors/mail-connector.d.mts +1 -1
- package/esm/connectors/mail-connector.d.mts.map +1 -1
- package/esm/connectors/mail-connector.mjs +3 -3
- package/esm/connectors/mail-connector.mjs.map +1 -1
- package/esm/connectors/notifications-connector.d.mts +38 -0
- package/esm/connectors/notifications-connector.d.mts.map +1 -0
- package/esm/connectors/notifications-connector.mjs +51 -0
- package/esm/connectors/notifications-connector.mjs.map +1 -0
- package/esm/connectors/socket-connector.d.mts +1 -1
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs +4 -4
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/connectors/storage.connector.d.mts +1 -1
- package/esm/connectors/storage.connector.d.mts.map +1 -1
- package/esm/connectors/storage.connector.mjs +1 -1
- package/esm/connectors/storage.connector.mjs.map +1 -1
- package/esm/connectors/types.d.mts +5 -3
- package/esm/connectors/types.d.mts.map +1 -1
- package/esm/connectors/types.mjs +3 -1
- package/esm/connectors/types.mjs.map +1 -1
- package/esm/container/index.d.mts +1 -1
- package/esm/container/index.d.mts.map +1 -1
- package/esm/container/index.mjs +1 -1
- package/esm/container/index.mjs.map +1 -1
- package/esm/database/models/database-log/database-log.d.mts +1 -1
- package/esm/database/models/database-log/database-log.d.mts.map +1 -1
- package/esm/database/models/database-log/database-log.mjs +1 -1
- package/esm/database/models/database-log/database-log.mjs.map +1 -1
- package/esm/database/seeds/seeder.d.mts +1 -1
- package/esm/database/seeds/seeder.d.mts.map +1 -1
- package/esm/database/seeds/seeder.mjs +1 -1
- package/esm/database/seeds/seeder.mjs.map +1 -1
- package/esm/database/seeds/types.d.mts +1 -1
- package/esm/database/seeds/types.d.mts.map +1 -1
- package/esm/database/utils.d.mts +1 -1
- package/esm/database/utils.d.mts.map +1 -1
- package/esm/database/utils.mjs +1 -1
- package/esm/database/utils.mjs.map +1 -1
- package/esm/dev-server/create-worker.mjs +1 -1
- package/esm/dev-server/create-worker.mjs.map +1 -1
- package/esm/dev-server/dependency-graph.d.mts +1 -1
- package/esm/dev-server/dependency-graph.d.mts.map +1 -1
- package/esm/dev-server/dependency-graph.mjs +1 -1
- package/esm/dev-server/dependency-graph.mjs.map +1 -1
- package/esm/dev-server/dev-logger.mjs +2 -13
- package/esm/dev-server/dev-logger.mjs.map +1 -1
- package/esm/dev-server/events.mjs +1 -1
- package/esm/dev-server/events.mjs.map +1 -1
- package/esm/dev-server/file-event-handler.mjs +1 -1
- package/esm/dev-server/file-event-handler.mjs.map +1 -1
- package/esm/dev-server/file-manager.d.mts +1 -1
- package/esm/dev-server/file-manager.d.mts.map +1 -1
- package/esm/dev-server/file-manager.mjs +1 -1
- package/esm/dev-server/file-manager.mjs.map +1 -1
- package/esm/dev-server/file-operations.d.mts +1 -1
- package/esm/dev-server/file-operations.d.mts.map +1 -1
- package/esm/dev-server/file-operations.mjs +1 -1
- package/esm/dev-server/file-operations.mjs.map +1 -1
- package/esm/dev-server/files-orchestrator.d.mts +1 -1
- package/esm/dev-server/files-orchestrator.d.mts.map +1 -1
- package/esm/dev-server/files-orchestrator.mjs +1 -1
- package/esm/dev-server/files-orchestrator.mjs.map +1 -1
- package/esm/dev-server/files-watcher.d.mts +1 -1
- package/esm/dev-server/files-watcher.d.mts.map +1 -1
- package/esm/dev-server/files-watcher.mjs +1 -1
- package/esm/dev-server/files-watcher.mjs.map +1 -1
- package/esm/dev-server/flags.mjs +1 -1
- package/esm/dev-server/flags.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts +1 -1
- package/esm/dev-server/health-checker/checkers/base-health-checker.d.mts.map +1 -1
- package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
- package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.mts.map +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts +1 -1
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.mts.map +1 -1
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
- package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
- package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
- package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
- package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
- package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.d.mts +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.d.mts.map +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
- package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
- package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
- package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
- package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
- package/esm/dev-server/loader/register-loader.mjs +1 -1
- package/esm/dev-server/loader/register-loader.mjs.map +1 -1
- package/esm/dev-server/loader/transpile-cache.mjs +2 -164
- package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
- package/esm/dev-server/manifest-manager.d.mts +1 -1
- package/esm/dev-server/manifest-manager.d.mts.map +1 -1
- package/esm/dev-server/manifest-manager.mjs +1 -1
- package/esm/dev-server/manifest-manager.mjs.map +1 -1
- package/esm/dev-server/module-loader.d.mts +1 -1
- package/esm/dev-server/module-loader.d.mts.map +1 -1
- package/esm/dev-server/module-loader.mjs +1 -1
- package/esm/dev-server/module-loader.mjs.map +1 -1
- package/esm/dev-server/package-json-manager.mjs +1 -1
- package/esm/dev-server/package-json-manager.mjs.map +1 -1
- package/esm/dev-server/parse-imports.mjs +1 -1
- package/esm/dev-server/parse-imports.mjs.map +1 -1
- package/esm/dev-server/path.mjs +1 -1
- package/esm/dev-server/path.mjs.map +1 -1
- package/esm/dev-server/special-files-collector.d.mts +1 -1
- package/esm/dev-server/special-files-collector.d.mts.map +1 -1
- package/esm/dev-server/special-files-collector.mjs +1 -1
- package/esm/dev-server/special-files-collector.mjs.map +1 -1
- package/esm/dev-server/tsconfig-manager.mjs +1 -1
- package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
- package/esm/dev-server/types.d.mts +1 -1
- package/esm/dev-server/types.d.mts.map +1 -1
- package/esm/dev-server/utils.mjs +1 -1
- package/esm/dev-server/utils.mjs.map +1 -1
- package/esm/encryption/encrypt.d.mts +1 -1
- package/esm/encryption/encrypt.d.mts.map +1 -1
- package/esm/encryption/encrypt.mjs +1 -1
- package/esm/encryption/encrypt.mjs.map +1 -1
- package/esm/encryption/hash.d.mts +1 -1
- package/esm/encryption/hash.d.mts.map +1 -1
- package/esm/encryption/hash.mjs +1 -1
- package/esm/encryption/hash.mjs.map +1 -1
- package/esm/encryption/password.d.mts +1 -1
- package/esm/encryption/password.d.mts.map +1 -1
- package/esm/encryption/password.mjs +1 -1
- package/esm/encryption/password.mjs.map +1 -1
- package/esm/encryption/types.d.mts +1 -1
- package/esm/encryption/types.d.mts.map +1 -1
- package/esm/http/config.d.mts +1 -1
- package/esm/http/config.d.mts.map +1 -1
- package/esm/http/config.mjs +3 -3
- package/esm/http/config.mjs.map +1 -1
- package/esm/http/context/request-context.d.mts +1 -1
- package/esm/http/context/request-context.d.mts.map +1 -1
- package/esm/http/context/request-context.mjs +1 -1
- package/esm/http/context/request-context.mjs.map +1 -1
- package/esm/http/createHttpApplication.d.mts +1 -1
- package/esm/http/createHttpApplication.d.mts.map +1 -1
- package/esm/http/createHttpApplication.mjs +3 -3
- package/esm/http/createHttpApplication.mjs.map +1 -1
- package/esm/http/database/RequestLog.d.mts +1 -1
- package/esm/http/database/RequestLog.d.mts.map +1 -1
- package/esm/http/database/RequestLog.mjs +1 -1
- package/esm/http/database/RequestLog.mjs.map +1 -1
- package/esm/http/error-codes.d.mts +1 -1
- package/esm/http/error-codes.d.mts.map +1 -1
- package/esm/http/error-codes.mjs +1 -1
- package/esm/http/error-codes.mjs.map +1 -1
- package/esm/http/errors/errors.d.mts +1 -1
- package/esm/http/errors/errors.d.mts.map +1 -1
- package/esm/http/errors/errors.mjs +1 -1
- package/esm/http/errors/errors.mjs.map +1 -1
- package/esm/http/events.d.mts +1 -1
- package/esm/http/events.d.mts.map +1 -1
- package/esm/http/events.mjs +1 -1
- package/esm/http/events.mjs.map +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
- package/esm/http/middleware/cache-response-middleware.mjs +1 -1
- package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
- package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
- package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
- package/esm/http/middleware/idempotency.middleware.mjs +6 -6
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/middleware/inject-request-context.d.mts +1 -1
- package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
- package/esm/http/middleware/inject-request-context.mjs +3 -3
- package/esm/http/middleware/inject-request-context.mjs.map +1 -1
- package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
- package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
- package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
- package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
- package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
- package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
- package/esm/http/middleware/maintenance.middleware.mjs +5 -5
- package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
- package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
- package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
- package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
- package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
- package/esm/http/middleware/middleware-list.d.mts +1 -1
- package/esm/http/middleware/middleware-list.d.mts.map +1 -1
- package/esm/http/middleware/middleware-list.mjs +1 -1
- package/esm/http/middleware/middleware-list.mjs.map +1 -1
- package/esm/http/middleware/rate-limit.middleware.d.mts +1 -1
- package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
- package/esm/http/middleware/rate-limit.middleware.mjs +1 -1
- package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
- package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
- package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
- package/esm/http/middleware/utils/cidr-match.mjs +1 -1
- package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
- package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
- package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
- package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
- package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
- package/esm/http/middleware/utils/parse-size.d.mts +1 -1
- package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
- package/esm/http/middleware/utils/parse-size.mjs +1 -1
- package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
- package/esm/http/plugins.d.mts +1 -1
- package/esm/http/plugins.d.mts.map +1 -1
- package/esm/http/plugins.mjs +10 -10
- package/esm/http/plugins.mjs.map +1 -1
- package/esm/http/request-controller.d.mts +1 -1
- package/esm/http/request-controller.d.mts.map +1 -1
- package/esm/http/request-controller.mjs +1 -1
- package/esm/http/request-controller.mjs.map +1 -1
- package/esm/http/request.d.mts +1 -1
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +1 -1
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +4 -4
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +6 -6
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/server.d.mts +1 -1
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +3 -3
- package/esm/http/server.mjs.map +1 -1
- package/esm/http/types.d.mts +1 -1
- package/esm/http/types.d.mts.map +1 -1
- package/esm/http/uploaded-file.d.mts +1 -1
- package/esm/http/uploaded-file.d.mts.map +1 -1
- package/esm/http/uploaded-file.mjs +1 -1
- package/esm/http/uploaded-file.mjs.map +1 -1
- package/esm/http/uploads-config.d.mts +1 -1
- package/esm/http/uploads-config.d.mts.map +1 -1
- package/esm/http/uploads-config.mjs +1 -1
- package/esm/http/uploads-config.mjs.map +1 -1
- package/esm/http/uploads-types.d.mts +1 -1
- package/esm/http/uploads-types.d.mts.map +1 -1
- package/esm/image/image.d.mts +1 -1
- package/esm/image/image.d.mts.map +1 -1
- package/esm/image/image.mjs +1 -1
- package/esm/image/image.mjs.map +1 -1
- package/esm/index.d.mts +4 -1
- package/esm/index.mjs +5 -1
- package/esm/logger/logger.d.mts +1 -1
- package/esm/logger/logger.d.mts.map +1 -1
- package/esm/logger/logger.mjs +1 -1
- package/esm/logger/logger.mjs.map +1 -1
- package/esm/logger/types.d.mts +1 -1
- package/esm/logger/types.d.mts.map +1 -1
- package/esm/mail/config.d.mts +1 -1
- package/esm/mail/config.d.mts.map +1 -1
- package/esm/mail/config.mjs +1 -1
- package/esm/mail/config.mjs.map +1 -1
- package/esm/mail/events.d.mts +1 -1
- package/esm/mail/events.d.mts.map +1 -1
- package/esm/mail/events.mjs +1 -1
- package/esm/mail/events.mjs.map +1 -1
- package/esm/mail/mail.d.mts +1 -1
- package/esm/mail/mail.d.mts.map +1 -1
- package/esm/mail/mail.mjs +1 -1
- package/esm/mail/mail.mjs.map +1 -1
- package/esm/mail/mailer-pool.d.mts +1 -1
- package/esm/mail/mailer-pool.d.mts.map +1 -1
- package/esm/mail/mailer-pool.mjs +1 -1
- package/esm/mail/mailer-pool.mjs.map +1 -1
- package/esm/mail/react-mail.d.mts +1 -1
- package/esm/mail/react-mail.d.mts.map +1 -1
- package/esm/mail/react-mail.mjs +1 -1
- package/esm/mail/react-mail.mjs.map +1 -1
- package/esm/mail/send-mail.d.mts +1 -1
- package/esm/mail/send-mail.d.mts.map +1 -1
- package/esm/mail/send-mail.mjs +1 -1
- package/esm/mail/send-mail.mjs.map +1 -1
- package/esm/mail/test-mailbox.d.mts +1 -1
- package/esm/mail/test-mailbox.d.mts.map +1 -1
- package/esm/mail/test-mailbox.mjs +1 -1
- package/esm/mail/test-mailbox.mjs.map +1 -1
- package/esm/mail/types.d.mts +1 -1
- package/esm/mail/types.d.mts.map +1 -1
- package/esm/mail/types.mjs +1 -1
- package/esm/mail/types.mjs.map +1 -1
- package/esm/react/index.d.mts +1 -1
- package/esm/react/index.d.mts.map +1 -1
- package/esm/react/index.mjs +1 -1
- package/esm/react/index.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
- package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
- package/esm/repositories/contracts/types.d.mts +1 -1
- package/esm/repositories/contracts/types.d.mts.map +1 -1
- package/esm/repositories/repository.manager.d.mts +1 -1
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +1 -1
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/resource/define-resource.d.mts +1 -1
- package/esm/resource/define-resource.d.mts.map +1 -1
- package/esm/resource/define-resource.mjs +1 -1
- package/esm/resource/define-resource.mjs.map +1 -1
- package/esm/resource/register-resource.d.mts +1 -1
- package/esm/resource/register-resource.d.mts.map +1 -1
- package/esm/resource/register-resource.mjs +1 -1
- package/esm/resource/register-resource.mjs.map +1 -1
- package/esm/resource/resource-field-builder.d.mts +1 -1
- package/esm/resource/resource-field-builder.d.mts.map +1 -1
- package/esm/resource/resource-field-builder.mjs +1 -1
- package/esm/resource/resource-field-builder.mjs.map +1 -1
- package/esm/resource/resource.d.mts +1 -1
- package/esm/resource/resource.d.mts.map +1 -1
- package/esm/resource/resource.mjs +1 -1
- package/esm/resource/resource.mjs.map +1 -1
- package/esm/resource/types.d.mts +1 -1
- package/esm/resource/types.d.mts.map +1 -1
- package/esm/restful/restful.d.mts +1 -1
- package/esm/restful/restful.d.mts.map +1 -1
- package/esm/restful/restful.mjs +1 -1
- package/esm/restful/restful.mjs.map +1 -1
- package/esm/router/route-builder.d.mts +1 -1
- package/esm/router/route-builder.d.mts.map +1 -1
- package/esm/router/route-builder.mjs +1 -1
- package/esm/router/route-builder.mjs.map +1 -1
- package/esm/router/route-registry.mjs +1 -1
- package/esm/router/route-registry.mjs.map +1 -1
- package/esm/router/router.d.mts +1 -1
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +1 -1
- package/esm/router/router.mjs.map +1 -1
- package/esm/router/types.d.mts +1 -1
- package/esm/router/types.d.mts.map +1 -1
- package/esm/socket/types.d.mts +1 -1
- package/esm/socket/types.d.mts.map +1 -1
- package/esm/socket/utils.d.mts +1 -1
- package/esm/socket/utils.d.mts.map +1 -1
- package/esm/socket/utils.mjs +1 -1
- package/esm/socket/utils.mjs.map +1 -1
- package/esm/storage/config.d.mts +1 -1
- package/esm/storage/config.d.mts.map +1 -1
- package/esm/storage/config.mjs +1 -1
- package/esm/storage/config.mjs.map +1 -1
- package/esm/storage/context/storage-driver-context.d.mts +1 -1
- package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
- package/esm/storage/context/storage-driver-context.mjs +1 -1
- package/esm/storage/context/storage-driver-context.mjs.map +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs +1 -1
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
- package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts +1 -1
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs +1 -1
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/drivers/r2-driver.d.mts +1 -1
- package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
- package/esm/storage/drivers/r2-driver.mjs +1 -1
- package/esm/storage/drivers/r2-driver.mjs.map +1 -1
- package/esm/storage/drivers/s3-driver.d.mts +1 -1
- package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
- package/esm/storage/drivers/s3-driver.mjs +1 -1
- package/esm/storage/drivers/s3-driver.mjs.map +1 -1
- package/esm/storage/scoped-storage.d.mts +1 -1
- package/esm/storage/scoped-storage.d.mts.map +1 -1
- package/esm/storage/scoped-storage.mjs +1 -1
- package/esm/storage/scoped-storage.mjs.map +1 -1
- package/esm/storage/storage-file.d.mts +1 -1
- package/esm/storage/storage-file.d.mts.map +1 -1
- package/esm/storage/storage-file.mjs +1 -1
- package/esm/storage/storage-file.mjs.map +1 -1
- package/esm/storage/storage.d.mts +1 -1
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +1 -1
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts +1 -1
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/mime.d.mts +1 -1
- package/esm/storage/utils/mime.d.mts.map +1 -1
- package/esm/storage/utils/mime.mjs +1 -1
- package/esm/storage/utils/mime.mjs.map +1 -1
- package/esm/tests/start-http-development-server.d.mts +1 -1
- package/esm/tests/start-http-development-server.d.mts.map +1 -1
- package/esm/tests/start-http-development-server.mjs +4 -2
- package/esm/tests/start-http-development-server.mjs.map +1 -1
- package/esm/tests/test-helpers.d.mts +1 -1
- package/esm/tests/test-helpers.d.mts.map +1 -1
- package/esm/tests/test-helpers.mjs +1 -1
- package/esm/tests/test-helpers.mjs.map +1 -1
- package/esm/tests/vitest-setup.d.mts +1 -1
- package/esm/tests/vitest-setup.d.mts.map +1 -1
- package/esm/tests/vitest-setup.mjs +1 -1
- package/esm/tests/vitest-setup.mjs.map +1 -1
- package/esm/use-cases/types.d.mts +1 -1
- package/esm/use-cases/types.d.mts.map +1 -1
- package/esm/use-cases/use-case-broadcast.d.mts +1 -1
- package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
- package/esm/use-cases/use-case-broadcast.mjs +1 -1
- package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
- package/esm/use-cases/use-case-events.d.mts +1 -1
- package/esm/use-cases/use-case-events.d.mts.map +1 -1
- package/esm/use-cases/use-case-events.mjs +1 -1
- package/esm/use-cases/use-case-events.mjs.map +1 -1
- package/esm/use-cases/use-case-pipeline.d.mts +1 -1
- package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
- package/esm/use-cases/use-case-pipeline.mjs +1 -1
- package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
- package/esm/use-cases/use-case.d.mts +1 -1
- package/esm/use-cases/use-case.d.mts.map +1 -1
- package/esm/use-cases/use-case.errors.d.mts +1 -1
- package/esm/use-cases/use-case.errors.d.mts.map +1 -1
- package/esm/use-cases/use-case.errors.mjs +1 -1
- package/esm/use-cases/use-case.errors.mjs.map +1 -1
- package/esm/use-cases/use-case.mjs +1 -1
- package/esm/use-cases/use-case.mjs.map +1 -1
- package/esm/use-cases/use-cases-registry.d.mts +1 -1
- package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
- package/esm/use-cases/use-cases-registry.mjs +1 -1
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/app-log.d.mts +1 -1
- package/esm/utils/app-log.d.mts.map +1 -1
- package/esm/utils/app-log.mjs +1 -1
- package/esm/utils/app-log.mjs.map +1 -1
- package/esm/utils/database-log.d.mts +1 -1
- package/esm/utils/database-log.d.mts.map +1 -1
- package/esm/utils/database-log.mjs +1 -1
- package/esm/utils/database-log.mjs.map +1 -1
- package/esm/utils/environment.d.mts +1 -1
- package/esm/utils/environment.d.mts.map +1 -1
- package/esm/utils/environment.mjs +1 -1
- package/esm/utils/environment.mjs.map +1 -1
- package/esm/utils/framework-vesion.mjs +2 -11
- package/esm/utils/framework-vesion.mjs.map +1 -1
- package/esm/utils/get-localized.d.mts +1 -1
- package/esm/utils/get-localized.d.mts.map +1 -1
- package/esm/utils/get-localized.mjs +1 -1
- package/esm/utils/get-localized.mjs.map +1 -1
- package/esm/utils/paths.d.mts +1 -1
- package/esm/utils/paths.d.mts.map +1 -1
- package/esm/utils/paths.mjs +3 -3
- package/esm/utils/paths.mjs.map +1 -1
- package/esm/utils/promise-all-object.d.mts +1 -1
- package/esm/utils/promise-all-object.d.mts.map +1 -1
- package/esm/utils/promise-all-object.mjs +1 -1
- package/esm/utils/promise-all-object.mjs.map +1 -1
- package/esm/utils/queue.d.mts +1 -1
- package/esm/utils/queue.d.mts.map +1 -1
- package/esm/utils/queue.mjs +1 -1
- package/esm/utils/queue.mjs.map +1 -1
- package/esm/utils/sleep.d.mts +1 -1
- package/esm/utils/sleep.d.mts.map +1 -1
- package/esm/utils/sleep.mjs +1 -1
- package/esm/utils/sleep.mjs.map +1 -1
- package/esm/utils/sluggable.d.mts +1 -1
- package/esm/utils/sluggable.d.mts.map +1 -1
- package/esm/utils/sluggable.mjs +1 -1
- package/esm/utils/sluggable.mjs.map +1 -1
- package/esm/utils/to-json.d.mts +1 -1
- package/esm/utils/to-json.d.mts.map +1 -1
- package/esm/utils/to-json.mjs +1 -1
- package/esm/utils/to-json.mjs.map +1 -1
- package/esm/utils/types.d.mts +1 -1
- package/esm/utils/types.d.mts.map +1 -1
- package/esm/utils/urls.d.mts +1 -1
- package/esm/utils/urls.d.mts.map +1 -1
- package/esm/utils/urls.mjs +1 -1
- package/esm/utils/urls.mjs.map +1 -1
- package/esm/validation/database/exists-except-current-id.d.mts +1 -1
- package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
- package/esm/validation/database/exists-except-current-id.mjs +1 -1
- package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
- package/esm/validation/database/exists-except-current-user.d.mts +1 -1
- package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
- package/esm/validation/database/exists-except-current-user.mjs +1 -1
- package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
- package/esm/validation/database/types.d.mts +1 -1
- package/esm/validation/database/types.d.mts.map +1 -1
- package/esm/validation/database/unique-except-current-id.d.mts +1 -1
- package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
- package/esm/validation/database/unique-except-current-id.mjs +1 -1
- package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
- package/esm/validation/database/unique-except-current-user.d.mts +1 -1
- package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
- package/esm/validation/database/unique-except-current-user.mjs +1 -1
- package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
- package/esm/validation/file/file.d.mts +1 -1
- package/esm/validation/file/file.d.mts.map +1 -1
- package/esm/validation/file/file.mjs +1 -1
- package/esm/validation/file/file.mjs.map +1 -1
- package/esm/validation/init.mjs +1 -1
- package/esm/validation/init.mjs.map +1 -1
- package/esm/validation/plugins/database-plugin.mjs +1 -1
- package/esm/validation/plugins/database-plugin.mjs.map +1 -1
- package/esm/validation/plugins/file-plugin.mjs +1 -1
- package/esm/validation/plugins/file-plugin.mjs.map +1 -1
- package/esm/validation/plugins/localized-plugin.mjs +1 -1
- package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
- package/esm/validation/types.d.mts +1 -1
- package/esm/validation/types.d.mts.map +1 -1
- package/esm/validation/validateAll.mjs +3 -3
- package/esm/validation/validateAll.mjs.map +1 -1
- package/esm/validation/validators/file-validator.d.mts +1 -1
- package/esm/validation/validators/file-validator.d.mts.map +1 -1
- package/esm/validation/validators/file-validator.mjs +1 -1
- package/esm/validation/validators/file-validator.mjs.map +1 -1
- package/esm/vite/index.mjs +3 -0
- package/esm/vite/lower-stage3-decorators.d.mts +53 -0
- package/esm/vite/lower-stage3-decorators.d.mts.map +1 -0
- package/esm/vite/lower-stage3-decorators.mjs +63 -0
- package/esm/vite/lower-stage3-decorators.mjs.map +1 -0
- package/esm/warlock-config/default-configurations.mjs +1 -1
- package/esm/warlock-config/default-configurations.mjs.map +1 -1
- package/esm/warlock-config/define-config.d.mts +1 -1
- package/esm/warlock-config/define-config.d.mts.map +1 -1
- package/esm/warlock-config/define-config.mjs +1 -1
- package/esm/warlock-config/define-config.mjs.map +1 -1
- package/esm/warlock-config/types.d.mts +1 -1
- package/esm/warlock-config/types.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
- package/llms-full.txt +64 -4
- package/llms.txt +1 -0
- package/package.json +9 -33
- package/skills/lower-stage3-decorators/SKILL.md +54 -0
- package/skills/test-http/SKILL.md +3 -2
- package/skills/test-service/SKILL.md +3 -2
- package/bin/warlock.js +0 -3
- package/esm/_virtual/_rolldown/runtime.mjs +0 -7
- package/esm/cli/cli-commands.manager.mjs +0 -290
- package/esm/cli/cli-commands.manager.mjs.map +0 -1
- package/esm/cli/cli-commands.utils.mjs +0 -217
- package/esm/cli/cli-commands.utils.mjs.map +0 -1
- package/esm/cli/commands/add.command.mjs +0 -27
- package/esm/cli/commands/add.command.mjs.map +0 -1
- package/esm/cli/commands/build.command.mjs +0 -14
- package/esm/cli/commands/build.command.mjs.map +0 -1
- package/esm/cli/commands/create-database.command.mjs +0 -24
- package/esm/cli/commands/create-database.command.mjs.map +0 -1
- package/esm/cli/commands/dev-server.command.mjs +0 -48
- package/esm/cli/commands/dev-server.command.mjs.map +0 -1
- package/esm/cli/commands/drop-tables.command.mjs +0 -23
- package/esm/cli/commands/drop-tables.command.mjs.map +0 -1
- package/esm/cli/commands/generate/generate.command.mjs +0 -201
- package/esm/cli/commands/generate/generate.command.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +0 -49
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs +0 -48
- package/esm/cli/commands/generate/generators/controller.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs +0 -81
- package/esm/cli/commands/generate/generators/migration.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +0 -60
- package/esm/cli/commands/generate/generators/model.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/module.generator.mjs +0 -113
- package/esm/cli/commands/generate/generators/module.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs +0 -42
- package/esm/cli/commands/generate/generators/repository.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs +0 -42
- package/esm/cli/commands/generate/generators/resource.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs +0 -42
- package/esm/cli/commands/generate/generators/service.generator.mjs.map +0 -1
- package/esm/cli/commands/generate/templates/stubs.mjs +0 -514
- package/esm/cli/commands/generate/templates/stubs.mjs.map +0 -1
- package/esm/cli/commands/generate/utils/name-parser.mjs +0 -69
- package/esm/cli/commands/generate/utils/name-parser.mjs.map +0 -1
- package/esm/cli/commands/generate/utils/path-resolver.mjs +0 -56
- package/esm/cli/commands/generate/utils/path-resolver.mjs.map +0 -1
- package/esm/cli/commands/generate/utils/prompt.mjs +0 -28
- package/esm/cli/commands/generate/utils/prompt.mjs.map +0 -1
- package/esm/cli/commands/generate/utils/writer.mjs +0 -60
- package/esm/cli/commands/generate/utils/writer.mjs.map +0 -1
- package/esm/cli/commands/migrate.command.mjs +0 -60
- package/esm/cli/commands/migrate.command.mjs.map +0 -1
- package/esm/cli/commands/seed.command.mjs +0 -41
- package/esm/cli/commands/seed.command.mjs.map +0 -1
- package/esm/cli/commands/start-production.command.mjs +0 -50
- package/esm/cli/commands/start-production.command.mjs.map +0 -1
- package/esm/cli/commands/storage-put.action.mjs +0 -75
- package/esm/cli/commands/storage-put.action.mjs.map +0 -1
- package/esm/cli/commands/storage-put.command.mjs +0 -46
- package/esm/cli/commands/storage-put.command.mjs.map +0 -1
- package/esm/cli/commands/typings-generator.command.mjs +0 -38
- package/esm/cli/commands/typings-generator.command.mjs.map +0 -1
- package/esm/cli/commands-loader.mjs +0 -50
- package/esm/cli/commands-loader.mjs.map +0 -1
- package/esm/cli/framework-cli-commands.mjs +0 -37
- package/esm/cli/framework-cli-commands.mjs.map +0 -1
- package/esm/cli/parse-cli-args.mjs +0 -62
- package/esm/cli/parse-cli-args.mjs.map +0 -1
- package/esm/cli/start.d.mts +0 -1
- package/esm/cli/start.mjs +0 -8
- package/esm/cli/start.mjs.map +0 -1
- package/esm/cli/string-similarity.mjs +0 -56
- package/esm/cli/string-similarity.mjs.map +0 -1
- package/esm/database/create-database-action.mjs +0 -32
- package/esm/database/create-database-action.mjs.map +0 -1
- package/esm/database/drop-tables-action.mjs +0 -35
- package/esm/database/drop-tables-action.mjs.map +0 -1
- package/esm/database/migrate-action.mjs +0 -99
- package/esm/database/migrate-action.mjs.map +0 -1
- package/esm/database/seed-command-action.mjs +0 -74
- package/esm/database/seed-command-action.mjs.map +0 -1
- package/esm/database/seeds/seeders.manager.mjs +0 -129
- package/esm/database/seeds/seeders.manager.mjs.map +0 -1
- package/esm/database/seeds/seeds-table-migration.mjs +0 -31
- package/esm/database/seeds/seeds-table-migration.mjs.map +0 -1
- package/esm/database/seeds/utils.mjs +0 -6
- package/esm/database/seeds/utils.mjs.map +0 -1
- package/esm/dev-server/development-server.mjs +0 -115
- package/esm/dev-server/development-server.mjs.map +0 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.d.mts +0 -1
- package/esm/dev-server/health-checker/workers/ts-health.worker.d.mts +0 -1
- package/esm/dev-server/layer-executor.mjs +0 -114
- package/esm/dev-server/layer-executor.mjs.map +0 -1
- package/esm/dev-server/loader/hook-thread.d.mts +0 -48
- package/esm/dev-server/loader/hook-thread.d.mts.map +0 -1
- package/esm/dev-server/loader/hook-thread.mjs +0 -47
- package/esm/dev-server/loader/hook-thread.mjs.map +0 -1
- package/esm/dev-server/loader/load-hook.d.mts +0 -58
- package/esm/dev-server/loader/load-hook.d.mts.map +0 -1
- package/esm/dev-server/loader/load-hook.mjs +0 -86
- package/esm/dev-server/loader/load-hook.mjs.map +0 -1
- package/esm/dev-server/loader/own-resolver.mjs +0 -69
- package/esm/dev-server/loader/own-resolver.mjs.map +0 -1
- package/esm/dev-server/loader/resolve-capture.mjs +0 -43
- package/esm/dev-server/loader/resolve-capture.mjs.map +0 -1
- package/esm/dev-server/loader/resolve-hook.d.mts +0 -41
- package/esm/dev-server/loader/resolve-hook.d.mts.map +0 -1
- package/esm/dev-server/loader/resolve-hook.mjs +0 -87
- package/esm/dev-server/loader/resolve-hook.mjs.map +0 -1
- package/esm/dev-server/loader/source-slug.mjs +0 -22
- package/esm/dev-server/loader/source-slug.mjs.map +0 -1
- package/esm/dev-server/loader/version-registry.mjs +0 -45
- package/esm/dev-server/loader/version-registry.mjs.map +0 -1
- package/esm/dev-server/start-development-server.mjs +0 -63
- package/esm/dev-server/start-development-server.mjs.map +0 -1
- package/esm/dev-server/type-generator.mjs +0 -453
- package/esm/dev-server/type-generator.mjs.map +0 -1
- package/esm/generations/add-command.action.mjs +0 -376
- package/esm/generations/add-command.action.mjs.map +0 -1
- package/esm/generations/stubs.mjs +0 -103
- package/esm/generations/stubs.mjs.map +0 -1
- package/esm/manifest/manifest-manager.mjs +0 -79
- package/esm/manifest/manifest-manager.mjs.map +0 -1
- package/esm/production/build-app-production.mjs +0 -14
- package/esm/production/build-app-production.mjs.map +0 -1
- package/esm/production/esbuild-plugins.mjs +0 -37
- package/esm/production/esbuild-plugins.mjs.map +0 -1
- package/esm/production/production-builder.mjs +0 -264
- package/esm/production/production-builder.mjs.map +0 -1
- package/esm/production/resolve-build-config.mjs +0 -28
- package/esm/production/resolve-build-config.mjs.map +0 -1
package/esm/http/server.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import config from "@mongez/config";
|
|
2
2
|
import Fastify from "fastify";
|
|
3
3
|
|
|
4
|
-
//#region
|
|
4
|
+
//#region ../@warlock.js/core/src/http/server.ts
|
|
5
5
|
/**
|
|
6
6
|
* Default Fastify body limit. Kept at the historical 200GB so existing apps
|
|
7
7
|
* don't regress on upgrade. Override via `http.bodyLimit` in config; for
|
|
@@ -12,7 +12,7 @@ let server = void 0;
|
|
|
12
12
|
function startHttpServer(options) {
|
|
13
13
|
return server = Fastify({
|
|
14
14
|
trustProxy: true,
|
|
15
|
-
bodyLimit:
|
|
15
|
+
bodyLimit: config.get("http.bodyLimit", DEFAULT_BODY_LIMIT),
|
|
16
16
|
...options
|
|
17
17
|
});
|
|
18
18
|
}
|
package/esm/http/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":[
|
|
1
|
+
{"version":3,"file":"server.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/server.ts"],"sourcesContent":["import config from \"@mongez/config\";\r\nimport Fastify, { FastifyServerOptions } from \"fastify\";\r\n\r\nexport type FastifyInstance = ReturnType<typeof Fastify>;\r\n\r\n/**\r\n * Default Fastify body limit. Kept at the historical 200GB so existing apps\r\n * don't regress on upgrade. Override via `http.bodyLimit` in config; for\r\n * per-route caps use the `maxBodySize()` middleware.\r\n */\r\nconst DEFAULT_BODY_LIMIT = 200 * 1024 * 1024 * 1024;\r\n\r\n// Instantiate Fastify server\r\nlet server: FastifyInstance | undefined = undefined;\r\n\r\nexport function startHttpServer(options?: FastifyServerOptions): FastifyInstance {\r\n return (server = Fastify({\r\n trustProxy: true,\r\n bodyLimit: config.get(\"http.bodyLimit\", DEFAULT_BODY_LIMIT),\r\n ...options,\r\n }));\r\n}\r\n\r\n/**\r\n * Expose the server to be publicly accessible\r\n */\r\nexport function getHttpServer(): FastifyInstance {\r\n return server;\r\n}\r\n"],"mappings":";;;;;;;;;AAUA,MAAM,qBAAqB,MAAM,OAAO,OAAO;AAG/C,IAAI,SAAsC;AAE1C,SAAgB,gBAAgB,SAAiD;CAC/E,OAAQ,SAAS,QAAQ;EACvB,YAAY;EACZ,WAAW,OAAO,IAAI,kBAAkB,kBAAkB;EAC1D,GAAG;CACL,CAAC;AACH;;;;AAKA,SAAgB,gBAAiC;CAC/C,OAAO;AACT"}
|
package/esm/http/types.d.mts
CHANGED
|
@@ -4,7 +4,7 @@ import { CookieSerializeOptions } from "@fastify/cookie";
|
|
|
4
4
|
import { FastifyCorsOptions } from "@fastify/cors";
|
|
5
5
|
import React from "react";
|
|
6
6
|
|
|
7
|
-
//#region
|
|
7
|
+
//#region ../@warlock.js/core/src/http/types.d.ts
|
|
8
8
|
type RequestEvent = "executingMiddleware" | "executedMiddleware" | "executingAction" | "executedAction";
|
|
9
9
|
/**
|
|
10
10
|
* Allowed response type
|
package/esm/http/types.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/types.ts"],"mappings":";;;;;;;KAMY,YAAA;;;AAAZ;KASY,gBAAA;;;AATY;AAapB;;;;EAIA,OAAA,CAAQ,QAAA;;;;EAIR,MAAA;;;;EAIA,OAAA,CAAQ,MAAA;;;;;;;;EAQR,OAAA;AAKJ;;;AAAA,KAAY,aAAA;AAAa;AAiEzB;;AAjEyB;;;;;;;AAgFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+JM;AAI9B;;AAJ8B;;;;UA9Kb,iBAAA;EA0LA;;;;EArLf,MAAA;EA6LK;AAAA;AAGP;;;EA1LE,WAAA;EAqM8B;;;EAjM9B,UAAA,EAAY,UAAU;AAAA;;;;UAMP,kBAAA;EAuLkC;;;EAnLjD,IAAA;EA2LA;;;EAvLA,GAAA;EA4LuC;;;EAxLvC,IAAA,GAAO,kBAAA;;;;;;EAMP,eAAA;;;;;;;;;;EAUA,SAAA;EACA,OAAA;;;;IAIE,MAAA;;;;IAIA,OAAA,GAAU,sBAAA;EAAA;;;;EAKZ,SAAA;;;;;;IAME,GAAA;;;;;;IAMA,QAAA;EAAA;;;;;;;;EASF,SAAA;;;;;;IAME,MAAA;;;;IAIA,SAAA;;;;;;;IAOA,OAAA;EAAA;;;;EAKF,WAAA;;;;;;IAME,GAAA;;;;;;IAMA,UAAA;;;;;;;IAOA,OAAA;;;;IAIA,MAAA;EAAA;;;;EAKF,WAAA;;;;;;;IAOE,OAAA;;;;;;IAMA,SAAA;;;;;;IAMA,UAAA;EAAA;;;;EAKF,IAAA;;;;EAIA,UAAA;;;;IAIE,GAAA,GAAM,UAAA;;;;IAIN,IAAA,GAAO,iBAAA;;;;IAIP,MAAA,GAAS,iBAAA;EAAA;AAAA;AAAA,KAID,wBAAA;;;;EAIV,IAAA,GAAO,IAAA;;;;EAIP,MAAA,GAAS,IAAA,EAAM,KAAA,CAAM,SAAS;;;;EAI9B,GAAA;;;;EAIA,KAAA;AAAA;AAAA,KAGU,qBAAA;;;;;;;EAOV,IAAA,GAAO,KAAA,UAAe,IAAA,OAAW,EAAA,cAAgB,qBAAA;;;;EAIjD,OAAA,GAAU,OAAA,aAAoB,qBAAA;;;;EAI9B,GAAA,QAAW,qBAAA;;;;;EAKX,YAAA,GAAe,OAAA,iBAAwB,qBAAA;;;;EAIvC,KAAA;AAAA"}
|
|
@@ -6,7 +6,7 @@ import { Image, ImageFormat, ImageTransformOptions } from "../image/image.mjs";
|
|
|
6
6
|
import { ImageTransformCallback, PrefixConfig, SaveAsOptions, SaveOptions, UploadedFileImageOptions } from "./uploads-types.mjs";
|
|
7
7
|
import { MultipartFile } from "@fastify/multipart";
|
|
8
8
|
|
|
9
|
-
//#region
|
|
9
|
+
//#region ../@warlock.js/core/src/http/uploaded-file.d.ts
|
|
10
10
|
type UploadedFileMetadata = {
|
|
11
11
|
name: string;
|
|
12
12
|
mimeType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploaded-file.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"uploaded-file.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploaded-file.ts"],"mappings":";;;;;;;;;KAiBK,oBAAA;EACH,IAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;EACA,KAAA;EACA,MAAA;AAAA;;;;KAMU,qBAAA;EAVV;;;;;EAgBA,gBAAA;EAZM;AAMR;;;;EAaE,iBAAA;EAAA;;;AAOO;AA+BT;EA/BE,OAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+BW,YAAA;EAAA,mBA4C2B,QAAA,EAAU,aAAA;EAscrC;;;;EAAA,UA7eD,mBAAA,GAAsB,MAAA;EAmiBS;;;;;EA5hBlC,IAAA;EAsvBY;;;;EAAA,UAhvBT,QAAA,EAAU,aAAA;EAbV;;;;EAAA,UAmBA,YAAA,GAAe,WAAA;EAAf;;;;EAAA,UAMA,aAAA,EAAe,wBAAA;EAMI;;;;EAAA,UAAnB,gBAAA,GAAmB,qBAAA,GAAwB,sBAAA;EAuB1C;;;;;;cAf2B,QAAA,EAAU,aAAA;EA8D3B;;;;;EAAA,IA/CV,IAAA;EAuFA;;;;;EAAA,IA9EA,QAAA;EA6HkB;;;;;EAAA,IApHlB,SAAA;EA6KJ;;;EAtKM,QAAA,IAAY,OAAA,CAAQ,oBAAA;EAwM1B;;;;;EAlLM,IAAA,IAAQ,OAAA;EA2OG;;;;;EAjOX,MAAA,IAAU,OAAA,CAAQ,MAAA;EAwQlB;;;EAAA,IAxPF,OAAA;EAmTE;;;EAAA,IA5SF,OAAA;EA4SkD;;;EAAA,IArSlD,OAAA;EAmUqC;;;;;;;;;;;;;;;EA5SzC,GAAA,CAAI,MAAA,EAAQ,iBAAA;EA+Xc;;;;;;;;;;;;;;;EAvW1B,MAAA,CAAO,KAAA,UAAe,MAAA;EAseF;;;;;;;;;;;;;;EAndpB,OAAA,CAAQ,KAAA;;;;;;;;;;;;;;;EAsBR,MAAA,CAAO,MAAA,EAAQ,WAAA;;;;;;;;;;;;EAgBf,MAAA,CAAO,OAAA;;;;;;;;;;;;EAgBP,IAAA,CAAK,KAAA;;;;;;;;;;;EAkBL,SAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCA,SAAA,CAAU,MAAA,EAAQ,qBAAA,GAAwB,sBAAA;;;;;;;;;;;;;;;;;;EAsBpC,OAAA,IAAW,OAAA,CAAQ,KAAA;;;;;;EAanB,UAAA,IAAc,OAAA;IAAU,KAAA;IAAgB,MAAA;EAAA;;;;;;;;;;;;;;;EA0BxC,QAAA,CAAS,OAAA,EAAS,qBAAA,GAAwB,OAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2D1C,IAAA,CAAK,SAAA,UAAmB,OAAA,GAAU,WAAA,GAAc,OAAA,CAAQ,WAAA;;;;;;;;;;;;;;;;;EA8BxD,MAAA,CAAO,QAAA,UAAkB,OAAA,GAAU,aAAA,GAAgB,OAAA,CAAQ,WAAA;;;;;;MAc7D,WAAA,IAAe,WAAA;;;;;YAYV,cAAA,CACd,QAAA,UACA,MAAA,GAAS,iBAAA,GACR,OAAA,CAAQ,WAAA;;;;;YA0BK,mBAAA,IAAuB,OAAA,CAAQ,MAAA;;;;;YA4BrC,iBAAA,CAAkB,GAAA,EAAK,KAAA,GAAQ,KAAA;;;;;YAkC/B,aAAA;;;;;YAQA,cAAA,CAAe,MAAA,GAAS,iBAAA,GAAoB,aAAA,UAAuB,OAAA;;;;;YAYnE,eAAA,CAAgB,OAAA,GAAU,WAAA;;;;;YAwB1B,aAAA,CAAc,MAAA,GAAS,YAAA;;;;;YAiDvB,gBAAA,CAAiB,MAAA,UAAgB,EAAA;;;;;YASjC,UAAA,CAAW,MAAA;;;;;YAQX,aAAA,CAAc,SAAA,UAAmB,MAAA,UAAgB,QAAA;;;;;YAiBjD,iBAAA;;;;;YAiBA,gBAAA;;;;;YAgBA,uBAAA,CAAwB,QAAA;;;;;;EAwBrB,MAAA,IAAM,OAAA"}
|
|
@@ -8,7 +8,7 @@ import path from "path";
|
|
|
8
8
|
import { Random } from "@mongez/reinforcements";
|
|
9
9
|
import dayjs from "dayjs";
|
|
10
10
|
|
|
11
|
-
//#region
|
|
11
|
+
//#region ../@warlock.js/core/src/http/uploaded-file.ts
|
|
12
12
|
/**
|
|
13
13
|
* UploadedFile - Handles multipart file uploads with storage and image integration
|
|
14
14
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploaded-file.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/http/uploaded-file.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport { Random } from \"@mongez/reinforcements\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport { Image, type ImageFormat, type ImageTransformOptions } from \"../image\";\nimport { storage, type ScopedStorage, type StorageDriverName, type StorageFile } from \"../storage\";\nimport { sanitizePath } from \"../utils/paths\";\nimport { uploadsConfig } from \"./uploads-config\";\nimport type {\n FileNamingStrategy,\n ImageTransformCallback,\n PrefixConfig,\n SaveAsOptions,\n SaveOptions,\n UploadedFileImageOptions,\n} from \"./uploads-types\";\n\ntype UploadedFileMetadata = {\n name: string;\n mimeType: string;\n extension: string;\n size: number;\n width?: number;\n height?: number;\n};\n\n/**\n * Options for validating file before saving\n */\nexport type FileValidationOptions = {\n /**\n * List of allowed MIME types\n *\n * @example [\"image/jpeg\", \"image/png\", \"image/webp\"]\n */\n allowedMimeTypes?: string[];\n\n /**\n * List of allowed file extensions (without dot)\n *\n * @example [\"jpg\", \"jpeg\", \"png\", \"webp\"]\n */\n allowedExtensions?: string[];\n\n /**\n * Maximum file size in bytes\n *\n * @example 5 * 1024 * 1024 // 5MB\n */\n maxSize?: number;\n};\n\n/**\n * UploadedFile - Handles multipart file uploads with storage and image integration\n *\n * Provides a fluent API for validating, transforming, and saving uploaded files\n * to various storage drivers (local, S3, R2, etc.).\n *\n * @example\n * ```typescript\n * // Simple save with random name\n * const file = await uploadedFile.save(\"avatars\");\n *\n * // Original name with date prefix\n * const file = await uploadedFile.save(\"avatars\", {\n * name: \"original\",\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n *\n * // With image transformations\n * const file = await uploadedFile\n * .resize(800, 600)\n * .quality(85)\n * .format(\"webp\")\n * .save(\"avatars\");\n *\n * // Different storage driver\n * const file = await uploadedFile.use(\"s3\").save(\"avatars\");\n * ```\n */\nexport class UploadedFile {\n /**\n * File buffered content\n * @internal\n */\n protected bufferedFileContent?: Buffer;\n\n /**\n * Upload file hash (SHA-256)\n *\n * Populated after file is saved.\n */\n public hash = \"\";\n\n /**\n * Selected storage driver\n * @internal\n */\n protected _storage: ScopedStorage = storage;\n\n /**\n * Saved StorageFile reference\n * @internal\n */\n protected _storageFile?: StorageFile;\n\n /**\n * Queued image options (high-level API)\n * @internal\n */\n protected _imageOptions: UploadedFileImageOptions = {};\n\n /**\n * Full transform options or callback\n * @internal\n */\n protected _transformConfig?: ImageTransformOptions | ImageTransformCallback;\n\n /**\n * Create a new UploadedFile instance\n *\n * @param fileData - Multipart file data from Fastify\n * @throws Error if file data is invalid\n */\n public constructor(protected readonly fileData: MultipartFile) {\n if (!fileData?.filename) {\n throw new Error(\"Invalid file data: filename is required\");\n }\n }\n\n // ============================================================\n // File Properties\n // ============================================================\n\n /**\n * Get file name (sanitized)\n *\n * Returns the original filename with special characters removed/replaced.\n */\n public get name(): string {\n return sanitizePath(this.fileData.filename);\n }\n\n /**\n * Get file MIME type\n *\n * @example \"image/jpeg\", \"application/pdf\"\n */\n public get mimeType(): string {\n return this.fileData.mimetype;\n }\n\n /**\n * Get file extension (lowercase, without dot)\n *\n * @example \"jpg\", \"png\", \"pdf\"\n */\n public get extension(): string {\n return path.extname(this.fileData.filename).replace(\".\", \"\").toLowerCase();\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<UploadedFileMetadata> {\n const data: UploadedFileMetadata = {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n };\n\n if (this.isImage) {\n const dimensions = await this.dimensions();\n data.width = dimensions.width;\n data.height = dimensions.height;\n }\n\n return data;\n }\n\n /**\n * Get file size in bytes\n *\n * Buffers the file content if not already buffered.\n */\n public async size(): Promise<number> {\n const file = await this.buffer();\n return file.length;\n }\n\n /**\n * Get file buffer\n *\n * Caches the buffer after first call for efficiency.\n */\n public async buffer(): Promise<Buffer> {\n if (this.bufferedFileContent) {\n return this.bufferedFileContent;\n }\n\n this.bufferedFileContent = await this.fileData.toBuffer();\n return this.bufferedFileContent;\n }\n\n // ============================================================\n // File Type Checks\n // ============================================================\n\n /**\n * Check if file is an image based on MIME type\n */\n public get isImage(): boolean {\n return this.mimeType.startsWith(\"image\");\n }\n\n /**\n * Check if file is a video based on MIME type\n */\n public get isVideo(): boolean {\n return this.mimeType.startsWith(\"video\");\n }\n\n /**\n * Check if file is an audio based on MIME type\n */\n public get isAudio(): boolean {\n return this.mimeType.startsWith(\"audio\");\n }\n\n // ============================================================\n // Storage Driver Selection\n // ============================================================\n\n /**\n * Select a specific storage driver for this upload\n *\n * Returns this instance for chaining. The driver is used\n * when `save()` or `saveAs()` is called.\n *\n * @param driver - Driver name from storage configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.use(\"s3\").save(\"avatars\");\n * await file.use(\"r2\").save(\"cdn/images\");\n * ```\n */\n public use(driver: StorageDriverName): this {\n this._storage = storage.use(driver) as ScopedStorage;\n return this;\n }\n\n // ============================================================\n // High-Level Image Transform API\n // ============================================================\n\n /**\n * Resize the image before saving\n *\n * Only applies to image files. Non-image files ignore this.\n *\n * @param width - Target width in pixels\n * @param height - Optional target height (maintains aspect ratio if omitted)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.resize(800).save(\"thumbnails\");\n * await file.resize(400, 400).save(\"avatars\");\n * ```\n */\n public resize(width: number, height?: number): this {\n this._imageOptions.resize = { width, height };\n return this;\n }\n\n /**\n * Set image output quality\n *\n * Quality affects file size and visual fidelity.\n * Only applies to formats that support quality (JPEG, WebP, AVIF).\n *\n * @param value - Quality value (1-100)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.quality(85).save(\"images\");\n * ```\n */\n public quality(value: number): this {\n if (value < 1 || value > 100) {\n throw new Error(\"Quality must be between 1 and 100\");\n }\n this._imageOptions.quality = value;\n return this;\n }\n\n /**\n * Convert image to a specific format\n *\n * Changes the output format and updates the file extension accordingly.\n *\n * @param format - Target image format (jpeg, png, webp, avif, etc.)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.format(\"webp\").save(\"images\");\n * await file.resize(800).format(\"avif\").quality(80).save(\"optimized\");\n * ```\n */\n public format(format: ImageFormat): this {\n this._imageOptions.format = format;\n return this;\n }\n\n /**\n * Rotate the image\n *\n * @param degrees - Rotation angle in degrees (positive = clockwise)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.rotate(90).save(\"rotated\");\n * ```\n */\n public rotate(degrees: number): this {\n this._imageOptions.rotate = degrees;\n return this;\n }\n\n /**\n * Apply blur effect to the image\n *\n * @param sigma - Blur intensity (default: 3, minimum: 0.3)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.blur(5).save(\"blurred\");\n * ```\n */\n public blur(sigma = 3): this {\n if (sigma < 0.3) {\n throw new Error(\"Blur sigma must be at least 0.3\");\n }\n this._imageOptions.blur = sigma;\n return this;\n }\n\n /**\n * Convert image to grayscale (black and white)\n *\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.grayscale().save(\"bw-images\");\n * ```\n */\n public grayscale(): this {\n this._imageOptions.grayscale = true;\n return this;\n }\n\n // ============================================================\n // Full Transform Control\n // ============================================================\n\n /**\n * Apply full image transformations\n *\n * Provides complete control over image processing. Can be used with:\n * - An options object for predefined transforms\n * - A callback function for chained operations\n *\n * @param config - Transform options or callback function\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * // Using options object\n * await file.transform({\n * resize: { width: 800, fit: \"inside\" },\n * quality: 85\n * }).save(\"images\");\n *\n * // Using callback for full control\n * await file.transform(img =>\n * img.resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .sharpen()\n * ).save(\"products\");\n * ```\n */\n public transform(config: ImageTransformOptions | ImageTransformCallback): this {\n this._transformConfig = config;\n return this;\n }\n\n /**\n * Get an Image instance for advanced manipulation\n *\n * Returns an Image instance from the file buffer for manual processing.\n * Use this when you need operations not covered by the fluent API.\n *\n * @returns Promise resolving to Image instance\n *\n * @example\n * ```typescript\n * const img = await file.toImage();\n * await img\n * .resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .save(\"path/to/output.jpg\");\n * ```\n */\n public async toImage(): Promise<Image> {\n return new Image(await this.buffer());\n }\n\n // ============================================================\n // Image Metadata\n // ============================================================\n\n /**\n * Get file width and height (only for images)\n *\n * @returns Dimensions object, or empty object if not an image\n */\n public async dimensions(): Promise<{ width?: number; height?: number }> {\n if (!this.isImage) {\n return {};\n }\n\n return new Image(await this.buffer()).dimensions();\n }\n\n // ============================================================\n // Validation\n // ============================================================\n\n /**\n * Validate file against the given options\n *\n * @param options - Validation rules\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * await file.validate({\n * allowedMimeTypes: [\"image/jpeg\", \"image/png\"],\n * maxSize: 5 * 1024 * 1024 // 5MB\n * });\n * ```\n */\n public async validate(options: FileValidationOptions): Promise<void> {\n const { allowedMimeTypes, allowedExtensions, maxSize } = options;\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(this.mimeType)) {\n throw new Error(\n `Invalid file type: ${this.mimeType}. Allowed types: ${allowedMimeTypes.join(\", \")}`,\n );\n }\n\n if (allowedExtensions && !allowedExtensions.includes(this.extension)) {\n throw new Error(\n `Invalid file extension: ${this.extension}. Allowed extensions: ${allowedExtensions.join(\", \")}`,\n );\n }\n\n if (maxSize) {\n const fileSize = await this.size();\n if (fileSize > maxSize) {\n throw new Error(`File too large: ${fileSize} bytes. Maximum allowed: ${maxSize} bytes`);\n }\n }\n }\n\n // ============================================================\n // Save Operations\n // ============================================================\n\n /**\n * Save the file to a directory with automatic naming\n * Keep in mind to use only relative path to the root of storage\n * If you are using local driver\n * Uses the configured naming strategy and prefix options to generate\n * the final path. Returns a StorageFile for accessing file metadata.\n *\n * @param directory - Target directory path\n * @param options - Save options (name, prefix, driver, validate)\n * @returns StorageFile instance with file metadata and operations\n *\n * @example\n * ```typescript\n * // Random name (default)\n * await file.save(\"avatars\");\n * // → avatars/x7k9m2p4.jpg\n *\n * // Original name\n * await file.save(\"avatars\", { name: \"original\" });\n * // → avatars/photo.jpg\n *\n * // With date directory\n * await file.save(\"avatars\", {\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n * // → avatars/2025/12/21/x7k9m2p4.jpg\n *\n * // Original name with datetime prefix\n * await file.save(\"avatars\", { name: \"original\", prefix: true });\n * // → avatars/21-12-2025-16-45-30-photo.jpg\n * ```\n */\n public async save(directory: string, options?: SaveOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n // Resolve filename and prefix\n const filename = this.resolveFilename(options);\n const prefix = this.resolvePrefix(options?.prefix);\n const location = this.buildLocation(directory, prefix, filename);\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Save the file to an explicit path\n *\n * Unlike `save()`, this method uses the exact path you provide.\n * No automatic naming or prefix is applied.\n *\n * @param location - Full file path (directory + filename)\n * @param options - Save options (driver, validate)\n * @returns StorageFile instance with file metadata\n *\n * @example\n * ```typescript\n * await file.saveAs(\"avatars/profile-123.png\");\n * await file.saveAs(\"products/2025/featured-image.webp\");\n * ```\n */\n public async saveAs(location: string, options?: SaveAsOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Get the StorageFile reference if file has been saved\n *\n * Returns undefined if file hasn't been saved yet.\n */\n public get storageFile(): StorageFile | undefined {\n return this._storageFile;\n }\n\n // ============================================================\n // Internal Helpers\n // ============================================================\n\n /**\n * Execute save to the specified location\n * @internal\n */\n protected async saveToLocation(\n location: string,\n driver?: StorageDriverName,\n ): Promise<StorageFile> {\n // Get file content (apply transforms if image)\n const content = await this.getProcessedContent();\n\n // Select storage\n const storageInstance = this.resolveStorage(driver);\n\n // Determine final location (adjust extension if format changed)\n const finalLocation = this.adjustLocationForFormat(location);\n\n // Save to storage\n this._storageFile = await storageInstance.put(content, finalLocation, {\n mimeType: this.getFinalMimeType(),\n });\n\n // Store hash from StorageFile\n const info = await this._storageFile.data();\n this.hash = info.hash || \"\";\n\n return this._storageFile;\n }\n\n /**\n * Get processed content (with transforms applied if applicable)\n * @internal\n */\n protected async getProcessedContent(): Promise<Buffer> {\n const content = await this.buffer();\n\n // If not an image or no transforms, return as-is\n if (!this.isImage || !this.hasTransforms()) {\n return content;\n }\n\n // Create Image and apply transforms\n let img = new Image(content);\n\n // Apply transform callback or options\n if (typeof this._transformConfig === \"function\") {\n img = this._transformConfig(img);\n } else if (this._transformConfig) {\n img = img.apply(this._transformConfig);\n }\n\n // Apply high-level options on top\n img = this.applyImageOptions(img);\n\n return img.toBuffer();\n }\n\n /**\n * Apply high-level image options\n * @internal\n */\n protected applyImageOptions(img: Image): Image {\n const opts = this._imageOptions;\n\n if (opts.resize) {\n img = img.resize({ width: opts.resize.width, height: opts.resize.height });\n }\n\n if (opts.rotate !== undefined) {\n img = img.rotate(opts.rotate);\n }\n\n if (opts.blur !== undefined) {\n img = img.blur(opts.blur);\n }\n\n if (opts.grayscale) {\n img = img.grayscale();\n }\n\n if (opts.quality !== undefined) {\n img = img.quality(opts.quality);\n }\n\n if (opts.format) {\n img = img.format(opts.format);\n }\n\n return img;\n }\n\n /**\n * Check if any transforms are queued\n * @internal\n */\n protected hasTransforms(): boolean {\n return this._transformConfig !== undefined || Object.keys(this._imageOptions).length > 0;\n }\n\n /**\n * Resolve storage instance to use\n * @internal\n */\n protected resolveStorage(driver?: StorageDriverName): ScopedStorage | typeof storage {\n if (driver) {\n return storage.use(driver) as ScopedStorage;\n }\n\n return this._storage || storage;\n }\n\n /**\n * Resolve the filename based on options and config\n * @internal\n */\n protected resolveFilename(options?: SaveOptions): string {\n const namingStrategy: FileNamingStrategy = options?.name ?? uploadsConfig(\"name\") ?? \"random\";\n let baseName: string;\n\n if (namingStrategy === \"original\") {\n baseName = path.basename(this.name, path.extname(this.name));\n } else if (namingStrategy === \"random\") {\n const length = uploadsConfig(\"randomLength\");\n baseName = Random.string(length);\n } else {\n // Custom name - strip extension if provided, we'll add it\n baseName = path.basename(namingStrategy, path.extname(namingStrategy));\n }\n\n // Get extension (may be changed by format transform)\n const ext = this.getFinalExtension();\n\n return `${baseName}.${ext}`;\n }\n\n /**\n * Resolve prefix based on options and config\n * @internal\n */\n protected resolvePrefix(prefix?: PrefixConfig): string {\n // No prefix\n if (prefix === false || prefix === undefined) {\n const configPrefix = uploadsConfig(\"prefix\");\n if (!configPrefix) {\n return \"\";\n }\n // Use config prefix if no explicit prefix provided\n prefix = configPrefix;\n }\n\n // Boolean true = use default format\n if (prefix === true) {\n const format = uploadsConfig(\"defaultPrefixFormat\")!;\n return this.formatDatePrefix(format, \"file\");\n }\n\n // String = static prefix\n if (typeof prefix === \"string\") {\n return prefix;\n }\n\n // PrefixOptions object\n const parts: string[] = [];\n\n // Add date format if specified\n if (prefix.format) {\n parts.push(this.formatDate(prefix.format));\n }\n\n // Add random string if specified\n if (prefix.randomLength) {\n parts.push(Random.string(prefix.randomLength));\n }\n\n const combined = parts.join(\"-\");\n const as = prefix.as ?? \"file\";\n\n if (as === \"directory\") {\n return combined ? `${combined}/` : \"\";\n }\n\n return combined ? `${combined}-` : \"\";\n }\n\n /**\n * Format a date prefix with the given format\n * @internal\n */\n protected formatDatePrefix(format: string, as: \"file\" | \"directory\"): string {\n const formatted = this.formatDate(format);\n return as === \"directory\" ? `${formatted}/` : `${formatted}-`;\n }\n\n /**\n * Format current date using token-based format string\n * @internal\n */\n protected formatDate(format: string): string {\n return dayjs().format(format);\n }\n\n /**\n * Build final location from directory, prefix, and filename\n * @internal\n */\n protected buildLocation(directory: string, prefix: string, filename: string): string {\n // Clean up directory (remove trailing slash)\n const dir = directory.replace(/\\/$/, \"\");\n\n // If prefix ends with /, it's a directory\n if (prefix.endsWith(\"/\")) {\n return `${dir}/${prefix}${filename}`;\n }\n\n // Otherwise prefix is part of filename\n return `${dir}/${prefix}${filename}`;\n }\n\n /**\n * Get final extension (accounting for format changes)\n * @internal\n */\n protected getFinalExtension(): string {\n if (this._imageOptions.format) {\n // Map formats to extensions\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\") return \"jpg\";\n\n return format;\n }\n\n return this.extension;\n }\n\n /**\n * Get final MIME type (accounting for format changes)\n * @internal\n */\n protected getFinalMimeType(): string {\n if (this._imageOptions.format) {\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\" || format === \"jpg\") return \"image/jpeg\";\n\n return `image/${format}`;\n }\n\n return this.mimeType;\n }\n\n /**\n * Adjust location to use correct extension if format changed\n * @internal\n */\n protected adjustLocationForFormat(location: string): string {\n if (!this._imageOptions.format) {\n return location;\n }\n\n const ext = this.getFinalExtension();\n const currentExt = path.extname(location);\n\n if (currentExt) {\n return location.replace(currentExt, `.${ext}`);\n }\n\n return `${location}.${ext}`;\n }\n\n // ============================================================\n // Serialization\n // ============================================================\n\n /**\n * Convert to JSON representation\n *\n * Includes file metadata and base64 content for serialization.\n */\n public async toJSON() {\n return {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n isImage: this.isImage,\n isVideo: this.isVideo,\n isAudio: this.isAudio,\n dimensions: this.isImage ? await this.dimensions() : undefined,\n base64: (await this.buffer()).toString(\"base64\"),\n };\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"uploaded-file.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploaded-file.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport { Random } from \"@mongez/reinforcements\";\nimport dayjs from \"dayjs\";\nimport path from \"path\";\nimport { Image, type ImageFormat, type ImageTransformOptions } from \"../image\";\nimport { storage, type ScopedStorage, type StorageDriverName, type StorageFile } from \"../storage\";\nimport { sanitizePath } from \"../utils/paths\";\nimport { uploadsConfig } from \"./uploads-config\";\nimport type {\n FileNamingStrategy,\n ImageTransformCallback,\n PrefixConfig,\n SaveAsOptions,\n SaveOptions,\n UploadedFileImageOptions,\n} from \"./uploads-types\";\n\ntype UploadedFileMetadata = {\n name: string;\n mimeType: string;\n extension: string;\n size: number;\n width?: number;\n height?: number;\n};\n\n/**\n * Options for validating file before saving\n */\nexport type FileValidationOptions = {\n /**\n * List of allowed MIME types\n *\n * @example [\"image/jpeg\", \"image/png\", \"image/webp\"]\n */\n allowedMimeTypes?: string[];\n\n /**\n * List of allowed file extensions (without dot)\n *\n * @example [\"jpg\", \"jpeg\", \"png\", \"webp\"]\n */\n allowedExtensions?: string[];\n\n /**\n * Maximum file size in bytes\n *\n * @example 5 * 1024 * 1024 // 5MB\n */\n maxSize?: number;\n};\n\n/**\n * UploadedFile - Handles multipart file uploads with storage and image integration\n *\n * Provides a fluent API for validating, transforming, and saving uploaded files\n * to various storage drivers (local, S3, R2, etc.).\n *\n * @example\n * ```typescript\n * // Simple save with random name\n * const file = await uploadedFile.save(\"avatars\");\n *\n * // Original name with date prefix\n * const file = await uploadedFile.save(\"avatars\", {\n * name: \"original\",\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n *\n * // With image transformations\n * const file = await uploadedFile\n * .resize(800, 600)\n * .quality(85)\n * .format(\"webp\")\n * .save(\"avatars\");\n *\n * // Different storage driver\n * const file = await uploadedFile.use(\"s3\").save(\"avatars\");\n * ```\n */\nexport class UploadedFile {\n /**\n * File buffered content\n * @internal\n */\n protected bufferedFileContent?: Buffer;\n\n /**\n * Upload file hash (SHA-256)\n *\n * Populated after file is saved.\n */\n public hash = \"\";\n\n /**\n * Selected storage driver\n * @internal\n */\n protected _storage: ScopedStorage = storage;\n\n /**\n * Saved StorageFile reference\n * @internal\n */\n protected _storageFile?: StorageFile;\n\n /**\n * Queued image options (high-level API)\n * @internal\n */\n protected _imageOptions: UploadedFileImageOptions = {};\n\n /**\n * Full transform options or callback\n * @internal\n */\n protected _transformConfig?: ImageTransformOptions | ImageTransformCallback;\n\n /**\n * Create a new UploadedFile instance\n *\n * @param fileData - Multipart file data from Fastify\n * @throws Error if file data is invalid\n */\n public constructor(protected readonly fileData: MultipartFile) {\n if (!fileData?.filename) {\n throw new Error(\"Invalid file data: filename is required\");\n }\n }\n\n // ============================================================\n // File Properties\n // ============================================================\n\n /**\n * Get file name (sanitized)\n *\n * Returns the original filename with special characters removed/replaced.\n */\n public get name(): string {\n return sanitizePath(this.fileData.filename);\n }\n\n /**\n * Get file MIME type\n *\n * @example \"image/jpeg\", \"application/pdf\"\n */\n public get mimeType(): string {\n return this.fileData.mimetype;\n }\n\n /**\n * Get file extension (lowercase, without dot)\n *\n * @example \"jpg\", \"png\", \"pdf\"\n */\n public get extension(): string {\n return path.extname(this.fileData.filename).replace(\".\", \"\").toLowerCase();\n }\n\n /**\n * Get file metadata\n */\n public async metadata(): Promise<UploadedFileMetadata> {\n const data: UploadedFileMetadata = {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n };\n\n if (this.isImage) {\n const dimensions = await this.dimensions();\n data.width = dimensions.width;\n data.height = dimensions.height;\n }\n\n return data;\n }\n\n /**\n * Get file size in bytes\n *\n * Buffers the file content if not already buffered.\n */\n public async size(): Promise<number> {\n const file = await this.buffer();\n return file.length;\n }\n\n /**\n * Get file buffer\n *\n * Caches the buffer after first call for efficiency.\n */\n public async buffer(): Promise<Buffer> {\n if (this.bufferedFileContent) {\n return this.bufferedFileContent;\n }\n\n this.bufferedFileContent = await this.fileData.toBuffer();\n return this.bufferedFileContent;\n }\n\n // ============================================================\n // File Type Checks\n // ============================================================\n\n /**\n * Check if file is an image based on MIME type\n */\n public get isImage(): boolean {\n return this.mimeType.startsWith(\"image\");\n }\n\n /**\n * Check if file is a video based on MIME type\n */\n public get isVideo(): boolean {\n return this.mimeType.startsWith(\"video\");\n }\n\n /**\n * Check if file is an audio based on MIME type\n */\n public get isAudio(): boolean {\n return this.mimeType.startsWith(\"audio\");\n }\n\n // ============================================================\n // Storage Driver Selection\n // ============================================================\n\n /**\n * Select a specific storage driver for this upload\n *\n * Returns this instance for chaining. The driver is used\n * when `save()` or `saveAs()` is called.\n *\n * @param driver - Driver name from storage configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.use(\"s3\").save(\"avatars\");\n * await file.use(\"r2\").save(\"cdn/images\");\n * ```\n */\n public use(driver: StorageDriverName): this {\n this._storage = storage.use(driver) as ScopedStorage;\n return this;\n }\n\n // ============================================================\n // High-Level Image Transform API\n // ============================================================\n\n /**\n * Resize the image before saving\n *\n * Only applies to image files. Non-image files ignore this.\n *\n * @param width - Target width in pixels\n * @param height - Optional target height (maintains aspect ratio if omitted)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.resize(800).save(\"thumbnails\");\n * await file.resize(400, 400).save(\"avatars\");\n * ```\n */\n public resize(width: number, height?: number): this {\n this._imageOptions.resize = { width, height };\n return this;\n }\n\n /**\n * Set image output quality\n *\n * Quality affects file size and visual fidelity.\n * Only applies to formats that support quality (JPEG, WebP, AVIF).\n *\n * @param value - Quality value (1-100)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.quality(85).save(\"images\");\n * ```\n */\n public quality(value: number): this {\n if (value < 1 || value > 100) {\n throw new Error(\"Quality must be between 1 and 100\");\n }\n this._imageOptions.quality = value;\n return this;\n }\n\n /**\n * Convert image to a specific format\n *\n * Changes the output format and updates the file extension accordingly.\n *\n * @param format - Target image format (jpeg, png, webp, avif, etc.)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.format(\"webp\").save(\"images\");\n * await file.resize(800).format(\"avif\").quality(80).save(\"optimized\");\n * ```\n */\n public format(format: ImageFormat): this {\n this._imageOptions.format = format;\n return this;\n }\n\n /**\n * Rotate the image\n *\n * @param degrees - Rotation angle in degrees (positive = clockwise)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.rotate(90).save(\"rotated\");\n * ```\n */\n public rotate(degrees: number): this {\n this._imageOptions.rotate = degrees;\n return this;\n }\n\n /**\n * Apply blur effect to the image\n *\n * @param sigma - Blur intensity (default: 3, minimum: 0.3)\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.blur(5).save(\"blurred\");\n * ```\n */\n public blur(sigma = 3): this {\n if (sigma < 0.3) {\n throw new Error(\"Blur sigma must be at least 0.3\");\n }\n this._imageOptions.blur = sigma;\n return this;\n }\n\n /**\n * Convert image to grayscale (black and white)\n *\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * await file.grayscale().save(\"bw-images\");\n * ```\n */\n public grayscale(): this {\n this._imageOptions.grayscale = true;\n return this;\n }\n\n // ============================================================\n // Full Transform Control\n // ============================================================\n\n /**\n * Apply full image transformations\n *\n * Provides complete control over image processing. Can be used with:\n * - An options object for predefined transforms\n * - A callback function for chained operations\n *\n * @param config - Transform options or callback function\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * // Using options object\n * await file.transform({\n * resize: { width: 800, fit: \"inside\" },\n * quality: 85\n * }).save(\"images\");\n *\n * // Using callback for full control\n * await file.transform(img =>\n * img.resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .sharpen()\n * ).save(\"products\");\n * ```\n */\n public transform(config: ImageTransformOptions | ImageTransformCallback): this {\n this._transformConfig = config;\n return this;\n }\n\n /**\n * Get an Image instance for advanced manipulation\n *\n * Returns an Image instance from the file buffer for manual processing.\n * Use this when you need operations not covered by the fluent API.\n *\n * @returns Promise resolving to Image instance\n *\n * @example\n * ```typescript\n * const img = await file.toImage();\n * await img\n * .resize({ width: 800 })\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\n * .save(\"path/to/output.jpg\");\n * ```\n */\n public async toImage(): Promise<Image> {\n return new Image(await this.buffer());\n }\n\n // ============================================================\n // Image Metadata\n // ============================================================\n\n /**\n * Get file width and height (only for images)\n *\n * @returns Dimensions object, or empty object if not an image\n */\n public async dimensions(): Promise<{ width?: number; height?: number }> {\n if (!this.isImage) {\n return {};\n }\n\n return new Image(await this.buffer()).dimensions();\n }\n\n // ============================================================\n // Validation\n // ============================================================\n\n /**\n * Validate file against the given options\n *\n * @param options - Validation rules\n * @throws Error if validation fails\n *\n * @example\n * ```typescript\n * await file.validate({\n * allowedMimeTypes: [\"image/jpeg\", \"image/png\"],\n * maxSize: 5 * 1024 * 1024 // 5MB\n * });\n * ```\n */\n public async validate(options: FileValidationOptions): Promise<void> {\n const { allowedMimeTypes, allowedExtensions, maxSize } = options;\n\n if (allowedMimeTypes && !allowedMimeTypes.includes(this.mimeType)) {\n throw new Error(\n `Invalid file type: ${this.mimeType}. Allowed types: ${allowedMimeTypes.join(\", \")}`,\n );\n }\n\n if (allowedExtensions && !allowedExtensions.includes(this.extension)) {\n throw new Error(\n `Invalid file extension: ${this.extension}. Allowed extensions: ${allowedExtensions.join(\", \")}`,\n );\n }\n\n if (maxSize) {\n const fileSize = await this.size();\n if (fileSize > maxSize) {\n throw new Error(`File too large: ${fileSize} bytes. Maximum allowed: ${maxSize} bytes`);\n }\n }\n }\n\n // ============================================================\n // Save Operations\n // ============================================================\n\n /**\n * Save the file to a directory with automatic naming\n * Keep in mind to use only relative path to the root of storage\n * If you are using local driver\n * Uses the configured naming strategy and prefix options to generate\n * the final path. Returns a StorageFile for accessing file metadata.\n *\n * @param directory - Target directory path\n * @param options - Save options (name, prefix, driver, validate)\n * @returns StorageFile instance with file metadata and operations\n *\n * @example\n * ```typescript\n * // Random name (default)\n * await file.save(\"avatars\");\n * // → avatars/x7k9m2p4.jpg\n *\n * // Original name\n * await file.save(\"avatars\", { name: \"original\" });\n * // → avatars/photo.jpg\n *\n * // With date directory\n * await file.save(\"avatars\", {\n * prefix: { format: \"yyyy/mm/dd\", as: \"directory\" }\n * });\n * // → avatars/2025/12/21/x7k9m2p4.jpg\n *\n * // Original name with datetime prefix\n * await file.save(\"avatars\", { name: \"original\", prefix: true });\n * // → avatars/21-12-2025-16-45-30-photo.jpg\n * ```\n */\n public async save(directory: string, options?: SaveOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n // Resolve filename and prefix\n const filename = this.resolveFilename(options);\n const prefix = this.resolvePrefix(options?.prefix);\n const location = this.buildLocation(directory, prefix, filename);\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Save the file to an explicit path\n *\n * Unlike `save()`, this method uses the exact path you provide.\n * No automatic naming or prefix is applied.\n *\n * @param location - Full file path (directory + filename)\n * @param options - Save options (driver, validate)\n * @returns StorageFile instance with file metadata\n *\n * @example\n * ```typescript\n * await file.saveAs(\"avatars/profile-123.png\");\n * await file.saveAs(\"products/2025/featured-image.webp\");\n * ```\n */\n public async saveAs(location: string, options?: SaveAsOptions): Promise<StorageFile> {\n // Validate if requested\n if (options?.validate) {\n await this.validate(options.validate);\n }\n\n return this.saveToLocation(location, options?.driver);\n }\n\n /**\n * Get the StorageFile reference if file has been saved\n *\n * Returns undefined if file hasn't been saved yet.\n */\n public get storageFile(): StorageFile | undefined {\n return this._storageFile;\n }\n\n // ============================================================\n // Internal Helpers\n // ============================================================\n\n /**\n * Execute save to the specified location\n * @internal\n */\n protected async saveToLocation(\n location: string,\n driver?: StorageDriverName,\n ): Promise<StorageFile> {\n // Get file content (apply transforms if image)\n const content = await this.getProcessedContent();\n\n // Select storage\n const storageInstance = this.resolveStorage(driver);\n\n // Determine final location (adjust extension if format changed)\n const finalLocation = this.adjustLocationForFormat(location);\n\n // Save to storage\n this._storageFile = await storageInstance.put(content, finalLocation, {\n mimeType: this.getFinalMimeType(),\n });\n\n // Store hash from StorageFile\n const info = await this._storageFile.data();\n this.hash = info.hash || \"\";\n\n return this._storageFile;\n }\n\n /**\n * Get processed content (with transforms applied if applicable)\n * @internal\n */\n protected async getProcessedContent(): Promise<Buffer> {\n const content = await this.buffer();\n\n // If not an image or no transforms, return as-is\n if (!this.isImage || !this.hasTransforms()) {\n return content;\n }\n\n // Create Image and apply transforms\n let img = new Image(content);\n\n // Apply transform callback or options\n if (typeof this._transformConfig === \"function\") {\n img = this._transformConfig(img);\n } else if (this._transformConfig) {\n img = img.apply(this._transformConfig);\n }\n\n // Apply high-level options on top\n img = this.applyImageOptions(img);\n\n return img.toBuffer();\n }\n\n /**\n * Apply high-level image options\n * @internal\n */\n protected applyImageOptions(img: Image): Image {\n const opts = this._imageOptions;\n\n if (opts.resize) {\n img = img.resize({ width: opts.resize.width, height: opts.resize.height });\n }\n\n if (opts.rotate !== undefined) {\n img = img.rotate(opts.rotate);\n }\n\n if (opts.blur !== undefined) {\n img = img.blur(opts.blur);\n }\n\n if (opts.grayscale) {\n img = img.grayscale();\n }\n\n if (opts.quality !== undefined) {\n img = img.quality(opts.quality);\n }\n\n if (opts.format) {\n img = img.format(opts.format);\n }\n\n return img;\n }\n\n /**\n * Check if any transforms are queued\n * @internal\n */\n protected hasTransforms(): boolean {\n return this._transformConfig !== undefined || Object.keys(this._imageOptions).length > 0;\n }\n\n /**\n * Resolve storage instance to use\n * @internal\n */\n protected resolveStorage(driver?: StorageDriverName): ScopedStorage | typeof storage {\n if (driver) {\n return storage.use(driver) as ScopedStorage;\n }\n\n return this._storage || storage;\n }\n\n /**\n * Resolve the filename based on options and config\n * @internal\n */\n protected resolveFilename(options?: SaveOptions): string {\n const namingStrategy: FileNamingStrategy = options?.name ?? uploadsConfig(\"name\") ?? \"random\";\n let baseName: string;\n\n if (namingStrategy === \"original\") {\n baseName = path.basename(this.name, path.extname(this.name));\n } else if (namingStrategy === \"random\") {\n const length = uploadsConfig(\"randomLength\");\n baseName = Random.string(length);\n } else {\n // Custom name - strip extension if provided, we'll add it\n baseName = path.basename(namingStrategy, path.extname(namingStrategy));\n }\n\n // Get extension (may be changed by format transform)\n const ext = this.getFinalExtension();\n\n return `${baseName}.${ext}`;\n }\n\n /**\n * Resolve prefix based on options and config\n * @internal\n */\n protected resolvePrefix(prefix?: PrefixConfig): string {\n // No prefix\n if (prefix === false || prefix === undefined) {\n const configPrefix = uploadsConfig(\"prefix\");\n if (!configPrefix) {\n return \"\";\n }\n // Use config prefix if no explicit prefix provided\n prefix = configPrefix;\n }\n\n // Boolean true = use default format\n if (prefix === true) {\n const format = uploadsConfig(\"defaultPrefixFormat\")!;\n return this.formatDatePrefix(format, \"file\");\n }\n\n // String = static prefix\n if (typeof prefix === \"string\") {\n return prefix;\n }\n\n // PrefixOptions object\n const parts: string[] = [];\n\n // Add date format if specified\n if (prefix.format) {\n parts.push(this.formatDate(prefix.format));\n }\n\n // Add random string if specified\n if (prefix.randomLength) {\n parts.push(Random.string(prefix.randomLength));\n }\n\n const combined = parts.join(\"-\");\n const as = prefix.as ?? \"file\";\n\n if (as === \"directory\") {\n return combined ? `${combined}/` : \"\";\n }\n\n return combined ? `${combined}-` : \"\";\n }\n\n /**\n * Format a date prefix with the given format\n * @internal\n */\n protected formatDatePrefix(format: string, as: \"file\" | \"directory\"): string {\n const formatted = this.formatDate(format);\n return as === \"directory\" ? `${formatted}/` : `${formatted}-`;\n }\n\n /**\n * Format current date using token-based format string\n * @internal\n */\n protected formatDate(format: string): string {\n return dayjs().format(format);\n }\n\n /**\n * Build final location from directory, prefix, and filename\n * @internal\n */\n protected buildLocation(directory: string, prefix: string, filename: string): string {\n // Clean up directory (remove trailing slash)\n const dir = directory.replace(/\\/$/, \"\");\n\n // If prefix ends with /, it's a directory\n if (prefix.endsWith(\"/\")) {\n return `${dir}/${prefix}${filename}`;\n }\n\n // Otherwise prefix is part of filename\n return `${dir}/${prefix}${filename}`;\n }\n\n /**\n * Get final extension (accounting for format changes)\n * @internal\n */\n protected getFinalExtension(): string {\n if (this._imageOptions.format) {\n // Map formats to extensions\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\") return \"jpg\";\n\n return format;\n }\n\n return this.extension;\n }\n\n /**\n * Get final MIME type (accounting for format changes)\n * @internal\n */\n protected getFinalMimeType(): string {\n if (this._imageOptions.format) {\n const format = this._imageOptions.format;\n\n if (format === \"jpeg\" || format === \"jpg\") return \"image/jpeg\";\n\n return `image/${format}`;\n }\n\n return this.mimeType;\n }\n\n /**\n * Adjust location to use correct extension if format changed\n * @internal\n */\n protected adjustLocationForFormat(location: string): string {\n if (!this._imageOptions.format) {\n return location;\n }\n\n const ext = this.getFinalExtension();\n const currentExt = path.extname(location);\n\n if (currentExt) {\n return location.replace(currentExt, `.${ext}`);\n }\n\n return `${location}.${ext}`;\n }\n\n // ============================================================\n // Serialization\n // ============================================================\n\n /**\n * Convert to JSON representation\n *\n * Includes file metadata and base64 content for serialization.\n */\n public async toJSON() {\n return {\n name: this.name,\n mimeType: this.mimeType,\n extension: this.extension,\n size: await this.size(),\n isImage: this.isImage,\n isVideo: this.isVideo,\n isAudio: this.isAudio,\n dimensions: this.isImage ? await this.dimensions() : undefined,\n base64: (await this.buffer()).toString(\"base64\"),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads-config.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"uploads-config.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploads-config.ts"],"mappings":";;;;;AASA;;;;cAAa,gBAAA,EAAkB,qBAQ9B;AAkBD;;;;;;;;;;;;;;;;AAAA,iBAAgB,aAAA,iBAA8B,qBAAA,EAC5C,GAAA,EAAK,CAAA,EACL,YAAA,GAAe,qBAAA,CAAsB,CAAA,IACpC,qBAAA,CAAsB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads-config.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"uploads-config.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploads-config.ts"],"sourcesContent":["import { config } from \"../config\";\nimport type { UploadsConfigurations } from \"./uploads-types\";\n\n/**\n * Default uploads configuration values\n *\n * These defaults are used when no configuration is provided\n * or when specific keys are missing from the app config.\n */\nexport const UPLOADS_DEFAULTS: UploadsConfigurations = {\n name: \"random\",\n randomLength: 32,\n prefix: {\n as: \"directory\",\n format: \"DD-MM-YYYY\",\n },\n // defaultPrefixFormat: \"DD-MM-YYYY-HH-II-SS\",\n};\n\n/**\n * Get uploads configuration value\n *\n * Retrieves a configuration value from the `uploads` section of app config,\n * falling back to the provided default or the built-in default.\n *\n * @param key - Configuration key to retrieve\n * @param defaultValue - Optional default value if not found\n * @returns The configuration value\n *\n * @example\n * ```typescript\n * const naming = uploadsConfig(\"name\"); // \"random\" or \"original\"\n * const length = uploadsConfig(\"randomLength\", 32);\n * ```\n */\nexport function uploadsConfig<K extends keyof UploadsConfigurations>(\n key: K,\n defaultValue?: UploadsConfigurations[K],\n): UploadsConfigurations[K] {\n const fallback = defaultValue ?? UPLOADS_DEFAULTS[key];\n return config.key(`uploads.${key}`, fallback);\n}\n"],"mappings":";;;;;;;;;;AASA,MAAa,mBAA0C;CACrD,MAAM;CACN,cAAc;CACd,QAAQ;EACN,IAAI;EACJ,QAAQ;CACV;AAEF;;;;;;;;;;;;;;;;;AAkBA,SAAgB,cACd,KACA,cAC0B;CAC1B,MAAM,WAAW,gBAAgB,iBAAiB;CAClD,OAAO,OAAO,IAAI,WAAW,OAAO,QAAQ;AAC9C"}
|
|
@@ -2,7 +2,7 @@ import { StorageDriverName } from "../storage/types.mjs";
|
|
|
2
2
|
import { Image, ImageFormat, ImageTransformOptions } from "../image/image.mjs";
|
|
3
3
|
import { FileValidationOptions } from "./uploaded-file.mjs";
|
|
4
4
|
|
|
5
|
-
//#region
|
|
5
|
+
//#region ../@warlock.js/core/src/http/uploads-types.d.ts
|
|
6
6
|
/**
|
|
7
7
|
* Prefix options for file path generation
|
|
8
8
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploads-types.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"uploads-types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/http/uploads-types.ts"],"mappings":";;;;;;;;;AAyBA;;;;;;;;AAiCI;AAWJ;;;;AAA2D;AAS3D;;;KArDY,aAAA;EAqDkB;AAoB9B;;;;;;;;;;;;EA3DE,MAAA;EAyFA;;;;;AAOgC;AAQlC;;EA9FE,YAAA;EA8F0B;AAAgB;AAiB5C;;;;;EAtGE,EAAA;AAAA;;AAsGwD;AAS1D;;;;AAAiF;AAgBjF;KApHY,YAAA,sBAAkC,aAAa;;;;;;;;KAS/C,kBAAA;AAyIS;AAQrB;;;;;;;;;;;;;;AA6BW;;;AArCU,KArHT,WAAA;;;;;;;;;;EAUV,IAAA,GAAO,kBAAA;;;;;;;;;;EAWP,MAAA,GAAS,YAAA;;;;;;;;EAST,MAAA,GAAS,iBAAA;;;;;;EAOT,QAAA,GAAW,qBAAA;AAAA;;;;;;KAQD,aAAA,GAAgB,IAAI,CAAC,WAAA;;;;;;;;;;;;;;;;KAiBrB,sBAAA,IAA0B,GAAA,EAAK,KAAA,KAAU,KAAK;;;;;;;;KAS9C,oBAAA,GAAuB,qBAAA,GAAwB,sBAAsB;;;;;;;;;;;;;;;KAgBrE,qBAAA;;;;;;EAMV,IAAA;;;;;;EAOA,YAAA;;;;;;;;;EAUA,MAAA,GAAS,YAAY;;;;;;EAOrB,mBAAA;AAAA;;;;;;KAQU,wBAAA;;;;EAIV,MAAA;IAAW,KAAA;IAAe,MAAA;EAAA;;;;EAK1B,OAAA;;;;EAKA,MAAA,GAAS,WAAW;;;;EAKpB,MAAA;;;;EAKA,IAAA;;;;EAKA,SAAA;AAAA"}
|
package/esm/image/image.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"image.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/image/image.ts"],"mappings":"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"}
|
package/esm/image/image.mjs
CHANGED
package/esm/image/image.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/image/image.ts"],"sourcesContent":["import { http } from \"@mongez/http\";\r\nimport type sharp from \"sharp\";\r\nimport type { FormatEnum } from \"sharp\";\r\n\r\n// ============================================================\r\n// Eager-loaded Sharp Module\r\n// ============================================================\r\n\r\n/**\r\n * Installation instructions for sharp\r\n */\r\nconst SHARP_INSTALL_INSTRUCTIONS = `\r\nImage processing requires the sharp package.\r\nInstall it with:\r\n\r\n warlock add image\r\n\r\nOr manually:\r\n\r\n npm install sharp\r\n pnpm add sharp\r\n yarn add sharp\r\n`.trim();\r\n\r\n/**\r\n * Module availability flag\r\n */\r\nlet moduleExists: boolean | null = null;\r\n\r\n/**\r\n * Cached sharp function (loaded at import time)\r\n */\r\nlet sharpFn: typeof sharp;\r\n\r\n/**\r\n * Eagerly load sharp module at import time\r\n */\r\nasync function loadSharpModule() {\r\n try {\r\n const module = await import(\"sharp\");\r\n sharpFn = module.default;\r\n moduleExists = true;\r\n } catch {\r\n moduleExists = false;\r\n }\r\n}\r\n\r\n// Kick off eager loading immediately\r\nloadSharpModule();\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\nexport type ImageFormat = keyof FormatEnum;\r\n\r\nexport type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;\r\n\r\n/**\r\n * Watermark configuration for deferred execution\r\n */\r\nexport type WatermarkConfig = {\r\n image: ImageInput | Image;\r\n options: sharp.OverlayOptions;\r\n};\r\n\r\n/**\r\n * Operation descriptor for deferred pipeline execution.\r\n * All operations are stored and executed at save/toBuffer time.\r\n */\r\ntype ImageOperation =\r\n | { type: \"resize\"; options: sharp.ResizeOptions }\r\n | { type: \"crop\"; options: sharp.Region }\r\n | { type: \"rotate\"; angle: number }\r\n | { type: \"flip\" }\r\n | { type: \"flop\" }\r\n | { type: \"blur\"; sigma: number }\r\n | { type: \"sharpen\"; options?: sharp.SharpenOptions }\r\n | { type: \"blackAndWhite\" }\r\n | { type: \"opacity\"; value: number }\r\n | { type: \"negate\"; options?: sharp.NegateOptions }\r\n | { type: \"tint\"; color: sharp.Color }\r\n | { type: \"trim\"; options?: sharp.TrimOptions }\r\n | { type: \"watermark\"; config: WatermarkConfig }\r\n | { type: \"watermarks\"; configs: WatermarkConfig[] };\r\n\r\n/**\r\n * Transformation options that can be applied in batch via `apply()` method.\r\n *\r\n * **Execution Order (when using apply()):**\r\n * 1. resize - Resize first to work with correct dimensions\r\n * 2. crop - Crop after resize to extract the desired region\r\n * 3. rotate - Rotation after sizing\r\n * 4. flip/flop - Mirror operations\r\n * 5. blackAndWhite/grayscale - Color space conversion\r\n * 6. blur - Blur effect\r\n * 7. sharpen - Sharpen effect\r\n * 8. tint - Color overlay\r\n * 9. negate - Invert colors\r\n * 10. opacity - Transparency (applied via composite)\r\n * 11. format/quality - Applied on save/export\r\n */\r\nexport type ImageTransformOptions = {\r\n /**\r\n * Output quality (1-100), applied based on final format\r\n */\r\n quality?: number;\r\n /**\r\n * Output format (jpeg, png, webp, avif, etc.)\r\n */\r\n format?: ImageFormat;\r\n /**\r\n * Resize options\r\n */\r\n resize?: sharp.ResizeOptions;\r\n /**\r\n * Crop/extract region\r\n */\r\n crop?: sharp.Region;\r\n /**\r\n * Rotation angle in degrees\r\n */\r\n rotate?: number;\r\n /**\r\n * Flip vertically (top to bottom)\r\n */\r\n flip?: boolean;\r\n /**\r\n * Flop horizontally (left to right)\r\n */\r\n flop?: boolean;\r\n /**\r\n * Convert to black and white\r\n */\r\n blackAndWhite?: boolean;\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n grayscale?: boolean;\r\n /**\r\n * Blur sigma (must be >= 0.3)\r\n */\r\n blur?: number;\r\n /**\r\n * Sharpen options\r\n */\r\n sharpen?: sharp.SharpenOptions | boolean;\r\n /**\r\n * Tint color\r\n */\r\n tint?: sharp.Color;\r\n /**\r\n * Negate/invert colors\r\n */\r\n negate?: sharp.NegateOptions | boolean;\r\n /**\r\n * Opacity (0-100)\r\n */\r\n opacity?: number;\r\n /**\r\n * Trim options\r\n */\r\n trim?: sharp.TrimOptions | boolean;\r\n /**\r\n * Single watermark\r\n */\r\n watermark?: WatermarkConfig;\r\n /**\r\n * Multiple watermarks\r\n */\r\n watermarks?: WatermarkConfig[];\r\n};\r\n\r\n/**\r\n * Internal options stored for deferred application\r\n */\r\ntype InternalOptions = {\r\n quality?: number;\r\n format?: ImageFormat;\r\n};\r\n\r\n/**\r\n * Image manipulation class with deferred pipeline execution.\r\n *\r\n * **Important:** This class requires the `sharp` package to be installed.\r\n * Install it with: `warlock add image` or `npm install sharp`\r\n *\r\n * Sharp is lazy-loaded on the first async operation (save, toBuffer, etc.),\r\n * so the constructor and all chainable methods remain synchronous.\r\n *\r\n * All operations are synchronous and stored as descriptors.\r\n * The pipeline is executed only when calling output methods:\r\n * - `save()` - Save to file\r\n * - `toBuffer()` - Get as buffer\r\n * - `toBase64()` - Get as base64 string\r\n * - `toDataUrl()` - Get as data URL\r\n *\r\n * @example\r\n * ```typescript\r\n * // All chaining is synchronous - single await at the end\r\n * await new Image(\"photo.jpg\")\r\n * .resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .quality(85)\r\n * .save(\"output.jpg\");\r\n * ```\r\n */\r\nexport class Image {\r\n /**\r\n * Image options that will be applied on save/export\r\n */\r\n protected options: InternalOptions = {};\r\n\r\n /**\r\n * Deferred operations pipeline\r\n */\r\n protected operations: ImageOperation[] = [];\r\n\r\n /**\r\n * Cached metadata to avoid repeated async calls\r\n */\r\n protected cachedMetadata: sharp.Metadata | null = null;\r\n\r\n /**\r\n * Whether the pipeline has been executed\r\n */\r\n protected pipelineExecuted = false;\r\n\r\n /**\r\n * Sharp image object\r\n */\r\n public readonly image: sharp.Sharp;\r\n\r\n /**\r\n * Formats that support quality option\r\n */\r\n protected static readonly QUALITY_FORMATS = [\"jpeg\", \"jpg\", \"webp\", \"avif\", \"tiff\", \"heif\"];\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(image: ImageInput | sharp.Sharp) {\r\n if (moduleExists === false) {\r\n throw new Error(`sharp is not installed.\\n\\n${SHARP_INSTALL_INSTRUCTIONS}`);\r\n }\r\n\r\n // Check if it's already a sharp instance\r\n if (image instanceof Object && \"clone\" in image && typeof image.clone === \"function\") {\r\n this.image = image as sharp.Sharp;\r\n } else {\r\n this.image = sharpFn(image as ImageInput);\r\n }\r\n }\r\n\r\n /**\r\n * Create image instance from file path\r\n */\r\n public static fromFile(path: string): Image {\r\n return new Image(path);\r\n }\r\n\r\n /**\r\n * Create image instance from buffer\r\n */\r\n public static fromBuffer(buffer: Buffer): Image {\r\n return new Image(buffer);\r\n }\r\n\r\n /**\r\n * Create image instance from url\r\n */\r\n public static async fromUrl(url: string): Promise<Image> {\r\n const { data, error } = await http.get<ArrayBuffer>(url, {\r\n responseType: \"arrayBuffer\",\r\n });\r\n\r\n if (error || !data) {\r\n throw new Error(\r\n `Failed to load image from URL \"${url}\": ${error?.message ?? \"Empty response received\"}`,\r\n );\r\n }\r\n\r\n return new Image(Buffer.from(data));\r\n }\r\n\r\n /**\r\n * Add an operation to the deferred pipeline\r\n */\r\n protected addOperation(operation: ImageOperation): this {\r\n this.operations.push(operation);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply multiple transformations at once with a predefined execution order.\r\n *\r\n * This method ensures transformations are applied in a logical order:\r\n * resize → crop → rotate → flip/flop → colorspace → effects → opacity → format\r\n *\r\n * For custom ordering, use individual chained methods instead.\r\n */\r\n public apply(options: ImageTransformOptions): this {\r\n // 1. Resize first to work with correct dimensions\r\n if (options.resize) {\r\n this.resize(options.resize);\r\n }\r\n\r\n // 2. Crop after resize\r\n if (options.crop) {\r\n this.crop(options.crop);\r\n }\r\n\r\n // 3. Rotation\r\n if (options.rotate !== undefined) {\r\n this.rotate(options.rotate);\r\n }\r\n\r\n // 4. Mirror operations\r\n if (options.flip) {\r\n this.flip();\r\n }\r\n\r\n if (options.flop) {\r\n this.flop();\r\n }\r\n\r\n // 5. Color space conversion\r\n if (options.blackAndWhite || options.grayscale) {\r\n this.blackAndWhite();\r\n }\r\n\r\n // 6. Blur effect\r\n if (options.blur !== undefined) {\r\n this.blur(options.blur);\r\n }\r\n\r\n // 7. Sharpen effect\r\n if (options.sharpen) {\r\n const sharpenOptions = typeof options.sharpen === \"boolean\" ? undefined : options.sharpen;\r\n this.sharpen(sharpenOptions);\r\n }\r\n\r\n // 8. Tint color\r\n if (options.tint) {\r\n this.tint(options.tint);\r\n }\r\n\r\n // 9. Negate/invert\r\n if (options.negate) {\r\n const negateOptions = typeof options.negate === \"boolean\" ? undefined : options.negate;\r\n this.negate(negateOptions);\r\n }\r\n\r\n // 10. Trim edges\r\n if (options.trim) {\r\n const trimOptions = typeof options.trim === \"boolean\" ? undefined : options.trim;\r\n this.trim(trimOptions);\r\n }\r\n\r\n // 11. Watermarks\r\n if (options.watermark) {\r\n this.watermark(options.watermark.image, options.watermark.options);\r\n }\r\n\r\n if (options.watermarks) {\r\n this.watermarks(options.watermarks);\r\n }\r\n\r\n // 12. Opacity (applied via composite)\r\n if (options.opacity !== undefined) {\r\n this.opacity(options.opacity);\r\n }\r\n\r\n // 13. Store format/quality for deferred application\r\n if (options.format) {\r\n this.format(options.format);\r\n }\r\n\r\n if (options.quality !== undefined) {\r\n this.quality(options.quality);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set image opacity (0-100)\r\n */\r\n public opacity(value: number): this {\r\n if (value < 0 || value > 100) {\r\n throw new Error(\"Opacity must be between 0 and 100\");\r\n }\r\n\r\n return this.addOperation({ type: \"opacity\", value });\r\n }\r\n\r\n /**\r\n * Convert image to black and white\r\n */\r\n public blackAndWhite(): this {\r\n return this.addOperation({ type: \"blackAndWhite\" });\r\n }\r\n\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n public grayscale(): this {\r\n return this.blackAndWhite();\r\n }\r\n\r\n /**\r\n * Get image dimensions (cached after first call)\r\n */\r\n public async dimensions(): Promise<{\r\n width: number | undefined;\r\n height: number | undefined;\r\n }> {\r\n const metadata = await this.metadata();\r\n\r\n return { width: metadata.width, height: metadata.height };\r\n }\r\n\r\n /**\r\n * Get image metadata (cached after first call)\r\n *\r\n * The metadata is cached to avoid repeated async operations.\r\n * Use `refreshMetadata()` to force a fresh fetch.\r\n */\r\n public async metadata(): Promise<sharp.Metadata> {\r\n if (!this.cachedMetadata) {\r\n this.cachedMetadata = await this.image.metadata();\r\n }\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Force refresh of cached metadata\r\n *\r\n * Call this after transformations if you need updated metadata.\r\n */\r\n public async refreshMetadata(): Promise<sharp.Metadata> {\r\n this.cachedMetadata = await this.image.metadata();\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Clear cached metadata\r\n */\r\n public clearMetadataCache(): this {\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resize image\r\n */\r\n public resize(options: sharp.ResizeOptions): this {\r\n if (typeof options.width !== \"undefined\" && !options.width) {\r\n delete options.width;\r\n }\r\n\r\n if (typeof options.height !== \"undefined\" && !options.height) {\r\n delete options.height;\r\n }\r\n\r\n return this.addOperation({ type: \"resize\", options });\r\n }\r\n\r\n /**\r\n * Crop/extract a region from the image\r\n */\r\n public crop(options: sharp.Region): this {\r\n return this.addOperation({ type: \"crop\", options });\r\n }\r\n\r\n /**\r\n * Set image quality (1-100)\r\n * Quality is stored and applied when saving/exporting\r\n * based on the final format.\r\n */\r\n public quality(quality: number): this {\r\n if (quality < 1 || quality > 100) {\r\n throw new Error(\"Quality must be between 1 and 100\");\r\n }\r\n\r\n this.options.quality = quality;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the deferred pipeline - apply all stored operations\r\n */\r\n protected async executePipeline(): Promise<sharp.Sharp> {\r\n if (this.pipelineExecuted) {\r\n return this.image;\r\n }\r\n\r\n for (const operation of this.operations) {\r\n await this.executeOperation(this.image, operation);\r\n }\r\n\r\n await this.applyFormatAndQuality(this.image);\r\n\r\n this.pipelineExecuted = true;\r\n\r\n return this.image;\r\n }\r\n\r\n /**\r\n * Execute a single operation\r\n */\r\n protected async executeOperation(image: sharp.Sharp, operation: ImageOperation): Promise<void> {\r\n switch (operation.type) {\r\n case \"resize\":\r\n image.resize(operation.options);\r\n break;\r\n\r\n case \"crop\":\r\n image.extract(operation.options);\r\n break;\r\n\r\n case \"rotate\":\r\n image.rotate(operation.angle);\r\n break;\r\n\r\n case \"flip\":\r\n image.flip();\r\n break;\r\n\r\n case \"flop\":\r\n image.flop();\r\n break;\r\n\r\n case \"blur\":\r\n image.blur(operation.sigma);\r\n break;\r\n\r\n case \"sharpen\":\r\n image.sharpen(operation.options);\r\n break;\r\n\r\n case \"blackAndWhite\":\r\n image.toColourspace(\"b-w\");\r\n break;\r\n\r\n case \"opacity\": {\r\n const alpha = Math.round((operation.value / 100) * 255);\r\n const alphaPixel = Buffer.from([255, 255, 255, alpha]);\r\n image.composite([\r\n {\r\n blend: \"dest-in\",\r\n input: alphaPixel,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"negate\":\r\n image.negate(operation.options);\r\n break;\r\n\r\n case \"tint\":\r\n image.tint(operation.color);\r\n break;\r\n\r\n case \"trim\":\r\n image.trim(operation.options);\r\n break;\r\n\r\n case \"watermark\": {\r\n const buffer = await this.resolveImageBuffer(operation.config.image);\r\n image.composite([\r\n {\r\n input: buffer,\r\n ...operation.config.options,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"watermarks\": {\r\n const buffers = await Promise.all(\r\n operation.configs.map((config) => this.resolveImageBuffer(config.image)),\r\n );\r\n image.composite(\r\n operation.configs.map((config, index) => ({\r\n input: buffers[index],\r\n ...config.options,\r\n })),\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve an image input to a buffer\r\n */\r\n protected async resolveImageBuffer(input: ImageInput | Image): Promise<Buffer> {\r\n if (input instanceof Image) {\r\n // For Image instances, get buffer without applying options (raw buffer)\r\n return input.image.toBuffer();\r\n }\r\n\r\n // For other inputs (path, buffer, etc.), create temp sharp instance\r\n const tempImage = sharpFn(input);\r\n\r\n return tempImage.toBuffer();\r\n }\r\n\r\n /**\r\n * Apply format and quality options.\r\n * If no format is explicitly set, preserves the original format and applies\r\n * quality appropriately based on the format type.\r\n */\r\n protected async applyFormatAndQuality(image: sharp.Sharp): Promise<void> {\r\n const { quality, format } = this.options;\r\n\r\n if (format) {\r\n // Explicit format specified\r\n const formatOptions = quality ? { quality } : undefined;\r\n image.toFormat(format, formatOptions);\r\n return;\r\n }\r\n\r\n if (quality === undefined) {\r\n // No quality or format set, nothing to apply\r\n return;\r\n }\r\n\r\n // Quality is set but no format specified - detect original format\r\n const metadata = await this.metadata();\r\n const originalFormat = metadata.format;\r\n\r\n if (!originalFormat) {\r\n // Cannot detect format, default to webp with quality\r\n image.webp({ quality });\r\n return;\r\n }\r\n\r\n // Apply quality based on original format\r\n if (Image.QUALITY_FORMATS.includes(originalFormat)) {\r\n // Format supports quality option\r\n image.toFormat(originalFormat as ImageFormat, { quality });\r\n } else if (originalFormat === \"png\") {\r\n // PNG uses compressionLevel (0-9) instead of quality\r\n // Map quality 1-100 to compressionLevel 9-0 (higher quality = lower compression)\r\n const compressionLevel = Math.round(9 - (quality / 100) * 9);\r\n image.png({ compressionLevel });\r\n } else if (originalFormat === \"gif\") {\r\n // GIF doesn't support quality, just preserve format\r\n image.gif();\r\n }\r\n // Unknown format: preserve as-is (no quality applied)\r\n }\r\n\r\n /**\r\n * Save to file\r\n */\r\n public async save(path: string): Promise<sharp.OutputInfo> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Convert to webp and save to file\r\n */\r\n public async saveAsWebp(path: string): Promise<sharp.OutputInfo> {\r\n // Override format to webp\r\n this.options.format = \"webp\";\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Change the file format\r\n */\r\n public format(format: ImageFormat): this {\r\n this.options.format = format;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add watermark (deferred - executed at save time)\r\n */\r\n public watermark(image: ImageInput | Image, options: sharp.OverlayOptions = {}): this {\r\n return this.addOperation({\r\n type: \"watermark\",\r\n config: { image, options },\r\n });\r\n }\r\n\r\n /**\r\n * Add multiple watermarks (deferred - executed at save time)\r\n */\r\n public watermarks(configs: WatermarkConfig[]): this {\r\n return this.addOperation({\r\n type: \"watermarks\",\r\n configs,\r\n });\r\n }\r\n\r\n /**\r\n * Rotate image\r\n */\r\n public rotate(angle: number): this {\r\n return this.addOperation({ type: \"rotate\", angle });\r\n }\r\n\r\n /**\r\n * Flip image vertically (top to bottom)\r\n */\r\n public flip(): this {\r\n return this.addOperation({ type: \"flip\" });\r\n }\r\n\r\n /**\r\n * Flop image horizontally (left to right)\r\n */\r\n public flop(): this {\r\n return this.addOperation({ type: \"flop\" });\r\n }\r\n\r\n /**\r\n * Blur image\r\n */\r\n public blur(sigma: number): this {\r\n if (sigma < 0.3) {\r\n throw new Error(\"Blur sigma must be at least 0.3\");\r\n }\r\n\r\n return this.addOperation({ type: \"blur\", sigma });\r\n }\r\n\r\n /**\r\n * Convert to base64\r\n */\r\n public async toBase64(): Promise<string> {\r\n const image = await this.executePipeline();\r\n const buffer = await image.toBuffer();\r\n\r\n return buffer.toString(\"base64\");\r\n }\r\n\r\n /**\r\n * Convert to data URL (base64 with mime type prefix)\r\n */\r\n public async toDataUrl(): Promise<string> {\r\n const metadata = await this.metadata();\r\n const format = this.options.format || metadata.format || \"png\";\r\n const mimeType = `image/${format === \"jpg\" ? \"jpeg\" : format}`;\r\n const base64 = await this.toBase64();\r\n\r\n return `data:${mimeType};base64,${base64}`;\r\n }\r\n\r\n /**\r\n * Sharpen image\r\n */\r\n public sharpen(options?: sharp.SharpenOptions): this {\r\n return this.addOperation({ type: \"sharpen\", options });\r\n }\r\n\r\n /**\r\n * Negate/invert image colors\r\n */\r\n public negate(options?: sharp.NegateOptions): this {\r\n return this.addOperation({ type: \"negate\", options });\r\n }\r\n\r\n /**\r\n * Tint image with a color\r\n */\r\n public tint(color: sharp.Color): this {\r\n return this.addOperation({ type: \"tint\", color });\r\n }\r\n\r\n /**\r\n * Trim edges from the image\r\n */\r\n public trim(options?: sharp.TrimOptions): this {\r\n return this.addOperation({ type: \"trim\", options });\r\n }\r\n\r\n /**\r\n * Convert to buffer\r\n */\r\n public async toBuffer(): Promise<Buffer> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toBuffer();\r\n }\r\n\r\n /**\r\n * Clone the image for separate transformations\r\n */\r\n public clone(): Image {\r\n const clonedImage = new Image(this.image.clone());\r\n clonedImage.options = { ...this.options };\r\n clonedImage.operations = [...this.operations];\r\n clonedImage.cachedMetadata = this.cachedMetadata ? { ...this.cachedMetadata } : null;\r\n\r\n return clonedImage;\r\n }\r\n\r\n /**\r\n * Get the current stored options\r\n */\r\n public getOptions(): Readonly<InternalOptions> {\r\n return { ...this.options };\r\n }\r\n\r\n /**\r\n * Get the pending operations count\r\n */\r\n public getPendingOperationsCount(): number {\r\n return this.operations.length;\r\n }\r\n\r\n /**\r\n * Reset all stored options\r\n */\r\n public resetOptions(): this {\r\n this.options = {};\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clear all pending operations\r\n */\r\n public clearOperations(): this {\r\n this.operations = [];\r\n this.pipelineExecuted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset the image to its initial state (clear operations and options)\r\n */\r\n public reset(): this {\r\n this.operations = [];\r\n this.options = {};\r\n this.pipelineExecuted = false;\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"image.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/image/image.ts"],"sourcesContent":["import { http } from \"@mongez/http\";\r\nimport type sharp from \"sharp\";\r\nimport type { FormatEnum } from \"sharp\";\r\n\r\n// ============================================================\r\n// Eager-loaded Sharp Module\r\n// ============================================================\r\n\r\n/**\r\n * Installation instructions for sharp\r\n */\r\nconst SHARP_INSTALL_INSTRUCTIONS = `\r\nImage processing requires the sharp package.\r\nInstall it with:\r\n\r\n warlock add image\r\n\r\nOr manually:\r\n\r\n npm install sharp\r\n pnpm add sharp\r\n yarn add sharp\r\n`.trim();\r\n\r\n/**\r\n * Module availability flag\r\n */\r\nlet moduleExists: boolean | null = null;\r\n\r\n/**\r\n * Cached sharp function (loaded at import time)\r\n */\r\nlet sharpFn: typeof sharp;\r\n\r\n/**\r\n * Eagerly load sharp module at import time\r\n */\r\nasync function loadSharpModule() {\r\n try {\r\n const module = await import(\"sharp\");\r\n sharpFn = module.default;\r\n moduleExists = true;\r\n } catch {\r\n moduleExists = false;\r\n }\r\n}\r\n\r\n// Kick off eager loading immediately\r\nloadSharpModule();\r\n\r\n// ============================================================\r\n// Types\r\n// ============================================================\r\n\r\nexport type ImageFormat = keyof FormatEnum;\r\n\r\nexport type ImageInput = string | Buffer | Uint8Array | ArrayBuffer;\r\n\r\n/**\r\n * Watermark configuration for deferred execution\r\n */\r\nexport type WatermarkConfig = {\r\n image: ImageInput | Image;\r\n options: sharp.OverlayOptions;\r\n};\r\n\r\n/**\r\n * Operation descriptor for deferred pipeline execution.\r\n * All operations are stored and executed at save/toBuffer time.\r\n */\r\ntype ImageOperation =\r\n | { type: \"resize\"; options: sharp.ResizeOptions }\r\n | { type: \"crop\"; options: sharp.Region }\r\n | { type: \"rotate\"; angle: number }\r\n | { type: \"flip\" }\r\n | { type: \"flop\" }\r\n | { type: \"blur\"; sigma: number }\r\n | { type: \"sharpen\"; options?: sharp.SharpenOptions }\r\n | { type: \"blackAndWhite\" }\r\n | { type: \"opacity\"; value: number }\r\n | { type: \"negate\"; options?: sharp.NegateOptions }\r\n | { type: \"tint\"; color: sharp.Color }\r\n | { type: \"trim\"; options?: sharp.TrimOptions }\r\n | { type: \"watermark\"; config: WatermarkConfig }\r\n | { type: \"watermarks\"; configs: WatermarkConfig[] };\r\n\r\n/**\r\n * Transformation options that can be applied in batch via `apply()` method.\r\n *\r\n * **Execution Order (when using apply()):**\r\n * 1. resize - Resize first to work with correct dimensions\r\n * 2. crop - Crop after resize to extract the desired region\r\n * 3. rotate - Rotation after sizing\r\n * 4. flip/flop - Mirror operations\r\n * 5. blackAndWhite/grayscale - Color space conversion\r\n * 6. blur - Blur effect\r\n * 7. sharpen - Sharpen effect\r\n * 8. tint - Color overlay\r\n * 9. negate - Invert colors\r\n * 10. opacity - Transparency (applied via composite)\r\n * 11. format/quality - Applied on save/export\r\n */\r\nexport type ImageTransformOptions = {\r\n /**\r\n * Output quality (1-100), applied based on final format\r\n */\r\n quality?: number;\r\n /**\r\n * Output format (jpeg, png, webp, avif, etc.)\r\n */\r\n format?: ImageFormat;\r\n /**\r\n * Resize options\r\n */\r\n resize?: sharp.ResizeOptions;\r\n /**\r\n * Crop/extract region\r\n */\r\n crop?: sharp.Region;\r\n /**\r\n * Rotation angle in degrees\r\n */\r\n rotate?: number;\r\n /**\r\n * Flip vertically (top to bottom)\r\n */\r\n flip?: boolean;\r\n /**\r\n * Flop horizontally (left to right)\r\n */\r\n flop?: boolean;\r\n /**\r\n * Convert to black and white\r\n */\r\n blackAndWhite?: boolean;\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n grayscale?: boolean;\r\n /**\r\n * Blur sigma (must be >= 0.3)\r\n */\r\n blur?: number;\r\n /**\r\n * Sharpen options\r\n */\r\n sharpen?: sharp.SharpenOptions | boolean;\r\n /**\r\n * Tint color\r\n */\r\n tint?: sharp.Color;\r\n /**\r\n * Negate/invert colors\r\n */\r\n negate?: sharp.NegateOptions | boolean;\r\n /**\r\n * Opacity (0-100)\r\n */\r\n opacity?: number;\r\n /**\r\n * Trim options\r\n */\r\n trim?: sharp.TrimOptions | boolean;\r\n /**\r\n * Single watermark\r\n */\r\n watermark?: WatermarkConfig;\r\n /**\r\n * Multiple watermarks\r\n */\r\n watermarks?: WatermarkConfig[];\r\n};\r\n\r\n/**\r\n * Internal options stored for deferred application\r\n */\r\ntype InternalOptions = {\r\n quality?: number;\r\n format?: ImageFormat;\r\n};\r\n\r\n/**\r\n * Image manipulation class with deferred pipeline execution.\r\n *\r\n * **Important:** This class requires the `sharp` package to be installed.\r\n * Install it with: `warlock add image` or `npm install sharp`\r\n *\r\n * Sharp is lazy-loaded on the first async operation (save, toBuffer, etc.),\r\n * so the constructor and all chainable methods remain synchronous.\r\n *\r\n * All operations are synchronous and stored as descriptors.\r\n * The pipeline is executed only when calling output methods:\r\n * - `save()` - Save to file\r\n * - `toBuffer()` - Get as buffer\r\n * - `toBase64()` - Get as base64 string\r\n * - `toDataUrl()` - Get as data URL\r\n *\r\n * @example\r\n * ```typescript\r\n * // All chaining is synchronous - single await at the end\r\n * await new Image(\"photo.jpg\")\r\n * .resize({ width: 800 })\r\n * .watermark(\"logo.png\", { gravity: \"southeast\" })\r\n * .quality(85)\r\n * .save(\"output.jpg\");\r\n * ```\r\n */\r\nexport class Image {\r\n /**\r\n * Image options that will be applied on save/export\r\n */\r\n protected options: InternalOptions = {};\r\n\r\n /**\r\n * Deferred operations pipeline\r\n */\r\n protected operations: ImageOperation[] = [];\r\n\r\n /**\r\n * Cached metadata to avoid repeated async calls\r\n */\r\n protected cachedMetadata: sharp.Metadata | null = null;\r\n\r\n /**\r\n * Whether the pipeline has been executed\r\n */\r\n protected pipelineExecuted = false;\r\n\r\n /**\r\n * Sharp image object\r\n */\r\n public readonly image: sharp.Sharp;\r\n\r\n /**\r\n * Formats that support quality option\r\n */\r\n protected static readonly QUALITY_FORMATS = [\"jpeg\", \"jpg\", \"webp\", \"avif\", \"tiff\", \"heif\"];\r\n\r\n /**\r\n * Constructor\r\n */\r\n public constructor(image: ImageInput | sharp.Sharp) {\r\n if (moduleExists === false) {\r\n throw new Error(`sharp is not installed.\\n\\n${SHARP_INSTALL_INSTRUCTIONS}`);\r\n }\r\n\r\n // Check if it's already a sharp instance\r\n if (image instanceof Object && \"clone\" in image && typeof image.clone === \"function\") {\r\n this.image = image as sharp.Sharp;\r\n } else {\r\n this.image = sharpFn(image as ImageInput);\r\n }\r\n }\r\n\r\n /**\r\n * Create image instance from file path\r\n */\r\n public static fromFile(path: string): Image {\r\n return new Image(path);\r\n }\r\n\r\n /**\r\n * Create image instance from buffer\r\n */\r\n public static fromBuffer(buffer: Buffer): Image {\r\n return new Image(buffer);\r\n }\r\n\r\n /**\r\n * Create image instance from url\r\n */\r\n public static async fromUrl(url: string): Promise<Image> {\r\n const { data, error } = await http.get<ArrayBuffer>(url, {\r\n responseType: \"arrayBuffer\",\r\n });\r\n\r\n if (error || !data) {\r\n throw new Error(\r\n `Failed to load image from URL \"${url}\": ${error?.message ?? \"Empty response received\"}`,\r\n );\r\n }\r\n\r\n return new Image(Buffer.from(data));\r\n }\r\n\r\n /**\r\n * Add an operation to the deferred pipeline\r\n */\r\n protected addOperation(operation: ImageOperation): this {\r\n this.operations.push(operation);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Apply multiple transformations at once with a predefined execution order.\r\n *\r\n * This method ensures transformations are applied in a logical order:\r\n * resize → crop → rotate → flip/flop → colorspace → effects → opacity → format\r\n *\r\n * For custom ordering, use individual chained methods instead.\r\n */\r\n public apply(options: ImageTransformOptions): this {\r\n // 1. Resize first to work with correct dimensions\r\n if (options.resize) {\r\n this.resize(options.resize);\r\n }\r\n\r\n // 2. Crop after resize\r\n if (options.crop) {\r\n this.crop(options.crop);\r\n }\r\n\r\n // 3. Rotation\r\n if (options.rotate !== undefined) {\r\n this.rotate(options.rotate);\r\n }\r\n\r\n // 4. Mirror operations\r\n if (options.flip) {\r\n this.flip();\r\n }\r\n\r\n if (options.flop) {\r\n this.flop();\r\n }\r\n\r\n // 5. Color space conversion\r\n if (options.blackAndWhite || options.grayscale) {\r\n this.blackAndWhite();\r\n }\r\n\r\n // 6. Blur effect\r\n if (options.blur !== undefined) {\r\n this.blur(options.blur);\r\n }\r\n\r\n // 7. Sharpen effect\r\n if (options.sharpen) {\r\n const sharpenOptions = typeof options.sharpen === \"boolean\" ? undefined : options.sharpen;\r\n this.sharpen(sharpenOptions);\r\n }\r\n\r\n // 8. Tint color\r\n if (options.tint) {\r\n this.tint(options.tint);\r\n }\r\n\r\n // 9. Negate/invert\r\n if (options.negate) {\r\n const negateOptions = typeof options.negate === \"boolean\" ? undefined : options.negate;\r\n this.negate(negateOptions);\r\n }\r\n\r\n // 10. Trim edges\r\n if (options.trim) {\r\n const trimOptions = typeof options.trim === \"boolean\" ? undefined : options.trim;\r\n this.trim(trimOptions);\r\n }\r\n\r\n // 11. Watermarks\r\n if (options.watermark) {\r\n this.watermark(options.watermark.image, options.watermark.options);\r\n }\r\n\r\n if (options.watermarks) {\r\n this.watermarks(options.watermarks);\r\n }\r\n\r\n // 12. Opacity (applied via composite)\r\n if (options.opacity !== undefined) {\r\n this.opacity(options.opacity);\r\n }\r\n\r\n // 13. Store format/quality for deferred application\r\n if (options.format) {\r\n this.format(options.format);\r\n }\r\n\r\n if (options.quality !== undefined) {\r\n this.quality(options.quality);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set image opacity (0-100)\r\n */\r\n public opacity(value: number): this {\r\n if (value < 0 || value > 100) {\r\n throw new Error(\"Opacity must be between 0 and 100\");\r\n }\r\n\r\n return this.addOperation({ type: \"opacity\", value });\r\n }\r\n\r\n /**\r\n * Convert image to black and white\r\n */\r\n public blackAndWhite(): this {\r\n return this.addOperation({ type: \"blackAndWhite\" });\r\n }\r\n\r\n /**\r\n * Alias for blackAndWhite\r\n */\r\n public grayscale(): this {\r\n return this.blackAndWhite();\r\n }\r\n\r\n /**\r\n * Get image dimensions (cached after first call)\r\n */\r\n public async dimensions(): Promise<{\r\n width: number | undefined;\r\n height: number | undefined;\r\n }> {\r\n const metadata = await this.metadata();\r\n\r\n return { width: metadata.width, height: metadata.height };\r\n }\r\n\r\n /**\r\n * Get image metadata (cached after first call)\r\n *\r\n * The metadata is cached to avoid repeated async operations.\r\n * Use `refreshMetadata()` to force a fresh fetch.\r\n */\r\n public async metadata(): Promise<sharp.Metadata> {\r\n if (!this.cachedMetadata) {\r\n this.cachedMetadata = await this.image.metadata();\r\n }\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Force refresh of cached metadata\r\n *\r\n * Call this after transformations if you need updated metadata.\r\n */\r\n public async refreshMetadata(): Promise<sharp.Metadata> {\r\n this.cachedMetadata = await this.image.metadata();\r\n\r\n return this.cachedMetadata;\r\n }\r\n\r\n /**\r\n * Clear cached metadata\r\n */\r\n public clearMetadataCache(): this {\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Resize image\r\n */\r\n public resize(options: sharp.ResizeOptions): this {\r\n if (typeof options.width !== \"undefined\" && !options.width) {\r\n delete options.width;\r\n }\r\n\r\n if (typeof options.height !== \"undefined\" && !options.height) {\r\n delete options.height;\r\n }\r\n\r\n return this.addOperation({ type: \"resize\", options });\r\n }\r\n\r\n /**\r\n * Crop/extract a region from the image\r\n */\r\n public crop(options: sharp.Region): this {\r\n return this.addOperation({ type: \"crop\", options });\r\n }\r\n\r\n /**\r\n * Set image quality (1-100)\r\n * Quality is stored and applied when saving/exporting\r\n * based on the final format.\r\n */\r\n public quality(quality: number): this {\r\n if (quality < 1 || quality > 100) {\r\n throw new Error(\"Quality must be between 1 and 100\");\r\n }\r\n\r\n this.options.quality = quality;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Execute the deferred pipeline - apply all stored operations\r\n */\r\n protected async executePipeline(): Promise<sharp.Sharp> {\r\n if (this.pipelineExecuted) {\r\n return this.image;\r\n }\r\n\r\n for (const operation of this.operations) {\r\n await this.executeOperation(this.image, operation);\r\n }\r\n\r\n await this.applyFormatAndQuality(this.image);\r\n\r\n this.pipelineExecuted = true;\r\n\r\n return this.image;\r\n }\r\n\r\n /**\r\n * Execute a single operation\r\n */\r\n protected async executeOperation(image: sharp.Sharp, operation: ImageOperation): Promise<void> {\r\n switch (operation.type) {\r\n case \"resize\":\r\n image.resize(operation.options);\r\n break;\r\n\r\n case \"crop\":\r\n image.extract(operation.options);\r\n break;\r\n\r\n case \"rotate\":\r\n image.rotate(operation.angle);\r\n break;\r\n\r\n case \"flip\":\r\n image.flip();\r\n break;\r\n\r\n case \"flop\":\r\n image.flop();\r\n break;\r\n\r\n case \"blur\":\r\n image.blur(operation.sigma);\r\n break;\r\n\r\n case \"sharpen\":\r\n image.sharpen(operation.options);\r\n break;\r\n\r\n case \"blackAndWhite\":\r\n image.toColourspace(\"b-w\");\r\n break;\r\n\r\n case \"opacity\": {\r\n const alpha = Math.round((operation.value / 100) * 255);\r\n const alphaPixel = Buffer.from([255, 255, 255, alpha]);\r\n image.composite([\r\n {\r\n blend: \"dest-in\",\r\n input: alphaPixel,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"negate\":\r\n image.negate(operation.options);\r\n break;\r\n\r\n case \"tint\":\r\n image.tint(operation.color);\r\n break;\r\n\r\n case \"trim\":\r\n image.trim(operation.options);\r\n break;\r\n\r\n case \"watermark\": {\r\n const buffer = await this.resolveImageBuffer(operation.config.image);\r\n image.composite([\r\n {\r\n input: buffer,\r\n ...operation.config.options,\r\n },\r\n ]);\r\n break;\r\n }\r\n\r\n case \"watermarks\": {\r\n const buffers = await Promise.all(\r\n operation.configs.map((config) => this.resolveImageBuffer(config.image)),\r\n );\r\n image.composite(\r\n operation.configs.map((config, index) => ({\r\n input: buffers[index],\r\n ...config.options,\r\n })),\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Resolve an image input to a buffer\r\n */\r\n protected async resolveImageBuffer(input: ImageInput | Image): Promise<Buffer> {\r\n if (input instanceof Image) {\r\n // For Image instances, get buffer without applying options (raw buffer)\r\n return input.image.toBuffer();\r\n }\r\n\r\n // For other inputs (path, buffer, etc.), create temp sharp instance\r\n const tempImage = sharpFn(input);\r\n\r\n return tempImage.toBuffer();\r\n }\r\n\r\n /**\r\n * Apply format and quality options.\r\n * If no format is explicitly set, preserves the original format and applies\r\n * quality appropriately based on the format type.\r\n */\r\n protected async applyFormatAndQuality(image: sharp.Sharp): Promise<void> {\r\n const { quality, format } = this.options;\r\n\r\n if (format) {\r\n // Explicit format specified\r\n const formatOptions = quality ? { quality } : undefined;\r\n image.toFormat(format, formatOptions);\r\n return;\r\n }\r\n\r\n if (quality === undefined) {\r\n // No quality or format set, nothing to apply\r\n return;\r\n }\r\n\r\n // Quality is set but no format specified - detect original format\r\n const metadata = await this.metadata();\r\n const originalFormat = metadata.format;\r\n\r\n if (!originalFormat) {\r\n // Cannot detect format, default to webp with quality\r\n image.webp({ quality });\r\n return;\r\n }\r\n\r\n // Apply quality based on original format\r\n if (Image.QUALITY_FORMATS.includes(originalFormat)) {\r\n // Format supports quality option\r\n image.toFormat(originalFormat as ImageFormat, { quality });\r\n } else if (originalFormat === \"png\") {\r\n // PNG uses compressionLevel (0-9) instead of quality\r\n // Map quality 1-100 to compressionLevel 9-0 (higher quality = lower compression)\r\n const compressionLevel = Math.round(9 - (quality / 100) * 9);\r\n image.png({ compressionLevel });\r\n } else if (originalFormat === \"gif\") {\r\n // GIF doesn't support quality, just preserve format\r\n image.gif();\r\n }\r\n // Unknown format: preserve as-is (no quality applied)\r\n }\r\n\r\n /**\r\n * Save to file\r\n */\r\n public async save(path: string): Promise<sharp.OutputInfo> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Convert to webp and save to file\r\n */\r\n public async saveAsWebp(path: string): Promise<sharp.OutputInfo> {\r\n // Override format to webp\r\n this.options.format = \"webp\";\r\n const image = await this.executePipeline();\r\n\r\n return image.toFile(path);\r\n }\r\n\r\n /**\r\n * Change the file format\r\n */\r\n public format(format: ImageFormat): this {\r\n this.options.format = format;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Add watermark (deferred - executed at save time)\r\n */\r\n public watermark(image: ImageInput | Image, options: sharp.OverlayOptions = {}): this {\r\n return this.addOperation({\r\n type: \"watermark\",\r\n config: { image, options },\r\n });\r\n }\r\n\r\n /**\r\n * Add multiple watermarks (deferred - executed at save time)\r\n */\r\n public watermarks(configs: WatermarkConfig[]): this {\r\n return this.addOperation({\r\n type: \"watermarks\",\r\n configs,\r\n });\r\n }\r\n\r\n /**\r\n * Rotate image\r\n */\r\n public rotate(angle: number): this {\r\n return this.addOperation({ type: \"rotate\", angle });\r\n }\r\n\r\n /**\r\n * Flip image vertically (top to bottom)\r\n */\r\n public flip(): this {\r\n return this.addOperation({ type: \"flip\" });\r\n }\r\n\r\n /**\r\n * Flop image horizontally (left to right)\r\n */\r\n public flop(): this {\r\n return this.addOperation({ type: \"flop\" });\r\n }\r\n\r\n /**\r\n * Blur image\r\n */\r\n public blur(sigma: number): this {\r\n if (sigma < 0.3) {\r\n throw new Error(\"Blur sigma must be at least 0.3\");\r\n }\r\n\r\n return this.addOperation({ type: \"blur\", sigma });\r\n }\r\n\r\n /**\r\n * Convert to base64\r\n */\r\n public async toBase64(): Promise<string> {\r\n const image = await this.executePipeline();\r\n const buffer = await image.toBuffer();\r\n\r\n return buffer.toString(\"base64\");\r\n }\r\n\r\n /**\r\n * Convert to data URL (base64 with mime type prefix)\r\n */\r\n public async toDataUrl(): Promise<string> {\r\n const metadata = await this.metadata();\r\n const format = this.options.format || metadata.format || \"png\";\r\n const mimeType = `image/${format === \"jpg\" ? \"jpeg\" : format}`;\r\n const base64 = await this.toBase64();\r\n\r\n return `data:${mimeType};base64,${base64}`;\r\n }\r\n\r\n /**\r\n * Sharpen image\r\n */\r\n public sharpen(options?: sharp.SharpenOptions): this {\r\n return this.addOperation({ type: \"sharpen\", options });\r\n }\r\n\r\n /**\r\n * Negate/invert image colors\r\n */\r\n public negate(options?: sharp.NegateOptions): this {\r\n return this.addOperation({ type: \"negate\", options });\r\n }\r\n\r\n /**\r\n * Tint image with a color\r\n */\r\n public tint(color: sharp.Color): this {\r\n return this.addOperation({ type: \"tint\", color });\r\n }\r\n\r\n /**\r\n * Trim edges from the image\r\n */\r\n public trim(options?: sharp.TrimOptions): this {\r\n return this.addOperation({ type: \"trim\", options });\r\n }\r\n\r\n /**\r\n * Convert to buffer\r\n */\r\n public async toBuffer(): Promise<Buffer> {\r\n const image = await this.executePipeline();\r\n\r\n return image.toBuffer();\r\n }\r\n\r\n /**\r\n * Clone the image for separate transformations\r\n */\r\n public clone(): Image {\r\n const clonedImage = new Image(this.image.clone());\r\n clonedImage.options = { ...this.options };\r\n clonedImage.operations = [...this.operations];\r\n clonedImage.cachedMetadata = this.cachedMetadata ? { ...this.cachedMetadata } : null;\r\n\r\n return clonedImage;\r\n }\r\n\r\n /**\r\n * Get the current stored options\r\n */\r\n public getOptions(): Readonly<InternalOptions> {\r\n return { ...this.options };\r\n }\r\n\r\n /**\r\n * Get the pending operations count\r\n */\r\n public getPendingOperationsCount(): number {\r\n return this.operations.length;\r\n }\r\n\r\n /**\r\n * Reset all stored options\r\n */\r\n public resetOptions(): this {\r\n this.options = {};\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Clear all pending operations\r\n */\r\n public clearOperations(): this {\r\n this.operations = [];\r\n this.pipelineExecuted = false;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Reset the image to its initial state (clear operations and options)\r\n */\r\n public reset(): this {\r\n this.operations = [];\r\n this.options = {};\r\n this.pipelineExecuted = false;\r\n this.cachedMetadata = null;\r\n\r\n return this;\r\n }\r\n}\r\n"],"mappings":"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"}
|
package/esm/index.d.mts
CHANGED
|
@@ -59,6 +59,7 @@ import { displayEnvironmentMode } from "./bootstrap/setup.mjs";
|
|
|
59
59
|
import { DatabaseCacheDriver, DatabaseCacheOptions } from "./cache/database-cache-driver.mjs";
|
|
60
60
|
import { Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority } from "./connectors/types.mjs";
|
|
61
61
|
import { BaseConnector } from "./connectors/base-connector.mjs";
|
|
62
|
+
import { AccessConnector } from "./connectors/access-connector.mjs";
|
|
62
63
|
import { CacheConnector } from "./connectors/cache-connector.mjs";
|
|
63
64
|
import { HeraldConnector } from "./connectors/herald-connector.mjs";
|
|
64
65
|
import { ConnectorsManager, connectorsManager } from "./connectors/connectors-manager.mjs";
|
|
@@ -66,6 +67,7 @@ import { DatabaseConnector } from "./connectors/database-connector.mjs";
|
|
|
66
67
|
import { HttpConnector } from "./connectors/http-connector.mjs";
|
|
67
68
|
import { LoggerConnector } from "./connectors/logger-connector.mjs";
|
|
68
69
|
import { MailerConnector } from "./connectors/mail-connector.mjs";
|
|
70
|
+
import { NotificationsConnector } from "./connectors/notifications-connector.mjs";
|
|
69
71
|
import { SocketConnector } from "./connectors/socket-connector.mjs";
|
|
70
72
|
import { StorageConnector } from "./connectors/storage.connector.mjs";
|
|
71
73
|
import { CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CommandActionData, ResolvedCLICommandOption } from "./cli/types.mjs";
|
|
@@ -136,13 +138,14 @@ import { uniqueExceptCurrentUserRule } from "./validation/database/unique-except
|
|
|
136
138
|
import { FileValidator, uploadedFileMetadataSchema } from "./validation/validators/file-validator.mjs";
|
|
137
139
|
import { ValidationConfiguration } from "./validation/types.mjs";
|
|
138
140
|
import { fileExtensionRule, fileRule, fileTypeRule, imageRule } from "./validation/file/file.mjs";
|
|
141
|
+
import { DecoratorLoweringPlugin, lowerStage3Decorators } from "./vite/lower-stage3-decorators.mjs";
|
|
139
142
|
import { WarlockConfig } from "./warlock-config/types.mjs";
|
|
140
143
|
import { defineConfig } from "./warlock-config/define-config.mjs";
|
|
141
144
|
import { WarlockConfigManager, isUnknownTsExtensionError, warlockConfigManager } from "./warlock-config/warlock-config.manager.mjs";
|
|
142
145
|
import { env } from "@mongez/dotenv";
|
|
143
146
|
import { colors } from "@mongez/copper";
|
|
144
147
|
export * from "@mongez/localization";
|
|
145
|
-
export { $registerUseCase, $unregisterUseCase, AllRepositoryOptions, AppConfigurations, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, type BenchmarkChannel, type BenchmarkConfigurations, type BenchmarkErrorResult, type BenchmarkOptions, BenchmarkProfiler, type BenchmarkProfilerOptions, type BenchmarkResult, BenchmarkSnapshots, type BenchmarkSnapshotsOptions, type BenchmarkStats, type BenchmarkSuccessResult, CLICommand, CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CacheConnector, type CacheMiddlewareOptions, CachedRepositoryOptions, type CapturedMail, CascadeAdapter, CascadeQueryBuilder, ChunkCallback, CloudDriver, CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, CommandActionData, type ConcurrencyLimitOptions, ConfigKey, ConfigKeyRegistry, ConfigName, ConfigRegistry, ConfigSpecialHandlers, ConflictError, Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority, ConnectorsManager, ConsoleChannel, ContainerTypes, CookieOptions, CursorPaginationOptions, CursorPaginationResult, DOSpacesDriver, DatabaseCacheDriver, type DatabaseCacheOptions, DatabaseConnector, DatabaseLog, DatabaseLogModel, DatabaseLogOptions, DefineResourceOptions, DeleteManyResult, EncryptionConfigurations, EncryptionPasswordConfigurations, Environment, EslintHealthChecker, EventSubscription, ExistsExceptCurrentIdRuleOptions, ExistsExceptCurrentUserRuleOptions, FastifyInstance, FileNamingStrategy, FileValidationOptions, FileValidator, FileVisibility, FilesOrchestrator, FilterFunction, FilterOperator, FilterOptions, FilterRule, FilterRules, ForbiddenError, GroupedRoutesOptions, HeraldConnector, HttpConfigurations, HttpConnector, HttpError, HttpErrorCodes, type IdempotencyOptions, Image, ImageFormat, ImageInput, ImageTransformCallback, ImageTransformConfig, ImageTransformOptions, type IpFilterOptions, ListOptions, LocalDriver, LocalStorageDriverOptions, LocalizedObject, LogConfigurations, LoggerConnector, MAIL_EVENTS, Mail, type MailAddress, type MailAttachment, type MailConfigurations, MailError, type MailErrorCode, type MailEvents, type MailMode, type MailOptions, type MailPriority, type MailResult, MailerConnector, type MailersConfig, type MaintenanceOptions, Middleware, MiddlewareResponse, MimeTypes, NoopChannel, type NormalizedMail, NotAcceptableError, NotAllowedError, PaginationMode, PaginationResult, PartialMiddleware, PartialPick, PipelineOptions, PrefixConfig, PrefixOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutOptions, QueryBuilderContract, Queue, R2Driver, R2StorageDriverOptions, type RateLimitOptions, RegisterResource, RegisteredUseCase, RepositoryAdapterContract, RepositoryConfigurations, RepositoryEvent, RepositoryManager, RepositoryOptions, RepositoryOptionsWithCursor, RepositoryOptionsWithPages, Request, RequestContextStore, RequestController, RequestControllerContract, RequestEvent, RequestHandler, RequestHandlerType, RequestHandlerValidation, RequestLog, RequestMethod, ResolvedCLICommandOption, Resource, ResourceArraySchema, ResourceCastType, ResourceConstructor, ResourceContract, ResourceFieldBuilder, ResourceFieldBuilderDateOutputOptions, ResourceFieldConfig, ResourceMethod, ResourceNotFoundError, ResourceOutputValueCastType, ResourceSchema, ResourceSelfReference, Response, ResponseBodyValue, ResponseEvent, ResponseSSEController, ResponseSchema, ResponseStatus, ResponseStreamController, Restful, RestfulMiddleware, ReturnedResponse, Route, RouteOptions, RouteResource, Router, RouterGroupCallback, RouterStacks, S3Driver, type SESConfigurations, type SMTPConfigurations, SaveAsOptions, SaveMode, SaveOptions, ScopedStorage, ScopedStorageContract, SeedResult, Seeder, SeederMetadata, SendBufferOptions, SendFileOptions, ServerError, SocketConnector, SocketOptions, Storage, StorageConfigurations, StorageConnector, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContextStore, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFile, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation, TypedAllRepositoryOptions, TypedRepositoryOptions, TypedRepositoryOptionsWithCursor, TypedRepositoryOptionsWithPages, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UniqueExceptCurrentIdRuleOptions, UniqueExceptCurrentUserRuleOptions, UploadedFile, UploadedFileImageOptions, UploadsConfigurations, UseCase, UseCaseAfterMiddleware, UseCaseBeforeMiddleware, UseCaseBroadcastChannel, UseCaseBroadcastEvent, UseCaseBroadcastOption, UseCaseConfigurations, UseCaseContext, UseCaseErrorResult, UseCaseEventsCallbacksMap, UseCaseGuard, UseCaseHandler, UseCaseOnExecutingContext, UseCaseResult, UseCaseRuntimeOptions, UseCaseWithSchema, ValidationConfiguration, WarlockConfig, WarlockConfigManager, WatermarkConfig, WhereOperator, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
|
|
148
|
+
export { $registerUseCase, $unregisterUseCase, AccessConnector, AllRepositoryOptions, AppConfigurations, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, type BenchmarkChannel, type BenchmarkConfigurations, type BenchmarkErrorResult, type BenchmarkOptions, BenchmarkProfiler, type BenchmarkProfilerOptions, type BenchmarkResult, BenchmarkSnapshots, type BenchmarkSnapshotsOptions, type BenchmarkStats, type BenchmarkSuccessResult, CLICommand, CLICommandAction, CLICommandOption, CLICommandOptions, CLICommandPreload, CLICommandSource, CacheConnector, type CacheMiddlewareOptions, CachedRepositoryOptions, type CapturedMail, CascadeAdapter, CascadeQueryBuilder, ChunkCallback, CloudDriver, CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, CommandActionData, type ConcurrencyLimitOptions, ConfigKey, ConfigKeyRegistry, ConfigName, ConfigRegistry, ConfigSpecialHandlers, ConflictError, Connector, ConnectorLifecyclePhase, ConnectorName, ConnectorPriority, ConnectorsManager, ConsoleChannel, ContainerTypes, CookieOptions, CursorPaginationOptions, CursorPaginationResult, DOSpacesDriver, DatabaseCacheDriver, type DatabaseCacheOptions, DatabaseConnector, DatabaseLog, DatabaseLogModel, DatabaseLogOptions, DecoratorLoweringPlugin, DefineResourceOptions, DeleteManyResult, EncryptionConfigurations, EncryptionPasswordConfigurations, Environment, EslintHealthChecker, EventSubscription, ExistsExceptCurrentIdRuleOptions, ExistsExceptCurrentUserRuleOptions, FastifyInstance, FileNamingStrategy, FileValidationOptions, FileValidator, FileVisibility, FilesOrchestrator, FilterFunction, FilterOperator, FilterOptions, FilterRule, FilterRules, ForbiddenError, GroupedRoutesOptions, HeraldConnector, HttpConfigurations, HttpConnector, HttpError, HttpErrorCodes, type IdempotencyOptions, Image, ImageFormat, ImageInput, ImageTransformCallback, ImageTransformConfig, ImageTransformOptions, type IpFilterOptions, ListOptions, LocalDriver, LocalStorageDriverOptions, LocalizedObject, LogConfigurations, LoggerConnector, MAIL_EVENTS, Mail, type MailAddress, type MailAttachment, type MailConfigurations, MailError, type MailErrorCode, type MailEvents, type MailMode, type MailOptions, type MailPriority, type MailResult, MailerConnector, type MailersConfig, type MaintenanceOptions, Middleware, MiddlewareResponse, MimeTypes, NoopChannel, type NormalizedMail, NotAcceptableError, NotAllowedError, NotificationsConnector, PaginationMode, PaginationResult, PartialMiddleware, PartialPick, PipelineOptions, PrefixConfig, PrefixOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutOptions, QueryBuilderContract, Queue, R2Driver, R2StorageDriverOptions, type RateLimitOptions, RegisterResource, RegisteredUseCase, RepositoryAdapterContract, RepositoryConfigurations, RepositoryEvent, RepositoryManager, RepositoryOptions, RepositoryOptionsWithCursor, RepositoryOptionsWithPages, Request, RequestContextStore, RequestController, RequestControllerContract, RequestEvent, RequestHandler, RequestHandlerType, RequestHandlerValidation, RequestLog, RequestMethod, ResolvedCLICommandOption, Resource, ResourceArraySchema, ResourceCastType, ResourceConstructor, ResourceContract, ResourceFieldBuilder, ResourceFieldBuilderDateOutputOptions, ResourceFieldConfig, ResourceMethod, ResourceNotFoundError, ResourceOutputValueCastType, ResourceSchema, ResourceSelfReference, Response, ResponseBodyValue, ResponseEvent, ResponseSSEController, ResponseSchema, ResponseStatus, ResponseStreamController, Restful, RestfulMiddleware, ReturnedResponse, Route, RouteOptions, RouteResource, Router, RouterGroupCallback, RouterStacks, S3Driver, type SESConfigurations, type SMTPConfigurations, SaveAsOptions, SaveMode, SaveOptions, ScopedStorage, ScopedStorageContract, SeedResult, Seeder, SeederMetadata, SendBufferOptions, SendFileOptions, ServerError, SocketConnector, SocketOptions, Storage, StorageConfigurations, StorageConnector, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContextStore, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFile, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation, TypedAllRepositoryOptions, TypedRepositoryOptions, TypedRepositoryOptionsWithCursor, TypedRepositoryOptionsWithPages, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UniqueExceptCurrentIdRuleOptions, UniqueExceptCurrentUserRuleOptions, UploadedFile, UploadedFileImageOptions, UploadsConfigurations, UseCase, UseCaseAfterMiddleware, UseCaseBeforeMiddleware, UseCaseBroadcastChannel, UseCaseBroadcastEvent, UseCaseBroadcastOption, UseCaseConfigurations, UseCaseContext, UseCaseErrorResult, UseCaseEventsCallbacksMap, UseCaseGuard, UseCaseHandler, UseCaseOnExecutingContext, UseCaseResult, UseCaseRuntimeOptions, UseCaseWithSchema, ValidationConfiguration, WarlockConfig, WarlockConfigManager, WatermarkConfig, WhereOperator, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, lowerStage3Decorators, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
|
|
146
149
|
import "./config/types.mjs";
|
|
147
150
|
import "./storage/types.mjs";
|
|
148
151
|
import "./validation/types.mjs";
|
package/esm/index.mjs
CHANGED
|
@@ -76,6 +76,7 @@ import "./cache/index.mjs";
|
|
|
76
76
|
import { CLICommand, command } from "./cli/cli-command.mjs";
|
|
77
77
|
import { ConnectorLifecyclePhase, ConnectorPriority } from "./connectors/types.mjs";
|
|
78
78
|
import { BaseConnector } from "./connectors/base-connector.mjs";
|
|
79
|
+
import { AccessConnector } from "./connectors/access-connector.mjs";
|
|
79
80
|
import { CacheConnector } from "./connectors/cache-connector.mjs";
|
|
80
81
|
import { HeraldConnector } from "./connectors/herald-connector.mjs";
|
|
81
82
|
import { DatabaseConnector } from "./connectors/database-connector.mjs";
|
|
@@ -93,6 +94,7 @@ import { sendMail } from "./mail/send-mail.mjs";
|
|
|
93
94
|
import { Mail } from "./mail/mail.mjs";
|
|
94
95
|
import "./mail/index.mjs";
|
|
95
96
|
import { MailerConnector } from "./connectors/mail-connector.mjs";
|
|
97
|
+
import { NotificationsConnector } from "./connectors/notifications-connector.mjs";
|
|
96
98
|
import { SocketConnector } from "./connectors/socket-connector.mjs";
|
|
97
99
|
import { StorageConnector } from "./connectors/storage.connector.mjs";
|
|
98
100
|
import { ConnectorsManager, connectorsManager } from "./connectors/connectors-manager.mjs";
|
|
@@ -135,6 +137,8 @@ import { $registerUseCase, $unregisterUseCase, addUseCaseHistory, getUseCase, ge
|
|
|
135
137
|
import { useCase } from "./use-cases/use-case.mjs";
|
|
136
138
|
import "./use-cases/index.mjs";
|
|
137
139
|
import "./validation/index.mjs";
|
|
140
|
+
import { lowerStage3Decorators } from "./vite/lower-stage3-decorators.mjs";
|
|
141
|
+
import "./vite/index.mjs";
|
|
138
142
|
import { defineConfig } from "./warlock-config/define-config.mjs";
|
|
139
143
|
import "./warlock-config/index.mjs";
|
|
140
144
|
import { env } from "@mongez/dotenv";
|
|
@@ -142,4 +146,4 @@ import { colors } from "@mongez/copper";
|
|
|
142
146
|
|
|
143
147
|
export * from "@mongez/localization"
|
|
144
148
|
|
|
145
|
-
export { $registerUseCase, $unregisterUseCase, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, BenchmarkProfiler, BenchmarkSnapshots, CLICommand, CacheConnector, CascadeAdapter, CascadeQueryBuilder, CloudDriver, ConfigSpecialHandlers, ConflictError, ConnectorLifecyclePhase, ConnectorPriority, ConnectorsManager, ConsoleChannel, DOSpacesDriver, DatabaseCacheDriver, DatabaseConnector, DatabaseLog, DatabaseLogModel, EslintHealthChecker, FileValidator, FilesOrchestrator, ForbiddenError, HeraldConnector, HttpConnector, HttpError, HttpErrorCodes, Image, LocalDriver, LoggerConnector, MAIL_EVENTS, Mail, MailError, MailerConnector, MimeTypes, NoopChannel, NotAcceptableError, NotAllowedError, Queue, R2Driver, RegisterResource, RepositoryManager, Request, RequestController, RequestLog, Resource, ResourceFieldBuilder, ResourceNotFoundError, Response, ResponseStatus, Restful, Router, S3Driver, ScopedStorage, ServerError, SocketConnector, Storage, StorageConnector, StorageFile, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UploadedFile, WarlockConfigManager, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
|
|
149
|
+
export { $registerUseCase, $unregisterUseCase, AccessConnector, Application, BadRequestError, BadSchemaUseCaseError, BaseConnector, BaseHealthChecker, BenchmarkProfiler, BenchmarkSnapshots, CLICommand, CacheConnector, CascadeAdapter, CascadeQueryBuilder, CloudDriver, ConfigSpecialHandlers, ConflictError, ConnectorLifecyclePhase, ConnectorPriority, ConnectorsManager, ConsoleChannel, DOSpacesDriver, DatabaseCacheDriver, DatabaseConnector, DatabaseLog, DatabaseLogModel, EslintHealthChecker, FileValidator, FilesOrchestrator, ForbiddenError, HeraldConnector, HttpConnector, HttpError, HttpErrorCodes, Image, LocalDriver, LoggerConnector, MAIL_EVENTS, Mail, MailError, MailerConnector, MimeTypes, NoopChannel, NotAcceptableError, NotAllowedError, NotificationsConnector, Queue, R2Driver, RegisterResource, RepositoryManager, Request, RequestController, RequestLog, Resource, ResourceFieldBuilder, ResourceNotFoundError, Response, ResponseStatus, Restful, Router, S3Driver, ScopedStorage, ServerError, SocketConnector, Storage, StorageConnector, StorageFile, TypescriptHealthChecker, UPLOADS_DEFAULTS, UnAuthorizedError, UploadedFile, WarlockConfigManager, addUseCaseHistory, anyMatch, app, appLog, appPath, assertMailCount, assertMailSent, assetsUrl, bootstrap, broadcastUseCaseResult, buildIdempotencyCacheKey, cachePath, captureMail, clearTestMailbox, closeAllMailers, closeMailer, colors, command, config, configPath, configSpecialHandlers, connectorsManager, container, createHttpApplication, createRequestStore, decrypt, defaultHttpConfigurations, defineConfig, defineResource, displayEnvironmentMode, encrypt, env, environment, existsExceptCurrentIdRule, existsExceptCurrentUserRule, expectJson, fileExtensionRule, fileRule, fileTypeRule, filesOrchestrator, findMailsBySubject, findMailsTo, fireLifecycleEvent, fromRequest, generateMailId, getDefaultMailConfig, getHttpServer, getLastMail, getLocalized, getMailEventName, getMailMode, getMailboxSize, getMailer, getMailerConfig, getMimeType, getPoolStats, getSocketServer, getTestMailbox, getTestServerUrl, getUseCase, getUseCaseHistory, getUseCases, globalEventsCallbacksMap, globalUseCasesEvents, hashBody, hashPassword, hmacHash, httpConfig, imageRule, increaseUseCaseFailedCalls, increaseUseCaseSuccessCalls, ipMatches, isDevelopmentMode, isProductionMode, isTestMode, isTestServerRunning, isUnknownTsExtensionError, isValidIdempotencyKey, loadS3, logResponse, logsPath, lowerStage3Decorators, mailEvents, measure, middleware, onCleanup, parseJsonResponse, parseSize, paths, promiseAllObject, publicPath, publicUrl, registerAppConfig, registerHttpPlugins, renderReact, renderReactMail, requestContext, resetMailConfig, resolveMailConfig, rootPath, router, runPipeline, sanitizePath, seeder, sendMail, setBaseUrl, setEnvironment, setLogConfigurations, setMailConfigurations, setMailMode, setupTest, sleep, sluggable, srcPath, startHttpServer, startHttpTestServer, stopHttpApplication, stopHttpTestServer, storage, storageConfig, storageConfigurations, storageDriverContext, storagePath, t, tempPath, testDelete, testGet, testPatch, testPost, testPut, testRequest, toJson, uniqueExceptCurrentIdRule, uniqueExceptCurrentUserRule, uploadedFileMetadataSchema, uploadsConfig, uploadsPath, uploadsUrl, url, useCase, useComputedModel, useComputedSlug, useCurrentUser, useHashedPassword, useRequest, useRequestStore, verifyMailer, verifyPassword, warlockConfigManager, warlockPath, wasMailSentTo, wasMailSentWithSubject, wrapResponseInDataKey };
|