@warlock.js/core 5.20.0 → 5.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1124 -1086
- package/esm/benchmark/benchmark.mjs +34 -25
- package/esm/benchmark/benchmark.mjs.map +1 -1
- package/esm/benchmark/profiler.d.mts.map +1 -1
- package/esm/benchmark/profiler.mjs +8 -3
- package/esm/benchmark/profiler.mjs.map +1 -1
- package/esm/bootstrap.d.mts.map +1 -1
- package/esm/bootstrap.mjs +3 -0
- package/esm/bootstrap.mjs.map +1 -1
- package/esm/cache/database-cache-driver.d.mts +2 -2
- package/esm/cache/database-cache-driver.d.mts.map +1 -1
- package/esm/cache/database-cache-driver.mjs +3 -2
- package/esm/cache/database-cache-driver.mjs.map +1 -1
- package/esm/cli/cli-commands.manager.mjs +16 -14
- package/esm/cli/cli-commands.manager.mjs.map +1 -1
- package/esm/cli/commands/add.command.mjs +1 -1
- package/esm/cli/commands/add.command.mjs.map +1 -1
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +3 -2
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
- package/esm/cli/commands/generate/generate.command.mjs +20 -0
- package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +4 -2
- package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/migration.generator.mjs +22 -6
- package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/model.generator.mjs +22 -7
- package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/module.generator.mjs +8 -6
- package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
- package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.mjs +7 -7
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/cli/commands/generate/utils/writer.mjs +25 -1
- package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
- package/esm/cli/commands/routes/routes-command.action.mjs +5 -1
- package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
- package/esm/cli/commands/routes/with-console-on-stderr.mjs +24 -0
- package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -0
- package/esm/cli/commands/routes.command.mjs +3 -4
- package/esm/cli/commands/routes.command.mjs.map +1 -1
- package/esm/cli/commands/start-production.command.mjs +5 -5
- package/esm/cli/commands/start-production.command.mjs.map +1 -1
- package/esm/cli/commands/storage-put.action.mjs +2 -1
- package/esm/cli/commands/storage-put.action.mjs.map +1 -1
- package/esm/cli/commands/update.command.mjs +1 -0
- package/esm/cli/commands/update.command.mjs.map +1 -1
- package/esm/cli/parse-cli-args.mjs +13 -1
- package/esm/cli/parse-cli-args.mjs.map +1 -1
- package/esm/commands/cli-command.d.mts.map +1 -1
- package/esm/commands/cli-command.mjs +4 -2
- package/esm/commands/cli-command.mjs.map +1 -1
- package/esm/commands/index.mjs +3 -0
- package/esm/config/config-key-from-path.mjs +20 -0
- package/esm/config/config-key-from-path.mjs.map +1 -0
- package/esm/config/config-loader.d.mts.map +1 -1
- package/esm/config/config-loader.mjs +2 -3
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/connectors/connectors-manager.d.mts +4 -0
- package/esm/connectors/connectors-manager.d.mts.map +1 -1
- package/esm/connectors/connectors-manager.mjs +30 -2
- package/esm/connectors/connectors-manager.mjs.map +1 -1
- package/esm/connectors/socket-connector.d.mts +29 -0
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs +73 -9
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/connectors/types.d.mts +1 -1
- package/esm/connectors/types.mjs.map +1 -1
- package/esm/database/models/database-log/database-log.d.mts +47 -24
- package/esm/database/models/database-log/database-log.d.mts.map +1 -1
- package/esm/database/models/database-log/database-log.mjs +36 -4
- package/esm/database/models/database-log/database-log.mjs.map +1 -1
- package/esm/database/seed-command-action.mjs +10 -2
- package/esm/database/seed-command-action.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +11 -4
- package/esm/dev-server/development-server.mjs.map +1 -1
- package/esm/dev-server/file-event-handler.mjs +26 -6
- package/esm/dev-server/file-event-handler.mjs.map +1 -1
- package/esm/dev-server/file-manager.d.mts.map +1 -1
- package/esm/dev-server/file-manager.mjs +2 -2
- package/esm/dev-server/file-manager.mjs.map +1 -1
- package/esm/dev-server/files-orchestrator.mjs +3 -1
- package/esm/dev-server/files-orchestrator.mjs.map +1 -1
- package/esm/dev-server/files-watcher.mjs +64 -5
- package/esm/dev-server/files-watcher.mjs.map +1 -1
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs +31 -9
- package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +11 -7
- package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
- package/esm/dev-server/loader/load-hook.mjs +1 -1
- package/esm/dev-server/loader/register-loader.mjs +1 -1
- package/esm/dev-server/manifest-manager.d.mts.map +1 -1
- package/esm/dev-server/manifest-manager.mjs +12 -6
- package/esm/dev-server/manifest-manager.mjs.map +1 -1
- package/esm/dev-server/parse-imports.mjs +9 -0
- package/esm/dev-server/parse-imports.mjs.map +1 -1
- package/esm/dev-server/register-dev-shortcuts.mjs +2 -1
- package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
- package/esm/dev-server/shortcuts.mjs +2 -2
- package/esm/dev-server/shortcuts.mjs.map +1 -1
- package/esm/dev-server/special-file-patterns.mjs +18 -0
- package/esm/dev-server/special-file-patterns.mjs.map +1 -0
- package/esm/dev-server/special-files-collector.d.mts.map +1 -1
- package/esm/dev-server/special-files-collector.mjs +2 -5
- package/esm/dev-server/special-files-collector.mjs.map +1 -1
- package/esm/dev-server/start-development-server.mjs +1 -2
- package/esm/dev-server/start-development-server.mjs.map +1 -1
- package/esm/dev-server/supervisor.mjs +23 -3
- package/esm/dev-server/supervisor.mjs.map +1 -1
- package/esm/dev-server/tsconfig-manager.mjs +22 -12
- package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
- package/esm/dev-server/type-generator.mjs +10 -9
- package/esm/dev-server/type-generator.mjs.map +1 -1
- package/esm/encryption/encrypt.d.mts.map +1 -1
- package/esm/encryption/encrypt.mjs +16 -5
- package/esm/encryption/encrypt.mjs.map +1 -1
- package/esm/encryption/hash.d.mts.map +1 -1
- package/esm/encryption/hash.mjs +2 -0
- package/esm/encryption/hash.mjs.map +1 -1
- package/esm/encryption/password.d.mts.map +1 -1
- package/esm/encryption/password.mjs +3 -1
- package/esm/encryption/password.mjs.map +1 -1
- package/esm/generations/features/index.mjs +1 -1
- package/esm/generations/features/mysql.feature.mjs +9 -2
- package/esm/generations/features/mysql.feature.mjs.map +1 -1
- package/esm/generations/features/test.feature.mjs +2 -1
- package/esm/generations/features/test.feature.mjs.map +1 -1
- package/esm/generations/features/web.feature.mjs +4 -2
- package/esm/generations/features/web.feature.mjs.map +1 -1
- package/esm/http/csrf-origin-policy.d.mts.map +1 -1
- package/esm/http/csrf-origin-policy.mjs +5 -2
- package/esm/http/csrf-origin-policy.mjs.map +1 -1
- package/esm/http/flush-pending-cookies.mjs +52 -0
- package/esm/http/flush-pending-cookies.mjs.map +1 -0
- package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
- package/esm/http/middleware/cache-response-middleware.mjs +4 -2
- package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
- package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
- package/esm/http/middleware/inject-request-context.mjs +14 -3
- package/esm/http/middleware/inject-request-context.mjs.map +1 -1
- package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
- package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
- package/esm/http/middleware/utils/cidr-match.mjs +11 -2
- package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
- package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
- package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
- package/esm/http/plugins.d.mts.map +1 -1
- package/esm/http/plugins.mjs +10 -1
- package/esm/http/plugins.mjs.map +1 -1
- package/esm/http/request.d.mts +12 -1
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +35 -7
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +16 -0
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +75 -37
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/types.d.mts +24 -0
- package/esm/http/types.d.mts.map +1 -1
- package/esm/http/uploads/uploaded-file.controller.mjs +1 -1
- package/esm/http/uploads-config.mjs +2 -1
- package/esm/http/uploads-config.mjs.map +1 -1
- package/esm/http/uploads-types.d.mts +3 -3
- package/esm/image/image.d.mts +1 -1
- package/esm/image/image.d.mts.map +1 -1
- package/esm/image/image.mjs +25 -15
- package/esm/image/image.mjs.map +1 -1
- package/esm/index.d.mts +4 -3
- package/esm/index.mjs +5 -3
- package/esm/logger/logger.mjs +6 -1
- package/esm/logger/logger.mjs.map +1 -1
- package/esm/mail/config.d.mts.map +1 -1
- package/esm/mail/config.mjs +31 -21
- package/esm/mail/config.mjs.map +1 -1
- package/esm/mail/react-mail.mjs +6 -3
- package/esm/mail/react-mail.mjs.map +1 -1
- package/esm/mail/send-mail.d.mts.map +1 -1
- package/esm/mail/send-mail.mjs +40 -19
- package/esm/mail/send-mail.mjs.map +1 -1
- package/esm/production/build-contributions.mjs +3 -0
- package/esm/production/build-contributions.mjs.map +1 -1
- package/esm/production/esbuild-plugins.mjs +3 -2
- package/esm/production/esbuild-plugins.mjs.map +1 -1
- package/esm/production/production-builder.mjs +32 -36
- package/esm/production/production-builder.mjs.map +1 -1
- package/esm/production/production-supervisor.mjs +12 -5
- package/esm/production/production-supervisor.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +3 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-adapter.mjs +17 -5
- package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +3 -3
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs +88 -61
- package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/index.d.mts +1 -1
- package/esm/repositories/adapters/cascade/index.mjs +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts +3 -3
- package/esm/repositories/contracts/types.d.mts +5 -0
- package/esm/repositories/contracts/types.d.mts.map +1 -1
- package/esm/repositories/index.d.mts +1 -1
- package/esm/repositories/index.mjs +1 -1
- package/esm/repositories/repository.manager.d.mts +65 -3
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +146 -57
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/resource/resource-field-builder.d.mts.map +1 -1
- package/esm/resource/resource-field-builder.mjs +1 -0
- package/esm/resource/resource-field-builder.mjs.map +1 -1
- package/esm/resource/resource.d.mts +10 -3
- package/esm/resource/resource.d.mts.map +1 -1
- package/esm/resource/resource.mjs +19 -5
- package/esm/resource/resource.mjs.map +1 -1
- package/esm/restful/restful.d.mts +12 -5
- package/esm/restful/restful.d.mts.map +1 -1
- package/esm/restful/restful.mjs +47 -16
- package/esm/restful/restful.mjs.map +1 -1
- package/esm/router/build-route-rate-limit.mjs +22 -0
- package/esm/router/build-route-rate-limit.mjs.map +1 -0
- package/esm/router/dev-dispatch.mjs +60 -0
- package/esm/router/dev-dispatch.mjs.map +1 -0
- package/esm/router/route-builder.mjs +4 -1
- package/esm/router/route-builder.mjs.map +1 -1
- package/esm/router/route-registry.d.mts.map +1 -1
- package/esm/router/route-registry.mjs +2 -2
- package/esm/router/route-registry.mjs.map +1 -1
- package/esm/router/router.d.mts +1 -1
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +57 -39
- package/esm/router/router.mjs.map +1 -1
- package/esm/socket/types.d.mts +9 -2
- package/esm/socket/types.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts +17 -0
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs +53 -17
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts +7 -5
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs +31 -26
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/index.d.mts +2 -1
- package/esm/storage/index.mjs +2 -1
- package/esm/storage/scoped-storage.d.mts +13 -1
- package/esm/storage/scoped-storage.d.mts.map +1 -1
- package/esm/storage/scoped-storage.mjs +18 -8
- package/esm/storage/scoped-storage.mjs.map +1 -1
- package/esm/storage/storage.d.mts +0 -5
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +7 -16
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts +22 -4
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/classify-ip-address.d.mts +13 -0
- package/esm/storage/utils/classify-ip-address.d.mts.map +1 -0
- package/esm/storage/utils/classify-ip-address.mjs +98 -0
- package/esm/storage/utils/classify-ip-address.mjs.map +1 -0
- package/esm/storage/utils/safe-fetch.d.mts +3 -12
- package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
- package/esm/storage/utils/safe-fetch.mjs +3 -48
- package/esm/storage/utils/safe-fetch.mjs.map +1 -1
- package/esm/updater/update-warlock-packages.mjs +11 -1
- package/esm/updater/update-warlock-packages.mjs.map +1 -1
- package/esm/use-cases/use-case-broadcast.mjs +7 -1
- package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
- package/esm/use-cases/use-cases-registry.mjs +21 -2
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/database-log.mjs +0 -3
- package/esm/utils/database-log.mjs.map +1 -1
- package/esm/utils/queue.d.mts +6 -4
- package/esm/utils/queue.d.mts.map +1 -1
- package/esm/utils/queue.mjs +20 -9
- package/esm/utils/queue.mjs.map +1 -1
- package/esm/validation/database/exists-except-current-id.mjs +6 -2
- package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
- package/esm/validation/database/unique-except-current-id.mjs +6 -2
- package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
- package/esm/validation/init.mjs +6 -2
- package/esm/validation/init.mjs.map +1 -1
- package/esm/validation/validateAll.mjs +3 -2
- package/esm/validation/validateAll.mjs.map +1 -1
- package/esm/warlock-config/types.d.mts +14 -1
- package/esm/warlock-config/types.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
- package/esm/warlock-config/warlock-config.manager.mjs +3 -1
- package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
- package/esm/warlock-config/warn-deprecated-config.mjs +25 -0
- package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -0
- package/package.json +11 -11
- package/esm/_virtual/_rolldown/runtime.mjs +0 -7
|
@@ -286,21 +286,21 @@ interface QueryBuilderContract<T> {
|
|
|
286
286
|
* @example
|
|
287
287
|
* await query.where("status", "paid").avg("total")
|
|
288
288
|
*/
|
|
289
|
-
avg(field: string): Promise<number>;
|
|
289
|
+
avg(field: string): Promise<number | null>;
|
|
290
290
|
/**
|
|
291
291
|
* Minimum value of a field across all matching records.
|
|
292
292
|
*
|
|
293
293
|
* @param field - Field name
|
|
294
294
|
* @returns Promise resolving to the minimum value (0 when no records match)
|
|
295
295
|
*/
|
|
296
|
-
min(field: string): Promise<number>;
|
|
296
|
+
min(field: string): Promise<number | null>;
|
|
297
297
|
/**
|
|
298
298
|
* Maximum value of a field across all matching records.
|
|
299
299
|
*
|
|
300
300
|
* @param field - Field name
|
|
301
301
|
* @returns Promise resolving to the maximum value (0 when no records match)
|
|
302
302
|
*/
|
|
303
|
-
max(field: string): Promise<number>;
|
|
303
|
+
max(field: string): Promise<number | null>;
|
|
304
304
|
/**
|
|
305
305
|
* Group matching records by one or more fields and compute aggregates.
|
|
306
306
|
*
|
|
@@ -155,6 +155,11 @@ type PaginationMode = "pages" | "cursor";
|
|
|
155
155
|
* Repository list options
|
|
156
156
|
*/
|
|
157
157
|
type RepositoryOptions = {
|
|
158
|
+
/**
|
|
159
|
+
* Explicit cache key for `listCached()`. Required to cache a call whose
|
|
160
|
+
* options contain callback filters, which cannot be keyed safely.
|
|
161
|
+
*/
|
|
162
|
+
cacheKey?: string;
|
|
158
163
|
/**
|
|
159
164
|
* Pagination mode - "pages" for traditional pagination, "cursor" for cursor-based
|
|
160
165
|
* @default "pages"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../core/src/repositories/contracts/types.ts"],"mappings":";;;;;;;;AAQA;KAAY,gBAAA;EAAgB;;;EAI1B,IAAA,EAAM,CAAC;EAAD;;;EAKN,UAAA;IAcE;;;IAVA,KAAA;IAoBK;AAQT;;IAvBI,MAAA;IA2BK;;;IAtBL,IAAA;IA2BF;;;IAtBE,KAAA;IAyCA;;;IApCA,KAAA;EAAA;AAAA;;;;;KAQQ,sBAAA;EA6DV;;AAAY;EAzDZ,IAAA,EAAM,CAAC;EAmEgB;;;EA9DvB,UAAA;IA8DyC;;;IA1DvC,KAAA;IA0D0E;AAAA;AAK9E;IA1DI,MAAA;IA0DqB;;AAAA;IArDrB,OAAA;IAuEsB;;;IAlEtB,UAAA;IA8GQ;;;IAzGR,UAAA;EAAA;AAAA;;;;KAOQ,uBAAA;EAkGkB;;;EA9F5B,KAAA;EAgGO;;;EA3FP,MAAA;EA4F4B;AAAA;AAU9B;;EAhGE,SAAA;EAgGyB;;;;EA1FzB,YAAA;AAAA;;;;;;;;KAUU,aAAA,OAAoB,SAAA,EAAW,CAAA,IAAK,UAAA,aAAuB,OAAO;;;AAiFL;KA5E7D,aAAA;;;;KAkBA,cAAA,ubAuCR,aAAa;;;;KAKL,cAAA,QAAsB,oBAAA,CAAqB,CAAA,MACrD,KAAA,OACA,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,MAAA;AAiBkB;AAM7B;;;;;;AAN6B,KAPjB,UAAA,KAAe,oBAAA,SACzB,cAAA,GAAiB,cAAA,CAAe,CAAA,KAAM,cAAA,KAAmB,cAAA;;AA0B7C;AAMd;KA3BY,WAAA;EAAA,CACT,GAAA,WAAc,UAAU,CAAC,CAAA;AAAA;AA0BF;AAK1B;;AAL0B,KApBd,aAAA;
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../../core/src/repositories/contracts/types.ts"],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@ import { RepositoryManager } from "./repository.manager.mjs";
|
|
|
2
2
|
import { RepositoryAdapterContract } from "./contracts/repository-adapter.contract.mjs";
|
|
3
3
|
import { AllRepositoryOptions, CachedRepositoryOptions, ChunkCallback, CursorPaginationOptions, CursorPaginationResult, FilterFunction, FilterOperator, FilterOptions, FilterRule, FilterRules, PaginationMode, PaginationResult, RepositoryConfigurations, RepositoryEvent, RepositoryOptions, RepositoryOptionsWithCursor, RepositoryOptionsWithPages, SaveMode, TypedAllRepositoryOptions, TypedRepositoryOptions, TypedRepositoryOptionsWithCursor, TypedRepositoryOptionsWithPages, WhereOperator } from "./contracts/types.mjs";
|
|
4
4
|
import { AggregateExpressionInput, AggregateExpressions, GroupByFields, QueryBuilderContract } from "./contracts/query-builder.contract.mjs";
|
|
5
|
-
import { CascadeAdapter } from "./adapters/cascade/cascade-adapter.mjs";
|
|
5
|
+
import { CascadeAdapter, UPDATE_MANY_BATCH_SIZE } from "./adapters/cascade/cascade-adapter.mjs";
|
|
6
6
|
import { CascadeQueryBuilder } from "./adapters/cascade/cascade-query-builder.mjs";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CascadeQueryBuilder } from "./adapters/cascade/cascade-query-builder.mjs";
|
|
2
|
-
import { CascadeAdapter } from "./adapters/cascade/cascade-adapter.mjs";
|
|
2
|
+
import { CascadeAdapter, UPDATE_MANY_BATCH_SIZE } from "./adapters/cascade/cascade-adapter.mjs";
|
|
3
3
|
import "./adapters/cascade/index.mjs";
|
|
4
4
|
import { RepositoryManager } from "./repository.manager.mjs";
|
|
5
5
|
|
|
@@ -40,6 +40,25 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
40
40
|
* @protected
|
|
41
41
|
*/
|
|
42
42
|
protected filterBy: FilterRules;
|
|
43
|
+
/**
|
|
44
|
+
* Columns a client may sort by (`orderBy` / `sortBy` / `cursorColumn`) when the
|
|
45
|
+
* options come from a request. `id` and the declared `filterBy` keys are always
|
|
46
|
+
* allowed; anything else is ignored.
|
|
47
|
+
* @protected
|
|
48
|
+
*/
|
|
49
|
+
protected sortable: string[];
|
|
50
|
+
/**
|
|
51
|
+
* Columns a client may request through `select`. Empty by default: a client
|
|
52
|
+
* `select` is ignored unless the repository whitelists the columns here.
|
|
53
|
+
* @protected
|
|
54
|
+
*/
|
|
55
|
+
protected selectable: string[];
|
|
56
|
+
/**
|
|
57
|
+
* Hard cap on `limit` / `perPage` for every list, all and cursor query.
|
|
58
|
+
* @default 100
|
|
59
|
+
* @protected
|
|
60
|
+
*/
|
|
61
|
+
protected maxPerPage: number;
|
|
43
62
|
/**
|
|
44
63
|
* Get adapter instance (lazy-loaded)
|
|
45
64
|
* Resolution order:
|
|
@@ -150,6 +169,14 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
150
169
|
protected getIsActiveFilter(): {
|
|
151
170
|
[x: string]: any;
|
|
152
171
|
};
|
|
172
|
+
/**
|
|
173
|
+
* Attach the active scope to the options. It travels under its own key (after
|
|
174
|
+
* the caller's options, so it can't be overridden) and is applied as a real
|
|
175
|
+
* `where` by `applyOptionsToQuery`, independent of `filterBy`.
|
|
176
|
+
*/
|
|
177
|
+
protected withActive<O extends object>(options?: O): O & {
|
|
178
|
+
activeScope: Record<string, any>;
|
|
179
|
+
};
|
|
153
180
|
/**
|
|
154
181
|
* Find a record by ID
|
|
155
182
|
* @param id - Record ID or model instance
|
|
@@ -358,6 +385,33 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
358
385
|
*/
|
|
359
386
|
protected asTyped(opts: RepositoryOptions): TypedRepositoryOptions<F>;
|
|
360
387
|
protected asTypedAll(opts: AllRepositoryOptions): TypedAllRepositoryOptions<F>;
|
|
388
|
+
/**
|
|
389
|
+
* Option keys that control the query rather than filter it.
|
|
390
|
+
*/
|
|
391
|
+
private static readonly controlKeys;
|
|
392
|
+
/**
|
|
393
|
+
* Columns `orderBy` / `sortBy` / `cursorColumn` may target.
|
|
394
|
+
*/
|
|
395
|
+
protected getSortableColumns(): Set<string>;
|
|
396
|
+
/**
|
|
397
|
+
* Split client-controllable control options from filters: `limit` is capped by
|
|
398
|
+
* `maxPerPage`, sort / cursor columns must be whitelisted (`sortable`, `filterBy`
|
|
399
|
+
* keys or `id`) and `select` must be within `selectable`. Anything else is
|
|
400
|
+
* dropped, so `list({ ...request.all() })` cannot steer the query.
|
|
401
|
+
*/
|
|
402
|
+
protected sanitizeControls(options: RepositoryOptions): RepositoryOptions;
|
|
403
|
+
/**
|
|
404
|
+
* Read the active scope only when it is exactly what `getIsActiveFilter()`
|
|
405
|
+
* produces, so a client can't smuggle an arbitrary `where` through it.
|
|
406
|
+
*/
|
|
407
|
+
protected readActiveScope(options: RepositoryOptions): Record<string, any> | undefined;
|
|
408
|
+
/**
|
|
409
|
+
* Apply plain `{ column: scalar }` lookups that are not declared in `filterBy`
|
|
410
|
+
* as equality wheres. Used by `first` (and so `exists`, `findOrCreate`,
|
|
411
|
+
* `updateOrCreate`) so an undeclared key is never silently dropped and can't
|
|
412
|
+
* match the wrong row.
|
|
413
|
+
*/
|
|
414
|
+
protected applyLookupFilters(query: QueryBuilderContract<T>, options: RepositoryOptions): void;
|
|
361
415
|
/**
|
|
362
416
|
* Apply repository options to query
|
|
363
417
|
* @param query - Query builder instance
|
|
@@ -583,7 +637,7 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
583
637
|
* @returns Promise resolving to the filtered numeric average
|
|
584
638
|
* @public
|
|
585
639
|
*/
|
|
586
|
-
avg(field: string, options?: TypedRepositoryOptions<F>): Promise<number>;
|
|
640
|
+
avg(field: string, options?: TypedRepositoryOptions<F>): Promise<number | null>;
|
|
587
641
|
/**
|
|
588
642
|
* Minimum value of a field across records matching options.
|
|
589
643
|
*
|
|
@@ -595,7 +649,7 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
595
649
|
* @returns Promise resolving to the filtered minimum value
|
|
596
650
|
* @public
|
|
597
651
|
*/
|
|
598
|
-
min(field: string, options?: TypedRepositoryOptions<F>): Promise<number>;
|
|
652
|
+
min(field: string, options?: TypedRepositoryOptions<F>): Promise<number | null>;
|
|
599
653
|
/**
|
|
600
654
|
* Maximum value of a field across records matching options.
|
|
601
655
|
*
|
|
@@ -607,7 +661,7 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
607
661
|
* @returns Promise resolving to the filtered maximum value
|
|
608
662
|
* @public
|
|
609
663
|
*/
|
|
610
|
-
max(field: string, options?: TypedRepositoryOptions<F>): Promise<number>;
|
|
664
|
+
max(field: string, options?: TypedRepositoryOptions<F>): Promise<number | null>;
|
|
611
665
|
/**
|
|
612
666
|
* Group records by one or more fields and compute aggregates.
|
|
613
667
|
*
|
|
@@ -674,6 +728,10 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
674
728
|
* @protected
|
|
675
729
|
*/
|
|
676
730
|
protected cacheKey(key: string | Record<string, any>, moreOptions?: Record<string, any>): string;
|
|
731
|
+
/**
|
|
732
|
+
* Whether a value holds a function at any depth (cycle-safe).
|
|
733
|
+
*/
|
|
734
|
+
protected containsFunction(value: any, seen?: WeakSet<object>): boolean;
|
|
677
735
|
/**
|
|
678
736
|
* Deterministically serialize a value for use in a cache key.
|
|
679
737
|
*
|
|
@@ -768,6 +826,10 @@ declare class RepositoryManager<T = unknown, F = Record<string, any>> {
|
|
|
768
826
|
* export const cleanup = usersRepository.cleanup.bind(usersRepository);
|
|
769
827
|
*/
|
|
770
828
|
$cleanup(): Promise<void>;
|
|
829
|
+
/**
|
|
830
|
+
* Cache read that treats a driver failure (e.g. Redis down) as a miss.
|
|
831
|
+
*/
|
|
832
|
+
private safeCacheGet;
|
|
771
833
|
/**
|
|
772
834
|
* Clear all cache for this repository
|
|
773
835
|
* @public
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.manager.d.mts","names":[],"sources":["../../../../../../../core/src/repositories/repository.manager.ts"],"mappings":";;;;;;;;;;;AAuCA;;;;;;;;;;;;;cAAa,iBAAA,kBAAmC,MAAA;
|
|
1
|
+
{"version":3,"file":"repository.manager.d.mts","names":[],"sources":["../../../../../../../core/src/repositories/repository.manager.ts"],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ import { cache } from "@warlock.js/cache";
|
|
|
23
23
|
* // Direct instantiation with adapter
|
|
24
24
|
* const userRepo = new RepositoryManager<User>(new PrismaAdapter(prisma.user));
|
|
25
25
|
*/
|
|
26
|
-
var RepositoryManager = class {
|
|
26
|
+
var RepositoryManager = class RepositoryManager {
|
|
27
27
|
/**
|
|
28
28
|
* Get adapter instance (lazy-loaded)
|
|
29
29
|
* Resolution order:
|
|
@@ -47,6 +47,9 @@ var RepositoryManager = class {
|
|
|
47
47
|
*/
|
|
48
48
|
constructor(adapter) {
|
|
49
49
|
this.filterBy = {};
|
|
50
|
+
this.sortable = [];
|
|
51
|
+
this.selectable = [];
|
|
52
|
+
this.maxPerPage = 100;
|
|
50
53
|
this.defaultOptions = config.get("repository.defaultOptions") || {};
|
|
51
54
|
this.simpleSelectColumns = [];
|
|
52
55
|
this.isCacheable = config.get("repository.isCacheable") ?? true;
|
|
@@ -63,7 +66,9 @@ var RepositoryManager = class {
|
|
|
63
66
|
registerEvents() {
|
|
64
67
|
try {
|
|
65
68
|
this.eventsCallbacks.push(...this.adapter.registerEvents((source) => {
|
|
66
|
-
this.clearCache()
|
|
69
|
+
this.clearCache().catch((error) => {
|
|
70
|
+
console.error("[Repository] cache invalidation failed", error);
|
|
71
|
+
});
|
|
67
72
|
}));
|
|
68
73
|
} catch (error) {
|
|
69
74
|
console.error(`[Repository] Failed to register events:`, error);
|
|
@@ -139,6 +144,17 @@ var RepositoryManager = class {
|
|
|
139
144
|
return { [this.getIsActiveColumn()]: this.getIsActiveValue() };
|
|
140
145
|
}
|
|
141
146
|
/**
|
|
147
|
+
* Attach the active scope to the options. It travels under its own key (after
|
|
148
|
+
* the caller's options, so it can't be overridden) and is applied as a real
|
|
149
|
+
* `where` by `applyOptionsToQuery`, independent of `filterBy`.
|
|
150
|
+
*/
|
|
151
|
+
withActive(options) {
|
|
152
|
+
return {
|
|
153
|
+
...options,
|
|
154
|
+
activeScope: this.getIsActiveFilter()
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
142
158
|
* Find a record by ID
|
|
143
159
|
* @param id - Record ID or model instance
|
|
144
160
|
* @returns Promise resolving to record or null
|
|
@@ -192,6 +208,7 @@ var RepositoryManager = class {
|
|
|
192
208
|
const query = this.newQuery();
|
|
193
209
|
const opts = this.prepareOptions(options);
|
|
194
210
|
this.applyOptionsToQuery(query, opts);
|
|
211
|
+
this.applyLookupFilters(query, opts);
|
|
195
212
|
return query.limit(1).first();
|
|
196
213
|
}
|
|
197
214
|
/**
|
|
@@ -258,10 +275,7 @@ var RepositoryManager = class {
|
|
|
258
275
|
* @public
|
|
259
276
|
*/
|
|
260
277
|
async firstActive(options) {
|
|
261
|
-
return this.first({
|
|
262
|
-
...this.getIsActiveFilter(),
|
|
263
|
-
...options
|
|
264
|
-
});
|
|
278
|
+
return this.first({ ...this.withActive(options) });
|
|
265
279
|
}
|
|
266
280
|
/**
|
|
267
281
|
* Get first active cached record
|
|
@@ -270,10 +284,7 @@ var RepositoryManager = class {
|
|
|
270
284
|
* @public
|
|
271
285
|
*/
|
|
272
286
|
async firstActiveCached(options) {
|
|
273
|
-
return this.firstCached({
|
|
274
|
-
...this.getIsActiveFilter(),
|
|
275
|
-
...options
|
|
276
|
-
});
|
|
287
|
+
return this.firstCached({ ...this.withActive(options) });
|
|
277
288
|
}
|
|
278
289
|
/**
|
|
279
290
|
* Get last record matching options
|
|
@@ -304,10 +315,7 @@ var RepositoryManager = class {
|
|
|
304
315
|
* @public
|
|
305
316
|
*/
|
|
306
317
|
async lastActive(options) {
|
|
307
|
-
return this.last({
|
|
308
|
-
...this.getIsActiveFilter(),
|
|
309
|
-
...options
|
|
310
|
-
});
|
|
318
|
+
return this.last({ ...this.withActive(options) });
|
|
311
319
|
}
|
|
312
320
|
/**
|
|
313
321
|
* Get last active cached record
|
|
@@ -316,10 +324,7 @@ var RepositoryManager = class {
|
|
|
316
324
|
* @public
|
|
317
325
|
*/
|
|
318
326
|
async lastActiveCached(options) {
|
|
319
|
-
return this.lastCached({
|
|
320
|
-
...this.getIsActiveFilter(),
|
|
321
|
-
...options
|
|
322
|
-
});
|
|
327
|
+
return this.lastCached({ ...this.withActive(options) });
|
|
323
328
|
}
|
|
324
329
|
async list(options) {
|
|
325
330
|
return this._listImpl(options);
|
|
@@ -332,8 +337,9 @@ var RepositoryManager = class {
|
|
|
332
337
|
*/
|
|
333
338
|
async _listImpl(options) {
|
|
334
339
|
const query = this.newQuery();
|
|
335
|
-
const opts = this.prepareOptions(options);
|
|
340
|
+
const opts = this.sanitizeControls(this.prepareOptions(options));
|
|
336
341
|
const paginationMode = opts.paginationMode || "pages";
|
|
342
|
+
if (opts.paginate === false) return { data: await this.all(opts) };
|
|
337
343
|
this.applyOptionsToQuery(query, opts);
|
|
338
344
|
if (paginationMode === "cursor") return query.cursorPaginate({
|
|
339
345
|
limit: opts.limit || opts.defaultLimit || 15,
|
|
@@ -359,10 +365,7 @@ var RepositoryManager = class {
|
|
|
359
365
|
return query.get();
|
|
360
366
|
}
|
|
361
367
|
async listActive(options) {
|
|
362
|
-
return this._listImpl({
|
|
363
|
-
...this.getIsActiveFilter(),
|
|
364
|
-
...options
|
|
365
|
-
});
|
|
368
|
+
return this._listImpl({ ...this.withActive(options) });
|
|
366
369
|
}
|
|
367
370
|
/**
|
|
368
371
|
* List all active records without pagination
|
|
@@ -371,10 +374,7 @@ var RepositoryManager = class {
|
|
|
371
374
|
* @public
|
|
372
375
|
*/
|
|
373
376
|
async allActive(options) {
|
|
374
|
-
return this.all(this.asTypedAll(
|
|
375
|
-
...this.getIsActiveFilter(),
|
|
376
|
-
...options
|
|
377
|
-
}));
|
|
377
|
+
return this.all(this.asTypedAll(this.withActive(options)));
|
|
378
378
|
}
|
|
379
379
|
/**
|
|
380
380
|
* Check if record exists matching filter
|
|
@@ -419,6 +419,7 @@ var RepositoryManager = class {
|
|
|
419
419
|
*/
|
|
420
420
|
prepareOptions(options) {
|
|
421
421
|
return {
|
|
422
|
+
...config.get("repository.defaultOptions") || {},
|
|
422
423
|
...this.defaultOptions || {},
|
|
423
424
|
...options || {}
|
|
424
425
|
};
|
|
@@ -434,6 +435,89 @@ var RepositoryManager = class {
|
|
|
434
435
|
asTypedAll(opts) {
|
|
435
436
|
return opts;
|
|
436
437
|
}
|
|
438
|
+
static {
|
|
439
|
+
this.controlKeys = new Set([
|
|
440
|
+
"paginationMode",
|
|
441
|
+
"paginate",
|
|
442
|
+
"page",
|
|
443
|
+
"limit",
|
|
444
|
+
"perPage",
|
|
445
|
+
"defaultLimit",
|
|
446
|
+
"select",
|
|
447
|
+
"simpleSelect",
|
|
448
|
+
"deselect",
|
|
449
|
+
"orderBy",
|
|
450
|
+
"sortBy",
|
|
451
|
+
"sortDirection",
|
|
452
|
+
"cursor",
|
|
453
|
+
"direction",
|
|
454
|
+
"cursorColumn",
|
|
455
|
+
"purgeCache",
|
|
456
|
+
"perform",
|
|
457
|
+
"activeScope"
|
|
458
|
+
]);
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Columns `orderBy` / `sortBy` / `cursorColumn` may target.
|
|
462
|
+
*/
|
|
463
|
+
getSortableColumns() {
|
|
464
|
+
return new Set([
|
|
465
|
+
"id",
|
|
466
|
+
...this.sortable,
|
|
467
|
+
...Object.keys(this.filterBy || {})
|
|
468
|
+
]);
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Split client-controllable control options from filters: `limit` is capped by
|
|
472
|
+
* `maxPerPage`, sort / cursor columns must be whitelisted (`sortable`, `filterBy`
|
|
473
|
+
* keys or `id`) and `select` must be within `selectable`. Anything else is
|
|
474
|
+
* dropped, so `list({ ...request.all() })` cannot steer the query.
|
|
475
|
+
*/
|
|
476
|
+
sanitizeControls(options) {
|
|
477
|
+
const safe = { ...options };
|
|
478
|
+
const raw = safe;
|
|
479
|
+
const allowed = this.getSortableColumns();
|
|
480
|
+
const requested = Number(raw.limit ?? raw.perPage);
|
|
481
|
+
delete raw.perPage;
|
|
482
|
+
if (Number.isFinite(requested) && requested > 0) safe.limit = Math.min(Math.floor(requested), this.maxPerPage);
|
|
483
|
+
else delete raw.limit;
|
|
484
|
+
if (safe.defaultLimit) safe.defaultLimit = Math.min(safe.defaultLimit, this.maxPerPage);
|
|
485
|
+
if (safe.cursorColumn !== void 0 && !allowed.has(safe.cursorColumn)) delete raw.cursorColumn;
|
|
486
|
+
if (safe.sortBy !== void 0 && !allowed.has(safe.sortBy)) delete raw.sortBy;
|
|
487
|
+
if (safe.orderBy && safe.orderBy !== "random") {
|
|
488
|
+
if ((Array.isArray(safe.orderBy) ? [safe.orderBy[0]] : typeof safe.orderBy === "object" ? Object.keys(safe.orderBy) : []).some((column) => !allowed.has(column))) delete raw.orderBy;
|
|
489
|
+
}
|
|
490
|
+
if (safe.select) {
|
|
491
|
+
const selectable = new Set(this.selectable);
|
|
492
|
+
const columns = (Array.isArray(safe.select) ? safe.select : []).filter((column) => selectable.has(column));
|
|
493
|
+
if (columns.length > 0) safe.select = columns;
|
|
494
|
+
else delete raw.select;
|
|
495
|
+
}
|
|
496
|
+
return safe;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Read the active scope only when it is exactly what `getIsActiveFilter()`
|
|
500
|
+
* produces, so a client can't smuggle an arbitrary `where` through it.
|
|
501
|
+
*/
|
|
502
|
+
readActiveScope(options) {
|
|
503
|
+
const scope = options.activeScope;
|
|
504
|
+
if (!scope || typeof scope !== "object") return void 0;
|
|
505
|
+
const expected = this.getIsActiveFilter();
|
|
506
|
+
return JSON.stringify(scope) === JSON.stringify(expected) ? expected : void 0;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Apply plain `{ column: scalar }` lookups that are not declared in `filterBy`
|
|
510
|
+
* as equality wheres. Used by `first` (and so `exists`, `findOrCreate`,
|
|
511
|
+
* `updateOrCreate`) so an undeclared key is never silently dropped and can't
|
|
512
|
+
* match the wrong row.
|
|
513
|
+
*/
|
|
514
|
+
applyLookupFilters(query, options) {
|
|
515
|
+
for (const [key, value] of Object.entries(options)) {
|
|
516
|
+
if (RepositoryManager.controlKeys.has(key) || key in (this.filterBy || {}) || value === void 0) continue;
|
|
517
|
+
if (value !== null && typeof value === "object") throw new Error(`[Repository] Lookup "${key}" must be a scalar value.`);
|
|
518
|
+
query.where(key, value);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
437
521
|
/**
|
|
438
522
|
* Apply repository options to query
|
|
439
523
|
* @param query - Query builder instance
|
|
@@ -444,7 +528,7 @@ var RepositoryManager = class {
|
|
|
444
528
|
if (options.paginationMode === "cursor") {
|
|
445
529
|
const cursorColumn = options.cursorColumn ?? "id";
|
|
446
530
|
const direction = options.direction ?? "next";
|
|
447
|
-
if (options.cursor) query.where(cursorColumn, direction === "next" ? ">" : "<", options.cursor);
|
|
531
|
+
if (options.cursor) query.where(cursorColumn, direction === "next" ? ">" : "<", typeof options.cursor === "string" && /^-?\d+(\.\d+)?$/.test(options.cursor.trim()) ? Number(options.cursor) : options.cursor);
|
|
448
532
|
query.orderBy(cursorColumn, direction === "next" ? "asc" : "desc");
|
|
449
533
|
if (options.orderBy) {
|
|
450
534
|
if ((Array.isArray(options.orderBy) ? [options.orderBy[0]] : typeof options.orderBy === "object" ? Object.keys(options.orderBy) : []).includes(cursorColumn)) {
|
|
@@ -460,6 +544,8 @@ var RepositoryManager = class {
|
|
|
460
544
|
dateFormat: "DD-MM-YYYY",
|
|
461
545
|
dateTimeFormat: "DD-MM-YYYY HH:mm:ss"
|
|
462
546
|
});
|
|
547
|
+
const activeScope = this.readActiveScope(options);
|
|
548
|
+
if (activeScope) for (const [column, value] of Object.entries(activeScope)) query.where(column, value);
|
|
463
549
|
if (options.select) query.select(options.select);
|
|
464
550
|
if (options.deselect) query.deselect(options.deselect);
|
|
465
551
|
if (options.simpleSelect && this.simpleSelectColumns.length > 0) query.select(this.simpleSelectColumns);
|
|
@@ -554,10 +640,7 @@ var RepositoryManager = class {
|
|
|
554
640
|
* @public
|
|
555
641
|
*/
|
|
556
642
|
async chunkActive(size, callback, options) {
|
|
557
|
-
return this.chunk(size, callback, this.asTyped(
|
|
558
|
-
...this.getIsActiveFilter(),
|
|
559
|
-
...options
|
|
560
|
-
}));
|
|
643
|
+
return this.chunk(size, callback, this.asTyped(this.withActive(options)));
|
|
561
644
|
}
|
|
562
645
|
async latest(options) {
|
|
563
646
|
return this._listImpl({
|
|
@@ -574,15 +657,13 @@ var RepositoryManager = class {
|
|
|
574
657
|
async latestActive(options) {
|
|
575
658
|
return this._listImpl({
|
|
576
659
|
orderBy: ["id", "desc"],
|
|
577
|
-
...this.
|
|
578
|
-
...options
|
|
660
|
+
...this.withActive(options)
|
|
579
661
|
});
|
|
580
662
|
}
|
|
581
663
|
async oldestActive(options) {
|
|
582
664
|
return this._listImpl({
|
|
583
665
|
orderBy: ["id", "asc"],
|
|
584
|
-
...this.
|
|
585
|
-
...options
|
|
666
|
+
...this.withActive(options)
|
|
586
667
|
});
|
|
587
668
|
}
|
|
588
669
|
/**
|
|
@@ -671,10 +752,7 @@ var RepositoryManager = class {
|
|
|
671
752
|
* @public
|
|
672
753
|
*/
|
|
673
754
|
async countActive(options) {
|
|
674
|
-
return await this.count(this.asTyped(
|
|
675
|
-
...this.getIsActiveFilter(),
|
|
676
|
-
...options
|
|
677
|
-
}));
|
|
755
|
+
return await this.count(this.asTyped(this.withActive(options)));
|
|
678
756
|
}
|
|
679
757
|
/**
|
|
680
758
|
* Count records with caching
|
|
@@ -687,7 +765,7 @@ var RepositoryManager = class {
|
|
|
687
765
|
const opts = this.prepareOptions(options);
|
|
688
766
|
const cacheKey = this.cacheKey("count", opts);
|
|
689
767
|
if (!opts.purgeCache) {
|
|
690
|
-
const cachedCount = await this.
|
|
768
|
+
const cachedCount = await this.safeCacheGet(cacheKey);
|
|
691
769
|
if (cachedCount !== null && cachedCount !== void 0) return cachedCount;
|
|
692
770
|
}
|
|
693
771
|
const count = await this.count(options);
|
|
@@ -701,10 +779,7 @@ var RepositoryManager = class {
|
|
|
701
779
|
* @public
|
|
702
780
|
*/
|
|
703
781
|
async countActiveCached(options) {
|
|
704
|
-
return await this.countCached(this.asTyped(
|
|
705
|
-
...this.getIsActiveFilter(),
|
|
706
|
-
...options
|
|
707
|
-
}));
|
|
782
|
+
return await this.countCached(this.asTyped(this.withActive(options)));
|
|
708
783
|
}
|
|
709
784
|
/**
|
|
710
785
|
* Sum a numeric field across records matching options.
|
|
@@ -869,6 +944,15 @@ var RepositoryManager = class {
|
|
|
869
944
|
return cacheKey;
|
|
870
945
|
}
|
|
871
946
|
/**
|
|
947
|
+
* Whether a value holds a function at any depth (cycle-safe).
|
|
948
|
+
*/
|
|
949
|
+
containsFunction(value, seen = /* @__PURE__ */ new WeakSet()) {
|
|
950
|
+
if (typeof value === "function") return true;
|
|
951
|
+
if (value === null || typeof value !== "object" || seen.has(value)) return false;
|
|
952
|
+
seen.add(value);
|
|
953
|
+
return Object.values(value).some((item) => this.containsFunction(item, seen));
|
|
954
|
+
}
|
|
955
|
+
/**
|
|
872
956
|
* Deterministically serialize a value for use in a cache key.
|
|
873
957
|
*
|
|
874
958
|
* Unlike raw `JSON.stringify`, object keys are recursively sorted so that
|
|
@@ -931,7 +1015,7 @@ var RepositoryManager = class {
|
|
|
931
1015
|
async getCachedBy(column, value, cacheKeyOptions) {
|
|
932
1016
|
if (!this.isCacheable || !this.cacheDriver) return await this.findBy(column, value);
|
|
933
1017
|
const cacheKey = this.cacheKey(`${column}.${value}`, cacheKeyOptions);
|
|
934
|
-
const cachedData = await this.
|
|
1018
|
+
const cachedData = await this.safeCacheGet(cacheKey);
|
|
935
1019
|
if (cachedData) return this.adapter.deserializeModel(cachedData);
|
|
936
1020
|
const model = await this.findBy(column, value);
|
|
937
1021
|
if (!model) return null;
|
|
@@ -949,7 +1033,7 @@ var RepositoryManager = class {
|
|
|
949
1033
|
const opts = this.prepareOptions(options);
|
|
950
1034
|
const cacheKey = this.cacheKey("all", opts);
|
|
951
1035
|
if (!opts.purgeCache) {
|
|
952
|
-
const cachedData = await this.
|
|
1036
|
+
const cachedData = await this.safeCacheGet(cacheKey);
|
|
953
1037
|
if (cachedData) return cachedData.map((record) => this.adapter.deserializeModel(record));
|
|
954
1038
|
}
|
|
955
1039
|
const records = await this.all(options);
|
|
@@ -963,10 +1047,7 @@ var RepositoryManager = class {
|
|
|
963
1047
|
* @public
|
|
964
1048
|
*/
|
|
965
1049
|
async allActiveCached(options) {
|
|
966
|
-
return await this.allCached(this.asTypedAll(
|
|
967
|
-
...this.getIsActiveFilter(),
|
|
968
|
-
...options
|
|
969
|
-
}));
|
|
1050
|
+
return await this.allCached(this.asTypedAll(this.withActive(options)));
|
|
970
1051
|
}
|
|
971
1052
|
/**
|
|
972
1053
|
* List cached records with pagination
|
|
@@ -977,9 +1058,10 @@ var RepositoryManager = class {
|
|
|
977
1058
|
async listCached(options) {
|
|
978
1059
|
if (!this.isCacheable || !this.cacheDriver) return await this._listImpl(options);
|
|
979
1060
|
const opts = this.prepareOptions(options);
|
|
1061
|
+
if (!opts.cacheKey && this.containsFunction(opts)) return await this._listImpl(options);
|
|
980
1062
|
const cacheKey = this.cacheKey("list", opts);
|
|
981
1063
|
if (!opts.purgeCache) {
|
|
982
|
-
const cachedData = await this.
|
|
1064
|
+
const cachedData = await this.safeCacheGet(cacheKey);
|
|
983
1065
|
if (cachedData) return {
|
|
984
1066
|
data: (cachedData?.data || []).map((record) => this.adapter.deserializeModel(record)),
|
|
985
1067
|
pagination: cachedData.pagination
|
|
@@ -999,10 +1081,7 @@ var RepositoryManager = class {
|
|
|
999
1081
|
* @public
|
|
1000
1082
|
*/
|
|
1001
1083
|
async listActiveCached(options) {
|
|
1002
|
-
return await this.listCached(this.asTyped(
|
|
1003
|
-
...this.getIsActiveFilter(),
|
|
1004
|
-
...options
|
|
1005
|
-
}));
|
|
1084
|
+
return await this.listCached(this.asTyped(this.withActive(options)));
|
|
1006
1085
|
}
|
|
1007
1086
|
/**
|
|
1008
1087
|
* Get active cached record by ID
|
|
@@ -1049,7 +1128,17 @@ var RepositoryManager = class {
|
|
|
1049
1128
|
async $cleanup() {
|
|
1050
1129
|
await this.clearCache();
|
|
1051
1130
|
this.cleanuEvents();
|
|
1052
|
-
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Cache read that treats a driver failure (e.g. Redis down) as a miss.
|
|
1134
|
+
*/
|
|
1135
|
+
async safeCacheGet(key) {
|
|
1136
|
+
try {
|
|
1137
|
+
return await this.cacheDriver.get(key);
|
|
1138
|
+
} catch (error) {
|
|
1139
|
+
console.error("[Repository] cache read failed, treating as miss", error);
|
|
1140
|
+
return null;
|
|
1141
|
+
}
|
|
1053
1142
|
}
|
|
1054
1143
|
/**
|
|
1055
1144
|
* Clear all cache for this repository
|