@warlock.js/core 4.0.135 → 4.0.137
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/esm/benchmark/benchmark-snapshots.d.ts +47 -0
- package/esm/benchmark/benchmark-snapshots.d.ts.map +1 -0
- package/esm/benchmark/benchmark-snapshots.js +77 -0
- package/esm/benchmark/benchmark-snapshots.js.map +1 -0
- package/esm/benchmark/benchmark.d.ts +25 -0
- package/esm/benchmark/benchmark.d.ts.map +1 -0
- package/esm/benchmark/benchmark.example.d.ts +2 -0
- package/esm/benchmark/benchmark.example.d.ts.map +1 -0
- package/esm/benchmark/benchmark.js +120 -0
- package/esm/benchmark/benchmark.js.map +1 -0
- package/esm/benchmark/channels/console.channel.d.ts +14 -0
- package/esm/benchmark/channels/console.channel.d.ts.map +1 -0
- package/esm/benchmark/channels/console.channel.js +29 -0
- package/esm/benchmark/channels/console.channel.js.map +1 -0
- package/esm/benchmark/channels/index.d.ts +3 -0
- package/esm/benchmark/channels/index.d.ts.map +1 -0
- package/esm/benchmark/channels/noop.channel.d.ts +5 -0
- package/esm/benchmark/channels/noop.channel.d.ts.map +1 -0
- package/esm/benchmark/channels/noop.channel.js +3 -0
- package/esm/benchmark/channels/noop.channel.js.map +1 -0
- package/esm/benchmark/index.d.ts +7 -0
- package/esm/benchmark/index.d.ts.map +1 -0
- package/esm/benchmark/profiler.d.ts +63 -0
- package/esm/benchmark/profiler.d.ts.map +1 -0
- package/esm/benchmark/profiler.js +155 -0
- package/esm/benchmark/profiler.js.map +1 -0
- package/esm/benchmark/types.d.ts +167 -0
- package/esm/benchmark/types.d.ts.map +1 -0
- package/esm/cli/cli-commands.manager.js +1 -1
- package/esm/cli/cli-commands.manager.js.map +1 -1
- package/esm/cli/commands/dev-server.command.js +1 -1
- package/esm/cli/commands/dev-server.command.js.map +1 -1
- package/esm/cli/commands/drop-tables.command.d.ts +2 -0
- package/esm/cli/commands/drop-tables.command.d.ts.map +1 -0
- package/esm/cli/commands/drop-tables.command.js +17 -0
- package/esm/cli/commands/drop-tables.command.js.map +1 -0
- package/esm/cli/commands/generate/generate.command.d.ts.map +1 -1
- package/esm/cli/commands/generate/generate.command.js +1 -0
- package/esm/cli/commands/generate/generate.command.js.map +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.js +6 -6
- package/esm/cli/commands/generate/generators/controller.generator.js.map +1 -1
- package/esm/cli/commands/generate/generators/module.generator.d.ts.map +1 -1
- package/esm/cli/commands/generate/generators/module.generator.js +6 -5
- package/esm/cli/commands/generate/generators/module.generator.js.map +1 -1
- package/esm/cli/commands/generate/generators/validation.generator.js +11 -11
- package/esm/cli/commands/generate/generators/validation.generator.js.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.d.ts +6 -3
- package/esm/cli/commands/generate/templates/stubs.d.ts.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.js +37 -25
- package/esm/cli/commands/generate/templates/stubs.js.map +1 -1
- package/esm/cli/commands/generate/utils/prompt.js +21 -0
- package/esm/cli/commands/generate/utils/prompt.js.map +1 -0
- package/esm/cli/commands/seed.command.d.ts.map +1 -1
- package/esm/cli/commands/seed.command.js +9 -2
- package/esm/cli/commands/seed.command.js.map +1 -1
- package/esm/cli/commands/storage-put.action.d.ts +22 -0
- package/esm/cli/commands/storage-put.action.d.ts.map +1 -0
- package/esm/cli/commands/storage-put.action.js +75 -0
- package/esm/cli/commands/storage-put.action.js.map +1 -0
- package/esm/cli/commands/storage-put.command.d.ts +20 -0
- package/esm/cli/commands/storage-put.command.d.ts.map +1 -0
- package/esm/cli/commands/storage-put.command.js +41 -0
- package/esm/cli/commands/storage-put.command.js.map +1 -0
- package/esm/cli/commands/typings-generator.command.js +1 -1
- package/esm/cli/commands/typings-generator.command.js.map +1 -1
- package/esm/cli/commands-loader.js +1 -1
- package/esm/cli/commands-loader.js.map +1 -1
- package/esm/cli/framework-cli-commands.d.ts.map +1 -1
- package/esm/cli/framework-cli-commands.js +7 -2
- package/esm/cli/framework-cli-commands.js.map +1 -1
- package/esm/cli/types.d.ts +1 -1
- package/esm/cli/types.d.ts.map +1 -1
- package/esm/config/config-getter.d.ts +1 -1
- package/esm/config/config-getter.d.ts.map +1 -1
- package/esm/config/config-getter.js.map +1 -1
- package/esm/config/config-loader.d.ts +1 -1
- package/esm/config/config-loader.d.ts.map +1 -1
- package/esm/config/config-loader.js +1 -1
- package/esm/config/config-loader.js.map +1 -1
- package/esm/config/config-manager.d.ts +1 -1
- package/esm/config/config-manager.d.ts.map +1 -1
- package/esm/config/load-config-files.d.ts.map +1 -1
- package/esm/config/load-config-files.js +1 -1
- package/esm/config/load-config-files.js.map +1 -1
- package/esm/connectors/base-connector.d.ts.map +1 -0
- package/esm/{dev2-server/connectors → connectors}/base-connector.js +1 -1
- package/esm/connectors/base-connector.js.map +1 -0
- package/esm/connectors/cache-connector.d.ts.map +1 -0
- package/esm/connectors/cache-connector.js.map +1 -0
- package/esm/connectors/communicator-connector.d.ts.map +1 -0
- package/esm/connectors/communicator-connector.js.map +1 -0
- package/esm/connectors/connectors-manager.d.ts.map +1 -0
- package/esm/{dev2-server/connectors → connectors}/connectors-manager.js +1 -1
- package/esm/connectors/connectors-manager.js.map +1 -0
- package/esm/connectors/database-connector.d.ts.map +1 -0
- package/esm/connectors/database-connector.js.map +1 -0
- package/esm/{dev2-server/connectors → connectors}/http-connector.d.ts +2 -0
- package/esm/connectors/http-connector.d.ts.map +1 -0
- package/esm/{dev2-server/connectors → connectors}/http-connector.js +18 -4
- package/esm/connectors/http-connector.js.map +1 -0
- package/esm/connectors/index.d.ts.map +1 -0
- package/esm/connectors/storage.connector.d.ts.map +1 -0
- package/esm/{dev2-server/connectors → connectors}/storage.connector.js +1 -1
- package/esm/connectors/storage.connector.js.map +1 -0
- package/esm/connectors/types.d.ts.map +1 -0
- package/esm/connectors/types.js.map +1 -0
- package/esm/database/drop-tables-action.d.ts +3 -0
- package/esm/database/drop-tables-action.d.ts.map +1 -0
- package/esm/database/drop-tables-action.js +29 -0
- package/esm/database/drop-tables-action.js.map +1 -0
- package/esm/database/migrate-action.js +18 -10
- package/esm/database/migrate-action.js.map +1 -1
- package/esm/database/seed-command-action.js +4 -4
- package/esm/database/seed-command-action.js.map +1 -1
- package/esm/database/seeds/seeder.d.ts +4 -0
- package/esm/database/seeds/seeder.d.ts.map +1 -1
- package/esm/database/seeds/seeder.js.map +1 -1
- package/esm/database/seeds/seeders.manager.d.ts +1 -1
- package/esm/database/seeds/seeders.manager.d.ts.map +1 -1
- package/esm/database/seeds/seeders.manager.js +12 -5
- package/esm/database/seeds/seeders.manager.js.map +1 -1
- package/esm/database/utils.d.ts +1 -2
- package/esm/database/utils.d.ts.map +1 -1
- package/esm/database/utils.js +2 -2
- package/esm/database/utils.js.map +1 -1
- package/esm/dev-server/create-worker.d.ts.map +1 -0
- package/esm/dev-server/create-worker.js.map +1 -0
- package/esm/{dev2-server → dev-server}/dependency-graph.d.ts +10 -1
- package/esm/dev-server/dependency-graph.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/dependency-graph.js +49 -5
- package/esm/dev-server/dependency-graph.js.map +1 -0
- package/esm/dev-server/dev-logger.d.ts.map +1 -0
- package/esm/dev-server/dev-logger.js.map +1 -0
- package/esm/{dev2-server → dev-server}/development-server.d.ts +8 -0
- package/esm/dev-server/development-server.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/development-server.js +57 -7
- package/esm/dev-server/development-server.js.map +1 -0
- package/esm/dev-server/events.d.ts.map +1 -0
- package/esm/dev-server/events.js.map +1 -0
- package/esm/dev-server/export-analyzer.d.ts.map +1 -0
- package/esm/dev-server/export-analyzer.js.map +1 -0
- package/esm/dev-server/file-event-handler.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/file-event-handler.js +13 -4
- package/esm/dev-server/file-event-handler.js.map +1 -0
- package/esm/{dev2-server → dev-server}/file-manager.d.ts +10 -1
- package/esm/dev-server/file-manager.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/file-manager.js +26 -3
- package/esm/dev-server/file-manager.js.map +1 -0
- package/esm/dev-server/file-operations.d.ts.map +1 -0
- package/esm/dev-server/file-operations.js.map +1 -0
- package/esm/{dev2-server → dev-server}/files-orchestrator.d.ts +7 -1
- package/esm/dev-server/files-orchestrator.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/files-orchestrator.js +39 -8
- package/esm/dev-server/files-orchestrator.js.map +1 -0
- package/esm/dev-server/files-watcher.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/files-watcher.js +30 -4
- package/esm/dev-server/files-watcher.js.map +1 -0
- package/esm/dev-server/flags.d.ts.map +1 -0
- package/esm/dev-server/flags.js.map +1 -0
- package/esm/dev-server/health-checker/checkers/base-health-checker.d.ts.map +1 -0
- package/esm/dev-server/health-checker/checkers/base-health-checker.js.map +1 -0
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.d.ts.map +1 -0
- package/esm/dev-server/health-checker/checkers/eslint-health-checker.js.map +1 -0
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.d.ts.map +1 -0
- package/esm/dev-server/health-checker/checkers/typescript-health-checker.js.map +1 -0
- package/esm/dev-server/health-checker/file-health-checker.contract.d.ts.map +1 -0
- package/esm/dev-server/health-checker/file-health-result.d.ts.map +1 -0
- package/esm/dev-server/health-checker/file-health-result.js.map +1 -0
- package/esm/dev-server/health-checker/files-healthcare.manager.d.ts.map +1 -0
- package/esm/dev-server/health-checker/files-healthcare.manager.js.map +1 -0
- package/esm/dev-server/health-checker/index.d.ts.map +1 -0
- package/esm/dev-server/health-checker/workers/eslint-health.worker.d.ts.map +1 -0
- package/esm/dev-server/health-checker/workers/eslint-health.worker.js.map +1 -0
- package/esm/dev-server/health-checker/workers/ts-health.worker.d.ts.map +1 -0
- package/esm/dev-server/health-checker/workers/ts-health.worker.js.map +1 -0
- package/esm/dev-server/import-deduplicator.d.ts +75 -0
- package/esm/dev-server/import-deduplicator.d.ts.map +1 -0
- package/esm/dev-server/import-deduplicator.js +288 -0
- package/esm/dev-server/import-deduplicator.js.map +1 -0
- package/esm/dev-server/import-deduplicator.test.d.ts +7 -0
- package/esm/dev-server/import-deduplicator.test.d.ts.map +1 -0
- package/esm/dev-server/import-transformer.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/import-transformer.js +61 -129
- package/esm/dev-server/import-transformer.js.map +1 -0
- package/esm/{dev2-server → dev-server}/index.d.ts.map +1 -1
- package/esm/{dev2-server → dev-server}/layer-executor.d.ts +5 -2
- package/esm/dev-server/layer-executor.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/layer-executor.js +34 -9
- package/esm/dev-server/layer-executor.js.map +1 -0
- package/esm/dev-server/manifest-manager.d.ts.map +1 -0
- package/esm/dev-server/manifest-manager.js.map +1 -0
- package/esm/{dev2-server → dev-server}/module-loader.d.ts +3 -0
- package/esm/dev-server/module-loader.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/module-loader.js +9 -5
- package/esm/dev-server/module-loader.js.map +1 -0
- package/esm/dev-server/package-json-manager.d.ts.map +1 -0
- package/esm/dev-server/package-json-manager.js.map +1 -0
- package/esm/dev-server/parse-imports.d.ts +34 -0
- package/esm/dev-server/parse-imports.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/parse-imports.js +98 -1
- package/esm/dev-server/parse-imports.js.map +1 -0
- package/esm/dev-server/path.d.ts.map +1 -0
- package/esm/dev-server/path.js.map +1 -0
- package/esm/dev-server/runtime-import-helper.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/runtime-import-helper.js +3 -3
- package/esm/dev-server/runtime-import-helper.js.map +1 -0
- package/esm/dev-server/special-files-collector.d.ts.map +1 -0
- package/esm/dev-server/special-files-collector.js.map +1 -0
- package/esm/dev-server/start-development-server.d.ts.map +1 -0
- package/esm/dev-server/start-development-server.js.map +1 -0
- package/esm/dev-server/transpile-file.d.ts.map +1 -0
- package/esm/dev-server/transpile-file.js.map +1 -0
- package/esm/dev-server/tsconfig-manager.d.ts.map +1 -0
- package/esm/dev-server/tsconfig-manager.js.map +1 -0
- package/esm/dev-server/type-generator.d.ts.map +1 -0
- package/esm/dev-server/type-generator.js.map +1 -0
- package/esm/dev-server/types.d.ts.map +1 -0
- package/esm/dev-server/utils.d.ts.map +1 -0
- package/esm/{dev2-server → dev-server}/utils.js +2 -1
- package/esm/dev-server/utils.js.map +1 -0
- package/esm/encryption/encrypt.d.ts +23 -0
- package/esm/encryption/encrypt.d.ts.map +1 -0
- package/esm/encryption/encrypt.js +85 -0
- package/esm/encryption/encrypt.js.map +1 -0
- package/esm/encryption/hash.d.ts +17 -0
- package/esm/encryption/hash.d.ts.map +1 -0
- package/esm/encryption/hash.js +26 -0
- package/esm/encryption/hash.js.map +1 -0
- package/esm/encryption/index.d.ts +5 -0
- package/esm/encryption/index.d.ts.map +1 -0
- package/esm/encryption/password.d.ts +23 -0
- package/esm/encryption/password.d.ts.map +1 -0
- package/esm/encryption/password.js +72 -0
- package/esm/encryption/password.js.map +1 -0
- package/esm/encryption/types.d.ts +51 -0
- package/esm/encryption/types.d.ts.map +1 -0
- package/esm/generations/add-command.action.d.ts.map +1 -1
- package/esm/generations/add-command.action.js +44 -15
- package/esm/generations/add-command.action.js.map +1 -1
- package/esm/http/middleware/inject-request-context.d.ts.map +1 -1
- package/esm/http/middleware/inject-request-context.js +3 -1
- package/esm/http/middleware/inject-request-context.js.map +1 -1
- package/esm/http/request.d.ts +9 -1
- package/esm/http/request.d.ts.map +1 -1
- package/esm/http/request.js +11 -1
- package/esm/http/request.js.map +1 -1
- package/esm/http/response.d.ts.map +1 -1
- package/esm/http/response.js +54 -16
- package/esm/http/response.js.map +1 -1
- package/esm/http/types.d.ts +14 -6
- package/esm/http/types.d.ts.map +1 -1
- package/esm/http/uploaded-file.js +1 -1
- package/esm/index.d.ts +7 -3
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/mail/mailer-pool.js +11 -11
- package/esm/mail/send-mail.js +1 -1
- package/esm/mail/send-mail.js.map +1 -1
- package/esm/production/production-builder.js +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.js +2 -2
- package/esm/repositories/adapters/cascade/cascade-adapter.js.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.ts +17 -0
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.ts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.js +39 -25
- package/esm/repositories/adapters/cascade/cascade-query-builder.js.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.d.ts +49 -0
- package/esm/repositories/adapters/cascade/filter-applicator.d.ts.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.js +99 -0
- package/esm/repositories/adapters/cascade/filter-applicator.js.map +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.ts +41 -0
- package/esm/repositories/contracts/query-builder.contract.d.ts.map +1 -1
- package/esm/repositories/contracts/types.d.ts +56 -6
- package/esm/repositories/contracts/types.d.ts.map +1 -1
- package/esm/repositories/repository.manager.d.ts +93 -48
- package/esm/repositories/repository.manager.d.ts.map +1 -1
- package/esm/repositories/repository.manager.js +139 -50
- package/esm/repositories/repository.manager.js.map +1 -1
- package/esm/resource/resource-field-builder.d.ts.map +1 -1
- package/esm/resource/resource-field-builder.js +18 -4
- package/esm/resource/resource-field-builder.js.map +1 -1
- package/esm/resource/resource.d.ts +23 -1
- package/esm/resource/resource.d.ts.map +1 -1
- package/esm/resource/resource.js +56 -3
- package/esm/resource/resource.js.map +1 -1
- package/esm/resource/types.d.ts +12 -2
- package/esm/resource/types.d.ts.map +1 -1
- package/esm/restful/restful.js +1 -1
- package/esm/restful/restful.js.map +1 -1
- package/esm/retry/index.d.ts +3 -0
- package/esm/retry/index.d.ts.map +1 -0
- package/esm/retry/retry.d.ts +21 -0
- package/esm/retry/retry.d.ts.map +1 -0
- package/esm/retry/retry.js +39 -0
- package/esm/retry/retry.js.map +1 -0
- package/esm/retry/types.d.ts +27 -0
- package/esm/retry/types.d.ts.map +1 -0
- package/esm/router/types.d.ts +10 -10
- package/esm/router/types.d.ts.map +1 -1
- package/esm/storage/scoped-storage.d.ts +34 -1
- package/esm/storage/scoped-storage.d.ts.map +1 -1
- package/esm/storage/scoped-storage.js +84 -1
- package/esm/storage/scoped-storage.js.map +1 -1
- package/esm/storage/types.d.ts +53 -0
- package/esm/storage/types.d.ts.map +1 -1
- package/esm/tests/index.d.ts +1 -0
- package/esm/tests/index.d.ts.map +1 -1
- package/esm/tests/start-http-development-server.d.ts +12 -0
- package/esm/tests/start-http-development-server.d.ts.map +1 -1
- package/esm/tests/start-http-development-server.js +66 -6
- package/esm/tests/start-http-development-server.js.map +1 -1
- package/esm/tests/test-helpers.d.ts +43 -0
- package/esm/tests/test-helpers.d.ts.map +1 -0
- package/esm/tests/test-helpers.js +86 -0
- package/esm/tests/test-helpers.js.map +1 -0
- package/esm/tests/vitest-setup.d.ts +1 -1
- package/esm/tests/vitest-setup.d.ts.map +1 -1
- package/esm/tests/vitest-setup.js +1 -1
- package/esm/tests/vitest-setup.js.map +1 -1
- package/esm/use-cases/index.d.ts +7 -0
- package/esm/use-cases/index.d.ts.map +1 -0
- package/esm/use-cases/types.d.ts +267 -0
- package/esm/use-cases/types.d.ts.map +1 -0
- package/esm/use-cases/use-case-events.d.ts +33 -0
- package/esm/use-cases/use-case-events.d.ts.map +1 -0
- package/esm/use-cases/use-case-events.js +65 -0
- package/esm/use-cases/use-case-events.js.map +1 -0
- package/esm/use-cases/use-case-pipeline.d.ts +29 -0
- package/esm/use-cases/use-case-pipeline.d.ts.map +1 -0
- package/esm/use-cases/use-case-pipeline.js +45 -0
- package/esm/use-cases/use-case-pipeline.js.map +1 -0
- package/esm/use-cases/use-case.d.ts +27 -0
- package/esm/use-cases/use-case.d.ts.map +1 -0
- package/esm/use-cases/use-case.errors.d.ts +6 -0
- package/esm/use-cases/use-case.errors.d.ts.map +1 -0
- package/esm/use-cases/use-case.errors.js +8 -0
- package/esm/use-cases/use-case.errors.js.map +1 -0
- package/esm/use-cases/use-case.js +138 -0
- package/esm/use-cases/use-case.js.map +1 -0
- package/esm/use-cases/use-cases-registry.d.ts +38 -0
- package/esm/use-cases/use-cases-registry.d.ts.map +1 -0
- package/esm/use-cases/use-cases-registry.js +92 -0
- package/esm/use-cases/use-cases-registry.js.map +1 -0
- package/esm/validation/database/exists-except-current-id.js +1 -1
- package/esm/validation/database/exists-except-current-user.js +1 -1
- package/esm/validation/database/unique-except-current-id.js +1 -1
- package/esm/validation/database/unique-except-current-user.js +1 -1
- package/esm/validation/init.js.map +1 -1
- package/esm/validation/plugins/database-plugin.d.ts.map +1 -1
- package/esm/validation/plugins/database-plugin.js +18 -30
- package/esm/validation/plugins/database-plugin.js.map +1 -1
- package/esm/validation/plugins/file-plugin.d.ts.map +1 -1
- package/esm/validation/plugins/file-plugin.js.map +1 -1
- package/esm/validation/plugins/localized-plugin.d.ts.map +1 -1
- package/esm/validation/plugins/localized-plugin.js.map +1 -1
- package/esm/validation/validators/file-validator.d.ts +14 -14
- package/esm/validation/validators/file-validator.d.ts.map +1 -1
- package/esm/validation/validators/file-validator.js +26 -27
- package/esm/validation/validators/file-validator.js.map +1 -1
- package/esm/warlock-config/types.d.ts +7 -2
- package/esm/warlock-config/types.d.ts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.js +1 -1
- package/esm/warlock-config/warlock-config.manager.js.map +1 -1
- package/package.json +7 -7
- package/esm/dev2-server/connectors/base-connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/base-connector.js.map +0 -1
- package/esm/dev2-server/connectors/cache-connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/cache-connector.js.map +0 -1
- package/esm/dev2-server/connectors/communicator-connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/communicator-connector.js.map +0 -1
- package/esm/dev2-server/connectors/connectors-manager.d.ts.map +0 -1
- package/esm/dev2-server/connectors/connectors-manager.js.map +0 -1
- package/esm/dev2-server/connectors/database-connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/database-connector.js.map +0 -1
- package/esm/dev2-server/connectors/http-connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/http-connector.js.map +0 -1
- package/esm/dev2-server/connectors/index.d.ts.map +0 -1
- package/esm/dev2-server/connectors/storage.connector.d.ts.map +0 -1
- package/esm/dev2-server/connectors/storage.connector.js.map +0 -1
- package/esm/dev2-server/connectors/types.d.ts.map +0 -1
- package/esm/dev2-server/connectors/types.js.map +0 -1
- package/esm/dev2-server/create-worker.d.ts.map +0 -1
- package/esm/dev2-server/create-worker.js.map +0 -1
- package/esm/dev2-server/dependency-graph.d.ts.map +0 -1
- package/esm/dev2-server/dependency-graph.js.map +0 -1
- package/esm/dev2-server/dev-logger.d.ts.map +0 -1
- package/esm/dev2-server/dev-logger.js.map +0 -1
- package/esm/dev2-server/development-server.d.ts.map +0 -1
- package/esm/dev2-server/development-server.js.map +0 -1
- package/esm/dev2-server/events.d.ts.map +0 -1
- package/esm/dev2-server/events.js.map +0 -1
- package/esm/dev2-server/export-analyzer.d.ts.map +0 -1
- package/esm/dev2-server/export-analyzer.js.map +0 -1
- package/esm/dev2-server/file-event-handler.d.ts.map +0 -1
- package/esm/dev2-server/file-event-handler.js.map +0 -1
- package/esm/dev2-server/file-manager.d.ts.map +0 -1
- package/esm/dev2-server/file-manager.js.map +0 -1
- package/esm/dev2-server/file-operations.d.ts.map +0 -1
- package/esm/dev2-server/file-operations.js.map +0 -1
- package/esm/dev2-server/files-orchestrator.d.ts.map +0 -1
- package/esm/dev2-server/files-orchestrator.js.map +0 -1
- package/esm/dev2-server/files-watcher.d.ts.map +0 -1
- package/esm/dev2-server/files-watcher.js.map +0 -1
- package/esm/dev2-server/flags.d.ts.map +0 -1
- package/esm/dev2-server/flags.js.map +0 -1
- package/esm/dev2-server/health-checker/checkers/base-health-checker.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/checkers/base-health-checker.js.map +0 -1
- package/esm/dev2-server/health-checker/checkers/eslint-health-checker.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/checkers/eslint-health-checker.js.map +0 -1
- package/esm/dev2-server/health-checker/checkers/typescript-health-checker.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/checkers/typescript-health-checker.js.map +0 -1
- package/esm/dev2-server/health-checker/file-health-checker.contract.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/file-health-result.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/file-health-result.js.map +0 -1
- package/esm/dev2-server/health-checker/files-healthcare.manager.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/files-healthcare.manager.js.map +0 -1
- package/esm/dev2-server/health-checker/index.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/workers/eslint-health.worker.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/workers/eslint-health.worker.js.map +0 -1
- package/esm/dev2-server/health-checker/workers/ts-health.worker.d.ts.map +0 -1
- package/esm/dev2-server/health-checker/workers/ts-health.worker.js.map +0 -1
- package/esm/dev2-server/import-transformer.d.ts.map +0 -1
- package/esm/dev2-server/import-transformer.js.map +0 -1
- package/esm/dev2-server/layer-executor.d.ts.map +0 -1
- package/esm/dev2-server/layer-executor.js.map +0 -1
- package/esm/dev2-server/manifest-manager.d.ts.map +0 -1
- package/esm/dev2-server/manifest-manager.js.map +0 -1
- package/esm/dev2-server/module-loader.d.ts.map +0 -1
- package/esm/dev2-server/module-loader.js.map +0 -1
- package/esm/dev2-server/package-json-manager.d.ts.map +0 -1
- package/esm/dev2-server/package-json-manager.js.map +0 -1
- package/esm/dev2-server/parse-imports.d.ts +0 -13
- package/esm/dev2-server/parse-imports.d.ts.map +0 -1
- package/esm/dev2-server/parse-imports.js.map +0 -1
- package/esm/dev2-server/path.d.ts.map +0 -1
- package/esm/dev2-server/path.js.map +0 -1
- package/esm/dev2-server/runtime-import-helper.d.ts.map +0 -1
- package/esm/dev2-server/runtime-import-helper.js.map +0 -1
- package/esm/dev2-server/special-files-collector.d.ts.map +0 -1
- package/esm/dev2-server/special-files-collector.js.map +0 -1
- package/esm/dev2-server/start-development-server.d.ts.map +0 -1
- package/esm/dev2-server/start-development-server.js.map +0 -1
- package/esm/dev2-server/transpile-file.d.ts.map +0 -1
- package/esm/dev2-server/transpile-file.js.map +0 -1
- package/esm/dev2-server/tsconfig-manager.d.ts.map +0 -1
- package/esm/dev2-server/tsconfig-manager.js.map +0 -1
- package/esm/dev2-server/type-generator.d.ts.map +0 -1
- package/esm/dev2-server/type-generator.js.map +0 -1
- package/esm/dev2-server/types.d.ts.map +0 -1
- package/esm/dev2-server/utils.d.ts.map +0 -1
- package/esm/dev2-server/utils.js.map +0 -1
- package/esm/http/errors/resource-not-found.error.d.ts +0 -21
- package/esm/http/errors/resource-not-found.error.d.ts.map +0 -1
- package/esm/router/utils.d.ts +0 -5
- package/esm/router/utils.d.ts.map +0 -1
- package/esm/store/index.d.ts +0 -25
- package/esm/store/index.d.ts.map +0 -1
- package/esm/store/index.js +0 -52
- package/esm/store/index.js.map +0 -1
- /package/esm/{dev2-server/connectors → connectors}/base-connector.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/cache-connector.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/cache-connector.js +0 -0
- /package/esm/{dev2-server/connectors → connectors}/communicator-connector.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/communicator-connector.js +0 -0
- /package/esm/{dev2-server/connectors → connectors}/connectors-manager.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/database-connector.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/database-connector.js +0 -0
- /package/esm/{dev2-server/connectors → connectors}/index.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/storage.connector.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/types.d.ts +0 -0
- /package/esm/{dev2-server/connectors → connectors}/types.js +0 -0
- /package/esm/{dev2-server → dev-server}/create-worker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/create-worker.js +0 -0
- /package/esm/{dev2-server → dev-server}/dev-logger.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/dev-logger.js +0 -0
- /package/esm/{dev2-server → dev-server}/events.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/events.js +0 -0
- /package/esm/{dev2-server → dev-server}/export-analyzer.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/export-analyzer.js +0 -0
- /package/esm/{dev2-server → dev-server}/file-event-handler.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/file-operations.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/file-operations.js +0 -0
- /package/esm/{dev2-server → dev-server}/files-watcher.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/flags.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/flags.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/base-health-checker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/base-health-checker.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/eslint-health-checker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/eslint-health-checker.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/typescript-health-checker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/checkers/typescript-health-checker.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/file-health-checker.contract.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/file-health-result.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/file-health-result.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/files-healthcare.manager.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/files-healthcare.manager.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/index.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/workers/eslint-health.worker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/workers/eslint-health.worker.js +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/workers/ts-health.worker.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/health-checker/workers/ts-health.worker.js +0 -0
- /package/esm/{dev2-server → dev-server}/import-transformer.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/index.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/manifest-manager.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/manifest-manager.js +0 -0
- /package/esm/{dev2-server → dev-server}/package-json-manager.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/package-json-manager.js +0 -0
- /package/esm/{dev2-server → dev-server}/path.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/path.js +0 -0
- /package/esm/{dev2-server → dev-server}/runtime-import-helper.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/special-files-collector.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/special-files-collector.js +0 -0
- /package/esm/{dev2-server → dev-server}/start-development-server.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/start-development-server.js +0 -0
- /package/esm/{dev2-server → dev-server}/transpile-file.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/transpile-file.js +0 -0
- /package/esm/{dev2-server → dev-server}/tsconfig-manager.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/tsconfig-manager.js +0 -0
- /package/esm/{dev2-server → dev-server}/type-generator.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/type-generator.js +0 -0
- /package/esm/{dev2-server → dev-server}/types.d.ts +0 -0
- /package/esm/{dev2-server → dev-server}/utils.d.ts +0 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { type ObjectValidator } from "@warlock.js/seal";
|
|
2
|
+
import { BenchmarkOptions } from "../benchmark";
|
|
3
|
+
import { RetryOptions } from "../retry";
|
|
4
|
+
/**
|
|
5
|
+
* Shared context object passed through the entire use case pipeline.
|
|
6
|
+
* Contains the optional schema and can be enriched by guards/middleware
|
|
7
|
+
* with arbitrary data (e.g., currentUser, permissions, request metadata).
|
|
8
|
+
*/
|
|
9
|
+
export type UseCaseContext = {
|
|
10
|
+
schema?: ObjectValidator;
|
|
11
|
+
} & Record<string, any>;
|
|
12
|
+
/**
|
|
13
|
+
* Guard function that runs **before** schema validation.
|
|
14
|
+
*
|
|
15
|
+
* Guards are authorization/precondition checks. They receive a read-only
|
|
16
|
+
* view of the input data and can enrich the context, but **must not** mutate
|
|
17
|
+
* the input. Throw an error to abort the entire pipeline.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* const authGuard: UseCaseGuard<LoginInput> = async (data, ctx) => {
|
|
22
|
+
* const user = await getSession(ctx.token);
|
|
23
|
+
* if (!user) throw new UnauthorizedError();
|
|
24
|
+
* ctx.currentUser = user;
|
|
25
|
+
* };
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @template Input - The shape of the use case input data
|
|
29
|
+
*/
|
|
30
|
+
export type UseCaseGuard<Input> = (data: Readonly<Input>, ctx: UseCaseContext) => void | Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Before middleware that runs **after** schema validation.
|
|
33
|
+
*
|
|
34
|
+
* Receives validated data and must return the (optionally transformed) data.
|
|
35
|
+
* Multiple before middlewares form a chain: output of one becomes input of next.
|
|
36
|
+
* Can also enrich the context.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* const normalizeEmail: UseCaseBeforeMiddleware<SignupInput> = async (data, ctx) => {
|
|
41
|
+
* return { ...data, email: data.email.toLowerCase().trim() };
|
|
42
|
+
* };
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @template Input - The shape of the use case input data
|
|
46
|
+
*/
|
|
47
|
+
export type UseCaseBeforeMiddleware<Input> = (data: Input, ctx: UseCaseContext) => Input | Promise<Input>;
|
|
48
|
+
/**
|
|
49
|
+
* After middleware that runs **after** the handler succeeds.
|
|
50
|
+
*
|
|
51
|
+
* Fire-and-forget side effects: errors are caught and logged, never thrown.
|
|
52
|
+
* Does **not** affect the returned output. Use for analytics, notifications,
|
|
53
|
+
* cache invalidation, webhooks, etc.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* const notifySlack: UseCaseAfterMiddleware<OrderOutput> = async (output, ctx) => {
|
|
58
|
+
* await slack.send(`New order #${output.orderId} placed`);
|
|
59
|
+
* };
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @template Output - The shape of the use case output data
|
|
63
|
+
*/
|
|
64
|
+
export type UseCaseAfterMiddleware<Output> = (output: Output, ctx: UseCaseContext) => void | Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Context passed to `onExecuting` lifecycle event callbacks.
|
|
67
|
+
* Fired at the start of each use case execution, before guards run.
|
|
68
|
+
*/
|
|
69
|
+
export type UseCaseOnExecutingContext = {
|
|
70
|
+
/** The shared pipeline context */
|
|
71
|
+
ctx: UseCaseContext;
|
|
72
|
+
/** Unique execution ID */
|
|
73
|
+
id: string;
|
|
74
|
+
/** Use case name */
|
|
75
|
+
name: string;
|
|
76
|
+
/** Raw input data */
|
|
77
|
+
data: any;
|
|
78
|
+
/** Schema validator (if defined) */
|
|
79
|
+
schema: ObjectValidator;
|
|
80
|
+
/** Timestamp when execution started */
|
|
81
|
+
startedAt: Date;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Use case definition.
|
|
85
|
+
*
|
|
86
|
+
* Defines the full execution pipeline: guards → validation → before → handler → after.
|
|
87
|
+
* All fields except `name` and `handler` are optional.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* const createOrder = await useCase<OrderOutput, OrderInput>({
|
|
92
|
+
* name: "create-order",
|
|
93
|
+
* guards: [authGuard, rateLimitGuard],
|
|
94
|
+
* schema: v.object({ productId: v.string().required(), quantity: v.number().min(1) }),
|
|
95
|
+
* before: [normalizeInput, enrichWithPricing],
|
|
96
|
+
* handler: async (data, ctx) => orderService.create(data, ctx.currentUser),
|
|
97
|
+
* after: [sendConfirmationEmail, invalidateCache],
|
|
98
|
+
* retries: { count: 3, delay: 1000 },
|
|
99
|
+
* benchmark: true,
|
|
100
|
+
* });
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @template Output - The shape of the handler's return value
|
|
104
|
+
* @template Input - The shape of the input data (before transformation)
|
|
105
|
+
*/
|
|
106
|
+
export type UseCase<Output = any, Input = any> = {
|
|
107
|
+
/** Unique use case identifier, used for registration, logging, and cache keys */
|
|
108
|
+
name: string;
|
|
109
|
+
/** Core business logic handler. Receives validated + transformed data and context */
|
|
110
|
+
handler: (filteredData: Input, ctx: UseCaseContext) => Promise<Output>;
|
|
111
|
+
/** Optional schema validator (from @warlock.js/seal). Runs after guards */
|
|
112
|
+
schema?: ObjectValidator;
|
|
113
|
+
/** Guards to run before validation. Sequential, can enrich ctx, cannot mutate data */
|
|
114
|
+
guards?: UseCaseGuard<Input>[];
|
|
115
|
+
/** Before middleware to run after validation. Sequential, can transform data */
|
|
116
|
+
before?: UseCaseBeforeMiddleware<Input>[];
|
|
117
|
+
/** After middleware to run on success. Fire-and-forget, errors are logged not thrown */
|
|
118
|
+
after?: UseCaseAfterMiddleware<Output>[];
|
|
119
|
+
/** Lifecycle callback: fires when execution starts (before guards) */
|
|
120
|
+
onExecuting?: (ctx: UseCaseOnExecutingContext) => void;
|
|
121
|
+
/** Lifecycle callback: fires on successful completion with full result snapshot */
|
|
122
|
+
onCompleted?: (result: UseCaseResult<Output>) => void;
|
|
123
|
+
/** Lifecycle callback: fires on error with error details and execution context */
|
|
124
|
+
onError?: (ctx: UseCaseErrorResult) => void;
|
|
125
|
+
/**
|
|
126
|
+
* Retry configuration. When set, the handler is retried on failure
|
|
127
|
+
* up to `count` times with an optional `delay` between attempts.
|
|
128
|
+
*/
|
|
129
|
+
retryOptions?: RetryOptions;
|
|
130
|
+
/**
|
|
131
|
+
* Benchmark configuration. Set to `true` for default thresholds,
|
|
132
|
+
* or provide an object to customize latency classification.
|
|
133
|
+
*/
|
|
134
|
+
benchmarkOptions?: BenchmarkOptions | false;
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* A registered use case with call tracking metadata.
|
|
138
|
+
* Created internally when a use case is registered via `useCase()`.
|
|
139
|
+
*/
|
|
140
|
+
export type RegisteredUseCase<Output = any, Input = any> = UseCase<Output, Input> & {
|
|
141
|
+
/** Execution call counters */
|
|
142
|
+
calls: {
|
|
143
|
+
/** Number of successful executions */
|
|
144
|
+
success: number;
|
|
145
|
+
/** Number of failed executions */
|
|
146
|
+
failed: number;
|
|
147
|
+
/** Total executions (success + failed) */
|
|
148
|
+
total: number;
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Runtime options passed at invocation time (second argument to the executor).
|
|
153
|
+
* These override or supplement the use case definition for a single execution.
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* await createOrder(orderData, {
|
|
158
|
+
* id: "order-123",
|
|
159
|
+
* ctx: { currentUser },
|
|
160
|
+
* onCompleted: (result) => console.log("Order created:", result.output),
|
|
161
|
+
* });
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @template Output - The shape of the use case output data
|
|
165
|
+
*/
|
|
166
|
+
export type UseCaseRuntimeOptions<Output = any> = {
|
|
167
|
+
/** Override the auto-generated execution ID */
|
|
168
|
+
id?: string;
|
|
169
|
+
/** Provide a pre-populated context object */
|
|
170
|
+
ctx?: UseCaseContext;
|
|
171
|
+
/** Invocation-level lifecycle callback: fires first, before use case and global */
|
|
172
|
+
onExecuting?: (ctx: UseCaseOnExecutingContext) => void;
|
|
173
|
+
/** Invocation-level lifecycle callback: fires first on success */
|
|
174
|
+
onCompleted?: (result: UseCaseResult<Output>) => void;
|
|
175
|
+
/** Invocation-level lifecycle callback: fires first on error */
|
|
176
|
+
onError?: (ctx: UseCaseErrorResult) => void;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Error result snapshot, emitted via `onError` lifecycle callbacks.
|
|
180
|
+
* Contains all fields from `UseCaseResult` except `output`, plus the thrown error.
|
|
181
|
+
*/
|
|
182
|
+
export type UseCaseErrorResult = Omit<UseCaseResult, "output"> & {
|
|
183
|
+
/** The error that caused the failure */
|
|
184
|
+
error: Error;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Success result snapshot, emitted via `onCompleted` lifecycle callbacks
|
|
188
|
+
* and stored in execution history cache.
|
|
189
|
+
*
|
|
190
|
+
* @template Output - The shape of the handler's return value
|
|
191
|
+
*/
|
|
192
|
+
export type UseCaseResult<Output = any> = {
|
|
193
|
+
/** Handler return value (undefined if execution failed) */
|
|
194
|
+
output?: Output;
|
|
195
|
+
/** The pipeline context at time of completion */
|
|
196
|
+
ctx: UseCaseContext;
|
|
197
|
+
/** Timestamp when execution started */
|
|
198
|
+
startedAt: Date;
|
|
199
|
+
/** Timestamp when execution ended */
|
|
200
|
+
endedAt: Date;
|
|
201
|
+
/** Unique execution ID */
|
|
202
|
+
id: string;
|
|
203
|
+
/** Use case name */
|
|
204
|
+
name: string;
|
|
205
|
+
/** Number of successful calls at time of completion */
|
|
206
|
+
calls: number;
|
|
207
|
+
/** Retry state (present only if retries were configured) */
|
|
208
|
+
retries?: {
|
|
209
|
+
/** Total allowed retries */
|
|
210
|
+
count: number;
|
|
211
|
+
/** Actual attempt number that succeeded/failed (if tracked) */
|
|
212
|
+
currentRetry?: number;
|
|
213
|
+
/** Delay between retries in ms */
|
|
214
|
+
delay?: number;
|
|
215
|
+
};
|
|
216
|
+
/** Benchmark result (present only if benchmark was enabled) */
|
|
217
|
+
benchmarkResult?: {
|
|
218
|
+
/** Execution time in milliseconds */
|
|
219
|
+
latency: number;
|
|
220
|
+
/** Performance classification */
|
|
221
|
+
state: "poor" | "good" | "excellent";
|
|
222
|
+
};
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Internal registry of global lifecycle event callback arrays.
|
|
226
|
+
* Used by `globalUseCasesEvents` to manage subscriptions.
|
|
227
|
+
*/
|
|
228
|
+
export type UseCaseEventsCallbacksMap = {
|
|
229
|
+
onExecuting: ((ctx: UseCaseOnExecutingContext) => void)[];
|
|
230
|
+
onCompleted: ((result: UseCaseResult<any>) => void)[];
|
|
231
|
+
onError: ((ctx: UseCaseErrorResult) => void)[];
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* App-level configuration for use cases, resolved via `config.get("use-cases")`.
|
|
235
|
+
* Provides default values that can be overridden per use case.
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```ts
|
|
239
|
+
* // In your app config file:
|
|
240
|
+
* export default {
|
|
241
|
+
* "use-cases": {
|
|
242
|
+
* benchmark: { enabled: true, latencyRange: { up: 100, down: 500 } },
|
|
243
|
+
* retries: { count: 3, delay: 1000 },
|
|
244
|
+
* history: { enabled: true, ttl: 7200 },
|
|
245
|
+
* },
|
|
246
|
+
* };
|
|
247
|
+
* ```
|
|
248
|
+
*/
|
|
249
|
+
export type UseCaseConfigurations = {
|
|
250
|
+
/**
|
|
251
|
+
* Default benchmark settings for all use cases.
|
|
252
|
+
* For standalone benchmark usage, use `config.get("benchmark")` instead.
|
|
253
|
+
*/
|
|
254
|
+
benchmarkOptions?: BenchmarkOptions | false;
|
|
255
|
+
/** Default retry settings for all use cases */
|
|
256
|
+
retryOptions?: RetryOptions;
|
|
257
|
+
/** Execution history cache settings */
|
|
258
|
+
history?: {
|
|
259
|
+
/** Enable/disable history storage (default: true) */
|
|
260
|
+
enabled?: boolean;
|
|
261
|
+
/** Cache TTL in seconds (default: 3600)
|
|
262
|
+
* Setting it to false will use default cache ttl value
|
|
263
|
+
*/
|
|
264
|
+
ttl?: number | false;
|
|
265
|
+
};
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/use-cases/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { UseCaseErrorResult, UseCaseEventsCallbacksMap, UseCaseOnExecutingContext, UseCaseResult } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Global event callbacks — shared across all use case instances.
|
|
4
|
+
*/
|
|
5
|
+
export declare const globalEventsCallbacksMap: UseCaseEventsCallbacksMap;
|
|
6
|
+
/**
|
|
7
|
+
* Subscribe to lifecycle events fired by any use case.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* globalUseCasesEvents.onCompleted((result) => metrics.track(result.name, result.benchmarkResult));
|
|
11
|
+
* globalUseCasesEvents.onError((ctx) => logger.error(ctx.name, ctx.error));
|
|
12
|
+
*/
|
|
13
|
+
export declare const globalUseCasesEvents: {
|
|
14
|
+
onExecuting(callback: (ctx: UseCaseOnExecutingContext) => void): {
|
|
15
|
+
unsubscribe: () => void;
|
|
16
|
+
};
|
|
17
|
+
onCompleted<Output>(callback: (result: UseCaseResult<Output>) => void): {
|
|
18
|
+
unsubscribe: () => void;
|
|
19
|
+
};
|
|
20
|
+
onError(callback: (ctx: UseCaseErrorResult) => void): {
|
|
21
|
+
unsubscribe: () => void;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Dispatches a lifecycle event to invocation → use-case → global observers, in that order.
|
|
26
|
+
* All observers are awaited sequentially.
|
|
27
|
+
*/
|
|
28
|
+
export declare function fireLifecycleEvent<EventCtx>(ctx: EventCtx, observers: {
|
|
29
|
+
invocation?: ((ctx: EventCtx) => void | Promise<void>)[];
|
|
30
|
+
useCase?: ((ctx: EventCtx) => void | Promise<void>)[];
|
|
31
|
+
global?: ((ctx: EventCtx) => void | Promise<void>)[];
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=use-case-events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case-events.d.ts","sourceRoot":"","sources":["../../src/use-cases/use-case-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,yBAItC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;gCACH,yBAAyB,KAAK,IAAI;;;qEASG,IAAI;;;4BAS7C,kBAAkB,KAAK,IAAI;;;CASpD,CAAC;AAEF;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAC/C,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE;IACT,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;CACtD,iBAaF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global event callbacks — shared across all use case instances.
|
|
3
|
+
*/
|
|
4
|
+
const globalEventsCallbacksMap = {
|
|
5
|
+
onExecuting: [],
|
|
6
|
+
onCompleted: [],
|
|
7
|
+
onError: [],
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Subscribe to lifecycle events fired by any use case.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* globalUseCasesEvents.onCompleted((result) => metrics.track(result.name, result.benchmarkResult));
|
|
14
|
+
* globalUseCasesEvents.onError((ctx) => logger.error(ctx.name, ctx.error));
|
|
15
|
+
*/
|
|
16
|
+
const globalUseCasesEvents = {
|
|
17
|
+
onExecuting(callback) {
|
|
18
|
+
globalEventsCallbacksMap.onExecuting.push(callback);
|
|
19
|
+
return {
|
|
20
|
+
unsubscribe: () => {
|
|
21
|
+
const idx = globalEventsCallbacksMap.onExecuting.indexOf(callback);
|
|
22
|
+
if (idx !== -1)
|
|
23
|
+
globalEventsCallbacksMap.onExecuting.splice(idx, 1);
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
onCompleted(callback) {
|
|
28
|
+
globalEventsCallbacksMap.onCompleted.push(callback);
|
|
29
|
+
return {
|
|
30
|
+
unsubscribe: () => {
|
|
31
|
+
const idx = globalEventsCallbacksMap.onCompleted.indexOf(callback);
|
|
32
|
+
if (idx !== -1)
|
|
33
|
+
globalEventsCallbacksMap.onCompleted.splice(idx, 1);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
onError(callback) {
|
|
38
|
+
globalEventsCallbacksMap.onError.push(callback);
|
|
39
|
+
return {
|
|
40
|
+
unsubscribe: () => {
|
|
41
|
+
const idx = globalEventsCallbacksMap.onError.indexOf(callback);
|
|
42
|
+
if (idx !== -1)
|
|
43
|
+
globalEventsCallbacksMap.onError.splice(idx, 1);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Dispatches a lifecycle event to invocation → use-case → global observers, in that order.
|
|
50
|
+
* All observers are awaited sequentially.
|
|
51
|
+
*/
|
|
52
|
+
async function fireLifecycleEvent(ctx, observers) {
|
|
53
|
+
if (observers.invocation) {
|
|
54
|
+
for (const obs of observers.invocation)
|
|
55
|
+
await obs(ctx);
|
|
56
|
+
}
|
|
57
|
+
if (observers.useCase) {
|
|
58
|
+
for (const obs of observers.useCase)
|
|
59
|
+
await obs(ctx);
|
|
60
|
+
}
|
|
61
|
+
if (observers.global) {
|
|
62
|
+
for (const obs of observers.global)
|
|
63
|
+
await obs(ctx);
|
|
64
|
+
}
|
|
65
|
+
}export{fireLifecycleEvent,globalEventsCallbacksMap,globalUseCasesEvents};//# sourceMappingURL=use-case-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case-events.js","sources":["../../src/use-cases/use-case-events.ts"],"sourcesContent":[null],"names":[],"mappings":"AAOA;;AAEG;AACU,MAAA,wBAAwB,GAA8B;AACjE,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,WAAW,EAAE,EAAE;AACf,IAAA,OAAO,EAAE,EAAE;EACX;AAEF;;;;;;AAMG;AACU,MAAA,oBAAoB,GAAG;AAClC,IAAA,WAAW,CAAC,QAAkD,EAAA;AAC5D,QAAA,wBAAwB,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,MAAM,GAAG,GAAG,wBAAwB,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnE,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,wBAAwB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aACrE;SACF,CAAC;KACH;AACD,IAAA,WAAW,CAAS,QAAiD,EAAA;AACnE,QAAA,wBAAwB,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,MAAM,GAAG,GAAG,wBAAwB,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnE,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,wBAAwB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aACrE;SACF,CAAC;KACH;AACD,IAAA,OAAO,CAAC,QAA2C,EAAA;AACjD,QAAA,wBAAwB,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,OAAO;YACL,WAAW,EAAE,MAAK;gBAChB,MAAM,GAAG,GAAG,wBAAwB,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBAC/D,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;aACjE;SACF,CAAC;KACH;EACD;AAEF;;;AAGG;AACI,eAAe,kBAAkB,CACtC,GAAa,EACb,SAIC,EAAA;IAED,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,QAAA,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,UAAU;AAAE,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACxD,KAAA;IAED,IAAI,SAAS,CAAC,OAAO,EAAE;AACrB,QAAA,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,OAAO;AAAE,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACrD,KAAA;IAED,IAAI,SAAS,CAAC,MAAM,EAAE;AACpB,QAAA,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM;AAAE,YAAA,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACpD,KAAA;AACH"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ObjectValidator } from "@warlock.js/seal";
|
|
2
|
+
import type { UseCaseBeforeMiddleware, UseCaseContext, UseCaseGuard, UseCaseOnExecutingContext } from "./types";
|
|
3
|
+
export type PipelineOptions<Input, Output> = {
|
|
4
|
+
name: string;
|
|
5
|
+
id: string;
|
|
6
|
+
data: Input;
|
|
7
|
+
ctx: UseCaseContext;
|
|
8
|
+
startedAt: Date;
|
|
9
|
+
schema?: ObjectValidator;
|
|
10
|
+
guards?: UseCaseGuard<Input>[];
|
|
11
|
+
before?: UseCaseBeforeMiddleware<Input>[];
|
|
12
|
+
handler: (data: Input, ctx: UseCaseContext) => Promise<Output>;
|
|
13
|
+
/** Invocation-level onExecuting override */
|
|
14
|
+
onExecuting?: (ctx: UseCaseOnExecutingContext) => void;
|
|
15
|
+
/** Use-case-level onExecuting */
|
|
16
|
+
ucOnExecuting?: (ctx: UseCaseOnExecutingContext) => void;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Runs the full use-case pipeline in order:
|
|
20
|
+
* onExecuting event → guards → validation → before middleware → handler
|
|
21
|
+
*
|
|
22
|
+
* Throws on guard failure, validation failure, or handler failure.
|
|
23
|
+
* Callers are responsible for retry and benchmarking wrapping.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* const output = await runPipeline({ name, id, data, ctx, schema, guards, before, handler, ... });
|
|
27
|
+
*/
|
|
28
|
+
export declare function runPipeline<Input, Output>(opts: PipelineOptions<Input, Output>): Promise<Output>;
|
|
29
|
+
//# sourceMappingURL=use-case-pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case-pipeline.d.ts","sourceRoot":"","sources":["../../src/use-cases/use-case-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAIjB,MAAM,MAAM,eAAe,CAAC,KAAK,EAAE,MAAM,IAAI;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,cAAc,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,MAAM,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1C,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,4CAA4C;IAC5C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACvD,iCAAiC;IACjC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,KAAK,IAAI,CAAC;CAC1D,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,EAC7C,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,GACnC,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {v}from'@warlock.js/seal';import {fireLifecycleEvent,globalEventsCallbacksMap}from'./use-case-events.js';import {BadSchemaUseCaseError}from'./use-case.errors.js';/**
|
|
2
|
+
* Runs the full use-case pipeline in order:
|
|
3
|
+
* onExecuting event → guards → validation → before middleware → handler
|
|
4
|
+
*
|
|
5
|
+
* Throws on guard failure, validation failure, or handler failure.
|
|
6
|
+
* Callers are responsible for retry and benchmarking wrapping.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const output = await runPipeline({ name, id, data, ctx, schema, guards, before, handler, ... });
|
|
10
|
+
*/
|
|
11
|
+
async function runPipeline(opts) {
|
|
12
|
+
const { name, id, ctx, startedAt, schema, guards, before, handler, onExecuting, ucOnExecuting } = opts;
|
|
13
|
+
let data = opts.data;
|
|
14
|
+
// 1. Fire onExecuting lifecycle event
|
|
15
|
+
await fireLifecycleEvent({ name, id, data, schema: schema, ctx, startedAt }, {
|
|
16
|
+
invocation: onExecuting ? [onExecuting] : undefined,
|
|
17
|
+
useCase: ucOnExecuting ? [ucOnExecuting] : undefined,
|
|
18
|
+
global: globalEventsCallbacksMap.onExecuting.length
|
|
19
|
+
? globalEventsCallbacksMap.onExecuting
|
|
20
|
+
: undefined,
|
|
21
|
+
});
|
|
22
|
+
// 2. Guards — authorization/precondition checks, run before validation
|
|
23
|
+
if (guards) {
|
|
24
|
+
for (const guard of guards) {
|
|
25
|
+
await guard(Object.freeze(data), ctx);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// 3. Schema validation
|
|
29
|
+
if (schema) {
|
|
30
|
+
const result = await v.validate(schema, data);
|
|
31
|
+
if (!result.isValid) {
|
|
32
|
+
throw new BadSchemaUseCaseError(result);
|
|
33
|
+
}
|
|
34
|
+
data = result.data;
|
|
35
|
+
}
|
|
36
|
+
// 4. Before middleware — sequential data transformation chain
|
|
37
|
+
let transformed = data;
|
|
38
|
+
if (before) {
|
|
39
|
+
for (const mw of before) {
|
|
40
|
+
transformed = await mw(transformed, ctx);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// 5. Core handler
|
|
44
|
+
return handler(transformed, ctx);
|
|
45
|
+
}export{runPipeline};//# sourceMappingURL=use-case-pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case-pipeline.js","sources":["../../src/use-cases/use-case-pipeline.ts"],"sourcesContent":[null],"names":[],"mappings":"yKA2BA;;;;;;;;;AASG;AACI,eAAe,WAAW,CAC/B,IAAoC,EAAA;IAEpC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,GAC7F,IAAI,CAAC;AACP,IAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;;AAGrB,IAAA,MAAM,kBAAkB,CACtB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAO,EAAE,GAAG,EAAE,SAAS,EAAE,EACnD;QACE,UAAU,EAAE,WAAW,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS;QACnD,OAAO,EAAE,aAAa,GAAG,CAAC,aAAa,CAAC,GAAG,SAAS;AACpD,QAAA,MAAM,EAAE,wBAAwB,CAAC,WAAW,CAAC,MAAM;cAC/C,wBAAwB,CAAC,WAAW;AACtC,cAAE,SAAS;AACd,KAAA,CACF,CAAC;;AAGF,IAAA,IAAI,MAAM,EAAE;AACV,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAoB,EAAE,GAAG,CAAC,CAAC;AAC1D,SAAA;AACF,KAAA;;AAGD,IAAA,IAAI,MAAM,EAAE;QACV,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAE9C,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACnB,YAAA,MAAM,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAAC;AACzC,SAAA;AAED,QAAA,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACpB,KAAA;;IAGD,IAAI,WAAW,GAAG,IAAI,CAAC;AACvB,IAAA,IAAI,MAAM,EAAE;AACV,QAAA,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;YACvB,WAAW,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC1C,SAAA;AACF,KAAA;;AAGD,IAAA,OAAO,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACnC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { UseCase, UseCaseRuntimeOptions } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Defines and registers a use case.
|
|
4
|
+
*
|
|
5
|
+
* A use case is a named, observable, optionally benchmarked unit of business logic.
|
|
6
|
+
* The returned handler is a typed async function you call with the input data.
|
|
7
|
+
*
|
|
8
|
+
* Execution order: onExecuting → guards → validation → before → handler → after → onCompleted
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* export const createOrderUseCase = useCase<OrderOutput, OrderInput>({
|
|
12
|
+
* name: "create_order",
|
|
13
|
+
* schema: createOrderSchema,
|
|
14
|
+
* guards: [authGuard],
|
|
15
|
+
* handler: async (data, ctx) => orderService.create(data),
|
|
16
|
+
* after: [sendConfirmationEmail],
|
|
17
|
+
* retries: { count: 2, delay: 500 },
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // In a controller:
|
|
21
|
+
* const output = await createOrderUseCase({ ...validated, user_id: req.user.id });
|
|
22
|
+
*/
|
|
23
|
+
export declare function useCase<Output, Input = any>(options: UseCase<Output, Input>): {
|
|
24
|
+
(data: Input, { ctx, id, onExecuting: invocationOnExecuting, onCompleted: invocationOnCompleted, onError: invocationOnError, }?: UseCaseRuntimeOptions): Promise<Output>;
|
|
25
|
+
$cleanup(): void;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case.d.ts","sourceRoot":"","sources":["../../src/use-cases/use-case.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,OAAO,EAIP,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAyBjB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;WAelE,KAAK,qHAOR,qBAAqB,GACvB,QAAQ,MAAM,CAAC;;EAgHnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case.errors.d.ts","sourceRoot":"","sources":["../../src/use-cases/use-case.errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,qBAAa,qBAAsB,SAAQ,SAAS;gBAC/B,MAAM,EAAE,gBAAgB;CAM5C"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import {HttpError}from'../http/errors/errors.js';class BadSchemaUseCaseError extends HttpError {
|
|
2
|
+
constructor(result) {
|
|
3
|
+
super(400, `Invalid input data`, {
|
|
4
|
+
code: "BAD_SCHEMA_USE_CASE",
|
|
5
|
+
errors: result.errors,
|
|
6
|
+
});
|
|
7
|
+
}
|
|
8
|
+
}export{BadSchemaUseCaseError};//# sourceMappingURL=use-case.errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-case.errors.js","sources":["../../src/use-cases/use-case.errors.ts"],"sourcesContent":[null],"names":[],"mappings":"iDAGM,MAAO,qBAAsB,SAAQ,SAAS,CAAA;AAClD,IAAA,WAAA,CAAmB,MAAwB,EAAA;AACzC,QAAA,KAAK,CAAC,GAAG,EAAE,CAAA,kBAAA,CAAoB,EAAE;AAC/B,YAAA,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;AACtB,SAAA,CAAC,CAAC;KACJ;AACF"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import {except,Random}from'@mongez/reinforcements';import {measure}from'../benchmark/benchmark.js';import {config}from'../config/config-getter.js';import'../config/config-handlers.js';import {retry}from'../retry/retry.js';import {fireLifecycleEvent,globalEventsCallbacksMap}from'./use-case-events.js';import {runPipeline}from'./use-case-pipeline.js';import {$registerUseCase,$unregisterUseCase,increaseUseCaseSuccessCalls,increaseUseCaseFailedCalls,addUseCaseHistory}from'./use-cases-registry.js';const defaultUseCaseOptions = {
|
|
2
|
+
benchmarkOptions: {
|
|
3
|
+
enabled: true,
|
|
4
|
+
latencyRange: {
|
|
5
|
+
excellent: 100,
|
|
6
|
+
poor: 200,
|
|
7
|
+
},
|
|
8
|
+
},
|
|
9
|
+
retryOptions: {
|
|
10
|
+
count: 0,
|
|
11
|
+
delay: 0,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Defines and registers a use case.
|
|
16
|
+
*
|
|
17
|
+
* A use case is a named, observable, optionally benchmarked unit of business logic.
|
|
18
|
+
* The returned handler is a typed async function you call with the input data.
|
|
19
|
+
*
|
|
20
|
+
* Execution order: onExecuting → guards → validation → before → handler → after → onCompleted
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* export const createOrderUseCase = useCase<OrderOutput, OrderInput>({
|
|
24
|
+
* name: "create_order",
|
|
25
|
+
* schema: createOrderSchema,
|
|
26
|
+
* guards: [authGuard],
|
|
27
|
+
* handler: async (data, ctx) => orderService.create(data),
|
|
28
|
+
* after: [sendConfirmationEmail],
|
|
29
|
+
* retries: { count: 2, delay: 500 },
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* // In a controller:
|
|
33
|
+
* const output = await createOrderUseCase({ ...validated, user_id: req.user.id });
|
|
34
|
+
*/
|
|
35
|
+
function useCase(options) {
|
|
36
|
+
const { name, handler, schema, guards, before, after, onExecuting, onCompleted, onError } = options;
|
|
37
|
+
// Merge per-use-case options with global config defaults
|
|
38
|
+
const useCaseConfig = config.get("use-cases", defaultUseCaseOptions);
|
|
39
|
+
const benchmarkOptions = options.benchmarkOptions ?? useCaseConfig?.benchmarkOptions;
|
|
40
|
+
const retryOptions = options.retryOptions ?? useCaseConfig?.retryOptions;
|
|
41
|
+
$registerUseCase(name, {
|
|
42
|
+
...options,
|
|
43
|
+
calls: { success: 0, failed: 0, total: 0 },
|
|
44
|
+
});
|
|
45
|
+
const useCaseHandler = async (data, { ctx = {}, id = `uc-${name}-` + Random.string(), onExecuting: invocationOnExecuting, onCompleted: invocationOnCompleted, onError: invocationOnError, } = {}) => {
|
|
46
|
+
ctx.schema = schema;
|
|
47
|
+
ctx.id = id;
|
|
48
|
+
const startedAt = new Date();
|
|
49
|
+
let output;
|
|
50
|
+
let error;
|
|
51
|
+
let benchmarkResult;
|
|
52
|
+
// The core pipeline — wrapped by retry and/or benchmark below
|
|
53
|
+
const execute = () => runPipeline({
|
|
54
|
+
name,
|
|
55
|
+
id,
|
|
56
|
+
data,
|
|
57
|
+
ctx,
|
|
58
|
+
startedAt,
|
|
59
|
+
schema,
|
|
60
|
+
guards,
|
|
61
|
+
before,
|
|
62
|
+
handler,
|
|
63
|
+
onExecuting: invocationOnExecuting,
|
|
64
|
+
ucOnExecuting: onExecuting,
|
|
65
|
+
});
|
|
66
|
+
// Apply retry if configured, otherwise execute once
|
|
67
|
+
const run = () => retryOptions?.count && retryOptions.count > 0 ? retry(execute, retryOptions) : execute();
|
|
68
|
+
try {
|
|
69
|
+
if (benchmarkOptions) {
|
|
70
|
+
// measure() catches errors internally and returns a result object.
|
|
71
|
+
// Re-throw on failure so the outer catch handles it uniformly.
|
|
72
|
+
const result = await measure(name, run, typeof benchmarkOptions === "boolean" ? undefined : benchmarkOptions);
|
|
73
|
+
if (result.success) {
|
|
74
|
+
output = result.value;
|
|
75
|
+
benchmarkResult = except(result, ["value", "success"]);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
benchmarkResult = except(result, ["error", "success"]);
|
|
79
|
+
throw result.error;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
output = await run();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
error = err;
|
|
88
|
+
}
|
|
89
|
+
const endedAt = new Date();
|
|
90
|
+
// After middleware — fire-and-forget side effects, only on success
|
|
91
|
+
if (!error && after && output !== undefined) {
|
|
92
|
+
for (const middleware of after) {
|
|
93
|
+
try {
|
|
94
|
+
await middleware(output, ctx);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
console.error(`[use-case] After middleware error in "${name}":`, err);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const snapshot = {
|
|
102
|
+
output,
|
|
103
|
+
ctx,
|
|
104
|
+
startedAt,
|
|
105
|
+
endedAt,
|
|
106
|
+
id,
|
|
107
|
+
name,
|
|
108
|
+
retries: retryOptions?.count
|
|
109
|
+
? { count: retryOptions.count, delay: retryOptions.delay }
|
|
110
|
+
: undefined,
|
|
111
|
+
benchmarkResult,
|
|
112
|
+
calls: increaseUseCaseSuccessCalls(name),
|
|
113
|
+
};
|
|
114
|
+
if (error) {
|
|
115
|
+
await fireLifecycleEvent({ ...except(snapshot, ["output"]), error, calls: increaseUseCaseFailedCalls(name) }, {
|
|
116
|
+
invocation: invocationOnError ? [invocationOnError] : undefined,
|
|
117
|
+
useCase: onError ? [onError] : undefined,
|
|
118
|
+
global: globalEventsCallbacksMap.onError.length
|
|
119
|
+
? globalEventsCallbacksMap.onError
|
|
120
|
+
: undefined,
|
|
121
|
+
});
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
await addUseCaseHistory(name, snapshot);
|
|
125
|
+
await fireLifecycleEvent(snapshot, {
|
|
126
|
+
invocation: invocationOnCompleted ? [invocationOnCompleted] : undefined,
|
|
127
|
+
useCase: onCompleted ? [onCompleted] : undefined,
|
|
128
|
+
global: globalEventsCallbacksMap.onCompleted.length
|
|
129
|
+
? globalEventsCallbacksMap.onCompleted
|
|
130
|
+
: undefined,
|
|
131
|
+
});
|
|
132
|
+
return output;
|
|
133
|
+
};
|
|
134
|
+
useCaseHandler.$cleanup = () => {
|
|
135
|
+
$unregisterUseCase(name);
|
|
136
|
+
};
|
|
137
|
+
return useCaseHandler;
|
|
138
|
+
}export{useCase};//# sourceMappingURL=use-case.js.map
|