@warlock.js/core 4.4.0 → 4.5.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 +45 -5
- package/README.md +47 -11
- package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
- package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
- package/esm/ai/src/agent/agent-log-event.mjs +101 -0
- package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
- package/esm/ai/src/agent/agent-stream.mjs +82 -0
- package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
- package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
- package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
- package/esm/ai/src/agent/agent.mjs +1157 -0
- package/esm/ai/src/agent/agent.mjs.map +1 -0
- package/esm/ai/src/agent/index.mjs +5 -0
- package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
- package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
- package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
- package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
- package/esm/ai/src/ai.mjs +155 -0
- package/esm/ai/src/ai.mjs.map +1 -0
- package/esm/ai/src/batch/batch.mjs +198 -0
- package/esm/ai/src/batch/batch.mjs.map +1 -0
- package/esm/ai/src/batch/index.mjs +3 -0
- package/esm/ai/src/batch/run-batch-item.mjs +100 -0
- package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
- package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
- package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
- package/esm/ai/src/checkpoint/memory.mjs +0 -0
- package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
- package/esm/ai/src/checkpoint/pg.mjs +265 -0
- package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
- package/esm/ai/src/checkpoint/redis.mjs +200 -0
- package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
- package/esm/ai/src/config.mjs +59 -0
- package/esm/ai/src/config.mjs.map +1 -0
- package/esm/ai/src/contracts/end.type.mjs +47 -0
- package/esm/ai/src/contracts/end.type.mjs.map +1 -0
- package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
- package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
- package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
- package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
- package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
- package/esm/ai/src/errors/ai-error.mjs +68 -0
- package/esm/ai/src/errors/ai-error.mjs.map +1 -0
- package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
- package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/content-filter-error.mjs +28 -0
- package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
- package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
- package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
- package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
- package/esm/ai/src/errors/index.mjs +37 -0
- package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
- package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
- package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
- package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
- package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
- package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
- package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
- package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
- package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
- package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
- package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
- package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
- package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
- package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
- package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-error.mjs +42 -0
- package/esm/ai/src/errors/provider-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
- package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
- package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
- package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
- package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
- package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
- package/esm/ai/src/errors/routing-error.mjs +23 -0
- package/esm/ai/src/errors/routing-error.mjs.map +1 -0
- package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
- package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
- package/esm/ai/src/errors/step-failed-error.mjs +19 -0
- package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
- package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
- package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
- package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
- package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
- package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
- package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
- package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
- package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
- package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
- package/esm/ai/src/errors/workflow-error.mjs +18 -0
- package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
- package/esm/ai/src/eval/dataset.mjs +112 -0
- package/esm/ai/src/eval/dataset.mjs.map +1 -0
- package/esm/ai/src/eval/eval-runner.mjs +135 -0
- package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
- package/esm/ai/src/eval/index.mjs +48 -0
- package/esm/ai/src/eval/index.mjs.map +1 -0
- package/esm/ai/src/eval/judge-scorer.mjs +87 -0
- package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
- package/esm/ai/src/eval/regression.mjs +51 -0
- package/esm/ai/src/eval/regression.mjs.map +1 -0
- package/esm/ai/src/eval/report-json.mjs +33 -0
- package/esm/ai/src/eval/report-json.mjs.map +1 -0
- package/esm/ai/src/eval/report-junit.mjs +60 -0
- package/esm/ai/src/eval/report-junit.mjs.map +1 -0
- package/esm/ai/src/eval/scorers.mjs +101 -0
- package/esm/ai/src/eval/scorers.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/index.mjs +6 -0
- package/esm/ai/src/guard/detectors/injection.mjs +254 -0
- package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
- package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/pii.mjs +199 -0
- package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
- package/esm/ai/src/guard/detectors/topic.mjs +99 -0
- package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
- package/esm/ai/src/guard/errors.mjs +18 -0
- package/esm/ai/src/guard/errors.mjs.map +1 -0
- package/esm/ai/src/guard/guard.mjs +209 -0
- package/esm/ai/src/guard/guard.mjs.map +1 -0
- package/esm/ai/src/guard/guardrail.mjs +22 -0
- package/esm/ai/src/guard/guardrail.mjs.map +1 -0
- package/esm/ai/src/human/errors.mjs +60 -0
- package/esm/ai/src/human/errors.mjs.map +1 -0
- package/esm/ai/src/human/human-approval.mjs +170 -0
- package/esm/ai/src/human/human-approval.mjs.map +1 -0
- package/esm/ai/src/human/policy.mjs +67 -0
- package/esm/ai/src/human/policy.mjs.map +1 -0
- package/esm/ai/src/human/register.mjs +37 -0
- package/esm/ai/src/human/register.mjs.map +1 -0
- package/esm/ai/src/human/resume-seed.mjs +53 -0
- package/esm/ai/src/human/resume-seed.mjs.map +1 -0
- package/esm/ai/src/human/resume.mjs +121 -0
- package/esm/ai/src/human/resume.mjs.map +1 -0
- package/esm/ai/src/human/stores/index.mjs +5 -0
- package/esm/ai/src/human/stores/memory.mjs +91 -0
- package/esm/ai/src/human/stores/memory.mjs.map +1 -0
- package/esm/ai/src/human/stores/pg.mjs +220 -0
- package/esm/ai/src/human/stores/pg.mjs.map +1 -0
- package/esm/ai/src/human/stores/redis.mjs +201 -0
- package/esm/ai/src/human/stores/redis.mjs.map +1 -0
- package/esm/ai/src/index.mjs +174 -0
- package/esm/ai/src/memory/derive-id.mjs +24 -0
- package/esm/ai/src/memory/derive-id.mjs.map +1 -0
- package/esm/ai/src/memory/episodic-memory.mjs +106 -0
- package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
- package/esm/ai/src/memory/memory.mjs +166 -0
- package/esm/ai/src/memory/memory.mjs.map +1 -0
- package/esm/ai/src/memory/procedural-memory.mjs +103 -0
- package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
- package/esm/ai/src/memory/semantic-memory.mjs +80 -0
- package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
- package/esm/ai/src/memory/working-memory.mjs +62 -0
- package/esm/ai/src/memory/working-memory.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
- package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
- package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
- package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
- package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
- package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
- package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
- package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
- package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
- package/esm/ai/src/middleware/index.mjs +10 -0
- package/esm/ai/src/middleware/pipeline.mjs +100 -0
- package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
- package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
- package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
- package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
- package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
- package/esm/ai/src/mock/index.mjs +4 -0
- package/esm/ai/src/mock/mock-agent.mjs +3 -0
- package/esm/ai/src/mock/mock-router.mjs +58 -0
- package/esm/ai/src/mock/mock-router.mjs.map +1 -0
- package/esm/ai/src/model/fallback-model.mjs +218 -0
- package/esm/ai/src/model/fallback-model.mjs.map +1 -0
- package/esm/ai/src/model/index.mjs +3 -0
- package/esm/ai/src/object-stream/index.mjs +4 -0
- package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
- package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
- package/esm/ai/src/object-stream/stream-object.mjs +97 -0
- package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
- package/esm/ai/src/observe/index.mjs +4 -0
- package/esm/ai/src/observe/observer-registry.mjs +35 -0
- package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
- package/esm/ai/src/observe/resolve-observers.mjs +73 -0
- package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
- package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
- package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
- package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
- package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
- package/esm/ai/src/orchestrator/commands.mjs +34 -0
- package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
- package/esm/ai/src/orchestrator/compaction.mjs +206 -0
- package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
- package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
- package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
- package/esm/ai/src/orchestrator/emitter.mjs +85 -0
- package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
- package/esm/ai/src/orchestrator/execution.mjs +395 -0
- package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
- package/esm/ai/src/orchestrator/index.mjs +11 -0
- package/esm/ai/src/orchestrator/load.mjs +49 -0
- package/esm/ai/src/orchestrator/load.mjs.map +1 -0
- package/esm/ai/src/orchestrator/lock.mjs +75 -0
- package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
- package/esm/ai/src/orchestrator/memory.mjs +141 -0
- package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
- package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
- package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
- package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
- package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
- package/esm/ai/src/orchestrator/resume.mjs +74 -0
- package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
- package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
- package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
- package/esm/ai/src/orchestrator/signature.mjs +120 -0
- package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
- package/esm/ai/src/orchestrator/window.mjs +56 -0
- package/esm/ai/src/orchestrator/window.mjs.map +1 -0
- package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
- package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
- package/esm/ai/src/planner/index.mjs +6 -0
- package/esm/ai/src/planner/plan-prompt.mjs +31 -0
- package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
- package/esm/ai/src/planner/plan-schema.mjs +120 -0
- package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
- package/esm/ai/src/planner/planner-run.mjs +614 -0
- package/esm/ai/src/planner/planner-run.mjs.map +1 -0
- package/esm/ai/src/planner/planner.mjs +120 -0
- package/esm/ai/src/planner/planner.mjs.map +1 -0
- package/esm/ai/src/planner/signature.mjs +27 -0
- package/esm/ai/src/planner/signature.mjs.map +1 -0
- package/esm/ai/src/prompt/errors.mjs +73 -0
- package/esm/ai/src/prompt/errors.mjs.map +1 -0
- package/esm/ai/src/prompt/index.mjs +4 -0
- package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
- package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
- package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
- package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
- package/esm/ai/src/prompt/prompt.mjs +218 -0
- package/esm/ai/src/prompt/prompt.mjs.map +1 -0
- package/esm/ai/src/prompts/index.mjs +3 -0
- package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
- package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
- package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
- package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
- package/esm/ai/src/rag/as-tool.mjs +48 -0
- package/esm/ai/src/rag/as-tool.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
- package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
- package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
- package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
- package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
- package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
- package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
- package/esm/ai/src/rag/index.mjs +7 -0
- package/esm/ai/src/rag/rag.mjs +126 -0
- package/esm/ai/src/rag/rag.mjs.map +1 -0
- package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
- package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
- package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
- package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
- package/esm/ai/src/rag/retrieve.mjs +68 -0
- package/esm/ai/src/rag/retrieve.mjs.map +1 -0
- package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
- package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
- package/esm/ai/src/security/index.mjs +5 -0
- package/esm/ai/src/security/outbound-policy.mjs +187 -0
- package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
- package/esm/ai/src/security/private-ip.mjs +48 -0
- package/esm/ai/src/security/private-ip.mjs.map +1 -0
- package/esm/ai/src/security/redact.mjs +60 -0
- package/esm/ai/src/security/redact.mjs.map +1 -0
- package/esm/ai/src/serve/serve.mjs +90 -0
- package/esm/ai/src/serve/serve.mjs.map +1 -0
- package/esm/ai/src/serve/sse.mjs +25 -0
- package/esm/ai/src/serve/sse.mjs.map +1 -0
- package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
- package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
- package/esm/ai/src/skills/catalog.mjs +140 -0
- package/esm/ai/src/skills/catalog.mjs.map +1 -0
- package/esm/ai/src/skills/index.mjs +11 -0
- package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
- package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
- package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
- package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
- package/esm/ai/src/skills/skills.mjs +109 -0
- package/esm/ai/src/skills/skills.mjs.map +1 -0
- package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
- package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
- package/esm/ai/src/skills/sources/index.mjs +27 -0
- package/esm/ai/src/skills/sources/index.mjs.map +1 -0
- package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
- package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
- package/esm/ai/src/skills/sources/store-source.mjs +15 -0
- package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
- package/esm/ai/src/skills/sources/url-source.mjs +117 -0
- package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
- package/esm/ai/src/snapshot/memory.mjs +81 -0
- package/esm/ai/src/snapshot/memory.mjs.map +1 -0
- package/esm/ai/src/snapshot/pg.mjs +146 -0
- package/esm/ai/src/snapshot/pg.mjs.map +1 -0
- package/esm/ai/src/snapshot/redis.mjs +101 -0
- package/esm/ai/src/snapshot/redis.mjs.map +1 -0
- package/esm/ai/src/supervisor/as-tool.mjs +74 -0
- package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
- package/esm/ai/src/supervisor/cancellation.mjs +22 -0
- package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
- package/esm/ai/src/supervisor/decide.mjs +272 -0
- package/esm/ai/src/supervisor/decide.mjs.map +1 -0
- package/esm/ai/src/supervisor/emitter.mjs +47 -0
- package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
- package/esm/ai/src/supervisor/entries.mjs +206 -0
- package/esm/ai/src/supervisor/entries.mjs.map +1 -0
- package/esm/ai/src/supervisor/execution.mjs +1921 -0
- package/esm/ai/src/supervisor/execution.mjs.map +1 -0
- package/esm/ai/src/supervisor/fan-out.mjs +65 -0
- package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
- package/esm/ai/src/supervisor/index.mjs +14 -0
- package/esm/ai/src/supervisor/router-factory.mjs +141 -0
- package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
- package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
- package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
- package/esm/ai/src/supervisor/signature.mjs +89 -0
- package/esm/ai/src/supervisor/signature.mjs.map +1 -0
- package/esm/ai/src/supervisor/snapshot.mjs +69 -0
- package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
- package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
- package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
- package/esm/ai/src/supervisor/supervisor.mjs +144 -0
- package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
- package/esm/ai/src/system-prompt/index.mjs +6 -0
- package/esm/ai/src/system-prompt/instruction.mjs +57 -0
- package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
- package/esm/ai/src/system-prompt/persona.mjs +57 -0
- package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
- package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
- package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
- package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
- package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
- package/esm/ai/src/team/gates.mjs +48 -0
- package/esm/ai/src/team/gates.mjs.map +1 -0
- package/esm/ai/src/team/index.mjs +3 -0
- package/esm/ai/src/team/team.mjs +94 -0
- package/esm/ai/src/team/team.mjs.map +1 -0
- package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
- package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
- package/esm/ai/src/tool/index.mjs +4 -0
- package/esm/ai/src/tool/tool.mjs +185 -0
- package/esm/ai/src/tool/tool.mjs.map +1 -0
- package/esm/ai/src/utils/compute-cost.mjs +112 -0
- package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
- package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
- package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
- package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
- package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
- package/esm/ai/src/utils/generate-run-id.mjs +23 -0
- package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
- package/esm/ai/src/utils/index.mjs +12 -0
- package/esm/ai/src/utils/json-schema.mjs +89 -0
- package/esm/ai/src/utils/json-schema.mjs.map +1 -0
- package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
- package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
- package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
- package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
- package/esm/ai/src/utils/run-context.mjs +89 -0
- package/esm/ai/src/utils/run-context.mjs.map +1 -0
- package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
- package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
- package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
- package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
- package/esm/ai/src/vcr/cassette-io.mjs +57 -0
- package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
- package/esm/ai/src/vcr/errors.mjs +37 -0
- package/esm/ai/src/vcr/errors.mjs.map +1 -0
- package/esm/ai/src/vcr/hash-request.mjs +118 -0
- package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
- package/esm/ai/src/vcr/index.mjs +5 -0
- package/esm/ai/src/vcr/vcr.mjs +248 -0
- package/esm/ai/src/vcr/vcr.mjs.map +1 -0
- package/esm/ai/src/workflow/as-tool.mjs +49 -0
- package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
- package/esm/ai/src/workflow/cancellation.mjs +44 -0
- package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
- package/esm/ai/src/workflow/emitter.mjs +40 -0
- package/esm/ai/src/workflow/emitter.mjs.map +1 -0
- package/esm/ai/src/workflow/engine.mjs +363 -0
- package/esm/ai/src/workflow/engine.mjs.map +1 -0
- package/esm/ai/src/workflow/index.mjs +5 -0
- package/esm/ai/src/workflow/retry.mjs +32 -0
- package/esm/ai/src/workflow/retry.mjs.map +1 -0
- package/esm/ai/src/workflow/router.mjs +56 -0
- package/esm/ai/src/workflow/router.mjs.map +1 -0
- package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
- package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
- package/esm/ai/src/workflow/signature.mjs +34 -0
- package/esm/ai/src/workflow/signature.mjs.map +1 -0
- package/esm/ai/src/workflow/snapshot.mjs +77 -0
- package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
- package/esm/ai/src/workflow/state.mjs +37 -0
- package/esm/ai/src/workflow/state.mjs.map +1 -0
- package/esm/ai/src/workflow/step-runner.mjs +370 -0
- package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
- package/esm/ai/src/workflow/step.mjs +37 -0
- package/esm/ai/src/workflow/step.mjs.map +1 -0
- package/esm/ai/src/workflow/workflow.mjs +122 -0
- package/esm/ai/src/workflow/workflow.mjs.map +1 -0
- package/esm/ai-openai/src/embedder.mjs +4 -0
- package/esm/ai-openai/src/index.mjs +4 -0
- package/esm/ai-openai/src/model.mjs +5 -0
- package/esm/ai-openai/src/sdk.mjs +6 -0
- package/esm/ai-openai/src/utils/index.mjs +4 -0
- package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
- package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
- package/esm/cli/commands/dev-server.command.mjs +1 -1
- package/esm/cli/commands/dev-server.command.mjs.map +1 -1
- package/esm/cli/commands/generate/templates/stubs.mjs +3 -4
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/connectors/ai-connector.d.mts +43 -0
- package/esm/connectors/ai-connector.d.mts.map +1 -0
- package/esm/connectors/ai-connector.mjs +56 -0
- package/esm/connectors/ai-connector.mjs.map +1 -0
- package/esm/connectors/cache-connector.d.mts +5 -0
- package/esm/connectors/cache-connector.d.mts.map +1 -1
- package/esm/connectors/cache-connector.mjs +7 -0
- package/esm/connectors/cache-connector.mjs.map +1 -1
- package/esm/connectors/connectors-manager.d.mts +6 -2
- package/esm/connectors/connectors-manager.d.mts.map +1 -1
- package/esm/connectors/connectors-manager.mjs +8 -2
- package/esm/connectors/connectors-manager.mjs.map +1 -1
- package/esm/connectors/http-connector.mjs.map +1 -1
- package/esm/connectors/index.d.mts +1 -0
- package/esm/connectors/index.mjs +1 -0
- package/esm/connectors/socket-connector.d.mts +16 -1
- package/esm/connectors/socket-connector.d.mts.map +1 -1
- package/esm/connectors/socket-connector.mjs +28 -5
- package/esm/connectors/socket-connector.mjs.map +1 -1
- package/esm/connectors/storage.connector.d.mts +7 -0
- package/esm/connectors/storage.connector.d.mts.map +1 -1
- package/esm/connectors/storage.connector.mjs +7 -0
- package/esm/connectors/storage.connector.mjs.map +1 -1
- package/esm/connectors/types.d.mts +3 -2
- package/esm/connectors/types.d.mts.map +1 -1
- package/esm/connectors/types.mjs +1 -0
- package/esm/connectors/types.mjs.map +1 -1
- package/esm/dev-server/development-server.mjs +2 -14
- package/esm/dev-server/development-server.mjs.map +1 -1
- package/esm/dev-server/file-event-handler.mjs +15 -3
- package/esm/dev-server/file-event-handler.mjs.map +1 -1
- package/esm/generations/add-command.action.mjs +61 -12
- package/esm/generations/add-command.action.mjs.map +1 -1
- package/esm/generations/stubs.mjs +31 -1
- package/esm/generations/stubs.mjs.map +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
- package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
- package/esm/http/middleware/cache-response-middleware.mjs +15 -6
- package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
- package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
- package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
- package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
- package/esm/http/middleware/idempotency.middleware.mjs +4 -1
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/middleware/maintenance.middleware.mjs +2 -1
- package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
- package/esm/http/request.d.mts +9 -2
- package/esm/http/request.d.mts.map +1 -1
- package/esm/http/request.mjs +15 -3
- package/esm/http/request.mjs.map +1 -1
- package/esm/http/response.d.mts +12 -0
- package/esm/http/response.d.mts.map +1 -1
- package/esm/http/response.mjs +19 -2
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +1 -1
- package/esm/http/server.mjs.map +1 -1
- package/esm/index.d.mts +6 -2
- package/esm/index.mjs +5 -1
- package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
- package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
- package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
- package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
- package/esm/node_modules/mustache/mustache.mjs +587 -0
- package/esm/node_modules/mustache/mustache.mjs.map +1 -0
- package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
- package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
- package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
- package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
- package/esm/node_modules/openai/azure.mjs +82 -0
- package/esm/node_modules/openai/azure.mjs.map +1 -0
- package/esm/node_modules/openai/client.mjs +638 -0
- package/esm/node_modules/openai/client.mjs.map +1 -0
- package/esm/node_modules/openai/core/api-promise.mjs +75 -0
- package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
- package/esm/node_modules/openai/core/error.mjs +110 -0
- package/esm/node_modules/openai/core/error.mjs.map +1 -0
- package/esm/node_modules/openai/core/pagination.mjs +160 -0
- package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
- package/esm/node_modules/openai/core/resource.mjs +10 -0
- package/esm/node_modules/openai/core/resource.mjs.map +1 -0
- package/esm/node_modules/openai/core/streaming.mjs +238 -0
- package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
- package/esm/node_modules/openai/index.mjs +8 -0
- package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
- package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
- package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
- package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
- package/esm/node_modules/openai/internal/errors.mjs +26 -0
- package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
- package/esm/node_modules/openai/internal/headers.mjs +65 -0
- package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
- package/esm/node_modules/openai/internal/parse.mjs +41 -0
- package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
- package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
- package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
- package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
- package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
- package/esm/node_modules/openai/internal/request-options.mjs +11 -0
- package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
- package/esm/node_modules/openai/internal/shims.mjs +77 -0
- package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
- package/esm/node_modules/openai/internal/to-file.mjs +63 -0
- package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
- package/esm/node_modules/openai/internal/tslib.mjs +16 -0
- package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
- package/esm/node_modules/openai/internal/uploads.mjs +94 -0
- package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
- package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
- package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
- package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
- package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
- package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
- package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
- package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
- package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
- package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
- package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
- package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
- package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
- package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
- package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
- package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
- package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
- package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
- package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
- package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
- package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
- package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
- package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
- package/esm/node_modules/openai/lib/Util.mjs +19 -0
- package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
- package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
- package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
- package/esm/node_modules/openai/lib/parser.mjs +88 -0
- package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
- package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
- package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
- package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
- package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
- package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
- package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
- package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
- package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
- package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
- package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
- package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
- package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
- package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
- package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
- package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
- package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
- package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
- package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
- package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
- package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/batches.mjs +54 -0
- package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
- package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
- package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
- package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
- package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
- package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
- package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
- package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
- package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
- package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
- package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
- package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
- package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
- package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
- package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
- package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
- package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
- package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
- package/esm/node_modules/openai/resources/completions.mjs +20 -0
- package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
- package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
- package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
- package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
- package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
- package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
- package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
- package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
- package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
- package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/files.mjs +111 -0
- package/esm/node_modules/openai/resources/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
- package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
- package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
- package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
- package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
- package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
- package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
- package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
- package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
- package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
- package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
- package/esm/node_modules/openai/resources/images.mjs +46 -0
- package/esm/node_modules/openai/resources/images.mjs.map +1 -0
- package/esm/node_modules/openai/resources/index.mjs +27 -0
- package/esm/node_modules/openai/resources/models.mjs +44 -0
- package/esm/node_modules/openai/resources/models.mjs.map +1 -0
- package/esm/node_modules/openai/resources/moderations.mjs +23 -0
- package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
- package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
- package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
- package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
- package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
- package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
- package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
- package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
- package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
- package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
- package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
- package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
- package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
- package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
- package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
- package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
- package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
- package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
- package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
- package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
- package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
- package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
- package/esm/node_modules/openai/resources/videos.mjs +115 -0
- package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
- package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
- package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
- package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
- package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
- package/esm/node_modules/openai/streaming.mjs +3 -0
- package/esm/node_modules/openai/version.mjs +6 -0
- package/esm/node_modules/openai/version.mjs.map +1 -0
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +9 -0
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +32 -5
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
- package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
- package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
- package/esm/repositories/repository.manager.d.mts +11 -1
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +79 -25
- package/esm/repositories/repository.manager.mjs.map +1 -1
- package/esm/router/route-registry.mjs +19 -10
- package/esm/router/route-registry.mjs.map +1 -1
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +7 -4
- package/esm/router/router.mjs.map +1 -1
- package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
- package/esm/storage/drivers/cloud-driver.mjs +48 -12
- package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
- package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
- package/esm/storage/drivers/local-driver.d.mts +8 -0
- package/esm/storage/drivers/local-driver.d.mts.map +1 -1
- package/esm/storage/drivers/local-driver.mjs +19 -4
- package/esm/storage/drivers/local-driver.mjs.map +1 -1
- package/esm/storage/drivers/r2-driver.mjs +1 -1
- package/esm/storage/drivers/r2-driver.mjs.map +1 -1
- package/esm/storage/drivers/s3-driver.mjs +1 -1
- package/esm/storage/drivers/s3-driver.mjs.map +1 -1
- package/esm/storage/index.d.mts +4 -1
- package/esm/storage/index.mjs +3 -0
- package/esm/storage/scoped-storage.d.mts +8 -4
- package/esm/storage/scoped-storage.d.mts.map +1 -1
- package/esm/storage/scoped-storage.mjs +21 -6
- package/esm/storage/scoped-storage.mjs.map +1 -1
- package/esm/storage/storage.d.mts +12 -4
- package/esm/storage/storage.d.mts.map +1 -1
- package/esm/storage/storage.mjs +23 -9
- package/esm/storage/storage.mjs.map +1 -1
- package/esm/storage/types.d.mts +33 -5
- package/esm/storage/types.d.mts.map +1 -1
- package/esm/storage/utils/contain-path.d.mts +23 -0
- package/esm/storage/utils/contain-path.d.mts.map +1 -0
- package/esm/storage/utils/contain-path.mjs +35 -0
- package/esm/storage/utils/contain-path.mjs.map +1 -0
- package/esm/storage/utils/safe-fetch.d.mts +68 -0
- package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
- package/esm/storage/utils/safe-fetch.mjs +205 -0
- package/esm/storage/utils/safe-fetch.mjs.map +1 -0
- package/esm/storage/utils/storage-error.d.mts +35 -0
- package/esm/storage/utils/storage-error.d.mts.map +1 -0
- package/esm/storage/utils/storage-error.mjs +17 -0
- package/esm/storage/utils/storage-error.mjs.map +1 -0
- package/esm/use-cases/use-case-pipeline.mjs +4 -1
- package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
- package/esm/use-cases/use-case.mjs +12 -4
- package/esm/use-cases/use-case.mjs.map +1 -1
- package/esm/use-cases/use-cases-registry.d.mts +12 -4
- package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
- package/esm/use-cases/use-cases-registry.mjs +13 -3
- package/esm/use-cases/use-cases-registry.mjs.map +1 -1
- package/esm/utils/npm-registry.d.mts +1 -1
- package/esm/utils/npm-registry.mjs +2 -2
- package/esm/utils/npm-registry.mjs.map +1 -1
- package/llms-full.txt +29 -1
- package/package.json +9 -9
- package/skills/add-connector/SKILL.md +6 -1
- package/skills/configure-app/SKILL.md +23 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.manager.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"mappings":";;;;;;;;;;;AAqCA;;;;;;;;;;;;;cAAa,iBAAA,kBAAmC,MAAA;
|
|
1
|
+
{"version":3,"file":"repository.manager.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"mappings":"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"}
|
|
@@ -61,9 +61,13 @@ var RepositoryManager = class {
|
|
|
61
61
|
* Register events
|
|
62
62
|
*/
|
|
63
63
|
registerEvents() {
|
|
64
|
-
|
|
65
|
-
this.
|
|
66
|
-
|
|
64
|
+
try {
|
|
65
|
+
this.eventsCallbacks.push(...this.adapter.registerEvents((source) => {
|
|
66
|
+
this.clearCache();
|
|
67
|
+
}));
|
|
68
|
+
} catch (error) {
|
|
69
|
+
console.error(`[Repository] Failed to register events:`, error);
|
|
70
|
+
}
|
|
67
71
|
}
|
|
68
72
|
/**
|
|
69
73
|
* Unregister events
|
|
@@ -350,6 +354,7 @@ var RepositoryManager = class {
|
|
|
350
354
|
async all(options) {
|
|
351
355
|
const query = this.newQuery();
|
|
352
356
|
const opts = this.prepareOptions(options);
|
|
357
|
+
opts.paginate = false;
|
|
353
358
|
this.applyOptionsToQuery(query, opts);
|
|
354
359
|
return query.get();
|
|
355
360
|
}
|
|
@@ -459,10 +464,10 @@ var RepositoryManager = class {
|
|
|
459
464
|
if (options.deselect) query.deselect(options.deselect);
|
|
460
465
|
if (options.simpleSelect && this.simpleSelectColumns.length > 0) query.select(this.simpleSelectColumns);
|
|
461
466
|
if (options.orderBy) {
|
|
462
|
-
if (options.orderBy === "random") query.random();
|
|
467
|
+
if (options.orderBy === "random") query.random(options.limit);
|
|
463
468
|
else if (Array.isArray(options.orderBy)) query.orderBy(options.orderBy[0], options.orderBy[1]);
|
|
464
469
|
else if (typeof options.orderBy === "object") query.sortBy(options.orderBy);
|
|
465
|
-
}
|
|
470
|
+
} else if (options.sortBy) query.orderBy(options.sortBy, options.sortDirection ?? "asc");
|
|
466
471
|
if (options.limit && options.paginate === false) query.limit(options.limit);
|
|
467
472
|
if (options?.perform) options.perform(query, options);
|
|
468
473
|
return options;
|
|
@@ -474,7 +479,12 @@ var RepositoryManager = class {
|
|
|
474
479
|
* @public
|
|
475
480
|
*/
|
|
476
481
|
async create(data) {
|
|
477
|
-
|
|
482
|
+
await this.onSaving(data, "create");
|
|
483
|
+
await this.onCreating(data);
|
|
484
|
+
const result = await this.adapter.create(data);
|
|
485
|
+
await this.onCreate(result, data);
|
|
486
|
+
await this.onSave(result, data, "create");
|
|
487
|
+
return result;
|
|
478
488
|
}
|
|
479
489
|
/**
|
|
480
490
|
* Update a record by ID
|
|
@@ -484,7 +494,12 @@ var RepositoryManager = class {
|
|
|
484
494
|
* @public
|
|
485
495
|
*/
|
|
486
496
|
async update(id, data) {
|
|
487
|
-
|
|
497
|
+
await this.onSaving(data, "update");
|
|
498
|
+
await this.onUpdating(id, data);
|
|
499
|
+
const result = await this.adapter.update(id, data);
|
|
500
|
+
await this.onUpdate(result, data);
|
|
501
|
+
await this.onSave(result, data, "update");
|
|
502
|
+
return result;
|
|
488
503
|
}
|
|
489
504
|
/**
|
|
490
505
|
* Delete a record by ID
|
|
@@ -493,7 +508,9 @@ var RepositoryManager = class {
|
|
|
493
508
|
* @public
|
|
494
509
|
*/
|
|
495
510
|
async delete(id) {
|
|
496
|
-
|
|
511
|
+
await this.onDeleting(id);
|
|
512
|
+
await this.adapter.delete(id);
|
|
513
|
+
await this.onDelete(id);
|
|
497
514
|
}
|
|
498
515
|
/**
|
|
499
516
|
* Update multiple records matching filter
|
|
@@ -669,9 +686,11 @@ var RepositoryManager = class {
|
|
|
669
686
|
if (!this.isCacheable || !this.cacheDriver) return await this.count(options);
|
|
670
687
|
const opts = this.prepareOptions(options);
|
|
671
688
|
const cacheKey = this.cacheKey("count", opts);
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
689
|
+
if (!opts.purgeCache) {
|
|
690
|
+
const cachedCount = await this.cacheDriver.get(cacheKey);
|
|
691
|
+
if (cachedCount !== null && cachedCount !== void 0) return cachedCount;
|
|
692
|
+
}
|
|
693
|
+
const count = await this.count(options);
|
|
675
694
|
await this.cache(cacheKey, count);
|
|
676
695
|
return count;
|
|
677
696
|
}
|
|
@@ -714,11 +733,37 @@ var RepositoryManager = class {
|
|
|
714
733
|
*/
|
|
715
734
|
cacheKey(key, moreOptions) {
|
|
716
735
|
let cacheKey = `repositories.${this.getName()}`;
|
|
717
|
-
if (key) cacheKey += "." + (typeof key === "string" ? key :
|
|
718
|
-
if (moreOptions)
|
|
736
|
+
if (key) cacheKey += "." + (typeof key === "string" ? key : this.stableStringify(key));
|
|
737
|
+
if (moreOptions) {
|
|
738
|
+
const { purgeCache: _purgeCache, ...keyOptions } = moreOptions;
|
|
739
|
+
cacheKey += "." + this.stableStringify(keyOptions);
|
|
740
|
+
}
|
|
719
741
|
return cacheKey;
|
|
720
742
|
}
|
|
721
743
|
/**
|
|
744
|
+
* Deterministically serialize a value for use in a cache key.
|
|
745
|
+
*
|
|
746
|
+
* Unlike raw `JSON.stringify`, object keys are recursively sorted so that
|
|
747
|
+
* `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same key. Function-valued
|
|
748
|
+
* options (e.g. a `perform` callback) are represented by a stable marker
|
|
749
|
+
* (`[fn:<name>]`) rather than being silently dropped, so two distinct
|
|
750
|
+
* callbacks do not collide on the same cache key.
|
|
751
|
+
*/
|
|
752
|
+
stableStringify(value) {
|
|
753
|
+
const seen = /* @__PURE__ */ new WeakSet();
|
|
754
|
+
const normalize = (input) => {
|
|
755
|
+
if (typeof input === "function") return `[fn:${input.name || "anonymous"}]`;
|
|
756
|
+
if (input === null || typeof input !== "object") return input;
|
|
757
|
+
if (seen.has(input)) return "[circular]";
|
|
758
|
+
seen.add(input);
|
|
759
|
+
if (Array.isArray(input)) return input.map((item) => normalize(item));
|
|
760
|
+
const sorted = {};
|
|
761
|
+
for (const objectKey of Object.keys(input).sort()) sorted[objectKey] = normalize(input[objectKey]);
|
|
762
|
+
return sorted;
|
|
763
|
+
};
|
|
764
|
+
return JSON.stringify(normalize(value));
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
722
767
|
* Cache a value
|
|
723
768
|
* @param key - Cache key
|
|
724
769
|
* @param value - Value to cache
|
|
@@ -726,7 +771,11 @@ var RepositoryManager = class {
|
|
|
726
771
|
*/
|
|
727
772
|
async cache(key, value) {
|
|
728
773
|
if (!this.isCacheable || !this.cacheDriver) return;
|
|
729
|
-
|
|
774
|
+
try {
|
|
775
|
+
await this.cacheDriver.set(key, value);
|
|
776
|
+
} catch (error) {
|
|
777
|
+
console.error(`[Repository] Failed to write cache key "${key}":`, error);
|
|
778
|
+
}
|
|
730
779
|
}
|
|
731
780
|
/**
|
|
732
781
|
* Get cached record by ID
|
|
@@ -758,7 +807,7 @@ var RepositoryManager = class {
|
|
|
758
807
|
if (cachedData) return this.adapter.deserializeModel(cachedData);
|
|
759
808
|
const model = await this.findBy(column, value);
|
|
760
809
|
if (!model) return null;
|
|
761
|
-
this.cache(cacheKey, this.adapter.serializeModel(model));
|
|
810
|
+
await this.cache(cacheKey, this.adapter.serializeModel(model));
|
|
762
811
|
return model;
|
|
763
812
|
}
|
|
764
813
|
/**
|
|
@@ -771,8 +820,10 @@ var RepositoryManager = class {
|
|
|
771
820
|
if (!this.isCacheable || !this.cacheDriver) return await this.all(options);
|
|
772
821
|
const opts = this.prepareOptions(options);
|
|
773
822
|
const cacheKey = this.cacheKey("all", opts);
|
|
774
|
-
|
|
775
|
-
|
|
823
|
+
if (!opts.purgeCache) {
|
|
824
|
+
const cachedData = await this.cacheDriver.get(cacheKey);
|
|
825
|
+
if (cachedData) return cachedData.map((record) => this.adapter.deserializeModel(record));
|
|
826
|
+
}
|
|
776
827
|
const records = await this.all(options);
|
|
777
828
|
await this.cache(cacheKey, records.map((record) => this.adapter.serializeModel(record)));
|
|
778
829
|
return records;
|
|
@@ -799,11 +850,13 @@ var RepositoryManager = class {
|
|
|
799
850
|
if (!this.isCacheable || !this.cacheDriver) return await this._listImpl(options);
|
|
800
851
|
const opts = this.prepareOptions(options);
|
|
801
852
|
const cacheKey = this.cacheKey("list", opts);
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
853
|
+
if (!opts.purgeCache) {
|
|
854
|
+
const cachedData = await this.cacheDriver.get(cacheKey);
|
|
855
|
+
if (cachedData) return {
|
|
856
|
+
data: (cachedData?.data || []).map((record) => this.adapter.deserializeModel(record)),
|
|
857
|
+
pagination: cachedData.pagination
|
|
858
|
+
};
|
|
859
|
+
}
|
|
807
860
|
const result = await this._listImpl(options);
|
|
808
861
|
await this.cache(cacheKey, {
|
|
809
862
|
data: result.data.map((record) => this.adapter.serializeModel(record)),
|
|
@@ -865,9 +918,10 @@ var RepositoryManager = class {
|
|
|
865
918
|
* exported as cleanup
|
|
866
919
|
* export const cleanup = usersRepository.cleanup.bind(usersRepository);
|
|
867
920
|
*/
|
|
868
|
-
$cleanup() {
|
|
869
|
-
this.
|
|
870
|
-
this.
|
|
921
|
+
async $cleanup() {
|
|
922
|
+
await this.clearCache();
|
|
923
|
+
this.cleanuEvents();
|
|
924
|
+
if (this.cacheDriver) await this.cacheDriver.flush();
|
|
871
925
|
}
|
|
872
926
|
/**
|
|
873
927
|
* Clear all cache for this repository
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"sourcesContent":["import { cache, CacheKey, type CacheDriver } from \"@warlock.js/cache\";\nimport { config } from \"../config\";\nimport { CascadeAdapter } from \"./adapters/cascade\";\nimport type {\n AllRepositoryOptions,\n ChunkCallback,\n CursorPaginationResult,\n FilterRules,\n PaginationResult,\n QueryBuilderContract,\n RepositoryAdapterContract,\n RepositoryOptions,\n SaveMode,\n TypedAllRepositoryOptions,\n TypedRepositoryOptions,\n TypedRepositoryOptionsWithCursor,\n TypedRepositoryOptionsWithPages,\n} from \"./contracts\";\n\n/**\n * Base repository manager class\n * Provides ORM-agnostic data access layer with support for listing, filtering,\n * caching, pagination, and CRUD operations\n *\n * @template T - The type of records managed by this repository\n *\n * @example\n * // Extend with source\n * class UserRepository extends RepositoryManager<User> {\n * protected source = User;\n * protected filterBy = { email: \"=\", role: [\"in\", \"role\"] };\n * }\n *\n * @example\n * // Direct instantiation with adapter\n * const userRepo = new RepositoryManager<User>(new PrismaAdapter(prisma.user));\n */\nexport class RepositoryManager<T = unknown, F = Record<string, any>> {\n /**\n * Adapter instance (lazy-loaded)\n * @private\n */\n protected _adapter?: RepositoryAdapterContract<T>;\n\n /**\n * Data source reference (Model, Prisma client, table name, etc.)\n * Used by createDefaultAdapter to instantiate the appropriate adapter\n * @protected\n */\n protected source?: any;\n\n // ============================================================================\n // CONFIGURATION PROPERTIES\n // ============================================================================\n\n /**\n * Filter definitions\n * Maps filter keys to filter rules\n * @protected\n */\n protected filterBy: FilterRules = {};\n\n /**\n * Get adapter instance (lazy-loaded)\n * Resolution order:\n * 1. Use injected adapter from constructor\n * 2. Use config-based resolver if available\n * 3. Use createDefaultAdapter\n *\n * @returns Adapter instance\n * @protected\n */\n protected get adapter(): RepositoryAdapterContract<T> {\n if (this._adapter) {\n return this._adapter;\n }\n\n // Try config-based resolver\n const resolver = config.key(\"repository.adapterResolver\");\n\n if (resolver) {\n this._adapter = resolver(this);\n } else {\n this._adapter = config.get(\"repository.defaultAdapter\") || this.createDefaultAdapter();\n }\n\n // Adapter is guaranteed to be set at this point\n return this._adapter!;\n }\n\n /**\n * Default repository options\n * @protected\n */\n protected defaultOptions: Partial<RepositoryOptions> =\n config.get(\"repository.defaultOptions\") || {};\n\n /**\n * Simple select columns (used with simple filter)\n * @protected\n */\n protected simpleSelectColumns: string[] = [];\n\n /**\n * Active column name\n * @default \"isActive\"\n * @protected\n */\n protected isActiveColumn?: string;\n\n /**\n * Active column value\n * @default true\n * @protected\n */\n protected isActiveValue?: any;\n\n /**\n * Repository name (for events)\n * @protected\n */\n protected name?: string;\n\n /**\n * Whether caching is enabled\n * @default true\n * @protected\n */\n protected isCacheable = config.get(\"repository.isCacheable\") ?? true;\n\n /**\n * Cache driver instance\n * @protected\n */\n protected cacheDriver: CacheDriver<any, any> = config.get(\"repository.cacheDriver\") || cache;\n\n /**\n * List of all events callbacks\n */\n protected eventsCallbacks: any[] = [];\n\n /**\n * Constructor\n * @param adapter - Optional adapter instance for direct injection\n */\n public constructor(adapter?: RepositoryAdapterContract<T>) {\n if (adapter) {\n this._adapter = adapter;\n }\n\n // Wait for constructor to finish and all properties are properly registered\n // specially for adapter to get instanciated\n setTimeout(() => {\n this.registerEvents();\n }, 0);\n }\n\n /**\n * Register events\n */\n public registerEvents() {\n this.eventsCallbacks.push(\n ...this.adapter.registerEvents((source: any) => {\n // this.clearCache({ id: source.id });\n this.clearCache();\n }),\n );\n }\n\n /**\n * Unregister events\n */\n public cleanuEvents() {\n this.eventsCallbacks.forEach((callback) => {\n callback();\n });\n this.eventsCallbacks = [];\n }\n\n /**\n * Create default adapter instance\n * Override this method to provide custom adapter creation logic\n *\n * @returns Adapter instance\n * @throws Error if no source is configured\n * @protected\n */\n protected createDefaultAdapter(): RepositoryAdapterContract<T> {\n if (!this.source) {\n throw new Error(\n \"No adapter or source configured. Either pass an adapter to the constructor, \" +\n \"set the 'source' property, or configure 'repository.adapterResolver' in config.\",\n );\n }\n\n // Default: assume source is a Cascade Model\n if (typeof this.source === \"function\") {\n // Lazy import to avoid circular dependencies\n return new CascadeAdapter(this.source) as unknown as RepositoryAdapterContract<T>;\n }\n\n throw new Error(\n \"Cannot create default adapter for this source type. \" +\n \"Please provide an adapter or configure repository.adapterResolver.\",\n );\n }\n\n // ============================================================================\n // UTILITY METHODS\n // ============================================================================\n\n /**\n * Get repository name\n * @returns Repository name\n * @public\n */\n public getName(): string {\n if (this.name) {\n return this.name;\n }\n\n // Try to get collection name from source\n this.name = this.adapter.resolveRepositoryName() || \"unknown\";\n\n return this.name;\n }\n\n /**\n * Get is active column\n */\n protected getIsActiveColumn(): string {\n return this.isActiveColumn || config.key(\"repository.isActiveColumn\") || \"isActive\";\n }\n\n /**\n * Get is active value\n */\n protected getIsActiveValue(): any {\n return this.isActiveValue ?? config.key(\"repository.isActiveValue\") ?? true;\n }\n\n /**\n * Create new query builder instance\n * @returns Query builder\n * @public\n */\n public newQuery() {\n return this.adapter.query();\n }\n\n /**\n * Create new model instance\n * @param data - Model data\n * @returns Model instance\n * @public\n */\n public newModel(data?: any): T {\n return this.adapter.createModel(data);\n }\n\n /**\n * Get active filter object\n * @returns Filter object for active records\n * @protected\n */\n protected getIsActiveFilter() {\n return {\n [this.getIsActiveColumn()]: this.getIsActiveValue(),\n };\n }\n\n // ============================================================================\n // FINDING METHODS\n // ============================================================================\n\n /**\n * Find a record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to record or null\n * @public\n */\n public async find(id: string | number | T): Promise<T | null> {\n return this.adapter.find(id);\n }\n\n /**\n * Find a record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to record or null\n * @public\n */\n public async findBy(column: string, value: any): Promise<T | null> {\n return this.adapter.findBy(column, value);\n }\n\n /**\n * Find active record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findActive(id: string | number | T): Promise<T | null> {\n return this.newQuery()\n .where({\n id,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Find active record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findByActive(column: string, value: any): Promise<T | null> {\n return this.newQuery()\n .where({\n [column]: value,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Get first record matching options\n * @param options - Repository options\n * @returns Promise resolving to first record or null\n * @public\n */\n public async first(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.limit(1).first();\n }\n\n /**\n * Get id by the given filter\n */\n public async firstId(options?: TypedRepositoryOptions<F>): Promise<string | number | undefined> {\n const record = await this.first(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active id\n */\n public async firstActiveId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first cached id\n */\n public async firstCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active cached id\n */\n public async firstActiveCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first uuid\n */\n public async firstUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.first(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active uuid\n */\n public async firstActiveUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached uuid\n */\n public async firstCachedUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active cached uuid\n */\n public async firstActiveCachedUuid(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached record\n */\n public async firstCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached({\n ...options,\n limit: 1,\n } as TypedAllRepositoryOptions<F>);\n\n return results[0] || null;\n }\n\n /**\n * Get first active record\n * @param options - Repository options\n * @returns Promise resolving to first active record or null\n * @public\n */\n public async firstActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get first active cached record\n * @param options - Repository options\n * @returns Promise resolving to first active cached record or null\n * @public\n */\n public async firstActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.firstCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last record matching options\n * @param options - Repository options\n * @returns Promise resolving to last record or null\n * @public\n */\n public async last(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n orderBy: {\n id: \"desc\",\n },\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last cached record\n */\n public async lastCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached(\n this.asTypedAll({\n ...options,\n limit: 1,\n orderBy: { id: \"desc\" },\n }),\n );\n\n return results[0] || null;\n }\n\n /**\n * Get last active record\n * @param options - Repository options\n * @returns Promise resolving to last active record or null\n * @public\n */\n public async lastActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.last({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last active cached record\n * @param options - Repository options\n * @returns Promise resolving to last active cached record or null\n * @public\n */\n public async lastActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.lastCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n // ============================================================================\n // LISTING METHODS\n // ============================================================================\n\n /**\n * List records with pagination\n * Supports both traditional page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n *\n * @example\n * // Traditional pagination (default)\n * const result = await repo.list({ page: 2, limit: 10 });\n *\n * @example\n * // Cursor pagination\n * const result = await repo.list({\n * paginationMode: \"cursor\",\n * limit: 20,\n * cursor: lastId,\n * direction: \"next\"\n * });\n *\n * @public\n */\n public async list(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async list(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async list(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl(options);\n }\n\n /**\n * Internal list implementation - no overloads, handles union type\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @private\n */\n private async _listImpl(\n options?: RepositoryOptions,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options as TypedRepositoryOptions<F>);\n const paginationMode = opts.paginationMode || \"pages\";\n\n // applyOptionsToQuery handles cursor phase 1 (WHERE + ORDER BY) internally\n // when paginationMode === \"cursor\", ensuring the cursor column is always\n // the primary sort key before any other options are applied.\n this.applyOptionsToQuery(query, opts);\n\n if (paginationMode === \"cursor\") {\n return query.cursorPaginate({\n limit: opts.limit || opts.defaultLimit || 15,\n cursor: opts.cursor,\n direction: opts.direction,\n cursorColumn: opts.cursorColumn,\n });\n }\n\n // Traditional page-based pagination (default)\n const page = opts.page || 1;\n const limit = opts.limit || opts.defaultLimit || 15;\n\n return query.paginate(page, limit);\n }\n\n /**\n * List all records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of records\n * @public\n */\n public async all(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n const query = this.newQuery();\n\n // Apply options\n const opts = this.prepareOptions(options);\n this.applyOptionsToQuery(query, opts);\n\n return query.get();\n }\n\n /**\n * List active records with pagination\n * Supports both page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async listActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async listActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async listActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * List all active records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of active records\n * @public\n */\n public async allActive(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return this.all(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // EXISTENCE CHECKS\n // ============================================================================\n\n /**\n * Check if record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if exists\n * @public\n */\n public async exists(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.first(filter));\n }\n\n /**\n * Check if active record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async existsActive(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.firstActive(filter));\n }\n\n /**\n * Check if record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if exists\n * @public\n */\n public async idExists(id: number | string): Promise<boolean> {\n return !!(await this.find(id));\n }\n\n /**\n * Check if active record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async idExistsActive(id: number | string): Promise<boolean> {\n return !!(await this.findActive(id));\n }\n\n /**\n * Prepare options — merges defaultOptions with caller options.\n * Returning as TypedRepositoryOptions<F> ensures internal composition\n * (spread + forward) satisfies the typed public API without per-call casts.\n */\n protected prepareOptions(options?: TypedRepositoryOptions<F>): TypedRepositoryOptions<F> {\n return { ...(this.defaultOptions || {}), ...(options || {}) } as TypedRepositoryOptions<F>;\n }\n\n /**\n * Cast a plain `RepositoryOptions` spread to the typed variant.\n * Used internally when composing options across method calls where the\n * spread breaks the F-generic inference chain.\n */\n protected asTyped(opts: RepositoryOptions): TypedRepositoryOptions<F> {\n return opts as TypedRepositoryOptions<F>;\n }\n\n protected asTypedAll(opts: AllRepositoryOptions): TypedAllRepositoryOptions<F> {\n return opts as TypedAllRepositoryOptions<F>;\n }\n\n // ============================================================================\n // HELPER METHODS\n // ============================================================================\n\n /**\n * Apply repository options to query\n * @param query - Query builder instance\n * @param options - Repository options\n * @protected\n */\n protected applyOptionsToQuery(\n query: QueryBuilderContract<T>,\n options: RepositoryOptions,\n ): RepositoryOptions {\n // ── Cursor phase 1: WHERE + ORDER BY ──────────────────────────────────────\n // Must run first so the cursor column is always the PRIMARY sort key.\n // Any orderBy appended below becomes a harmless secondary sort key.\n if (options.paginationMode === \"cursor\") {\n const cursorColumn = options.cursorColumn ?? \"id\";\n const direction = options.direction ?? \"next\";\n\n if (options.cursor) {\n query.where(cursorColumn, direction === \"next\" ? \">\" : \"<\", options.cursor);\n }\n\n query.orderBy(cursorColumn, direction === \"next\" ? \"asc\" : \"desc\");\n\n // Warn and strip orderBy that targets the same column as the cursor —\n // it would produce a duplicate / conflicting sort clause.\n if (options.orderBy) {\n const conflictingKeys = Array.isArray(options.orderBy)\n ? [options.orderBy[0]]\n : typeof options.orderBy === \"object\"\n ? Object.keys(options.orderBy)\n : [];\n\n if (conflictingKeys.includes(cursorColumn)) {\n console.warn(\n `[Repository] orderBy on \"${cursorColumn}\" conflicts with cursorColumn and will be ignored. ` +\n `Cursor pagination owns the sort order for its cursor column.`,\n );\n options = { ...options, orderBy: undefined };\n }\n }\n }\n\n // Apply filters\n if (this.filterBy && Object.keys(this.filterBy).length > 0) {\n query.applyFilters(this.filterBy, options, {\n dateFormat: \"DD-MM-YYYY\",\n dateTimeFormat: \"DD-MM-YYYY HH:mm:ss\",\n });\n }\n\n // Apply select\n if (options.select) {\n query.select(options.select);\n }\n\n // Apply deselect\n if (options.deselect) {\n query.deselect(options.deselect);\n }\n\n if (options.simpleSelect && this.simpleSelectColumns.length > 0) {\n query.select(this.simpleSelectColumns);\n }\n\n // Apply ordering\n if (options.orderBy) {\n if (options.orderBy === \"random\") {\n query.random();\n } else if (Array.isArray(options.orderBy)) {\n query.orderBy(options.orderBy[0], options.orderBy[1]);\n } else if (typeof options.orderBy === \"object\") {\n query.sortBy(options.orderBy);\n }\n }\n\n // Apply limit (for non-paginated queries)\n if (options.limit && options.paginate === false) {\n query.limit(options.limit);\n }\n\n // Apply custom perform function\n if (options?.perform) {\n options.perform(query, options);\n }\n\n return options;\n }\n\n // ============================================================================\n // CRUD OPERATIONS\n // ============================================================================\n\n /**\n * Create a new record\n * @param data - Record data\n * @returns Promise resolving to created record\n * @public\n */\n public async create(data: any): Promise<T> {\n return this.adapter.create(data);\n }\n\n /**\n * Update a record by ID\n * @param id - Record ID\n * @param data - Updated data\n * @returns Promise resolving to updated record\n * @public\n */\n public async update(id: string | number | any, data: any): Promise<T> {\n return this.adapter.update(id, data);\n }\n\n /**\n * Delete a record by ID\n * @param id - Record ID\n * @returns Promise that resolves when deletion is complete\n * @public\n */\n public async delete(id: string | number): Promise<void> {\n return this.adapter.delete(id);\n }\n\n // ============================================================================\n // BULK OPERATIONS\n // ============================================================================\n\n /**\n * Update multiple records matching filter\n * @param filter - Filter criteria\n * @param data - Updated data\n * @returns Promise resolving to number of updated records\n * @public\n */\n public async updateMany(filter: any, data: any): Promise<number> {\n return this.adapter.updateMany(filter, data);\n }\n\n /**\n * Delete multiple records matching filter\n * @param filter - Filter criteria\n * @returns Promise resolving to number of deleted records\n * @public\n */\n public async deleteMany(filter: any): Promise<number> {\n return this.adapter.deleteMany(filter);\n }\n\n // ============================================================================\n // CHUNKING\n // ============================================================================\n\n /**\n * Process records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunk(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.chunk(size, callback);\n }\n\n /**\n * Process active records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunkActive(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n return this.chunk(size, callback, this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Get latest records (ordered by ID descending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async latest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...options,\n });\n }\n\n /**\n * Get oldest records (ordered by ID ascending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async oldest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...options,\n });\n }\n\n /**\n * Get latest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async latestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * Get oldest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async oldestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n // ============================================================================\n // LIFECYCLE HOOKS (Override these in child classes)\n // ============================================================================\n\n /**\n * Called before listing records\n * @param options - Repository options\n * @protected\n */\n protected async beforeListing(options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after listing records\n * @param result - Pagination result\n * @param options - Repository options\n * @protected\n */\n protected async onList(result: PaginationResult<T>, options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before creating a record\n * @param data - Record data\n * @protected\n */\n protected async onCreating(data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after creating a record\n * @param record - Created record\n * @param data - Original data\n * @protected\n */\n protected async onCreate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before updating a record\n * @param id - Record ID\n * @param data - Updated data\n * @protected\n */\n protected async onUpdating(id: string | number, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after updating a record\n * @param record - Updated record\n * @param data - Original data\n * @protected\n */\n protected async onUpdate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before saving a record (create or update)\n * @param data - Record data\n * @param mode - Save mode\n * @protected\n */\n protected async onSaving(data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after saving a record (create or update)\n * @param record - Saved record\n * @param data - Original data\n * @param mode - Save mode\n * @protected\n */\n protected async onSave(record: T, data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDeleting(id: string | number): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDelete(id: string | number): Promise<void> {\n // Override in child class\n }\n\n // ============================================================================\n // COUNT METHODS\n // ============================================================================\n\n /**\n * Count total records matching options\n * @param options - Repository options\n * @returns Promise resolving to count\n * @public\n */\n public async count(options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.count();\n }\n\n /**\n * Count total active records\n * @param options - Repository options\n * @returns Promise resolving to count of active records\n * @public\n */\n public async countActive(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.count(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Count records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count\n * @public\n */\n public async countCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.count(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"count\", opts);\n let count = await this.cacheDriver.get(cacheKey);\n\n if (count !== undefined) return count;\n\n count = await this.count(options);\n await this.cache(cacheKey, count);\n return count;\n }\n\n /**\n * Count active records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count of active records\n * @public\n */\n public async countActiveCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.countCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CACHING METHODS\n // ============================================================================\n\n /**\n * Set cache driver\n * @param driver - Cache driver instance\n * @returns This repository for chaining\n * @public\n */\n public setCacheDriver(driver: any): this {\n this.cacheDriver = driver;\n return this;\n }\n\n /**\n * Get cache driver\n * @returns Cache driver instance\n * @public\n */\n public getCacheDriver(): any {\n return this.cacheDriver;\n }\n\n /**\n * Generate cache key\n * @param key - Base key or object\n * @param moreOptions - Additional options for key\n * @returns Generated cache key\n * @protected\n */\n protected cacheKey(key: string | Record<string, any>, moreOptions?: Record<string, any>): string {\n let cacheKey = `repositories.${this.getName()}`;\n\n if (key) {\n cacheKey += \".\" + (typeof key === \"string\" ? key : JSON.stringify(key));\n }\n\n if (moreOptions) {\n cacheKey += \".\" + JSON.stringify(moreOptions);\n }\n\n return cacheKey;\n }\n\n /**\n * Cache a value\n * @param key - Cache key\n * @param value - Value to cache\n * @protected\n */\n protected async cache(key: string, value: any): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n await this.cacheDriver.set(key, value);\n }\n\n /**\n * Get cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached record or null\n * @public\n */\n public async getCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * @alias getCached\n */\n public async findCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * Get cached record by column value\n * @param column - Column name\n * @param value - Column value\n * @param cacheKeyOptions - Additional cache key options\n * @returns Promise resolving to cached record or undefined\n * @public\n */\n public async getCachedBy(\n column: string,\n value: any,\n cacheKeyOptions?: Record<string, any>,\n ): Promise<T | null> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.findBy(column, value);\n }\n\n const cacheKey = this.cacheKey(`${column}.${value}`, cacheKeyOptions);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return this.adapter.deserializeModel(cachedData);\n }\n\n const model = await this.findBy(column, value);\n\n if (!model) return null;\n\n this.cache(cacheKey, this.adapter.serializeModel(model));\n return model;\n }\n\n /**\n * Get all cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached records\n * @public\n */\n public async allCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.all(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"all\", opts);\n const cachedData = await this.cacheDriver.get<T[]>(cacheKey);\n\n if (cachedData) {\n return cachedData.map((record) => this.adapter.deserializeModel(record));\n }\n\n const records = await this.all(options);\n await this.cache(\n cacheKey,\n records.map((record) => this.adapter.serializeModel(record)),\n );\n return records;\n }\n\n /**\n * Get all active cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached active records\n * @public\n */\n public async allActiveCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return await this.allCached(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * List cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result\n * @public\n */\n public async listCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n if (!this.isCacheable || !this.cacheDriver) {\n return (await this._listImpl(options)) as PaginationResult<T>;\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"list\", opts);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return {\n data: (cachedData?.data || []).map((record: T) => this.adapter.deserializeModel(record)),\n pagination: cachedData.pagination,\n };\n }\n\n const result = (await this._listImpl(options)) as PaginationResult<T>;\n\n await this.cache(cacheKey, {\n data: result.data.map((record) => this.adapter.serializeModel(record)),\n pagination: result.pagination,\n });\n return result;\n }\n\n /**\n * List active cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result of active records\n * @public\n */\n public async listActiveCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n return await this.listCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Get active cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached active record or undefined\n * @public\n */\n public async getActiveCached(id: string | number): Promise<T | undefined> {\n const model = await this.getCached(id);\n if (!model) return undefined;\n\n if (typeof (model as any).get === \"function\") {\n return (model as any).get(this.getIsActiveColumn()) === this.getIsActiveValue()\n ? model\n : undefined;\n }\n\n // Check if model is active\n const isActive = (model as any)[this.getIsActiveColumn()] === this.getIsActiveValue();\n return isActive ? model : undefined;\n }\n\n /**\n * Cache a model\n * @param model - Model to cache\n * @public\n */\n public async cacheModel(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n *\n * @example\n * ```typescript\n */\n public cleanup() {\n this.clearCache();\n this.cleanuEvents();\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n * export const cleanup = usersRepository.cleanup.bind(usersRepository);\n */\n public $cleanup() {\n this.cleanup();\n this.cacheDriver.flush();\n }\n\n /**\n * Clear all cache for this repository\n * @public\n */\n public async clearCache(key?: CacheKey): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n await this.cacheDriver.removeNamespace(this.cacheKey(key || \"\"));\n }\n\n /**\n * Clear cache for specific model\n * @param model - Model to clear cache for\n * @public\n */\n public async clearModelCache(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cacheDriver.removeNamespace(cacheKey);\n }\n\n /**\n * Map documents to models\n * @param documents - Array of document data\n * @returns Array of model instances\n * @protected\n */\n protected mapModels(documents: any[]): T[] {\n return documents.map((doc) => this.newModel(doc));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Find or create a record\n * @param where - Conditions to find by\n * @param data - Data to create if not found\n * @returns Promise resolving to found or created record\n * @public\n */\n public async findOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n return model || (await this.create(data));\n }\n\n /**\n * Update or create a record\n * @param where - Conditions to find by\n * @param data - Data to update or create\n * @returns Promise resolving to updated or created record\n * @public\n */\n public async updateOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n if (model) {\n return await this.update(model, data);\n }\n return await this.create(data);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repository.manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"sourcesContent":["import { cache, CacheKey, type CacheDriver } from \"@warlock.js/cache\";\nimport { config } from \"../config\";\nimport { CascadeAdapter } from \"./adapters/cascade\";\nimport type {\n AllRepositoryOptions,\n ChunkCallback,\n CursorPaginationResult,\n FilterRules,\n PaginationResult,\n QueryBuilderContract,\n RepositoryAdapterContract,\n RepositoryOptions,\n SaveMode,\n TypedAllRepositoryOptions,\n TypedRepositoryOptions,\n TypedRepositoryOptionsWithCursor,\n TypedRepositoryOptionsWithPages,\n} from \"./contracts\";\n\n/**\n * Base repository manager class\n * Provides ORM-agnostic data access layer with support for listing, filtering,\n * caching, pagination, and CRUD operations\n *\n * @template T - The type of records managed by this repository\n *\n * @example\n * // Extend with source\n * class UserRepository extends RepositoryManager<User> {\n * protected source = User;\n * protected filterBy = { email: \"=\", role: [\"in\", \"role\"] };\n * }\n *\n * @example\n * // Direct instantiation with adapter\n * const userRepo = new RepositoryManager<User>(new PrismaAdapter(prisma.user));\n */\nexport class RepositoryManager<T = unknown, F = Record<string, any>> {\n /**\n * Adapter instance (lazy-loaded)\n * @private\n */\n protected _adapter?: RepositoryAdapterContract<T>;\n\n /**\n * Data source reference (Model, Prisma client, table name, etc.)\n * Used by createDefaultAdapter to instantiate the appropriate adapter\n * @protected\n */\n protected source?: any;\n\n // ============================================================================\n // CONFIGURATION PROPERTIES\n // ============================================================================\n\n /**\n * Filter definitions\n * Maps filter keys to filter rules\n * @protected\n */\n protected filterBy: FilterRules = {};\n\n /**\n * Get adapter instance (lazy-loaded)\n * Resolution order:\n * 1. Use injected adapter from constructor\n * 2. Use config-based resolver if available\n * 3. Use createDefaultAdapter\n *\n * @returns Adapter instance\n * @protected\n */\n protected get adapter(): RepositoryAdapterContract<T> {\n if (this._adapter) {\n return this._adapter;\n }\n\n // Try config-based resolver\n const resolver = config.key(\"repository.adapterResolver\");\n\n if (resolver) {\n this._adapter = resolver(this);\n } else {\n this._adapter = config.get(\"repository.defaultAdapter\") || this.createDefaultAdapter();\n }\n\n // Adapter is guaranteed to be set at this point\n return this._adapter!;\n }\n\n /**\n * Default repository options\n * @protected\n */\n protected defaultOptions: Partial<RepositoryOptions> =\n config.get(\"repository.defaultOptions\") || {};\n\n /**\n * Simple select columns (used with simple filter)\n * @protected\n */\n protected simpleSelectColumns: string[] = [];\n\n /**\n * Active column name\n * @default \"isActive\"\n * @protected\n */\n protected isActiveColumn?: string;\n\n /**\n * Active column value\n * @default true\n * @protected\n */\n protected isActiveValue?: any;\n\n /**\n * Repository name (for events)\n * @protected\n */\n protected name?: string;\n\n /**\n * Whether caching is enabled\n * @default true\n * @protected\n */\n protected isCacheable = config.get(\"repository.isCacheable\") ?? true;\n\n /**\n * Cache driver instance\n * @protected\n */\n protected cacheDriver: CacheDriver<any, any> = config.get(\"repository.cacheDriver\") || cache;\n\n /**\n * List of all events callbacks\n */\n protected eventsCallbacks: any[] = [];\n\n /**\n * Constructor\n * @param adapter - Optional adapter instance for direct injection\n */\n public constructor(adapter?: RepositoryAdapterContract<T>) {\n if (adapter) {\n this._adapter = adapter;\n }\n\n // Wait for constructor to finish and all properties are properly registered\n // specially for adapter to get instanciated\n setTimeout(() => {\n this.registerEvents();\n }, 0);\n }\n\n /**\n * Register events\n */\n public registerEvents() {\n // Scheduled via setTimeout(0) in the constructor, so this runs detached:\n // the adapter getter (or its event wiring) can throw and there is no caller\n // to catch it. Guard the whole body so a registration failure is logged\n // instead of surfacing as an uncaught exception that crashes the process.\n try {\n this.eventsCallbacks.push(\n ...this.adapter.registerEvents((source: any) => {\n // this.clearCache({ id: source.id });\n this.clearCache();\n }),\n );\n } catch (error) {\n console.error(`[Repository] Failed to register events:`, error);\n }\n }\n\n /**\n * Unregister events\n */\n public cleanuEvents() {\n this.eventsCallbacks.forEach((callback) => {\n callback();\n });\n this.eventsCallbacks = [];\n }\n\n /**\n * Create default adapter instance\n * Override this method to provide custom adapter creation logic\n *\n * @returns Adapter instance\n * @throws Error if no source is configured\n * @protected\n */\n protected createDefaultAdapter(): RepositoryAdapterContract<T> {\n if (!this.source) {\n throw new Error(\n \"No adapter or source configured. Either pass an adapter to the constructor, \" +\n \"set the 'source' property, or configure 'repository.adapterResolver' in config.\",\n );\n }\n\n // Default: assume source is a Cascade Model\n if (typeof this.source === \"function\") {\n // Lazy import to avoid circular dependencies\n return new CascadeAdapter(this.source) as unknown as RepositoryAdapterContract<T>;\n }\n\n throw new Error(\n \"Cannot create default adapter for this source type. \" +\n \"Please provide an adapter or configure repository.adapterResolver.\",\n );\n }\n\n // ============================================================================\n // UTILITY METHODS\n // ============================================================================\n\n /**\n * Get repository name\n * @returns Repository name\n * @public\n */\n public getName(): string {\n if (this.name) {\n return this.name;\n }\n\n // Try to get collection name from source\n this.name = this.adapter.resolveRepositoryName() || \"unknown\";\n\n return this.name;\n }\n\n /**\n * Get is active column\n */\n protected getIsActiveColumn(): string {\n return this.isActiveColumn || config.key(\"repository.isActiveColumn\") || \"isActive\";\n }\n\n /**\n * Get is active value\n */\n protected getIsActiveValue(): any {\n return this.isActiveValue ?? config.key(\"repository.isActiveValue\") ?? true;\n }\n\n /**\n * Create new query builder instance\n * @returns Query builder\n * @public\n */\n public newQuery() {\n return this.adapter.query();\n }\n\n /**\n * Create new model instance\n * @param data - Model data\n * @returns Model instance\n * @public\n */\n public newModel(data?: any): T {\n return this.adapter.createModel(data);\n }\n\n /**\n * Get active filter object\n * @returns Filter object for active records\n * @protected\n */\n protected getIsActiveFilter() {\n return {\n [this.getIsActiveColumn()]: this.getIsActiveValue(),\n };\n }\n\n // ============================================================================\n // FINDING METHODS\n // ============================================================================\n\n /**\n * Find a record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to record or null\n * @public\n */\n public async find(id: string | number | T): Promise<T | null> {\n return this.adapter.find(id);\n }\n\n /**\n * Find a record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to record or null\n * @public\n */\n public async findBy(column: string, value: any): Promise<T | null> {\n return this.adapter.findBy(column, value);\n }\n\n /**\n * Find active record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findActive(id: string | number | T): Promise<T | null> {\n return this.newQuery()\n .where({\n id,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Find active record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findByActive(column: string, value: any): Promise<T | null> {\n return this.newQuery()\n .where({\n [column]: value,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Get first record matching options\n * @param options - Repository options\n * @returns Promise resolving to first record or null\n * @public\n */\n public async first(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.limit(1).first();\n }\n\n /**\n * Get id by the given filter\n */\n public async firstId(options?: TypedRepositoryOptions<F>): Promise<string | number | undefined> {\n const record = await this.first(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active id\n */\n public async firstActiveId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first cached id\n */\n public async firstCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active cached id\n */\n public async firstActiveCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first uuid\n */\n public async firstUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.first(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active uuid\n */\n public async firstActiveUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached uuid\n */\n public async firstCachedUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active cached uuid\n */\n public async firstActiveCachedUuid(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached record\n */\n public async firstCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached({\n ...options,\n limit: 1,\n } as TypedAllRepositoryOptions<F>);\n\n return results[0] || null;\n }\n\n /**\n * Get first active record\n * @param options - Repository options\n * @returns Promise resolving to first active record or null\n * @public\n */\n public async firstActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get first active cached record\n * @param options - Repository options\n * @returns Promise resolving to first active cached record or null\n * @public\n */\n public async firstActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.firstCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last record matching options\n * @param options - Repository options\n * @returns Promise resolving to last record or null\n * @public\n */\n public async last(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n orderBy: {\n id: \"desc\",\n },\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last cached record\n */\n public async lastCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached(\n this.asTypedAll({\n ...options,\n limit: 1,\n orderBy: { id: \"desc\" },\n }),\n );\n\n return results[0] || null;\n }\n\n /**\n * Get last active record\n * @param options - Repository options\n * @returns Promise resolving to last active record or null\n * @public\n */\n public async lastActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.last({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last active cached record\n * @param options - Repository options\n * @returns Promise resolving to last active cached record or null\n * @public\n */\n public async lastActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.lastCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n // ============================================================================\n // LISTING METHODS\n // ============================================================================\n\n /**\n * List records with pagination\n * Supports both traditional page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n *\n * @example\n * // Traditional pagination (default)\n * const result = await repo.list({ page: 2, limit: 10 });\n *\n * @example\n * // Cursor pagination\n * const result = await repo.list({\n * paginationMode: \"cursor\",\n * limit: 20,\n * cursor: lastId,\n * direction: \"next\"\n * });\n *\n * @public\n */\n public async list(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async list(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async list(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl(options);\n }\n\n /**\n * Internal list implementation - no overloads, handles union type\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @private\n */\n private async _listImpl(\n options?: RepositoryOptions,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options as TypedRepositoryOptions<F>);\n const paginationMode = opts.paginationMode || \"pages\";\n\n // applyOptionsToQuery handles cursor phase 1 (WHERE + ORDER BY) internally\n // when paginationMode === \"cursor\", ensuring the cursor column is always\n // the primary sort key before any other options are applied.\n this.applyOptionsToQuery(query, opts);\n\n if (paginationMode === \"cursor\") {\n return query.cursorPaginate({\n limit: opts.limit || opts.defaultLimit || 15,\n cursor: opts.cursor,\n direction: opts.direction,\n cursorColumn: opts.cursorColumn,\n });\n }\n\n // Traditional page-based pagination (default)\n const page = opts.page || 1;\n const limit = opts.limit || opts.defaultLimit || 15;\n\n return query.paginate(page, limit);\n }\n\n /**\n * List all records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of records\n * @public\n */\n public async all(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n const query = this.newQuery();\n\n // Apply options. all() never paginates, so flag paginate:false explicitly —\n // this lets applyOptionsToQuery honor a provided `limit` on this path (e.g.\n // firstCached/lastCached call all({ limit: 1 }) and rely on LIMIT 1 being\n // applied instead of fetching+caching the entire table).\n const opts = this.prepareOptions(options);\n opts.paginate = false;\n this.applyOptionsToQuery(query, opts);\n\n return query.get();\n }\n\n /**\n * List active records with pagination\n * Supports both page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async listActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async listActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async listActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * List all active records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of active records\n * @public\n */\n public async allActive(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return this.all(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // EXISTENCE CHECKS\n // ============================================================================\n\n /**\n * Check if record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if exists\n * @public\n */\n public async exists(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.first(filter));\n }\n\n /**\n * Check if active record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async existsActive(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.firstActive(filter));\n }\n\n /**\n * Check if record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if exists\n * @public\n */\n public async idExists(id: number | string): Promise<boolean> {\n return !!(await this.find(id));\n }\n\n /**\n * Check if active record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async idExistsActive(id: number | string): Promise<boolean> {\n return !!(await this.findActive(id));\n }\n\n /**\n * Prepare options — merges defaultOptions with caller options.\n * Returning as TypedRepositoryOptions<F> ensures internal composition\n * (spread + forward) satisfies the typed public API without per-call casts.\n */\n protected prepareOptions(options?: TypedRepositoryOptions<F>): TypedRepositoryOptions<F> {\n return { ...(this.defaultOptions || {}), ...(options || {}) } as TypedRepositoryOptions<F>;\n }\n\n /**\n * Cast a plain `RepositoryOptions` spread to the typed variant.\n * Used internally when composing options across method calls where the\n * spread breaks the F-generic inference chain.\n */\n protected asTyped(opts: RepositoryOptions): TypedRepositoryOptions<F> {\n return opts as TypedRepositoryOptions<F>;\n }\n\n protected asTypedAll(opts: AllRepositoryOptions): TypedAllRepositoryOptions<F> {\n return opts as TypedAllRepositoryOptions<F>;\n }\n\n // ============================================================================\n // HELPER METHODS\n // ============================================================================\n\n /**\n * Apply repository options to query\n * @param query - Query builder instance\n * @param options - Repository options\n * @protected\n */\n protected applyOptionsToQuery(\n query: QueryBuilderContract<T>,\n options: RepositoryOptions,\n ): RepositoryOptions {\n // ── Cursor phase 1: WHERE + ORDER BY ──────────────────────────────────────\n // Must run first so the cursor column is always the PRIMARY sort key.\n // Any orderBy appended below becomes a harmless secondary sort key.\n if (options.paginationMode === \"cursor\") {\n const cursorColumn = options.cursorColumn ?? \"id\";\n const direction = options.direction ?? \"next\";\n\n if (options.cursor) {\n query.where(cursorColumn, direction === \"next\" ? \">\" : \"<\", options.cursor);\n }\n\n query.orderBy(cursorColumn, direction === \"next\" ? \"asc\" : \"desc\");\n\n // Warn and strip orderBy that targets the same column as the cursor —\n // it would produce a duplicate / conflicting sort clause.\n if (options.orderBy) {\n const conflictingKeys = Array.isArray(options.orderBy)\n ? [options.orderBy[0]]\n : typeof options.orderBy === \"object\"\n ? Object.keys(options.orderBy)\n : [];\n\n if (conflictingKeys.includes(cursorColumn)) {\n console.warn(\n `[Repository] orderBy on \"${cursorColumn}\" conflicts with cursorColumn and will be ignored. ` +\n `Cursor pagination owns the sort order for its cursor column.`,\n );\n options = { ...options, orderBy: undefined };\n }\n }\n }\n\n // Apply filters\n if (this.filterBy && Object.keys(this.filterBy).length > 0) {\n query.applyFilters(this.filterBy, options, {\n dateFormat: \"DD-MM-YYYY\",\n dateTimeFormat: \"DD-MM-YYYY HH:mm:ss\",\n });\n }\n\n // Apply select\n if (options.select) {\n query.select(options.select);\n }\n\n // Apply deselect\n if (options.deselect) {\n query.deselect(options.deselect);\n }\n\n if (options.simpleSelect && this.simpleSelectColumns.length > 0) {\n query.select(this.simpleSelectColumns);\n }\n\n // Apply ordering\n if (options.orderBy) {\n if (options.orderBy === \"random\") {\n // Pass the explicit limit through to random() when set. For the MongoDB\n // driver `$sample` REQUIRES a size — with no argument it silently\n // defaults to 1000, truncating larger result sets. Forwarding the\n // caller's limit keeps the random sample bounded to what they asked for.\n query.random(options.limit);\n } else if (Array.isArray(options.orderBy)) {\n query.orderBy(options.orderBy[0], options.orderBy[1]);\n } else if (typeof options.orderBy === \"object\") {\n query.sortBy(options.orderBy);\n }\n } else if (options.sortBy) {\n // Honor the standalone sortBy/sortDirection pair as a single orderBy clause\n // (only when no explicit orderBy was provided, which always wins).\n query.orderBy(options.sortBy, options.sortDirection ?? \"asc\");\n }\n\n // Apply limit (for non-paginated queries).\n // The all() path sets `paginate: false` explicitly so a provided `limit`\n // is honored there (otherwise firstCached/lastCached, which delegate to\n // all({ limit: 1 }), would drop the LIMIT and fetch the whole table).\n // Page-based pagination leaves paginate undefined and owns LIMIT itself.\n if (options.limit && options.paginate === false) {\n query.limit(options.limit);\n }\n\n // Apply custom perform function\n if (options?.perform) {\n options.perform(query, options);\n }\n\n return options;\n }\n\n // ============================================================================\n // CRUD OPERATIONS\n // ============================================================================\n\n /**\n * Create a new record\n * @param data - Record data\n * @returns Promise resolving to created record\n * @public\n */\n public async create(data: any): Promise<T> {\n await this.onSaving(data, \"create\");\n await this.onCreating(data);\n\n const result = await this.adapter.create(data);\n\n await this.onCreate(result, data);\n await this.onSave(result, data, \"create\");\n\n return result;\n }\n\n /**\n * Update a record by ID\n * @param id - Record ID\n * @param data - Updated data\n * @returns Promise resolving to updated record\n * @public\n */\n public async update(id: string | number | any, data: any): Promise<T> {\n await this.onSaving(data, \"update\");\n await this.onUpdating(id, data);\n\n const result = await this.adapter.update(id, data);\n\n await this.onUpdate(result, data);\n await this.onSave(result, data, \"update\");\n\n return result;\n }\n\n /**\n * Delete a record by ID\n * @param id - Record ID\n * @returns Promise that resolves when deletion is complete\n * @public\n */\n public async delete(id: string | number): Promise<void> {\n await this.onDeleting(id);\n\n await this.adapter.delete(id);\n\n await this.onDelete(id);\n }\n\n // ============================================================================\n // BULK OPERATIONS\n // ============================================================================\n\n /**\n * Update multiple records matching filter\n * @param filter - Filter criteria\n * @param data - Updated data\n * @returns Promise resolving to number of updated records\n * @public\n */\n public async updateMany(filter: any, data: any): Promise<number> {\n return this.adapter.updateMany(filter, data);\n }\n\n /**\n * Delete multiple records matching filter\n * @param filter - Filter criteria\n * @returns Promise resolving to number of deleted records\n * @public\n */\n public async deleteMany(filter: any): Promise<number> {\n return this.adapter.deleteMany(filter);\n }\n\n // ============================================================================\n // CHUNKING\n // ============================================================================\n\n /**\n * Process records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunk(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.chunk(size, callback);\n }\n\n /**\n * Process active records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunkActive(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n return this.chunk(size, callback, this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Get latest records (ordered by ID descending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async latest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...options,\n });\n }\n\n /**\n * Get oldest records (ordered by ID ascending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async oldest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...options,\n });\n }\n\n /**\n * Get latest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async latestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * Get oldest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async oldestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n // ============================================================================\n // LIFECYCLE HOOKS (Override these in child classes)\n // ============================================================================\n\n /**\n * Called before listing records\n * @param options - Repository options\n * @protected\n */\n protected async beforeListing(options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after listing records\n * @param result - Pagination result\n * @param options - Repository options\n * @protected\n */\n protected async onList(result: PaginationResult<T>, options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before creating a record\n * @param data - Record data\n * @protected\n */\n protected async onCreating(data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after creating a record\n * @param record - Created record\n * @param data - Original data\n * @protected\n */\n protected async onCreate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before updating a record\n * @param id - Record ID\n * @param data - Updated data\n * @protected\n */\n protected async onUpdating(id: string | number, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after updating a record\n * @param record - Updated record\n * @param data - Original data\n * @protected\n */\n protected async onUpdate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before saving a record (create or update)\n * @param data - Record data\n * @param mode - Save mode\n * @protected\n */\n protected async onSaving(data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after saving a record (create or update)\n * @param record - Saved record\n * @param data - Original data\n * @param mode - Save mode\n * @protected\n */\n protected async onSave(record: T, data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDeleting(id: string | number): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDelete(id: string | number): Promise<void> {\n // Override in child class\n }\n\n // ============================================================================\n // COUNT METHODS\n // ============================================================================\n\n /**\n * Count total records matching options\n * @param options - Repository options\n * @returns Promise resolving to count\n * @public\n */\n public async count(options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.count();\n }\n\n /**\n * Count total active records\n * @param options - Repository options\n * @returns Promise resolving to count of active records\n * @public\n */\n public async countActive(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.count(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Count records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count\n * @public\n */\n public async countCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.count(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"count\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedCount = await this.cacheDriver.get(cacheKey);\n\n // Treat BOTH null and undefined as a cache miss: every shipped cache\n // driver returns `null` (not `undefined`) on a miss, so checking only\n // for `undefined` would return that null as the count and never cache.\n if (cachedCount !== null && cachedCount !== undefined) {\n return cachedCount;\n }\n }\n\n const count = await this.count(options);\n await this.cache(cacheKey, count);\n return count;\n }\n\n /**\n * Count active records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count of active records\n * @public\n */\n public async countActiveCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.countCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CACHING METHODS\n // ============================================================================\n\n /**\n * Set cache driver\n * @param driver - Cache driver instance\n * @returns This repository for chaining\n * @public\n */\n public setCacheDriver(driver: any): this {\n this.cacheDriver = driver;\n return this;\n }\n\n /**\n * Get cache driver\n * @returns Cache driver instance\n * @public\n */\n public getCacheDriver(): any {\n return this.cacheDriver;\n }\n\n /**\n * Generate cache key\n * @param key - Base key or object\n * @param moreOptions - Additional options for key\n * @returns Generated cache key\n * @protected\n */\n protected cacheKey(key: string | Record<string, any>, moreOptions?: Record<string, any>): string {\n let cacheKey = `repositories.${this.getName()}`;\n\n if (key) {\n cacheKey += \".\" + (typeof key === \"string\" ? key : this.stableStringify(key));\n }\n\n if (moreOptions) {\n // `purgeCache` is a control flag, not a query parameter — it must NOT\n // affect the key, otherwise a purge would refresh a different key than a\n // normal read consults, defeating the purpose.\n const { purgeCache: _purgeCache, ...keyOptions } = moreOptions;\n cacheKey += \".\" + this.stableStringify(keyOptions);\n }\n\n return cacheKey;\n }\n\n /**\n * Deterministically serialize a value for use in a cache key.\n *\n * Unlike raw `JSON.stringify`, object keys are recursively sorted so that\n * `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same key. Function-valued\n * options (e.g. a `perform` callback) are represented by a stable marker\n * (`[fn:<name>]`) rather than being silently dropped, so two distinct\n * callbacks do not collide on the same cache key.\n */\n protected stableStringify(value: any): string {\n const seen = new WeakSet<object>();\n\n const normalize = (input: any): any => {\n if (typeof input === \"function\") {\n return `[fn:${input.name || \"anonymous\"}]`;\n }\n\n if (input === null || typeof input !== \"object\") {\n return input;\n }\n\n // Guard against circular references — represent them with a stable marker.\n if (seen.has(input)) {\n return \"[circular]\";\n }\n\n seen.add(input);\n\n if (Array.isArray(input)) {\n return input.map((item) => normalize(item));\n }\n\n const sorted: Record<string, any> = {};\n\n for (const objectKey of Object.keys(input).sort()) {\n sorted[objectKey] = normalize(input[objectKey]);\n }\n\n return sorted;\n };\n\n return JSON.stringify(normalize(value));\n }\n\n /**\n * Cache a value\n * @param key - Cache key\n * @param value - Value to cache\n * @protected\n */\n protected async cache(key: string, value: any): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n // Swallow cache write failures so a flaky/unreachable remote cache (e.g.\n // Redis) degrades gracefully to a cache miss instead of breaking the read.\n try {\n await this.cacheDriver.set(key, value);\n } catch (error) {\n console.error(`[Repository] Failed to write cache key \"${key}\":`, error);\n }\n }\n\n /**\n * Get cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached record or null\n * @public\n */\n public async getCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * @alias getCached\n */\n public async findCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * Get cached record by column value\n * @param column - Column name\n * @param value - Column value\n * @param cacheKeyOptions - Additional cache key options\n * @returns Promise resolving to cached record or undefined\n * @public\n */\n public async getCachedBy(\n column: string,\n value: any,\n cacheKeyOptions?: Record<string, any>,\n ): Promise<T | null> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.findBy(column, value);\n }\n\n const cacheKey = this.cacheKey(`${column}.${value}`, cacheKeyOptions);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return this.adapter.deserializeModel(cachedData);\n }\n\n const model = await this.findBy(column, value);\n\n if (!model) return null;\n\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n return model;\n }\n\n /**\n * Get all cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached records\n * @public\n */\n public async allCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.all(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"all\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedData = await this.cacheDriver.get<T[]>(cacheKey);\n\n if (cachedData) {\n return cachedData.map((record) => this.adapter.deserializeModel(record));\n }\n }\n\n const records = await this.all(options);\n await this.cache(\n cacheKey,\n records.map((record) => this.adapter.serializeModel(record)),\n );\n return records;\n }\n\n /**\n * Get all active cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached active records\n * @public\n */\n public async allActiveCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return await this.allCached(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * List cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result\n * @public\n */\n public async listCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n if (!this.isCacheable || !this.cacheDriver) {\n return (await this._listImpl(options)) as PaginationResult<T>;\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"list\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return {\n data: (cachedData?.data || []).map((record: T) => this.adapter.deserializeModel(record)),\n pagination: cachedData.pagination,\n };\n }\n }\n\n const result = (await this._listImpl(options)) as PaginationResult<T>;\n\n await this.cache(cacheKey, {\n data: result.data.map((record) => this.adapter.serializeModel(record)),\n pagination: result.pagination,\n });\n return result;\n }\n\n /**\n * List active cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result of active records\n * @public\n */\n public async listActiveCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n return await this.listCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Get active cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached active record or undefined\n * @public\n */\n public async getActiveCached(id: string | number): Promise<T | undefined> {\n const model = await this.getCached(id);\n if (!model) return undefined;\n\n if (typeof (model as any).get === \"function\") {\n return (model as any).get(this.getIsActiveColumn()) === this.getIsActiveValue()\n ? model\n : undefined;\n }\n\n // Check if model is active\n const isActive = (model as any)[this.getIsActiveColumn()] === this.getIsActiveValue();\n return isActive ? model : undefined;\n }\n\n /**\n * Cache a model\n * @param model - Model to cache\n * @public\n */\n public async cacheModel(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n *\n * @example\n * ```typescript\n */\n public cleanup() {\n this.clearCache();\n this.cleanuEvents();\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n * export const cleanup = usersRepository.cleanup.bind(usersRepository);\n */\n public async $cleanup(): Promise<void> {\n await this.clearCache();\n this.cleanuEvents();\n\n if (this.cacheDriver) {\n await this.cacheDriver.flush();\n }\n }\n\n /**\n * Clear all cache for this repository\n * @public\n */\n public async clearCache(key?: CacheKey): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n await this.cacheDriver.removeNamespace(this.cacheKey(key || \"\"));\n }\n\n /**\n * Clear cache for specific model\n * @param model - Model to clear cache for\n * @public\n */\n public async clearModelCache(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cacheDriver.removeNamespace(cacheKey);\n }\n\n /**\n * Map documents to models\n * @param documents - Array of document data\n * @returns Array of model instances\n * @protected\n */\n protected mapModels(documents: any[]): T[] {\n return documents.map((doc) => this.newModel(doc));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Find or create a record\n * @param where - Conditions to find by\n * @param data - Data to create if not found\n * @returns Promise resolving to found or created record\n * @public\n */\n public async findOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n return model || (await this.create(data));\n }\n\n /**\n * Update or create a record\n * @param where - Conditions to find by\n * @param data - Data to update or create\n * @returns Promise resolving to updated or created record\n * @public\n */\n public async updateOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n if (model) {\n return await this.update(model, data);\n }\n return await this.create(data);\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,20 @@ import FindMyWay from "find-my-way";
|
|
|
2
2
|
|
|
3
3
|
//#region ../@warlock.js/core/src/router/route-registry.ts
|
|
4
4
|
/**
|
|
5
|
+
* The concrete HTTP verbs an `all` route expands into.
|
|
6
|
+
* Mirrors the set Fastify's `.all()` answers in production, so `router.any()`
|
|
7
|
+
* routes behave identically under the dev server and prod Fastify.
|
|
8
|
+
*/
|
|
9
|
+
const ALL_METHODS = [
|
|
10
|
+
"GET",
|
|
11
|
+
"POST",
|
|
12
|
+
"PUT",
|
|
13
|
+
"PATCH",
|
|
14
|
+
"DELETE",
|
|
15
|
+
"OPTIONS",
|
|
16
|
+
"HEAD"
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
5
19
|
* Route Registry
|
|
6
20
|
* Manages dynamic route matching using find-my-way for HMR support
|
|
7
21
|
*/
|
|
@@ -16,16 +30,11 @@ var RouteRegistry = class {
|
|
|
16
30
|
* Register all routes from the router's internal list
|
|
17
31
|
*/
|
|
18
32
|
register(routes) {
|
|
19
|
-
for (const route of routes) if (route.method === "all") {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.registerRoute({
|
|
25
|
-
...route,
|
|
26
|
-
method: "POST"
|
|
27
|
-
});
|
|
28
|
-
} else this.registerRoute(route);
|
|
33
|
+
for (const route of routes) if (route.method === "all") for (const method of ALL_METHODS) this.registerRoute({
|
|
34
|
+
...route,
|
|
35
|
+
method
|
|
36
|
+
});
|
|
37
|
+
else this.registerRoute(route);
|
|
29
38
|
}
|
|
30
39
|
/**
|
|
31
40
|
* Register a single route
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route-registry.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/route-registry.ts"],"sourcesContent":["import FindMyWay, { type HTTPMethod, type Instance } from \"find-my-way\";\nimport type { Route } from \"./types\";\n\n/**\n * Route Registry\n * Manages dynamic route matching using find-my-way for HMR support\n */\nexport class RouteRegistry {\n private router: Instance<any>;\n\n public constructor() {\n this.router = FindMyWay({\n ignoreTrailingSlash: true,\n caseSensitive: false,\n });\n }\n\n /**\n * Register all routes from the router's internal list\n */\n public register(routes: Route[]): void {\n // Register each route\n for (const route of routes) {\n if (route.method === \"all\") {\n
|
|
1
|
+
{"version":3,"file":"route-registry.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/route-registry.ts"],"sourcesContent":["import FindMyWay, { type HTTPMethod, type Instance } from \"find-my-way\";\nimport type { RequestMethod, Route } from \"./types\";\n\n/**\n * The concrete HTTP verbs an `all` route expands into.\n * Mirrors the set Fastify's `.all()` answers in production, so `router.any()`\n * routes behave identically under the dev server and prod Fastify.\n */\nconst ALL_METHODS: Exclude<RequestMethod, \"all\">[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n \"HEAD\",\n];\n\n/**\n * Route Registry\n * Manages dynamic route matching using find-my-way for HMR support\n */\nexport class RouteRegistry {\n private router: Instance<any>;\n\n public constructor() {\n this.router = FindMyWay({\n ignoreTrailingSlash: true,\n caseSensitive: false,\n });\n }\n\n /**\n * Register all routes from the router's internal list\n */\n public register(routes: Route[]): void {\n // Register each route\n for (const route of routes) {\n if (route.method === \"all\") {\n for (const method of ALL_METHODS) {\n this.registerRoute({\n ...route,\n method,\n });\n }\n } else {\n this.registerRoute(route);\n }\n }\n }\n\n /**\n * Register a single route\n */\n public registerRoute(route: Route): void {\n this.router.on(route.method as HTTPMethod, route.path, (req, res, params) => {\n // Store the route and params for later use\n return { route, params };\n });\n }\n\n /**\n * Find a matching route for the given method and URL\n * @returns Matched route with extracted params, or null if no match\n */\n public find(\n method: string,\n url: string,\n ): { route: Route; params: Record<string, string> } | null {\n // Strip query string from URL (find-my-way expects just the path)\n const path = url.split(\"?\")[0];\n\n const match = this.router.find(method as HTTPMethod, path);\n\n if (!match) {\n return null;\n }\n\n // find-my-way handler expects (req, res, params, store, searchParams)\n // We only care about the return value which contains { route, params }\n return match.handler(null as any, null as any, match.params, match.store, {});\n }\n\n /**\n * Get all registered routes count (for debugging)\n */\n public getRouteCount(): number {\n return this.router\n .prettyPrint()\n .split(\"\\n\")\n .filter((line) => line.trim()).length;\n }\n}\n"],"mappings":";;;;;;;;AAQA,MAAM,cAA+C;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AAMA,IAAa,gBAAb,MAA2B;CAGzB,AAAO,cAAc;EACnB,KAAK,SAAS,UAAU;GACtB,qBAAqB;GACrB,eAAe;EACjB,CAAC;CACH;;;;CAKA,AAAO,SAAS,QAAuB;EAErC,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,WAAW,OACnB,KAAK,MAAM,UAAU,aACnB,KAAK,cAAc;GACjB,GAAG;GACH;EACF,CAAC;OAGH,KAAK,cAAc,KAAK;CAG9B;;;;CAKA,AAAO,cAAc,OAAoB;EACvC,KAAK,OAAO,GAAG,MAAM,QAAsB,MAAM,OAAO,KAAK,KAAK,WAAW;GAE3E,OAAO;IAAE;IAAO;GAAO;EACzB,CAAC;CACH;;;;;CAMA,AAAO,KACL,QACA,KACyD;EAEzD,MAAM,OAAO,IAAI,MAAM,GAAG,CAAC,CAAC;EAE5B,MAAM,QAAQ,KAAK,OAAO,KAAK,QAAsB,IAAI;EAEzD,IAAI,CAAC,OACH,OAAO;EAKT,OAAO,MAAM,QAAQ,MAAa,MAAa,MAAM,QAAQ,MAAM,OAAO,CAAC,CAAC;CAC9E;;;;CAKA,AAAO,gBAAwB;EAC7B,OAAO,KAAK,OACT,YAAY,CAAC,CACb,MAAM,IAAI,CAAC,CACX,QAAQ,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC;CACnC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/router.ts"],"mappings":";;;;;;;cA0Ba,MAAA;;AAAb;;UAIU,MAAA;EAUqB;;;EAAA,eALd,QAAA;EAiBG;;;EAAA,UAZR,iBAAA,EAAmB,oBAAA;EA6CW;;;EAAA,UAxC9B,cAAA,EAAgB,MAAA,WAAiB,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,eAAA;EAgGzC;;;;EAAA,UAzFhB,MAAA,EAAQ,YAAA;EAgIP;;;EAAA,OAvHG,WAAA,IAAW,MAAA;EAAA,QAQlB,WAAA;EA8MwD;;;EAvMxD,cAAA,CAAe,QAAA,GAAW,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,eAAA;EAqNM;;;EA5MxD,aAAA,CAAc,QAAA,GAAW,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,eAAA;EA0NS;;;EAjN1D,QAAA,CAAS,IAAA,UAAc,EAAA,UAAY,YAAA;EA+NyB;;;EAtN5D,SAAA,CAAU,OAAA,EAAS,oBAAA;EA8Of;;;EArOJ,IAAA,CAAK,IAAA,UAAc,QAAA,UAAkB,SAAA;EAwOC;;;EA/NtC,UAAA,CAAW,IAAA,UAAc,QAAA,UAAkB,SAAA;EA+U5B;;;EAtUf,KAAA,CAAM,KAAA,EAAO,MAAA,kBAAwB,SAAA;
|
|
1
|
+
{"version":3,"file":"router.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/router/router.ts"],"mappings":"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"}
|
package/esm/router/router.mjs
CHANGED
|
@@ -289,10 +289,13 @@ var Router = class Router {
|
|
|
289
289
|
if (prefix) this.stacks.prefix.push(prefix);
|
|
290
290
|
if (name) this.stacks.name.push(name);
|
|
291
291
|
if (middleware) this.stacks.middleware.push(...middleware);
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
292
|
+
try {
|
|
293
|
+
callback();
|
|
294
|
+
} finally {
|
|
295
|
+
if (prefix) this.stacks.prefix.pop();
|
|
296
|
+
if (name) this.stacks.name.pop();
|
|
297
|
+
if (middleware) this.stacks.middleware.splice(this.stacks.middleware.length - middleware.length, middleware.length);
|
|
298
|
+
}
|
|
296
299
|
return this;
|
|
297
300
|
}
|
|
298
301
|
/**
|