@ddd-ts-kit/testing 0.0.0-stage → 0.1.1
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/README.md +549 -2
- package/dist/builders/buildable.d.ts +7 -0
- package/dist/builders/buildable.d.ts.map +1 -0
- package/dist/builders/buildable.js +2 -0
- package/dist/builders/buildable.js.map +1 -0
- package/dist/builders/builder.d.ts +33 -0
- package/dist/builders/builder.d.ts.map +1 -0
- package/dist/builders/builder.js +66 -0
- package/dist/builders/builder.js.map +1 -0
- package/dist/builders/defaults.d.ts +6 -0
- package/dist/builders/defaults.d.ts.map +1 -0
- package/dist/builders/defaults.js +2 -0
- package/dist/builders/defaults.js.map +1 -0
- package/dist/builders/define-builder.d.ts +14 -0
- package/dist/builders/define-builder.d.ts.map +1 -0
- package/dist/builders/define-builder.js +10 -0
- package/dist/builders/define-builder.js.map +1 -0
- package/dist/builders/generic-builder.d.ts +16 -0
- package/dist/builders/generic-builder.d.ts.map +1 -0
- package/dist/builders/generic-builder.js +23 -0
- package/dist/builders/generic-builder.js.map +1 -0
- package/dist/builders/is-resolvable.d.ts +3 -0
- package/dist/builders/is-resolvable.d.ts.map +1 -0
- package/dist/builders/is-resolvable.js +5 -0
- package/dist/builders/is-resolvable.js.map +1 -0
- package/dist/builders/lazy.d.ts +4 -0
- package/dist/builders/lazy.d.ts.map +1 -0
- package/dist/builders/lazy.js +15 -0
- package/dist/builders/lazy.js.map +1 -0
- package/dist/builders/resolvable.d.ts +6 -0
- package/dist/builders/resolvable.d.ts.map +1 -0
- package/dist/builders/resolvable.js +2 -0
- package/dist/builders/resolvable.js.map +1 -0
- package/dist/builders/resolve.d.ts +4 -0
- package/dist/builders/resolve.d.ts.map +1 -0
- package/dist/builders/resolve.js +7 -0
- package/dist/builders/resolve.js.map +1 -0
- package/dist/builders/sequence.d.ts +10 -0
- package/dist/builders/sequence.d.ts.map +1 -0
- package/dist/builders/sequence.js +14 -0
- package/dist/builders/sequence.js.map +1 -0
- package/dist/contracts/awaitable.d.ts +2 -0
- package/dist/contracts/awaitable.d.ts.map +1 -0
- package/dist/contracts/awaitable.js +2 -0
- package/dist/contracts/awaitable.js.map +1 -0
- package/dist/contracts/cache-contract.d.ts +13 -0
- package/dist/contracts/cache-contract.d.ts.map +1 -0
- package/dist/contracts/cache-contract.js +81 -0
- package/dist/contracts/cache-contract.js.map +1 -0
- package/dist/contracts/contract-runner.d.ts +16 -0
- package/dist/contracts/contract-runner.d.ts.map +1 -0
- package/dist/contracts/contract-runner.js +2 -0
- package/dist/contracts/contract-runner.js.map +1 -0
- package/dist/contracts/contract-suite.d.ts +23 -0
- package/dist/contracts/contract-suite.d.ts.map +1 -0
- package/dist/contracts/contract-suite.js +39 -0
- package/dist/contracts/contract-suite.js.map +1 -0
- package/dist/contracts/criteria/criteria-case.d.ts +11 -0
- package/dist/contracts/criteria/criteria-case.d.ts.map +1 -0
- package/dist/contracts/criteria/criteria-case.js +2 -0
- package/dist/contracts/criteria/criteria-case.js.map +1 -0
- package/dist/contracts/criteria/criteria-contract-definition.d.ts +5 -0
- package/dist/contracts/criteria/criteria-contract-definition.d.ts.map +1 -0
- package/dist/contracts/criteria/criteria-contract-definition.js +20 -0
- package/dist/contracts/criteria/criteria-contract-definition.js.map +1 -0
- package/dist/contracts/criteria/criteria-contract-row.d.ts +15 -0
- package/dist/contracts/criteria/criteria-contract-row.d.ts.map +1 -0
- package/dist/contracts/criteria/criteria-contract-row.js +2 -0
- package/dist/contracts/criteria/criteria-contract-row.js.map +1 -0
- package/dist/contracts/criteria/criteria-contract-rows.d.ts +9 -0
- package/dist/contracts/criteria/criteria-contract-rows.d.ts.map +1 -0
- package/dist/contracts/criteria/criteria-contract-rows.js +55 -0
- package/dist/contracts/criteria/criteria-contract-rows.js.map +1 -0
- package/dist/contracts/criteria/group-cases.d.ts +4 -0
- package/dist/contracts/criteria/group-cases.d.ts.map +1 -0
- package/dist/contracts/criteria/group-cases.js +96 -0
- package/dist/contracts/criteria/group-cases.js.map +1 -0
- package/dist/contracts/criteria/operator-cases.d.ts +4 -0
- package/dist/contracts/criteria/operator-cases.d.ts.map +1 -0
- package/dist/contracts/criteria/operator-cases.js +122 -0
- package/dist/contracts/criteria/operator-cases.js.map +1 -0
- package/dist/contracts/criteria/scope-cases.d.ts +4 -0
- package/dist/contracts/criteria/scope-cases.d.ts.map +1 -0
- package/dist/contracts/criteria/scope-cases.js +73 -0
- package/dist/contracts/criteria/scope-cases.js.map +1 -0
- package/dist/contracts/criteria/sort-cases.d.ts +4 -0
- package/dist/contracts/criteria/sort-cases.d.ts.map +1 -0
- package/dist/contracts/criteria/sort-cases.js +54 -0
- package/dist/contracts/criteria/sort-cases.js.map +1 -0
- package/dist/contracts/criteria-contract.d.ts +20 -0
- package/dist/contracts/criteria-contract.d.ts.map +1 -0
- package/dist/contracts/criteria-contract.js +94 -0
- package/dist/contracts/criteria-contract.js.map +1 -0
- package/dist/contracts/event-bus-contract.d.ts +23 -0
- package/dist/contracts/event-bus-contract.d.ts.map +1 -0
- package/dist/contracts/event-bus-contract.js +122 -0
- package/dist/contracts/event-bus-contract.js.map +1 -0
- package/dist/contracts/failure-of.d.ts +3 -0
- package/dist/contracts/failure-of.d.ts.map +1 -0
- package/dist/contracts/failure-of.js +12 -0
- package/dist/contracts/failure-of.js.map +1 -0
- package/dist/contracts/full-envelope.d.ts +4 -0
- package/dist/contracts/full-envelope.d.ts.map +1 -0
- package/dist/contracts/full-envelope.js +12 -0
- package/dist/contracts/full-envelope.js.map +1 -0
- package/dist/contracts/job-scheduler-contract.d.ts +21 -0
- package/dist/contracts/job-scheduler-contract.d.ts.map +1 -0
- package/dist/contracts/job-scheduler-contract.js +181 -0
- package/dist/contracts/job-scheduler-contract.js.map +1 -0
- package/dist/contracts/lock-contract.d.ts +13 -0
- package/dist/contracts/lock-contract.d.ts.map +1 -0
- package/dist/contracts/lock-contract.js +90 -0
- package/dist/contracts/lock-contract.js.map +1 -0
- package/dist/contracts/logger/create-logger.d.ts +6 -0
- package/dist/contracts/logger/create-logger.d.ts.map +1 -0
- package/dist/contracts/logger/create-logger.js +2 -0
- package/dist/contracts/logger/create-logger.js.map +1 -0
- package/dist/contracts/logger/error-outline-of.d.ts +12 -0
- package/dist/contracts/logger/error-outline-of.d.ts.map +1 -0
- package/dist/contracts/logger/error-outline-of.js +27 -0
- package/dist/contracts/logger/error-outline-of.js.map +1 -0
- package/dist/contracts/logger/logged-line.d.ts +9 -0
- package/dist/contracts/logger/logged-line.d.ts.map +1 -0
- package/dist/contracts/logger/logged-line.js +2 -0
- package/dist/contracts/logger/logged-line.js.map +1 -0
- package/dist/contracts/logger/logger-contract-setup.d.ts +11 -0
- package/dist/contracts/logger/logger-contract-setup.d.ts.map +1 -0
- package/dist/contracts/logger/logger-contract-setup.js +2 -0
- package/dist/contracts/logger/logger-contract-setup.js.map +1 -0
- package/dist/contracts/logger/logger-entries-suite.d.ts +19 -0
- package/dist/contracts/logger/logger-entries-suite.d.ts.map +1 -0
- package/dist/contracts/logger/logger-entries-suite.js +177 -0
- package/dist/contracts/logger/logger-entries-suite.js.map +1 -0
- package/dist/contracts/logger/logger-shutdown-suite.d.ts +15 -0
- package/dist/contracts/logger/logger-shutdown-suite.d.ts.map +1 -0
- package/dist/contracts/logger/logger-shutdown-suite.js +98 -0
- package/dist/contracts/logger/logger-shutdown-suite.js.map +1 -0
- package/dist/contracts/logger/logger-under-contract.d.ts +9 -0
- package/dist/contracts/logger/logger-under-contract.d.ts.map +1 -0
- package/dist/contracts/logger/logger-under-contract.js +2 -0
- package/dist/contracts/logger/logger-under-contract.js.map +1 -0
- package/dist/contracts/logger/unreadable-total.d.ts +5 -0
- package/dist/contracts/logger/unreadable-total.d.ts.map +1 -0
- package/dist/contracts/logger/unreadable-total.js +9 -0
- package/dist/contracts/logger/unreadable-total.js.map +1 -0
- package/dist/contracts/logger-contract.d.ts +14 -0
- package/dist/contracts/logger-contract.d.ts.map +1 -0
- package/dist/contracts/logger-contract.js +12 -0
- package/dist/contracts/logger-contract.js.map +1 -0
- package/dist/contracts/outbox-store-contract.d.ts +36 -0
- package/dist/contracts/outbox-store-contract.d.ts.map +1 -0
- package/dist/contracts/outbox-store-contract.js +148 -0
- package/dist/contracts/outbox-store-contract.js.map +1 -0
- package/dist/contracts/processed-event-store-contract.d.ts +11 -0
- package/dist/contracts/processed-event-store-contract.d.ts.map +1 -0
- package/dist/contracts/processed-event-store-contract.js +40 -0
- package/dist/contracts/processed-event-store-contract.js.map +1 -0
- package/dist/contracts/rate-limiter-contract.d.ts +13 -0
- package/dist/contracts/rate-limiter-contract.d.ts.map +1 -0
- package/dist/contracts/rate-limiter-contract.js +86 -0
- package/dist/contracts/rate-limiter-contract.js.map +1 -0
- package/dist/contracts/read-model/everything.d.ts +5 -0
- package/dist/contracts/read-model/everything.d.ts.map +1 -0
- package/dist/contracts/read-model/everything.js +3 -0
- package/dist/contracts/read-model/everything.js.map +1 -0
- package/dist/contracts/read-model/read-model-store-suite.d.ts +14 -0
- package/dist/contracts/read-model/read-model-store-suite.d.ts.map +1 -0
- package/dist/contracts/read-model/read-model-store-suite.js +23 -0
- package/dist/contracts/read-model/read-model-store-suite.js.map +1 -0
- package/dist/contracts/read-model/read-model-store-under-contract.d.ts +11 -0
- package/dist/contracts/read-model/read-model-store-under-contract.d.ts.map +1 -0
- package/dist/contracts/read-model/read-model-store-under-contract.js +2 -0
- package/dist/contracts/read-model/read-model-store-under-contract.js.map +1 -0
- package/dist/contracts/read-model/rebuild-suite.d.ts +14 -0
- package/dist/contracts/read-model/rebuild-suite.d.ts.map +1 -0
- package/dist/contracts/read-model/rebuild-suite.js +116 -0
- package/dist/contracts/read-model/rebuild-suite.js.map +1 -0
- package/dist/contracts/read-model/row-of.d.ts +4 -0
- package/dist/contracts/read-model/row-of.d.ts.map +1 -0
- package/dist/contracts/read-model/row-of.js +10 -0
- package/dist/contracts/read-model/row-of.js.map +1 -0
- package/dist/contracts/read-model/rows-suite.d.ts +11 -0
- package/dist/contracts/read-model/rows-suite.d.ts.map +1 -0
- package/dist/contracts/read-model/rows-suite.js +122 -0
- package/dist/contracts/read-model/rows-suite.js.map +1 -0
- package/dist/contracts/read-model/source-of-truth.d.ts +17 -0
- package/dist/contracts/read-model/source-of-truth.d.ts.map +1 -0
- package/dist/contracts/read-model/source-of-truth.js +36 -0
- package/dist/contracts/read-model/source-of-truth.js.map +1 -0
- package/dist/contracts/read-model/stamped-at.d.ts +4 -0
- package/dist/contracts/read-model/stamped-at.d.ts.map +1 -0
- package/dist/contracts/read-model/stamped-at.js +5 -0
- package/dist/contracts/read-model/stamped-at.js.map +1 -0
- package/dist/contracts/read-model-store-contract.d.ts +15 -0
- package/dist/contracts/read-model-store-contract.d.ts.map +1 -0
- package/dist/contracts/read-model-store-contract.js +13 -0
- package/dist/contracts/read-model-store-contract.js.map +1 -0
- package/dist/contracts/repository-contract.d.ts +18 -0
- package/dist/contracts/repository-contract.d.ts.map +1 -0
- package/dist/contracts/repository-contract.js +103 -0
- package/dist/contracts/repository-contract.js.map +1 -0
- package/dist/contracts/unit-of-work/after-commit-suite.d.ts +12 -0
- package/dist/contracts/unit-of-work/after-commit-suite.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/after-commit-suite.js +79 -0
- package/dist/contracts/unit-of-work/after-commit-suite.js.map +1 -0
- package/dist/contracts/unit-of-work/dispatch-suite.d.ts +14 -0
- package/dist/contracts/unit-of-work/dispatch-suite.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/dispatch-suite.js +171 -0
- package/dist/contracts/unit-of-work/dispatch-suite.js.map +1 -0
- package/dist/contracts/unit-of-work/failure-suite.d.ts +17 -0
- package/dist/contracts/unit-of-work/failure-suite.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/failure-suite.js +114 -0
- package/dist/contracts/unit-of-work/failure-suite.js.map +1 -0
- package/dist/contracts/unit-of-work/parcel.d.ts +11 -0
- package/dist/contracts/unit-of-work/parcel.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/parcel.js +22 -0
- package/dist/contracts/unit-of-work/parcel.js.map +1 -0
- package/dist/contracts/unit-of-work/parcels.d.ts +10 -0
- package/dist/contracts/unit-of-work/parcels.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/parcels.js +14 -0
- package/dist/contracts/unit-of-work/parcels.js.map +1 -0
- package/dist/contracts/unit-of-work/shipping-bench.d.ts +25 -0
- package/dist/contracts/unit-of-work/shipping-bench.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/shipping-bench.js +58 -0
- package/dist/contracts/unit-of-work/shipping-bench.js.map +1 -0
- package/dist/contracts/unit-of-work/unit-of-work-under-contract.d.ts +22 -0
- package/dist/contracts/unit-of-work/unit-of-work-under-contract.d.ts.map +1 -0
- package/dist/contracts/unit-of-work/unit-of-work-under-contract.js +2 -0
- package/dist/contracts/unit-of-work/unit-of-work-under-contract.js.map +1 -0
- package/dist/contracts/unit-of-work-contract.d.ts +19 -0
- package/dist/contracts/unit-of-work-contract.d.ts.map +1 -0
- package/dist/contracts/unit-of-work-contract.js +19 -0
- package/dist/contracts/unit-of-work-contract.js.map +1 -0
- package/dist/contracts.d.ts +27 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +17 -0
- package/dist/contracts.js.map +1 -0
- package/dist/coverage/affected-contexts.d.ts +7 -0
- package/dist/coverage/affected-contexts.d.ts.map +1 -0
- package/dist/coverage/affected-contexts.js +15 -0
- package/dist/coverage/affected-contexts.js.map +1 -0
- package/dist/coverage/contexts-in.d.ts +3 -0
- package/dist/coverage/contexts-in.d.ts.map +1 -0
- package/dist/coverage/contexts-in.js +13 -0
- package/dist/coverage/contexts-in.js.map +1 -0
- package/dist/coverage/coverage-layer.d.ts +4 -0
- package/dist/coverage/coverage-layer.d.ts.map +1 -0
- package/dist/coverage/coverage-layer.js +2 -0
- package/dist/coverage/coverage-layer.js.map +1 -0
- package/dist/coverage/coverage-rates.d.ts +8 -0
- package/dist/coverage/coverage-rates.d.ts.map +1 -0
- package/dist/coverage/coverage-rates.js +2 -0
- package/dist/coverage/coverage-rates.js.map +1 -0
- package/dist/coverage/governed-coverage.d.ts +23 -0
- package/dist/coverage/governed-coverage.d.ts.map +1 -0
- package/dist/coverage/governed-coverage.js +27 -0
- package/dist/coverage/governed-coverage.js.map +1 -0
- package/dist/coverage/governed-jest-coverage.d.ts +18 -0
- package/dist/coverage/governed-jest-coverage.d.ts.map +1 -0
- package/dist/coverage/governed-jest-coverage.js +23 -0
- package/dist/coverage/governed-jest-coverage.js.map +1 -0
- package/dist/coverage/governed-settings.d.ts +13 -0
- package/dist/coverage/governed-settings.d.ts.map +1 -0
- package/dist/coverage/governed-settings.js +49 -0
- package/dist/coverage/governed-settings.js.map +1 -0
- package/dist/coverage/held-layers.d.ts +17 -0
- package/dist/coverage/held-layers.d.ts.map +1 -0
- package/dist/coverage/held-layers.js +30 -0
- package/dist/coverage/held-layers.js.map +1 -0
- package/dist/coverage/measured-files.d.ts +4 -0
- package/dist/coverage/measured-files.d.ts.map +1 -0
- package/dist/coverage/measured-files.js +7 -0
- package/dist/coverage/measured-files.js.map +1 -0
- package/dist/coverage/measured-layers.d.ts +8 -0
- package/dist/coverage/measured-layers.d.ts.map +1 -0
- package/dist/coverage/measured-layers.js +14 -0
- package/dist/coverage/measured-layers.js.map +1 -0
- package/dist/coverage/reference-coverage.d.ts +33 -0
- package/dist/coverage/reference-coverage.d.ts.map +1 -0
- package/dist/coverage/reference-coverage.js +13 -0
- package/dist/coverage/reference-coverage.js.map +1 -0
- package/dist/coverage/unaffected-contexts.d.ts +10 -0
- package/dist/coverage/unaffected-contexts.d.ts.map +1 -0
- package/dist/coverage/unaffected-contexts.js +23 -0
- package/dist/coverage/unaffected-contexts.js.map +1 -0
- package/dist/coverage.d.ts +7 -0
- package/dist/coverage.d.ts.map +1 -0
- package/dist/coverage.js +5 -0
- package/dist/coverage.js.map +1 -0
- package/dist/e2e/collect-events.d.ts +9 -0
- package/dist/e2e/collect-events.d.ts.map +1 -0
- package/dist/e2e/collect-events.js +9 -0
- package/dist/e2e/collect-events.js.map +1 -0
- package/dist/e2e/create-http-client.d.ts +4 -0
- package/dist/e2e/create-http-client.d.ts.map +1 -0
- package/dist/e2e/create-http-client.js +7 -0
- package/dist/e2e/create-http-client.js.map +1 -0
- package/dist/e2e/database-reset.d.ts +8 -0
- package/dist/e2e/database-reset.d.ts.map +1 -0
- package/dist/e2e/database-reset.js +2 -0
- package/dist/e2e/database-reset.js.map +1 -0
- package/dist/e2e/event-recorder.d.ts +12 -0
- package/dist/e2e/event-recorder.d.ts.map +1 -0
- package/dist/e2e/event-recorder.js +2 -0
- package/dist/e2e/event-recorder.js.map +1 -0
- package/dist/e2e/event-type.d.ts +5 -0
- package/dist/e2e/event-type.d.ts.map +1 -0
- package/dist/e2e/event-type.js +2 -0
- package/dist/e2e/event-type.js.map +1 -0
- package/dist/e2e/eventually.d.ts +13 -0
- package/dist/e2e/eventually.d.ts.map +1 -0
- package/dist/e2e/eventually.js +27 -0
- package/dist/e2e/eventually.js.map +1 -0
- package/dist/e2e/expect-problem.d.ts +13 -0
- package/dist/e2e/expect-problem.d.ts.map +1 -0
- package/dist/e2e/expect-problem.js +27 -0
- package/dist/e2e/expect-problem.js.map +1 -0
- package/dist/e2e/expect-status.d.ts +7 -0
- package/dist/e2e/expect-status.d.ts.map +1 -0
- package/dist/e2e/expect-status.js +18 -0
- package/dist/e2e/expect-status.js.map +1 -0
- package/dist/e2e/fetch-client.d.ts +18 -0
- package/dist/e2e/fetch-client.d.ts.map +1 -0
- package/dist/e2e/fetch-client.js +56 -0
- package/dist/e2e/fetch-client.js.map +1 -0
- package/dist/e2e/http-client.d.ts +17 -0
- package/dist/e2e/http-client.d.ts.map +1 -0
- package/dist/e2e/http-client.js +2 -0
- package/dist/e2e/http-client.js.map +1 -0
- package/dist/e2e/http-headers.d.ts +2 -0
- package/dist/e2e/http-headers.d.ts.map +1 -0
- package/dist/e2e/http-headers.js +2 -0
- package/dist/e2e/http-headers.js.map +1 -0
- package/dist/e2e/http-response.d.ts +9 -0
- package/dist/e2e/http-response.d.ts.map +1 -0
- package/dist/e2e/http-response.js +2 -0
- package/dist/e2e/http-response.js.map +1 -0
- package/dist/e2e/listen-on-random-port.d.ts +13 -0
- package/dist/e2e/listen-on-random-port.d.ts.map +1 -0
- package/dist/e2e/listen-on-random-port.js +21 -0
- package/dist/e2e/listen-on-random-port.js.map +1 -0
- package/dist/e2e/lower-cased.d.ts +3 -0
- package/dist/e2e/lower-cased.d.ts.map +1 -0
- package/dist/e2e/lower-cased.js +6 -0
- package/dist/e2e/lower-cased.js.map +1 -0
- package/dist/e2e/request-options.d.ts +6 -0
- package/dist/e2e/request-options.d.ts.map +1 -0
- package/dist/e2e/request-options.js +2 -0
- package/dist/e2e/request-options.js.map +1 -0
- package/dist/e2e/running-server.d.ts +6 -0
- package/dist/e2e/running-server.d.ts.map +1 -0
- package/dist/e2e/running-server.js +2 -0
- package/dist/e2e/running-server.js.map +1 -0
- package/dist/e2e/start-test-server.d.ts +18 -0
- package/dist/e2e/start-test-server.d.ts.map +1 -0
- package/dist/e2e/start-test-server.js +14 -0
- package/dist/e2e/start-test-server.js.map +1 -0
- package/dist/e2e/subscribed-recorder.d.ts +17 -0
- package/dist/e2e/subscribed-recorder.d.ts.map +1 -0
- package/dist/e2e/subscribed-recorder.js +45 -0
- package/dist/e2e/subscribed-recorder.js.map +1 -0
- package/dist/e2e/without-trailing-slashes.d.ts +3 -0
- package/dist/e2e/without-trailing-slashes.d.ts.map +1 -0
- package/dist/e2e/without-trailing-slashes.js +9 -0
- package/dist/e2e/without-trailing-slashes.js.map +1 -0
- package/dist/e2e.d.ts +16 -0
- package/dist/e2e.d.ts.map +1 -0
- package/dist/e2e.js +8 -0
- package/dist/e2e.js.map +1 -0
- package/dist/execution/a-session.d.ts +4 -0
- package/dist/execution/a-session.d.ts.map +1 -0
- package/dist/execution/a-session.js +7 -0
- package/dist/execution/a-session.js.map +1 -0
- package/dist/execution/a-test-user.d.ts +4 -0
- package/dist/execution/a-test-user.d.ts.map +1 -0
- package/dist/execution/a-test-user.js +9 -0
- package/dist/execution/a-test-user.js.map +1 -0
- package/dist/execution/an-execution-context.d.ts +4 -0
- package/dist/execution/an-execution-context.d.ts.map +1 -0
- package/dist/execution/an-execution-context.js +7 -0
- package/dist/execution/an-execution-context.js.map +1 -0
- package/dist/execution/execution-context-builder.d.ts +37 -0
- package/dist/execution/execution-context-builder.d.ts.map +1 -0
- package/dist/execution/execution-context-builder.js +67 -0
- package/dist/execution/execution-context-builder.js.map +1 -0
- package/dist/execution/scoped.d.ts +8 -0
- package/dist/execution/scoped.d.ts.map +1 -0
- package/dist/execution/scoped.js +9 -0
- package/dist/execution/scoped.js.map +1 -0
- package/dist/execution/session-builder.d.ts +37 -0
- package/dist/execution/session-builder.d.ts.map +1 -0
- package/dist/execution/session-builder.js +71 -0
- package/dist/execution/session-builder.js.map +1 -0
- package/dist/faker/create-data-generator.d.ts +15 -0
- package/dist/faker/create-data-generator.d.ts.map +1 -0
- package/dist/faker/create-data-generator.js +24 -0
- package/dist/faker/create-data-generator.js.map +1 -0
- package/dist/faker/current-data-generator.d.ts +9 -0
- package/dist/faker/current-data-generator.d.ts.map +1 -0
- package/dist/faker/current-data-generator.js +16 -0
- package/dist/faker/current-data-generator.js.map +1 -0
- package/dist/faker/data-generator.d.ts +9 -0
- package/dist/faker/data-generator.d.ts.map +1 -0
- package/dist/faker/data-generator.js +2 -0
- package/dist/faker/data-generator.js.map +1 -0
- package/dist/faker/generated.d.ts +8 -0
- package/dist/faker/generated.d.ts.map +1 -0
- package/dist/faker/generated.js +10 -0
- package/dist/faker/generated.js.map +1 -0
- package/dist/faker/replay-hint.d.ts +2 -0
- package/dist/faker/replay-hint.d.ts.map +1 -0
- package/dist/faker/replay-hint.js +4 -0
- package/dist/faker/replay-hint.js.map +1 -0
- package/dist/faker/report-seed-on-failure.d.ts +11 -0
- package/dist/faker/report-seed-on-failure.d.ts.map +1 -0
- package/dist/faker/report-seed-on-failure.js +12 -0
- package/dist/faker/report-seed-on-failure.js.map +1 -0
- package/dist/faker.d.ts +7 -0
- package/dist/faker.d.ts.map +1 -0
- package/dist/faker.js +6 -0
- package/dist/faker.js.map +1 -0
- package/dist/harness/create-test-buses.d.ts +49 -0
- package/dist/harness/create-test-buses.d.ts.map +1 -0
- package/dist/harness/create-test-buses.js +35 -0
- package/dist/harness/create-test-buses.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/repositories/in-memory-repository.d.ts +30 -0
- package/dist/repositories/in-memory-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-repository.js +58 -0
- package/dist/repositories/in-memory-repository.js.map +1 -0
- package/dist/repositories/snapshot-codec.d.ts +6 -0
- package/dist/repositories/snapshot-codec.d.ts.map +1 -0
- package/dist/repositories/snapshot-codec.js +2 -0
- package/dist/repositories/snapshot-codec.js.map +1 -0
- package/dist/repositories/snapshots.d.ts +5 -0
- package/dist/repositories/snapshots.d.ts.map +1 -0
- package/dist/repositories/snapshots.js +9 -0
- package/dist/repositories/snapshots.js.map +1 -0
- package/dist/scenarios/act.d.ts +5 -0
- package/dist/scenarios/act.d.ts.map +1 -0
- package/dist/scenarios/act.js +21 -0
- package/dist/scenarios/act.js.map +1 -0
- package/dist/scenarios/async-outcome.d.ts +5 -0
- package/dist/scenarios/async-outcome.d.ts.map +1 -0
- package/dist/scenarios/async-outcome.js +2 -0
- package/dist/scenarios/async-outcome.js.map +1 -0
- package/dist/scenarios/async-scenario.d.ts +5 -0
- package/dist/scenarios/async-scenario.d.ts.map +1 -0
- package/dist/scenarios/async-scenario.js +2 -0
- package/dist/scenarios/async-scenario.js.map +1 -0
- package/dist/scenarios/deferred-outcome.d.ts +18 -0
- package/dist/scenarios/deferred-outcome.d.ts.map +1 -0
- package/dist/scenarios/deferred-outcome.js +34 -0
- package/dist/scenarios/deferred-outcome.js.map +1 -0
- package/dist/scenarios/describe-event.d.ts +3 -0
- package/dist/scenarios/describe-event.d.ts.map +1 -0
- package/dist/scenarios/describe-event.js +6 -0
- package/dist/scenarios/describe-event.js.map +1 -0
- package/dist/scenarios/error-class.d.ts +2 -0
- package/dist/scenarios/error-class.d.ts.map +1 -0
- package/dist/scenarios/error-class.js +2 -0
- package/dist/scenarios/error-class.js.map +1 -0
- package/dist/scenarios/event-matcher.d.ts +11 -0
- package/dist/scenarios/event-matcher.d.ts.map +1 -0
- package/dist/scenarios/event-matcher.js +2 -0
- package/dist/scenarios/event-matcher.js.map +1 -0
- package/dist/scenarios/event-mismatches.d.ts +5 -0
- package/dist/scenarios/event-mismatches.d.ts.map +1 -0
- package/dist/scenarios/event-mismatches.js +33 -0
- package/dist/scenarios/event-mismatches.js.map +1 -0
- package/dist/scenarios/event-source.d.ts +6 -0
- package/dist/scenarios/event-source.d.ts.map +1 -0
- package/dist/scenarios/event-source.js +2 -0
- package/dist/scenarios/event-source.js.map +1 -0
- package/dist/scenarios/given.d.ts +9 -0
- package/dist/scenarios/given.d.ts.map +1 -0
- package/dist/scenarios/given.js +10 -0
- package/dist/scenarios/given.js.map +1 -0
- package/dist/scenarios/immediate-outcome.d.ts +18 -0
- package/dist/scenarios/immediate-outcome.d.ts.map +1 -0
- package/dist/scenarios/immediate-outcome.js +147 -0
- package/dist/scenarios/immediate-outcome.js.map +1 -0
- package/dist/scenarios/is-promise-like.d.ts +2 -0
- package/dist/scenarios/is-promise-like.d.ts.map +1 -0
- package/dist/scenarios/is-promise-like.js +4 -0
- package/dist/scenarios/is-promise-like.js.map +1 -0
- package/dist/scenarios/outcome.d.ts +17 -0
- package/dist/scenarios/outcome.d.ts.map +1 -0
- package/dist/scenarios/outcome.js +2 -0
- package/dist/scenarios/outcome.js.map +1 -0
- package/dist/scenarios/recorded.d.ts +10 -0
- package/dist/scenarios/recorded.d.ts.map +1 -0
- package/dist/scenarios/recorded.js +2 -0
- package/dist/scenarios/recorded.js.map +1 -0
- package/dist/scenarios/scenario.d.ts +18 -0
- package/dist/scenarios/scenario.d.ts.map +1 -0
- package/dist/scenarios/scenario.js +17 -0
- package/dist/scenarios/scenario.js.map +1 -0
- package/dist/scenarios/show.d.ts +3 -0
- package/dist/scenarios/show.d.ts.map +1 -0
- package/dist/scenarios/show.js +6 -0
- package/dist/scenarios/show.js.map +1 -0
- package/dist/secrecy/expect-no-secret.d.ts +9 -0
- package/dist/secrecy/expect-no-secret.d.ts.map +1 -0
- package/dist/secrecy/expect-no-secret.js +55 -0
- package/dist/secrecy/expect-no-secret.js.map +1 -0
- package/dist/vitest/compiler-script.d.ts +3 -0
- package/dist/vitest/compiler-script.d.ts.map +1 -0
- package/dist/vitest/compiler-script.js +18 -0
- package/dist/vitest/compiler-script.js.map +1 -0
- package/dist/vitest/decorator-compiler.d.ts +21 -0
- package/dist/vitest/decorator-compiler.d.ts.map +1 -0
- package/dist/vitest/decorator-compiler.js +112 -0
- package/dist/vitest/decorator-compiler.js.map +1 -0
- package/dist/vitest/decorator-coverage.d.ts +27 -0
- package/dist/vitest/decorator-coverage.d.ts.map +1 -0
- package/dist/vitest/decorator-coverage.js +41 -0
- package/dist/vitest/decorator-coverage.js.map +1 -0
- package/dist/vitest/decorators.d.ts +41 -0
- package/dist/vitest/decorators.d.ts.map +1 -0
- package/dist/vitest/decorators.js +49 -0
- package/dist/vitest/decorators.js.map +1 -0
- package/dist/vitest/is-record.d.ts +2 -0
- package/dist/vitest/is-record.d.ts.map +1 -0
- package/dist/vitest/is-record.js +4 -0
- package/dist/vitest/is-record.js.map +1 -0
- package/dist/vitest/project-options.d.ts +3 -0
- package/dist/vitest/project-options.d.ts.map +1 -0
- package/dist/vitest/project-options.js +2 -0
- package/dist/vitest/project-options.js.map +1 -0
- package/dist/vitest/single-file-project.d.ts +3 -0
- package/dist/vitest/single-file-project.d.ts.map +1 -0
- package/dist/vitest/single-file-project.js +26 -0
- package/dist/vitest/single-file-project.js.map +1 -0
- package/dist/vitest/source-map-of.d.ts +3 -0
- package/dist/vitest/source-map-of.d.ts.map +1 -0
- package/dist/vitest/source-map-of.js +14 -0
- package/dist/vitest/source-map-of.js.map +1 -0
- package/dist/vitest.d.ts +3 -0
- package/dist/vitest.d.ts.map +1 -0
- package/dist/vitest.js +3 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +62 -4
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { ContractSuite } from './contract-suite.js';
|
|
2
|
+
/** What every adapter of the kernel `Lock` port guarantees, the in-memory one included. */
|
|
3
|
+
export function lockContract(runner, options) {
|
|
4
|
+
new LockSuite(runner, options).describe(`${options.name} (lock contract)`);
|
|
5
|
+
}
|
|
6
|
+
const HELD = { ttlMs: 30_000 };
|
|
7
|
+
class LockSuite extends ContractSuite {
|
|
8
|
+
options;
|
|
9
|
+
constructor(runner, options) {
|
|
10
|
+
super(runner, () => options.createLock());
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
tests() {
|
|
14
|
+
this.excludes();
|
|
15
|
+
this.frees();
|
|
16
|
+
this.fences();
|
|
17
|
+
this.waits();
|
|
18
|
+
}
|
|
19
|
+
excludes() {
|
|
20
|
+
this.it('gives a free key to the first who asks, and to nobody else meanwhile', async () => {
|
|
21
|
+
const first = await this.subject.acquire('report:2026-03', HELD);
|
|
22
|
+
this.expect(first?.key).toBe('report:2026-03');
|
|
23
|
+
this.expect(await this.subject.acquire('report:2026-03', HELD)).toBe(undefined);
|
|
24
|
+
});
|
|
25
|
+
this.it('keeps keys apart', async () => {
|
|
26
|
+
await this.subject.acquire('report:2026-03', HELD);
|
|
27
|
+
this.expect((await this.subject.acquire('report:2026-04', HELD)) !== undefined).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
this.it('gives the key to exactly one of several who ask at the same time', async () => {
|
|
30
|
+
const handles = await Promise.all(Array.from({ length: 8 }, () => this.subject.acquire('report:2026-03', HELD)));
|
|
31
|
+
this.expect(handles.filter((handle) => handle !== undefined).length).toBe(1);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
frees() {
|
|
35
|
+
this.it('frees the key when its holder releases it, once or twice', async () => {
|
|
36
|
+
const first = await this.held('report:2026-03');
|
|
37
|
+
await first.release();
|
|
38
|
+
await first.release();
|
|
39
|
+
this.expect((await this.subject.acquire('report:2026-03', HELD)) !== undefined).toBe(true);
|
|
40
|
+
});
|
|
41
|
+
this.it('frees the key by itself when the time to live has passed', async () => {
|
|
42
|
+
await this.subject.acquire('report:2026-03', { ttlMs: 300 });
|
|
43
|
+
this.expect(await this.subject.acquire('report:2026-03', HELD)).toBe(undefined);
|
|
44
|
+
await this.options.elapse(400);
|
|
45
|
+
this.expect((await this.subject.acquire('report:2026-03', HELD)) !== undefined).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
this.it('ignores the release of a holder whose lock expired and was taken by another', async () => {
|
|
48
|
+
const late = await this.subject.acquire('report:2026-03', { ttlMs: 300 });
|
|
49
|
+
await this.options.elapse(400);
|
|
50
|
+
await this.subject.acquire('report:2026-03', HELD);
|
|
51
|
+
await late?.release();
|
|
52
|
+
this.expect(await this.subject.acquire('report:2026-03', HELD)).toBe(undefined);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
fences() {
|
|
56
|
+
this.it('numbers the acquisitions of a key with a token that only grows', async () => {
|
|
57
|
+
const tokens = [];
|
|
58
|
+
for (let turn = 0; turn < 3; turn += 1) {
|
|
59
|
+
const handle = await this.held('report:2026-03');
|
|
60
|
+
tokens.push(handle.fencingToken);
|
|
61
|
+
await handle.release();
|
|
62
|
+
}
|
|
63
|
+
this.expect(tokens.every((token, index) => index === 0 || token > (tokens[index - 1] ?? token))).toBe(true);
|
|
64
|
+
this.expect(new Set(tokens).size).toBe(3);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
waits() {
|
|
68
|
+
this.it('waits for a key that is released within the time it was told to wait', async () => {
|
|
69
|
+
const first = await this.held('report:2026-03');
|
|
70
|
+
const [, second] = await Promise.all([
|
|
71
|
+
first.release(),
|
|
72
|
+
this.subject.acquire('report:2026-03', { ...HELD, waitMs: 2_000 }),
|
|
73
|
+
]);
|
|
74
|
+
this.expect(second !== undefined).toBe(true);
|
|
75
|
+
this.expect((second?.fencingToken ?? 0) > first.fencingToken).toBe(true);
|
|
76
|
+
});
|
|
77
|
+
this.it('gives up once it has waited that long for a key that stays held', async () => {
|
|
78
|
+
await this.subject.acquire('report:2026-03', HELD);
|
|
79
|
+
this.expect(await this.subject.acquire('report:2026-03', { ...HELD, waitMs: 120 })).toBe(undefined);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
async held(key) {
|
|
83
|
+
const handle = await this.subject.acquire(key, HELD);
|
|
84
|
+
if (handle === undefined) {
|
|
85
|
+
throw new Error(`The lock ${key} was expected to be free`);
|
|
86
|
+
}
|
|
87
|
+
return handle;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=lock-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-contract.js","sourceRoot":"","sources":["../../src/contracts/lock-contract.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUpD,2FAA2F;AAC3F,MAAM,UAAU,YAAY,CAAC,MAAsB,EAAE,OAA4B;IAC/E,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,kBAAkB,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAE/B,MAAM,SAAU,SAAQ,aAAmB;IAGtB,OAAO;IAF1B,YACE,MAAsB,EACL,OAA4B;QAE7C,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;uBAFzB,OAAO;IAG1B,CAAC;IAES,KAAK;QACb,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,QAAQ;QACd,IAAI,CAAC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAEjE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAEnD,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YACrF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAEjH,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEhD,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YAEtB,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAC7E,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEhF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE/B,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAE1E,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAEnD,MAAM,IAAI,EAAE,OAAO,EAAE,CAAC;YAEtB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YACnF,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAEjD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;gBACjC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5G,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;YACzF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAEhD,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACnC,KAAK,CAAC,OAAO,EAAE;gBACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;aACnE,CAAC,CAAC;YAEH,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YACpF,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAEnD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,GAAW;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAErD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,YAAY,GAAG,0BAA0B,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Awaitable } from '../awaitable.js';
|
|
2
|
+
import type { LoggerContractSetup } from './logger-contract-setup.js';
|
|
3
|
+
import type { LoggerUnderContract } from './logger-under-contract.js';
|
|
4
|
+
/** A logger on a fresh, empty sink. */
|
|
5
|
+
export type CreateLogger = (setup: LoggerContractSetup) => Awaitable<LoggerUnderContract>;
|
|
6
|
+
//# sourceMappingURL=create-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-logger.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/create-logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,uCAAuC;AACvC,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-logger.js","sourceRoot":"","sources":["../../../src/contracts/logger/create-logger.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** What a contract compares of an error as a logger wrote it. */
|
|
2
|
+
export interface ErrorOutline {
|
|
3
|
+
readonly type: unknown;
|
|
4
|
+
readonly code: unknown;
|
|
5
|
+
readonly message: unknown;
|
|
6
|
+
/** `titled`: starts with the class and the message; `frames`: frames only; `none`: no stack. */
|
|
7
|
+
readonly stack: 'titled' | 'frames' | 'none';
|
|
8
|
+
readonly cause: ErrorOutline | undefined;
|
|
9
|
+
}
|
|
10
|
+
/** The outline of a written field, or `undefined` when it is not the description of an error. */
|
|
11
|
+
export declare function errorOutlineOf(written: unknown): ErrorOutline | undefined;
|
|
12
|
+
//# sourceMappingURL=error-outline-of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-outline-of.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/error-outline-of.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;CAC1C;AAID,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAYzE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const FIRST_FRAME = /^\s+at /;
|
|
2
|
+
/** The outline of a written field, or `undefined` when it is not the description of an error. */
|
|
3
|
+
export function errorOutlineOf(written) {
|
|
4
|
+
if (!isRecord(written) || typeof written.type !== 'string') {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
type: written.type,
|
|
9
|
+
code: written.code,
|
|
10
|
+
message: written.message,
|
|
11
|
+
stack: stackKind(written),
|
|
12
|
+
cause: errorOutlineOf(written.cause),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function isRecord(value) {
|
|
16
|
+
return typeof value === 'object' && value !== null;
|
|
17
|
+
}
|
|
18
|
+
function stackKind({ type, message, stack }) {
|
|
19
|
+
if (typeof stack !== 'string') {
|
|
20
|
+
return 'none';
|
|
21
|
+
}
|
|
22
|
+
if (FIRST_FRAME.test(stack)) {
|
|
23
|
+
return 'frames';
|
|
24
|
+
}
|
|
25
|
+
return stack.startsWith(`${String(type)}: ${String(message)}\n`) ? 'titled' : 'none';
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=error-outline-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-outline-of.js","sourceRoot":"","sources":["../../../src/contracts/logger/error-outline-of.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,iGAAiG;AACjG,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC;QACzB,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAqC;IAC5E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LogLevel } from '@ddd-ts-kit/kernel';
|
|
2
|
+
/** One entry as the sink received it, whatever the format of the adapter. */
|
|
3
|
+
export interface LoggedLine {
|
|
4
|
+
readonly level: LogLevel;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
/** Everything else of the entry. Keys the adapter adds by itself (time, service) are ignored. */
|
|
7
|
+
readonly fields: Readonly<Record<string, unknown>>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=logged-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logged-line.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/logged-line.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,6EAA6E;AAC7E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iGAAiG;IACjG,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logged-line.js","sourceRoot":"","sources":["../../../src/contracts/logger/logged-line.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { LogFields, LogLevel } from '@ddd-ts-kit/kernel';
|
|
2
|
+
/** What the suite asks of the logger it is about to exercise. */
|
|
3
|
+
export interface LoggerContractSetup {
|
|
4
|
+
/** Entries below it must not reach the sink. */
|
|
5
|
+
readonly level: LogLevel;
|
|
6
|
+
/** To be read at each entry that is written, and merged under the fields of the entry. */
|
|
7
|
+
readonly fields: () => LogFields;
|
|
8
|
+
/** Whether the message of an error that is not a `DomainError` must be replaced. */
|
|
9
|
+
readonly scrubMessages: boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=logger-contract-setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-contract-setup.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/logger-contract-setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9D,iEAAiE;AACjE,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,MAAM,SAAS,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CACjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-contract-setup.js","sourceRoot":"","sources":["../../../src/contracts/logger/logger-contract-setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ContractRunner } from '../contract-runner.js';
|
|
2
|
+
import { ContractSuite } from '../contract-suite.js';
|
|
3
|
+
import type { CreateLogger } from './create-logger.js';
|
|
4
|
+
import type { LoggerUnderContract } from './logger-under-contract.js';
|
|
5
|
+
/** Levels, fields, children, the fields of the work in progress, and fields that cannot be written. */
|
|
6
|
+
export declare class LoggerEntriesSuite extends ContractSuite<LoggerUnderContract> {
|
|
7
|
+
private readonly createLogger;
|
|
8
|
+
private readonly work;
|
|
9
|
+
constructor(runner: ContractRunner, createLogger: CreateLogger);
|
|
10
|
+
protected tests(): void;
|
|
11
|
+
private writes;
|
|
12
|
+
private binds;
|
|
13
|
+
private correlates;
|
|
14
|
+
private filters;
|
|
15
|
+
private saysItsLevels;
|
|
16
|
+
private survives;
|
|
17
|
+
private written;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=logger-entries-suite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-entries-suite.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/logger-entries-suite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtE,uGAAuG;AACvG,qBAAa,kBAAmB,SAAQ,aAAa,CAAC,mBAAmB,CAAC;IAKtE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJ/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,YACE,MAAM,EAAE,cAAc,EACL,YAAY,EAAE,YAAY,EAW5C;IAED,SAAS,CAAC,KAAK,IAAI,IAAI,CAOtB;IAED,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,KAAK;IA+Bb,OAAO,CAAC,UAAU;IAoClB,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;YAwBF,OAAO;CAKtB"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { LOG_LEVELS } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import { ContractSuite } from '../contract-suite.js';
|
|
3
|
+
import { unreadableTotal } from './unreadable-total.js';
|
|
4
|
+
/** Levels, fields, children, the fields of the work in progress, and fields that cannot be written. */
|
|
5
|
+
export class LoggerEntriesSuite extends ContractSuite {
|
|
6
|
+
createLogger;
|
|
7
|
+
work;
|
|
8
|
+
constructor(runner, createLogger) {
|
|
9
|
+
const work = { fields: {} };
|
|
10
|
+
super(runner, () => {
|
|
11
|
+
work.fields = {};
|
|
12
|
+
return createLogger({ level: 'debug', scrubMessages: false, fields: () => work.fields });
|
|
13
|
+
});
|
|
14
|
+
this.createLogger = createLogger;
|
|
15
|
+
this.work = work;
|
|
16
|
+
}
|
|
17
|
+
tests() {
|
|
18
|
+
this.writes();
|
|
19
|
+
this.binds();
|
|
20
|
+
this.correlates();
|
|
21
|
+
this.filters();
|
|
22
|
+
this.saysItsLevels();
|
|
23
|
+
this.survives();
|
|
24
|
+
}
|
|
25
|
+
writes() {
|
|
26
|
+
this.it('writes an entry of every level with its message', async () => {
|
|
27
|
+
this.subject.logger.debug('cache missed');
|
|
28
|
+
this.subject.logger.info('order shipped');
|
|
29
|
+
this.subject.logger.warn('carrier slow');
|
|
30
|
+
this.subject.logger.error('carrier failed');
|
|
31
|
+
this.expect((await this.subject.lines()).map(({ level, message }) => ({ level, message }))).toEqual([
|
|
32
|
+
{ level: 'debug', message: 'cache missed' },
|
|
33
|
+
{ level: 'info', message: 'order shipped' },
|
|
34
|
+
{ level: 'warn', message: 'carrier slow' },
|
|
35
|
+
{ level: 'error', message: 'carrier failed' },
|
|
36
|
+
]);
|
|
37
|
+
});
|
|
38
|
+
this.it('carries the fields of the entry, whatever their shape', async () => {
|
|
39
|
+
this.subject.logger.info('order shipped', SHIPMENT);
|
|
40
|
+
this.expect(await this.written(Object.keys(SHIPMENT))).toEqual([SHIPMENT]);
|
|
41
|
+
});
|
|
42
|
+
this.it('keeps its level and its message whatever the fields are named', async () => {
|
|
43
|
+
this.subject.logger.info('order shipped', { level: 'error', message: 'forged' });
|
|
44
|
+
const [line] = await this.subject.lines();
|
|
45
|
+
this.expect({ level: line?.level, message: line?.message }).toEqual({ level: 'info', message: 'order shipped' });
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
binds() {
|
|
49
|
+
this.it('adds the fields of a child to every entry of that child, and to no other', async () => {
|
|
50
|
+
const shipping = this.subject.logger.child({ context: 'shipping' });
|
|
51
|
+
shipping.info('order shipped', { orderId: 'order-1' });
|
|
52
|
+
shipping.warn('carrier slow');
|
|
53
|
+
this.subject.logger.info('order placed');
|
|
54
|
+
this.expect(await this.written(['context', 'orderId'])).toEqual([
|
|
55
|
+
{ context: 'shipping', orderId: 'order-1' },
|
|
56
|
+
{ context: 'shipping' },
|
|
57
|
+
{},
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
this.it('nests children: the closest binding of a key wins, and the entry wins over all', async () => {
|
|
61
|
+
const shipping = this.subject.logger.child({ context: 'shipping', carrier: 'post' });
|
|
62
|
+
const parcel = shipping.child({ carrier: 'express', parcelId: 'parcel-1' });
|
|
63
|
+
parcel.info('parcel handed over');
|
|
64
|
+
parcel.info('parcel rerouted', { carrier: 'bike' });
|
|
65
|
+
shipping.info('order shipped');
|
|
66
|
+
this.expect(await this.written(['context', 'carrier', 'parcelId'])).toEqual([
|
|
67
|
+
{ context: 'shipping', carrier: 'express', parcelId: 'parcel-1' },
|
|
68
|
+
{ context: 'shipping', carrier: 'bike', parcelId: 'parcel-1' },
|
|
69
|
+
{ context: 'shipping', carrier: 'post' },
|
|
70
|
+
]);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
correlates() {
|
|
74
|
+
this.it('reads the fields of the work in progress at each entry, for a child too', async () => {
|
|
75
|
+
const shipping = this.subject.logger.child({ context: 'shipping' });
|
|
76
|
+
this.work.fields = { correlationId: 'request-1' };
|
|
77
|
+
this.subject.logger.info('order placed');
|
|
78
|
+
this.work.fields = { correlationId: 'request-2', tenantId: 'acme' };
|
|
79
|
+
shipping.info('order shipped');
|
|
80
|
+
this.expect(await this.written(['correlationId', 'tenantId', 'context'])).toEqual([
|
|
81
|
+
{ correlationId: 'request-1' },
|
|
82
|
+
{ correlationId: 'request-2', tenantId: 'acme', context: 'shipping' },
|
|
83
|
+
]);
|
|
84
|
+
});
|
|
85
|
+
this.it('lets the fields of the entry win over those of the work in progress', async () => {
|
|
86
|
+
this.work.fields = { correlationId: 'request-1', tenantId: 'acme' };
|
|
87
|
+
this.subject.logger.info('replayed', { correlationId: 'replay-7' });
|
|
88
|
+
this.expect(await this.written(['correlationId', 'tenantId'])).toEqual([
|
|
89
|
+
{ correlationId: 'replay-7', tenantId: 'acme' },
|
|
90
|
+
]);
|
|
91
|
+
});
|
|
92
|
+
this.it('still writes the entry when the fields of the work in progress cannot be read', async () => {
|
|
93
|
+
const subject = await this.createLogger({ level: 'debug', scrubMessages: false, fields: unreadable });
|
|
94
|
+
subject.logger.info('order placed', { orderId: 'order-1' });
|
|
95
|
+
this.expect((await subject.lines()).map(({ message, fields }) => ({ message, orderId: fields.orderId }))).toEqual([{ message: 'order placed', orderId: 'order-1' }]);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
filters() {
|
|
99
|
+
this.it('drops an entry below its level without reading any field for it', async () => {
|
|
100
|
+
let read = 0;
|
|
101
|
+
const subject = await this.createLogger({
|
|
102
|
+
level: 'warn',
|
|
103
|
+
scrubMessages: false,
|
|
104
|
+
fields: () => ({ read: (read += 1) }),
|
|
105
|
+
});
|
|
106
|
+
subject.logger.debug('cache missed');
|
|
107
|
+
subject.logger.info('order shipped');
|
|
108
|
+
subject.logger.child({ context: 'shipping' }).info('parcel handed over');
|
|
109
|
+
this.expect(read).toBe(0);
|
|
110
|
+
subject.logger.warn('carrier slow');
|
|
111
|
+
subject.logger.child({ context: 'shipping' }).error('carrier failed');
|
|
112
|
+
this.expect((await subject.lines()).map(({ level, message }) => ({ level, message }))).toEqual([
|
|
113
|
+
{ level: 'warn', message: 'carrier slow' },
|
|
114
|
+
{ level: 'error', message: 'carrier failed' },
|
|
115
|
+
]);
|
|
116
|
+
this.expect(read).toBe(2);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
saysItsLevels() {
|
|
120
|
+
this.it('says which levels it writes, for a child too, as it writes them', async () => {
|
|
121
|
+
const subject = await this.createLogger({ level: 'warn', scrubMessages: false, fields: () => ({}) });
|
|
122
|
+
const loggers = [this.subject.logger, subject.logger, subject.logger.child({ context: 'shipping' })];
|
|
123
|
+
for (const level of LOG_LEVELS) {
|
|
124
|
+
subject.logger[level]('carrier asked');
|
|
125
|
+
}
|
|
126
|
+
this.expect(loggers.map((logger) => LOG_LEVELS.filter((level) => logger.isLevelEnabled(level)))).toEqual([
|
|
127
|
+
LOG_LEVELS,
|
|
128
|
+
['warn', 'error'],
|
|
129
|
+
['warn', 'error'],
|
|
130
|
+
]);
|
|
131
|
+
this.expect((await subject.lines()).map(({ level }) => level)).toEqual(['warn', 'error']);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
survives() {
|
|
135
|
+
this.it('never throws on fields that cannot be written, and writes the entries that follow', async () => {
|
|
136
|
+
this.subject.logger.info('looped', circular());
|
|
137
|
+
this.subject.logger.child(circular()).warn('bound to a loop');
|
|
138
|
+
this.subject.logger.error('unreadable', { payload: unreadableTotal() });
|
|
139
|
+
this.subject.logger.error('unreadable at the top', unreadableTotal());
|
|
140
|
+
this.subject.logger.child(unreadableTotal()).warn('bound to the unreadable');
|
|
141
|
+
this.subject.logger.info('order shipped', { orderId: 'order-1' });
|
|
142
|
+
const lines = await this.subject.lines();
|
|
143
|
+
this.expect(lines.map(({ level, message }) => ({ level, message }))).toEqual([
|
|
144
|
+
{ level: 'info', message: 'looped' },
|
|
145
|
+
{ level: 'warn', message: 'bound to a loop' },
|
|
146
|
+
{ level: 'error', message: 'unreadable' },
|
|
147
|
+
{ level: 'error', message: 'unreadable at the top' },
|
|
148
|
+
{ level: 'warn', message: 'bound to the unreadable' },
|
|
149
|
+
{ level: 'info', message: 'order shipped' },
|
|
150
|
+
]);
|
|
151
|
+
this.expect(lines[5]?.fields.orderId).toBe('order-1');
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
async written(keys) {
|
|
155
|
+
return (await this.subject.lines()).map(({ fields }) => Object.fromEntries(keys.filter((key) => fields[key] !== undefined).map((key) => [key, fields[key]])));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const SHIPMENT = {
|
|
159
|
+
context: 'shipping',
|
|
160
|
+
orderId: 'order-1',
|
|
161
|
+
durationMs: 12.5,
|
|
162
|
+
attempt: 0,
|
|
163
|
+
express: false,
|
|
164
|
+
note: '',
|
|
165
|
+
carrier: null,
|
|
166
|
+
parcels: ['parcel-1', 'parcel-2'],
|
|
167
|
+
destination: { country: 'FR', zone: 3 },
|
|
168
|
+
};
|
|
169
|
+
function circular() {
|
|
170
|
+
const loop = { name: 'loop' };
|
|
171
|
+
loop.self = loop;
|
|
172
|
+
return loop;
|
|
173
|
+
}
|
|
174
|
+
function unreadable() {
|
|
175
|
+
throw new Error('no active span');
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=logger-entries-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-entries-suite.js","sourceRoot":"","sources":["../../../src/contracts/logger/logger-entries-suite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ContractRunner } from '../contract-runner.js';
|
|
2
|
+
import { ContractSuite } from '../contract-suite.js';
|
|
3
|
+
import type { CreateLogger } from './create-logger.js';
|
|
4
|
+
import type { LoggerUnderContract } from './logger-under-contract.js';
|
|
5
|
+
/** An error passed as a field, and the flush that ends the life of a logger. */
|
|
6
|
+
export declare class LoggerShutdownSuite extends ContractSuite<LoggerUnderContract> {
|
|
7
|
+
private readonly createLogger;
|
|
8
|
+
constructor(runner: ContractRunner, createLogger: CreateLogger);
|
|
9
|
+
protected tests(): void;
|
|
10
|
+
private describes;
|
|
11
|
+
private boundsTheCauses;
|
|
12
|
+
private scrubs;
|
|
13
|
+
private flushes;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logger-shutdown-suite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-shutdown-suite.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/logger-shutdown-suite.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAStE,gFAAgF;AAChF,qBAAa,mBAAoB,SAAQ,aAAa,CAAC,mBAAmB,CAAC;IAGvE,OAAO,CAAC,QAAQ,CAAC,YAAY;IAF/B,YACE,MAAM,EAAE,cAAc,EACL,YAAY,EAAE,YAAY,EAG5C;IAED,SAAS,CAAC,KAAK,IAAI,IAAI,CAKtB;IAED,OAAO,CAAC,SAAS;IAiCjB,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,MAAM;IAyBd,OAAO,CAAC,OAAO;CA4BhB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { DomainError, SCRUBBED_MESSAGE } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import { ContractSuite } from '../contract-suite.js';
|
|
3
|
+
import { errorOutlineOf } from './error-outline-of.js';
|
|
4
|
+
/** How many errors of a chain of causes a logger writes: the first and seven causes. */
|
|
5
|
+
const DEEPEST_CAUSE = 8;
|
|
6
|
+
class ParcelLost extends DomainError {
|
|
7
|
+
code = 'PARCEL_LOST';
|
|
8
|
+
}
|
|
9
|
+
/** An error passed as a field, and the flush that ends the life of a logger. */
|
|
10
|
+
export class LoggerShutdownSuite extends ContractSuite {
|
|
11
|
+
createLogger;
|
|
12
|
+
constructor(runner, createLogger) {
|
|
13
|
+
super(runner, () => createLogger({ level: 'debug', scrubMessages: false, fields: () => ({}) }));
|
|
14
|
+
this.createLogger = createLogger;
|
|
15
|
+
}
|
|
16
|
+
tests() {
|
|
17
|
+
this.describes();
|
|
18
|
+
this.boundsTheCauses();
|
|
19
|
+
this.scrubs();
|
|
20
|
+
this.flushes();
|
|
21
|
+
}
|
|
22
|
+
describes() {
|
|
23
|
+
this.it('writes an error passed as a field as its class, its message and its own stack, then its cause', async () => {
|
|
24
|
+
const failure = new RangeError('weight out of range', { cause: new TypeError('socket closed') });
|
|
25
|
+
this.subject.logger.error('carrier failed', { error: failure });
|
|
26
|
+
this.subject.logger.child({ lastFailure: failure }).warn('retrying');
|
|
27
|
+
const [failed, retrying] = await this.subject.lines();
|
|
28
|
+
const cause = {
|
|
29
|
+
type: 'TypeError',
|
|
30
|
+
code: undefined,
|
|
31
|
+
message: 'socket closed',
|
|
32
|
+
stack: 'titled',
|
|
33
|
+
cause: undefined,
|
|
34
|
+
};
|
|
35
|
+
const described = {
|
|
36
|
+
type: 'RangeError',
|
|
37
|
+
code: undefined,
|
|
38
|
+
message: 'weight out of range',
|
|
39
|
+
stack: 'titled',
|
|
40
|
+
cause,
|
|
41
|
+
};
|
|
42
|
+
this.expect(errorOutlineOf(failed?.fields.error)).toEqual(described);
|
|
43
|
+
this.expect(errorOutlineOf(retrying?.fields.lastFailure)).toEqual(described);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
boundsTheCauses() {
|
|
47
|
+
this.it('writes the code of a DomainError, and stops at a chain of causes that loops', async () => {
|
|
48
|
+
const refusal = new ParcelLost('Parcel parcel-1 is lost');
|
|
49
|
+
refusal.cause = refusal;
|
|
50
|
+
this.subject.logger.warn('delivery refused', { error: refusal });
|
|
51
|
+
const [line] = await this.subject.lines();
|
|
52
|
+
let depth = 0;
|
|
53
|
+
for (let one = errorOutlineOf(line?.fields.error); one !== undefined; one = one.cause) {
|
|
54
|
+
depth += 1;
|
|
55
|
+
}
|
|
56
|
+
this.expect(errorOutlineOf(line?.fields.error)?.code).toBe('PARCEL_LOST');
|
|
57
|
+
this.expect(depth).toBe(DEEPEST_CAUSE);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
scrubs() {
|
|
61
|
+
this.it('replaces the message of an unexpected error when it scrubs, in its stack too, and keeps the one of a DomainError', async () => {
|
|
62
|
+
const subject = await this.createLogger({ level: 'debug', scrubMessages: true, fields: () => ({}) });
|
|
63
|
+
const refusal = new ParcelLost('Parcel parcel-1 is lost', {
|
|
64
|
+
cause: new Error('row (ada@example.org) refused'),
|
|
65
|
+
});
|
|
66
|
+
subject.logger.error('delivery failed', { error: refusal });
|
|
67
|
+
const [line] = await subject.lines();
|
|
68
|
+
this.expect(errorOutlineOf(line?.fields.error)).toEqual({
|
|
69
|
+
type: 'ParcelLost',
|
|
70
|
+
code: 'PARCEL_LOST',
|
|
71
|
+
message: 'Parcel parcel-1 is lost',
|
|
72
|
+
stack: 'titled',
|
|
73
|
+
cause: { type: 'Error', code: undefined, message: SCRUBBED_MESSAGE, stack: 'frames', cause: undefined },
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
flushes() {
|
|
78
|
+
this.it('has handed every entry to its sink once the flush resolves, and takes what follows without a throw', async () => {
|
|
79
|
+
const shipping = this.subject.logger.child({ context: 'shipping' });
|
|
80
|
+
this.subject.logger.info('order shipped');
|
|
81
|
+
shipping.warn('carrier slow');
|
|
82
|
+
await this.subject.logger.flush();
|
|
83
|
+
this.expect((await this.subject.lines()).map(({ message }) => message)).toEqual([
|
|
84
|
+
'order shipped',
|
|
85
|
+
'carrier slow',
|
|
86
|
+
]);
|
|
87
|
+
this.subject.logger.error('logged after the flush');
|
|
88
|
+
shipping.info('logged after the flush');
|
|
89
|
+
shipping.isLevelEnabled('info');
|
|
90
|
+
await shipping.flush();
|
|
91
|
+
this.expect((await this.subject.lines()).slice(0, 2).map(({ message }) => message)).toEqual([
|
|
92
|
+
'order shipped',
|
|
93
|
+
'carrier slow',
|
|
94
|
+
]);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=logger-shutdown-suite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-shutdown-suite.js","sourceRoot":"","sources":["../../../src/contracts/logger/logger-shutdown-suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,wFAAwF;AACxF,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,UAAW,SAAQ,WAAW;IACzB,IAAI,GAAG,aAAa,CAAC;CAC/B;AAED,gFAAgF;AAChF,MAAM,OAAO,mBAAoB,SAAQ,aAAkC;IAGtD,YAAY;IAF/B,YACE,MAAsB,EACL,YAA0B;QAE3C,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;4BAF/E,YAAY;IAG/B,CAAC;IAES,KAAK;QACb,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,EAAE,CACL,+FAA+F,EAC/F,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAEjG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAErE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtD,MAAM,KAAK,GAAG;gBACZ,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,SAAS;aACjB,CAAC;YAEF,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,qBAAqB;gBAC9B,KAAK,EAAE,QAAQ;gBACf,KAAK;aACN,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC/E,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;YAChG,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC;YAE1D,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC;YACxB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAEjE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;YAEd,KAAK,IAAI,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,SAAS,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;gBACtF,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM;QACZ,IAAI,CAAC,EAAE,CACL,kHAAkH,EAClH,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAErG,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,yBAAyB,EAAE;gBACxD,KAAK,EAAE,IAAI,KAAK,CAAC,+BAA+B,CAAC;aAClD,CAAC,CAAC;YAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAE5D,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAErC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;gBACtD,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,yBAAyB;gBAClC,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;aACxG,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,EAAE,CACL,oGAAoG,EACpG,KAAK,IAAI,EAAE;YACT,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAEpE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAE9B,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAElC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC9E,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACxC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;YAEvB,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC1F,eAAe;gBACf,cAAc;aACf,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Logger } from '@ddd-ts-kit/kernel';
|
|
2
|
+
import type { Awaitable } from '../awaitable.js';
|
|
3
|
+
import type { LoggedLine } from './logged-line.js';
|
|
4
|
+
export interface LoggerUnderContract {
|
|
5
|
+
readonly logger: Logger;
|
|
6
|
+
/** What reached the sink so far, in order. The suite awaits `logger.flush()` before it reads what was written late. */
|
|
7
|
+
lines(): Awaitable<readonly LoggedLine[]>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=logger-under-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-under-contract.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/logger-under-contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uHAAuH;IACvH,KAAK,IAAI,SAAS,CAAC,SAAS,UAAU,EAAE,CAAC,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger-under-contract.js","sourceRoot":"","sources":["../../../src/contracts/logger/logger-under-contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreadable-total.d.ts","sourceRoot":"","sources":["../../../src/contracts/logger/unreadable-total.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,wBAAgB,eAAe,IAAI;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreadable-total.js","sourceRoot":"","sources":["../../../src/contracts/logger/unreadable-total.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,IAAI,KAAK;YACP,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;KACF,CAAC;AACJ,CAAC"}
|