@warlock.js/core 5.0.2 → 5.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 +190 -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/application/boot-signal.d.mts +1 -1
- package/esm/application/boot-signal.d.mts.map +1 -1
- package/esm/application/boot-signal.mjs +1 -1
- package/esm/application/boot-signal.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-commands.manager.mjs +37 -2
- package/esm/cli/cli-commands.manager.mjs.map +1 -1
- package/esm/cli/cli-commands.utils.mjs +17 -11
- package/esm/cli/cli-commands.utils.mjs.map +1 -1
- package/esm/cli/commands/add.command.mjs +1 -1
- package/esm/cli/commands/add.command.mjs.map +1 -1
- package/esm/cli/commands/build.command.mjs +1 -1
- package/esm/cli/commands/build.command.mjs.map +1 -1
- package/esm/cli/commands/create-database.command.mjs +1 -1
- package/esm/cli/commands/create-database.command.mjs.map +1 -1
- package/esm/cli/commands/dev-server.command.mjs +2 -2
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +207 -0
- package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs +6 -3
- package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/connectors.check.mjs +39 -13
- package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +9 -5
- package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/health.check.mjs +78 -12
- package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/index.mjs +6 -1
- package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +117 -54
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +28 -10
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/routes.check.mjs +52 -13
- package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
- package/esm/cli/commands/doctor/doctor-command.action.mjs +17 -7
- package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
- package/esm/cli/commands/doctor/format-report.mjs +1 -1
- package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
- package/esm/cli/commands/doctor/run-checks.mjs +16 -7
- package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
- package/esm/cli/commands/doctor.command.mjs +18 -10
- package/esm/cli/commands/doctor.command.mjs.map +1 -1
- package/esm/cli/commands/drop-tables.command.mjs +1 -1
- package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
- package/esm/cli/commands/generate/generate.command.mjs +1 -1
- package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
- package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
- package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
- package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/writer.mjs +1 -1
- package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
- package/esm/cli/commands/migrate.command.mjs +1 -1
- package/esm/cli/commands/migrate.command.mjs.map +1 -1
- package/esm/cli/commands/routes/diff-page-routes.mjs +84 -0
- package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -0
- package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
- package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
- package/esm/cli/commands/routes/route-row.mjs +1 -1
- package/esm/cli/commands/routes/route-row.mjs.map +1 -1
- package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
- package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
- package/esm/cli/commands/routes/routes-diff.action.mjs +84 -0
- package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -0
- package/esm/cli/commands/routes.command.mjs +16 -2
- package/esm/cli/commands/routes.command.mjs.map +1 -1
- package/esm/cli/commands/seed.command.mjs +1 -1
- package/esm/cli/commands/seed.command.mjs.map +1 -1
- package/esm/cli/commands/start-production.command.mjs +9 -2
- package/esm/cli/commands/start-production.command.mjs.map +1 -1
- package/esm/cli/commands/storage-put.action.mjs +1 -1
- package/esm/cli/commands/storage-put.action.mjs.map +1 -1
- package/esm/cli/commands/storage-put.command.mjs +1 -1
- package/esm/cli/commands/storage-put.command.mjs.map +1 -1
- package/esm/cli/commands/typings-generator.command.mjs +1 -1
- package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
- package/esm/cli/commands/update.command.mjs +1 -1
- package/esm/cli/commands/update.command.mjs.map +1 -1
- package/esm/cli/commands-loader.mjs +1 -1
- package/esm/cli/commands-loader.mjs.map +1 -1
- package/esm/cli/framework-cli-commands.mjs +3 -2
- package/esm/cli/framework-cli-commands.mjs.map +1 -1
- package/esm/cli/parse-cli-args.mjs +1 -1
- package/esm/cli/parse-cli-args.mjs.map +1 -1
- package/esm/cli/start.mjs +1 -1
- package/esm/cli/start.mjs.map +1 -1
- package/esm/cli/string-similarity.mjs +1 -1
- package/esm/cli/string-similarity.mjs.map +1 -1
- package/esm/commands/cli-command.d.mts +1 -1
- package/esm/commands/cli-command.d.mts.map +1 -1
- package/esm/commands/cli-command.mjs +1 -1
- package/esm/commands/cli-command.mjs.map +1 -1
- package/esm/commands/types.d.mts +1 -1
- package/esm/commands/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 +2 -2
- 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-setter.d.mts +1 -1
- package/esm/config/config-setter.d.mts.map +1 -1
- package/esm/config/config-setter.mjs +1 -1
- package/esm/config/config-setter.mjs.map +1 -1
- package/esm/config/config-special-handlers.d.mts +2 -2
- 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/locale-configuration.mjs +1 -1
- package/esm/config/locale-configuration.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 +1 -1
- package/esm/connectors/access-connector.d.mts.map +1 -1
- package/esm/connectors/access-connector.mjs +1 -1
- package/esm/connectors/access-connector.mjs.map +1 -1
- package/esm/connectors/ai-connector.d.mts +1 -1
- package/esm/connectors/ai-connector.d.mts.map +1 -1
- package/esm/connectors/ai-connector.mjs +1 -1
- package/esm/connectors/ai-connector.mjs.map +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs +1 -1
- package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
- package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
- package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
- package/esm/connectors/assert-unique-connector-names.mjs +1 -1
- package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
- 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 +1 -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/describe-server-address.mjs +108 -8
- package/esm/connectors/describe-server-address.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 +1 -1
- package/esm/connectors/herald-connector.mjs.map +1 -1
- package/esm/connectors/http-connector.d.mts +19 -1
- package/esm/connectors/http-connector.d.mts.map +1 -1
- package/esm/connectors/http-connector.mjs +42 -5
- package/esm/connectors/http-connector.mjs.map +1 -1
- 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 +1 -1
- package/esm/connectors/notifications-connector.d.mts.map +1 -1
- package/esm/connectors/notifications-connector.mjs +1 -1
- package/esm/connectors/notifications-connector.mjs.map +1 -1
- package/esm/connectors/register-configured-connectors.d.mts +1 -1
- package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
- package/esm/connectors/register-configured-connectors.mjs +1 -1
- package/esm/connectors/register-configured-connectors.mjs.map +1 -1
- 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 +1 -1
- package/esm/connectors/types.d.mts.map +1 -1
- package/esm/connectors/types.mjs +1 -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/create-database-action.mjs +1 -1
- package/esm/database/create-database-action.mjs.map +1 -1
- package/esm/database/drop-tables-action.mjs +1 -1
- package/esm/database/drop-tables-action.mjs.map +1 -1
- package/esm/database/migrate-action.mjs +1 -1
- package/esm/database/migrate-action.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/pending-exit-code.mjs +1 -1
- package/esm/database/pending-exit-code.mjs.map +1 -1
- package/esm/database/resolve-pending-migrations.mjs +1 -1
- package/esm/database/resolve-pending-migrations.mjs.map +1 -1
- package/esm/database/seed-command-action.mjs +1 -1
- package/esm/database/seed-command-action.mjs.map +1 -1
- package/esm/database/seeds/seed-records-table-migration.mjs +2 -2
- package/esm/database/seeds/seed-records-table-migration.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.errors.d.mts +1 -1
- package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.mjs +1 -1
- package/esm/database/seeds/seeder.errors.mjs.map +1 -1
- package/esm/database/seeds/seeder.mjs +1 -1
- package/esm/database/seeds/seeder.mjs.map +1 -1
- package/esm/database/seeds/seeders.manager.mjs +1 -1
- package/esm/database/seeds/seeders.manager.mjs.map +1 -1
- package/esm/database/seeds/seeds-table-migration.mjs +2 -2
- package/esm/database/seeds/seeds-table-migration.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/seeds/utils.mjs +1 -1
- package/esm/database/seeds/utils.mjs.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/check-for-updates.mjs +1 -1
- package/esm/dev-server/check-for-updates.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 -5
- package/esm/dev-server/dev-logger.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +4 -8
- package/esm/dev-server/development-server.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.mjs +1 -1
- package/esm/dev-server/files-orchestrator.mjs.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.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.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.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.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/layer-executor.mjs +11 -4
- package/esm/dev-server/layer-executor.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/hook-thread.d.mts +1 -1
- package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
- package/esm/dev-server/loader/hook-thread.mjs +1 -1
- package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
- package/esm/dev-server/loader/load-hook.d.mts +1 -1
- package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
- package/esm/dev-server/loader/load-hook.mjs +1 -1
- package/esm/dev-server/loader/load-hook.mjs.map +1 -1
- package/esm/dev-server/loader/own-resolver.mjs +1 -1
- package/esm/dev-server/loader/own-resolver.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/resolve-capture.mjs +1 -1
- package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
- package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
- package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
- package/esm/dev-server/loader/resolve-hook.mjs +1 -1
- package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
- package/esm/dev-server/loader/source-slug.mjs +1 -1
- package/esm/dev-server/loader/source-slug.mjs.map +1 -1
- package/esm/dev-server/loader/transpile-cache.mjs +13 -4
- package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
- package/esm/dev-server/loader/version-registry.mjs +1 -1
- package/esm/dev-server/loader/version-registry.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.mjs +2 -2
- 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/read-config-ast.mjs +1 -1
- package/esm/dev-server/read-config-ast.mjs.map +1 -1
- package/esm/dev-server/ready-block.mjs +62 -0
- package/esm/dev-server/ready-block.mjs.map +1 -0
- package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
- package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
- package/esm/dev-server/restart-dev-server.mjs +1 -1
- package/esm/dev-server/restart-dev-server.mjs.map +1 -1
- package/esm/dev-server/run-typings-generation.mjs +1 -1
- package/esm/dev-server/run-typings-generation.mjs.map +1 -1
- package/esm/dev-server/shortcuts.mjs +1 -1
- package/esm/dev-server/shortcuts.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/start-development-server.mjs +1 -1
- package/esm/dev-server/start-development-server.mjs.map +1 -1
- package/esm/dev-server/supervisor.mjs +10 -7
- package/esm/dev-server/supervisor.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/type-generator.mjs +1 -1
- package/esm/dev-server/type-generator.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/update-check-cache.mjs +1 -1
- package/esm/dev-server/update-check-cache.mjs.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/generations/add-command.action.mjs +12 -578
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/features/access.feature.mjs +77 -0
- package/esm/generations/features/access.feature.mjs.map +1 -0
- package/esm/generations/features/ai-anthropic.feature.mjs +12 -0
- package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -0
- package/esm/generations/features/ai-bedrock.feature.mjs +12 -0
- package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -0
- package/esm/generations/features/ai-google.feature.mjs +12 -0
- package/esm/generations/features/ai-google.feature.mjs.map +1 -0
- package/esm/generations/features/ai-ollama.feature.mjs +12 -0
- package/esm/generations/features/ai-ollama.feature.mjs.map +1 -0
- package/esm/generations/features/ai-openai.feature.mjs +12 -0
- package/esm/generations/features/ai-openai.feature.mjs.map +1 -0
- package/esm/generations/features/ai-panoptic.feature.mjs +14 -0
- package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -0
- package/esm/generations/features/ai-tools.feature.mjs +14 -0
- package/esm/generations/features/ai-tools.feature.mjs.map +1 -0
- package/esm/generations/features/ai-workspace.feature.mjs +14 -0
- package/esm/generations/features/ai-workspace.feature.mjs.map +1 -0
- package/esm/generations/features/ai.feature.mjs +16 -0
- package/esm/generations/features/ai.feature.mjs.map +1 -0
- package/esm/generations/features/herald.feature.mjs +20 -0
- package/esm/generations/features/herald.feature.mjs.map +1 -0
- package/esm/generations/features/image.feature.mjs +9 -0
- package/esm/generations/features/image.feature.mjs.map +1 -0
- package/esm/generations/features/index.mjs +72 -0
- package/esm/generations/features/index.mjs.map +1 -0
- package/esm/generations/features/mail.feature.mjs +10 -0
- package/esm/generations/features/mail.feature.mjs.map +1 -0
- package/esm/generations/features/mongodb.feature.mjs +9 -0
- package/esm/generations/features/mongodb.feature.mjs.map +1 -0
- package/esm/generations/features/mysql.feature.mjs +9 -0
- package/esm/generations/features/mysql.feature.mjs.map +1 -0
- package/esm/generations/features/notifications.feature.mjs +44 -0
- package/esm/generations/features/notifications.feature.mjs.map +1 -0
- package/esm/generations/features/postgres.feature.mjs +9 -0
- package/esm/generations/features/postgres.feature.mjs.map +1 -0
- package/esm/generations/features/react-email.feature.mjs +70 -0
- package/esm/generations/features/react-email.feature.mjs.map +1 -0
- package/esm/generations/features/react.feature.mjs +16 -0
- package/esm/generations/features/react.feature.mjs.map +1 -0
- package/esm/generations/features/redis.feature.mjs +9 -0
- package/esm/generations/features/redis.feature.mjs.map +1 -0
- package/esm/generations/features/s3.feature.mjs +13 -0
- package/esm/generations/features/s3.feature.mjs.map +1 -0
- package/esm/generations/features/scheduler.feature.mjs +11 -0
- package/esm/generations/features/scheduler.feature.mjs.map +1 -0
- package/esm/generations/features/ses.feature.mjs +9 -0
- package/esm/generations/features/ses.feature.mjs.map +1 -0
- package/esm/generations/features/shadcn.feature.mjs +397 -0
- package/esm/generations/features/shadcn.feature.mjs.map +1 -0
- package/esm/generations/features/shared/link-ai-package-import.mjs +37 -0
- package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -0
- package/esm/generations/features/shared/migration-timestamp.mjs +17 -0
- package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -0
- package/esm/generations/features/socket.feature.mjs +15 -0
- package/esm/generations/features/socket.feature.mjs.map +1 -0
- package/esm/generations/features/tailwind.feature.mjs +174 -0
- package/esm/generations/features/tailwind.feature.mjs.map +1 -0
- package/esm/generations/features/test.feature.mjs +96 -0
- package/esm/generations/features/test.feature.mjs.map +1 -0
- package/esm/generations/features/types.mjs +14 -0
- package/esm/generations/features/types.mjs.map +1 -0
- package/esm/generations/features/web.feature.mjs +187 -0
- package/esm/generations/features/web.feature.mjs.map +1 -0
- package/esm/generations/stubs.mjs +238 -10
- package/esm/generations/stubs.mjs.map +1 -1
- package/esm/http/boot-port-preflight.d.mts +46 -0
- package/esm/http/boot-port-preflight.d.mts.map +1 -0
- package/esm/http/boot-port-preflight.mjs +87 -0
- package/esm/http/boot-port-preflight.mjs.map +1 -0
- package/esm/http/build-cors-options.mjs +1 -1
- package/esm/http/build-cors-options.mjs.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/context/request-memo.d.mts +1 -1
- package/esm/http/context/request-memo.d.mts.map +1 -1
- package/esm/http/context/request-memo.mjs +1 -1
- package/esm/http/context/request-memo.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/health.d.mts +1 -1
- package/esm/http/health.d.mts.map +1 -1
- package/esm/http/health.mjs +1 -1
- package/esm/http/health.mjs.map +1 -1
- package/esm/http/index.d.mts +2 -0
- package/esm/http/index.mjs +2 -0
- 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 +2 -2
- package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
- package/esm/http/middleware/ip-filter.middleware.mjs +2 -2
- 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/port-preflight.d.mts +9 -1
- package/esm/http/port-preflight.d.mts.map +1 -1
- package/esm/http/port-preflight.mjs +9 -2
- package/esm/http/port-preflight.mjs.map +1 -1
- package/esm/http/ready-report.d.mts +56 -0
- package/esm/http/ready-report.d.mts.map +1 -0
- package/esm/http/ready-report.mjs +24 -0
- package/esm/http/ready-report.mjs.map +1 -0
- 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 +15 -3
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +17 -3
- 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 +27 -3
- package/esm/http/server.mjs.map +1 -1
- package/esm/http/types.d.mts +2 -4
- 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 +7 -1
- package/esm/index.mjs +7 -1
- package/esm/logger/fatal-visibility.d.mts +25 -0
- package/esm/logger/fatal-visibility.d.mts.map +1 -0
- package/esm/logger/fatal-visibility.mjs +31 -0
- package/esm/logger/fatal-visibility.mjs.map +1 -0
- package/esm/logger/index.d.mts +1 -0
- package/esm/logger/index.mjs +1 -0
- 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 +3 -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/manifest/manifest-manager.mjs +1 -1
- package/esm/manifest/manifest-manager.mjs.map +1 -1
- package/esm/production/assert-dist-ready-to-start.mjs +24 -0
- package/esm/production/assert-dist-ready-to-start.mjs.map +1 -0
- package/esm/production/assert-generated-imports.mjs +1 -1
- package/esm/production/assert-generated-imports.mjs.map +1 -1
- package/esm/production/build-app-production.mjs +1 -1
- package/esm/production/build-app-production.mjs.map +1 -1
- package/esm/production/build-contributions.mjs +1 -1
- package/esm/production/build-contributions.mjs.map +1 -1
- package/esm/production/dist-build-manifest.mjs +47 -0
- package/esm/production/dist-build-manifest.mjs.map +1 -0
- package/esm/production/esbuild-plugins.mjs +1 -1
- package/esm/production/esbuild-plugins.mjs.map +1 -1
- package/esm/production/production-builder.mjs +69 -14
- package/esm/production/production-builder.mjs.map +1 -1
- package/esm/production/production-supervisor.mjs +22 -10
- package/esm/production/production-supervisor.mjs.map +1 -1
- package/esm/production/promote-dist.mjs +115 -0
- package/esm/production/promote-dist.mjs.map +1 -0
- package/esm/production/resolve-build-config.d.mts +1 -1
- package/esm/production/resolve-build-config.d.mts.map +1 -1
- package/esm/production/resolve-build-config.mjs +1 -1
- package/esm/production/resolve-build-config.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/describe-route-for-log.mjs +1 -1
- package/esm/router/describe-route-for-log.mjs.map +1 -1
- package/esm/router/index.d.mts +3 -0
- package/esm/router/index.mjs +3 -0
- package/esm/router/log-request-lifecycle.mjs +1 -1
- package/esm/router/log-request-lifecycle.mjs.map +1 -1
- package/esm/router/normalize-request-path.d.mts +14 -0
- package/esm/router/normalize-request-path.d.mts.map +1 -0
- package/esm/router/normalize-request-path.mjs +18 -0
- package/esm/router/normalize-request-path.mjs.map +1 -0
- package/esm/router/normalize-route-path.d.mts +28 -0
- package/esm/router/normalize-route-path.d.mts.map +1 -0
- package/esm/router/normalize-route-path.mjs +33 -0
- package/esm/router/normalize-route-path.mjs.map +1 -0
- package/esm/router/positional-handler-diagnostics.d.mts +1 -1
- package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
- package/esm/router/positional-handler-diagnostics.mjs +1 -1
- package/esm/router/positional-handler-diagnostics.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-name-method-suffix.d.mts +33 -0
- package/esm/router/route-name-method-suffix.d.mts.map +1 -0
- package/esm/router/route-name-method-suffix.mjs +39 -0
- package/esm/router/route-name-method-suffix.mjs.map +1 -0
- package/esm/router/route-registry.d.mts +1 -1
- package/esm/router/route-registry.d.mts.map +1 -1
- package/esm/router/route-registry.mjs +4 -3
- package/esm/router/route-registry.mjs.map +1 -1
- package/esm/router/router.d.mts +15 -1
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +51 -12
- 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 +15 -1
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/contain-path.d.mts +1 -1
- package/esm/storage/utils/contain-path.d.mts.map +1 -1
- package/esm/storage/utils/contain-path.mjs +1 -1
- package/esm/storage/utils/contain-path.mjs.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/storage/utils/safe-fetch.d.mts +1 -1
- package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
- package/esm/storage/utils/safe-fetch.mjs +1 -1
- package/esm/storage/utils/safe-fetch.mjs.map +1 -1
- package/esm/storage/utils/storage-error.d.mts +1 -1
- package/esm/storage/utils/storage-error.d.mts.map +1 -1
- package/esm/storage/utils/storage-error.mjs +1 -1
- package/esm/storage/utils/storage-error.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 +3 -2
- package/esm/tests/start-http-development-server.mjs.map +1 -1
- package/esm/tests/test-connectors-selection.d.mts +1 -1
- package/esm/tests/test-connectors-selection.d.mts.map +1 -1
- package/esm/tests/test-connectors-selection.mjs +1 -1
- package/esm/tests/test-connectors-selection.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/test-lifecycle-state.mjs +1 -1
- package/esm/tests/test-lifecycle-state.mjs.map +1 -1
- package/esm/tests/test-server-port-channel.mjs +1 -1
- package/esm/tests/test-server-port-channel.mjs.map +1 -1
- package/esm/tests/test-setup-timeout.mjs +1 -1
- package/esm/tests/test-setup-timeout.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/updater/package-manager.mjs +1 -1
- package/esm/updater/package-manager.mjs.map +1 -1
- package/esm/updater/update-warlock-packages.mjs +1 -1
- package/esm/updater/update-warlock-packages.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 +1 -1
- 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/load-environment.mjs +1 -1
- package/esm/utils/load-environment.mjs.map +1 -1
- package/esm/utils/normalized-path.d.mts +1 -1
- package/esm/utils/normalized-path.d.mts.map +1 -1
- package/esm/utils/normalized-path.mjs +1 -1
- package/esm/utils/normalized-path.mjs.map +1 -1
- package/esm/utils/npm-registry.d.mts +1 -1
- package/esm/utils/npm-registry.d.mts.map +1 -1
- package/esm/utils/npm-registry.mjs +1 -1
- package/esm/utils/npm-registry.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/utils/version-compare.d.mts +1 -1
- package/esm/utils/version-compare.d.mts.map +1 -1
- package/esm/utils/version-compare.mjs +1 -1
- package/esm/utils/version-compare.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/lower-stage3-decorators.d.mts +1 -1
- package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
- package/esm/vite/lower-stage3-decorators.mjs +1 -1
- package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
- 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/normalize-build-config.mjs +1 -1
- package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
- package/esm/warlock-config/types.d.mts +1 -1
- package/esm/warlock-config/types.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
- package/llms-full.txt +527 -91
- package/llms.txt +7 -5
- package/package.json +12 -12
- package/skills/add-connector/SKILL.md +35 -28
- package/skills/create-controller/SKILL.md +1 -1
- package/skills/create-module/SKILL.md +12 -12
- package/skills/hash-password/SKILL.md +4 -4
- package/skills/run-app/SKILL.md +77 -16
- package/skills/send-mail/SKILL.md +2 -2
- package/skills/use-middleware/SKILL.md +13 -4
- package/skills/use-model-transformers/SKILL.md +2 -2
- package/skills/use-repository/SKILL.md +1 -1
- package/skills/use-request-locals/SKILL.md +24 -1
- package/skills/validate-input/SKILL.md +1 -1
- package/skills/warlock-conventions/SKILL.md +6 -2
- package/skills/warlock-doctor/SKILL.md +3 -3
- package/skills/warlock-routes/SKILL.md +47 -9
- package/skills/write-cli-command/SKILL.md +1 -1
- package/skills/write-seeder/SKILL.md +8 -8
package/llms-full.txt
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
name: add-connector
|
|
11
|
-
description: 'Extend Warlock
|
|
11
|
+
description: 'Extend Warlock with a `BaseConnector` subclass and register its instance in `warlock.config.ts > connectors`. Covers runtime lifecycle (`boot`, `start`, `shutdown`, priority, phase, watched files) and the optional static `build.generate` / `build.emit` contribution used by `warlock build`. Triggers: `BaseConnector`, `connectors`, `ConnectorLifecyclePhase`, `ConnectorBuildContribution`, `build.generate`, `build.emit`; "add a queue worker", "wire a subsystem into bootstrap", "contribute files to warlock build", "control startup ordering", "graceful shutdown hook". Skip: app context accessors — `@warlock.js/core/use-app-context/SKILL.md`; general config shape — `@warlock.js/core/configure-app/SKILL.md`; competing pattern: hand-rolled process signal blocks, NestJS lifecycle hooks.'
|
|
12
12
|
---
|
|
13
13
|
|
|
14
14
|
# Warlock — add a connector
|
|
@@ -44,7 +44,7 @@ export class QueueConnector extends BaseConnector {
|
|
|
44
44
|
}
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
That's the connector class. The file's home is `src/connectors/<name>.ts` by convention — but **placing it there does not register it**.
|
|
47
|
+
That's the connector class. The file's home is `src/connectors/<name>.ts` by convention — but **placing it there does not register it**. Add an instance to `warlock.config.ts > connectors` (see [Registering a connector](#registering-a-connector) below).
|
|
48
48
|
|
|
49
49
|
## `BaseConnector` — required surface
|
|
50
50
|
|
|
@@ -100,37 +100,44 @@ If your connector is a self-contained service (queue client, scheduler), `Early`
|
|
|
100
100
|
|
|
101
101
|
## Registering a connector
|
|
102
102
|
|
|
103
|
-
`
|
|
103
|
+
`warlock.config.ts > connectors` is the canonical source for both runtime boot and production-build contributions. Nothing scans `src/connectors/` automatically.
|
|
104
104
|
|
|
105
|
-
```ts title="
|
|
106
|
-
import {
|
|
107
|
-
import { QueueConnector } from "
|
|
105
|
+
```ts title="warlock.config.ts"
|
|
106
|
+
import { defineConfig } from "@warlock.js/core";
|
|
107
|
+
import { QueueConnector } from "./src/connectors/queue-connector";
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
export default defineConfig({
|
|
110
|
+
connectors: [new QueueConnector()],
|
|
111
|
+
});
|
|
110
112
|
```
|
|
111
113
|
|
|
112
|
-
|
|
114
|
+
Order the array deliberately: runtime startup still follows connector priority, while build hooks are drained sequentially in array order. Names must be unique and must not claim a built-in connector name; Warlock rejects either mistake before boot or build work begins.
|
|
113
115
|
|
|
114
|
-
|
|
116
|
+
## Optional production-build contribution
|
|
115
117
|
|
|
116
|
-
|
|
117
|
-
import { config, connectorsManager } from "@warlock.js/core";
|
|
118
|
-
import { ExperimentalIndexerConnector } from "../connectors/experimental-indexer-connector";
|
|
118
|
+
A connector may expose a static `build` object with `generate` and/or `emit`. Import `ConnectorBuildContribution` as a type and add the following property to the connector class. `warlock build` reads it from the configured instance without calling runtime `boot()` or `start()`.
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
120
|
+
```ts title="inside your connector class"
|
|
121
|
+
public readonly build: ConnectorBuildContribution = {
|
|
122
|
+
generate: async context => {
|
|
123
|
+
// Write generated server files beneath context.productionDir.
|
|
124
|
+
// Import optional build tooling inside this hook, not at module scope.
|
|
125
|
+
return {
|
|
126
|
+
entryImports: ['await import("./pages");'],
|
|
127
|
+
esbuild: { external: ["optional-server-peer"] },
|
|
128
|
+
};
|
|
129
|
+
},
|
|
130
|
+
emit: async context => {
|
|
131
|
+
// Emit non-esbuild artifacts after the server bundle is complete.
|
|
132
|
+
},
|
|
133
|
+
};
|
|
123
134
|
```
|
|
124
135
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
> });
|
|
131
|
-
> ```
|
|
132
|
-
>
|
|
133
|
-
> Tracking: [`domains/core/plans/2026-05-23-connectors-in-warlock-config.md`](../../../../domains/core/plans/2026-05-23-connectors-in-warlock-config.md). Until that lands, use `connectorsManager.register(...)` in `main.ts`.
|
|
136
|
+
- `generate(context)` runs before esbuild. It may write into `context.productionDir`, append generated-entry imports, and return a narrow esbuild patch (`jsx`, `jsxImportSource`, `define`, `external`, or `loader`). Generated files are dependency-checked again before bundling.
|
|
137
|
+
- `emit(context)` runs after esbuild and before `.warlock/production` is removed; use it for artifacts esbuild does not produce, such as a client bundle or manifest.
|
|
138
|
+
- Hooks are awaited sequentially in configured array order. A throw names the connector and fails the build.
|
|
139
|
+
- The `build` object is closed to these two hooks. Construct plugins, pipelines, and aliases inside a hook via dynamic import so build-only dependencies do not enter the connector's runtime import graph.
|
|
140
|
+
- Contributor esbuild patches merge before the user's `build` config; user values win. `define` and `loader` merge by key, while `external` concatenates and deduplicates.
|
|
134
141
|
|
|
135
142
|
## `watchedFiles` and dev restarts
|
|
136
143
|
|
|
@@ -227,7 +234,7 @@ See the [Registering a connector](#registering-a-connector) section above for th
|
|
|
227
234
|
- **Set `this.active = true` only on success.** If `start()` throws partway, leaving `active` true means `shutdown()` thinks it has work to do and may double-close half-initialized resources.
|
|
228
235
|
- **`shutdown()` must be idempotent.** SIGINT can fire twice on Windows. The manager guards re-entry with its own flag, but individual connectors get called once per shutdown loop — guard with `if (!this.active) return`.
|
|
229
236
|
- **Don't reach across connector boundaries in `start()`.** The manager's `start()` loop runs all `boot()`s first, then all `start()`s — wiring across connectors goes through the `container` (`container.get("http.server")`), not through imports.
|
|
230
|
-
- **Production build still needs registration.** Placing the connector under `src/connectors/<name>.ts`
|
|
237
|
+
- **Production build still needs config registration.** Placing the connector under `src/connectors/<name>.ts` does not auto-register it. Put the same instance in `warlock.config.ts > connectors`; that array is what build-time contribution discovery and runtime boot share.
|
|
231
238
|
- **`watchedFiles` is restart-trigger, not dependency.** It says "I want to restart when this file changes." It does *not* mean the framework reloads that file first — that's the file orchestrator's job.
|
|
232
239
|
|
|
233
240
|
## See also
|
|
@@ -1228,7 +1235,7 @@ That's the full contract. The `RequestHandler` annotation carries both parameter
|
|
|
1228
1235
|
- File: `src/app/<module>/controllers/<action>.controller.ts`.
|
|
1229
1236
|
- Export name matches the action in camelCase + `Controller` suffix: `listProductsController`, `createProductController`, `getProductController`.
|
|
1230
1237
|
|
|
1231
|
-
Scaffold with: `
|
|
1238
|
+
Scaffold with: `pnpm warlock generate.controller <module>/<action>` (add `--with-validation` to get the schema generated alongside).
|
|
1232
1239
|
|
|
1233
1240
|
## Reading input
|
|
1234
1241
|
|
|
@@ -1430,18 +1437,18 @@ No `if (!product)` branch in the controller. The error class carries the HTTP se
|
|
|
1430
1437
|
|
|
1431
1438
|
---
|
|
1432
1439
|
name: create-module
|
|
1433
|
-
description: 'Scaffold a new feature module under `src/app/<name>/` via `warlock generate.module` and the follow-up generators for controllers, models, repositories, resources, and validation schemas. Triggers: `warlock generate.module`, `generate.controller`, `generate.service`, `generate.model`, `generate.repository`, `generate.resource`, `generate.migration`, `--minimal`, `gen.m`; "scaffold a new module", "create CRUD bootstrap", "add a controller to a module", "generate a model"; typical CLI `
|
|
1440
|
+
description: 'Scaffold a new feature module under `src/app/<name>/` via `warlock generate.module` and the follow-up generators for controllers, models, repositories, resources, and validation schemas. Triggers: `warlock generate.module`, `generate.controller`, `generate.service`, `generate.model`, `generate.repository`, `generate.resource`, `generate.migration`, `--minimal`, `gen.m`; "scaffold a new module", "create CRUD bootstrap", "add a controller to a module", "generate a model"; typical CLI `pnpm warlock generate.module <name>`. Skip: framework-wide layout rules — `@warlock.js/core/warlock-conventions/SKILL.md`; routes file shape — `@warlock.js/core/register-route/SKILL.md`; controller shape — `@warlock.js/core/create-controller/SKILL.md`; competing tooling: `@nestjs/cli`, `hygen`, hand-rolled folder layouts.'
|
|
1434
1441
|
---
|
|
1435
1442
|
|
|
1436
1443
|
# Warlock — create a module
|
|
1437
1444
|
|
|
1438
|
-
A module is a self-contained feature folder under `src/app/<name>/`. The CLI scaffolds the standard subfolders; the framework auto-loads `routes.ts`, `main.ts`, every `.ts(x)` file inside `events/`, and `utils/locales.ts`. You never `import` those files. (`src/app/main.ts` at the project root is also auto-loaded
|
|
1445
|
+
A module is a self-contained feature folder under `src/app/<name>/`. The CLI scaffolds the standard subfolders; the framework auto-loads `routes.ts`, `main.ts`, every `.ts(x)` file inside `events/`, and `utils/locales.ts`. You never `import` those files. (`src/app/main.ts` at the project root is also auto-loaded for global one-time application setup; connector instances belong in `warlock.config.ts > connectors`.)
|
|
1439
1446
|
|
|
1440
1447
|
## The shape
|
|
1441
1448
|
|
|
1442
1449
|
```bash
|
|
1443
|
-
|
|
1444
|
-
|
|
1450
|
+
pnpm warlock generate.module products # full CRUD bootstrap (default — controllers, model, services, repository, resource, schemas, routes, seed)
|
|
1451
|
+
pnpm warlock generate.module products --minimal # bare bones (routes.ts + main.ts + utils/locales.ts + empty subfolders)
|
|
1445
1452
|
```
|
|
1446
1453
|
|
|
1447
1454
|
Full CRUD is the default — opt down to a bare skeleton with `--minimal` (`-m`) when you want to build the module piece by piece. `--force` (`-f`) overwrites existing files. The plural form is auto-derived: `generate.module product` and `generate.module products` produce the same `src/app/products/` folder.
|
|
@@ -1547,9 +1554,9 @@ Inside the same module, plain relative imports (`./`, `../`).
|
|
|
1547
1554
|
### Full CRUD bootstrap
|
|
1548
1555
|
|
|
1549
1556
|
```bash
|
|
1550
|
-
|
|
1557
|
+
pnpm warlock generate.module products
|
|
1551
1558
|
# edit schemas + model fields, then
|
|
1552
|
-
|
|
1559
|
+
pnpm warlock migrate
|
|
1553
1560
|
```
|
|
1554
1561
|
|
|
1555
1562
|
The CRUD scaffold's `routes.ts` already chains the five controllers behind `guarded(...)`:
|
|
@@ -1577,11 +1584,11 @@ guarded(() => {
|
|
|
1577
1584
|
### Skeleton module, add pieces piecemeal
|
|
1578
1585
|
|
|
1579
1586
|
```bash
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1587
|
+
pnpm warlock generate.module orders --minimal
|
|
1588
|
+
pnpm warlock generate.model orders/order --with-resource
|
|
1589
|
+
pnpm warlock generate.repository orders/order
|
|
1590
|
+
pnpm warlock generate.controller orders/place-order --with-validation
|
|
1591
|
+
pnpm warlock generate.controller orders/list-orders
|
|
1585
1592
|
```
|
|
1586
1593
|
|
|
1587
1594
|
Then wire URLs by editing `src/app/orders/routes.ts` and the schema rules in `src/app/orders/schema/`.
|
|
@@ -1602,7 +1609,7 @@ await warmupProductCache();
|
|
|
1602
1609
|
- **There's no standalone `generate.validation` command.** Validation is no longer scaffolded on its own — each controller carries its own schema (imported from `schema/` and bound via `controller.validation`). Generate the controller with `--with-validation` to get the paired schema file, or hand-write the `schema/*.schema.ts`.
|
|
1603
1610
|
- **No `requests/` folder.** Controllers import the schema's exported type + value directly from `schema/*.schema.ts`; there is no `*.request.ts` alias.
|
|
1604
1611
|
- **Subfolder is `seeds/` (plural), not `seed/`.** The seed file is `<module>.seed.ts`.
|
|
1605
|
-
- **`generate.module` does not run the migration.** It only creates the migration file. Run `
|
|
1612
|
+
- **`generate.module` does not run the migration.** It only creates the migration file. Run `pnpm warlock migrate` separately to apply it.
|
|
1606
1613
|
- **`models/<entity>/` is its own folder, not a flat file.** The generator puts `product.model.ts` inside `models/product/` so migrations can sit beside the model in `models/product/migrations/`.
|
|
1607
1614
|
- **Don't import `routes.ts`, `main.ts`, or anything in `events/`.** They're auto-loaded; double-loading errors out at boot.
|
|
1608
1615
|
- **`utils/locales.ts` is mandatory for translation keys.** Skip it and `t("products.notFound")` silently falls back to the key itself.
|
|
@@ -2285,7 +2292,7 @@ The "same error for missing user vs wrong password" pattern is deliberate — it
|
|
|
2285
2292
|
`hashPassword` / `verifyPassword` need `bcryptjs`. Install it directly:
|
|
2286
2293
|
|
|
2287
2294
|
```bash
|
|
2288
|
-
|
|
2295
|
+
pnpm add bcryptjs
|
|
2289
2296
|
```
|
|
2290
2297
|
|
|
2291
2298
|
If you skip the install, the first call throws with the framework's install hint:
|
|
@@ -2294,14 +2301,14 @@ If you skip the install, the first call throws with the framework's install hint
|
|
|
2294
2301
|
Password encryption requires the bcryptjs package.
|
|
2295
2302
|
Install it with:
|
|
2296
2303
|
|
|
2297
|
-
|
|
2304
|
+
pnpm add bcryptjs
|
|
2298
2305
|
|
|
2299
2306
|
Or with your preferred package manager:
|
|
2300
2307
|
|
|
2301
|
-
|
|
2308
|
+
pnpm add bcryptjs
|
|
2302
2309
|
```
|
|
2303
2310
|
|
|
2304
|
-
There is no `warlock add` feature for password hashing — `bcryptjs` is a plain dependency, so install it directly with `
|
|
2311
|
+
There is no `warlock add` feature for password hashing — `bcryptjs` is a plain dependency, so install it directly with `pnpm add bcryptjs`.
|
|
2305
2312
|
|
|
2306
2313
|
## Gotchas
|
|
2307
2314
|
|
|
@@ -2833,6 +2840,152 @@ router.get(["/health", "/healthz"], healthController);
|
|
|
2833
2840
|
- [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, the `guarded` convention, path aliases.
|
|
2834
2841
|
|
|
2835
2842
|
|
|
2843
|
+
## request-memo `@warlock.js/core/request-memo/SKILL.md`
|
|
2844
|
+
|
|
2845
|
+
---
|
|
2846
|
+
name: request-memo
|
|
2847
|
+
description: 'Memoize async work for one HTTP request with `requestMemo<T>(key, fn)` — the v5 replacement for removed `fromRequest`, with single-flight promise sharing, settled-success reuse, rejection eviction, and no cross-request fallback. Triggers: `requestMemo`, `fromRequest`, `fromRequest removed`, `request-scoped cache`, `single-flight`, `current request memo`; "migrate off fromRequest", "load this once per request", "deduplicate concurrent loaders", "cache a repository lookup during one request"; typical import `import { requestMemo } from "@warlock.js/core"`. Skip: middleware-written request state — `@warlock.js/core/use-request-locals/SKILL.md`; process-wide or cross-request caching — `@warlock.js/core/use-middleware/SKILL.md`; competing patterns: dynamic `request[key]` properties, module-global `Map`, payload `request.get()` / `request.set()`.'
|
|
2848
|
+
---
|
|
2849
|
+
|
|
2850
|
+
# Warlock — memoize work for one request
|
|
2851
|
+
|
|
2852
|
+
`requestMemo()` is the v5 replacement for the removed `fromRequest()`. Use it when several code paths in the same HTTP request may need the same asynchronously computed value and the work should run once.
|
|
2853
|
+
|
|
2854
|
+
## The exact signature
|
|
2855
|
+
|
|
2856
|
+
From `core/src/http/context/request-memo.ts`:
|
|
2857
|
+
|
|
2858
|
+
```ts
|
|
2859
|
+
export function requestMemo<T>(key: string, fn: () => Promise<T>): Promise<T>
|
|
2860
|
+
```
|
|
2861
|
+
|
|
2862
|
+
Import it from the package root:
|
|
2863
|
+
|
|
2864
|
+
```ts
|
|
2865
|
+
import { requestMemo } from "@warlock.js/core";
|
|
2866
|
+
```
|
|
2867
|
+
|
|
2868
|
+
`fn` takes no arguments and must return a promise. Close over the current request or the inputs needed by the loader.
|
|
2869
|
+
|
|
2870
|
+
## Migrate from v4 to v5
|
|
2871
|
+
|
|
2872
|
+
### Before — v4 `fromRequest()`
|
|
2873
|
+
|
|
2874
|
+
```ts title="src/app/tenants/utils/current-tenant.ts"
|
|
2875
|
+
import { fromRequest, type Request } from "@warlock.js/core";
|
|
2876
|
+
|
|
2877
|
+
type Tenant = { id: string };
|
|
2878
|
+
|
|
2879
|
+
async function loadTenant(id: string): Promise<Tenant> {
|
|
2880
|
+
return { id };
|
|
2881
|
+
}
|
|
2882
|
+
|
|
2883
|
+
export function currentTenant(request: Request): Promise<Tenant> {
|
|
2884
|
+
const tenantId = String(request.header("x-tenant-id") ?? "");
|
|
2885
|
+
|
|
2886
|
+
return fromRequest("tenants.current", () => loadTenant(tenantId));
|
|
2887
|
+
}
|
|
2888
|
+
```
|
|
2889
|
+
|
|
2890
|
+
### After — v5 `requestMemo()`
|
|
2891
|
+
|
|
2892
|
+
```ts title="src/app/tenants/utils/current-tenant.ts"
|
|
2893
|
+
import { requestMemo, type Request } from "@warlock.js/core";
|
|
2894
|
+
|
|
2895
|
+
type Tenant = { id: string };
|
|
2896
|
+
|
|
2897
|
+
async function loadTenant(id: string): Promise<Tenant> {
|
|
2898
|
+
return { id };
|
|
2899
|
+
}
|
|
2900
|
+
|
|
2901
|
+
export function currentTenant(request: Request): Promise<Tenant> {
|
|
2902
|
+
const tenantId = String(request.header("x-tenant-id") ?? "");
|
|
2903
|
+
|
|
2904
|
+
return requestMemo("tenants.current", () => loadTenant(tenantId));
|
|
2905
|
+
}
|
|
2906
|
+
```
|
|
2907
|
+
|
|
2908
|
+
The call-site migration is usually the import and function name. The complete v5 example above also shows the callback-shape migration: if a v4 callback used the `Request` argument supplied by `fromRequest`, capture the surrounding `request` variable because `requestMemo`'s `fn` receives no arguments.
|
|
2909
|
+
|
|
2910
|
+
## Single-flight behavior
|
|
2911
|
+
|
|
2912
|
+
Within one request, the first call for a key invokes `fn` and stores its promise. Every concurrent caller using that key receives that exact promise, so parallel consumers do not duplicate the work. After the promise resolves, later calls during the same request keep receiving the cached successful promise.
|
|
2913
|
+
|
|
2914
|
+
```ts title="src/app/catalog/controllers/show-product.controller.ts"
|
|
2915
|
+
import { requestMemo, type RequestHandler } from "@warlock.js/core";
|
|
2916
|
+
|
|
2917
|
+
let loads = 0;
|
|
2918
|
+
|
|
2919
|
+
async function loadProduct(): Promise<{ id: string }> {
|
|
2920
|
+
loads += 1;
|
|
2921
|
+
return { id: "product-1" };
|
|
2922
|
+
}
|
|
2923
|
+
|
|
2924
|
+
export const showProductController: RequestHandler = async ({ response }) => {
|
|
2925
|
+
const first = requestMemo("catalog.product", loadProduct);
|
|
2926
|
+
const second = requestMemo("catalog.product", loadProduct);
|
|
2927
|
+
const [product, sameProduct] = await Promise.all([first, second]);
|
|
2928
|
+
|
|
2929
|
+
return response.success({ product, sameProduct, loads });
|
|
2930
|
+
};
|
|
2931
|
+
```
|
|
2932
|
+
|
|
2933
|
+
For that request, `first === second` and `loads` is `1`.
|
|
2934
|
+
|
|
2935
|
+
A rejection is not cached. The rejected entry is deleted immediately, so a later call with the same key retries `fn`. Callers already sharing the rejected promise all observe that rejection.
|
|
2936
|
+
|
|
2937
|
+
## Lifetime and isolation
|
|
2938
|
+
|
|
2939
|
+
The memo table is attached indirectly to the current request-context store through a `WeakMap`. Each incoming request gets a fresh store, so:
|
|
2940
|
+
|
|
2941
|
+
- two concurrent requests never share entries, even when they use the same key;
|
|
2942
|
+
- resolved values live only for the request's context lifetime;
|
|
2943
|
+
- the store and its memo entries are eligible for garbage collection after the request ends;
|
|
2944
|
+
- no value is written onto the `Request` object.
|
|
2945
|
+
|
|
2946
|
+
Calling `requestMemo()` outside the HTTP request pipeline throws synchronously. It deliberately has no process-global fallback. For data meant to survive across requests, use an explicit application cache instead.
|
|
2947
|
+
|
|
2948
|
+
## Why it replaces `fromRequest()`
|
|
2949
|
+
|
|
2950
|
+
`fromRequest()` memoized through dynamic `request[key]` properties. That only type-checked because v4's `Request` had a `[key: string]: any` index signature. v5 removed both the unsafe index signature and `fromRequest()`; `requestMemo()` keeps the one-request lifetime without mutating `Request` or turning values into `any`.
|
|
2951
|
+
|
|
2952
|
+
The new helper also provides real single-flight behavior: it stores the in-flight promise. The old helper awaited its callback before writing the result onto `Request`, so concurrent v4 callers could run the same callback more than once.
|
|
2953
|
+
|
|
2954
|
+
## Key design
|
|
2955
|
+
|
|
2956
|
+
Keys share one string namespace within a request. Use stable, namespaced keys and include every input that changes the result:
|
|
2957
|
+
|
|
2958
|
+
```ts
|
|
2959
|
+
import { requestMemo } from "@warlock.js/core";
|
|
2960
|
+
|
|
2961
|
+
type Product = { id: string };
|
|
2962
|
+
|
|
2963
|
+
async function findProduct(id: string): Promise<Product> {
|
|
2964
|
+
return { id };
|
|
2965
|
+
}
|
|
2966
|
+
|
|
2967
|
+
export function productById(id: string): Promise<Product> {
|
|
2968
|
+
return requestMemo(`catalog.product:${id}`, () => findProduct(id));
|
|
2969
|
+
}
|
|
2970
|
+
```
|
|
2971
|
+
|
|
2972
|
+
Reusing one key for different result types is a caller bug: TypeScript cannot compare the generic type arguments used at separate call sites.
|
|
2973
|
+
|
|
2974
|
+
## Gotchas
|
|
2975
|
+
|
|
2976
|
+
- **Do not call it during bootstrap, in a CLI command, or from a background job.** There is no active HTTP request context there, so it throws.
|
|
2977
|
+
- **Do not omit result-changing inputs from the key.** `catalog.product` is wrong when different IDs may be loaded during one request; use `catalog.product:${id}`.
|
|
2978
|
+
- **Do not use `request.set()` as a replacement.** It writes to the request input payload read by `all()`, `input()`, and `validated()`.
|
|
2979
|
+
- **Failures retry.** If repeated failures must also be cached, this primitive is not that policy; catch and convert the failure into a successful result deliberately, or use another cache.
|
|
2980
|
+
- **Use `request.locals` for state written by middleware and read downstream.** Memoization and request attachment are separate jobs.
|
|
2981
|
+
|
|
2982
|
+
## See also
|
|
2983
|
+
|
|
2984
|
+
- [`use-request-locals/SKILL.md`](../use-request-locals/SKILL.md) — typed per-request data written by middleware.
|
|
2985
|
+
- [`write-middleware/SKILL.md`](../write-middleware/SKILL.md) — authoring and registering middleware.
|
|
2986
|
+
- [`create-controller/SKILL.md`](../create-controller/SKILL.md) — consuming request-scoped values from controllers.
|
|
2987
|
+
|
|
2988
|
+
|
|
2836
2989
|
## resolve-path `@warlock.js/core/resolve-path/SKILL.md`
|
|
2837
2990
|
|
|
2838
2991
|
---
|
|
@@ -3124,7 +3277,7 @@ const result = await measure("publish-event", () =>
|
|
|
3124
3277
|
|
|
3125
3278
|
---
|
|
3126
3279
|
name: run-app
|
|
3127
|
-
description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — `@warlock.js/core/write-cli-command/SKILL.md`; config shape — `@warlock.js/core/configure-app/SKILL.md`; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
|
|
3280
|
+
description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`, `PortInUseError`, `assertPortIsAvailable`, `EADDRINUSE`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server", "port already in use"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — `@warlock.js/core/write-cli-command/SKILL.md`; config shape — `@warlock.js/core/configure-app/SKILL.md`; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
|
|
3128
3281
|
---
|
|
3129
3282
|
|
|
3130
3283
|
# Warlock — run the app
|
|
@@ -3135,13 +3288,13 @@ Three commands move the app through its lifecycle: `dev` while you're editing, `
|
|
|
3135
3288
|
|
|
3136
3289
|
```bash
|
|
3137
3290
|
# Local development
|
|
3138
|
-
|
|
3291
|
+
pnpm warlock dev
|
|
3139
3292
|
|
|
3140
3293
|
# Production build
|
|
3141
|
-
|
|
3294
|
+
pnpm warlock build
|
|
3142
3295
|
|
|
3143
3296
|
# Run the built bundle
|
|
3144
|
-
|
|
3297
|
+
pnpm warlock start
|
|
3145
3298
|
```
|
|
3146
3299
|
|
|
3147
3300
|
`dev` and `start` are **persistent** (long-running, no auto-exit). `build` is one-shot — it exits when the bundle is written.
|
|
@@ -3207,6 +3360,8 @@ A worker that dies **after running healthily for at least 5s** — OOM, a native
|
|
|
3207
3360
|
|
|
3208
3361
|
A worker that dies *sooner* than that failed to **boot** — a broken config, a port already taken — and it has already printed why. Restarting there would just reprint the same error and bury it, so the supervisor mirrors the exit code and stops.
|
|
3209
3362
|
|
|
3363
|
+
A busy port is now caught *before* the bind attempt: the HTTP connector calls `assertPortIsAvailable(port, host)` immediately before `listen()`, so the failure is `Port <port> is already in use on <host>. Stop the dev server (or whatever else is listening on port <port>) and run again, or start on a free port…` — not a raw `EADDRINUSE` surfacing from inside Fastify. Same connector, same preflight, for `warlock start`.
|
|
3364
|
+
|
|
3210
3365
|
Flapping is capped: more than 3 crashes inside 60s and the supervisor gives up rather than restarting behind your back.
|
|
3211
3366
|
|
|
3212
3367
|
An explicit restart (`r`, `u`, a config change) is a *request*, not a crash, so the uptime rule never swallows it.
|
|
@@ -3311,6 +3466,23 @@ Defaults are sensible for the typical "Node service" deployment. Knobs to actual
|
|
|
3311
3466
|
|
|
3312
3467
|
Just `warlockConfig: true`. Build doesn't need the app booted — it reads `warlock.config.ts`, runs esbuild, writes the file. Fast.
|
|
3313
3468
|
|
|
3469
|
+
### The build is all-or-nothing (5.2)
|
|
3470
|
+
|
|
3471
|
+
`warlock build` never writes into `outdir` while it works. It builds into a hidden **sibling** temp directory — `.<outdir-basename>.build-<12 hex>`, e.g. `./.dist.build-9f1c2ab40de7` next to `./dist` — and only when every step has succeeded does it promote that directory into place with a rename. Same volume, so the promotion is atomic.
|
|
3472
|
+
|
|
3473
|
+
Two consequences you can rely on:
|
|
3474
|
+
|
|
3475
|
+
- **A successful build leaves no stale files.** Promotion replaces `outdir` wholesale (the old one is moved aside, the temp is renamed in, the old one is deleted). A file that an earlier build emitted and this one did not is gone — it is not merged over.
|
|
3476
|
+
- **A failed build leaves no usable `dist`.** The error path removes the temp directory and rethrows without ever touching `outdir`. A previous good `dist` is left exactly as it was; if there was none, none appears.
|
|
3477
|
+
|
|
3478
|
+
The last thing written into the temp directory before promotion is `.warlock-build.json`, a two-field marker:
|
|
3479
|
+
|
|
3480
|
+
```json
|
|
3481
|
+
{ "status": "success", "builtAt": "2026-09-01T12:34:56.789Z" }
|
|
3482
|
+
```
|
|
3483
|
+
|
|
3484
|
+
It exists so `warlock start` can tell a promoted build from a directory that merely looks like one.
|
|
3485
|
+
|
|
3314
3486
|
### Where the bundle lands
|
|
3315
3487
|
|
|
3316
3488
|
```
|
|
@@ -3320,16 +3492,28 @@ Just `warlockConfig: true`. Build doesn't need the app booted — it reads `warl
|
|
|
3320
3492
|
|
|
3321
3493
|
`warlock start` uses the same `resolveBuildConfig()` helper to find the bundle, so the two commands stay in sync no matter how you override the config. If `build` and `start` disagree on where the bundle is, it's because `warlock.config.ts` is being read with different cwds — never the case in normal operation.
|
|
3322
3494
|
|
|
3495
|
+
If the app uses `@warlock.js/web` page routes, a successful `warlock build` also writes `page-routes.manifest.json` next to the bundle (same `outdir`) — the snapshot `warlock routes:diff` compares the live dev surface against. See [`warlock-routes/SKILL.md`](../warlock-routes/SKILL.md#warlock-routesdiff--catch-page-route-drift-before-it-ships).
|
|
3496
|
+
|
|
3323
3497
|
## `warlock start` — run the production bundle
|
|
3324
3498
|
|
|
3325
3499
|
Spawns `node <entryPath>` as a child process, forwarding signals (SIGINT / SIGTERM). `entryPath` is resolved from the same `build` config that produced the bundle.
|
|
3326
3500
|
|
|
3501
|
+
### It refuses a `dist` no successful build produced (5.2)
|
|
3502
|
+
|
|
3503
|
+
Before spawning anything, `start` looks for the `.warlock-build.json` success marker in `outdir`. Missing, unreadable, malformed, or `status !== "success"` all collapse to one refusal on **stderr**, exit code `1`:
|
|
3504
|
+
|
|
3505
|
+
```
|
|
3506
|
+
✖ "dist" was not produced by a successful `warlock build` run (no build-success marker found). Run `warlock build` before `warlock start`.
|
|
3507
|
+
```
|
|
3508
|
+
|
|
3509
|
+
The three cases that reach it are: never built; a build that failed before promotion; and a directory assembled or edited by hand. They are deliberately not distinguished — the answer to all three is the same command. Note this replaces the old behaviour where `start` ran whatever happened to be sitting in `dist/`.
|
|
3510
|
+
|
|
3327
3511
|
### Behavior
|
|
3328
3512
|
|
|
3329
3513
|
```bash
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3514
|
+
pnpm warlock start # → spawns node --enable-source-maps dist/app.js
|
|
3515
|
+
pnpm warlock start --inspect # → spawns node --enable-source-maps --inspect dist/app.js
|
|
3516
|
+
pnpm warlock start --max-old-space-size=4096 # → spawns node --enable-source-maps --max-old-space-size=4096 dist/app.js
|
|
3333
3517
|
```
|
|
3334
3518
|
|
|
3335
3519
|
Everything you pass after `start` is forwarded to the spawned Node process. Use this to attach a debugger (`--inspect`), tune memory (`--max-old-space-size`), or pass any other Node flag without editing the command.
|
|
@@ -3381,8 +3565,36 @@ The started banner prints **only** when the running application reports a comple
|
|
|
3381
3565
|
|
|
3382
3566
|
```bash
|
|
3383
3567
|
# a CI gate can be this blunt, and it is now correct
|
|
3384
|
-
|
|
3568
|
+
pnpm warlock start | grep -q "production server started"
|
|
3569
|
+
```
|
|
3570
|
+
|
|
3571
|
+
### Reading a failed start (5.2)
|
|
3572
|
+
|
|
3573
|
+
The child is spawned with piped stdout/stderr and **every chunk is forwarded verbatim, live**, to the parent's matching stream. The application's own boot error is the thing you read — `warlock start` adds a summary underneath it, it does not replace it:
|
|
3574
|
+
|
|
3575
|
+
```
|
|
3576
|
+
✖ warlock start failed — the server never finished booting
|
|
3577
|
+
the application process exited with code 1
|
|
3578
|
+
the cause is printed above, in the application's own output
|
|
3579
|
+
```
|
|
3580
|
+
|
|
3581
|
+
The third line is conditional on the parent having actually seen child output. When the child produced none, it says so instead of pointing at something that isn't there:
|
|
3582
|
+
|
|
3385
3583
|
```
|
|
3584
|
+
no output was captured from the application process — its cause did not reach this terminal
|
|
3585
|
+
```
|
|
3586
|
+
|
|
3587
|
+
That distinction is the point of the change: an unhelpful "see above" printed above an empty terminal used to be the entire diagnostic.
|
|
3588
|
+
|
|
3589
|
+
**Port already in use.** The HTTP connector preflights the port immediately before `listen()`, so a collision is named rather than surfacing as a raw `EADDRINUSE` from inside Fastify:
|
|
3590
|
+
|
|
3591
|
+
```
|
|
3592
|
+
EADDRINUSE: Port 3000 is already in use on 127.0.0.1. Stop the dev server (or whatever
|
|
3593
|
+
else is listening on port 3000) and run again, or start on a free port — e.g.
|
|
3594
|
+
startHttpTestServer({ port: 3001 }).
|
|
3595
|
+
```
|
|
3596
|
+
|
|
3597
|
+
The connector logs it fatally and exits `1`; the supervisor forwards that text and then prints the failure summary above it. `EACCES` on the port is treated the same way as `EADDRINUSE` (a privileged port you may not bind is also "not available"); anything else the probe throws is rethrown untouched.
|
|
3386
3598
|
|
|
3387
3599
|
### How readiness is reported
|
|
3388
3600
|
|
|
@@ -3428,7 +3640,7 @@ If you need conditional behavior, branch on `Application.environment` (the ortho
|
|
|
3428
3640
|
}
|
|
3429
3641
|
```
|
|
3430
3642
|
|
|
3431
|
-
Now `
|
|
3643
|
+
Now `pnpm dev` / `pnpm build` / `pnpm start`. Standard Node hosting providers (Render, Fly, Railway, Heroku) recognize this layout.
|
|
3432
3644
|
|
|
3433
3645
|
### Production Dockerfile
|
|
3434
3646
|
|
|
@@ -3436,9 +3648,9 @@ Now `yarn dev` / `yarn build` / `yarn start`. Standard Node hosting providers (R
|
|
|
3436
3648
|
FROM node:20-alpine AS build
|
|
3437
3649
|
WORKDIR /app
|
|
3438
3650
|
COPY package.json yarn.lock ./
|
|
3439
|
-
RUN
|
|
3651
|
+
RUN pnpm install --frozen-lockfile
|
|
3440
3652
|
COPY . .
|
|
3441
|
-
RUN
|
|
3653
|
+
RUN pnpm warlock build
|
|
3442
3654
|
|
|
3443
3655
|
FROM node:20-alpine
|
|
3444
3656
|
WORKDIR /app
|
|
@@ -3482,7 +3694,7 @@ That is deliberate: `build` and `start` do **not** force `production`. Forcing i
|
|
|
3482
3694
|
### Skip type-gen on machines without write access
|
|
3483
3695
|
|
|
3484
3696
|
```bash
|
|
3485
|
-
|
|
3697
|
+
pnpm warlock dev --skip-typings
|
|
3486
3698
|
```
|
|
3487
3699
|
|
|
3488
3700
|
Or persist it:
|
|
@@ -3500,21 +3712,22 @@ Useful in a containerized dev environment where `.warlock/typings.d.ts` is read-
|
|
|
3500
3712
|
### Memory-tune the production process
|
|
3501
3713
|
|
|
3502
3714
|
```bash
|
|
3503
|
-
|
|
3715
|
+
pnpm warlock start --max-old-space-size=4096
|
|
3504
3716
|
```
|
|
3505
3717
|
|
|
3506
3718
|
Or via `NODE_OPTIONS` in the deployment env if you don't want to change the start invocation:
|
|
3507
3719
|
|
|
3508
3720
|
```bash
|
|
3509
|
-
NODE_OPTIONS=--max-old-space-size=4096
|
|
3721
|
+
NODE_OPTIONS=--max-old-space-size=4096 pnpm warlock start
|
|
3510
3722
|
```
|
|
3511
3723
|
|
|
3512
3724
|
## Gotchas
|
|
3513
3725
|
|
|
3514
3726
|
- **`warlock dev` is persistent — `Ctrl+C` to stop.** The framework's `persistent: true` flag keeps the process alive after `action` returns. Same for `start`.
|
|
3515
3727
|
- **`--fresh` only deletes the manifest, not the transpile cache.** If you're chasing a stale-compile bug, `rm -rf .warlock/` clears everything. The manifest restoring is what `--fresh` solves.
|
|
3516
|
-
- **`warlock build` does NOT run migrations.** Production bundles ship the migration files but don't apply them. Run `
|
|
3517
|
-
- **`warlock start` requires a
|
|
3728
|
+
- **`warlock build` does NOT run migrations.** Production bundles ship the migration files but don't apply them. Run `pnpm warlock migrate` against the production DB separately.
|
|
3729
|
+
- **`warlock start` requires a build it can vouch for.** Since 5.2 it refuses any `outdir` without the `.warlock-build.json` success marker — a hand-assembled `dist/`, or one left behind by a build that failed, is rejected by that reason instead of being spawned and crashing halfway through boot. Run `warlock build` first.
|
|
3730
|
+
- **Do not add `.warlock-build.json` to `.gitignore`-driven artifact pruning.** Stripping it from a `dist/` you ship makes `warlock start` refuse the artifact on the target host. Copy `outdir` whole.
|
|
3518
3731
|
- **`outdir` is the directory, `outFile` is the filename within it.** A common mistake is putting the full path in one and leaving the other default — you end up with `<full-path>/app.js` or `dist/<full-path>`. They concatenate.
|
|
3519
3732
|
- **`sourcemap: false` cascades to `start`.** Stack traces lose `.ts` precision. Keep sourcemaps on unless artifact size is a hard constraint.
|
|
3520
3733
|
- **`NODE_ENV` is not set by these commands.** The deployment env (your Dockerfile, CI, hosting provider) sets it. Forget it on a production server and `Application.isProduction` returns `false`, which flips cookie security, CORS, logging — silently. Always set `NODE_ENV=production` in production deployments.
|
|
@@ -3527,6 +3740,7 @@ NODE_OPTIONS=--max-old-space-size=4096 yarn warlock start
|
|
|
3527
3740
|
- [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — `Application.environment` vs `Application.runtimeStrategy`.
|
|
3528
3741
|
- [`add-connector/SKILL.md`](../add-connector/SKILL.md) — Early vs Late connector phases (why HTTP/socket boot late in dev).
|
|
3529
3742
|
- [`update-packages/SKILL.md`](../update-packages/SKILL.md) — `warlock update` + the dev-server update notice (`devServer.checkForUpdates`).
|
|
3743
|
+
- [`warlock-routes/SKILL.md`](../warlock-routes/SKILL.md) — `warlock routes` / `warlock routes:diff`, the latter comparing live page routes against the manifest `warlock build` writes.
|
|
3530
3744
|
|
|
3531
3745
|
|
|
3532
3746
|
## send-mail `@warlock.js/core/send-mail/SKILL.md`
|
|
@@ -3618,7 +3832,7 @@ const config: MailConfigurations = {
|
|
|
3618
3832
|
};
|
|
3619
3833
|
```
|
|
3620
3834
|
|
|
3621
|
-
Requires `@aws-sdk/client-sesv2` installed (`
|
|
3835
|
+
Requires `@aws-sdk/client-sesv2` installed (`pnpm add @aws-sdk/client-sesv2`).
|
|
3622
3836
|
|
|
3623
3837
|
## Mail modes
|
|
3624
3838
|
|
|
@@ -3894,7 +4108,7 @@ await Mail.to(user.email)
|
|
|
3894
4108
|
|
|
3895
4109
|
- **`.send()` validates** — `to`, `subject`, and at least one of `text`/`html`/`component` are required. Missing any throws synchronously.
|
|
3896
4110
|
- **`@react-email/render` is optional.** Without it you get the basic fallback (inline styles, no MSO conditionals). Install it for production-quality HTML.
|
|
3897
|
-
- **`nodemailer` is loaded lazily** at import time. If you see `nodemailer is not installed` errors, run `warlock add mail` (or `
|
|
4111
|
+
- **`nodemailer` is loaded lazily** at import time. If you see `nodemailer is not installed` errors, run `warlock add mail` (or `pnpm add nodemailer`).
|
|
3898
4112
|
- **`secure: true` requires port 465.** For port 587 use `secure: false` and `tls: true` (STARTTLS).
|
|
3899
4113
|
- **Test mode is process-global.** Set it in `beforeAll`/`beforeEach`; reset with `setMailMode("production")` (or rely on test runner isolation).
|
|
3900
4114
|
- **Per-mail handlers don't replace global ones** — both fire. Avoid double-counting metrics.
|
|
@@ -6455,16 +6669,25 @@ export default {
|
|
|
6455
6669
|
|
|
6456
6670
|
⚠ **Since 4.13.0 `http.trustProxy` defaults to `false`**, so `request.detectIp()` returns the socket address and **`X-Real-IP` / `X-Forwarded-For` are ignored unless you opt in.** Before 4.13.0 the default was `true`, which meant any client could set its own forwarding header and be believed.
|
|
6457
6671
|
|
|
6458
|
-
⚠ **Opt in with the narrowest shape your topology allows, not with `true`.**
|
|
6672
|
+
⚠ **Opt in with the narrowest shape your topology allows, not with `true`.** `http.trustProxy` takes a trusted-proxy list, and `detectIp()` resolves the chain the same way Fastify's `request.ip` does:
|
|
6459
6673
|
|
|
6460
6674
|
| `http.trustProxy` | Client IP |
|
|
6461
6675
|
| --- | --- |
|
|
6462
6676
|
| `false` *(default)* | Socket peer address |
|
|
6463
|
-
| `
|
|
6464
|
-
| `
|
|
6677
|
+
| `"10.0.0.0/8"` / `"loopback, 10.0.0.0/8"` / `["10.0.0.0/8", "192.168.0.0/16"]` | Walks left while each hop is a listed proxy, stops at the first that isn't |
|
|
6678
|
+
| `(address, hop) => boolean` | Your own predicate |
|
|
6465
6679
|
| `true` | Trusts the whole chain — the leftmost hop, i.e. **whatever the client put there** if your edge appends rather than overwrites |
|
|
6466
6680
|
|
|
6467
|
-
|
|
6681
|
+
⚠ **Since 5.2 the value is validated at boot, and a hop count is refused.** The accepted shapes are exactly `boolean`, a non-empty string (comma-separated IPs/CIDRs), a non-empty `string[]`, and an `(address, hop) => boolean` predicate. Missing or nullish means `false`. Anything else — a **number**, `""`, `[]`, a mixed array, a plain object — throws a `TypeError` while the HTTP server is being constructed instead of being silently coerced:
|
|
6682
|
+
|
|
6683
|
+
```
|
|
6684
|
+
Invalid http.trustProxy configuration: expected a boolean, a non-empty IP/CIDR string,
|
|
6685
|
+
a non-empty string array, or a predicate function; received number.
|
|
6686
|
+
```
|
|
6687
|
+
|
|
6688
|
+
A hop count (`trustProxy: 2`) used to be documented as the shape to prefer. It is now refused **loudly**, because the Fastify version Warlock builds against treats a number as always-false at runtime: it silently degraded to "trust nothing" rather than walking past your proxies. Express the same topology as a proxy list (`"10.0.0.0/8"`) or a predicate.
|
|
6689
|
+
|
|
6690
|
+
With `true`, any client that can reach the process directly picks its own IP and this allowlist is decorative. `X-Real-IP` is honoured only under `true` — it carries no chain to check a proxy list against — so if your edge sets only that header, have it set `X-Forwarded-For` too.
|
|
6468
6691
|
|
|
6469
6692
|
```ts
|
|
6470
6693
|
import { middleware } from "@warlock.js/core";
|
|
@@ -6638,7 +6861,7 @@ What it does at save time:
|
|
|
6638
6861
|
| Existing row, password unchanged | Pass through (no re-hashing — stored hash preserved). |
|
|
6639
6862
|
| Empty / undefined value | Pass through untouched. |
|
|
6640
6863
|
|
|
6641
|
-
Calls `authService.hashPassword(String(value))` under the hood — same bcryptjs path as the standalone `hashPassword()` helper. See [`hash-password/SKILL.md`](../hash-password/SKILL.md) for full bcrypt setup (salt rounds, `
|
|
6864
|
+
Calls `authService.hashPassword(String(value))` under the hood — same bcryptjs path as the standalone `hashPassword()` helper. See [`hash-password/SKILL.md`](../hash-password/SKILL.md) for full bcrypt setup (salt rounds, `pnpm add bcryptjs`).
|
|
6642
6865
|
|
|
6643
6866
|
### Why declarative wins
|
|
6644
6867
|
|
|
@@ -6792,7 +7015,7 @@ Rule of thumb: transformers are for **pure, deterministic** transforms of the ro
|
|
|
6792
7015
|
|
|
6793
7016
|
## See also
|
|
6794
7017
|
|
|
6795
|
-
- [`hash-password/SKILL.md`](../hash-password/SKILL.md) — the bcrypt setup that `useHashedPassword` calls under the hood; salt rounds, `
|
|
7018
|
+
- [`hash-password/SKILL.md`](../hash-password/SKILL.md) — the bcrypt setup that `useHashedPassword` calls under the hood; salt rounds, `pnpm add bcryptjs`.
|
|
6796
7019
|
- [`use-repository/SKILL.md`](../use-repository/SKILL.md) — where `create` / `save` calls happen that trigger the transformers.
|
|
6797
7020
|
- [`define-resource/SKILL.md`](../define-resource/SKILL.md) — filtering transformed fields (`password`) out of API responses.
|
|
6798
7021
|
- [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — schema files live in `src/app/<module>/models/<entity>/<entity>.model.ts`.
|
|
@@ -6855,7 +7078,7 @@ Five lines do the heavy lifting:
|
|
|
6855
7078
|
4. **`defaultOptions`** — applied to every call (`orderBy`, default `limit`, etc.).
|
|
6856
7079
|
5. **`new FaqsRepository()`** singleton — import this everywhere; never instantiate again.
|
|
6857
7080
|
|
|
6858
|
-
The class is intentionally private — only the singleton escapes the module. Scaffold with `
|
|
7081
|
+
The class is intentionally private — only the singleton escapes the module. Scaffold with `pnpm warlock generate.repository <module>/<entity>`.
|
|
6859
7082
|
|
|
6860
7083
|
## The `filterBy` rules
|
|
6861
7084
|
|
|
@@ -7232,6 +7455,177 @@ The third arg is a context object — `{ allValues, dateFormat, ... }` — for f
|
|
|
7232
7455
|
- [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — controller → service → repository → model layering.
|
|
7233
7456
|
|
|
7234
7457
|
|
|
7458
|
+
## use-request-locals `@warlock.js/core/use-request-locals/SKILL.md`
|
|
7459
|
+
|
|
7460
|
+
---
|
|
7461
|
+
name: use-request-locals
|
|
7462
|
+
description: 'Carry typed, server-only data through one HTTP request with `request.locals`, usually written by middleware and read by downstream middleware or controllers. Augment `RequestLocals` in the module that owns each key; v5 no longer permits arbitrary `request.foo` properties. Triggers: `request.locals`, `RequestLocals`, `request.post`, `request.organization`, `Property does not exist on type Request`, `Request index signature`; "attach data to a request", "share middleware data with a controller", "type request locals", "migrate dynamic request properties"; typical type augmentation `declare module "@warlock.js/core" { interface RequestLocals { ... } }`. Skip: computed-on-demand single-flight values and removed `fromRequest` — `@warlock.js/core/request-memo/SKILL.md`; middleware mechanics — `@warlock.js/core/write-middleware/SKILL.md`; authenticated user typing — augment `RequestUser`, not `RequestLocals`; competing patterns: `(request as any).foo`, `request.set()`, module-global mutable state.'
|
|
7463
|
+
---
|
|
7464
|
+
|
|
7465
|
+
# Warlock — use typed request locals
|
|
7466
|
+
|
|
7467
|
+
`request.locals` is the v5 home for private data that middleware writes and downstream code reads during the same request. It is separate from client input and starts as a fresh object on every `Request` instance.
|
|
7468
|
+
|
|
7469
|
+
## The exact declarations
|
|
7470
|
+
|
|
7471
|
+
From `core/src/http/types.ts`:
|
|
7472
|
+
|
|
7473
|
+
```ts
|
|
7474
|
+
export interface RequestLocals {}
|
|
7475
|
+
```
|
|
7476
|
+
|
|
7477
|
+
From `core/src/http/request.ts`:
|
|
7478
|
+
|
|
7479
|
+
```ts
|
|
7480
|
+
public locals: RequestLocals = {};
|
|
7481
|
+
```
|
|
7482
|
+
|
|
7483
|
+
`RequestLocals` is intentionally empty and augmentable. It has no index signature: declare owned keys explicitly so reads and writes have their real types instead of `any`.
|
|
7484
|
+
|
|
7485
|
+
## Migrate a middleware attachment from v4 to v5
|
|
7486
|
+
|
|
7487
|
+
### Before — v4 dynamic `Request` property
|
|
7488
|
+
|
|
7489
|
+
```ts title="src/app/observability/middleware/request-timing.middleware.ts"
|
|
7490
|
+
import type { Middleware } from "@warlock.js/core";
|
|
7491
|
+
|
|
7492
|
+
export const requestTimingMiddleware: Middleware = request => {
|
|
7493
|
+
request.startedAt = Date.now();
|
|
7494
|
+
};
|
|
7495
|
+
```
|
|
7496
|
+
|
|
7497
|
+
```ts title="src/app/observability/controllers/timing.controller.ts"
|
|
7498
|
+
import type { RequestHandler } from "@warlock.js/core";
|
|
7499
|
+
|
|
7500
|
+
export const timingController: RequestHandler = async (request, response) => {
|
|
7501
|
+
return response.success({ elapsedMs: Date.now() - request.startedAt });
|
|
7502
|
+
};
|
|
7503
|
+
```
|
|
7504
|
+
|
|
7505
|
+
Those arbitrary properties compiled in v4 because `Request` had a `[key: string]: any` index signature. That signature is gone in v5.
|
|
7506
|
+
|
|
7507
|
+
### After — v5 typed `request.locals`
|
|
7508
|
+
|
|
7509
|
+
Declare the key once in the feature that owns and writes it:
|
|
7510
|
+
|
|
7511
|
+
```ts title="src/app/observability/request-locals.d.ts"
|
|
7512
|
+
declare module "@warlock.js/core" {
|
|
7513
|
+
interface RequestLocals {
|
|
7514
|
+
startedAt?: number;
|
|
7515
|
+
}
|
|
7516
|
+
}
|
|
7517
|
+
|
|
7518
|
+
export {};
|
|
7519
|
+
```
|
|
7520
|
+
|
|
7521
|
+
Write it in middleware:
|
|
7522
|
+
|
|
7523
|
+
```ts title="src/app/observability/middleware/request-timing.middleware.ts"
|
|
7524
|
+
import type { Middleware } from "@warlock.js/core";
|
|
7525
|
+
|
|
7526
|
+
export const requestTimingMiddleware: Middleware = ({ request }) => {
|
|
7527
|
+
request.locals.startedAt = Date.now();
|
|
7528
|
+
};
|
|
7529
|
+
```
|
|
7530
|
+
|
|
7531
|
+
Read it downstream:
|
|
7532
|
+
|
|
7533
|
+
```ts title="src/app/observability/controllers/timing.controller.ts"
|
|
7534
|
+
import type { RequestHandler } from "@warlock.js/core";
|
|
7535
|
+
|
|
7536
|
+
export const timingController: RequestHandler = async ({ request, response }) => {
|
|
7537
|
+
const startedAt = request.locals.startedAt;
|
|
7538
|
+
|
|
7539
|
+
if (startedAt === undefined) {
|
|
7540
|
+
return response.serverError({ error: "request timing middleware did not run" });
|
|
7541
|
+
}
|
|
7542
|
+
|
|
7543
|
+
return response.success({ elapsedMs: Date.now() - startedAt });
|
|
7544
|
+
};
|
|
7545
|
+
```
|
|
7546
|
+
|
|
7547
|
+
The `?` is honest about runtime ordering: the type exists everywhere, but the value exists only after the middleware runs. Narrow it downstream unless every construction path guarantees initialization and your project deliberately declares the key as required.
|
|
7548
|
+
|
|
7549
|
+
## Augment with an application type
|
|
7550
|
+
|
|
7551
|
+
An augmentation file may import the value's type. Keeping the declaration beside the writer makes ownership visible and prevents unrelated packages from claiming the same key.
|
|
7552
|
+
|
|
7553
|
+
```ts title="src/app/organizations/request-locals.d.ts"
|
|
7554
|
+
import type { Organization } from "./models/organization";
|
|
7555
|
+
|
|
7556
|
+
declare module "@warlock.js/core" {
|
|
7557
|
+
interface RequestLocals {
|
|
7558
|
+
organization?: Organization;
|
|
7559
|
+
}
|
|
7560
|
+
}
|
|
7561
|
+
|
|
7562
|
+
export {};
|
|
7563
|
+
```
|
|
7564
|
+
|
|
7565
|
+
The module specifier must be `"@warlock.js/core"`, matching the public package import whose `RequestLocals` interface is exported.
|
|
7566
|
+
|
|
7567
|
+
## Where the augmentation file goes
|
|
7568
|
+
|
|
7569
|
+
A new project scaffolds `src/typings.d.ts` and lists it explicitly in `tsconfig.json`'s `include`. That is the sanctioned home for application-wide augmentations — `RequestLocals` and `RequestUser` both ship there as empty `interface` declarations with the reasoning written above them.
|
|
7570
|
+
|
|
7571
|
+
```ts title="src/typings.d.ts"
|
|
7572
|
+
declare module "@warlock.js/core" {
|
|
7573
|
+
interface RequestLocals {}
|
|
7574
|
+
|
|
7575
|
+
interface RequestUser {}
|
|
7576
|
+
}
|
|
7577
|
+
|
|
7578
|
+
export {};
|
|
7579
|
+
```
|
|
7580
|
+
|
|
7581
|
+
Feature-local files such as `src/app/organizations/request-locals.d.ts` are equally valid and keep ownership next to the middleware that writes the key; the scaffold's `include` covers all of `src`. Use `src/typings.d.ts` for declarations no single feature owns.
|
|
7582
|
+
|
|
7583
|
+
Two rules the scaffold's own comments spell out, and both bite silently:
|
|
7584
|
+
|
|
7585
|
+
- **Keep the trailing `export {}`.** `declare module "x"` inside a file with no top-level import or export declares an *ambient* module, which REPLACES `@warlock.js/core`'s real typings instead of merging into them — every framework export vanishes. The `export {}` is what makes the file a module and the block an augmentation. It is not an unused statement to clean up.
|
|
7586
|
+
- **Keep them `interface`, not `type`.** This project otherwise prefers `type`; these are the named exception, because declaration merging is interface-only. `type RequestUser = { ... }` is a duplicate-identifier error, not an augmentation.
|
|
7587
|
+
|
|
7588
|
+
On a project scaffolded before 5.1 there is no `src/typings.d.ts`, and `tsconfig.json` carries `"typeRoots": ["./src/typings.d.ts"]` — wrong twice, since `typeRoots` takes directories of `@types` packages rather than files, and that file did not exist. Drop the `typeRoots` entry, create the file, and list it under `include`.
|
|
7589
|
+
|
|
7590
|
+
## What belongs in `locals`
|
|
7591
|
+
|
|
7592
|
+
Good fits are values explicitly produced by one stage and consumed by later stages:
|
|
7593
|
+
|
|
7594
|
+
- a resolved organization, session, feature flag, or authorization subject;
|
|
7595
|
+
- request timing or tracing metadata;
|
|
7596
|
+
- a model loaded by validation or routing middleware;
|
|
7597
|
+
- private server state that must not appear in request input.
|
|
7598
|
+
|
|
7599
|
+
`locals` is not a cache API. If consumers should be able to ask for a value independently and concurrent calls must collapse into one loader, use `requestMemo()` instead.
|
|
7600
|
+
|
|
7601
|
+
## Isolation from input and other requests
|
|
7602
|
+
|
|
7603
|
+
`Request` initializes `locals` with `{}` for each new request. Request instances are not pooled, so values cannot carry into the next request.
|
|
7604
|
+
|
|
7605
|
+
Writing `request.locals.organization` does not affect `request.all()`, `request.input()`, or `request.validated()`. By contrast, `request.set()` writes into the input payload's `all` bag, so it is the wrong replacement for a private v4 attachment.
|
|
7606
|
+
|
|
7607
|
+
## Choosing the extension surface
|
|
7608
|
+
|
|
7609
|
+
- Use `request.locals` for per-request data written by middleware and read downstream.
|
|
7610
|
+
- Use `requestMemo(key, fn)` for lazily computed, single-flight work scoped to the active request.
|
|
7611
|
+
- Augment `Request` itself only for a genuine new typed member that also has a runtime implementation.
|
|
7612
|
+
- Augment `RequestUser` for the authenticated `request.user` shape; do not duplicate it under locals merely to work around typing.
|
|
7613
|
+
|
|
7614
|
+
## Gotchas
|
|
7615
|
+
|
|
7616
|
+
- **Do not restore `(request as any).post`.** It recreates the exact unchecked behavior v5 removed.
|
|
7617
|
+
- **Do not add `[key: string]: any` to `RequestLocals`.** Declare each key with its actual type; otherwise every typo becomes valid again.
|
|
7618
|
+
- **Do not centralize keys owned by unrelated features.** The middleware or package that writes a key should own its augmentation.
|
|
7619
|
+
- **Do not assume an optional local was initialized.** Middleware registration and ordering are runtime concerns; narrow the value or fail clearly downstream.
|
|
7620
|
+
- **Avoid key collisions across augmentations.** Interface merging requires repeated property declarations to agree, but stable feature-prefixed names are clearer for generic metadata.
|
|
7621
|
+
|
|
7622
|
+
## See also
|
|
7623
|
+
|
|
7624
|
+
- [`request-memo/SKILL.md`](../request-memo/SKILL.md) — the `fromRequest()` migration and single-flight request memoization.
|
|
7625
|
+
- [`write-middleware/SKILL.md`](../write-middleware/SKILL.md) — middleware execution and registration.
|
|
7626
|
+
- [`create-controller/SKILL.md`](../create-controller/SKILL.md) — reading locals in downstream controllers.
|
|
7627
|
+
|
|
7628
|
+
|
|
7235
7629
|
## validate-input `@warlock.js/core/validate-input/SKILL.md`
|
|
7236
7630
|
|
|
7237
7631
|
---
|
|
@@ -7283,7 +7677,7 @@ Two pieces, always:
|
|
|
7283
7677
|
|
|
7284
7678
|
No separate `*.request.ts` alias file. `RequestHandler<Request<TSchema>>` types `request.validated()` directly off the schema's inferred type.
|
|
7285
7679
|
|
|
7286
|
-
Scaffold with `
|
|
7680
|
+
Scaffold with `pnpm warlock generate.controller <module>/<action> --with-validation`. If the scaffolder emits a `requests/<action>.request.ts` file, delete it — the inline pattern is the convention.
|
|
7287
7681
|
|
|
7288
7682
|
## The `v.*` factory surface
|
|
7289
7683
|
|
|
@@ -7550,7 +7944,7 @@ This skill is the foundation. Every other warlock skill (`register-route`, `crea
|
|
|
7550
7944
|
2. **Several files are auto-loaded — never `import` them.** The dev-server file watcher and the production builder categorize these as "special" and load them on boot.
|
|
7551
7945
|
- `src/app/<module>/routes.ts` — route declarations
|
|
7552
7946
|
- `src/app/<module>/main.ts` — per-module one-time setup
|
|
7553
|
-
- `src/app/main.ts` — **project-level** one-time setup (
|
|
7947
|
+
- `src/app/main.ts` — **project-level** one-time application setup (global hooks and other app initialization; connector instances belong in `warlock.config.ts > connectors`)
|
|
7554
7948
|
- `src/app/<module>/events/*.ts(x)` — **any** `.ts(x)` file inside the `events/` folder (the `*.event.ts` suffix is convention, not a framework requirement)
|
|
7555
7949
|
- `src/app/<module>/utils/locales.ts` — module translations via `groupedTranslations(...)`
|
|
7556
7950
|
- `src/config/*.ts(x)` — subsystem config files
|
|
@@ -7651,9 +8045,13 @@ import { Product } from "../../../products/models/product";
|
|
|
7651
8045
|
|
|
7652
8046
|
Within the same module, use relative paths (`./`, `../`).
|
|
7653
8047
|
|
|
8048
|
+
## Type augmentations
|
|
8049
|
+
|
|
8050
|
+
`src/typings.d.ts` is the project's module-augmentation file. It ships with the scaffold, is listed explicitly in `tsconfig.json`'s `include`, and is where application-wide `declare module "@warlock.js/core"` blocks live — `RequestLocals` and `RequestUser` are already there as empty interfaces. Keep its trailing `export {}` (without it the block declares an ambient module and erases the framework's real typings) and keep the augmented declarations as `interface`, the one sanctioned exception to this project's prefer-`type` rule, since declaration merging is interface-only. See [`use-request-locals`](../use-request-locals/SKILL.md).
|
|
8051
|
+
|
|
7654
8052
|
## Decorators
|
|
7655
8053
|
|
|
7656
|
-
Cascade uses `@RegisterModel()` for the model registry and `@BelongsTo` / `@HasMany` / `@MorphTo` for relations. The scaffolded `tsconfig.json` has `"experimentalDecorators":
|
|
8054
|
+
Cascade uses `@RegisterModel()` for the model registry and `@BelongsTo` / `@HasMany` / `@MorphTo` for relations. The scaffolded `tsconfig.json` has `"experimentalDecorators": false` — these are native Stage-3 decorators, not legacy. Never set that flag to `true`; see [`lower-stage3-decorators`](../lower-stage3-decorators/SKILL.md).
|
|
7657
8055
|
|
|
7658
8056
|
## See also
|
|
7659
8057
|
|
|
@@ -7666,7 +8064,7 @@ Cascade uses `@RegisterModel()` for the model registry and `@BelongsTo` / `@HasM
|
|
|
7666
8064
|
|
|
7667
8065
|
---
|
|
7668
8066
|
name: warlock-doctor
|
|
7669
|
-
description: 'Run `warlock doctor` — a read-only diagnostics command that checks routes / config / connectors / optional-peers / health endpoints / release hygiene and prints a pass/warn/fail report, exiting non-zero on any failure. Add your own probe with the `DoctorCheck` contract and `runChecks` / `formatReportLines`. Triggers: `warlock doctor`, `doctorCommand`, `DoctorCheck`, `CheckResult`, `CheckStatus`, `DoctorReport`, `runChecks`, `formatReportLines`, `printReport`, `defaultDoctorChecks`; "diagnose my app", "preflight / preflight check", "is the app healthy", "why are there 0 routes", "pre-release sanity check", "CI smoke check"; run as `
|
|
8067
|
+
description: 'Run `warlock doctor` — a read-only diagnostics command that checks routes / config / connectors / optional-peers / health endpoints / release hygiene and prints a pass/warn/fail report, exiting non-zero on any failure. Add your own probe with the `DoctorCheck` contract and `runChecks` / `formatReportLines`. Triggers: `warlock doctor`, `doctorCommand`, `DoctorCheck`, `CheckResult`, `CheckStatus`, `DoctorReport`, `runChecks`, `formatReportLines`, `printReport`, `defaultDoctorChecks`; "diagnose my app", "preflight / preflight check", "is the app healthy", "why are there 0 routes", "pre-release sanity check", "CI smoke check"; run as `pnpm warlock doctor`. Skip: the live `/health` + `/ready` HTTP probes — `@warlock.js/core/health-checks/SKILL.md`; authoring a general CLI command — `@warlock.js/core/write-cli-command/SKILL.md`; releasing the package — `releasing-warlock-monorepo`; competing tools `npm doctor`, `nest info`, hand-rolled preflight scripts.'
|
|
7670
8068
|
---
|
|
7671
8069
|
|
|
7672
8070
|
# Warlock — `warlock doctor`
|
|
@@ -7674,7 +8072,7 @@ description: 'Run `warlock doctor` — a read-only diagnostics command that chec
|
|
|
7674
8072
|
`warlock doctor` is a read-only preflight. It boots the app far enough to introspect it — loads every config file and bootstrap code so routes and connectors register — but **starts no connectors**, so it never opens a database, cache, or socket connection. It then runs a set of checks and prints a grouped pass / warn / fail report.
|
|
7675
8073
|
|
|
7676
8074
|
```bash
|
|
7677
|
-
|
|
8075
|
+
pnpm warlock doctor
|
|
7678
8076
|
```
|
|
7679
8077
|
|
|
7680
8078
|
```
|
|
@@ -7777,7 +8175,7 @@ if (report.hasFailures) process.exit(report.exitCode);
|
|
|
7777
8175
|
### CI / pre-release gate
|
|
7778
8176
|
|
|
7779
8177
|
```bash
|
|
7780
|
-
|
|
8178
|
+
pnpm warlock doctor || exit 1 # non-zero exit fails the job
|
|
7781
8179
|
```
|
|
7782
8180
|
|
|
7783
8181
|
A red `release-hygiene` line catches the classic "bumped `package.json` but forgot the CHANGELOG heading" mistake before a publish.
|
|
@@ -7805,7 +8203,7 @@ A `⚠ routes: 0 routes registered` line is the tell that a route module threw o
|
|
|
7805
8203
|
|
|
7806
8204
|
---
|
|
7807
8205
|
name: warlock-routes
|
|
7808
|
-
description: 'Run `warlock routes` — a read-only command that lists the registered HTTP routes as a verb-colored table (method / path / name / action / middleware-count / source), a sibling of `warlock doctor`. Filter with `--method` / `--path` / `--name`, or emit normalized rows as JSON with `--json`. Triggers: `warlock routes`, `routesCommand`, "list my routes", "show all routes", "route table", "what endpoints does my app expose", "dump routes as JSON", "which routes have middleware", "route map for CI"; run as `
|
|
8206
|
+
description: 'Run `warlock routes` — a read-only command that lists the registered HTTP routes as a verb-colored table (method / path / name / action / middleware-count / source), a sibling of `warlock doctor`. Filter with `--method` / `--path` / `--name`, or emit normalized rows as JSON with `--json`. Also covers `warlock routes:diff`, which compares live page routes against the last `warlock build`''s route snapshot and exits non-zero on drift. Triggers: `warlock routes`, `routesCommand`, `warlock routes:diff`, `routesDiffCommand`, "list my routes", "show all routes", "route table", "what endpoints does my app expose", "dump routes as JSON", "which routes have middleware", "route map for CI", "did my page routes drift from the last build"; run as `pnpm warlock routes` / `pnpm warlock routes:diff`. Skip: read-only health/preflight checks — `@warlock.js/core/warlock-doctor/SKILL.md`; defining/naming/grouping routes — `@warlock.js/core/register-route/SKILL.md`; authoring a general CLI command — `@warlock.js/core/write-cli-command/SKILL.md`; competing tools `nest`/`express` route listers, `php artisan route:list`.'
|
|
7809
8207
|
---
|
|
7810
8208
|
|
|
7811
8209
|
# Warlock — `warlock routes`
|
|
@@ -7813,7 +8211,7 @@ description: 'Run `warlock routes` — a read-only command that lists the regist
|
|
|
7813
8211
|
`warlock routes` lists every registered HTTP route as a table. It's the read-only sibling of [`warlock doctor`](../warlock-doctor/SKILL.md): it boots the app far enough to register route modules — but **starts no connectors**, so it never opens a database, cache, or socket connection.
|
|
7814
8212
|
|
|
7815
8213
|
```bash
|
|
7816
|
-
|
|
8214
|
+
pnpm warlock routes
|
|
7817
8215
|
```
|
|
7818
8216
|
|
|
7819
8217
|
```
|
|
@@ -7844,10 +8242,10 @@ The `METHOD` column is verb-colored (GET green, POST blue, PUT/PATCH yellow, DEL
|
|
|
7844
8242
|
Optional, case-insensitive, AND-combined:
|
|
7845
8243
|
|
|
7846
8244
|
```bash
|
|
7847
|
-
|
|
7848
|
-
|
|
7849
|
-
|
|
7850
|
-
|
|
8245
|
+
pnpm warlock routes --method GET # -m exact HTTP method
|
|
8246
|
+
pnpm warlock routes --path /users # -p path substring
|
|
8247
|
+
pnpm warlock routes --name users # -n route-name substring
|
|
8248
|
+
pnpm warlock routes -m POST -p /users
|
|
7851
8249
|
```
|
|
7852
8250
|
|
|
7853
8251
|
## JSON output
|
|
@@ -7855,7 +8253,7 @@ yarn warlock routes -m POST -p /users
|
|
|
7855
8253
|
`--json` (`-j`) emits the normalized rows instead of the table — for `jq`, a CI diff, or a generated API map. Filters apply before serialization.
|
|
7856
8254
|
|
|
7857
8255
|
```bash
|
|
7858
|
-
|
|
8256
|
+
pnpm warlock routes --json
|
|
7859
8257
|
```
|
|
7860
8258
|
|
|
7861
8259
|
```json
|
|
@@ -7869,7 +8267,7 @@ yarn warlock routes --json
|
|
|
7869
8267
|
### Audit which routes are guarded
|
|
7870
8268
|
|
|
7871
8269
|
```bash
|
|
7872
|
-
|
|
8270
|
+
pnpm warlock routes --json | jq '[.[] | select(.middleware == 0)]'
|
|
7873
8271
|
```
|
|
7874
8272
|
|
|
7875
8273
|
Surfaces public routes (no middleware) — a quick check that auth-protected paths actually carry a guard.
|
|
@@ -7877,11 +8275,48 @@ Surfaces public routes (no middleware) — a quick check that auth-protected pat
|
|
|
7877
8275
|
### Confirm a route registered
|
|
7878
8276
|
|
|
7879
8277
|
```bash
|
|
7880
|
-
|
|
8278
|
+
pnpm warlock routes --name users.create
|
|
7881
8279
|
```
|
|
7882
8280
|
|
|
7883
8281
|
An empty result means the route isn't registered — re-run `warlock dev` and read the boot error (the route-module loader is fail-loud, so a throwing route file aborts boot rather than being silently dropped).
|
|
7884
8282
|
|
|
8283
|
+
## `warlock routes:diff` — catch page-route drift before it ships
|
|
8284
|
+
|
|
8285
|
+
Compares the **live dev-server page routes** (`router.list().filter(r => r.isPage)`) against a **snapshot written by the last successful `warlock build`** (`page-routes.manifest.json` in `resolveBuildConfig().outdir`, e.g. `dist/page-routes.manifest.json`). Boots the same diagnostic way as `warlock routes` — route modules registered, no connectors started — then diffs.
|
|
8286
|
+
|
|
8287
|
+
```bash
|
|
8288
|
+
pnpm warlock routes:diff
|
|
8289
|
+
```
|
|
8290
|
+
|
|
8291
|
+
```
|
|
8292
|
+
Page routes match (4 routes).
|
|
8293
|
+
Note: page names are compared as DERIVED by the build, so a clean diff does not prove
|
|
8294
|
+
that no route name collided at registration (the router appends `.<method>` to a name
|
|
8295
|
+
already claimed by another method). Run `warlock routes` to see the registered names.
|
|
8296
|
+
```
|
|
8297
|
+
|
|
8298
|
+
**A clean baseline is now expected immediately after a successful `warlock build`.** Through 5.1, running `routes:diff` on an untouched checkout right after a green build reported drift, because the manifest recorded the catch-all as `"*"` while the router serves it as `"/*"`. The manifest is now written through the router's own path normalizer, so the two sides agree and a clean tree reports clean. If you see drift on a tree you have not edited since building, that is a bug worth reporting — it is no longer the expected greeting.
|
|
8299
|
+
|
|
8300
|
+
⚠ **What a clean diff does NOT prove.** The manifest records what each page's name was **derived** as, not what it was **registered** as. `warlock build` never boots connectors, so it cannot see the API routes a page name might collide with; when a name is already claimed by another method the router appends a `.<method>` suffix at registration, and the comparison accepts that suffix rather than reporting it as drift. So `Page routes match` means *the page surface did not move since the build* — it does not mean *no page route name collided*. Use `warlock routes` to see the names as actually registered.
|
|
8301
|
+
|
|
8302
|
+
or, on drift:
|
|
8303
|
+
|
|
8304
|
+
```
|
|
8305
|
+
changed - GET /blog/:slug blog.post (src/web/blog/[slug].page.tsx)
|
|
8306
|
+
+ GET /blog/:id blog.post (src/web/blog/[slug].page.tsx)
|
|
8307
|
+
removed - GET /legacy legacy.home
|
|
8308
|
+
added + GET /promo promo.home (src/web/promo.page.tsx)
|
|
8309
|
+
Page route drift: 1 changed, 1 removed, 1 added. Run `warlock build` after reviewing these changes.
|
|
8310
|
+
```
|
|
8311
|
+
|
|
8312
|
+
and exits non-zero.
|
|
8313
|
+
|
|
8314
|
+
- **Identity is `method` + `path` + `name`.** A route is only reported `changed` — instead of one `removed` line and one unrelated `added` line — when it shares its **`source` file** with the route it's being paired against. A moved checkout (same source, different absolute path on disk) never shows as drift; a route whose declared path/name literally changed in the same file does.
|
|
8315
|
+
- **Requires a prior successful build.** No `page-routes.manifest.json` yet, or a malformed one → the command refuses to run and tells you to `warlock build` first, rather than diffing against nothing.
|
|
8316
|
+
- **Fails loudly on a broken dev boot**, same as `warlock routes` / `warlock doctor` — a route module that throws on import, or a connector registration error, aborts before any comparison happens.
|
|
8317
|
+
- **Only page routes are compared.** API routes registered without `isPage` never appear on either side of the diff; this command exists for the file-system page-routing surface `@warlock.js/web` adds, not the general route table.
|
|
8318
|
+
- **Core reads the snapshot; it does not write it.** `warlock build` writes `page-routes.manifest.json` through a connector's `build`/`emit` contribution (`@warlock.js/web`'s build integration, keyed off pages it discovers) — a project with no `@warlock.js/web` page routes never produces one, and `routes:diff` has nothing to compare against.
|
|
8319
|
+
|
|
7885
8320
|
## Gotchas
|
|
7886
8321
|
|
|
7887
8322
|
- **No connectors are started.** The list reflects what's *registered*, not what would connect. It never opens a DB/cache/socket.
|
|
@@ -7893,6 +8328,7 @@ An empty result means the route isn't registered — re-run `warlock dev` and re
|
|
|
7893
8328
|
|
|
7894
8329
|
- [`warlock-doctor/SKILL.md`](../warlock-doctor/SKILL.md) — the read-only diagnostics sibling; its `routes` check warns when this table would be empty.
|
|
7895
8330
|
- [`register-route/SKILL.md`](../register-route/SKILL.md) — defining, naming, and grouping the routes this command lists.
|
|
8331
|
+
- [`run-app/SKILL.md`](../run-app/SKILL.md) — `warlock build`, the command that produces the snapshot `routes:diff` compares against.
|
|
7896
8332
|
- [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — the command + `preload` shape `routesCommand` is built from.
|
|
7897
8333
|
|
|
7898
8334
|
|
|
@@ -8227,7 +8663,7 @@ export default command({
|
|
|
8227
8663
|
});
|
|
8228
8664
|
```
|
|
8229
8665
|
|
|
8230
|
-
Run it: `
|
|
8666
|
+
Run it: `pnpm warlock users.promote --email=hasan@example.com` (or `pnpm warlock up -e hasan@example.com`).
|
|
8231
8667
|
|
|
8232
8668
|
## `CLICommandOptions` — the factory input
|
|
8233
8669
|
|
|
@@ -8759,12 +9195,12 @@ export default seeder({
|
|
|
8759
9195
|
Run them:
|
|
8760
9196
|
|
|
8761
9197
|
```bash
|
|
8762
|
-
|
|
8763
|
-
|
|
8764
|
-
|
|
8765
|
-
|
|
8766
|
-
|
|
8767
|
-
|
|
9198
|
+
pnpm warlock seed # discover + run all
|
|
9199
|
+
pnpm warlock seed --list # show registry, don't run
|
|
9200
|
+
pnpm warlock seed --path=src/app/roles/seeds/default-roles.seed.ts # one file
|
|
9201
|
+
pnpm warlock seed --fresh # truncate every table first, then run all
|
|
9202
|
+
pnpm warlock seed --drop # undo every tracked record, reset the log
|
|
9203
|
+
pnpm warlock seed --drop=default-roles # undo just one seeder's records
|
|
8768
9204
|
```
|
|
8769
9205
|
|
|
8770
9206
|
`--fresh` truncates **every** table in the DB (`datasource.driver.truncateTable(table, { cascade: true })`), including the `seeds` tracking table. After `--fresh`, `once: true` seeds will run again.
|
|
@@ -8902,8 +9338,8 @@ Every record you `track()` is written to a `seed_records` table (created on firs
|
|
|
8902
9338
|
`warlock seed --drop` reads those refs and undoes the seed:
|
|
8903
9339
|
|
|
8904
9340
|
```bash
|
|
8905
|
-
|
|
8906
|
-
|
|
9341
|
+
pnpm warlock seed --drop # undo every tracked record across all seeders
|
|
9342
|
+
pnpm warlock seed --drop=default-roles # undo just one seeder's records
|
|
8907
9343
|
```
|
|
8908
9344
|
|
|
8909
9345
|
What it does, inside a single transaction:
|