@tstdl/base 0.93.182 → 0.93.183
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/api/server/api-request-token.provider.js +1 -1
- package/api/server/gateway.js +6 -1
- package/authentication/authentication.api.d.ts +13 -40
- package/authentication/authentication.api.js +5 -14
- package/authentication/client/authentication.service.d.ts +6 -14
- package/authentication/client/authentication.service.js +22 -4
- package/authentication/client/module.d.ts +1 -1
- package/authentication/client/module.js +4 -4
- package/authentication/models/index.d.ts +1 -0
- package/authentication/models/index.js +1 -0
- package/authentication/models/totp-results.model.d.ts +11 -0
- package/authentication/models/totp-results.model.js +37 -0
- package/authentication/server/authentication.api-controller.d.ts +3 -3
- package/authentication/server/authentication.api-controller.js +31 -4
- package/authentication/server/authentication.service.d.ts +5 -14
- package/authentication/server/authentication.service.js +6 -4
- package/core.d.ts +0 -5
- package/core.js +0 -8
- package/document-management/api/document-management.api.d.ts +2 -2
- package/document-management/service-models/document.service-model.d.ts +1 -1
- package/examples/config.d.ts +25 -0
- package/examples/config.js +26 -0
- package/notification/server/module.d.ts +1 -1
- package/notification/server/module.js +1 -1
- package/package.json +5 -5
- package/signals/api.d.ts +5 -1
- package/signals/api.js +3 -1
- package/signals/implementation/api.d.ts +13 -5
- package/signals/implementation/api.js +7 -1
- package/signals/implementation/asserts.d.ts +2 -2
- package/signals/implementation/asserts.js +3 -3
- package/signals/implementation/computed.d.ts +7 -34
- package/signals/implementation/computed.js +14 -83
- package/signals/implementation/configure.js +6 -2
- package/signals/implementation/effect.d.ts +65 -46
- package/signals/implementation/effect.js +97 -62
- package/signals/implementation/index.d.ts +2 -4
- package/signals/implementation/index.js +2 -4
- package/signals/implementation/linked_signal.d.ts +36 -0
- package/signals/implementation/linked_signal.js +34 -0
- package/signals/implementation/primitive/computed.d.ts +55 -0
- package/signals/implementation/primitive/computed.js +107 -0
- package/signals/implementation/primitive/effect.d.ts +26 -0
- package/signals/implementation/primitive/effect.js +31 -0
- package/signals/implementation/{equality.d.ts → primitive/equality.d.ts} +1 -1
- package/signals/implementation/{equality.js → primitive/equality.js} +1 -1
- package/signals/implementation/primitive/errors.d.ts +10 -0
- package/signals/implementation/{errors.js → primitive/errors.js} +3 -4
- package/signals/implementation/primitive/formatter.d.ts +19 -0
- package/signals/implementation/primitive/formatter.js +136 -0
- package/signals/implementation/{graph.d.ts → primitive/graph.d.ts} +68 -36
- package/signals/implementation/primitive/graph.js +386 -0
- package/signals/implementation/primitive/linked_signal.d.ts +46 -0
- package/signals/implementation/primitive/linked_signal.js +110 -0
- package/signals/implementation/primitive/signal.d.ts +31 -0
- package/signals/implementation/primitive/signal.js +80 -0
- package/signals/implementation/primitive/untracked.d.ts +12 -0
- package/signals/implementation/primitive/untracked.js +23 -0
- package/signals/implementation/{watch.d.ts → primitive/watch.d.ts} +1 -2
- package/signals/implementation/{watch.js → primitive/watch.js} +22 -16
- package/signals/implementation/resource/api.d.ts +275 -0
- package/signals/implementation/resource/api.js +26 -0
- package/signals/implementation/resource/debounce.d.ts +13 -0
- package/signals/implementation/resource/debounce.js +113 -0
- package/signals/implementation/resource/from_snapshots.d.ts +16 -0
- package/signals/implementation/resource/from_snapshots.js +44 -0
- package/signals/implementation/resource/index.d.ts +11 -0
- package/signals/implementation/resource/index.js +11 -0
- package/signals/implementation/resource/resource.d.ts +110 -0
- package/signals/implementation/resource/resource.js +402 -0
- package/signals/implementation/root_effect_scheduler.d.ts +50 -0
- package/signals/implementation/root_effect_scheduler.js +66 -0
- package/signals/implementation/signal.d.ts +42 -18
- package/signals/implementation/signal.js +29 -49
- package/signals/implementation/to-observable.d.ts +12 -5
- package/signals/implementation/to-observable.js +12 -2
- package/signals/implementation/to-signal.d.ts +9 -18
- package/signals/implementation/to-signal.js +46 -13
- package/signals/implementation/untracked.d.ts +1 -1
- package/signals/implementation/untracked.js +3 -11
- package/signals/operators/debounce.d.ts +8 -0
- package/signals/operators/debounce.js +19 -0
- package/signals/operators/derive-async.js +43 -15
- package/signals/operators/index.d.ts +2 -0
- package/signals/operators/index.js +2 -0
- package/signals/operators/throttle.d.ts +8 -0
- package/signals/operators/throttle.js +31 -0
- package/ai/genkit/tests/multi-region.test.d.ts +0 -2
- package/ai/genkit/tests/multi-region.test.js +0 -179
- package/ai/genkit/tests/token-limit-fallback.test.d.ts +0 -2
- package/ai/genkit/tests/token-limit-fallback.test.js +0 -209
- package/ai/prompts/tests/prompt-builder.test.d.ts +0 -1
- package/ai/prompts/tests/prompt-builder.test.js +0 -22
- package/ai/tests/instructions-formatter.test.d.ts +0 -1
- package/ai/tests/instructions-formatter.test.js +0 -116
- package/ai/tests/steering.test.d.ts +0 -1
- package/ai/tests/steering.test.js +0 -37
- package/api/client/tests/api-client.test.d.ts +0 -1
- package/api/client/tests/api-client.test.js +0 -194
- package/api/server/tests/csrf.middleware.test.d.ts +0 -1
- package/api/server/tests/csrf.middleware.test.js +0 -91
- package/authentication/tests/authentication-password-requirements.validator.test.d.ts +0 -1
- package/authentication/tests/authentication-password-requirements.validator.test.js +0 -29
- package/authentication/tests/authentication.api-controller.test.d.ts +0 -1
- package/authentication/tests/authentication.api-controller.test.js +0 -156
- package/authentication/tests/authentication.api-request-token.provider.test.d.ts +0 -1
- package/authentication/tests/authentication.api-request-token.provider.test.js +0 -48
- package/authentication/tests/authentication.client-error-handling.test.d.ts +0 -1
- package/authentication/tests/authentication.client-error-handling.test.js +0 -123
- package/authentication/tests/authentication.client-middleware.test.d.ts +0 -1
- package/authentication/tests/authentication.client-middleware.test.js +0 -118
- package/authentication/tests/authentication.client-service-methods.test.d.ts +0 -1
- package/authentication/tests/authentication.client-service-methods.test.js +0 -177
- package/authentication/tests/authentication.client-service-refresh.test.d.ts +0 -1
- package/authentication/tests/authentication.client-service-refresh.test.js +0 -153
- package/authentication/tests/authentication.client-service.test.d.ts +0 -1
- package/authentication/tests/authentication.client-service.test.js +0 -76
- package/authentication/tests/authentication.refresh-busy-loop.test.d.ts +0 -1
- package/authentication/tests/authentication.refresh-busy-loop.test.js +0 -84
- package/authentication/tests/authentication.service.test.d.ts +0 -1
- package/authentication/tests/authentication.service.test.js +0 -167
- package/authentication/tests/authentication.test-ancillary-service.d.ts +0 -9
- package/authentication/tests/authentication.test-ancillary-service.js +0 -27
- package/authentication/tests/brute-force-protection.test.d.ts +0 -1
- package/authentication/tests/brute-force-protection.test.js +0 -211
- package/authentication/tests/helper.test.d.ts +0 -1
- package/authentication/tests/helper.test.js +0 -122
- package/authentication/tests/password-requirements.error.test.d.ts +0 -1
- package/authentication/tests/password-requirements.error.test.js +0 -14
- package/authentication/tests/remember.api.test.d.ts +0 -1
- package/authentication/tests/remember.api.test.js +0 -117
- package/authentication/tests/remember.service.test.d.ts +0 -1
- package/authentication/tests/remember.service.test.js +0 -83
- package/authentication/tests/subject.service.test.d.ts +0 -1
- package/authentication/tests/subject.service.test.js +0 -140
- package/authentication/tests/suspended-subject.test.d.ts +0 -1
- package/authentication/tests/suspended-subject.test.js +0 -120
- package/authentication/tests/totp.enrollment.test.d.ts +0 -1
- package/authentication/tests/totp.enrollment.test.js +0 -123
- package/authentication/tests/totp.login.test.d.ts +0 -1
- package/authentication/tests/totp.login.test.js +0 -213
- package/authentication/tests/totp.recovery-codes.test.d.ts +0 -1
- package/authentication/tests/totp.recovery-codes.test.js +0 -97
- package/authentication/tests/totp.status.test.d.ts +0 -1
- package/authentication/tests/totp.status.test.js +0 -72
- package/cancellation/tests/coverage.test.d.ts +0 -1
- package/cancellation/tests/coverage.test.js +0 -49
- package/cancellation/tests/leak.test.d.ts +0 -1
- package/cancellation/tests/leak.test.js +0 -35
- package/cancellation/tests/token.test.d.ts +0 -1
- package/cancellation/tests/token.test.js +0 -136
- package/circuit-breaker/tests/circuit-breaker.test.d.ts +0 -1
- package/circuit-breaker/tests/circuit-breaker.test.js +0 -116
- package/cryptography/tests/cryptography.test.d.ts +0 -1
- package/cryptography/tests/cryptography.test.js +0 -175
- package/cryptography/tests/jwt.test.d.ts +0 -1
- package/cryptography/tests/jwt.test.js +0 -54
- package/cryptography/tests/modern.test.d.ts +0 -1
- package/cryptography/tests/modern.test.js +0 -105
- package/cryptography/tests/module.test.d.ts +0 -1
- package/cryptography/tests/module.test.js +0 -100
- package/cryptography/tests/totp.test.d.ts +0 -1
- package/cryptography/tests/totp.test.js +0 -108
- package/document-management/tests/ai-config-hierarchy.test.d.ts +0 -1
- package/document-management/tests/ai-config-hierarchy.test.js +0 -59
- package/document-management/tests/ai-config-integration.test.d.ts +0 -1
- package/document-management/tests/ai-config-integration.test.js +0 -125
- package/document-management/tests/ai-config-merge.test.d.ts +0 -1
- package/document-management/tests/ai-config-merge.test.js +0 -46
- package/document-management/tests/document-management-ai-overrides.test.d.ts +0 -1
- package/document-management/tests/document-management-ai-overrides.test.js +0 -63
- package/document-management/tests/document-management-core.test.d.ts +0 -1
- package/document-management/tests/document-management-core.test.js +0 -157
- package/document-management/tests/document-management.api.test.d.ts +0 -1
- package/document-management/tests/document-management.api.test.js +0 -101
- package/document-management/tests/document-statistics.service.test.d.ts +0 -1
- package/document-management/tests/document-statistics.service.test.js +0 -498
- package/document-management/tests/document-validation-ai-overrides.test.d.ts +0 -1
- package/document-management/tests/document-validation-ai-overrides.test.js +0 -87
- package/document-management/tests/document.service.test.d.ts +0 -1
- package/document-management/tests/document.service.test.js +0 -143
- package/document-management/tests/enum-helpers.test.d.ts +0 -1
- package/document-management/tests/enum-helpers.test.js +0 -452
- package/document-management/tests/helper.d.ts +0 -24
- package/document-management/tests/helper.js +0 -39
- package/errors/tests/format.test.d.ts +0 -1
- package/errors/tests/format.test.js +0 -84
- package/http/tests/server-timing.test.d.ts +0 -1
- package/http/tests/server-timing.test.js +0 -42
- package/injector/tests/advanced.test.d.ts +0 -1
- package/injector/tests/advanced.test.js +0 -116
- package/injector/tests/async-init.test.d.ts +0 -1
- package/injector/tests/async-init.test.js +0 -77
- package/injector/tests/basic.test.d.ts +0 -1
- package/injector/tests/basic.test.js +0 -114
- package/injector/tests/hierarchical.test.d.ts +0 -1
- package/injector/tests/hierarchical.test.js +0 -59
- package/injector/tests/leak.test.d.ts +0 -1
- package/injector/tests/leak.test.js +0 -45
- package/injector/tests/lifecycles.test.d.ts +0 -1
- package/injector/tests/lifecycles.test.js +0 -109
- package/logger/tests/pretty-print.test.d.ts +0 -1
- package/logger/tests/pretty-print.test.js +0 -60
- package/notification/tests/notification-api.test.d.ts +0 -1
- package/notification/tests/notification-api.test.js +0 -124
- package/notification/tests/notification-client.test.d.ts +0 -1
- package/notification/tests/notification-client.test.js +0 -101
- package/notification/tests/notification-flow.test.d.ts +0 -1
- package/notification/tests/notification-flow.test.js +0 -296
- package/notification/tests/notification-sse.service.test.d.ts +0 -1
- package/notification/tests/notification-sse.service.test.js +0 -43
- package/notification/tests/notification-type.service.test.d.ts +0 -1
- package/notification/tests/notification-type.service.test.js +0 -41
- package/object-storage/s3/tests/s3.object-storage.integration.test.d.ts +0 -1
- package/object-storage/s3/tests/s3.object-storage.integration.test.js +0 -303
- package/orm/tests/build-jsonb.test.d.ts +0 -1
- package/orm/tests/build-jsonb.test.js +0 -39
- package/orm/tests/data-types.test.d.ts +0 -1
- package/orm/tests/data-types.test.js +0 -39
- package/orm/tests/database-extension.test.d.ts +0 -1
- package/orm/tests/database-extension.test.js +0 -63
- package/orm/tests/database-migration.test.d.ts +0 -1
- package/orm/tests/database-migration.test.js +0 -83
- package/orm/tests/decorators.test.d.ts +0 -1
- package/orm/tests/decorators.test.js +0 -77
- package/orm/tests/encryption.test.d.ts +0 -1
- package/orm/tests/encryption.test.js +0 -31
- package/orm/tests/query-complex.test.d.ts +0 -1
- package/orm/tests/query-complex.test.js +0 -172
- package/orm/tests/query-converter-complex.test.d.ts +0 -1
- package/orm/tests/query-converter-complex.test.js +0 -131
- package/orm/tests/query-converter.test.d.ts +0 -1
- package/orm/tests/query-converter.test.js +0 -123
- package/orm/tests/repository-advanced.test.d.ts +0 -1
- package/orm/tests/repository-advanced.test.js +0 -189
- package/orm/tests/repository-attributes.test.d.ts +0 -1
- package/orm/tests/repository-attributes.test.js +0 -83
- package/orm/tests/repository-compound-primary-key.test.d.ts +0 -2
- package/orm/tests/repository-compound-primary-key.test.js +0 -226
- package/orm/tests/repository-comprehensive.test.d.ts +0 -1
- package/orm/tests/repository-comprehensive.test.js +0 -162
- package/orm/tests/repository-coverage.test.d.ts +0 -2
- package/orm/tests/repository-coverage.test.js +0 -242
- package/orm/tests/repository-cti-complex.test.d.ts +0 -1
- package/orm/tests/repository-cti-complex.test.js +0 -151
- package/orm/tests/repository-cti-embedded.test.d.ts +0 -1
- package/orm/tests/repository-cti-embedded.test.js +0 -178
- package/orm/tests/repository-cti-extensive.test.d.ts +0 -2
- package/orm/tests/repository-cti-extensive.test.js +0 -279
- package/orm/tests/repository-cti-mapping.test.d.ts +0 -2
- package/orm/tests/repository-cti-mapping.test.js +0 -108
- package/orm/tests/repository-cti-search.test.d.ts +0 -1
- package/orm/tests/repository-cti-search.test.js +0 -141
- package/orm/tests/repository-cti-soft-delete.test.d.ts +0 -2
- package/orm/tests/repository-cti-soft-delete.test.js +0 -103
- package/orm/tests/repository-cti-transactions.test.d.ts +0 -1
- package/orm/tests/repository-cti-transactions.test.js +0 -112
- package/orm/tests/repository-cti-upsert-many.test.d.ts +0 -2
- package/orm/tests/repository-cti-upsert-many.test.js +0 -115
- package/orm/tests/repository-cti.test.d.ts +0 -2
- package/orm/tests/repository-cti.test.js +0 -390
- package/orm/tests/repository-edge-cases.test.d.ts +0 -1
- package/orm/tests/repository-edge-cases.test.js +0 -178
- package/orm/tests/repository-expiration.test.d.ts +0 -2
- package/orm/tests/repository-expiration.test.js +0 -140
- package/orm/tests/repository-extra-coverage.test.d.ts +0 -2
- package/orm/tests/repository-extra-coverage.test.js +0 -402
- package/orm/tests/repository-mapping.test.d.ts +0 -2
- package/orm/tests/repository-mapping.test.js +0 -65
- package/orm/tests/repository-regression.test.d.ts +0 -1
- package/orm/tests/repository-regression.test.js +0 -288
- package/orm/tests/repository-search-coverage.test.d.ts +0 -1
- package/orm/tests/repository-search-coverage.test.js +0 -107
- package/orm/tests/repository-search.test.d.ts +0 -1
- package/orm/tests/repository-search.test.js +0 -105
- package/orm/tests/repository-soft-delete.test.d.ts +0 -1
- package/orm/tests/repository-soft-delete.test.js +0 -118
- package/orm/tests/repository-transactions-nested.test.d.ts +0 -1
- package/orm/tests/repository-transactions-nested.test.js +0 -178
- package/orm/tests/repository-types.test.d.ts +0 -1
- package/orm/tests/repository-types.test.js +0 -184
- package/orm/tests/repository-undelete.test.d.ts +0 -2
- package/orm/tests/repository-undelete.test.js +0 -201
- package/orm/tests/schema-converter.test.d.ts +0 -1
- package/orm/tests/schema-converter.test.js +0 -82
- package/orm/tests/schema-generation.test.d.ts +0 -2
- package/orm/tests/schema-generation.test.js +0 -174
- package/orm/tests/sql-helpers.test.d.ts +0 -1
- package/orm/tests/sql-helpers.test.js +0 -67
- package/orm/tests/transaction-safety.test.d.ts +0 -1
- package/orm/tests/transaction-safety.test.js +0 -81
- package/orm/tests/transactional.test.d.ts +0 -1
- package/orm/tests/transactional.test.js +0 -215
- package/orm/tests/utils.test.d.ts +0 -1
- package/orm/tests/utils.test.js +0 -70
- package/pdf/tests/utils.test.d.ts +0 -1
- package/pdf/tests/utils.test.js +0 -187
- package/process/tests/spawn.test.d.ts +0 -1
- package/process/tests/spawn.test.js +0 -182
- package/rate-limit/tests/postgres-rate-limiter.test.d.ts +0 -1
- package/rate-limit/tests/postgres-rate-limiter.test.js +0 -84
- package/renderer/tests/renderer.test.d.ts +0 -1
- package/renderer/tests/renderer.test.js +0 -88
- package/rpc/tests/rpc.integration.test.d.ts +0 -1
- package/rpc/tests/rpc.integration.test.js +0 -615
- package/signals/implementation/errors.d.ts +0 -2
- package/signals/implementation/graph.js +0 -312
- package/signals/implementation/writable-signal.d.ts +0 -48
- package/signals/implementation/writable-signal.js +0 -32
- package/task-queue/tests/coverage-branch.test.d.ts +0 -1
- package/task-queue/tests/coverage-branch.test.js +0 -395
- package/task-queue/tests/coverage-enhancement.test.d.ts +0 -1
- package/task-queue/tests/coverage-enhancement.test.js +0 -150
- package/task-queue/tests/dag.test.d.ts +0 -1
- package/task-queue/tests/dag.test.js +0 -188
- package/task-queue/tests/dependencies.test.d.ts +0 -1
- package/task-queue/tests/dependencies.test.js +0 -296
- package/task-queue/tests/enqueue-batch.test.d.ts +0 -1
- package/task-queue/tests/enqueue-batch.test.js +0 -125
- package/task-queue/tests/enqueue-item.test.d.ts +0 -1
- package/task-queue/tests/enqueue-item.test.js +0 -12
- package/task-queue/tests/fan-out-spawning.test.d.ts +0 -1
- package/task-queue/tests/fan-out-spawning.test.js +0 -94
- package/task-queue/tests/idempotent-replacement.test.d.ts +0 -1
- package/task-queue/tests/idempotent-replacement.test.js +0 -114
- package/task-queue/tests/missing-idempotent-tasks.test.d.ts +0 -1
- package/task-queue/tests/missing-idempotent-tasks.test.js +0 -39
- package/task-queue/tests/optimization-edge-cases.test.d.ts +0 -1
- package/task-queue/tests/optimization-edge-cases.test.js +0 -124
- package/task-queue/tests/queue-generic.test.d.ts +0 -1
- package/task-queue/tests/queue-generic.test.js +0 -8
- package/task-queue/tests/queue.test.d.ts +0 -1
- package/task-queue/tests/queue.test.js +0 -756
- package/task-queue/tests/shutdown.test.d.ts +0 -1
- package/task-queue/tests/shutdown.test.js +0 -41
- package/task-queue/tests/task-context.test.d.ts +0 -1
- package/task-queue/tests/task-context.test.js +0 -7
- package/task-queue/tests/task-union.test.d.ts +0 -1
- package/task-queue/tests/task-union.test.js +0 -18
- package/task-queue/tests/transactions.test.d.ts +0 -1
- package/task-queue/tests/transactions.test.js +0 -47
- package/task-queue/tests/typing.test.d.ts +0 -1
- package/task-queue/tests/typing.test.js +0 -9
- package/task-queue/tests/worker.test.d.ts +0 -1
- package/task-queue/tests/worker.test.js +0 -258
- package/task-queue/tests/zombie-parent.test.d.ts +0 -1
- package/task-queue/tests/zombie-parent.test.js +0 -45
- package/task-queue/tests/zombie-recovery.test.d.ts +0 -1
- package/task-queue/tests/zombie-recovery.test.js +0 -51
- package/utils/tests/backoff.test.d.ts +0 -1
- package/utils/tests/backoff.test.js +0 -41
- package/utils/tests/retry-with-backoff.test.d.ts +0 -1
- package/utils/tests/retry-with-backoff.test.js +0 -49
|
@@ -1,402 +0,0 @@
|
|
|
1
|
-
/** biome-ignore-all lint/nursery/noExcessiveClassesPerFile: <explanation> */
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
import { sql } from 'drizzle-orm';
|
|
12
|
-
import { beforeAll, beforeEach, describe, expect, test } from 'vitest';
|
|
13
|
-
import { NotFoundError } from '../../errors/not-found.error.js';
|
|
14
|
-
import { StringProperty } from '../../schema/index.js';
|
|
15
|
-
import { dropTables, setupIntegrationTest, truncateTables } from '../../testing/index.js';
|
|
16
|
-
import { toArrayAsync } from '../../utils/async-iterable-helpers/to-array.js';
|
|
17
|
-
import { ChildEntity, Column, Inheritance, Table } from '../decorators.js';
|
|
18
|
-
import { BaseEntity, Entity } from '../entity.js';
|
|
19
|
-
import { getRepository } from '../server/repository.js';
|
|
20
|
-
describe('ORM Repository Extra Coverage', () => {
|
|
21
|
-
let injector;
|
|
22
|
-
let database;
|
|
23
|
-
let baseItemRepo;
|
|
24
|
-
let premiumItemRepo;
|
|
25
|
-
let simpleItemRepo;
|
|
26
|
-
let plainItemRepo;
|
|
27
|
-
const schema = 'test_orm_extra_coverage';
|
|
28
|
-
let BaseItem = class BaseItem extends Entity {
|
|
29
|
-
type;
|
|
30
|
-
name;
|
|
31
|
-
};
|
|
32
|
-
__decorate([
|
|
33
|
-
StringProperty(),
|
|
34
|
-
Column({ name: 'type' }),
|
|
35
|
-
__metadata("design:type", String)
|
|
36
|
-
], BaseItem.prototype, "type", void 0);
|
|
37
|
-
__decorate([
|
|
38
|
-
StringProperty(),
|
|
39
|
-
Column({ name: 'name' }),
|
|
40
|
-
__metadata("design:type", String)
|
|
41
|
-
], BaseItem.prototype, "name", void 0);
|
|
42
|
-
BaseItem = __decorate([
|
|
43
|
-
Table('items', { schema }),
|
|
44
|
-
Inheritance({ strategy: 'joined', discriminatorColumn: 'type' })
|
|
45
|
-
], BaseItem);
|
|
46
|
-
let PremiumItem = class PremiumItem extends BaseItem {
|
|
47
|
-
code;
|
|
48
|
-
};
|
|
49
|
-
__decorate([
|
|
50
|
-
StringProperty(),
|
|
51
|
-
Column({ name: 'code' }),
|
|
52
|
-
__metadata("design:type", String)
|
|
53
|
-
], PremiumItem.prototype, "code", void 0);
|
|
54
|
-
PremiumItem = __decorate([
|
|
55
|
-
Table('premium_items', { schema }),
|
|
56
|
-
ChildEntity('premium')
|
|
57
|
-
], PremiumItem);
|
|
58
|
-
let SimpleItem = class SimpleItem extends Entity {
|
|
59
|
-
label;
|
|
60
|
-
};
|
|
61
|
-
__decorate([
|
|
62
|
-
StringProperty(),
|
|
63
|
-
Column({ name: 'label' }),
|
|
64
|
-
__metadata("design:type", String)
|
|
65
|
-
], SimpleItem.prototype, "label", void 0);
|
|
66
|
-
SimpleItem = __decorate([
|
|
67
|
-
Table('simple_items', { schema })
|
|
68
|
-
], SimpleItem);
|
|
69
|
-
let PlainItem = class PlainItem extends BaseEntity {
|
|
70
|
-
description;
|
|
71
|
-
};
|
|
72
|
-
__decorate([
|
|
73
|
-
StringProperty(),
|
|
74
|
-
Column({ name: 'description' }),
|
|
75
|
-
__metadata("design:type", String)
|
|
76
|
-
], PlainItem.prototype, "description", void 0);
|
|
77
|
-
PlainItem = __decorate([
|
|
78
|
-
Table('plain_items', { schema })
|
|
79
|
-
], PlainItem);
|
|
80
|
-
beforeAll(async () => {
|
|
81
|
-
({ injector, database } = await setupIntegrationTest({ orm: { schema } }));
|
|
82
|
-
baseItemRepo = injector.resolve(getRepository(BaseItem));
|
|
83
|
-
premiumItemRepo = injector.resolve(getRepository(PremiumItem));
|
|
84
|
-
simpleItemRepo = injector.resolve(getRepository(SimpleItem));
|
|
85
|
-
plainItemRepo = injector.resolve(getRepository(PlainItem));
|
|
86
|
-
await dropTables(database, schema, ['premium_items', 'items', 'simple_items', 'plain_items']);
|
|
87
|
-
await database.execute(sql `
|
|
88
|
-
CREATE TABLE ${sql.identifier(schema)}.${sql.identifier('items')} (
|
|
89
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
90
|
-
type TEXT NOT NULL,
|
|
91
|
-
name TEXT NOT NULL,
|
|
92
|
-
revision INTEGER NOT NULL,
|
|
93
|
-
revision_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
94
|
-
create_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
95
|
-
delete_timestamp TIMESTAMP WITH TIME ZONE,
|
|
96
|
-
attributes JSONB NOT NULL DEFAULT '{}',
|
|
97
|
-
UNIQUE (id, type)
|
|
98
|
-
)
|
|
99
|
-
`);
|
|
100
|
-
await database.execute(sql `
|
|
101
|
-
CREATE TABLE ${sql.identifier(schema)}.${sql.identifier('premium_items')} (
|
|
102
|
-
id UUID PRIMARY KEY,
|
|
103
|
-
type TEXT NOT NULL CHECK (type = 'premium'),
|
|
104
|
-
code TEXT NOT NULL,
|
|
105
|
-
FOREIGN KEY (id, type) REFERENCES ${sql.identifier(schema)}.${sql.identifier('items')} (id, type) ON DELETE CASCADE
|
|
106
|
-
)
|
|
107
|
-
`);
|
|
108
|
-
await database.execute(sql `
|
|
109
|
-
CREATE TABLE ${sql.identifier(schema)}.${sql.identifier('simple_items')} (
|
|
110
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
111
|
-
label TEXT NOT NULL UNIQUE,
|
|
112
|
-
revision INTEGER NOT NULL,
|
|
113
|
-
revision_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
114
|
-
create_timestamp TIMESTAMP WITH TIME ZONE NOT NULL,
|
|
115
|
-
delete_timestamp TIMESTAMP WITH TIME ZONE,
|
|
116
|
-
attributes JSONB NOT NULL DEFAULT '{}'
|
|
117
|
-
)
|
|
118
|
-
`);
|
|
119
|
-
await database.execute(sql `
|
|
120
|
-
CREATE TABLE ${sql.identifier(schema)}.${sql.identifier('plain_items')} (
|
|
121
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
122
|
-
description TEXT NOT NULL
|
|
123
|
-
)
|
|
124
|
-
`);
|
|
125
|
-
});
|
|
126
|
-
beforeEach(async () => {
|
|
127
|
-
await truncateTables(database, schema, ['premium_items', 'items', 'simple_items', 'plain_items']);
|
|
128
|
-
});
|
|
129
|
-
test('loadManyCursor should work', async () => {
|
|
130
|
-
const item = await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Cursor Test' }));
|
|
131
|
-
const cursor = simpleItemRepo.loadManyCursor([item.id]);
|
|
132
|
-
const results = await toArrayAsync(cursor);
|
|
133
|
-
expect(results).toHaveLength(1);
|
|
134
|
-
expect(results[0].id).toBe(item.id);
|
|
135
|
-
});
|
|
136
|
-
test('loadAllCursor should work', async () => {
|
|
137
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'All Cursor Test' }));
|
|
138
|
-
const cursor = simpleItemRepo.loadAllCursor();
|
|
139
|
-
const results = await toArrayAsync(cursor);
|
|
140
|
-
expect(results.length).toBeGreaterThan(0);
|
|
141
|
-
});
|
|
142
|
-
test('tryLoadByQuery with order option', async () => {
|
|
143
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'A' }));
|
|
144
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'B' }));
|
|
145
|
-
const item = await simpleItemRepo.tryLoadByQuery({}, { order: { label: 'desc' } });
|
|
146
|
-
expect(item.label).toBe('B');
|
|
147
|
-
});
|
|
148
|
-
test('insertManyIfNotExists with empty array', async () => {
|
|
149
|
-
const results = await simpleItemRepo.insertManyIfNotExists(['label'], []);
|
|
150
|
-
expect(results).toHaveLength(0);
|
|
151
|
-
});
|
|
152
|
-
test('insertManyIfNotExists with items', async () => {
|
|
153
|
-
const item = Object.assign(new SimpleItem(), { label: 'Unique' });
|
|
154
|
-
const results = await simpleItemRepo.insertManyIfNotExists(['label'], [item]);
|
|
155
|
-
expect(results).toHaveLength(1);
|
|
156
|
-
const results2 = await simpleItemRepo.insertManyIfNotExists(['label'], [item]);
|
|
157
|
-
expect(results2).toHaveLength(0);
|
|
158
|
-
});
|
|
159
|
-
test('tryInsert returning entity', async () => {
|
|
160
|
-
const item = Object.assign(new SimpleItem(), { label: 'TryInsert' });
|
|
161
|
-
const inserted = await simpleItemRepo.tryInsert(item);
|
|
162
|
-
expect(inserted).toBeDefined();
|
|
163
|
-
expect(inserted.label).toBe('TryInsert');
|
|
164
|
-
const conflict = await simpleItemRepo.tryInsert(inserted); // Should conflict on ID
|
|
165
|
-
expect(conflict).toBeUndefined();
|
|
166
|
-
});
|
|
167
|
-
test('loadMany with empty array', async () => {
|
|
168
|
-
const results = await simpleItemRepo.loadMany([]);
|
|
169
|
-
expect(results).toHaveLength(0);
|
|
170
|
-
});
|
|
171
|
-
test('insertMany for non-CTI with empty array', async () => {
|
|
172
|
-
const results = await simpleItemRepo.insertMany([]);
|
|
173
|
-
expect(results).toHaveLength(0);
|
|
174
|
-
});
|
|
175
|
-
test('countByQuery returning count', async () => {
|
|
176
|
-
const initialCount = await simpleItemRepo.count();
|
|
177
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Count Test' }));
|
|
178
|
-
const newCount = await simpleItemRepo.count();
|
|
179
|
-
expect(newCount).toBe(initialCount + 1);
|
|
180
|
-
});
|
|
181
|
-
test('mapManyToColumns and mapManyToInsertColumns', async () => {
|
|
182
|
-
const item = Object.assign(new SimpleItem(), { label: 'Map Test' });
|
|
183
|
-
const cols = await simpleItemRepo.mapManyToColumns([item]);
|
|
184
|
-
expect(cols).toHaveLength(1);
|
|
185
|
-
expect(cols[0].label).toBe('Map Test');
|
|
186
|
-
const insertCols = await simpleItemRepo.mapManyToInsertColumns([item]);
|
|
187
|
-
expect(insertCols).toHaveLength(1);
|
|
188
|
-
expect(insertCols[0].label).toBe('Map Test');
|
|
189
|
-
});
|
|
190
|
-
test('tryUpsert on non-CTI returning undefined when condition fails', async () => {
|
|
191
|
-
const item = await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Upsert Condition' }));
|
|
192
|
-
const conflictItem = Object.assign(new SimpleItem(), { id: item.id, label: 'Should Fail' });
|
|
193
|
-
const result = await simpleItemRepo.tryUpsert(['id'], conflictItem, undefined, { set: { label: 'Impossible' } });
|
|
194
|
-
expect(result).toBeUndefined();
|
|
195
|
-
});
|
|
196
|
-
test('tryUpdateByQuery on non-CTI', async () => {
|
|
197
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'UpdateByQuery' }));
|
|
198
|
-
const result = await simpleItemRepo.tryUpdateByQuery({ label: 'UpdateByQuery' }, { label: 'UpdatedByQuery' });
|
|
199
|
-
expect(result).toBeDefined();
|
|
200
|
-
expect(result.label).toBe('UpdatedByQuery');
|
|
201
|
-
const result2 = await simpleItemRepo.tryUpdateByQuery({ label: 'Ghost' }, { label: 'Buster' });
|
|
202
|
-
expect(result2).toBeUndefined();
|
|
203
|
-
});
|
|
204
|
-
test('tryDeleteByQuery on CTI', async () => {
|
|
205
|
-
const item = await premiumItemRepo.insert(Object.assign(new PremiumItem(), { name: 'DeleteMe', code: 'D1' }));
|
|
206
|
-
const result = await premiumItemRepo.tryDeleteByQuery({ name: 'DeleteMe' });
|
|
207
|
-
expect(result).toBeDefined();
|
|
208
|
-
expect(result.metadata.deleteTimestamp).not.toBeNull();
|
|
209
|
-
const result2 = await premiumItemRepo.tryDeleteByQuery({ name: 'Ghost' });
|
|
210
|
-
expect(result2).toBeUndefined();
|
|
211
|
-
});
|
|
212
|
-
test('getIdLimitQuery for update', async () => {
|
|
213
|
-
const query = simpleItemRepo.getIdLimitQuery({ label: 'Any' }).for('update');
|
|
214
|
-
expect(query).toBeDefined();
|
|
215
|
-
});
|
|
216
|
-
test('applySelect with distinct and distinctOn', async () => {
|
|
217
|
-
const q1 = simpleItemRepo.applySelect(database, true);
|
|
218
|
-
expect(q1).toBeDefined();
|
|
219
|
-
const q2 = simpleItemRepo.applySelect(database, ['label']);
|
|
220
|
-
expect(q2).toBeDefined();
|
|
221
|
-
});
|
|
222
|
-
test('mapToColumns and mapToInsertColumns', async () => {
|
|
223
|
-
const item = Object.assign(new SimpleItem(), { label: 'Map Single' });
|
|
224
|
-
const col = await simpleItemRepo.mapToColumns(item);
|
|
225
|
-
expect(col.label).toBe('Map Single');
|
|
226
|
-
const insertCol = await simpleItemRepo.mapToInsertColumns(item);
|
|
227
|
-
expect(insertCol.label).toBe('Map Single');
|
|
228
|
-
});
|
|
229
|
-
test('hasAll with duplicates and missing IDs', async () => {
|
|
230
|
-
const item = await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'HasAll' }));
|
|
231
|
-
expect(await simpleItemRepo.hasAll([item.id, item.id])).toBe(true);
|
|
232
|
-
expect(await simpleItemRepo.hasAll([item.id, '00000000-0000-0000-0000-000000000000'])).toBe(false);
|
|
233
|
-
expect(await simpleItemRepo.hasAll([])).toBe(false);
|
|
234
|
-
});
|
|
235
|
-
test('loadManyByQueryCursor should work', async () => {
|
|
236
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Many Cursor' }));
|
|
237
|
-
const cursor = simpleItemRepo.loadManyByQueryCursor({ label: 'Many Cursor' });
|
|
238
|
-
const results = await toArrayAsync(cursor);
|
|
239
|
-
expect(results).toHaveLength(1);
|
|
240
|
-
});
|
|
241
|
-
test('upsert (non-CTI) with wheres', async () => {
|
|
242
|
-
const item = await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Upsert' }));
|
|
243
|
-
// This should succeed
|
|
244
|
-
const upserted = await simpleItemRepo.upsert(['label'], Object.assign(new SimpleItem(), { label: 'Upsert' }), { label: 'Upsert Updated' }, { set: { label: 'Upsert' } });
|
|
245
|
-
expect(upserted.label).toBe('Upsert Updated');
|
|
246
|
-
// This should fail to return a row due to condition
|
|
247
|
-
await expect(simpleItemRepo.upsert(['label'], Object.assign(new SimpleItem(), { label: 'Upsert Updated' }), { label: 'Should Not Happen' }, { set: { label: 'Wrong' } }))
|
|
248
|
-
.rejects.toThrow('upsert failed to return a row');
|
|
249
|
-
});
|
|
250
|
-
test('updateMany (non-CTI) with empty array', async () => {
|
|
251
|
-
expect(await simpleItemRepo.updateMany([], { label: 'None' })).toEqual([]);
|
|
252
|
-
});
|
|
253
|
-
test('hardDeleteByQuery throws NotFoundError', async () => {
|
|
254
|
-
await expect(simpleItemRepo.hardDeleteByQuery({ label: 'Ghost' })).rejects.toThrow('SimpleItem not found');
|
|
255
|
-
});
|
|
256
|
-
test('hardDeleteMany with empty array', async () => {
|
|
257
|
-
expect(await simpleItemRepo.hardDeleteMany([])).toEqual([]);
|
|
258
|
-
});
|
|
259
|
-
test('convertOrderBy with various inputs', async () => {
|
|
260
|
-
expect(simpleItemRepo.convertOrderBy('label')).toBeDefined();
|
|
261
|
-
expect(simpleItemRepo.convertOrderBy(['label', ['id', 'desc']])).toHaveLength(2);
|
|
262
|
-
expect(simpleItemRepo.convertOrderBy(sql `label`)).toHaveLength(1);
|
|
263
|
-
});
|
|
264
|
-
test('mapManyToEntity and mapToEntity with subclasses', async () => {
|
|
265
|
-
const item = await premiumItemRepo.insert(Object.assign(new PremiumItem(), { name: 'P1', code: 'C1' }));
|
|
266
|
-
const polymorphic = await baseItemRepo.load(item.id, { includeSubclasses: true });
|
|
267
|
-
expect(polymorphic).toBeInstanceOf(PremiumItem);
|
|
268
|
-
// We need to manually construct the polymorphic row structure if we want to test mapManyToEntity directly with subclasses
|
|
269
|
-
// But loadAll({ includeSubclasses: true }) already does this.
|
|
270
|
-
});
|
|
271
|
-
test('tryUpdateCTI with no changes', async () => {
|
|
272
|
-
const item = await premiumItemRepo.insert(Object.assign(new PremiumItem(), { name: 'NoChange', code: 'NC' }));
|
|
273
|
-
const updated = await premiumItemRepo.tryUpdate(item.id, {});
|
|
274
|
-
expect(updated.id).toBe(item.id);
|
|
275
|
-
});
|
|
276
|
-
test('tsvector search with various options', async () => {
|
|
277
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Search Item' }));
|
|
278
|
-
// score: false
|
|
279
|
-
const r1 = await simpleItemRepo.search({
|
|
280
|
-
query: { $tsvector: { fields: ['label'], query: 'Search' } },
|
|
281
|
-
score: false,
|
|
282
|
-
});
|
|
283
|
-
expect(r1[0].score).toBeUndefined();
|
|
284
|
-
// highlight variants
|
|
285
|
-
const r2 = await simpleItemRepo.search({
|
|
286
|
-
query: { $tsvector: { fields: ['label'], query: 'Search' } },
|
|
287
|
-
highlight: 'label',
|
|
288
|
-
});
|
|
289
|
-
expect(r2[0].highlight).toBeDefined();
|
|
290
|
-
const r3 = await simpleItemRepo.search({
|
|
291
|
-
query: { $tsvector: { fields: ['label'], query: 'Search' } },
|
|
292
|
-
highlight: { source: sql `label`, minWords: 5, maxWords: 10 },
|
|
293
|
-
});
|
|
294
|
-
expect(r3[0].highlight).toBeDefined();
|
|
295
|
-
// offset and limit
|
|
296
|
-
const r4 = await simpleItemRepo.search({
|
|
297
|
-
query: { $tsvector: { fields: ['label'], query: 'Search' } },
|
|
298
|
-
offset: 0,
|
|
299
|
-
limit: 1,
|
|
300
|
-
});
|
|
301
|
-
expect(r4).toHaveLength(1);
|
|
302
|
-
});
|
|
303
|
-
test('trigram search with rank: false', async () => {
|
|
304
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Trigram' }));
|
|
305
|
-
const results = await simpleItemRepo.search({
|
|
306
|
-
query: { $trigram: { fields: ['label'], query: 'Trigram' } },
|
|
307
|
-
rank: false,
|
|
308
|
-
});
|
|
309
|
-
expect(results).toHaveLength(1);
|
|
310
|
-
});
|
|
311
|
-
test('PlainItem (no metadata) operations', async () => {
|
|
312
|
-
const item = await plainItemRepo.insert(Object.assign(new PlainItem(), { description: 'Plain' }));
|
|
313
|
-
expect(plainItemRepo.hasMetadata).toBe(false);
|
|
314
|
-
const deleted = await plainItemRepo.delete(item.id);
|
|
315
|
-
expect(deleted.description).toBe('Plain');
|
|
316
|
-
const exists = await plainItemRepo.has(item.id);
|
|
317
|
-
expect(exists).toBe(false);
|
|
318
|
-
});
|
|
319
|
-
test('convertOrderBy with object', async () => {
|
|
320
|
-
const order = simpleItemRepo.convertOrderBy({ label: 'desc' });
|
|
321
|
-
expect(order).toHaveLength(1);
|
|
322
|
-
});
|
|
323
|
-
test('tryHardDelete returning undefined', async () => {
|
|
324
|
-
const result = await simpleItemRepo.tryHardDelete('00000000-0000-0000-0000-000000000000');
|
|
325
|
-
expect(result).toBeUndefined();
|
|
326
|
-
});
|
|
327
|
-
test('tryHardDeleteByQuery returning undefined', async () => {
|
|
328
|
-
const result = await simpleItemRepo.tryHardDeleteByQuery({ label: 'Ghost' });
|
|
329
|
-
expect(result).toBeUndefined();
|
|
330
|
-
});
|
|
331
|
-
test('hardDeleteMany with empty array branch', async () => {
|
|
332
|
-
const results = await simpleItemRepo.hardDeleteMany([]);
|
|
333
|
-
expect(results).toEqual([]);
|
|
334
|
-
});
|
|
335
|
-
test('hardDeleteManyByQuery works', async () => {
|
|
336
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'To Hard Delete' }));
|
|
337
|
-
const results = await simpleItemRepo.hardDeleteManyByQuery({ label: 'To Hard Delete' });
|
|
338
|
-
expect(results).toHaveLength(1);
|
|
339
|
-
});
|
|
340
|
-
test('applySelect with false (default)', async () => {
|
|
341
|
-
const q = simpleItemRepo.applySelect(database, undefined, false);
|
|
342
|
-
expect(q).toBeDefined();
|
|
343
|
-
});
|
|
344
|
-
test('load should throw NotFoundError', async () => {
|
|
345
|
-
await expect(simpleItemRepo.load('00000000-0000-0000-0000-000000000000')).rejects.toThrow(NotFoundError);
|
|
346
|
-
});
|
|
347
|
-
test('tsvector search with rank number', async () => {
|
|
348
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Rank' }));
|
|
349
|
-
const results = await simpleItemRepo.search({
|
|
350
|
-
query: { $tsvector: { fields: ['label'], query: 'Rank' } },
|
|
351
|
-
rank: { normalization: 1 }, // normalization
|
|
352
|
-
});
|
|
353
|
-
expect(results).toHaveLength(1);
|
|
354
|
-
});
|
|
355
|
-
test('encryptionSecret usage in getTransformContext', async () => {
|
|
356
|
-
const context = await simpleItemRepo.getTransformContext();
|
|
357
|
-
expect(context.encryptionKey).toBeDefined();
|
|
358
|
-
// Call it again to hit the cached branch
|
|
359
|
-
const context2 = await simpleItemRepo.getTransformContext();
|
|
360
|
-
expect(context2).toBe(context);
|
|
361
|
-
});
|
|
362
|
-
test('tsvector search with rank true/false', async () => {
|
|
363
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Rank' }));
|
|
364
|
-
await simpleItemRepo.search({
|
|
365
|
-
query: { $tsvector: { fields: ['label'], query: 'Rank' } },
|
|
366
|
-
rank: true,
|
|
367
|
-
});
|
|
368
|
-
await simpleItemRepo.search({
|
|
369
|
-
query: { $tsvector: { fields: ['label'], query: 'Rank' } },
|
|
370
|
-
rank: false,
|
|
371
|
-
});
|
|
372
|
-
});
|
|
373
|
-
test('trigram search with threshold', async () => {
|
|
374
|
-
await simpleItemRepo.insert(Object.assign(new SimpleItem(), { label: 'Trigram Threshold' }));
|
|
375
|
-
await database.execute(sql `SET pg_trgm.similarity_threshold = 0.1`);
|
|
376
|
-
const results = await simpleItemRepo.search({
|
|
377
|
-
query: { $trigram: { fields: ['label'], query: 'Trigram', threshold: 0.1 } },
|
|
378
|
-
});
|
|
379
|
-
expect(results).toHaveLength(1);
|
|
380
|
-
});
|
|
381
|
-
test('repository resolution inside transaction', async () => {
|
|
382
|
-
await simpleItemRepo.transaction(async (transaction) => {
|
|
383
|
-
const repository = injector.resolve(getRepository(SimpleItem)).withTransaction(transaction);
|
|
384
|
-
expect(repository).toBeDefined();
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
test('updateManyCTI with no matches', async () => {
|
|
388
|
-
const results = await premiumItemRepo.updateMany(['00000000-0000-0000-0000-000000000000'], { name: 'Ghost' });
|
|
389
|
-
expect(results).toEqual([]);
|
|
390
|
-
});
|
|
391
|
-
test('upsertMany on CTI with wheres and update object', async () => {
|
|
392
|
-
const item = await premiumItemRepo.insert(Object.assign(new PremiumItem(), { name: 'UpsertManyCTI', code: 'U1' }));
|
|
393
|
-
const conflictItem = Object.assign(new PremiumItem(), { id: item.id, name: 'UpsertManyCTI', code: 'U1' });
|
|
394
|
-
const results = await premiumItemRepo.upsertMany(['id'], [conflictItem], { name: 'UpsertManyCTI Updated', code: 'U2' }, { target: { name: 'UpsertManyCTI' } });
|
|
395
|
-
expect(results).toHaveLength(1);
|
|
396
|
-
expect(results[0].name).toBe('UpsertManyCTI Updated');
|
|
397
|
-
expect(results[0].code).toBe('U2');
|
|
398
|
-
});
|
|
399
|
-
test('processExpirations with no expiration columns', async () => {
|
|
400
|
-
await simpleItemRepo.processExpirations(); // Should just return
|
|
401
|
-
});
|
|
402
|
-
});
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
/** biome-ignore-all lint/nursery/noExcessiveClassesPerFile: <explanation> */
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
import { describe, expect, test } from 'vitest';
|
|
12
|
-
import { StringProperty } from '../../schema/index.js';
|
|
13
|
-
import { setupIntegrationTest } from '../../testing/index.js';
|
|
14
|
-
import { ChildEntity, Column, Inheritance, Table } from '../decorators.js';
|
|
15
|
-
import { Entity } from '../entity.js';
|
|
16
|
-
import { getRepository } from '../server/repository.js';
|
|
17
|
-
describe('ORM Repository Mapping (CTI)', () => {
|
|
18
|
-
test('should flatten joined result when mapping child entity', async () => {
|
|
19
|
-
let BaseUser = class BaseUser extends Entity {
|
|
20
|
-
type;
|
|
21
|
-
name;
|
|
22
|
-
};
|
|
23
|
-
__decorate([
|
|
24
|
-
StringProperty(),
|
|
25
|
-
Column({ name: 'type' }),
|
|
26
|
-
__metadata("design:type", String)
|
|
27
|
-
], BaseUser.prototype, "type", void 0);
|
|
28
|
-
__decorate([
|
|
29
|
-
StringProperty(),
|
|
30
|
-
Column({ name: 'name' }),
|
|
31
|
-
__metadata("design:type", String)
|
|
32
|
-
], BaseUser.prototype, "name", void 0);
|
|
33
|
-
BaseUser = __decorate([
|
|
34
|
-
Table('users', { schema: 'test' }),
|
|
35
|
-
Inheritance({ strategy: 'joined', discriminatorColumn: 'type' })
|
|
36
|
-
], BaseUser);
|
|
37
|
-
let Admin = class Admin extends BaseUser {
|
|
38
|
-
role;
|
|
39
|
-
};
|
|
40
|
-
__decorate([
|
|
41
|
-
StringProperty(),
|
|
42
|
-
Column({ name: 'role' }),
|
|
43
|
-
__metadata("design:type", String)
|
|
44
|
-
], Admin.prototype, "role", void 0);
|
|
45
|
-
Admin = __decorate([
|
|
46
|
-
Table('admins', { schema: 'test' }),
|
|
47
|
-
ChildEntity('admin')
|
|
48
|
-
], Admin);
|
|
49
|
-
const { injector } = await setupIntegrationTest({ orm: { schema: 'test' } });
|
|
50
|
-
const repository = injector.resolve(getRepository(Admin));
|
|
51
|
-
// Simulate Drizzle joined result structure
|
|
52
|
-
const mockResult = {
|
|
53
|
-
users: { id: '123', type: 'admin', name: 'John Doe', revision: 1 },
|
|
54
|
-
admins: { id: '123', type: 'admin', role: 'super-admin' },
|
|
55
|
-
};
|
|
56
|
-
// Access private method for testing (using any cast)
|
|
57
|
-
const mappedEntity = await repository._mapToEntity(mockResult, {});
|
|
58
|
-
expect(mappedEntity).toBeInstanceOf(Admin);
|
|
59
|
-
expect(mappedEntity.id).toBe('123');
|
|
60
|
-
expect(mappedEntity.type).toBe('admin');
|
|
61
|
-
expect(mappedEntity.name).toBe('John Doe');
|
|
62
|
-
expect(mappedEntity.role).toBe('super-admin');
|
|
63
|
-
expect(mappedEntity.metadata.revision).toBe(1);
|
|
64
|
-
});
|
|
65
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|