@warlock.js/core 4.1.14 → 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +2 -2
- 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 +3 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +5 -2
- package/esm/index.mjs +6 -2
- 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 +1 -1
- 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 +1 -1
- 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/index.d.mts +1 -1
- package/esm/warlock-config/index.mjs +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 +20 -2
- package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs +39 -2
- package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
- package/llms-full.txt +66 -4
- package/llms.txt +1 -0
- package/package.json +9 -33
- package/skills/lower-stage3-decorators/SKILL.md +54 -0
- package/skills/run-app/SKILL.md +2 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/database/seeds/types.ts"],"mappings":";KAAY,UAAA;EACV,cAAc;AAAA;AAAA,KAGJ,cAAA;EACV,IAAA;EACA,SAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,mBAAA;EACA,qBAAA;AAAA"}
|
package/esm/database/utils.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { SchemaContext } from "@warlock.js/seal";
|
|
2
2
|
import { Model } from "@warlock.js/cascade";
|
|
3
3
|
|
|
4
|
-
//#region
|
|
4
|
+
//#region ../@warlock.js/core/src/database/utils.d.ts
|
|
5
5
|
/**
|
|
6
6
|
* Hash password on saving if password changes
|
|
7
7
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"utils.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/database/utils.ts"],"mappings":";;;;;;AASA;cAAa,iBAAA;AAAA,KASR,qBAAA,IACH,IAAA,OACA,KAAA,EAAO,KAAA,EACP,OAAA,EAAS,aAAA,WACA,OAAA;;AANP;AAAC;iBAWW,gBAAA,CAAiB,QAAA,EAAU,qBAAA,GAAqB,gBAAA;;;;iBAWhD,eAAA,CAAgB,KAAA,WAAiB,KAAA,0BAAuC,gBAAA"}
|
package/esm/database/utils.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { slugify } from "@mongez/slug";
|
|
|
3
3
|
import { get } from "@mongez/reinforcements";
|
|
4
4
|
import { authService } from "@warlock.js/auth";
|
|
5
5
|
|
|
6
|
-
//#region
|
|
6
|
+
//#region ../@warlock.js/core/src/database/utils.ts
|
|
7
7
|
/**
|
|
8
8
|
* Hash password on saving if password changes
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/database/utils.ts"],"sourcesContent":["import { get } from \"@mongez/reinforcements\";\nimport { slugify } from \"@mongez/slug\";\nimport { authService } from \"@warlock.js/auth\";\nimport { Model, useModelTransformer } from \"@warlock.js/cascade\";\nimport { ComputedCallback, SchemaContext } from \"@warlock.js/seal\";\n\n/**\n * Hash password on saving if password changes\n */\nexport const useHashedPassword = () =>\n useModelTransformer(({ value, isChanged, isNew }) => {\n if (!value) return value;\n\n if (!isNew && !isChanged) return value;\n\n return authService.hashPassword(String(value));\n });\n\ntype ComputedCallbackModel = (\n data: any,\n model: Model,\n context: SchemaContext,\n) => any | Promise<any>;\n\n/**\n * Generate computed value based on other fields\n */\nexport function useComputedModel(callback: ComputedCallbackModel) {\n const computedCallback: ComputedCallback = (data, context) => {\n return callback(data, context.rootContext!.model, context);\n };\n\n return computedCallback;\n}\n\n/**\n * Generate slug based on a field on saving\n */\nexport function useComputedSlug(field = \"title\", scope: \"global\" | \"sibling\" = \"sibling\") {\n return useComputedModel((data, model, context) => {\n const value = scope === \"sibling\" ? data[field] : get(context.allValues, field);\n\n if (!value) return model.get(field);\n\n return slugify(value);\n });\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,0BACX,qBAAqB,EAAE,OAAO,WAAW,YAAY;CACnD,IAAI,CAAC,OAAO,OAAO;CAEnB,IAAI,CAAC,SAAS,CAAC,WAAW,OAAO;CAEjC,OAAO,YAAY,aAAa,OAAO,KAAK,CAAC;AAC/C,CAAC;;;;AAWH,SAAgB,iBAAiB,UAAiC;CAChE,MAAM,oBAAsC,MAAM,YAAY;EAC5D,OAAO,SAAS,MAAM,QAAQ,YAAa,OAAO,OAAO;CAC3D;CAEA,OAAO;AACT;;;;AAKA,SAAgB,gBAAgB,QAAQ,SAAS,QAA8B,WAAW;CACxF,OAAO,kBAAkB,MAAM,OAAO,YAAY;EAChD,MAAM,QAAQ,UAAU,YAAY,KAAK,SAAS,IAAI,QAAQ,WAAW,KAAK;EAE9E,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,KAAK;EAElC,OAAO,QAAQ,KAAK;CACtB,CAAC;AACH"}
|
|
@@ -2,7 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { fileURLToPath } from "url";
|
|
3
3
|
import { Worker } from "worker_threads";
|
|
4
4
|
|
|
5
|
-
//#region
|
|
5
|
+
//#region ../@warlock.js/core/src/dev-server/create-worker.ts
|
|
6
6
|
/**
|
|
7
7
|
* Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.
|
|
8
8
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-worker.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"create-worker.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/create-worker.ts"],"sourcesContent":["import path from \"node:path\";\nimport { fileURLToPath } from \"url\";\nimport { Worker, type WorkerOptions } from \"worker_threads\";\n\n/**\n * Options for creating a health check worker\n */\nexport type CreateWorkerOptions = WorkerOptions & {\n /**\n * Worker data to pass to the worker thread\n */\n workerData?: Record<string, unknown>;\n};\n\n/**\n * Create a worker that works in both dev (TypeScript) and production (JavaScript) environments.\n *\n * The worker shares the CALLING module's extension: `.ts` when core runs from\n * source (loaded via tsx), `.mjs` when core is published. Source workers are\n * run through the tsx loader; published `.mjs` workers run as-is.\n *\n * @param workerPath - Relative path to worker file WITHOUT extension (e.g., \"./workers/ts-health.worker\")\n * @param baseUrl - The import.meta.url of the calling module (used to resolve relative paths)\n * @param options - Additional worker options\n * @returns A new Worker instance\n *\n * @example\n * ```typescript\n * // In FilesHealthcareManager\n * const worker = createWorker(\n * \"./workers/ts-health.worker\",\n * import.meta.url,\n * { workerData: { cwd: process.cwd() } }\n * );\n * ```\n */\nexport function createWorker(\n workerPath: string,\n baseUrl: string,\n options?: CreateWorkerOptions,\n): Worker {\n // The worker shares the CALLING module's extension: `.ts` from source (needs the\n // tsx loader to execute), `.mjs` when core is published.\n const callerExtension = path.extname(fileURLToPath(baseUrl));\n const isSource = callerExtension === \".ts\" || callerExtension === \".tsx\";\n const workerUrl = new URL(`${workerPath}${callerExtension}`, baseUrl);\n const workerFilePath = fileURLToPath(workerUrl);\n\n const workerOptions: WorkerOptions = {\n ...options,\n };\n\n // Source workers are TypeScript — run them through the tsx loader.\n if (isSource) {\n workerOptions.execArgv = [...(options?.execArgv || []), \"--import\", \"tsx/esm\"];\n }\n\n return new Worker(workerFilePath, workerOptions);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,SAAgB,aACd,YACA,SACA,SACQ;CAGR,MAAM,kBAAkB,KAAK,QAAQ,cAAc,OAAO,CAAC;CAC3D,MAAM,WAAW,oBAAoB,SAAS,oBAAoB;CAElE,MAAM,iBAAiB,cAAc,IADf,IAAI,GAAG,aAAa,mBAAmB,OAChB,CAAC;CAE9C,MAAM,gBAA+B,EACnC,GAAG,QACL;CAGA,IAAI,UACF,cAAc,WAAW;EAAC,GAAI,SAAS,YAAY,CAAC;EAAI;EAAY;CAAS;CAG/E,OAAO,IAAI,OAAO,gBAAgB,aAAa;AACjD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FileManager } from "./file-manager.mjs";
|
|
2
2
|
|
|
3
|
-
//#region
|
|
3
|
+
//#region ../@warlock.js/core/src/dev-server/dependency-graph.d.ts
|
|
4
4
|
/**
|
|
5
5
|
* Dependency Graph
|
|
6
6
|
* Tracks bidirectional relationships between files:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"dependency-graph.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/dependency-graph.ts"],"mappings":";;;;;AAYA;;;;;;;;cAAa,eAAA;EA0L4B;;;;;EAAA,QApL/B,YAAA;EAkBY;;;;;EAAA,QAXZ,UAAA;EAiD+C;;;;EAAA,QA3C/C,KAAA;EA8EU;;;EAzEX,KAAA,CAAM,KAAA,EAAO,GAAA,SAAY,WAAA;EA2G9B;;;;;;;;;EArEK,aAAA,CAAc,IAAA,UAAc,UAAA,UAAoB,UAAA;EA4HlC;;;;;EAlGd,gBAAA,CAAiB,IAAA,UAAc,UAAA;EAwM9B;;;;EA/LD,UAAA,CAAW,IAAA;;;;;;;;;;;;EAgCX,UAAA,CACL,IAAA,UACA,eAAA,EAAiB,GAAA,UACjB,oBAAA,GAAsB,GAAA;;;;;;EA+BjB,eAAA,CAAgB,IAAA,WAAe,GAAA;;;;;EAc/B,cAAA,CAAe,IAAA,UAAc,UAAA;;;;;;EAS7B,aAAA,CAAc,IAAA,WAAe,GAAA;;;;;;;;EAW7B,oBAAA,CAAqB,IAAA;;;;;;;;;;;;;EA+BrB,0BAAA;;;;;;;UA2CC,cAAA;;;;;UAiBA,iCAAA;;;;EAgGD,QAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-graph.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/dev-server/dependency-graph.ts"],"sourcesContent":["import type { FileManager } from \"./file-manager\";\r\n\r\n/**\r\n * Dependency Graph\r\n * Tracks bidirectional relationships between files:\r\n * - dependencies: files that this file imports\r\n * - dependents: files that import this file\r\n *\r\n * Each forward edge also carries an `isTypeOnly` flag so cycle detection\r\n * can distinguish runtime cycles from ones formed purely by `import type`\r\n * edges — the latter are erased by TypeScript and have no runtime effect.\r\n */\r\nexport class DependencyGraph {\r\n /**\r\n * Map of file -> files it depends on (imports).\r\n * Key: relative file path.\r\n * Value: relative dependency path → `{ isTypeOnly }` for that edge.\r\n */\r\n private dependencies = new Map<string, Map<string, { isTypeOnly: boolean }>>();\r\n\r\n /**\r\n * Map of file -> files that depend on it (importers)\r\n * Key: relative file path\r\n * Value: Set of relative file paths that import this file\r\n */\r\n private dependents = new Map<string, Set<string>>();\r\n\r\n /**\r\n * Reference to the files map for accessing FileManager instances\r\n * Used to read per-file typeOnlyDependencies during graph build.\r\n */\r\n private files: Map<string, FileManager> | null = null;\r\n\r\n /**\r\n * Build dependency graph from FileManager map\r\n */\r\n public build(files: Map<string, FileManager>) {\r\n this.files = files;\r\n\r\n this.dependencies.clear();\r\n this.dependents.clear();\r\n\r\n for (const [relativePath, fileManager] of files) {\r\n if (!this.dependencies.has(relativePath)) {\r\n this.dependencies.set(relativePath, new Map());\r\n }\r\n\r\n if (!this.dependents.has(relativePath)) {\r\n this.dependents.set(relativePath, new Set());\r\n }\r\n\r\n for (const dependency of fileManager.dependencies) {\r\n const isTypeOnly = fileManager.typeOnlyDependencies.has(dependency);\r\n\r\n this.addDependency(relativePath, dependency, isTypeOnly);\r\n }\r\n }\r\n\r\n const cycles = this.detectCircularDependencies();\r\n\r\n if (cycles.length > 0) {\r\n this.displayCircularDependencyWarnings(cycles);\r\n }\r\n }\r\n\r\n /**\r\n * Add a dependency relationship.\r\n * If the edge already exists, the type-only flag is ANDed: any runtime\r\n * statement between the two files makes the edge runtime permanently.\r\n *\r\n * @param file The file that has the dependency\r\n * @param dependency The file being depended upon\r\n * @param isTypeOnly Whether every reference from `file` to `dependency` is type-only\r\n */\r\n public addDependency(file: string, dependency: string, isTypeOnly: boolean = false) {\r\n if (!this.dependencies.has(file)) {\r\n this.dependencies.set(file, new Map());\r\n }\r\n\r\n if (!this.dependents.has(dependency)) {\r\n this.dependents.set(dependency, new Set());\r\n }\r\n\r\n const edges = this.dependencies.get(file)!;\r\n const existing = edges.get(dependency);\r\n\r\n if (existing) {\r\n existing.isTypeOnly = existing.isTypeOnly && isTypeOnly;\r\n } else {\r\n edges.set(dependency, { isTypeOnly });\r\n }\r\n\r\n this.dependents.get(dependency)!.add(file);\r\n }\r\n\r\n /**\r\n * Remove a dependency relationship\r\n * @param file The file that has the dependency\r\n * @param dependency The file being depended upon\r\n */\r\n public removeDependency(file: string, dependency: string) {\r\n this.dependencies.get(file)?.delete(dependency);\r\n this.dependents.get(dependency)?.delete(file);\r\n }\r\n\r\n /**\r\n * Remove all relationships for a file\r\n * @param file The file to remove\r\n */\r\n public removeFile(file: string) {\r\n const deps = this.dependencies.get(file);\r\n\r\n if (deps) {\r\n for (const dependency of deps.keys()) {\r\n this.dependents.get(dependency)?.delete(file);\r\n }\r\n }\r\n\r\n const dependents = this.dependents.get(file);\r\n\r\n if (dependents) {\r\n for (const dependent of dependents) {\r\n this.dependencies.get(dependent)?.delete(file);\r\n }\r\n }\r\n\r\n this.dependencies.delete(file);\r\n this.dependents.delete(file);\r\n }\r\n\r\n /**\r\n * Update dependencies for a file.\r\n *\r\n * Accepts the updated `Set<string>` of dependency paths; when the caller\r\n * has per-edge type-only info, pass `typeOnlyDependencies` so the new\r\n * edges get the correct flag. Missing flag defaults to runtime.\r\n *\r\n * @param file The file to update\r\n * @param newDependencies New set of dependency paths\r\n * @param typeOnlyDependencies Subset of `newDependencies` whose edges are type-only\r\n */\r\n public updateFile(\r\n file: string,\r\n newDependencies: Set<string>,\r\n typeOnlyDependencies: Set<string> = new Set(),\r\n ) {\r\n const oldEdges = this.dependencies.get(file) ?? new Map<string, { isTypeOnly: boolean }>();\r\n\r\n for (const oldDep of oldEdges.keys()) {\r\n if (!newDependencies.has(oldDep)) {\r\n this.removeDependency(file, oldDep);\r\n }\r\n }\r\n\r\n for (const newDep of newDependencies) {\r\n const isTypeOnly = typeOnlyDependencies.has(newDep);\r\n const existing = oldEdges.get(newDep);\r\n\r\n if (!existing) {\r\n this.addDependency(file, newDep, isTypeOnly);\r\n\r\n continue;\r\n }\r\n\r\n if (existing.isTypeOnly !== isTypeOnly) {\r\n existing.isTypeOnly = isTypeOnly;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get files that this file depends on (imports)\r\n * @param file The file to check\r\n * @returns Set of files this file imports\r\n */\r\n public getDependencies(file: string): Set<string> {\r\n const edges = this.dependencies.get(file);\r\n\r\n if (!edges) {\r\n return new Set();\r\n }\r\n\r\n return new Set(edges.keys());\r\n }\r\n\r\n /**\r\n * Check whether the edge `file → dependency` is type-only.\r\n * Returns false if the edge does not exist.\r\n */\r\n public isEdgeTypeOnly(file: string, dependency: string): boolean {\r\n return this.dependencies.get(file)?.get(dependency)?.isTypeOnly === true;\r\n }\r\n\r\n /**\r\n * Get files that depend on this file (importers)\r\n * @param file The file to check\r\n * @returns Set of files that import this file\r\n */\r\n public getDependents(file: string): Set<string> {\r\n return this.dependents.get(file) || new Set();\r\n }\r\n\r\n /**\r\n * Get invalidation chain for a file\r\n * Returns all files that need to be reloaded when this file changes\r\n * Includes the file itself and all transitive dependents\r\n * @param file The file that changed\r\n * @returns Array of files to invalidate (in order)\r\n */\r\n public getInvalidationChain(file: string): string[] {\r\n const chain: string[] = [file];\r\n const visited = new Set([file]);\r\n\r\n const traverse = (current: string) => {\r\n const deps = this.getDependents(current);\r\n for (const dep of deps) {\r\n if (!visited.has(dep)) {\r\n visited.add(dep);\r\n chain.push(dep);\r\n traverse(dep); // Recursive traversal\r\n }\r\n }\r\n };\r\n\r\n traverse(file);\r\n return chain;\r\n }\r\n\r\n /**\r\n * Detect circular dependencies in the dependency graph.\r\n * Uses depth-first search to find cycles.\r\n *\r\n * Filtering rule (per-edge): a cycle is suppressed when **any** edge in\r\n * the chain is type-only. TypeScript erases type-only imports entirely,\r\n * so a single type-only edge breaks the cycle at runtime. Only warn when\r\n * every edge is a runtime binding — that's the cycle that actually loops\r\n * at load time.\r\n *\r\n * @returns Array of circular dependency chains (each chain is an array of file paths)\r\n */\r\n public detectCircularDependencies(): string[][] {\r\n const cycles: string[][] = [];\r\n const visited = new Set<string>();\r\n const recursionStack = new Set<string>();\r\n\r\n const dfs = (file: string, path: string[]): void => {\r\n visited.add(file);\r\n recursionStack.add(file);\r\n path.push(file);\r\n\r\n const edges = this.dependencies.get(file);\r\n\r\n if (edges) {\r\n for (const dep of edges.keys()) {\r\n if (!visited.has(dep)) {\r\n dfs(dep, [...path]);\r\n } else if (recursionStack.has(dep)) {\r\n const cycleStart = path.indexOf(dep);\r\n const cycle = [...path.slice(cycleStart), dep];\r\n\r\n cycles.push(cycle);\r\n }\r\n }\r\n }\r\n\r\n recursionStack.delete(file);\r\n };\r\n\r\n for (const file of this.dependencies.keys()) {\r\n if (!visited.has(file)) {\r\n dfs(file, []);\r\n }\r\n }\r\n\r\n return cycles.filter((cycle) => this.isRuntimeCycle(cycle));\r\n }\r\n\r\n /**\r\n * True iff every edge in the cycle is a runtime binding. The cycle array\r\n * ends with a duplicate of its start (`[A, B, C, A]`) so we walk the\r\n * consecutive pairs once — any type-only edge means TS erases the loop\r\n * and there is no runtime cycle to report.\r\n */\r\n private isRuntimeCycle(cycle: string[]): boolean {\r\n for (let index = 0; index < cycle.length - 1; index++) {\r\n const from = cycle[index];\r\n const to = cycle[index + 1];\r\n\r\n if (this.isEdgeTypeOnly(from, to)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Display circular dependency warnings in a formatted, user-friendly way\r\n * Shows each cycle with visual tree structure and helpful recommendations\r\n */\r\n private displayCircularDependencyWarnings(cycles: string[][]): void {\r\n const colors = {\r\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\r\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\r\n dim: (text: string) => `\\x1b[2m${text}\\x1b[0m`,\r\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\r\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\r\n };\r\n\r\n console.log(\"\");\r\n console.log(colors.yellow(\"⚠️ Circular Dependencies Detected\"));\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(\"\");\r\n console.log(\r\n colors.dim(\r\n `Found ${colors.bold(cycles.length.toString())} circular dependency chain${cycles.length > 1 ? \"s\" : \"\"}`,\r\n ),\r\n );\r\n console.log(\"\");\r\n\r\n cycles.forEach((cycle, index) => {\r\n console.log(colors.cyan(` ${index + 1}. Cycle with ${cycle.length - 1} files:`));\r\n console.log(\"\");\r\n\r\n // Display the cycle chain\r\n cycle.forEach((file, fileIndex) => {\r\n const isLast = fileIndex === cycle.length - 1;\r\n const arrow = isLast ? colors.dim(\" └─→ \") : colors.dim(\" ├─→ \");\r\n const fileName = file.split(\"/\").pop() || file;\r\n const filePath = colors.dim(file.replace(fileName, \"\"));\r\n\r\n if (isLast) {\r\n // Last item is the same as first (completes the cycle)\r\n console.log(\r\n arrow + colors.yellow(`${filePath}${colors.bold(fileName)} (cycle completes)`),\r\n );\r\n } else {\r\n console.log(arrow + filePath + colors.bold(fileName));\r\n }\r\n });\r\n\r\n console.log(\"\");\r\n });\r\n\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(colors.yellow(\"💡 How to Fix:\"));\r\n console.log(\"\");\r\n\r\n const exampleCycle = cycles[0];\r\n const fileA = exampleCycle[0]?.split(\"/\").pop() || \"fileA.ts\";\r\n const fileB = exampleCycle[1]?.split(\"/\").pop() || \"fileB.ts\";\r\n const stripExt = (file: string) => file.replace(/\\.tsx?$/, \"\");\r\n\r\n const kind = classifyCycle(exampleCycle);\r\n\r\n if (kind === \"resource\" || kind === \"model\") {\r\n // Cascade's `lazy()` is purpose-built for circular relations between\r\n // resources and models — recommend it first, not as a footnote.\r\n console.log(colors.green(` ✨ Use lazy() for the back-reference`));\r\n console.log(\r\n colors.dim(\r\n ` ${kind === \"resource\" ? \"Resources\" : \"Models\"} that reference each other should declare`,\r\n ),\r\n );\r\n console.log(colors.dim(` one side with lazy() so the import resolves at access time:`));\r\n console.log(\"\");\r\n console.log(colors.dim(` import { lazy } from \"@warlock.js/cascade\";`));\r\n console.log(colors.dim(` // inside ${fileB}:`));\r\n console.log(colors.dim(` other: lazy(() => ${kind === \"resource\" ? \"OtherResource\" : \"OtherModel\"})`));\r\n console.log(\"\");\r\n } else {\r\n // Generic cycle — dynamic import is the most common reliable fix.\r\n console.log(colors.green(` ✨ Convert one edge to a dynamic import`));\r\n console.log(colors.dim(` In ${fileB}, change:`));\r\n console.log(colors.dim(` import { SomeClass } from \"./${stripExt(fileA)}\";`));\r\n console.log(colors.dim(` To:`));\r\n console.log(\r\n colors.dim(` const { SomeClass } = await import(\"./${stripExt(fileA)}\");`),\r\n );\r\n console.log(\"\");\r\n }\r\n\r\n console.log(colors.dim(\" Other options:\"));\r\n console.log(colors.dim(\" • Extract the shared symbols into a third file both can import.\"));\r\n console.log(colors.dim(\" • Pass the dependency as a constructor/function parameter instead.\"));\r\n console.log(\"\");\r\n\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(colors.dim(\" Circular dependencies can cause HMR issues and hard-to-debug\"));\r\n console.log(colors.dim(\" initialization order problems. Consider refactoring.\"));\r\n console.log(\"\");\r\n }\r\n\r\n /**\r\n * Get statistics about the dependency graph\r\n */\r\n public getStats() {\r\n let totalDependencies = 0;\r\n let maxDependencies = 0;\r\n let maxDependents = 0;\r\n let mostDependedFile = \"\";\r\n let mostDependingFile = \"\";\r\n\r\n for (const [file, deps] of this.dependencies) {\r\n totalDependencies += deps.size;\r\n if (deps.size > maxDependencies) {\r\n maxDependencies = deps.size;\r\n mostDependingFile = file;\r\n }\r\n }\r\n\r\n for (const [file, deps] of this.dependents) {\r\n if (deps.size > maxDependents) {\r\n maxDependents = deps.size;\r\n mostDependedFile = file;\r\n }\r\n }\r\n\r\n return {\r\n totalFiles: this.dependencies.size,\r\n totalDependencies,\r\n avgDependenciesPerFile: totalDependencies / this.dependencies.size || 0,\r\n maxDependencies,\r\n maxDependents,\r\n mostDependingFile,\r\n mostDependedFile,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Pick the most useful \"fix-it\" hint for a cycle by inspecting the file\r\n * extensions involved. Cascade resources/models have a first-class fix\r\n * (`lazy()`); generic cycles just want a dynamic import.\r\n */\r\nfunction classifyCycle(cycle: string[]): \"resource\" | \"model\" | \"generic\" {\r\n const files = cycle.slice(0, -1); // last entry repeats the first\r\n if (files.every(file => file.endsWith(\".resource.ts\") || file.endsWith(\".resource.tsx\"))) {\r\n return \"resource\";\r\n }\r\n if (files.every(file => file.endsWith(\".model.ts\") || file.endsWith(\".model.tsx\"))) {\r\n return \"model\";\r\n }\r\n return \"generic\";\r\n}\r\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,kBAAb,MAA6B;;sCAMJ,IAAI,IAAkD;oCAOxD,IAAI,IAAyB;eAMD;;;;;CAKjD,AAAO,MAAM,OAAiC;EAC5C,KAAK,QAAQ;EAEb,KAAK,aAAa,MAAM;EACxB,KAAK,WAAW,MAAM;EAEtB,KAAK,MAAM,CAAC,cAAc,gBAAgB,OAAO;GAC/C,IAAI,CAAC,KAAK,aAAa,IAAI,YAAY,GACrC,KAAK,aAAa,IAAI,8BAAc,IAAI,IAAI,CAAC;GAG/C,IAAI,CAAC,KAAK,WAAW,IAAI,YAAY,GACnC,KAAK,WAAW,IAAI,8BAAc,IAAI,IAAI,CAAC;GAG7C,KAAK,MAAM,cAAc,YAAY,cAAc;IACjD,MAAM,aAAa,YAAY,qBAAqB,IAAI,UAAU;IAElE,KAAK,cAAc,cAAc,YAAY,UAAU;GACzD;EACF;EAEA,MAAM,SAAS,KAAK,2BAA2B;EAE/C,IAAI,OAAO,SAAS,GAClB,KAAK,kCAAkC,MAAM;CAEjD;;;;;;;;;;CAWA,AAAO,cAAc,MAAc,YAAoB,aAAsB,OAAO;EAClF,IAAI,CAAC,KAAK,aAAa,IAAI,IAAI,GAC7B,KAAK,aAAa,IAAI,sBAAM,IAAI,IAAI,CAAC;EAGvC,IAAI,CAAC,KAAK,WAAW,IAAI,UAAU,GACjC,KAAK,WAAW,IAAI,4BAAY,IAAI,IAAI,CAAC;EAG3C,MAAM,QAAQ,KAAK,aAAa,IAAI,IAAI;EACxC,MAAM,WAAW,MAAM,IAAI,UAAU;EAErC,IAAI,UACF,SAAS,aAAa,SAAS,cAAc;OAE7C,MAAM,IAAI,YAAY,EAAE,WAAW,CAAC;EAGtC,KAAK,WAAW,IAAI,UAAU,EAAG,IAAI,IAAI;CAC3C;;;;;;CAOA,AAAO,iBAAiB,MAAc,YAAoB;EACxD,KAAK,aAAa,IAAI,IAAI,GAAG,OAAO,UAAU;EAC9C,KAAK,WAAW,IAAI,UAAU,GAAG,OAAO,IAAI;CAC9C;;;;;CAMA,AAAO,WAAW,MAAc;EAC9B,MAAM,OAAO,KAAK,aAAa,IAAI,IAAI;EAEvC,IAAI,MACF,KAAK,MAAM,cAAc,KAAK,KAAK,GACjC,KAAK,WAAW,IAAI,UAAU,GAAG,OAAO,IAAI;EAIhD,MAAM,aAAa,KAAK,WAAW,IAAI,IAAI;EAE3C,IAAI,YACF,KAAK,MAAM,aAAa,YACtB,KAAK,aAAa,IAAI,SAAS,GAAG,OAAO,IAAI;EAIjD,KAAK,aAAa,OAAO,IAAI;EAC7B,KAAK,WAAW,OAAO,IAAI;CAC7B;;;;;;;;;;;;CAaA,AAAO,WACL,MACA,iBACA,uCAAoC,IAAI,IAAI,GAC5C;EACA,MAAM,WAAW,KAAK,aAAa,IAAI,IAAI,qBAAK,IAAI,IAAqC;EAEzF,KAAK,MAAM,UAAU,SAAS,KAAK,GACjC,IAAI,CAAC,gBAAgB,IAAI,MAAM,GAC7B,KAAK,iBAAiB,MAAM,MAAM;EAItC,KAAK,MAAM,UAAU,iBAAiB;GACpC,MAAM,aAAa,qBAAqB,IAAI,MAAM;GAClD,MAAM,WAAW,SAAS,IAAI,MAAM;GAEpC,IAAI,CAAC,UAAU;IACb,KAAK,cAAc,MAAM,QAAQ,UAAU;IAE3C;GACF;GAEA,IAAI,SAAS,eAAe,YAC1B,SAAS,aAAa;EAE1B;CACF;;;;;;CAOA,AAAO,gBAAgB,MAA2B;EAChD,MAAM,QAAQ,KAAK,aAAa,IAAI,IAAI;EAExC,IAAI,CAAC,OACH,uBAAO,IAAI,IAAI;EAGjB,OAAO,IAAI,IAAI,MAAM,KAAK,CAAC;CAC7B;;;;;CAMA,AAAO,eAAe,MAAc,YAA6B;EAC/D,OAAO,KAAK,aAAa,IAAI,IAAI,GAAG,IAAI,UAAU,GAAG,eAAe;CACtE;;;;;;CAOA,AAAO,cAAc,MAA2B;EAC9C,OAAO,KAAK,WAAW,IAAI,IAAI,qBAAK,IAAI,IAAI;CAC9C;;;;;;;;CASA,AAAO,qBAAqB,MAAwB;EAClD,MAAM,QAAkB,CAAC,IAAI;EAC7B,MAAM,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;EAE9B,MAAM,YAAY,YAAoB;GACpC,MAAM,OAAO,KAAK,cAAc,OAAO;GACvC,KAAK,MAAM,OAAO,MAChB,IAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;IACrB,QAAQ,IAAI,GAAG;IACf,MAAM,KAAK,GAAG;IACd,SAAS,GAAG;GACd;EAEJ;EAEA,SAAS,IAAI;EACb,OAAO;CACT;;;;;;;;;;;;;CAcA,AAAO,6BAAyC;EAC9C,MAAM,SAAqB,CAAC;EAC5B,MAAM,0BAAU,IAAI,IAAY;EAChC,MAAM,iCAAiB,IAAI,IAAY;EAEvC,MAAM,OAAO,MAAc,SAAyB;GAClD,QAAQ,IAAI,IAAI;GAChB,eAAe,IAAI,IAAI;GACvB,KAAK,KAAK,IAAI;GAEd,MAAM,QAAQ,KAAK,aAAa,IAAI,IAAI;GAExC,IAAI,OACF;SAAK,MAAM,OAAO,MAAM,KAAK,GAC3B,IAAI,CAAC,QAAQ,IAAI,GAAG,GAClB,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC;SACb,IAAI,eAAe,IAAI,GAAG,GAAG;KAClC,MAAM,aAAa,KAAK,QAAQ,GAAG;KACnC,MAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,UAAU,GAAG,GAAG;KAE7C,OAAO,KAAK,KAAK;IACnB;GACF;GAGF,eAAe,OAAO,IAAI;EAC5B;EAEA,KAAK,MAAM,QAAQ,KAAK,aAAa,KAAK,GACxC,IAAI,CAAC,QAAQ,IAAI,IAAI,GACnB,IAAI,MAAM,CAAC,CAAC;EAIhB,OAAO,OAAO,QAAQ,UAAU,KAAK,eAAe,KAAK,CAAC;CAC5D;;;;;;;CAQA,AAAQ,eAAe,OAA0B;EAC/C,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,SAAS,GAAG,SAAS;GACrD,MAAM,OAAO,MAAM;GACnB,MAAM,KAAK,MAAM,QAAQ;GAEzB,IAAI,KAAK,eAAe,MAAM,EAAE,GAC9B,OAAO;EAEX;EAEA,OAAO;CACT;;;;;CAMA,AAAQ,kCAAkC,QAA0B;EAClE,MAAM,SAAS;GACb,SAAS,SAAiB,WAAW,KAAK;GAC1C,OAAO,SAAiB,WAAW,KAAK;GACxC,MAAM,SAAiB,UAAU,KAAK;GACtC,OAAO,SAAiB,UAAU,KAAK;GACvC,QAAQ,SAAiB,WAAW,KAAK;EAC3C;EAEA,QAAQ,IAAI,EAAE;EACd,QAAQ,IAAI,OAAO,OAAO,oCAAoC,CAAC;EAC/D,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;EACtC,QAAQ,IAAI,EAAE;EACd,QAAQ,IACN,OAAO,IACL,SAAS,OAAO,KAAK,OAAO,OAAO,SAAS,CAAC,EAAE,4BAA4B,OAAO,SAAS,IAAI,MAAM,IACvG,CACF;EACA,QAAQ,IAAI,EAAE;EAEd,OAAO,SAAS,OAAO,UAAU;GAC/B,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,eAAe,MAAM,SAAS,EAAE,QAAQ,CAAC;GAChF,QAAQ,IAAI,EAAE;GAGd,MAAM,SAAS,MAAM,cAAc;IACjC,MAAM,SAAS,cAAc,MAAM,SAAS;IAC5C,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,IAAI,OAAO,IAAI,SAAS;IACnE,MAAM,WAAW,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;IAC1C,MAAM,WAAW,OAAO,IAAI,KAAK,QAAQ,UAAU,EAAE,CAAC;IAEtD,IAAI,QAEF,QAAQ,IACN,QAAQ,OAAO,OAAO,GAAG,WAAW,OAAO,KAAK,QAAQ,EAAE,mBAAmB,CAC/E;SAEA,QAAQ,IAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,CAAC;GAExD,CAAC;GAED,QAAQ,IAAI,EAAE;EAChB,CAAC;EAED,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;EACtC,QAAQ,IAAI,OAAO,OAAO,gBAAgB,CAAC;EAC3C,QAAQ,IAAI,EAAE;EAEd,MAAM,eAAe,OAAO;EAC5B,MAAM,QAAQ,aAAa,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;EACnD,MAAM,QAAQ,aAAa,IAAI,MAAM,GAAG,EAAE,IAAI,KAAK;EACnD,MAAM,YAAY,SAAiB,KAAK,QAAQ,WAAW,EAAE;EAE7D,MAAM,OAAO,cAAc,YAAY;EAEvC,IAAI,SAAS,cAAc,SAAS,SAAS;GAG3C,QAAQ,IAAI,OAAO,MAAM,uCAAuC,CAAC;GACjE,QAAQ,IACN,OAAO,IACL,MAAM,SAAS,aAAa,cAAc,SAAS,0CACrD,CACF;GACA,QAAQ,IAAI,OAAO,IAAI,gEAAgE,CAAC;GACxF,QAAQ,IAAI,EAAE;GACd,QAAQ,IAAI,OAAO,IAAI,kDAAkD,CAAC;GAC1E,QAAQ,IAAI,OAAO,IAAI,kBAAkB,MAAM,EAAE,CAAC;GAClD,QAAQ,IAAI,OAAO,IAAI,0BAA0B,SAAS,aAAa,kBAAkB,aAAa,EAAE,CAAC;GACzG,QAAQ,IAAI,EAAE;EAChB,OAAO;GAEL,QAAQ,IAAI,OAAO,MAAM,0CAA0C,CAAC;GACpE,QAAQ,IAAI,OAAO,IAAI,SAAS,MAAM,UAAU,CAAC;GACjD,QAAQ,IAAI,OAAO,IAAI,qCAAqC,SAAS,KAAK,EAAE,GAAG,CAAC;GAChF,QAAQ,IAAI,OAAO,IAAI,QAAQ,CAAC;GAChC,QAAQ,IACN,OAAO,IAAI,8CAA8C,SAAS,KAAK,EAAE,IAAI,CAC/E;GACA,QAAQ,IAAI,EAAE;EAChB;EAEA,QAAQ,IAAI,OAAO,IAAI,kBAAkB,CAAC;EAC1C,QAAQ,IAAI,OAAO,IAAI,qEAAqE,CAAC;EAC7F,QAAQ,IAAI,OAAO,IAAI,wEAAwE,CAAC;EAChG,QAAQ,IAAI,EAAE;EAEd,QAAQ,IAAI,OAAO,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;EACtC,QAAQ,IAAI,OAAO,IAAI,iEAAiE,CAAC;EACzF,QAAQ,IAAI,OAAO,IAAI,yDAAyD,CAAC;EACjF,QAAQ,IAAI,EAAE;CAChB;;;;CAKA,AAAO,WAAW;EAChB,IAAI,oBAAoB;EACxB,IAAI,kBAAkB;EACtB,IAAI,gBAAgB;EACpB,IAAI,mBAAmB;EACvB,IAAI,oBAAoB;EAExB,KAAK,MAAM,CAAC,MAAM,SAAS,KAAK,cAAc;GAC5C,qBAAqB,KAAK;GAC1B,IAAI,KAAK,OAAO,iBAAiB;IAC/B,kBAAkB,KAAK;IACvB,oBAAoB;GACtB;EACF;EAEA,KAAK,MAAM,CAAC,MAAM,SAAS,KAAK,YAC9B,IAAI,KAAK,OAAO,eAAe;GAC7B,gBAAgB,KAAK;GACrB,mBAAmB;EACrB;EAGF,OAAO;GACL,YAAY,KAAK,aAAa;GAC9B;GACA,wBAAwB,oBAAoB,KAAK,aAAa,QAAQ;GACtE;GACA;GACA;GACA;EACF;CACF;AACF;;;;;;AAOA,SAAS,cAAc,OAAmD;CACxE,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;CAC/B,IAAI,MAAM,OAAM,SAAQ,KAAK,SAAS,cAAc,KAAK,KAAK,SAAS,eAAe,CAAC,GACrF,OAAO;CAET,IAAI,MAAM,OAAM,SAAQ,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,YAAY,CAAC,GAC/E,OAAO;CAET,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"dependency-graph.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/dependency-graph.ts"],"sourcesContent":["import type { FileManager } from \"./file-manager\";\r\n\r\n/**\r\n * Dependency Graph\r\n * Tracks bidirectional relationships between files:\r\n * - dependencies: files that this file imports\r\n * - dependents: files that import this file\r\n *\r\n * Each forward edge also carries an `isTypeOnly` flag so cycle detection\r\n * can distinguish runtime cycles from ones formed purely by `import type`\r\n * edges — the latter are erased by TypeScript and have no runtime effect.\r\n */\r\nexport class DependencyGraph {\r\n /**\r\n * Map of file -> files it depends on (imports).\r\n * Key: relative file path.\r\n * Value: relative dependency path → `{ isTypeOnly }` for that edge.\r\n */\r\n private dependencies = new Map<string, Map<string, { isTypeOnly: boolean }>>();\r\n\r\n /**\r\n * Map of file -> files that depend on it (importers)\r\n * Key: relative file path\r\n * Value: Set of relative file paths that import this file\r\n */\r\n private dependents = new Map<string, Set<string>>();\r\n\r\n /**\r\n * Reference to the files map for accessing FileManager instances\r\n * Used to read per-file typeOnlyDependencies during graph build.\r\n */\r\n private files: Map<string, FileManager> | null = null;\r\n\r\n /**\r\n * Build dependency graph from FileManager map\r\n */\r\n public build(files: Map<string, FileManager>) {\r\n this.files = files;\r\n\r\n this.dependencies.clear();\r\n this.dependents.clear();\r\n\r\n for (const [relativePath, fileManager] of files) {\r\n if (!this.dependencies.has(relativePath)) {\r\n this.dependencies.set(relativePath, new Map());\r\n }\r\n\r\n if (!this.dependents.has(relativePath)) {\r\n this.dependents.set(relativePath, new Set());\r\n }\r\n\r\n for (const dependency of fileManager.dependencies) {\r\n const isTypeOnly = fileManager.typeOnlyDependencies.has(dependency);\r\n\r\n this.addDependency(relativePath, dependency, isTypeOnly);\r\n }\r\n }\r\n\r\n const cycles = this.detectCircularDependencies();\r\n\r\n if (cycles.length > 0) {\r\n this.displayCircularDependencyWarnings(cycles);\r\n }\r\n }\r\n\r\n /**\r\n * Add a dependency relationship.\r\n * If the edge already exists, the type-only flag is ANDed: any runtime\r\n * statement between the two files makes the edge runtime permanently.\r\n *\r\n * @param file The file that has the dependency\r\n * @param dependency The file being depended upon\r\n * @param isTypeOnly Whether every reference from `file` to `dependency` is type-only\r\n */\r\n public addDependency(file: string, dependency: string, isTypeOnly: boolean = false) {\r\n if (!this.dependencies.has(file)) {\r\n this.dependencies.set(file, new Map());\r\n }\r\n\r\n if (!this.dependents.has(dependency)) {\r\n this.dependents.set(dependency, new Set());\r\n }\r\n\r\n const edges = this.dependencies.get(file)!;\r\n const existing = edges.get(dependency);\r\n\r\n if (existing) {\r\n existing.isTypeOnly = existing.isTypeOnly && isTypeOnly;\r\n } else {\r\n edges.set(dependency, { isTypeOnly });\r\n }\r\n\r\n this.dependents.get(dependency)!.add(file);\r\n }\r\n\r\n /**\r\n * Remove a dependency relationship\r\n * @param file The file that has the dependency\r\n * @param dependency The file being depended upon\r\n */\r\n public removeDependency(file: string, dependency: string) {\r\n this.dependencies.get(file)?.delete(dependency);\r\n this.dependents.get(dependency)?.delete(file);\r\n }\r\n\r\n /**\r\n * Remove all relationships for a file\r\n * @param file The file to remove\r\n */\r\n public removeFile(file: string) {\r\n const deps = this.dependencies.get(file);\r\n\r\n if (deps) {\r\n for (const dependency of deps.keys()) {\r\n this.dependents.get(dependency)?.delete(file);\r\n }\r\n }\r\n\r\n const dependents = this.dependents.get(file);\r\n\r\n if (dependents) {\r\n for (const dependent of dependents) {\r\n this.dependencies.get(dependent)?.delete(file);\r\n }\r\n }\r\n\r\n this.dependencies.delete(file);\r\n this.dependents.delete(file);\r\n }\r\n\r\n /**\r\n * Update dependencies for a file.\r\n *\r\n * Accepts the updated `Set<string>` of dependency paths; when the caller\r\n * has per-edge type-only info, pass `typeOnlyDependencies` so the new\r\n * edges get the correct flag. Missing flag defaults to runtime.\r\n *\r\n * @param file The file to update\r\n * @param newDependencies New set of dependency paths\r\n * @param typeOnlyDependencies Subset of `newDependencies` whose edges are type-only\r\n */\r\n public updateFile(\r\n file: string,\r\n newDependencies: Set<string>,\r\n typeOnlyDependencies: Set<string> = new Set(),\r\n ) {\r\n const oldEdges = this.dependencies.get(file) ?? new Map<string, { isTypeOnly: boolean }>();\r\n\r\n for (const oldDep of oldEdges.keys()) {\r\n if (!newDependencies.has(oldDep)) {\r\n this.removeDependency(file, oldDep);\r\n }\r\n }\r\n\r\n for (const newDep of newDependencies) {\r\n const isTypeOnly = typeOnlyDependencies.has(newDep);\r\n const existing = oldEdges.get(newDep);\r\n\r\n if (!existing) {\r\n this.addDependency(file, newDep, isTypeOnly);\r\n\r\n continue;\r\n }\r\n\r\n if (existing.isTypeOnly !== isTypeOnly) {\r\n existing.isTypeOnly = isTypeOnly;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get files that this file depends on (imports)\r\n * @param file The file to check\r\n * @returns Set of files this file imports\r\n */\r\n public getDependencies(file: string): Set<string> {\r\n const edges = this.dependencies.get(file);\r\n\r\n if (!edges) {\r\n return new Set();\r\n }\r\n\r\n return new Set(edges.keys());\r\n }\r\n\r\n /**\r\n * Check whether the edge `file → dependency` is type-only.\r\n * Returns false if the edge does not exist.\r\n */\r\n public isEdgeTypeOnly(file: string, dependency: string): boolean {\r\n return this.dependencies.get(file)?.get(dependency)?.isTypeOnly === true;\r\n }\r\n\r\n /**\r\n * Get files that depend on this file (importers)\r\n * @param file The file to check\r\n * @returns Set of files that import this file\r\n */\r\n public getDependents(file: string): Set<string> {\r\n return this.dependents.get(file) || new Set();\r\n }\r\n\r\n /**\r\n * Get invalidation chain for a file\r\n * Returns all files that need to be reloaded when this file changes\r\n * Includes the file itself and all transitive dependents\r\n * @param file The file that changed\r\n * @returns Array of files to invalidate (in order)\r\n */\r\n public getInvalidationChain(file: string): string[] {\r\n const chain: string[] = [file];\r\n const visited = new Set([file]);\r\n\r\n const traverse = (current: string) => {\r\n const deps = this.getDependents(current);\r\n for (const dep of deps) {\r\n if (!visited.has(dep)) {\r\n visited.add(dep);\r\n chain.push(dep);\r\n traverse(dep); // Recursive traversal\r\n }\r\n }\r\n };\r\n\r\n traverse(file);\r\n return chain;\r\n }\r\n\r\n /**\r\n * Detect circular dependencies in the dependency graph.\r\n * Uses depth-first search to find cycles.\r\n *\r\n * Filtering rule (per-edge): a cycle is suppressed when **any** edge in\r\n * the chain is type-only. TypeScript erases type-only imports entirely,\r\n * so a single type-only edge breaks the cycle at runtime. Only warn when\r\n * every edge is a runtime binding — that's the cycle that actually loops\r\n * at load time.\r\n *\r\n * @returns Array of circular dependency chains (each chain is an array of file paths)\r\n */\r\n public detectCircularDependencies(): string[][] {\r\n const cycles: string[][] = [];\r\n const visited = new Set<string>();\r\n const recursionStack = new Set<string>();\r\n\r\n const dfs = (file: string, path: string[]): void => {\r\n visited.add(file);\r\n recursionStack.add(file);\r\n path.push(file);\r\n\r\n const edges = this.dependencies.get(file);\r\n\r\n if (edges) {\r\n for (const dep of edges.keys()) {\r\n if (!visited.has(dep)) {\r\n dfs(dep, [...path]);\r\n } else if (recursionStack.has(dep)) {\r\n const cycleStart = path.indexOf(dep);\r\n const cycle = [...path.slice(cycleStart), dep];\r\n\r\n cycles.push(cycle);\r\n }\r\n }\r\n }\r\n\r\n recursionStack.delete(file);\r\n };\r\n\r\n for (const file of this.dependencies.keys()) {\r\n if (!visited.has(file)) {\r\n dfs(file, []);\r\n }\r\n }\r\n\r\n return cycles.filter((cycle) => this.isRuntimeCycle(cycle));\r\n }\r\n\r\n /**\r\n * True iff every edge in the cycle is a runtime binding. The cycle array\r\n * ends with a duplicate of its start (`[A, B, C, A]`) so we walk the\r\n * consecutive pairs once — any type-only edge means TS erases the loop\r\n * and there is no runtime cycle to report.\r\n */\r\n private isRuntimeCycle(cycle: string[]): boolean {\r\n for (let index = 0; index < cycle.length - 1; index++) {\r\n const from = cycle[index];\r\n const to = cycle[index + 1];\r\n\r\n if (this.isEdgeTypeOnly(from, to)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Display circular dependency warnings in a formatted, user-friendly way\r\n * Shows each cycle with visual tree structure and helpful recommendations\r\n */\r\n private displayCircularDependencyWarnings(cycles: string[][]): void {\r\n const colors = {\r\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\r\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\r\n dim: (text: string) => `\\x1b[2m${text}\\x1b[0m`,\r\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\r\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\r\n };\r\n\r\n console.log(\"\");\r\n console.log(colors.yellow(\"⚠️ Circular Dependencies Detected\"));\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(\"\");\r\n console.log(\r\n colors.dim(\r\n `Found ${colors.bold(cycles.length.toString())} circular dependency chain${cycles.length > 1 ? \"s\" : \"\"}`,\r\n ),\r\n );\r\n console.log(\"\");\r\n\r\n cycles.forEach((cycle, index) => {\r\n console.log(colors.cyan(` ${index + 1}. Cycle with ${cycle.length - 1} files:`));\r\n console.log(\"\");\r\n\r\n // Display the cycle chain\r\n cycle.forEach((file, fileIndex) => {\r\n const isLast = fileIndex === cycle.length - 1;\r\n const arrow = isLast ? colors.dim(\" └─→ \") : colors.dim(\" ├─→ \");\r\n const fileName = file.split(\"/\").pop() || file;\r\n const filePath = colors.dim(file.replace(fileName, \"\"));\r\n\r\n if (isLast) {\r\n // Last item is the same as first (completes the cycle)\r\n console.log(\r\n arrow + colors.yellow(`${filePath}${colors.bold(fileName)} (cycle completes)`),\r\n );\r\n } else {\r\n console.log(arrow + filePath + colors.bold(fileName));\r\n }\r\n });\r\n\r\n console.log(\"\");\r\n });\r\n\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(colors.yellow(\"💡 How to Fix:\"));\r\n console.log(\"\");\r\n\r\n const exampleCycle = cycles[0];\r\n const fileA = exampleCycle[0]?.split(\"/\").pop() || \"fileA.ts\";\r\n const fileB = exampleCycle[1]?.split(\"/\").pop() || \"fileB.ts\";\r\n const stripExt = (file: string) => file.replace(/\\.tsx?$/, \"\");\r\n\r\n const kind = classifyCycle(exampleCycle);\r\n\r\n if (kind === \"resource\" || kind === \"model\") {\r\n // Cascade's `lazy()` is purpose-built for circular relations between\r\n // resources and models — recommend it first, not as a footnote.\r\n console.log(colors.green(` ✨ Use lazy() for the back-reference`));\r\n console.log(\r\n colors.dim(\r\n ` ${kind === \"resource\" ? \"Resources\" : \"Models\"} that reference each other should declare`,\r\n ),\r\n );\r\n console.log(colors.dim(` one side with lazy() so the import resolves at access time:`));\r\n console.log(\"\");\r\n console.log(colors.dim(` import { lazy } from \"@warlock.js/cascade\";`));\r\n console.log(colors.dim(` // inside ${fileB}:`));\r\n console.log(colors.dim(` other: lazy(() => ${kind === \"resource\" ? \"OtherResource\" : \"OtherModel\"})`));\r\n console.log(\"\");\r\n } else {\r\n // Generic cycle — dynamic import is the most common reliable fix.\r\n console.log(colors.green(` ✨ Convert one edge to a dynamic import`));\r\n console.log(colors.dim(` In ${fileB}, change:`));\r\n console.log(colors.dim(` import { SomeClass } from \"./${stripExt(fileA)}\";`));\r\n console.log(colors.dim(` To:`));\r\n console.log(\r\n colors.dim(` const { SomeClass } = await import(\"./${stripExt(fileA)}\");`),\r\n );\r\n console.log(\"\");\r\n }\r\n\r\n console.log(colors.dim(\" Other options:\"));\r\n console.log(colors.dim(\" • Extract the shared symbols into a third file both can import.\"));\r\n console.log(colors.dim(\" • Pass the dependency as a constructor/function parameter instead.\"));\r\n console.log(\"\");\r\n\r\n console.log(colors.dim(\"━\".repeat(60)));\r\n console.log(colors.dim(\" Circular dependencies can cause HMR issues and hard-to-debug\"));\r\n console.log(colors.dim(\" initialization order problems. Consider refactoring.\"));\r\n console.log(\"\");\r\n }\r\n\r\n /**\r\n * Get statistics about the dependency graph\r\n */\r\n public getStats() {\r\n let totalDependencies = 0;\r\n let maxDependencies = 0;\r\n let maxDependents = 0;\r\n let mostDependedFile = \"\";\r\n let mostDependingFile = \"\";\r\n\r\n for (const [file, deps] of this.dependencies) {\r\n totalDependencies += deps.size;\r\n if (deps.size > maxDependencies) {\r\n maxDependencies = deps.size;\r\n mostDependingFile = file;\r\n }\r\n }\r\n\r\n for (const [file, deps] of this.dependents) {\r\n if (deps.size > maxDependents) {\r\n maxDependents = deps.size;\r\n mostDependedFile = file;\r\n }\r\n }\r\n\r\n return {\r\n totalFiles: this.dependencies.size,\r\n totalDependencies,\r\n avgDependenciesPerFile: totalDependencies / this.dependencies.size || 0,\r\n maxDependencies,\r\n maxDependents,\r\n mostDependingFile,\r\n mostDependedFile,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Pick the most useful \"fix-it\" hint for a cycle by inspecting the file\r\n * extensions involved. Cascade resources/models have a first-class fix\r\n * (`lazy()`); generic cycles just want a dynamic import.\r\n */\r\nfunction classifyCycle(cycle: string[]): \"resource\" | \"model\" | \"generic\" {\r\n const files = cycle.slice(0, -1); // last entry repeats the first\r\n if (files.every(file => file.endsWith(\".resource.ts\") || file.endsWith(\".resource.tsx\"))) {\r\n return \"resource\";\r\n }\r\n if (files.every(file => file.endsWith(\".model.ts\") || file.endsWith(\".model.tsx\"))) {\r\n return \"model\";\r\n }\r\n return \"generic\";\r\n}\r\n"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { Path } from "./path.mjs";
|
|
|
2
2
|
import { colors } from "@mongez/copper";
|
|
3
3
|
import dayjs from "dayjs";
|
|
4
4
|
|
|
5
|
-
//#region
|
|
5
|
+
//#region ../@warlock.js/core/src/dev-server/dev-logger.ts
|
|
6
6
|
/**
|
|
7
7
|
* Dev server logger — Vite-style formatting helpers.
|
|
8
8
|
*/
|
|
@@ -65,17 +65,6 @@ function devLogInfo(message) {
|
|
|
65
65
|
function devLogDim(message) {
|
|
66
66
|
console.log(`${timestamp()} ${colors.dim(message)}`);
|
|
67
67
|
}
|
|
68
|
-
function devLogHMR(file, dependents) {
|
|
69
|
-
const relativePath = Path.toRelative(file);
|
|
70
|
-
const depInfo = dependents ? colors.dim(` +${dependents} module${dependents > 1 ? "s" : ""}`) : "";
|
|
71
|
-
console.log(`${timestamp()} 🔥 ${colors.green("hmr update")} ${colors.dim(relativePath)}${depInfo}`);
|
|
72
|
-
}
|
|
73
|
-
function devLogReady(message) {
|
|
74
|
-
console.log(`\n${timestamp()} ${colors.green("➜")} ${colors.bold(message)}`);
|
|
75
|
-
}
|
|
76
|
-
function devLogSection(title) {
|
|
77
|
-
console.log(`\n${timestamp()} ${colors.bold(colors.cyan(title))}`);
|
|
78
|
-
}
|
|
79
68
|
/**
|
|
80
69
|
* Format ERR_MODULE_NOT_FOUND so the displayed paths are relative to the
|
|
81
70
|
* project root. The loader hook keeps source paths in the URL so we only
|
|
@@ -106,5 +95,5 @@ function formatModuleNotFoundError(error, suggestions) {
|
|
|
106
95
|
const devServeLog = devLog;
|
|
107
96
|
|
|
108
97
|
//#endregion
|
|
109
|
-
export { devLogDim, devLogError,
|
|
98
|
+
export { devLogDim, devLogError, devLogInfo, devLogSuccess, devLogWarn, devServeLog, formatModuleNotFoundError };
|
|
110
99
|
//# sourceMappingURL=dev-logger.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-logger.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"dev-logger.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/dev-logger.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\r\nimport dayjs from \"dayjs\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Dev server logger — Vite-style formatting helpers.\r\n */\r\n\r\nfunction timestamp(): string {\r\n return colors.dim(`${dayjs().format(\"HH:mm:ss A\")}`);\r\n}\r\n\r\nexport function devLog(message: string) {\r\n console.log(`${timestamp()} ${message}`);\r\n}\r\n\r\nexport function devLogSuccess(message: string) {\r\n console.log(`${timestamp()} ${colors.green(\"✓\")} ${colors.green(message)}`);\r\n}\r\n\r\n/**\r\n * Colourise a stack trace so the eye lands on *your* code.\r\n *\r\n * - Error header (`ReferenceError: x is not defined`) → bold red.\r\n * - Frames in project `src/` → highlighted: a green `›` pointer, yellow\r\n * function name, cyan relative path, dim `:line:col`. These are almost\r\n * always where the bug is.\r\n * - Framework (`@warlock.js`), `node_modules`, and `node:` internal frames\r\n * → dimmed and relativised. Still there for context, just out of the way.\r\n *\r\n * Source maps are enabled in dev, so the paths/lines here are already the\r\n * original `.ts` locations — this only changes how they're painted.\r\n */\r\nexport function formatErrorStack(stack: string): string {\r\n const frame = /^(\\s*)at (.+?) \\((.+):(\\d+):(\\d+)\\)$/;\r\n const bareFrame = /^(\\s*)at (.+):(\\d+):(\\d+)$/;\r\n let headerDone = false;\r\n\r\n return stack\r\n .split(\"\\n\")\r\n .map(line => {\r\n const withFn = line.match(frame);\r\n const bare = line.match(bareFrame);\r\n\r\n if (!withFn && !bare) {\r\n // Header line(s) before the first frame.\r\n const painted = headerDone ? colors.dim(line) : colors.bold(colors.red(line));\r\n return painted;\r\n }\r\n\r\n headerDone = true;\r\n\r\n const fn = withFn ? withFn[2] : \"\";\r\n const file = withFn ? withFn[3] : bare![2];\r\n const lineNo = withFn ? withFn[4] : bare![3];\r\n const col = withFn ? withFn[5] : bare![4];\r\n\r\n const isNodeInternal = file.startsWith(\"node:\");\r\n const isDep = file.includes(\"node_modules\");\r\n const isFramework = /[\\\\/]@warlock\\.js[\\\\/]/.test(file);\r\n const isUserCode = !isNodeInternal && !isDep && !isFramework;\r\n\r\n const rel = isNodeInternal ? file : Path.toRelative(file);\r\n const loc = `:${lineNo}:${col}`;\r\n\r\n if (isUserCode) {\r\n return (\r\n ` ${colors.green(\"›\")} ${colors.dim(\"at\")} ` +\r\n `${colors.yellow(fn || \"<anonymous>\")} ` +\r\n `${colors.cyan(rel)}${colors.dim(loc)}`\r\n );\r\n }\r\n\r\n const label = fn ? `at ${fn} ${rel}${loc}` : `at ${rel}${loc}`;\r\n return ` ${colors.dim(label)}`;\r\n })\r\n .join(\"\\n\");\r\n}\r\n\r\nexport function devLogError(message: string, error?: any) {\r\n console.log(`${timestamp()} ${colors.red(\"✗\")} ${colors.red(message)}`);\r\n if (error?.stack) console.log(formatErrorStack(error.stack));\r\n}\r\n\r\nexport function devLogWarn(message: string) {\r\n console.log(`${timestamp()} ${colors.yellow(\"⚠\")} ${colors.yellow(message)}`);\r\n}\r\n\r\nexport function devLogInfo(message: string) {\r\n console.log(`${timestamp()} ${colors.cyan(message)}`);\r\n}\r\n\r\nexport function devLogDim(message: string) {\r\n console.log(`${timestamp()} ${colors.dim(message)}`);\r\n}\r\n\r\nexport function devLogHMR(file: string, dependents?: number) {\r\n const relativePath = Path.toRelative(file);\r\n const depInfo = dependents\r\n ? colors.dim(` +${dependents} module${dependents > 1 ? \"s\" : \"\"}`)\r\n : \"\";\r\n console.log(\r\n `${timestamp()} 🔥 ${colors.green(\"hmr update\")} ${colors.dim(relativePath)}${depInfo}`,\r\n );\r\n}\r\n\r\nexport function devLogConfig(file: string, connectors?: string[]) {\r\n const relativePath = Path.toRelative(file);\r\n const connectorInfo =\r\n connectors && connectors.length > 0 ? colors.dim(` → restarting ${connectors.join(\", \")}`) : \"\";\r\n console.log(\r\n `${timestamp()} ${colors.cyan(\"config reload\")} ${colors.dim(relativePath)}${connectorInfo}`,\r\n );\r\n}\r\n\r\nexport function devLogReady(message: string) {\r\n console.log(`\\n${timestamp()} ${colors.green(\"➜\")} ${colors.bold(message)}`);\r\n}\r\n\r\nexport function devLogSection(title: string) {\r\n console.log(`\\n${timestamp()} ${colors.bold(colors.cyan(title))}`);\r\n}\r\n\r\n/**\r\n * Format ERR_MODULE_NOT_FOUND so the displayed paths are relative to the\r\n * project root. The loader hook keeps source paths in the URL so we only\r\n * need to strip the absolute prefix — no cache-path translation any more.\r\n */\r\nexport function formatModuleNotFoundError(error: Error, suggestions?: string[]): string {\r\n const match = error.message.match(/Cannot find module '([^']+)' imported from '([^']+)'/);\r\n if (!match) return error.message;\r\n\r\n const [, modulePath, importerPath] = match;\r\n const lines: string[] = [\r\n \"\",\r\n `${colors.red(\"❌ MODULE NOT FOUND\")}`,\r\n \"\",\r\n `${colors.dim(\"Cannot find:\")} ${colors.cyan(Path.toRelative(modulePath))}`,\r\n \"\",\r\n `${colors.dim(\"Imported by:\")}`,\r\n ` ${colors.yellow(\"→\")} ${colors.white(Path.toRelative(importerPath))}`,\r\n ];\r\n\r\n if (suggestions && suggestions.length > 0) {\r\n lines.push(\"\");\r\n lines.push(`${colors.dim(\"Did you mean?\")}`);\r\n suggestions.forEach(s => lines.push(` ${colors.cyan(\"→\")} ${colors.green(s)}`));\r\n }\r\n\r\n lines.push(\"\");\r\n return lines.join(\"\\n\");\r\n}\r\n\r\n/** @deprecated alias retained for older callers. Use `devLog` directly. */\r\nexport const devServeLog = devLog;\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"events.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/events.ts"],"sourcesContent":["export const DEV_SERVER_EVENTS = {\n MANIFEST_NOT_FOUND: \"dev-server.manifest.not-found\",\n FILE_READY: \"dev-server.file.ready\",\n};\n"],"mappings":";AAAA,MAAa,oBAAoB;CAC/B,oBAAoB;CACpB,YAAY;AACd"}
|
|
@@ -5,7 +5,7 @@ import { clearFileExistsCache } from "./parse-imports.mjs";
|
|
|
5
5
|
import { debounce } from "@mongez/reinforcements";
|
|
6
6
|
import events from "@mongez/events";
|
|
7
7
|
|
|
8
|
-
//#region
|
|
8
|
+
//#region ../@warlock.js/core/src/dev-server/file-event-handler.ts
|
|
9
9
|
/**
|
|
10
10
|
* Receives raw watcher events and processes them in a single debounced batch.
|
|
11
11
|
* Order within a batch: adds → changes → deletes, so changes can reference
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-event-handler.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"file-event-handler.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/file-event-handler.ts"],"sourcesContent":["import events from \"@mongez/events\";\r\nimport { debounce } from \"@mongez/reinforcements\";\r\nimport type { DependencyGraph } from \"./dependency-graph\";\r\nimport { devLogSuccess } from \"./dev-logger\";\r\nimport type { FileManager } from \"./file-manager\";\r\nimport type { FileOperations } from \"./file-operations\";\r\nimport { FILE_PROCESSING_BATCH_SIZE } from \"./flags\";\r\nimport type { ManifestManager } from \"./manifest-manager\";\r\nimport { clearFileExistsCache } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\n\r\n/**\r\n * Receives raw watcher events and processes them in a single debounced batch.\r\n * Order within a batch: adds → changes → deletes, so changes can reference\r\n * newly-added files and deletes fire last.\r\n */\r\nexport class FileEventHandler {\r\n private pendingChanges = new Set<string>();\r\n private pendingAdds = new Set<string>();\r\n private pendingDeletes = new Set<string>();\r\n\r\n private readonly processPendingEvents = debounce(() => this.processBatch(), 150);\r\n\r\n constructor(\r\n private readonly fileOperations: FileOperations,\r\n private readonly manifest: ManifestManager,\r\n private readonly dependencyGraph: DependencyGraph,\r\n private readonly files: Map<string, FileManager>,\r\n ) {}\r\n\r\n public handleFileChange(absolutePath: string): void {\r\n this.pendingChanges.add(Path.toRelative(absolutePath));\r\n this.processPendingEvents();\r\n }\r\n\r\n public handleFileAdd(absolutePath: string): void {\r\n this.pendingAdds.add(Path.toRelative(absolutePath));\r\n this.processPendingEvents();\r\n }\r\n\r\n public handleFileDelete(absolutePath: string): void {\r\n this.pendingDeletes.add(Path.toRelative(absolutePath));\r\n this.processPendingEvents();\r\n }\r\n\r\n private async processBatch(): Promise<void> {\r\n const changes = Array.from(this.pendingChanges);\r\n const adds = Array.from(this.pendingAdds);\r\n const deletes = Array.from(this.pendingDeletes);\r\n\r\n this.pendingChanges.clear();\r\n this.pendingAdds.clear();\r\n this.pendingDeletes.clear();\r\n\r\n if (changes.length === 0 && adds.length === 0 && deletes.length === 0) return;\r\n\r\n // Both .env files and warlock.config.ts live outside src/ — they should\r\n // never enter the dep graph, only ride along in the batch event so the\r\n // dev server can react (config reload / restart warning).\r\n const codeChanges = changes.filter(p => !isExternalPath(p));\r\n const codeAdds = adds.filter(p => !isExternalPath(p));\r\n\r\n // Multi-file batches can race the filesystem on Windows.\r\n if (codeAdds.length + codeChanges.length > 1) {\r\n await new Promise(resolve => setTimeout(resolve, 500));\r\n clearFileExistsCache();\r\n }\r\n\r\n await this.processBatchAdds(codeAdds);\r\n await this.processBatchChanges(codeChanges);\r\n await this.processBatchDeletes(deletes);\r\n\r\n this.fileOperations.updateFileDependents();\r\n this.fileOperations.syncFilesToManifest();\r\n await this.manifest.save();\r\n\r\n events.trigger(\"dev-server:batch-complete\", {\r\n added: adds,\r\n changed: changes,\r\n deleted: deletes,\r\n });\r\n }\r\n\r\n private async processBatchChanges(relativePaths: string[]): Promise<void> {\r\n await runInBatches(relativePaths, FILE_PROCESSING_BATCH_SIZE, path =>\r\n this.fileOperations.updateFile(path),\r\n );\r\n }\r\n\r\n private async processBatchAdds(relativePaths: string[]): Promise<void> {\r\n await runInBatches(relativePaths, FILE_PROCESSING_BATCH_SIZE, async path => {\r\n try {\r\n await this.fileOperations.addFile(path);\r\n devLogSuccess(`Added file: ${path}`);\r\n } catch (error) {\r\n console.error(`Failed to add file ${path}:`, error);\r\n }\r\n });\r\n }\r\n\r\n private async processBatchDeletes(relativePaths: string[]): Promise<void> {\r\n for (const relativePath of relativePaths) {\r\n await this.fileOperations.deleteFile(relativePath);\r\n devLogSuccess(`Deleted file: ${relativePath}`);\r\n }\r\n }\r\n}\r\n\r\nfunction isEnvFile(path: string): boolean {\r\n const basename = path.split(\"/\").pop() || path;\r\n return basename === \".env\" || basename.startsWith(\".env.\");\r\n}\r\n\r\n/** Paths watched but never added to the dependency graph. */\r\nfunction isExternalPath(path: string): boolean {\r\n return isEnvFile(path) || path === \"warlock.config.ts\";\r\n}\r\n\r\nasync function runInBatches<T>(\r\n items: T[],\r\n size: number,\r\n fn: (item: T) => Promise<unknown>,\r\n): Promise<void> {\r\n if (items.length === 0) return;\r\n for (let i = 0; i < items.length; i += size) {\r\n await Promise.all(items.slice(i, i + size).map(fn));\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;AAgBA,IAAa,mBAAb,MAA8B;CAO5B,YACE,AAAiB,gBACjB,AAAiB,UACjB,AAAiB,iBACjB,AAAiB,OACjB;EAJiB;EACA;EACA;EACA;wCAVM,IAAI,IAAY;qCACnB,IAAI,IAAY;wCACb,IAAI,IAAY;8BAED,eAAe,KAAK,aAAa,GAAG,GAAG;CAO5E;CAEH,AAAO,iBAAiB,cAA4B;EAClD,KAAK,eAAe,IAAI,KAAK,WAAW,YAAY,CAAC;EACrD,KAAK,qBAAqB;CAC5B;CAEA,AAAO,cAAc,cAA4B;EAC/C,KAAK,YAAY,IAAI,KAAK,WAAW,YAAY,CAAC;EAClD,KAAK,qBAAqB;CAC5B;CAEA,AAAO,iBAAiB,cAA4B;EAClD,KAAK,eAAe,IAAI,KAAK,WAAW,YAAY,CAAC;EACrD,KAAK,qBAAqB;CAC5B;CAEA,MAAc,eAA8B;EAC1C,MAAM,UAAU,MAAM,KAAK,KAAK,cAAc;EAC9C,MAAM,OAAO,MAAM,KAAK,KAAK,WAAW;EACxC,MAAM,UAAU,MAAM,KAAK,KAAK,cAAc;EAE9C,KAAK,eAAe,MAAM;EAC1B,KAAK,YAAY,MAAM;EACvB,KAAK,eAAe,MAAM;EAE1B,IAAI,QAAQ,WAAW,KAAK,KAAK,WAAW,KAAK,QAAQ,WAAW,GAAG;EAKvE,MAAM,cAAc,QAAQ,QAAO,MAAK,CAAC,eAAe,CAAC,CAAC;EAC1D,MAAM,WAAW,KAAK,QAAO,MAAK,CAAC,eAAe,CAAC,CAAC;EAGpD,IAAI,SAAS,SAAS,YAAY,SAAS,GAAG;GAC5C,MAAM,IAAI,SAAQ,YAAW,WAAW,SAAS,GAAG,CAAC;GACrD,qBAAqB;EACvB;EAEA,MAAM,KAAK,iBAAiB,QAAQ;EACpC,MAAM,KAAK,oBAAoB,WAAW;EAC1C,MAAM,KAAK,oBAAoB,OAAO;EAEtC,KAAK,eAAe,qBAAqB;EACzC,KAAK,eAAe,oBAAoB;EACxC,MAAM,KAAK,SAAS,KAAK;EAEzB,OAAO,QAAQ,6BAA6B;GAC1C,OAAO;GACP,SAAS;GACT,SAAS;EACX,CAAC;CACH;CAEA,MAAc,oBAAoB,eAAwC;EACxE,MAAM,aAAa,qBAA2C,SAC5D,KAAK,eAAe,WAAW,IAAI,CACrC;CACF;CAEA,MAAc,iBAAiB,eAAwC;EACrE,MAAM,aAAa,oBAA2C,OAAM,SAAQ;GAC1E,IAAI;IACF,MAAM,KAAK,eAAe,QAAQ,IAAI;IACtC,cAAc,eAAe,MAAM;GACrC,SAAS,OAAO;IACd,QAAQ,MAAM,sBAAsB,KAAK,IAAI,KAAK;GACpD;EACF,CAAC;CACH;CAEA,MAAc,oBAAoB,eAAwC;EACxE,KAAK,MAAM,gBAAgB,eAAe;GACxC,MAAM,KAAK,eAAe,WAAW,YAAY;GACjD,cAAc,iBAAiB,cAAc;EAC/C;CACF;AACF;AAEA,SAAS,UAAU,MAAuB;CACxC,MAAM,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK;CAC1C,OAAO,aAAa,UAAU,SAAS,WAAW,OAAO;AAC3D;;AAGA,SAAS,eAAe,MAAuB;CAC7C,OAAO,UAAU,IAAI,KAAK,SAAS;AACrC;AAEA,eAAe,aACb,OACA,MACA,IACe;CACf,IAAI,MAAM,WAAW,GAAG;CACxB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,MACrC,MAAM,QAAQ,IAAI,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAEtD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FileManifest, FileState, FileType } from "./types.mjs";
|
|
2
2
|
import { FileOperations } from "./file-operations.mjs";
|
|
3
3
|
|
|
4
|
-
//#region
|
|
4
|
+
//#region ../@warlock.js/core/src/dev-server/file-manager.d.ts
|
|
5
5
|
type CleanupFunction = () => void;
|
|
6
6
|
/**
|
|
7
7
|
* FileManager — per-file metadata for the dependency graph.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manager.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"file-manager.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/file-manager.ts"],"mappings":";;;;KASY,eAAA;;AAAZ;;;;AAA2B;AAU3B;;cAAa,WAAA;EAAA,SAgCO,YAAA;EACT,KAAA,EAAO,GAAA,SAAY,WAAA;EACnB,cAAA,EAAgB,cAAA;EAjClB,YAAA;EACA,YAAA;EACA,IAAA;EACA,MAAA;EAiBM;EAdN,YAAA,EAAY,GAAA;EAsBL;;;;EAhBP,oBAAA,EAAoB,GAAA;EAwBkB;EArBtC,SAAA,EAAS,GAAA;EAmCiB;EAhC1B,UAAA,EAAU,GAAA;EAEV,IAAA,EAAM,QAAA;EAgDsD;EA7C5D,OAAA,EAAS,eAAA;EAsHuC;EAnHhD,cAAA;EAEA,KAAA,EAAO,SAAA;cAGI,YAAA,UACT,KAAA,EAAO,GAAA,SAAY,WAAA,GACnB,cAAA,EAAgB,cAAA;EAGlB,UAAA,CAAW,OAAA,EAAS,eAAA,GAAkB,eAAA;EAMtC,YAAA;EAXW;;;;EAmBL,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,YAAA,IAAgB,OAAA;EAjBhC;;;;;;;EAmCZ,OAAA;IAAU;EAAA;IAAmB,KAAA;EAAA,IAAyB,OAAA;EArDnD;;;;;;EAAA,UA8FA,qBAAA,IAAyB,OAAA;EAnFlC;;;;;EAAA,UAmHS,gBAAA,CAAiB,YAAA,EAAc,OAAA,CAAQ,YAAA,IAAgB,OAAA;EAAA,UA6B7D,cAAA;EAsBH,UAAA,IAAc,YAAA;AAAA"}
|
|
@@ -5,7 +5,7 @@ import events from "@mongez/events";
|
|
|
5
5
|
import { getFileAsync, lastModifiedAsync } from "@warlock.js/fs";
|
|
6
6
|
import crypto from "crypto";
|
|
7
7
|
|
|
8
|
-
//#region
|
|
8
|
+
//#region ../@warlock.js/core/src/dev-server/file-manager.ts
|
|
9
9
|
/**
|
|
10
10
|
* FileManager — per-file metadata for the dependency graph.
|
|
11
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-manager.mjs","names":[],"sources":["../../../../../../@warlock.js/core/src/dev-server/file-manager.ts"],"sourcesContent":["import events from \"@mongez/events\";\r\nimport { getFileAsync, lastModifiedAsync } from \"@warlock.js/fs\";\r\nimport crypto from \"crypto\";\r\nimport { DEV_SERVER_EVENTS } from \"./events\";\r\nimport { type FileOperations } from \"./file-operations\";\r\nimport { isTypeOnlyFile, parseImports } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\nimport type { FileManifest, FileState, FileType } from \"./types\";\r\n\r\nexport type CleanupFunction = () => void;\r\n\r\n/**\r\n * FileManager — per-file metadata for the dependency graph.\r\n *\r\n * The loader hook transpiles and caches on-demand at import time, so this\r\n * class never touches disk for anything beyond reading source to hash it\r\n * and parse its imports. Its job is keeping the metadata that the\r\n * orchestrator needs to invalidate dependents on change.\r\n */\r\nexport class FileManager {\r\n public relativePath = \"\";\r\n public lastModified = 0;\r\n public hash = \"\";\r\n public source = \"\";\r\n\r\n /** Files this file imports (relative paths). */\r\n public dependencies = new Set<string>();\r\n\r\n /**\r\n * Subset of `dependencies` reached only through type-only imports — a single\r\n * runtime occurrence makes the whole edge runtime.\r\n */\r\n public typeOnlyDependencies = new Set<string>();\r\n\r\n /** Original specifier → resolved absolute path. */\r\n public importMap = new Map<string, string>();\r\n\r\n /** Files that import this file (relative paths). */\r\n public dependents = new Set<string>();\r\n\r\n public type: FileType | undefined;\r\n\r\n /** Cleanup hooks the loaded module registered for itself. */\r\n public cleanup: CleanupFunction[] = [];\r\n\r\n /** Whether the source has zero runtime imports/exports. */\r\n public isTypeOnlyFile = false;\r\n\r\n public state: FileState = \"idle\";\r\n\r\n public constructor(\r\n public readonly absolutePath: string,\r\n public files: Map<string, FileManager>,\r\n public fileOperations: FileOperations,\r\n ) {}\r\n\r\n public addCleanup(cleanup: CleanupFunction | CleanupFunction[]) {\r\n const next = Array.isArray(cleanup) ? cleanup : [cleanup];\r\n this.cleanup.push(...next);\r\n this.cleanup = [...new Set(this.cleanup)];\r\n }\r\n\r\n public resetCleanup() {\r\n this.cleanup = [];\r\n }\r\n\r\n /**\r\n * Initial setup. Restores from manifest if the hash still matches,\r\n * otherwise re-processes from disk.\r\n */\r\n public async init(fileManifest?: Partial<FileManifest>): Promise<void> {\r\n this.relativePath = Path.toRelative(this.absolutePath);\r\n this.detectFileType();\r\n\r\n if (fileManifest) {\r\n await this.initFromManifest(fileManifest);\r\n } else {\r\n await this.process();\r\n }\r\n }\r\n\r\n /**\r\n * Read source, hash, parse imports, emit ready. The only file-system\r\n * touch happens here; transpilation is the loader hook's job.\r\n *\r\n * @param force - re-parse even when the hash matches.\r\n * @returns true if the file was (re)parsed.\r\n */\r\n public async process({ force = false }: { force?: boolean } = {}): Promise<boolean> {\r\n if (!this.relativePath) this.relativePath = Path.toRelative(this.absolutePath);\r\n if (!this.type) this.detectFileType();\r\n\r\n this.state = \"loading\";\r\n\r\n let newSource: string;\r\n\r\n try {\r\n newSource = await getFileAsync(this.absolutePath);\r\n } catch {\r\n this.state = \"deleted\";\r\n return false;\r\n }\r\n\r\n const newHash = crypto.createHash(\"sha256\").update(newSource).digest(\"hex\");\r\n\r\n if (!force && newHash === this.hash) {\r\n this.state = \"ready\";\r\n return false;\r\n }\r\n\r\n this.source = newSource;\r\n this.hash = newHash;\r\n this.lastModified = (await lastModifiedAsync(this.absolutePath)).getTime();\r\n\r\n await this.rebuildImportMetadata();\r\n this.isTypeOnlyFile = isTypeOnlyFile(this.source);\r\n\r\n this.state = \"ready\";\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Parse the current source and refresh `importMap`, `dependencies`, and\r\n * `typeOnlyDependencies`. A dependency is classified type-only iff every\r\n * import/export statement that resolves to it is type-only — a single\r\n * runtime reference makes the whole edge runtime.\r\n */\r\n protected async rebuildImportMetadata(): Promise<void> {\r\n const resolved = await parseImports(this.source, this.absolutePath);\r\n\r\n this.importMap = new Map();\r\n this.dependencies = new Set();\r\n this.typeOnlyDependencies = new Set();\r\n\r\n const runtimePaths = new Set<string>();\r\n\r\n for (const [originalPath, { absolutePath, isTypeOnly }] of resolved) {\r\n this.importMap.set(originalPath, absolutePath);\r\n\r\n const relativePath = Path.toRelative(absolutePath);\r\n this.dependencies.add(relativePath);\r\n\r\n if (!isTypeOnly) {\r\n runtimePaths.add(relativePath);\r\n }\r\n }\r\n\r\n for (const dependency of this.dependencies) {\r\n if (!runtimePaths.has(dependency)) {\r\n this.typeOnlyDependencies.add(dependency);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Restore from a cached manifest entry. If the on-disk hash matches the\r\n * manifest hash, dep-graph metadata is restored from the manifest without\r\n * re-parsing. Otherwise the file is reprocessed.\r\n */\r\n protected async initFromManifest(fileManifest: Partial<FileManifest>): Promise<void> {\r\n this.type = fileManifest.type;\r\n\r\n this.state = \"loading\";\r\n\r\n try {\r\n this.source = await getFileAsync(this.absolutePath);\r\n } catch {\r\n this.state = \"deleted\";\r\n return;\r\n }\r\n\r\n const currentHash = crypto.createHash(\"sha256\").update(this.source).digest(\"hex\");\r\n\r\n if (currentHash !== fileManifest.hash) {\r\n await this.process({ force: true });\r\n return;\r\n }\r\n\r\n this.hash = fileManifest.hash!;\r\n this.lastModified = fileManifest.lastModified!;\r\n this.dependencies = new Set(fileManifest.dependencies || []);\r\n this.typeOnlyDependencies = new Set(fileManifest.typeOnlyDependencies || []);\r\n this.dependents = new Set(fileManifest.dependents || []);\r\n\r\n this.state = \"ready\";\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\r\n }\r\n\r\n protected detectFileType(): void {\r\n const path = this.relativePath;\r\n\r\n if (path.includes(\"main.ts\") || path.includes(\"main.tsx\")) {\r\n this.type = \"main\";\r\n } else if (path.startsWith(\"src/config/\")) {\r\n this.type = \"config\";\r\n } else if (path.endsWith(\"routes.ts\") || path.endsWith(\"routes.tsx\")) {\r\n this.type = \"route\";\r\n } else if (path.includes(\"/events/\")) {\r\n this.type = \"event\";\r\n } else if (path.includes(\"controller\")) {\r\n this.type = \"controller\";\r\n } else if (path.includes(\"service\")) {\r\n this.type = \"service\";\r\n } else if (path.endsWith(\".model.ts\")) {\r\n this.type = \"model\";\r\n } else {\r\n this.type = \"other\";\r\n }\r\n }\r\n\r\n public toManifest(): FileManifest {\r\n return {\r\n absolutePath: this.absolutePath,\r\n relativePath: this.relativePath,\r\n lastModified: this.lastModified,\r\n hash: this.hash,\r\n dependencies: Array.from(this.dependencies),\r\n typeOnlyDependencies: Array.from(this.typeOnlyDependencies),\r\n dependents: Array.from(this.dependents),\r\n type: this.type!,\r\n };\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"file-manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/file-manager.ts"],"sourcesContent":["import events from \"@mongez/events\";\r\nimport { getFileAsync, lastModifiedAsync } from \"@warlock.js/fs\";\r\nimport crypto from \"crypto\";\r\nimport { DEV_SERVER_EVENTS } from \"./events\";\r\nimport { type FileOperations } from \"./file-operations\";\r\nimport { isTypeOnlyFile, parseImports } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\nimport type { FileManifest, FileState, FileType } from \"./types\";\r\n\r\nexport type CleanupFunction = () => void;\r\n\r\n/**\r\n * FileManager — per-file metadata for the dependency graph.\r\n *\r\n * The loader hook transpiles and caches on-demand at import time, so this\r\n * class never touches disk for anything beyond reading source to hash it\r\n * and parse its imports. Its job is keeping the metadata that the\r\n * orchestrator needs to invalidate dependents on change.\r\n */\r\nexport class FileManager {\r\n public relativePath = \"\";\r\n public lastModified = 0;\r\n public hash = \"\";\r\n public source = \"\";\r\n\r\n /** Files this file imports (relative paths). */\r\n public dependencies = new Set<string>();\r\n\r\n /**\r\n * Subset of `dependencies` reached only through type-only imports — a single\r\n * runtime occurrence makes the whole edge runtime.\r\n */\r\n public typeOnlyDependencies = new Set<string>();\r\n\r\n /** Original specifier → resolved absolute path. */\r\n public importMap = new Map<string, string>();\r\n\r\n /** Files that import this file (relative paths). */\r\n public dependents = new Set<string>();\r\n\r\n public type: FileType | undefined;\r\n\r\n /** Cleanup hooks the loaded module registered for itself. */\r\n public cleanup: CleanupFunction[] = [];\r\n\r\n /** Whether the source has zero runtime imports/exports. */\r\n public isTypeOnlyFile = false;\r\n\r\n public state: FileState = \"idle\";\r\n\r\n public constructor(\r\n public readonly absolutePath: string,\r\n public files: Map<string, FileManager>,\r\n public fileOperations: FileOperations,\r\n ) {}\r\n\r\n public addCleanup(cleanup: CleanupFunction | CleanupFunction[]) {\r\n const next = Array.isArray(cleanup) ? cleanup : [cleanup];\r\n this.cleanup.push(...next);\r\n this.cleanup = [...new Set(this.cleanup)];\r\n }\r\n\r\n public resetCleanup() {\r\n this.cleanup = [];\r\n }\r\n\r\n /**\r\n * Initial setup. Restores from manifest if the hash still matches,\r\n * otherwise re-processes from disk.\r\n */\r\n public async init(fileManifest?: Partial<FileManifest>): Promise<void> {\r\n this.relativePath = Path.toRelative(this.absolutePath);\r\n this.detectFileType();\r\n\r\n if (fileManifest) {\r\n await this.initFromManifest(fileManifest);\r\n } else {\r\n await this.process();\r\n }\r\n }\r\n\r\n /**\r\n * Read source, hash, parse imports, emit ready. The only file-system\r\n * touch happens here; transpilation is the loader hook's job.\r\n *\r\n * @param force - re-parse even when the hash matches.\r\n * @returns true if the file was (re)parsed.\r\n */\r\n public async process({ force = false }: { force?: boolean } = {}): Promise<boolean> {\r\n if (!this.relativePath) this.relativePath = Path.toRelative(this.absolutePath);\r\n if (!this.type) this.detectFileType();\r\n\r\n this.state = \"loading\";\r\n\r\n let newSource: string;\r\n\r\n try {\r\n newSource = await getFileAsync(this.absolutePath);\r\n } catch {\r\n this.state = \"deleted\";\r\n return false;\r\n }\r\n\r\n const newHash = crypto.createHash(\"sha256\").update(newSource).digest(\"hex\");\r\n\r\n if (!force && newHash === this.hash) {\r\n this.state = \"ready\";\r\n return false;\r\n }\r\n\r\n this.source = newSource;\r\n this.hash = newHash;\r\n this.lastModified = (await lastModifiedAsync(this.absolutePath)).getTime();\r\n\r\n await this.rebuildImportMetadata();\r\n this.isTypeOnlyFile = isTypeOnlyFile(this.source);\r\n\r\n this.state = \"ready\";\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Parse the current source and refresh `importMap`, `dependencies`, and\r\n * `typeOnlyDependencies`. A dependency is classified type-only iff every\r\n * import/export statement that resolves to it is type-only — a single\r\n * runtime reference makes the whole edge runtime.\r\n */\r\n protected async rebuildImportMetadata(): Promise<void> {\r\n const resolved = await parseImports(this.source, this.absolutePath);\r\n\r\n this.importMap = new Map();\r\n this.dependencies = new Set();\r\n this.typeOnlyDependencies = new Set();\r\n\r\n const runtimePaths = new Set<string>();\r\n\r\n for (const [originalPath, { absolutePath, isTypeOnly }] of resolved) {\r\n this.importMap.set(originalPath, absolutePath);\r\n\r\n const relativePath = Path.toRelative(absolutePath);\r\n this.dependencies.add(relativePath);\r\n\r\n if (!isTypeOnly) {\r\n runtimePaths.add(relativePath);\r\n }\r\n }\r\n\r\n for (const dependency of this.dependencies) {\r\n if (!runtimePaths.has(dependency)) {\r\n this.typeOnlyDependencies.add(dependency);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Restore from a cached manifest entry. If the on-disk hash matches the\r\n * manifest hash, dep-graph metadata is restored from the manifest without\r\n * re-parsing. Otherwise the file is reprocessed.\r\n */\r\n protected async initFromManifest(fileManifest: Partial<FileManifest>): Promise<void> {\r\n this.type = fileManifest.type;\r\n\r\n this.state = \"loading\";\r\n\r\n try {\r\n this.source = await getFileAsync(this.absolutePath);\r\n } catch {\r\n this.state = \"deleted\";\r\n return;\r\n }\r\n\r\n const currentHash = crypto.createHash(\"sha256\").update(this.source).digest(\"hex\");\r\n\r\n if (currentHash !== fileManifest.hash) {\r\n await this.process({ force: true });\r\n return;\r\n }\r\n\r\n this.hash = fileManifest.hash!;\r\n this.lastModified = fileManifest.lastModified!;\r\n this.dependencies = new Set(fileManifest.dependencies || []);\r\n this.typeOnlyDependencies = new Set(fileManifest.typeOnlyDependencies || []);\r\n this.dependents = new Set(fileManifest.dependents || []);\r\n\r\n this.state = \"ready\";\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, this);\r\n }\r\n\r\n protected detectFileType(): void {\r\n const path = this.relativePath;\r\n\r\n if (path.includes(\"main.ts\") || path.includes(\"main.tsx\")) {\r\n this.type = \"main\";\r\n } else if (path.startsWith(\"src/config/\")) {\r\n this.type = \"config\";\r\n } else if (path.endsWith(\"routes.ts\") || path.endsWith(\"routes.tsx\")) {\r\n this.type = \"route\";\r\n } else if (path.includes(\"/events/\")) {\r\n this.type = \"event\";\r\n } else if (path.includes(\"controller\")) {\r\n this.type = \"controller\";\r\n } else if (path.includes(\"service\")) {\r\n this.type = \"service\";\r\n } else if (path.endsWith(\".model.ts\")) {\r\n this.type = \"model\";\r\n } else {\r\n this.type = \"other\";\r\n }\r\n }\r\n\r\n public toManifest(): FileManifest {\r\n return {\r\n absolutePath: this.absolutePath,\r\n relativePath: this.relativePath,\r\n lastModified: this.lastModified,\r\n hash: this.hash,\r\n dependencies: Array.from(this.dependencies),\r\n typeOnlyDependencies: Array.from(this.typeOnlyDependencies),\r\n dependents: Array.from(this.dependents),\r\n type: this.type!,\r\n };\r\n }\r\n}\r\n"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { ManifestManager } from "./manifest-manager.mjs";
|
|
|
3
3
|
import { SpecialFilesCollector } from "./special-files-collector.mjs";
|
|
4
4
|
import { FileManager } from "./file-manager.mjs";
|
|
5
5
|
|
|
6
|
-
//#region
|
|
6
|
+
//#region ../@warlock.js/core/src/dev-server/file-operations.d.ts
|
|
7
7
|
/**
|
|
8
8
|
* FileOperations — add/update/delete lifecycle for a single file.
|
|
9
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-operations.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"file-operations.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/file-operations.ts"],"mappings":";;;;;;;;AAgBA;;;;cAAa,cAAA;EAAA,iBAEQ,KAAA;EAAA,iBACA,eAAA;EAAA,iBACA,QAAA;EAAA,iBACA,qBAAA;cAHA,KAAA,EAAO,GAAA,SAAY,WAAA,GACnB,eAAA,EAAiB,eAAA,EACjB,QAAA,EAAU,eAAA,EACV,qBAAA,EAAuB,qBAAA;EA2CK;;;;EApClC,OAAA,CAAQ,YAAA,WAAuB,OAAA,CAAQ,WAAA;EATjC;;;;EA6CN,UAAA,CAAW,YAAA,WAAuB,OAAA;EA9CT;;;EA6EzB,UAAA,CAAW,YAAA,WAAuB,OAAA;EA3ElB;;;;EAAA,QAoGf,+BAAA;EAoCP,oBAAA;EAMA,mBAAA;AAAA"}
|
|
@@ -5,7 +5,7 @@ import { FileManager } from "./file-manager.mjs";
|
|
|
5
5
|
import { areSetsEqual } from "./utils.mjs";
|
|
6
6
|
import events from "@mongez/events";
|
|
7
7
|
|
|
8
|
-
//#region
|
|
8
|
+
//#region ../@warlock.js/core/src/dev-server/file-operations.ts
|
|
9
9
|
/**
|
|
10
10
|
* FileOperations — add/update/delete lifecycle for a single file.
|
|
11
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-operations.mjs","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"file-operations.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/file-operations.ts"],"sourcesContent":["import events from \"@mongez/events\";\r\nimport type { DependencyGraph } from \"./dependency-graph\";\r\nimport { DEV_SERVER_EVENTS } from \"./events\";\r\nimport { FileManager } from \"./file-manager\";\r\nimport type { ManifestManager } from \"./manifest-manager\";\r\nimport { parseImports } from \"./parse-imports\";\r\nimport { Path } from \"./path\";\r\nimport type { SpecialFilesCollector } from \"./special-files-collector\";\r\nimport { areSetsEqual } from \"./utils\";\r\n\r\n/**\r\n * FileOperations — add/update/delete lifecycle for a single file.\r\n *\r\n * Coordinates the dependency graph, manifest, and special-files collector\r\n * so the orchestrator and event handler can stay declarative.\r\n */\r\nexport class FileOperations {\r\n public constructor(\r\n private readonly files: Map<string, FileManager>,\r\n private readonly dependencyGraph: DependencyGraph,\r\n private readonly manifest: ManifestManager,\r\n private readonly specialFilesCollector: SpecialFilesCollector,\r\n ) {}\r\n\r\n /**\r\n * Register and process a new file. Recursively pulls in any\r\n * not-yet-tracked dependencies so the dep graph is complete.\r\n */\r\n public async addFile(relativePath: string): Promise<FileManager> {\r\n const existing = this.files.get(relativePath);\r\n if (existing) return existing;\r\n\r\n const fileManager = new FileManager(Path.toAbsolute(relativePath), this.files, this);\r\n\r\n // Register before processing so recursive deps see us.\r\n this.files.set(relativePath, fileManager);\r\n\r\n await fileManager.process();\r\n\r\n for (const depPath of fileManager.dependencies) {\r\n if (!this.files.has(depPath)) {\r\n try {\r\n await this.addFile(depPath);\r\n } catch {\r\n // External or missing — let the importer surface it at load time.\r\n }\r\n }\r\n }\r\n\r\n for (const dependency of fileManager.dependencies) {\r\n this.dependencyGraph.addDependency(relativePath, dependency);\r\n }\r\n\r\n this.specialFilesCollector.addFile(fileManager);\r\n\r\n await this.reloadFilesWaitingForDependency(relativePath);\r\n\r\n return fileManager;\r\n }\r\n\r\n /**\r\n * Reprocess a file after a change. Re-syncs the dep graph and special-files\r\n * collector when its imports or path classification shift.\r\n */\r\n public async updateFile(relativePath: string): Promise<boolean> {\r\n const fileManager = this.files.get(relativePath);\r\n if (!fileManager) {\r\n await this.addFile(relativePath);\r\n return true;\r\n }\r\n\r\n const oldDependencies = new Set(fileManager.dependencies);\r\n\r\n try {\r\n const hasChanged = await fileManager.process();\r\n if (!hasChanged) return false;\r\n\r\n if (!areSetsEqual(oldDependencies, fileManager.dependencies)) {\r\n this.dependencyGraph.updateFile(\r\n relativePath,\r\n fileManager.dependencies,\r\n fileManager.typeOnlyDependencies,\r\n );\r\n }\r\n\r\n this.specialFilesCollector.updateFile(fileManager);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Remove a file. Notifies dependents so they surface broken-import errors.\r\n */\r\n public async deleteFile(relativePath: string): Promise<void> {\r\n const fileManager = this.files.get(relativePath);\r\n if (!fileManager) return;\r\n\r\n const dependents = this.dependencyGraph.getDependents(relativePath);\r\n\r\n this.dependencyGraph.removeFile(relativePath);\r\n this.specialFilesCollector.removeFile(relativePath);\r\n this.manifest.removeFile(relativePath);\r\n\r\n for (const dependentPath of dependents) {\r\n const dependentFile = this.files.get(dependentPath);\r\n if (dependentFile) {\r\n events.trigger(DEV_SERVER_EVENTS.FILE_READY, dependentFile);\r\n }\r\n }\r\n\r\n // Slight delay so in-flight reads still find the FileManager.\r\n setTimeout(() => this.files.delete(relativePath), 300);\r\n }\r\n\r\n /**\r\n * Re-process any file whose imports might now resolve to a freshly added\r\n * file. Covers \"import A from './b'\" where b.ts only just got created.\r\n */\r\n private async reloadFilesWaitingForDependency(newFilePath: string): Promise<void> {\r\n const dependents: string[] = [];\r\n\r\n for (const [existingPath, existingFile] of this.files) {\r\n if (existingPath === newFilePath) continue;\r\n if (existingFile.state !== \"ready\") continue;\r\n\r\n try {\r\n const importMap = await parseImports(existingFile.source, existingFile.absolutePath);\r\n for (const [, resolved] of importMap) {\r\n if (resolved && Path.toRelative(resolved.absolutePath) === newFilePath) {\r\n dependents.push(existingPath);\r\n break;\r\n }\r\n }\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n for (const dependentPath of dependents) {\r\n const dependentFile = this.files.get(dependentPath);\r\n if (!dependentFile) continue;\r\n try {\r\n await dependentFile.process({ force: true });\r\n this.dependencyGraph.updateFile(\r\n dependentPath,\r\n dependentFile.dependencies,\r\n dependentFile.typeOnlyDependencies,\r\n );\r\n } catch {\r\n // File still has issues — ignore.\r\n }\r\n }\r\n }\r\n\r\n public updateFileDependents(): void {\r\n for (const [relativePath, fileManager] of this.files) {\r\n fileManager.dependents = this.dependencyGraph.getDependents(relativePath);\r\n }\r\n }\r\n\r\n public syncFilesToManifest(): void {\r\n for (const [relativePath, fileManager] of this.files) {\r\n this.manifest.setFile(relativePath, fileManager.toManifest());\r\n }\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;AAgBA,IAAa,iBAAb,MAA4B;CAC1B,AAAO,YACL,AAAiB,OACjB,AAAiB,iBACjB,AAAiB,UACjB,AAAiB,uBACjB;EAJiB;EACA;EACA;EACA;CAChB;;;;;CAMH,MAAa,QAAQ,cAA4C;EAC/D,MAAM,WAAW,KAAK,MAAM,IAAI,YAAY;EAC5C,IAAI,UAAU,OAAO;EAErB,MAAM,cAAc,IAAI,YAAY,KAAK,WAAW,YAAY,GAAG,KAAK,OAAO,IAAI;EAGnF,KAAK,MAAM,IAAI,cAAc,WAAW;EAExC,MAAM,YAAY,QAAQ;EAE1B,KAAK,MAAM,WAAW,YAAY,cAChC,IAAI,CAAC,KAAK,MAAM,IAAI,OAAO,GACzB,IAAI;GACF,MAAM,KAAK,QAAQ,OAAO;EAC5B,QAAQ,CAER;EAIJ,KAAK,MAAM,cAAc,YAAY,cACnC,KAAK,gBAAgB,cAAc,cAAc,UAAU;EAG7D,KAAK,sBAAsB,QAAQ,WAAW;EAE9C,MAAM,KAAK,gCAAgC,YAAY;EAEvD,OAAO;CACT;;;;;CAMA,MAAa,WAAW,cAAwC;EAC9D,MAAM,cAAc,KAAK,MAAM,IAAI,YAAY;EAC/C,IAAI,CAAC,aAAa;GAChB,MAAM,KAAK,QAAQ,YAAY;GAC/B,OAAO;EACT;EAEA,MAAM,kBAAkB,IAAI,IAAI,YAAY,YAAY;EAExD,IAAI;GAEF,IAAI,CAAC,MADoB,YAAY,QAAQ,GAC5B,OAAO;GAExB,IAAI,CAAC,aAAa,iBAAiB,YAAY,YAAY,GACzD,KAAK,gBAAgB,WACnB,cACA,YAAY,cACZ,YAAY,oBACd;GAGF,KAAK,sBAAsB,WAAW,WAAW;GACjD,OAAO;EACT,QAAQ;GACN,OAAO;EACT;CACF;;;;CAKA,MAAa,WAAW,cAAqC;EAE3D,IAAI,CADgB,KAAK,MAAM,IAAI,YACpB,GAAG;EAElB,MAAM,aAAa,KAAK,gBAAgB,cAAc,YAAY;EAElE,KAAK,gBAAgB,WAAW,YAAY;EAC5C,KAAK,sBAAsB,WAAW,YAAY;EAClD,KAAK,SAAS,WAAW,YAAY;EAErC,KAAK,MAAM,iBAAiB,YAAY;GACtC,MAAM,gBAAgB,KAAK,MAAM,IAAI,aAAa;GAClD,IAAI,eACF,OAAO,QAAQ,kBAAkB,YAAY,aAAa;EAE9D;EAGA,iBAAiB,KAAK,MAAM,OAAO,YAAY,GAAG,GAAG;CACvD;;;;;CAMA,MAAc,gCAAgC,aAAoC;EAChF,MAAM,aAAuB,CAAC;EAE9B,KAAK,MAAM,CAAC,cAAc,iBAAiB,KAAK,OAAO;GACrD,IAAI,iBAAiB,aAAa;GAClC,IAAI,aAAa,UAAU,SAAS;GAEpC,IAAI;IACF,MAAM,YAAY,MAAM,aAAa,aAAa,QAAQ,aAAa,YAAY;IACnF,KAAK,MAAM,GAAG,aAAa,WACzB,IAAI,YAAY,KAAK,WAAW,SAAS,YAAY,MAAM,aAAa;KACtE,WAAW,KAAK,YAAY;KAC5B;IACF;GAEJ,QAAQ;IACN;GACF;EACF;EAEA,KAAK,MAAM,iBAAiB,YAAY;GACtC,MAAM,gBAAgB,KAAK,MAAM,IAAI,aAAa;GAClD,IAAI,CAAC,eAAe;GACpB,IAAI;IACF,MAAM,cAAc,QAAQ,EAAE,OAAO,KAAK,CAAC;IAC3C,KAAK,gBAAgB,WACnB,eACA,cAAc,cACd,cAAc,oBAChB;GACF,QAAQ,CAER;EACF;CACF;CAEA,AAAO,uBAA6B;EAClC,KAAK,MAAM,CAAC,cAAc,gBAAgB,KAAK,OAC7C,YAAY,aAAa,KAAK,gBAAgB,cAAc,YAAY;CAE5E;CAEA,AAAO,sBAA4B;EACjC,KAAK,MAAM,CAAC,cAAc,gBAAgB,KAAK,OAC7C,KAAK,SAAS,QAAQ,cAAc,YAAY,WAAW,CAAC;CAEhE;AACF"}
|
|
@@ -7,7 +7,7 @@ import { FileHealthCheckerContract } from "./health-checker/file-health-checker.
|
|
|
7
7
|
import { FilesHealthcareManager } from "./health-checker/files-healthcare.manager.mjs";
|
|
8
8
|
import { ModuleLoader } from "./module-loader.mjs";
|
|
9
9
|
|
|
10
|
-
//#region
|
|
10
|
+
//#region ../@warlock.js/core/src/dev-server/files-orchestrator.d.ts
|
|
11
11
|
/**
|
|
12
12
|
* Register a cleanup callback that fires before the current module is
|
|
13
13
|
* unloaded by HMR. Stack-inspects the caller so user code doesn't need to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-orchestrator.d.mts","names":[],"sources":["
|
|
1
|
+
{"version":3,"file":"files-orchestrator.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/dev-server/files-orchestrator.ts"],"mappings":";;;;;;;;;;;;AA8BA;;;iBAAgB,SAAA,CAAU,QAAmB;AAAA;AAuB7C;;;;;;AAvB6C,cAuBhC,iBAAA;EAAA,SACK,YAAA,EAAY,YAAA;EAAA,SACZ,KAAA,EAAK,GAAA,SAAA,WAAA;EAAA,iBACJ,QAAA;EAAA,iBACA,eAAA;EAAA,iBACA,oBAAA;EAAA,SACD,qBAAA,EAAqB,qBAAA;EAAA,SACrB,YAAA,EAAY,YAAA;EAAA,SACZ,cAAA,EAAgB,cAAA;EAAA,iBACf,YAAA;EA+CiB;EAAA,QA5C1B,UAAA;EA4FoB;EAAA,iBAzFX,cAAA;EAEV,aAAA;;EAkBM,GAAA,CAAI,YAAA,WAAuB,OAAA,CAAQ,WAAA;EAInC,IAAA,IAAQ,YAAA,UAAsB,IAAA,YAAc,OAAA,CAAA,CAAA;EAKlD,kBAAA,IAAsB,eAAA;EAItB,oBAAA,CAAqB,IAAA;EAIrB,QAAA,IAAY,GAAA,SAAY,WAAA;EAIxB,uBAAA,IAA2B,sBAAA;EAvDN;;;;EA+Df,IAAA,IAAI,OAAA;EA5DA;;;;EAyFV,WAAA,CAAY,YAAA;EAtFS;;;;;;;EAiGrB,iBAAA,IAAqB,OAAA;EArEf;;;;EAkFA,aAAA,IAAa,OAAA;EAkBb,WAAA,CAAY,KAAA;IAAS,KAAA;IAAiB,OAAA;IAAmB,OAAA;EAAA,IAAmB,OAAA;EAc5E,mBAAA,CAAoB,cAAA,GAAiB,yBAAA,KAA8B,OAAA;EAzGnD;;;EAmHhB,yBAAA,IAA6B,OAAA;EA3GvB;;;EAAA,QAmHL,YAAA;EAAA,QAcA,cAAA;EAgCD,UAAA,IAAU,OAAA;AAAA;AAAA,cAuBZ,iBAAA,EAAiB,iBAA0B"}
|
|
@@ -21,7 +21,7 @@ import { SpecialFilesCollector } from "./special-files-collector.mjs";
|
|
|
21
21
|
import { colors } from "@mongez/copper";
|
|
22
22
|
import { init } from "es-module-lexer";
|
|
23
23
|
|
|
24
|
-
//#region
|
|
24
|
+
//#region ../@warlock.js/core/src/dev-server/files-orchestrator.ts
|
|
25
25
|
/**
|
|
26
26
|
* Register a cleanup callback that fires before the current module is
|
|
27
27
|
* unloaded by HMR. Stack-inspects the caller so user code doesn't need to
|