@warlock.js/core 4.4.0 → 4.6.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 +72 -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 +1276 -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/signature.mjs +57 -0
- package/esm/ai/src/agent/signature.mjs.map +1 -0
- package/esm/ai/src/agent/snapshot.mjs +101 -0
- package/esm/ai/src/agent/snapshot.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 +191 -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-drift-error.mjs +31 -0
- package/esm/ai/src/errors/agent-drift-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 +39 -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-drift-error.mjs +33 -0
- package/esm/ai/src/errors/planner-drift-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/image/image-cost.mjs +55 -0
- package/esm/ai/src/image/image-cost.mjs.map +1 -0
- package/esm/ai/src/image/image.mjs +112 -0
- package/esm/ai/src/image/image.mjs.map +1 -0
- package/esm/ai/src/image/index.mjs +4 -0
- package/esm/ai/src/index.mjs +194 -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 +769 -0
- package/esm/ai/src/planner/planner-run.mjs.map +1 -0
- package/esm/ai/src/planner/planner.mjs +144 -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/planner/snapshot.mjs +95 -0
- package/esm/ai/src/planner/snapshot.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/hybrid/bm25.mjs +51 -0
- package/esm/ai/src/rag/hybrid/bm25.mjs.map +1 -0
- package/esm/ai/src/rag/hybrid/hybrid-rank.mjs +29 -0
- package/esm/ai/src/rag/hybrid/hybrid-rank.mjs.map +1 -0
- package/esm/ai/src/rag/hybrid/rrf.mjs +30 -0
- package/esm/ai/src/rag/hybrid/rrf.mjs.map +1 -0
- package/esm/ai/src/rag/index.mjs +18 -0
- package/esm/ai/src/rag/loaders/errors.mjs +25 -0
- package/esm/ai/src/rag/loaders/errors.mjs.map +1 -0
- package/esm/ai/src/rag/loaders/index.mjs +7 -0
- package/esm/ai/src/rag/loaders/load-html.mjs +138 -0
- package/esm/ai/src/rag/loaders/load-html.mjs.map +1 -0
- package/esm/ai/src/rag/loaders/load-pdf.mjs +150 -0
- package/esm/ai/src/rag/loaders/load-pdf.mjs.map +1 -0
- package/esm/ai/src/rag/loaders/load-text.mjs +60 -0
- package/esm/ai/src/rag/loaders/load-text.mjs.map +1 -0
- package/esm/ai/src/rag/loaders/load-web.mjs +89 -0
- package/esm/ai/src/rag/loaders/load-web.mjs.map +1 -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/rag/store/pg-vector-store.mjs +328 -0
- package/esm/ai/src/rag/store/pg-vector-store.mjs.map +1 -0
- package/esm/ai/src/rag/transforms/multi-query.mjs +41 -0
- package/esm/ai/src/rag/transforms/multi-query.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/speech/index.mjs +3 -0
- package/esm/ai/src/speech/speech.mjs +122 -0
- package/esm/ai/src/speech/speech.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/transcribe/audio-input.mjs +84 -0
- package/esm/ai/src/transcribe/audio-input.mjs.map +1 -0
- package/esm/ai/src/transcribe/index.mjs +4 -0
- package/esm/ai/src/transcribe/transcribe.mjs +127 -0
- package/esm/ai/src/transcribe/transcribe.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/image.mjs +5 -0
- package/esm/ai-openai/src/index.mjs +7 -0
- package/esm/ai-openai/src/model.mjs +5 -0
- package/esm/ai-openai/src/sdk.mjs +9 -0
- package/esm/ai-openai/src/speech.mjs +5 -0
- package/esm/ai-openai/src/transcription.mjs +6 -0
- package/esm/ai-openai/src/utils/index.mjs +5 -0
- package/esm/ai-openai/src/utils/to-openai-messages.mjs +3 -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/doctor/checks/config.check.mjs +42 -0
- package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/connectors.check.mjs +28 -0
- package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/health.check.mjs +35 -0
- package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/index.mjs +25 -0
- package/esm/cli/commands/doctor/checks/index.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +90 -0
- package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +69 -0
- package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/checks/routes.check.mjs +30 -0
- package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -0
- package/esm/cli/commands/doctor/doctor-command.action.mjs +28 -0
- package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -0
- package/esm/cli/commands/doctor/format-report.mjs +44 -0
- package/esm/cli/commands/doctor/format-report.mjs.map +1 -0
- package/esm/cli/commands/doctor/run-checks.mjs +50 -0
- package/esm/cli/commands/doctor/run-checks.mjs.map +1 -0
- package/esm/cli/commands/doctor.command.mjs +29 -0
- package/esm/cli/commands/doctor.command.mjs.map +1 -0
- package/esm/cli/commands/generate/templates/stubs.mjs +9 -12
- package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
- package/esm/cli/commands/routes/format-routes-table.mjs +129 -0
- package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -0
- package/esm/cli/commands/routes/route-row.mjs +92 -0
- package/esm/cli/commands/routes/route-row.mjs.map +1 -0
- package/esm/cli/commands/routes/routes-command.action.mjs +43 -0
- package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -0
- package/esm/cli/commands/routes.command.mjs +51 -0
- package/esm/cli/commands/routes.command.mjs.map +1 -0
- package/esm/cli/commands/seed.command.mjs +5 -0
- package/esm/cli/commands/seed.command.mjs.map +1 -1
- package/esm/cli/framework-cli-commands.mjs +4 -0
- package/esm/cli/framework-cli-commands.mjs.map +1 -1
- package/esm/config/config-getter.mjs +5 -5
- package/esm/config/config-getter.mjs.map +1 -1
- package/esm/config/config-loader.mjs +2 -2
- package/esm/config/config-loader.mjs.map +1 -1
- package/esm/connectors/access-connector.mjs +2 -2
- package/esm/connectors/access-connector.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 +9 -2
- 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/database-connector.mjs +2 -2
- package/esm/connectors/database-connector.mjs.map +1 -1
- package/esm/connectors/herald-connector.mjs +2 -2
- package/esm/connectors/herald-connector.mjs.map +1 -1
- package/esm/connectors/http-connector.d.mts.map +1 -1
- package/esm/connectors/http-connector.mjs +9 -7
- 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/logger-connector.mjs +2 -2
- package/esm/connectors/logger-connector.mjs.map +1 -1
- package/esm/connectors/mail-connector.mjs +2 -2
- package/esm/connectors/mail-connector.mjs.map +1 -1
- package/esm/connectors/notifications-connector.mjs +2 -2
- package/esm/connectors/notifications-connector.mjs.map +1 -1
- 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 +31 -8
- 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/database/index.d.mts +2 -1
- package/esm/database/index.mjs +1 -0
- package/esm/database/seed-command-action.mjs +44 -4
- package/esm/database/seed-command-action.mjs.map +1 -1
- package/esm/database/seeds/seed-records-table-migration.mjs +36 -0
- package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -0
- package/esm/database/seeds/seeder.d.mts +22 -5
- package/esm/database/seeds/seeder.d.mts.map +1 -1
- package/esm/database/seeds/seeder.errors.d.mts +22 -0
- package/esm/database/seeds/seeder.errors.d.mts.map +1 -0
- package/esm/database/seeds/seeder.errors.mjs +29 -0
- package/esm/database/seeds/seeder.errors.mjs.map +1 -0
- package/esm/database/seeds/seeder.mjs.map +1 -1
- package/esm/database/seeds/seeders.manager.mjs +90 -11
- package/esm/database/seeds/seeders.manager.mjs.map +1 -1
- package/esm/database/seeds/types.d.mts +117 -1
- package/esm/database/seeds/types.d.mts.map +1 -1
- package/esm/database/seeds/utils.mjs +6 -1
- package/esm/database/seeds/utils.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/dev-server/module-loader.d.mts +12 -0
- package/esm/dev-server/module-loader.d.mts.map +1 -1
- package/esm/dev-server/module-loader.mjs +30 -2
- package/esm/dev-server/module-loader.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/config.mjs +2 -2
- package/esm/http/config.mjs.map +1 -1
- package/esm/http/createHttpApplication.mjs +2 -2
- package/esm/http/createHttpApplication.mjs.map +1 -1
- package/esm/http/health.d.mts +14 -0
- package/esm/http/health.d.mts.map +1 -1
- package/esm/http/health.mjs +16 -0
- package/esm/http/health.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 +9 -6
- package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
- package/esm/http/middleware/inject-request-context.mjs +2 -2
- package/esm/http/middleware/inject-request-context.mjs.map +1 -1
- package/esm/http/middleware/maintenance.middleware.mjs +6 -5
- package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
- package/esm/http/plugins.mjs +9 -9
- package/esm/http/plugins.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 +24 -7
- package/esm/http/response.mjs.map +1 -1
- package/esm/http/server.d.mts.map +1 -1
- package/esm/http/server.mjs +4 -4
- package/esm/http/server.mjs.map +1 -1
- package/esm/index.d.mts +9 -4
- package/esm/index.mjs +6 -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 +37 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
- package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +71 -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/contracts/index.d.mts +1 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts +87 -1
- package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
- package/esm/repositories/index.d.mts +1 -1
- package/esm/repositories/repository.manager.d.mts +110 -2
- package/esm/repositories/repository.manager.d.mts.map +1 -1
- package/esm/repositories/repository.manager.mjs +207 -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 +9 -0
- package/esm/router/router.d.mts.map +1 -1
- package/esm/router/router.mjs +28 -5
- 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/esm/utils/paths.mjs +2 -2
- package/esm/utils/paths.mjs.map +1 -1
- package/esm/validation/validateAll.mjs +2 -2
- package/esm/validation/validateAll.mjs.map +1 -1
- package/llms-full.txt +456 -46
- package/llms.txt +4 -2
- package/package.json +9 -9
- package/skills/README.md +65 -0
- package/skills/add-connector/SKILL.md +6 -1
- package/skills/configure-app/SKILL.md +23 -0
- package/skills/health-checks/SKILL.md +13 -0
- package/skills/use-repository/SKILL.md +38 -1
- package/skills/warlock-doctor/SKILL.md +135 -0
- package/skills/warlock-routes/SKILL.md +91 -0
- package/skills/write-seeder/SKILL.md +143 -45
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defaultDoctorChecks } from "./checks/index.mjs";
|
|
2
|
+
import { printReport } from "./format-report.mjs";
|
|
3
|
+
import { runChecks } from "./run-checks.mjs";
|
|
4
|
+
|
|
5
|
+
//#region ../@warlock.js/core/src/cli/commands/doctor/doctor-command.action.ts
|
|
6
|
+
/**
|
|
7
|
+
* Action behind `warlock doctor`. Runs the default read-only diagnostic
|
|
8
|
+
* checks, prints the grouped pass/warn/fail report, and — when any check
|
|
9
|
+
* failed — exits the process with a non-zero code so the command signals
|
|
10
|
+
* failure to scripts/CI.
|
|
11
|
+
*
|
|
12
|
+
* A failing check is REPORTED (a line in the report + a non-zero exit), never
|
|
13
|
+
* thrown: the runner converts any thrown check into a `fail` result first.
|
|
14
|
+
*
|
|
15
|
+
* On success this simply returns; the CLI manager then prints its own success
|
|
16
|
+
* banner and exits zero.
|
|
17
|
+
*
|
|
18
|
+
* @param _data Parsed CLI args (unused — doctor takes no positional args).
|
|
19
|
+
*/
|
|
20
|
+
async function doctorCommandAction(_data) {
|
|
21
|
+
const report = await runChecks(defaultDoctorChecks);
|
|
22
|
+
printReport(report);
|
|
23
|
+
if (report.hasFailures) process.exit(report.exitCode);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { doctorCommandAction };
|
|
28
|
+
//# sourceMappingURL=doctor-command.action.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-command.action.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/core/src/cli/commands/doctor/doctor-command.action.ts"],"sourcesContent":["import type { CommandActionData } from \"../../types\";\nimport { defaultDoctorChecks } from \"./checks\";\nimport { printReport } from \"./format-report\";\nimport { runChecks } from \"./run-checks\";\n\n/**\n * Action behind `warlock doctor`. Runs the default read-only diagnostic\n * checks, prints the grouped pass/warn/fail report, and — when any check\n * failed — exits the process with a non-zero code so the command signals\n * failure to scripts/CI.\n *\n * A failing check is REPORTED (a line in the report + a non-zero exit), never\n * thrown: the runner converts any thrown check into a `fail` result first.\n *\n * On success this simply returns; the CLI manager then prints its own success\n * banner and exits zero.\n *\n * @param _data Parsed CLI args (unused — doctor takes no positional args).\n */\nexport async function doctorCommandAction(_data: CommandActionData): Promise<void> {\n const report = await runChecks(defaultDoctorChecks);\n\n printReport(report);\n\n if (report.hasFailures) {\n process.exit(report.exitCode);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,eAAsB,oBAAoB,OAAyC;CACjF,MAAM,SAAS,MAAM,UAAU,mBAAmB;CAElD,YAAY,MAAM;CAElB,IAAI,OAAO,aACT,QAAQ,KAAK,OAAO,QAAQ;AAEhC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { colors } from "@mongez/copper";
|
|
2
|
+
|
|
3
|
+
//#region ../@warlock.js/core/src/cli/commands/doctor/format-report.ts
|
|
4
|
+
/**
|
|
5
|
+
* The glyph shown beside each check, keyed by status.
|
|
6
|
+
*/
|
|
7
|
+
const STATUS_SYMBOL = {
|
|
8
|
+
ok: "✓",
|
|
9
|
+
warn: "⚠",
|
|
10
|
+
fail: "✗"
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Colorize a status glyph. Kept separate from {@link STATUS_SYMBOL} so the
|
|
14
|
+
* plain glyphs remain available for snapshot-friendly, color-free assertions.
|
|
15
|
+
*/
|
|
16
|
+
function colorizeSymbol(status) {
|
|
17
|
+
const symbol = STATUS_SYMBOL[status];
|
|
18
|
+
switch (status) {
|
|
19
|
+
case "ok": return colors.green(symbol);
|
|
20
|
+
case "warn": return colors.yellow(symbol);
|
|
21
|
+
case "fail": return colors.red(symbol);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Print the report to stdout with colored status glyphs and a colored summary
|
|
26
|
+
* verdict. Thin wrapper over {@link formatReportLines} — the structured report
|
|
27
|
+
* stays the source of truth for the exit code.
|
|
28
|
+
*
|
|
29
|
+
* @param report The aggregated doctor report.
|
|
30
|
+
*/
|
|
31
|
+
function printReport(report) {
|
|
32
|
+
for (const result of report.results) {
|
|
33
|
+
const symbol = colorizeSymbol(result.status);
|
|
34
|
+
console.log(`${symbol} ${colors.bold(result.name)}: ${result.detail}`);
|
|
35
|
+
}
|
|
36
|
+
const { ok, warn, fail } = report.summary;
|
|
37
|
+
const summaryLine = `Summary: ${ok} ok, ${warn} warn, ${fail} fail`;
|
|
38
|
+
console.log("");
|
|
39
|
+
console.log(report.hasFailures ? colors.red(summaryLine) : colors.green(summaryLine));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { printReport };
|
|
44
|
+
//# sourceMappingURL=format-report.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-report.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/core/src/cli/commands/doctor/format-report.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport type { CheckStatus, DoctorReport } from \"./check.types\";\n\n/**\n * The glyph shown beside each check, keyed by status.\n */\nconst STATUS_SYMBOL: Record<CheckStatus, string> = {\n ok: \"✓\",\n warn: \"⚠\",\n fail: \"✗\",\n};\n\n/**\n * Colorize a status glyph. Kept separate from {@link STATUS_SYMBOL} so the\n * plain glyphs remain available for snapshot-friendly, color-free assertions.\n */\nfunction colorizeSymbol(status: CheckStatus): string {\n const symbol = STATUS_SYMBOL[status];\n\n switch (status) {\n case \"ok\":\n return colors.green(symbol);\n case \"warn\":\n return colors.yellow(symbol);\n case \"fail\":\n return colors.red(symbol);\n }\n}\n\n/**\n * Build the report body as an ordered list of plain (uncolored) lines:\n * one `<symbol> <name>: <detail>` line per check, a blank line, then a summary\n * line. Returned as strings (not printed) so the formatting is unit-testable.\n *\n * @param report The aggregated doctor report.\n * @returns The lines to print, top to bottom.\n */\nexport function formatReportLines(report: DoctorReport): string[] {\n const lines = report.results.map((result) => {\n return `${STATUS_SYMBOL[result.status]} ${result.name}: ${result.detail}`;\n });\n\n const { ok, warn, fail } = report.summary;\n\n lines.push(\"\");\n lines.push(`Summary: ${ok} ok, ${warn} warn, ${fail} fail`);\n\n return lines;\n}\n\n/**\n * Print the report to stdout with colored status glyphs and a colored summary\n * verdict. Thin wrapper over {@link formatReportLines} — the structured report\n * stays the source of truth for the exit code.\n *\n * @param report The aggregated doctor report.\n */\nexport function printReport(report: DoctorReport): void {\n for (const result of report.results) {\n const symbol = colorizeSymbol(result.status);\n\n console.log(`${symbol} ${colors.bold(result.name)}: ${result.detail}`);\n }\n\n const { ok, warn, fail } = report.summary;\n const summaryLine = `Summary: ${ok} ok, ${warn} warn, ${fail} fail`;\n\n console.log(\"\");\n console.log(report.hasFailures ? colors.red(summaryLine) : colors.green(summaryLine));\n}\n"],"mappings":";;;;;;AAMA,MAAM,gBAA6C;CACjD,IAAI;CACJ,MAAM;CACN,MAAM;AACR;;;;;AAMA,SAAS,eAAe,QAA6B;CACnD,MAAM,SAAS,cAAc;CAE7B,QAAQ,QAAR;EACE,KAAK,MACH,OAAO,OAAO,MAAM,MAAM;EAC5B,KAAK,QACH,OAAO,OAAO,OAAO,MAAM;EAC7B,KAAK,QACH,OAAO,OAAO,IAAI,MAAM;CAC5B;AACF;;;;;;;;AA8BA,SAAgB,YAAY,QAA4B;CACtD,KAAK,MAAM,UAAU,OAAO,SAAS;EACnC,MAAM,SAAS,eAAe,OAAO,MAAM;EAE3C,QAAQ,IAAI,GAAG,OAAO,GAAG,OAAO,KAAK,OAAO,IAAI,EAAE,IAAI,OAAO,QAAQ;CACvE;CAEA,MAAM,EAAE,IAAI,MAAM,SAAS,OAAO;CAClC,MAAM,cAAc,YAAY,GAAG,OAAO,KAAK,SAAS,KAAK;CAE7D,QAAQ,IAAI,EAAE;CACd,QAAQ,IAAI,OAAO,cAAc,OAAO,IAAI,WAAW,IAAI,OAAO,MAAM,WAAW,CAAC;AACtF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//#region ../@warlock.js/core/src/cli/commands/doctor/run-checks.ts
|
|
2
|
+
/**
|
|
3
|
+
* Run one check defensively: a check that throws (or rejects) is recorded as a
|
|
4
|
+
* `fail` carrying the error message, never re-thrown. This is what keeps
|
|
5
|
+
* `doctor` itself crash-proof — a broken probe degrades to a failed check
|
|
6
|
+
* instead of taking the whole command down.
|
|
7
|
+
*/
|
|
8
|
+
async function runOne(check) {
|
|
9
|
+
try {
|
|
10
|
+
return await check.run();
|
|
11
|
+
} catch (error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
return {
|
|
14
|
+
name: check.name,
|
|
15
|
+
status: "fail",
|
|
16
|
+
detail: `check threw: ${message}`
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run every check and aggregate the results into a {@link DoctorReport}.
|
|
22
|
+
*
|
|
23
|
+
* Checks run in registration order. Each is isolated via {@link runOne}, so one
|
|
24
|
+
* throwing check cannot abort the others. The exit code is `1` if any check
|
|
25
|
+
* resolved to `fail`, otherwise `0` — warnings never fail the command.
|
|
26
|
+
*
|
|
27
|
+
* @param checks The diagnostic probes to execute.
|
|
28
|
+
* @returns The aggregated report (results + per-status counts + exit code).
|
|
29
|
+
*/
|
|
30
|
+
async function runChecks(checks) {
|
|
31
|
+
const results = [];
|
|
32
|
+
for (const check of checks) results.push(await runOne(check));
|
|
33
|
+
const summary = {
|
|
34
|
+
ok: 0,
|
|
35
|
+
warn: 0,
|
|
36
|
+
fail: 0
|
|
37
|
+
};
|
|
38
|
+
for (const result of results) summary[result.status] += 1;
|
|
39
|
+
const hasFailures = summary.fail > 0;
|
|
40
|
+
return {
|
|
41
|
+
results,
|
|
42
|
+
summary,
|
|
43
|
+
hasFailures,
|
|
44
|
+
exitCode: hasFailures ? 1 : 0
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
export { runChecks };
|
|
50
|
+
//# sourceMappingURL=run-checks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-checks.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/core/src/cli/commands/doctor/run-checks.ts"],"sourcesContent":["import type { CheckResult, CheckStatus, DoctorCheck, DoctorReport } from \"./check.types\";\n\n/**\n * Run one check defensively: a check that throws (or rejects) is recorded as a\n * `fail` carrying the error message, never re-thrown. This is what keeps\n * `doctor` itself crash-proof — a broken probe degrades to a failed check\n * instead of taking the whole command down.\n */\nasync function runOne(check: DoctorCheck): Promise<CheckResult> {\n try {\n return await check.run();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n return {\n name: check.name,\n status: \"fail\",\n detail: `check threw: ${message}`,\n };\n }\n}\n\n/**\n * Run every check and aggregate the results into a {@link DoctorReport}.\n *\n * Checks run in registration order. Each is isolated via {@link runOne}, so one\n * throwing check cannot abort the others. The exit code is `1` if any check\n * resolved to `fail`, otherwise `0` — warnings never fail the command.\n *\n * @param checks The diagnostic probes to execute.\n * @returns The aggregated report (results + per-status counts + exit code).\n */\nexport async function runChecks(checks: DoctorCheck[]): Promise<DoctorReport> {\n const results: CheckResult[] = [];\n\n for (const check of checks) {\n results.push(await runOne(check));\n }\n\n const summary: Record<CheckStatus, number> = { ok: 0, warn: 0, fail: 0 };\n\n for (const result of results) {\n summary[result.status] += 1;\n }\n\n const hasFailures = summary.fail > 0;\n\n return {\n results,\n summary,\n hasFailures,\n exitCode: hasFailures ? 1 : 0,\n };\n}\n"],"mappings":";;;;;;;AAQA,eAAe,OAAO,OAA0C;CAC9D,IAAI;EACF,OAAO,MAAM,MAAM,IAAI;CACzB,SAAS,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAErE,OAAO;GACL,MAAM,MAAM;GACZ,QAAQ;GACR,QAAQ,gBAAgB;EAC1B;CACF;AACF;;;;;;;;;;;AAYA,eAAsB,UAAU,QAA8C;CAC5E,MAAM,UAAyB,CAAC;CAEhC,KAAK,MAAM,SAAS,QAClB,QAAQ,KAAK,MAAM,OAAO,KAAK,CAAC;CAGlC,MAAM,UAAuC;EAAE,IAAI;EAAG,MAAM;EAAG,MAAM;CAAE;CAEvE,KAAK,MAAM,UAAU,SACnB,QAAQ,OAAO,WAAW;CAG5B,MAAM,cAAc,QAAQ,OAAO;CAEnC,OAAO;EACL;EACA;EACA;EACA,UAAU,cAAc,IAAI;CAC9B;AACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { command } from "../cli-command.mjs";
|
|
2
|
+
import { doctorCommandAction } from "./doctor/doctor-command.action.mjs";
|
|
3
|
+
|
|
4
|
+
//#region ../@warlock.js/core/src/cli/commands/doctor.command.ts
|
|
5
|
+
/**
|
|
6
|
+
* `warlock doctor` — run a set of READ-ONLY diagnostic checks (routes, config,
|
|
7
|
+
* connectors, optional peers, health endpoints, release hygiene) and print a
|
|
8
|
+
* grouped pass/warn/fail report. Exits non-zero if any check fails.
|
|
9
|
+
*
|
|
10
|
+
* Preload plan: load every config file and bootstrap app code so routes and
|
|
11
|
+
* connectors are registered for introspection, but DELIBERATELY start no
|
|
12
|
+
* connectors — doctor must not open database/cache/socket connections. The
|
|
13
|
+
* connectors check therefore reports the registered set and which (if any) are
|
|
14
|
+
* already active without forcing them up.
|
|
15
|
+
*/
|
|
16
|
+
const doctorCommand = command({
|
|
17
|
+
name: "doctor",
|
|
18
|
+
description: "Run read-only health checks (routes, config, connectors, optional peers, health endpoints, release hygiene) and print a pass/warn/fail report",
|
|
19
|
+
action: doctorCommandAction,
|
|
20
|
+
preload: {
|
|
21
|
+
config: true,
|
|
22
|
+
env: true,
|
|
23
|
+
bootstrap: true
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { doctorCommand };
|
|
29
|
+
//# sourceMappingURL=doctor.command.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.command.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/cli/commands/doctor.command.ts"],"sourcesContent":["import { command } from \"../cli-command\";\nimport { doctorCommandAction } from \"./doctor/doctor-command.action\";\n\n/**\n * `warlock doctor` — run a set of READ-ONLY diagnostic checks (routes, config,\n * connectors, optional peers, health endpoints, release hygiene) and print a\n * grouped pass/warn/fail report. Exits non-zero if any check fails.\n *\n * Preload plan: load every config file and bootstrap app code so routes and\n * connectors are registered for introspection, but DELIBERATELY start no\n * connectors — doctor must not open database/cache/socket connections. The\n * connectors check therefore reports the registered set and which (if any) are\n * already active without forcing them up.\n */\nexport const doctorCommand = command({\n name: \"doctor\",\n description:\n \"Run read-only health checks (routes, config, connectors, optional peers, health endpoints, release hygiene) and print a pass/warn/fail report\",\n action: doctorCommandAction,\n preload: {\n config: true,\n env: true,\n bootstrap: true,\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;AAcA,MAAa,gBAAgB,QAAQ;CACnC,MAAM;CACN,aACE;CACF,QAAQ;CACR,SAAS;EACP,QAAQ;EACR,KAAK;EACL,WAAW;CACb;AACF,CAAC"}
|
|
@@ -174,7 +174,7 @@ function crudModelStub(moduleName) {
|
|
|
174
174
|
const singular = moduleName.singular;
|
|
175
175
|
const plural = moduleName.plural;
|
|
176
176
|
return `import { Model, RegisterModel } from "@warlock.js/cascade";
|
|
177
|
-
import { type Infer, v } from "@warlock.js/
|
|
177
|
+
import { type Infer, v } from "@warlock.js/seal";
|
|
178
178
|
import { ${singular.pascal}Resource } from "app/${plural.kebab}/resources/${singular.kebab}.resource";
|
|
179
179
|
|
|
180
180
|
export const ${singular.camel}Schema = v.object({
|
|
@@ -333,17 +333,15 @@ export default seeder({
|
|
|
333
333
|
name: "Seed ${entity.plural.pascal}",
|
|
334
334
|
once: true,
|
|
335
335
|
enabled: true,
|
|
336
|
-
run: async () => {
|
|
336
|
+
run: async ({ track }) => {
|
|
337
337
|
const total = 10;
|
|
338
338
|
for (let i = 0; i < total; i++) {
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
339
|
+
track(
|
|
340
|
+
await ${entity.singular.pascal}.create({
|
|
341
|
+
// TODO: Add more fields
|
|
342
|
+
}),
|
|
343
|
+
);
|
|
342
344
|
}
|
|
343
|
-
|
|
344
|
-
return {
|
|
345
|
-
recordsCreated: total,
|
|
346
|
-
};
|
|
347
345
|
},
|
|
348
346
|
});
|
|
349
347
|
`;
|
|
@@ -442,9 +440,8 @@ export type ${name.pascal}Schema = Infer<typeof ${name.camel}Schema>;
|
|
|
442
440
|
*/
|
|
443
441
|
function modelStub(name, options = {}) {
|
|
444
442
|
const { tableName = `${name.plural.snake}`, withResource } = options;
|
|
445
|
-
return `import { Model } from "@warlock.js/
|
|
446
|
-
import type
|
|
447
|
-
import { v, type Infer } from "@warlock.js/core";
|
|
443
|
+
return `import { Model, type StrictMode } from "@warlock.js/cascade";
|
|
444
|
+
import { v, type Infer } from "@warlock.js/seal";
|
|
448
445
|
${withResource ? `import { ${name.singular.pascal}Resource } from "../../resources/${name.singular.kebab}.resource";` : ""}
|
|
449
446
|
|
|
450
447
|
const ${name.singular.camel}Schema = v.object({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/core/src/cli/commands/generate/templates/stubs.ts"],"sourcesContent":["import type { ParsedName } from \"../types\";\r\nimport { Name } from \"../utils/name-parser\";\r\n\r\n/**\r\n * Controller template stub\r\n *\r\n * Controllers default to the guarded handler type since application\r\n * routes run behind `guarded()`. When `withValidation` is set, the\r\n * schema's exported type + value are imported directly from the\r\n * `schema/` folder and bound to the handler — no `requests/` alias.\r\n */\r\nexport function controllerStub(\r\n name: ParsedName,\r\n options: { withValidation?: boolean } = {},\r\n): string {\r\n const { withValidation } = options;\r\n\r\n if (!withValidation) {\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\n\r\nexport const ${name.camel}Controller: GuardedRequestHandler = async (request, response) => {\r\n // TODO: Implement controller logic\r\n return response.success({});\r\n};\r\n`;\r\n }\r\n\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { type ${name.pascal}Schema, ${name.camel}Schema } from \"../schema/${name.kebab}.schema\";\r\n\r\nexport const ${name.camel}Controller: GuardedRequestHandler<${name.pascal}Schema> = async (\r\n request,\r\n response,\r\n) => {\r\n // TODO: Implement controller logic\r\n return response.success({});\r\n};\r\n\r\n${name.camel}Controller.validation = {\r\n schema: ${name.camel}Schema,\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Create Controller template\r\n * Note: moduleName is the module (plural), we need singular entity name\r\n */\r\nexport function crudCreateControllerStub(moduleName: Name): string {\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { type Create${moduleName.pascal}Schema, create${moduleName.pascal}Schema } from \"../schema/create-${moduleName.kebab}.schema\";\r\nimport { create${moduleName.pascal}Service } from \"../services/create-${moduleName.kebab}.service\";\r\n\r\nexport const create${moduleName.pascal}Controller: GuardedRequestHandler<Create${moduleName.pascal}Schema> = async (\r\n request,\r\n response,\r\n) => {\r\n const ${moduleName.camel} = await create${moduleName.pascal}Service(request.validated());\r\n\r\n return response.successCreate({\r\n ${moduleName.camel},\r\n });\r\n};\r\n\r\ncreate${moduleName.pascal}Controller.validation = {\r\n schema: create${moduleName.pascal}Schema,\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Update Controller template\r\n */\r\nexport function crudUpdateControllerStub(moduleName: Name): string {\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { type Update${moduleName.pascal}Schema, update${moduleName.pascal}Schema } from \"../schema/update-${moduleName.kebab}.schema\";\r\nimport { update${moduleName.pascal}Service } from \"../services/update-${moduleName.kebab}.service\";\r\n\r\nexport const update${moduleName.pascal}Controller: GuardedRequestHandler<Update${moduleName.pascal}Schema> = async (\r\n request,\r\n response,\r\n) => {\r\n const ${moduleName.camel} = await update${moduleName.pascal}Service(request.input(\"id\"), request.validated());\r\n\r\n return response.success({\r\n ${moduleName.camel},\r\n });\r\n};\r\n\r\nupdate${moduleName.pascal}Controller.validation = {\r\n schema: update${moduleName.pascal}Schema,\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD List Controller template\r\n */\r\nexport function crudListControllerStub(moduleName: Name): string {\r\n const plural = moduleName.plural;\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { list${plural.pascal}Service } from \"../services/list-${plural.kebab}.service\";\r\n\r\nexport const list${plural.pascal}Controller: GuardedRequestHandler = async (\r\n request,\r\n response,\r\n) => {\r\n const { data, pagination } = await list${plural.pascal}Service(request.all());\r\n\r\n return response.success({\r\n data,\r\n pagination,\r\n });\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Show/Get Controller template\r\n */\r\nexport function crudShowControllerStub(moduleName: Name): string {\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { get${moduleName.pascal}Service } from \"../services/get-${moduleName.kebab}.service\";\r\n\r\nexport const get${moduleName.pascal}Controller: GuardedRequestHandler = async (\r\n request,\r\n response,\r\n) => {\r\n const ${moduleName.camel} = await get${moduleName.pascal}Service(request.input(\"id\"));\r\n\r\n if (!${moduleName.camel}) {\r\n return response.notFound();\r\n }\r\n\r\n return response.success({\r\n ${moduleName.camel},\r\n });\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Delete Controller template\r\n */\r\nexport function crudDeleteControllerStub(moduleName: Name): string {\r\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\r\nimport { delete${moduleName.pascal}Service } from \"../services/delete-${moduleName.kebab}.service\";\r\n\r\nexport const delete${moduleName.pascal}Controller: GuardedRequestHandler = async (\r\n request,\r\n response,\r\n) => {\r\n await delete${moduleName.pascal}Service(request.input(\"id\"));\r\n\r\n return response.noContent();\r\n};\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Routes template\r\n */\r\nexport function crudRoutesStub(moduleName: Name): string {\r\n const singular = moduleName.singular;\r\n const plural = moduleName.plural;\r\n\r\n return `import { router } from \"@warlock.js/core\";\r\nimport { guarded } from \"app/shared/utils/router\";\r\nimport { create${singular.pascal}Controller } from \"./controllers/create-${singular.kebab}.controller\";\r\nimport { delete${singular.pascal}Controller } from \"./controllers/delete-${singular.kebab}.controller\";\r\nimport { get${singular.pascal}Controller } from \"./controllers/get-${singular.kebab}.controller\";\r\nimport { list${plural.pascal}Controller } from \"./controllers/list-${plural.kebab}.controller\";\r\nimport { update${singular.pascal}Controller } from \"./controllers/update-${singular.kebab}.controller\";\r\n\r\nguarded(() => {\r\n router\r\n .route(\"/${plural.kebab}\")\r\n .list(list${plural.pascal}Controller)\r\n .show(get${singular.pascal}Controller)\r\n .create(create${singular.pascal}Controller)\r\n .update(update${singular.pascal}Controller)\r\n .destroy(delete${singular.pascal}Controller);\r\n});\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Model template\r\n */\r\nexport function crudModelStub(moduleName: Name): string {\r\n const singular = moduleName.singular;\r\n const plural = moduleName.plural;\r\n\r\n return `import { Model, RegisterModel } from \"@warlock.js/cascade\";\r\nimport { type Infer, v } from \"@warlock.js/core\";\r\nimport { ${singular.pascal}Resource } from \"app/${plural.kebab}/resources/${singular.kebab}.resource\";\r\n\r\nexport const ${singular.camel}Schema = v.object({\r\n // TODO: Add more fields\r\n});\r\n\r\nexport type ${singular.pascal}Schema = Infer.Output<typeof ${singular.camel}Schema>;\r\n\r\n@RegisterModel()\r\nexport class ${singular.pascal} extends Model<${singular.pascal}Schema> {\r\n public static table = \"${plural.snake}\";\r\n\r\n public static schema = ${singular.camel}Schema;\r\n\r\n public static relations = {};\r\n\r\n public static resource = ${singular.pascal}Resource;\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Resource template\r\n */\r\nexport function crudResourceStub(moduleName: Name): string {\r\n // Get singular entity name\r\n const entity = moduleName.singular;\r\n\r\n return `import { defineResource } from \"@warlock.js/core\";\r\n\r\nexport const ${entity.pascal}Resource = defineResource({\r\n schema: {\r\n id: \"number\",\r\n // TODO: Add more resource fields\r\n },\r\n});\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Repository template\r\n */\r\nexport function crudRepositoryStub(entity: Name): string {\r\n const moduleSingularName = entity.singular;\r\n const modulePluralName = entity.plural;\r\n return `import type { FilterRules, TypedRepositoryOptions } from \"@warlock.js/core\";\r\nimport { RepositoryManager } from \"@warlock.js/core\";\r\nimport { ${moduleSingularName.pascal} } from \"../models/${moduleSingularName.kebab}\";\r\n\r\ntype ${moduleSingularName.pascal}ListFilter = {\r\n // Repository list filters\r\n};\r\n\r\nexport type ${moduleSingularName.pascal}ListOptions = TypedRepositoryOptions<${moduleSingularName.pascal}ListFilter>;\r\n\r\nclass ${modulePluralName.pascal}Repository extends RepositoryManager<${moduleSingularName.pascal}, ${moduleSingularName.pascal}ListOptions> {\r\n public source = ${moduleSingularName.pascal};\r\n\r\n public simpleSelectColumns: string[] = [\"id\"];\r\n\r\n public filterBy: FilterRules = {\r\n id: \"=\",\r\n };\r\n\r\n public defaultOptions: RepositoryOptions = {\r\n orderBy: {\r\n id: \"desc\",\r\n },\r\n };\r\n}\r\n\r\nexport const ${modulePluralName.camel}Repository = new ${modulePluralName.pascal}Repository();\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Create Service template\r\n */\r\nexport function crudCreateServiceStub(entity: Name): string {\r\n const moduleSingularName = entity.singular;\r\n return `import { ${moduleSingularName.pascal} } from \"../models/${moduleSingularName.kebab}\";\r\nimport type { Create${moduleSingularName.pascal}Schema } from \"../schema/create-${moduleSingularName.kebab}.schema\";\r\n\r\nexport async function create${moduleSingularName.pascal}Service(data: Create${moduleSingularName.pascal}Schema) {\r\n const ${moduleSingularName.camel} = await ${moduleSingularName.pascal}.create(data);\r\n return ${moduleSingularName.camel};\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Update Service template\r\n */\r\nexport function crudUpdateServiceStub(entity: Name): string {\r\n const moduleSingularName = entity.singular;\r\n return `import { ResourceNotFoundError } from \"@warlock.js/core\";\r\nimport { get${moduleSingularName.pascal}Service } from \"./get-${moduleSingularName.kebab}.service\";\r\nimport type { Update${moduleSingularName.pascal}Schema } from \"../schema/update-${moduleSingularName.kebab}.schema\";\r\n\r\nexport async function update${moduleSingularName.pascal}Service(id: number | string, data: Update${moduleSingularName.pascal}Schema) {\r\n const ${moduleSingularName.camel} = await get${moduleSingularName.pascal}Service(id);\r\n\r\n await ${moduleSingularName.camel}.save({ merge: data });\r\n return ${moduleSingularName.camel};\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD List Service template\r\n */\r\nexport function crudListServiceStub(entity: Name): string {\r\n const modulePluralName = entity.plural;\r\n return `import { ${modulePluralName.camel}Repository } from \"../repositories/${modulePluralName.kebab}.repository\";\r\n\r\nexport async function list${modulePluralName.pascal}Service(filters: any) {\r\n return ${modulePluralName.camel}Repository.listCached(filters);\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Get Service template\r\n */\r\nexport function crudGetServiceStub(entity: Name): string {\r\n return `import { ${entity.plural.camel}Repository } from \"../repositories/${entity.plural.kebab}.repository\";\r\nimport { ResourceNotFoundError } from \"@warlock.js/core\";\r\n\r\nexport async function get${entity.singular.pascal}Service(id: number | string) {\r\n const ${entity.singular.camel} = await ${entity.plural.camel}Repository.getCached(id);\r\n\r\n if (!${entity.singular.camel}) {\r\n throw new ResourceNotFoundError(\"${entity.singular.pascal} resource not found!\");\r\n }\r\n\r\n return ${entity.singular.camel};\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Delete Service template\r\n */\r\nexport function crudDeleteServiceStub(entity: Name): string {\r\n const singular = entity.singular;\r\n return `import { ResourceNotFoundError } from \"@warlock.js/core\";\r\nimport { get${singular.pascal}Service } from \"./get-${singular.kebab}.service\";\r\n\r\nexport async function delete${singular.pascal}Service(id: number | string) {\r\n const ${singular.camel} = await get${singular.pascal}Service(id);\r\n if (!${singular.camel}) {\r\n throw new ResourceNotFoundError(\"${singular.pascal} not found\");\r\n }\r\n await ${singular.camel}.destroy();\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Seed template\r\n */\r\nexport function crudSeedStub(entity: Name): string {\r\n return `import { seeder } from \"@warlock.js/core\";\r\nimport { ${entity.singular.pascal} } from \"../models/${entity.singular.kebab}\";\r\n\r\nexport default seeder({\r\n name: \"Seed ${entity.plural.pascal}\",\r\n once: true,\r\n enabled: true,\r\n run: async () => {\r\n const total = 10;\r\n for (let i = 0; i < total; i++) {\r\n await ${entity.singular.pascal}.create({\r\n // TODO: Add more fields\r\n });\r\n }\r\n\r\n return {\r\n recordsCreated: total,\r\n };\r\n },\r\n});\r\n`;\r\n}\r\n\r\n/**\r\n * Migration template\r\n */\r\n/**\r\n * Migration Create template\r\n */\r\nexport function migrationStub(\r\n entityName: ParsedName,\r\n options: {\r\n columns?: string;\r\n imports?: string[];\r\n timestamps?: boolean;\r\n tableName?: string;\r\n } = {},\r\n): string {\r\n const { columns = \"\", imports = [], timestamps = true } = options;\r\n\r\n const allImports = [\"Migration\", ...imports].join(\", \");\r\n\r\n let optionsString = \"\";\r\n if (timestamps === false) {\r\n optionsString = `, { timestamps: false }`;\r\n }\r\n\r\n return `import { ${allImports} } from \"@warlock.js/cascade\";\r\nimport { ${entityName.pascal} } from \"../${entityName.kebab}.model\";\r\n\r\nexport default Migration.create(${entityName.pascal}, {\r\n${columns ? columns : \" // add your columns here, id is auto added to the list\"}\r\n}${optionsString});\r\n`;\r\n}\r\n\r\n/**\r\n * Migration Alter template\r\n */\r\nexport function migrationAlterStub(\r\n entityName: ParsedName,\r\n options: {\r\n add?: string;\r\n drop?: string; // stringified array like `\"[\\\"col1\\\", \\\"col2\\\"]\"`\r\n rename?: string; // stringified object like `{ old: \"new\" }`\r\n imports?: string[];\r\n } = {},\r\n): string {\r\n const { add = \"\", drop, rename, imports = [] } = options;\r\n const allImports = [\"Migration\", ...imports].join(\", \");\r\n\r\n // Build the schema object dynamically\r\n const schemaParts: string[] = [];\r\n\r\n if (add) {\r\n schemaParts.push(` add: {\\n${add}\\n },`);\r\n }\r\n\r\n if (drop) {\r\n schemaParts.push(` drop: ${drop},`);\r\n }\r\n\r\n if (rename) {\r\n schemaParts.push(` rename: ${rename},`);\r\n }\r\n\r\n return `import { ${allImports} } from \"@warlock.js/cascade\";\r\nimport { ${entityName.pascal} } from \"../${entityName.kebab}.model\";\r\n\r\nexport default Migration.alter(${entityName.pascal}, {\r\n${schemaParts.join(\"\\n\")}\r\n});\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Create Schema template\r\n * Outputs to: schema/create-{entity}.schema.ts\r\n */\r\nexport function crudCreateSchemaStub(moduleName: Name): string {\r\n return `import { type Infer, v } from \"@warlock.js/seal\";\r\n\r\nexport const create${moduleName.pascal}Schema = v.object({\r\n // TODO: Add validation rules\r\n});\r\n\r\nexport type Create${moduleName.pascal}Schema = Infer<typeof create${moduleName.pascal}Schema>;\r\n`;\r\n}\r\n\r\n/**\r\n * CRUD Update Schema template\r\n * Outputs to: schema/update-{entity}.schema.ts\r\n */\r\nexport function crudUpdateSchemaStub(moduleName: Name): string {\r\n return `import { type Infer, v } from \"@warlock.js/seal\";\r\n\r\nexport const update${moduleName.pascal}Schema = v.object({\r\n // TODO: Add validation rules\r\n});\r\n\r\nexport type Update${moduleName.pascal}Schema = Infer<typeof update${moduleName.pascal}Schema>;\r\n`;\r\n}\r\n\r\n/**\r\n * Service template stub\r\n */\r\nexport function serviceStub(name: Name): string {\r\n return `export async function ${name.camel}Service(data: any): Promise<any> {\r\n // TODO: Implement service logic\r\n throw new Error(\"${name.camel}Service not implemented\");\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * Schema template stub\r\n * Outputs to: schema/{name}.schema.ts\r\n */\r\nexport function schemaStub(name: Name): string {\r\n return `import { type Infer, v } from \"@warlock.js/seal\";\r\n\r\nexport const ${name.camel}Schema = v.object({\r\n // TODO: Define validation schema\r\n});\r\n\r\nexport type ${name.pascal}Schema = Infer<typeof ${name.camel}Schema>;\r\n`;\r\n}\r\n\r\n/**\r\n * Model template stub\r\n */\r\nexport function modelStub(\r\n name: Name,\r\n options: { tableName?: string; withResource?: boolean } = {},\r\n): string {\r\n const { tableName = `${name.plural.snake}`, withResource } = options;\r\n\r\n return `import { Model } from \"@warlock.js/core\";\r\nimport type { StrictMode } from \"@warlock.js/cascade\";\r\nimport { v, type Infer } from \"@warlock.js/core\";\r\n${withResource ? `import { ${name.singular.pascal}Resource } from \"../../resources/${name.singular.kebab}.resource\";` : \"\"}\r\n\r\nconst ${name.singular.camel}Schema = v.object({\r\n // TODO: Define model schema\r\n});\r\n\r\nexport type ${name.singular.pascal}Type = Infer.Output<typeof ${name.singular.camel}Schema>;\r\n\r\nexport class ${name.singular.pascal} extends Model<${name.singular.pascal}Type> {\r\n public static table = \"${tableName}\";\r\n public static strictMode: StrictMode = \"fail\";\r\n${withResource ? ` public static resource = ${name.singular.pascal}Resource;` : \"\"}\r\n\r\n public static schema = ${name.singular.camel}Schema;\r\n\r\n public static relations = {\r\n // TODO: Define relations\r\n };\r\n}\r\n`;\r\n}\r\n\r\n/**\r\n * Repository template stub\r\n */\r\nexport function repositoryStub(name: Name): string {\r\n return `import type { FilterByOptions, RepositoryOptions } from \"@warlock.js/core\";\r\nimport { RepositoryManager } from \"@warlock.js/core\";\r\nimport { ${name.singular.pascal} } from \"../models/${name.singular.kebab}\";\r\n\r\ntype ${name.singular.pascal}ListFilter = {\r\n // Repository list filters\r\n};\r\n\r\nexport type ${name.singular.pascal}ListOptions = RepositoryOptions & ${name.singular.pascal}ListFilter;\r\n\r\nexport class ${name.plural.pascal}Repository extends RepositoryManager<${name.singular.pascal}, ${name.singular.pascal}ListFilter> {\r\n public source = ${name.singular.pascal};\r\n\r\n protected defaultOptions: RepositoryOptions = this.withDefaultOptions({});\r\n\r\n protected filterBy: FilterByOptions = this.withDefaultFilters({\r\n name: \"like\",\r\n });\r\n}\r\n\r\nexport const ${name.plural.camel}Repository = new ${name.plural.pascal}Repository();\r\n`;\r\n}\r\n\r\n/**\r\n * Resource template stub\r\n */\r\nexport function resourceStub(name: Name): string {\r\n return `import { Resource } from \"@warlock.js/core\";\r\n\r\nexport class ${name.singular.pascal}Resource extends Resource {\r\n public schema = {\r\n id: \"int\",\r\n name: \"string\",\r\n // TODO: Define resource schema\r\n };\r\n}\r\n`;\r\n}\r\n"],"mappings":";;;;;;;;;AAWA,SAAgB,eACd,MACA,UAAwC,CAAC,GACjC;CACR,MAAM,EAAE,mBAAmB;CAE3B,IAAI,CAAC,gBACH,OAAO;;eAEI,KAAK,MAAM;;;;;CAOxB,OAAO;gBACO,KAAK,OAAO,UAAU,KAAK,MAAM,2BAA2B,KAAK,MAAM;;eAExE,KAAK,MAAM,oCAAoC,KAAK,OAAO;;;;;;;;EAQxE,KAAK,MAAM;YACD,KAAK,MAAM;;;AAGvB;;;;;AAMA,SAAgB,yBAAyB,YAA0B;CACjE,OAAO;sBACa,WAAW,OAAO,gBAAgB,WAAW,OAAO,kCAAkC,WAAW,MAAM;iBAC5G,WAAW,OAAO,qCAAqC,WAAW,MAAM;;qBAEpE,WAAW,OAAO,0CAA0C,WAAW,OAAO;;;;UAIzF,WAAW,MAAM,iBAAiB,WAAW,OAAO;;;MAGxD,WAAW,MAAM;;;;QAIf,WAAW,OAAO;kBACR,WAAW,OAAO;;;AAGpC;;;;AAKA,SAAgB,yBAAyB,YAA0B;CACjE,OAAO;sBACa,WAAW,OAAO,gBAAgB,WAAW,OAAO,kCAAkC,WAAW,MAAM;iBAC5G,WAAW,OAAO,qCAAqC,WAAW,MAAM;;qBAEpE,WAAW,OAAO,0CAA0C,WAAW,OAAO;;;;UAIzF,WAAW,MAAM,iBAAiB,WAAW,OAAO;;;MAGxD,WAAW,MAAM;;;;QAIf,WAAW,OAAO;kBACR,WAAW,OAAO;;;AAGpC;;;;AAKA,SAAgB,uBAAuB,YAA0B;CAC/D,MAAM,SAAS,WAAW;CAC1B,OAAO;eACM,OAAO,OAAO,mCAAmC,OAAO,MAAM;;mBAE1D,OAAO,OAAO;;;;2CAIU,OAAO,OAAO;;;;;;;;AAQzD;;;;AAKA,SAAgB,uBAAuB,YAA0B;CAC/D,OAAO;cACK,WAAW,OAAO,kCAAkC,WAAW,MAAM;;kBAEjE,WAAW,OAAO;;;;UAI1B,WAAW,MAAM,cAAc,WAAW,OAAO;;SAElD,WAAW,MAAM;;;;;MAKpB,WAAW,MAAM;;;;AAIvB;;;;AAKA,SAAgB,yBAAyB,YAA0B;CACjE,OAAO;iBACQ,WAAW,OAAO,qCAAqC,WAAW,MAAM;;qBAEpE,WAAW,OAAO;;;;gBAIvB,WAAW,OAAO;;;;;AAKlC;;;;AAKA,SAAgB,eAAe,YAA0B;CACvD,MAAM,WAAW,WAAW;CAC5B,MAAM,SAAS,WAAW;CAE1B,OAAO;;iBAEQ,SAAS,OAAO,0CAA0C,SAAS,MAAM;iBACzE,SAAS,OAAO,0CAA0C,SAAS,MAAM;cAC5E,SAAS,OAAO,uCAAuC,SAAS,MAAM;eACrE,OAAO,OAAO,wCAAwC,OAAO,MAAM;iBACjE,SAAS,OAAO,0CAA0C,SAAS,MAAM;;;;eAI3E,OAAO,MAAM;gBACZ,OAAO,OAAO;eACf,SAAS,OAAO;oBACX,SAAS,OAAO;oBAChB,SAAS,OAAO;qBACf,SAAS,OAAO;;;AAGrC;;;;AAKA,SAAgB,cAAc,YAA0B;CACtD,MAAM,WAAW,WAAW;CAC5B,MAAM,SAAS,WAAW;CAE1B,OAAO;;WAEE,SAAS,OAAO,uBAAuB,OAAO,MAAM,aAAa,SAAS,MAAM;;eAE5E,SAAS,MAAM;;;;cAIhB,SAAS,OAAO,+BAA+B,SAAS,MAAM;;;eAG7D,SAAS,OAAO,iBAAiB,SAAS,OAAO;2BACrC,OAAO,MAAM;;2BAEb,SAAS,MAAM;;;;6BAIb,SAAS,OAAO;;;AAG7C;;;;AAKA,SAAgB,iBAAiB,YAA0B;CAIzD,OAAO;;eAFQ,WAAW,SAIN,OAAO;;;;;;;AAO7B;;;;AAKA,SAAgB,mBAAmB,QAAsB;CACvD,MAAM,qBAAqB,OAAO;CAClC,MAAM,mBAAmB,OAAO;CAChC,OAAO;;WAEE,mBAAmB,OAAO,qBAAqB,mBAAmB,MAAM;;OAE5E,mBAAmB,OAAO;;;;cAInB,mBAAmB,OAAO,uCAAuC,mBAAmB,OAAO;;QAEjG,iBAAiB,OAAO,uCAAuC,mBAAmB,OAAO,IAAI,mBAAmB,OAAO;oBAC3G,mBAAmB,OAAO;;;;;;;;;;;;;;;eAe/B,iBAAiB,MAAM,mBAAmB,iBAAiB,OAAO;;AAEjF;;;;AAKA,SAAgB,sBAAsB,QAAsB;CAC1D,MAAM,qBAAqB,OAAO;CAClC,OAAO,YAAY,mBAAmB,OAAO,qBAAqB,mBAAmB,MAAM;sBACvE,mBAAmB,OAAO,kCAAkC,mBAAmB,MAAM;;8BAE7E,mBAAmB,OAAO,sBAAsB,mBAAmB,OAAO;UAC9F,mBAAmB,MAAM,WAAW,mBAAmB,OAAO;WAC7D,mBAAmB,MAAM;;;AAGpC;;;;AAKA,SAAgB,sBAAsB,QAAsB;CAC1D,MAAM,qBAAqB,OAAO;CAClC,OAAO;cACK,mBAAmB,OAAO,wBAAwB,mBAAmB,MAAM;sBACnE,mBAAmB,OAAO,kCAAkC,mBAAmB,MAAM;;8BAE7E,mBAAmB,OAAO,2CAA2C,mBAAmB,OAAO;UACnH,mBAAmB,MAAM,cAAc,mBAAmB,OAAO;;UAEjE,mBAAmB,MAAM;WACxB,mBAAmB,MAAM;;;AAGpC;;;;AAKA,SAAgB,oBAAoB,QAAsB;CACxD,MAAM,mBAAmB,OAAO;CAChC,OAAO,YAAY,iBAAiB,MAAM,qCAAqC,iBAAiB,MAAM;;4BAE5E,iBAAiB,OAAO;WACzC,iBAAiB,MAAM;;;AAGlC;;;;AAKA,SAAgB,mBAAmB,QAAsB;CACvD,OAAO,YAAY,OAAO,OAAO,MAAM,qCAAqC,OAAO,OAAO,MAAM;;;2BAGvE,OAAO,SAAS,OAAO;UACxC,OAAO,SAAS,MAAM,WAAW,OAAO,OAAO,MAAM;;SAEtD,OAAO,SAAS,MAAM;uCACQ,OAAO,SAAS,OAAO;;;WAGnD,OAAO,SAAS,MAAM;;;AAGjC;;;;AAKA,SAAgB,sBAAsB,QAAsB;CAC1D,MAAM,WAAW,OAAO;CACxB,OAAO;cACK,SAAS,OAAO,wBAAwB,SAAS,MAAM;;8BAEvC,SAAS,OAAO;UACpC,SAAS,MAAM,cAAc,SAAS,OAAO;SAC9C,SAAS,MAAM;uCACe,SAAS,OAAO;;UAE7C,SAAS,MAAM;;;AAGzB;;;;AAKA,SAAgB,aAAa,QAAsB;CACjD,OAAO;WACE,OAAO,SAAS,OAAO,qBAAqB,OAAO,SAAS,MAAM;;;gBAG7D,OAAO,OAAO,OAAO;;;;;;cAMvB,OAAO,SAAS,OAAO;;;;;;;;;;;AAWrC;;;;;;;AAQA,SAAgB,cACd,YACA,UAKI,CAAC,GACG;CACR,MAAM,EAAE,UAAU,IAAI,UAAU,CAAC,GAAG,aAAa,SAAS;CAE1D,MAAM,aAAa,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI;CAEtD,IAAI,gBAAgB;CACpB,IAAI,eAAe,OACjB,gBAAgB;CAGlB,OAAO,YAAY,WAAW;WACrB,WAAW,OAAO,cAAc,WAAW,MAAM;;kCAE1B,WAAW,OAAO;EAClD,UAAU,UAAU,2DAA2D;GAC9E,cAAc;;AAEjB;;;;AAKA,SAAgB,mBACd,YACA,UAKI,CAAC,GACG;CACR,MAAM,EAAE,MAAM,IAAI,MAAM,QAAQ,UAAU,CAAC,MAAM;CACjD,MAAM,aAAa,CAAC,aAAa,GAAG,OAAO,CAAC,CAAC,KAAK,IAAI;CAGtD,MAAM,cAAwB,CAAC;CAE/B,IAAI,KACF,YAAY,KAAK,aAAa,IAAI,OAAO;CAG3C,IAAI,MACF,YAAY,KAAK,WAAW,KAAK,EAAE;CAGrC,IAAI,QACF,YAAY,KAAK,aAAa,OAAO,EAAE;CAGzC,OAAO,YAAY,WAAW;WACrB,WAAW,OAAO,cAAc,WAAW,MAAM;;iCAE3B,WAAW,OAAO;EACjD,YAAY,KAAK,IAAI,EAAE;;;AAGzB;;;;;AAMA,SAAgB,qBAAqB,YAA0B;CAC7D,OAAO;;qBAEY,WAAW,OAAO;;;;oBAInB,WAAW,OAAO,8BAA8B,WAAW,OAAO;;AAEtF;;;;;AAMA,SAAgB,qBAAqB,YAA0B;CAC7D,OAAO;;qBAEY,WAAW,OAAO;;;;oBAInB,WAAW,OAAO,8BAA8B,WAAW,OAAO;;AAEtF;;;;AAKA,SAAgB,YAAY,MAAoB;CAC9C,OAAO,yBAAyB,KAAK,MAAM;;qBAExB,KAAK,MAAM;;;AAGhC;;;;;AAMA,SAAgB,WAAW,MAAoB;CAC7C,OAAO;;eAEM,KAAK,MAAM;;;;cAIZ,KAAK,OAAO,wBAAwB,KAAK,MAAM;;AAE7D;;;;AAKA,SAAgB,UACd,MACA,UAA0D,CAAC,GACnD;CACR,MAAM,EAAE,YAAY,GAAG,KAAK,OAAO,SAAS,iBAAiB;CAE7D,OAAO;;;EAGP,eAAe,YAAY,KAAK,SAAS,OAAO,mCAAmC,KAAK,SAAS,MAAM,eAAe,GAAG;;QAEnH,KAAK,SAAS,MAAM;;;;cAId,KAAK,SAAS,OAAO,6BAA6B,KAAK,SAAS,MAAM;;eAErE,KAAK,SAAS,OAAO,iBAAiB,KAAK,SAAS,OAAO;2BAC/C,UAAU;;EAEnC,eAAe,8BAA8B,KAAK,SAAS,OAAO,aAAa,GAAG;;2BAEzD,KAAK,SAAS,MAAM;;;;;;;AAO/C;;;;AAKA,SAAgB,eAAe,MAAoB;CACjD,OAAO;;WAEE,KAAK,SAAS,OAAO,qBAAqB,KAAK,SAAS,MAAM;;OAElE,KAAK,SAAS,OAAO;;;;cAId,KAAK,SAAS,OAAO,oCAAoC,KAAK,SAAS,OAAO;;eAE7E,KAAK,OAAO,OAAO,uCAAuC,KAAK,SAAS,OAAO,IAAI,KAAK,SAAS,OAAO;oBACnG,KAAK,SAAS,OAAO;;;;;;;;;eAS1B,KAAK,OAAO,MAAM,mBAAmB,KAAK,OAAO,OAAO;;AAEvE;;;;AAKA,SAAgB,aAAa,MAAoB;CAC/C,OAAO;;eAEM,KAAK,SAAS,OAAO;;;;;;;;AAQpC"}
|
|
1
|
+
{"version":3,"file":"stubs.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/core/src/cli/commands/generate/templates/stubs.ts"],"sourcesContent":["import type { ParsedName } from \"../types\";\nimport { Name } from \"../utils/name-parser\";\n\n/**\n * Controller template stub\n *\n * Controllers default to the guarded handler type since application\n * routes run behind `guarded()`. When `withValidation` is set, the\n * schema's exported type + value are imported directly from the\n * `schema/` folder and bound to the handler — no `requests/` alias.\n */\nexport function controllerStub(\n name: ParsedName,\n options: { withValidation?: boolean } = {},\n): string {\n const { withValidation } = options;\n\n if (!withValidation) {\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\n\nexport const ${name.camel}Controller: GuardedRequestHandler = async (request, response) => {\n // TODO: Implement controller logic\n return response.success({});\n};\n`;\n }\n\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { type ${name.pascal}Schema, ${name.camel}Schema } from \"../schema/${name.kebab}.schema\";\n\nexport const ${name.camel}Controller: GuardedRequestHandler<${name.pascal}Schema> = async (\n request,\n response,\n) => {\n // TODO: Implement controller logic\n return response.success({});\n};\n\n${name.camel}Controller.validation = {\n schema: ${name.camel}Schema,\n};\n`;\n}\n\n/**\n * CRUD Create Controller template\n * Note: moduleName is the module (plural), we need singular entity name\n */\nexport function crudCreateControllerStub(moduleName: Name): string {\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { type Create${moduleName.pascal}Schema, create${moduleName.pascal}Schema } from \"../schema/create-${moduleName.kebab}.schema\";\nimport { create${moduleName.pascal}Service } from \"../services/create-${moduleName.kebab}.service\";\n\nexport const create${moduleName.pascal}Controller: GuardedRequestHandler<Create${moduleName.pascal}Schema> = async (\n request,\n response,\n) => {\n const ${moduleName.camel} = await create${moduleName.pascal}Service(request.validated());\n\n return response.successCreate({\n ${moduleName.camel},\n });\n};\n\ncreate${moduleName.pascal}Controller.validation = {\n schema: create${moduleName.pascal}Schema,\n};\n`;\n}\n\n/**\n * CRUD Update Controller template\n */\nexport function crudUpdateControllerStub(moduleName: Name): string {\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { type Update${moduleName.pascal}Schema, update${moduleName.pascal}Schema } from \"../schema/update-${moduleName.kebab}.schema\";\nimport { update${moduleName.pascal}Service } from \"../services/update-${moduleName.kebab}.service\";\n\nexport const update${moduleName.pascal}Controller: GuardedRequestHandler<Update${moduleName.pascal}Schema> = async (\n request,\n response,\n) => {\n const ${moduleName.camel} = await update${moduleName.pascal}Service(request.input(\"id\"), request.validated());\n\n return response.success({\n ${moduleName.camel},\n });\n};\n\nupdate${moduleName.pascal}Controller.validation = {\n schema: update${moduleName.pascal}Schema,\n};\n`;\n}\n\n/**\n * CRUD List Controller template\n */\nexport function crudListControllerStub(moduleName: Name): string {\n const plural = moduleName.plural;\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { list${plural.pascal}Service } from \"../services/list-${plural.kebab}.service\";\n\nexport const list${plural.pascal}Controller: GuardedRequestHandler = async (\n request,\n response,\n) => {\n const { data, pagination } = await list${plural.pascal}Service(request.all());\n\n return response.success({\n data,\n pagination,\n });\n};\n`;\n}\n\n/**\n * CRUD Show/Get Controller template\n */\nexport function crudShowControllerStub(moduleName: Name): string {\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { get${moduleName.pascal}Service } from \"../services/get-${moduleName.kebab}.service\";\n\nexport const get${moduleName.pascal}Controller: GuardedRequestHandler = async (\n request,\n response,\n) => {\n const ${moduleName.camel} = await get${moduleName.pascal}Service(request.input(\"id\"));\n\n if (!${moduleName.camel}) {\n return response.notFound();\n }\n\n return response.success({\n ${moduleName.camel},\n });\n};\n`;\n}\n\n/**\n * CRUD Delete Controller template\n */\nexport function crudDeleteControllerStub(moduleName: Name): string {\n return `import { type GuardedRequestHandler } from \"app/auth/requests/guarded.request\";\nimport { delete${moduleName.pascal}Service } from \"../services/delete-${moduleName.kebab}.service\";\n\nexport const delete${moduleName.pascal}Controller: GuardedRequestHandler = async (\n request,\n response,\n) => {\n await delete${moduleName.pascal}Service(request.input(\"id\"));\n\n return response.noContent();\n};\n`;\n}\n\n/**\n * CRUD Routes template\n */\nexport function crudRoutesStub(moduleName: Name): string {\n const singular = moduleName.singular;\n const plural = moduleName.plural;\n\n return `import { router } from \"@warlock.js/core\";\nimport { guarded } from \"app/shared/utils/router\";\nimport { create${singular.pascal}Controller } from \"./controllers/create-${singular.kebab}.controller\";\nimport { delete${singular.pascal}Controller } from \"./controllers/delete-${singular.kebab}.controller\";\nimport { get${singular.pascal}Controller } from \"./controllers/get-${singular.kebab}.controller\";\nimport { list${plural.pascal}Controller } from \"./controllers/list-${plural.kebab}.controller\";\nimport { update${singular.pascal}Controller } from \"./controllers/update-${singular.kebab}.controller\";\n\nguarded(() => {\n router\n .route(\"/${plural.kebab}\")\n .list(list${plural.pascal}Controller)\n .show(get${singular.pascal}Controller)\n .create(create${singular.pascal}Controller)\n .update(update${singular.pascal}Controller)\n .destroy(delete${singular.pascal}Controller);\n});\n`;\n}\n\n/**\n * CRUD Model template\n */\nexport function crudModelStub(moduleName: Name): string {\n const singular = moduleName.singular;\n const plural = moduleName.plural;\n\n return `import { Model, RegisterModel } from \"@warlock.js/cascade\";\nimport { type Infer, v } from \"@warlock.js/seal\";\nimport { ${singular.pascal}Resource } from \"app/${plural.kebab}/resources/${singular.kebab}.resource\";\n\nexport const ${singular.camel}Schema = v.object({\n // TODO: Add more fields\n});\n\nexport type ${singular.pascal}Schema = Infer.Output<typeof ${singular.camel}Schema>;\n\n@RegisterModel()\nexport class ${singular.pascal} extends Model<${singular.pascal}Schema> {\n public static table = \"${plural.snake}\";\n\n public static schema = ${singular.camel}Schema;\n\n public static relations = {};\n\n public static resource = ${singular.pascal}Resource;\n}\n`;\n}\n\n/**\n * CRUD Resource template\n */\nexport function crudResourceStub(moduleName: Name): string {\n // Get singular entity name\n const entity = moduleName.singular;\n\n return `import { defineResource } from \"@warlock.js/core\";\n\nexport const ${entity.pascal}Resource = defineResource({\n schema: {\n id: \"number\",\n // TODO: Add more resource fields\n },\n});\n`;\n}\n\n/**\n * CRUD Repository template\n */\nexport function crudRepositoryStub(entity: Name): string {\n const moduleSingularName = entity.singular;\n const modulePluralName = entity.plural;\n return `import type { FilterRules, TypedRepositoryOptions } from \"@warlock.js/core\";\nimport { RepositoryManager } from \"@warlock.js/core\";\nimport { ${moduleSingularName.pascal} } from \"../models/${moduleSingularName.kebab}\";\n\ntype ${moduleSingularName.pascal}ListFilter = {\n // Repository list filters\n};\n\nexport type ${moduleSingularName.pascal}ListOptions = TypedRepositoryOptions<${moduleSingularName.pascal}ListFilter>;\n\nclass ${modulePluralName.pascal}Repository extends RepositoryManager<${moduleSingularName.pascal}, ${moduleSingularName.pascal}ListOptions> {\n public source = ${moduleSingularName.pascal};\n\n public simpleSelectColumns: string[] = [\"id\"];\n\n public filterBy: FilterRules = {\n id: \"=\",\n };\n\n public defaultOptions: RepositoryOptions = {\n orderBy: {\n id: \"desc\",\n },\n };\n}\n\nexport const ${modulePluralName.camel}Repository = new ${modulePluralName.pascal}Repository();\n`;\n}\n\n/**\n * CRUD Create Service template\n */\nexport function crudCreateServiceStub(entity: Name): string {\n const moduleSingularName = entity.singular;\n return `import { ${moduleSingularName.pascal} } from \"../models/${moduleSingularName.kebab}\";\nimport type { Create${moduleSingularName.pascal}Schema } from \"../schema/create-${moduleSingularName.kebab}.schema\";\n\nexport async function create${moduleSingularName.pascal}Service(data: Create${moduleSingularName.pascal}Schema) {\n const ${moduleSingularName.camel} = await ${moduleSingularName.pascal}.create(data);\n return ${moduleSingularName.camel};\n}\n`;\n}\n\n/**\n * CRUD Update Service template\n */\nexport function crudUpdateServiceStub(entity: Name): string {\n const moduleSingularName = entity.singular;\n return `import { ResourceNotFoundError } from \"@warlock.js/core\";\nimport { get${moduleSingularName.pascal}Service } from \"./get-${moduleSingularName.kebab}.service\";\nimport type { Update${moduleSingularName.pascal}Schema } from \"../schema/update-${moduleSingularName.kebab}.schema\";\n\nexport async function update${moduleSingularName.pascal}Service(id: number | string, data: Update${moduleSingularName.pascal}Schema) {\n const ${moduleSingularName.camel} = await get${moduleSingularName.pascal}Service(id);\n\n await ${moduleSingularName.camel}.save({ merge: data });\n return ${moduleSingularName.camel};\n}\n`;\n}\n\n/**\n * CRUD List Service template\n */\nexport function crudListServiceStub(entity: Name): string {\n const modulePluralName = entity.plural;\n return `import { ${modulePluralName.camel}Repository } from \"../repositories/${modulePluralName.kebab}.repository\";\n\nexport async function list${modulePluralName.pascal}Service(filters: any) {\n return ${modulePluralName.camel}Repository.listCached(filters);\n}\n`;\n}\n\n/**\n * CRUD Get Service template\n */\nexport function crudGetServiceStub(entity: Name): string {\n return `import { ${entity.plural.camel}Repository } from \"../repositories/${entity.plural.kebab}.repository\";\nimport { ResourceNotFoundError } from \"@warlock.js/core\";\n\nexport async function get${entity.singular.pascal}Service(id: number | string) {\n const ${entity.singular.camel} = await ${entity.plural.camel}Repository.getCached(id);\n\n if (!${entity.singular.camel}) {\n throw new ResourceNotFoundError(\"${entity.singular.pascal} resource not found!\");\n }\n\n return ${entity.singular.camel};\n}\n`;\n}\n\n/**\n * CRUD Delete Service template\n */\nexport function crudDeleteServiceStub(entity: Name): string {\n const singular = entity.singular;\n return `import { ResourceNotFoundError } from \"@warlock.js/core\";\nimport { get${singular.pascal}Service } from \"./get-${singular.kebab}.service\";\n\nexport async function delete${singular.pascal}Service(id: number | string) {\n const ${singular.camel} = await get${singular.pascal}Service(id);\n if (!${singular.camel}) {\n throw new ResourceNotFoundError(\"${singular.pascal} not found\");\n }\n await ${singular.camel}.destroy();\n}\n`;\n}\n\n/**\n * CRUD Seed template\n */\nexport function crudSeedStub(entity: Name): string {\n return `import { seeder } from \"@warlock.js/core\";\nimport { ${entity.singular.pascal} } from \"../models/${entity.singular.kebab}\";\n\nexport default seeder({\n name: \"Seed ${entity.plural.pascal}\",\n once: true,\n enabled: true,\n run: async ({ track }) => {\n const total = 10;\n for (let i = 0; i < total; i++) {\n track(\n await ${entity.singular.pascal}.create({\n // TODO: Add more fields\n }),\n );\n }\n },\n});\n`;\n}\n\n/**\n * Migration template\n */\n/**\n * Migration Create template\n */\nexport function migrationStub(\n entityName: ParsedName,\n options: {\n columns?: string;\n imports?: string[];\n timestamps?: boolean;\n tableName?: string;\n } = {},\n): string {\n const { columns = \"\", imports = [], timestamps = true } = options;\n\n const allImports = [\"Migration\", ...imports].join(\", \");\n\n let optionsString = \"\";\n if (timestamps === false) {\n optionsString = `, { timestamps: false }`;\n }\n\n return `import { ${allImports} } from \"@warlock.js/cascade\";\nimport { ${entityName.pascal} } from \"../${entityName.kebab}.model\";\n\nexport default Migration.create(${entityName.pascal}, {\n${columns ? columns : \" // add your columns here, id is auto added to the list\"}\n}${optionsString});\n`;\n}\n\n/**\n * Migration Alter template\n */\nexport function migrationAlterStub(\n entityName: ParsedName,\n options: {\n add?: string;\n drop?: string; // stringified array like `\"[\\\"col1\\\", \\\"col2\\\"]\"`\n rename?: string; // stringified object like `{ old: \"new\" }`\n imports?: string[];\n } = {},\n): string {\n const { add = \"\", drop, rename, imports = [] } = options;\n const allImports = [\"Migration\", ...imports].join(\", \");\n\n // Build the schema object dynamically\n const schemaParts: string[] = [];\n\n if (add) {\n schemaParts.push(` add: {\\n${add}\\n },`);\n }\n\n if (drop) {\n schemaParts.push(` drop: ${drop},`);\n }\n\n if (rename) {\n schemaParts.push(` rename: ${rename},`);\n }\n\n return `import { ${allImports} } from \"@warlock.js/cascade\";\nimport { ${entityName.pascal} } from \"../${entityName.kebab}.model\";\n\nexport default Migration.alter(${entityName.pascal}, {\n${schemaParts.join(\"\\n\")}\n});\n`;\n}\n\n/**\n * CRUD Create Schema template\n * Outputs to: schema/create-{entity}.schema.ts\n */\nexport function crudCreateSchemaStub(moduleName: Name): string {\n return `import { type Infer, v } from \"@warlock.js/seal\";\n\nexport const create${moduleName.pascal}Schema = v.object({\n // TODO: Add validation rules\n});\n\nexport type Create${moduleName.pascal}Schema = Infer<typeof create${moduleName.pascal}Schema>;\n`;\n}\n\n/**\n * CRUD Update Schema template\n * Outputs to: schema/update-{entity}.schema.ts\n */\nexport function crudUpdateSchemaStub(moduleName: Name): string {\n return `import { type Infer, v } from \"@warlock.js/seal\";\n\nexport const update${moduleName.pascal}Schema = v.object({\n // TODO: Add validation rules\n});\n\nexport type Update${moduleName.pascal}Schema = Infer<typeof update${moduleName.pascal}Schema>;\n`;\n}\n\n/**\n * Service template stub\n */\nexport function serviceStub(name: Name): string {\n return `export async function ${name.camel}Service(data: any): Promise<any> {\n // TODO: Implement service logic\n throw new Error(\"${name.camel}Service not implemented\");\n}\n`;\n}\n\n/**\n * Schema template stub\n * Outputs to: schema/{name}.schema.ts\n */\nexport function schemaStub(name: Name): string {\n return `import { type Infer, v } from \"@warlock.js/seal\";\n\nexport const ${name.camel}Schema = v.object({\n // TODO: Define validation schema\n});\n\nexport type ${name.pascal}Schema = Infer<typeof ${name.camel}Schema>;\n`;\n}\n\n/**\n * Model template stub\n */\nexport function modelStub(\n name: Name,\n options: { tableName?: string; withResource?: boolean } = {},\n): string {\n const { tableName = `${name.plural.snake}`, withResource } = options;\n\n return `import { Model, type StrictMode } from \"@warlock.js/cascade\";\nimport { v, type Infer } from \"@warlock.js/seal\";\n${withResource ? `import { ${name.singular.pascal}Resource } from \"../../resources/${name.singular.kebab}.resource\";` : \"\"}\n\nconst ${name.singular.camel}Schema = v.object({\n // TODO: Define model schema\n});\n\nexport type ${name.singular.pascal}Type = Infer.Output<typeof ${name.singular.camel}Schema>;\n\nexport class ${name.singular.pascal} extends Model<${name.singular.pascal}Type> {\n public static table = \"${tableName}\";\n public static strictMode: StrictMode = \"fail\";\n${withResource ? ` public static resource = ${name.singular.pascal}Resource;` : \"\"}\n\n public static schema = ${name.singular.camel}Schema;\n\n public static relations = {\n // TODO: Define relations\n };\n}\n`;\n}\n\n/**\n * Repository template stub\n */\nexport function repositoryStub(name: Name): string {\n return `import type { FilterByOptions, RepositoryOptions } from \"@warlock.js/core\";\nimport { RepositoryManager } from \"@warlock.js/core\";\nimport { ${name.singular.pascal} } from \"../models/${name.singular.kebab}\";\n\ntype ${name.singular.pascal}ListFilter = {\n // Repository list filters\n};\n\nexport type ${name.singular.pascal}ListOptions = RepositoryOptions & ${name.singular.pascal}ListFilter;\n\nexport class ${name.plural.pascal}Repository extends RepositoryManager<${name.singular.pascal}, ${name.singular.pascal}ListFilter> {\n public source = ${name.singular.pascal};\n\n protected defaultOptions: RepositoryOptions = this.withDefaultOptions({});\n\n protected filterBy: FilterByOptions = this.withDefaultFilters({\n name: \"like\",\n });\n}\n\nexport const ${name.plural.camel}Repository = new ${name.plural.pascal}Repository();\n`;\n}\n\n/**\n * Resource template stub\n */\nexport function resourceStub(name: Name): string {\n return `import { Resource } from \"@warlock.js/core\";\n\nexport class ${name.singular.pascal}Resource extends Resource {\n public schema = {\n id: \"int\",\n name: \"string\",\n // TODO: Define resource schema\n };\n}\n`;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { methodRank } from "./route-row.mjs";
|
|
2
|
+
import { colors } from "@mongez/copper";
|
|
3
|
+
|
|
4
|
+
//#region ../@warlock.js/core/src/cli/commands/routes/format-routes-table.ts
|
|
5
|
+
/** The columns rendered, in order, with their header labels. */
|
|
6
|
+
const COLUMNS = [
|
|
7
|
+
{
|
|
8
|
+
key: "method",
|
|
9
|
+
header: "METHOD"
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
key: "path",
|
|
13
|
+
header: "PATH"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
key: "name",
|
|
17
|
+
header: "NAME"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: "action",
|
|
21
|
+
header: "ACTION"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "middleware",
|
|
25
|
+
header: "MW"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
key: "source",
|
|
29
|
+
header: "SOURCE"
|
|
30
|
+
}
|
|
31
|
+
];
|
|
32
|
+
/** Two spaces between columns. */
|
|
33
|
+
const GAP = " ";
|
|
34
|
+
/** Shown for an empty string cell so the column doesn't read as a gap. */
|
|
35
|
+
const EMPTY_CELL = "—";
|
|
36
|
+
/**
|
|
37
|
+
* The plain (uncolored) text of one cell. Numbers render as-is; an empty string
|
|
38
|
+
* renders as {@link EMPTY_CELL}. This is the single source of truth for both
|
|
39
|
+
* the width math and the rendered text, so colored and uncolored output stay
|
|
40
|
+
* aligned.
|
|
41
|
+
*
|
|
42
|
+
* @param row - The row
|
|
43
|
+
* @param key - The column key
|
|
44
|
+
* @returns The cell's printable text
|
|
45
|
+
*/
|
|
46
|
+
function cellText(row, key) {
|
|
47
|
+
if (key === "middleware") return String(row.middleware);
|
|
48
|
+
const value = row[key];
|
|
49
|
+
return value.length > 0 ? value : EMPTY_CELL;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Per-column display width: the longest of the header and every cell.
|
|
53
|
+
*
|
|
54
|
+
* @param rows - The rows to measure
|
|
55
|
+
* @returns One width per column, in column order
|
|
56
|
+
*/
|
|
57
|
+
function columnWidths(rows) {
|
|
58
|
+
return COLUMNS.map((column) => Math.max(column.header.length, ...rows.map((row) => cellText(row, column.key).length)));
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build a one-line, human-readable summary: the total plus a per-method
|
|
62
|
+
* breakdown ordered by {@link methodRank}, e.g.
|
|
63
|
+
* `42 routes (38 GET · 2 POST · 1 PUT · 1 DELETE)`.
|
|
64
|
+
*
|
|
65
|
+
* @param rows - The rows being summarized
|
|
66
|
+
* @returns The summary line
|
|
67
|
+
*/
|
|
68
|
+
function routesSummary(rows) {
|
|
69
|
+
const noun = rows.length === 1 ? "route" : "routes";
|
|
70
|
+
if (rows.length === 0) return `0 ${noun}`;
|
|
71
|
+
const counts = /* @__PURE__ */ new Map();
|
|
72
|
+
for (const row of rows) counts.set(row.method, (counts.get(row.method) ?? 0) + 1);
|
|
73
|
+
const breakdown = [...counts.entries()].sort(([a], [b]) => methodRank(a) - methodRank(b)).map(([method, count]) => `${count} ${method}`).join(" · ");
|
|
74
|
+
return `${rows.length} ${noun} (${breakdown})`;
|
|
75
|
+
}
|
|
76
|
+
/** Per-verb color for the METHOD column. Unknown verbs fall back to white. */
|
|
77
|
+
const METHOD_COLOR = {
|
|
78
|
+
GET: colors.green,
|
|
79
|
+
POST: colors.blue,
|
|
80
|
+
PUT: colors.yellow,
|
|
81
|
+
PATCH: colors.yellow,
|
|
82
|
+
DELETE: colors.red,
|
|
83
|
+
OPTIONS: colors.gray,
|
|
84
|
+
HEAD: colors.gray,
|
|
85
|
+
ALL: colors.magenta
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Colorize the method label, then right-pad with plain spaces so column
|
|
89
|
+
* alignment is computed from the visible width, not the ANSI-coded length.
|
|
90
|
+
*
|
|
91
|
+
* @param method - The uppercased HTTP verb
|
|
92
|
+
* @param width - The METHOD column width
|
|
93
|
+
* @returns The colored, padded cell
|
|
94
|
+
*/
|
|
95
|
+
function colorizeMethodCell(method, width) {
|
|
96
|
+
return (METHOD_COLOR[method] ?? colors.white)(method) + " ".repeat(Math.max(0, width - method.length));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Print the routes table to stdout with a bold header, verb-colored METHOD
|
|
100
|
+
* column, and a dimmed summary. The empty case prints a single yellow notice
|
|
101
|
+
* (a booted app with zero routes usually means a route module failed to load).
|
|
102
|
+
*
|
|
103
|
+
* Thin presentation wrapper over {@link formatRoutesTableLines} /
|
|
104
|
+
* {@link routesSummary} — those stay the source of truth for layout.
|
|
105
|
+
*
|
|
106
|
+
* @param rows - The rows to print (already filtered/sorted by the caller)
|
|
107
|
+
*/
|
|
108
|
+
function printRoutesTable(rows) {
|
|
109
|
+
if (rows.length === 0) {
|
|
110
|
+
console.log(colors.yellow("No routes registered — did a route module fail to load?"));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const widths = columnWidths(rows);
|
|
114
|
+
const headerLine = COLUMNS.map((column, index) => column.header.padEnd(widths[index])).join(GAP).trimEnd();
|
|
115
|
+
console.log(colors.bold(headerLine));
|
|
116
|
+
for (const row of rows) {
|
|
117
|
+
const cells = COLUMNS.map((column, index) => {
|
|
118
|
+
if (column.key === "method") return colorizeMethodCell(row.method, widths[index]);
|
|
119
|
+
return cellText(row, column.key).padEnd(widths[index]);
|
|
120
|
+
});
|
|
121
|
+
console.log(cells.join(GAP).trimEnd());
|
|
122
|
+
}
|
|
123
|
+
console.log("");
|
|
124
|
+
console.log(colors.gray(routesSummary(rows)));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
//#endregion
|
|
128
|
+
export { printRoutesTable };
|
|
129
|
+
//# sourceMappingURL=format-routes-table.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-routes-table.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/core/src/cli/commands/routes/format-routes-table.ts"],"sourcesContent":["import { colors } from \"@mongez/copper\";\nimport { methodRank, type RouteRow } from \"./route-row\";\n\n/** The columns rendered, in order, with their header labels. */\nconst COLUMNS = [\n { key: \"method\", header: \"METHOD\" },\n { key: \"path\", header: \"PATH\" },\n { key: \"name\", header: \"NAME\" },\n { key: \"action\", header: \"ACTION\" },\n { key: \"middleware\", header: \"MW\" },\n { key: \"source\", header: \"SOURCE\" },\n] as const;\n\ntype ColumnKey = (typeof COLUMNS)[number][\"key\"];\n\n/** Two spaces between columns. */\nconst GAP = \" \";\n\n/** Shown for an empty string cell so the column doesn't read as a gap. */\nconst EMPTY_CELL = \"—\";\n\n/**\n * The plain (uncolored) text of one cell. Numbers render as-is; an empty string\n * renders as {@link EMPTY_CELL}. This is the single source of truth for both\n * the width math and the rendered text, so colored and uncolored output stay\n * aligned.\n *\n * @param row - The row\n * @param key - The column key\n * @returns The cell's printable text\n */\nfunction cellText(row: RouteRow, key: ColumnKey): string {\n if (key === \"middleware\") return String(row.middleware);\n\n const value = row[key] as string;\n\n return value.length > 0 ? value : EMPTY_CELL;\n}\n\n/**\n * Per-column display width: the longest of the header and every cell.\n *\n * @param rows - The rows to measure\n * @returns One width per column, in column order\n */\nfunction columnWidths(rows: RouteRow[]): number[] {\n return COLUMNS.map((column) =>\n Math.max(column.header.length, ...rows.map((row) => cellText(row, column.key).length)),\n );\n}\n\n/**\n * Build a one-line, human-readable summary: the total plus a per-method\n * breakdown ordered by {@link methodRank}, e.g.\n * `42 routes (38 GET · 2 POST · 1 PUT · 1 DELETE)`.\n *\n * @param rows - The rows being summarized\n * @returns The summary line\n */\nexport function routesSummary(rows: RouteRow[]): string {\n const noun = rows.length === 1 ? \"route\" : \"routes\";\n\n if (rows.length === 0) return `0 ${noun}`;\n\n const counts = new Map<string, number>();\n\n for (const row of rows) {\n counts.set(row.method, (counts.get(row.method) ?? 0) + 1);\n }\n\n const breakdown = [...counts.entries()]\n .sort(([a], [b]) => methodRank(a) - methodRank(b))\n .map(([method, count]) => `${count} ${method}`)\n .join(\" · \");\n\n return `${rows.length} ${noun} (${breakdown})`;\n}\n\n/**\n * Render the routes table as an ordered list of plain (uncolored) lines:\n * a header row, one row per route, a blank line, then the summary. Returned as\n * strings (not printed) so the layout is unit-testable without ANSI noise.\n *\n * @param rows - The rows to render (already filtered/sorted by the caller)\n * @returns The lines to print, top to bottom\n */\nexport function formatRoutesTableLines(rows: RouteRow[]): string[] {\n if (rows.length === 0) {\n return [\"No routes registered.\"];\n }\n\n const widths = columnWidths(rows);\n\n const renderRow = (cells: string[]) =>\n cells.map((text, index) => text.padEnd(widths[index])).join(GAP).trimEnd();\n\n const lines = [renderRow(COLUMNS.map((column) => column.header))];\n\n for (const row of rows) {\n lines.push(renderRow(COLUMNS.map((column) => cellText(row, column.key))));\n }\n\n lines.push(\"\");\n lines.push(routesSummary(rows));\n\n return lines;\n}\n\n/** Per-verb color for the METHOD column. Unknown verbs fall back to white. */\nconst METHOD_COLOR: Record<string, (input: string) => string> = {\n GET: colors.green,\n POST: colors.blue,\n PUT: colors.yellow,\n PATCH: colors.yellow,\n DELETE: colors.red,\n OPTIONS: colors.gray,\n HEAD: colors.gray,\n ALL: colors.magenta,\n};\n\n/**\n * Colorize the method label, then right-pad with plain spaces so column\n * alignment is computed from the visible width, not the ANSI-coded length.\n *\n * @param method - The uppercased HTTP verb\n * @param width - The METHOD column width\n * @returns The colored, padded cell\n */\nfunction colorizeMethodCell(method: string, width: number): string {\n const colorize = METHOD_COLOR[method] ?? colors.white;\n\n return colorize(method) + \" \".repeat(Math.max(0, width - method.length));\n}\n\n/**\n * Print the routes table to stdout with a bold header, verb-colored METHOD\n * column, and a dimmed summary. The empty case prints a single yellow notice\n * (a booted app with zero routes usually means a route module failed to load).\n *\n * Thin presentation wrapper over {@link formatRoutesTableLines} /\n * {@link routesSummary} — those stay the source of truth for layout.\n *\n * @param rows - The rows to print (already filtered/sorted by the caller)\n */\nexport function printRoutesTable(rows: RouteRow[]): void {\n if (rows.length === 0) {\n console.log(colors.yellow(\"No routes registered — did a route module fail to load?\"));\n return;\n }\n\n const widths = columnWidths(rows);\n\n const headerLine = COLUMNS.map((column, index) => column.header.padEnd(widths[index]))\n .join(GAP)\n .trimEnd();\n\n console.log(colors.bold(headerLine));\n\n for (const row of rows) {\n const cells = COLUMNS.map((column, index) => {\n if (column.key === \"method\") {\n return colorizeMethodCell(row.method, widths[index]);\n }\n\n return cellText(row, column.key).padEnd(widths[index]);\n });\n\n console.log(cells.join(GAP).trimEnd());\n }\n\n console.log(\"\");\n console.log(colors.gray(routesSummary(rows)));\n}\n"],"mappings":";;;;;AAIA,MAAM,UAAU;CACd;EAAE,KAAK;EAAU,QAAQ;CAAS;CAClC;EAAE,KAAK;EAAQ,QAAQ;CAAO;CAC9B;EAAE,KAAK;EAAQ,QAAQ;CAAO;CAC9B;EAAE,KAAK;EAAU,QAAQ;CAAS;CAClC;EAAE,KAAK;EAAc,QAAQ;CAAK;CAClC;EAAE,KAAK;EAAU,QAAQ;CAAS;AACpC;;AAKA,MAAM,MAAM;;AAGZ,MAAM,aAAa;;;;;;;;;;;AAYnB,SAAS,SAAS,KAAe,KAAwB;CACvD,IAAI,QAAQ,cAAc,OAAO,OAAO,IAAI,UAAU;CAEtD,MAAM,QAAQ,IAAI;CAElB,OAAO,MAAM,SAAS,IAAI,QAAQ;AACpC;;;;;;;AAQA,SAAS,aAAa,MAA4B;CAChD,OAAO,QAAQ,KAAK,WAClB,KAAK,IAAI,OAAO,OAAO,QAAQ,GAAG,KAAK,KAAK,QAAQ,SAAS,KAAK,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CACvF;AACF;;;;;;;;;AAUA,SAAgB,cAAc,MAA0B;CACtD,MAAM,OAAO,KAAK,WAAW,IAAI,UAAU;CAE3C,IAAI,KAAK,WAAW,GAAG,OAAO,KAAK;CAEnC,MAAM,yBAAS,IAAI,IAAoB;CAEvC,KAAK,MAAM,OAAO,MAChB,OAAO,IAAI,IAAI,SAAS,OAAO,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC;CAG1D,MAAM,YAAY,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CACpC,MAAM,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CACjD,KAAK,CAAC,QAAQ,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC,CAC9C,KAAK,KAAK;CAEb,OAAO,GAAG,KAAK,OAAO,GAAG,KAAK,IAAI,UAAU;AAC9C;;AAiCA,MAAM,eAA0D;CAC9D,KAAK,OAAO;CACZ,MAAM,OAAO;CACb,KAAK,OAAO;CACZ,OAAO,OAAO;CACd,QAAQ,OAAO;CACf,SAAS,OAAO;CAChB,MAAM,OAAO;CACb,KAAK,OAAO;AACd;;;;;;;;;AAUA,SAAS,mBAAmB,QAAgB,OAAuB;CAGjE,QAFiB,aAAa,WAAW,OAAO,MAEjC,CAAC,MAAM,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,OAAO,MAAM,CAAC;AACzE;;;;;;;;;;;AAYA,SAAgB,iBAAiB,MAAwB;CACvD,IAAI,KAAK,WAAW,GAAG;EACrB,QAAQ,IAAI,OAAO,OAAO,yDAAyD,CAAC;EACpF;CACF;CAEA,MAAM,SAAS,aAAa,IAAI;CAEhC,MAAM,aAAa,QAAQ,KAAK,QAAQ,UAAU,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,CACnF,KAAK,GAAG,CAAC,CACT,QAAQ;CAEX,QAAQ,IAAI,OAAO,KAAK,UAAU,CAAC;CAEnC,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAQ,QAAQ,KAAK,QAAQ,UAAU;GAC3C,IAAI,OAAO,QAAQ,UACjB,OAAO,mBAAmB,IAAI,QAAQ,OAAO,MAAM;GAGrD,OAAO,SAAS,KAAK,OAAO,GAAG,CAAC,CAAC,OAAO,OAAO,MAAM;EACvD,CAAC;EAED,QAAQ,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC;CACvC;CAEA,QAAQ,IAAI,EAAE;CACd,QAAQ,IAAI,OAAO,KAAK,cAAc,IAAI,CAAC,CAAC;AAC9C"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
//#region ../@warlock.js/core/src/cli/commands/routes/route-row.ts
|
|
2
|
+
/**
|
|
3
|
+
* Display order of HTTP methods — used to rank rows within a path and to order
|
|
4
|
+
* the per-method breakdown in the summary line.
|
|
5
|
+
*/
|
|
6
|
+
const METHOD_ORDER = [
|
|
7
|
+
"GET",
|
|
8
|
+
"POST",
|
|
9
|
+
"PUT",
|
|
10
|
+
"PATCH",
|
|
11
|
+
"DELETE",
|
|
12
|
+
"OPTIONS",
|
|
13
|
+
"HEAD",
|
|
14
|
+
"ALL"
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Rank of a method for sorting. Unknown methods sort last (stable among
|
|
18
|
+
* themselves).
|
|
19
|
+
*
|
|
20
|
+
* @param method - Uppercased HTTP verb
|
|
21
|
+
* @returns The sort index
|
|
22
|
+
*/
|
|
23
|
+
function methodRank(method) {
|
|
24
|
+
const index = METHOD_ORDER.indexOf(method);
|
|
25
|
+
return index === -1 ? METHOD_ORDER.length : index;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Derive the handler/controller-action label for a route. Uses the handler
|
|
29
|
+
* function's name, stripping the `bound ` prefix that `Function.prototype.bind`
|
|
30
|
+
* prepends, and falls back to `"anonymous"` for an unnamed handler.
|
|
31
|
+
*
|
|
32
|
+
* @param route - The route to label
|
|
33
|
+
* @returns A printable action label
|
|
34
|
+
*/
|
|
35
|
+
function routeAction(route) {
|
|
36
|
+
const handler = route.handler;
|
|
37
|
+
if (typeof handler !== "function") return "anonymous";
|
|
38
|
+
const name = handler.name?.replace(/^bound /, "").trim();
|
|
39
|
+
return name ? name : "anonymous";
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Normalize a live {@link Route} into a printable {@link RouteRow}.
|
|
43
|
+
*
|
|
44
|
+
* @param route - The registered route
|
|
45
|
+
* @returns The display-ready row
|
|
46
|
+
*/
|
|
47
|
+
function toRouteRow(route) {
|
|
48
|
+
return {
|
|
49
|
+
method: route.method.toUpperCase(),
|
|
50
|
+
path: route.path,
|
|
51
|
+
name: route.name ?? "",
|
|
52
|
+
action: routeAction(route),
|
|
53
|
+
middleware: route.middleware?.length ?? 0,
|
|
54
|
+
source: route.sourceFile ?? ""
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Apply the `--method` / `--path` / `--name` filters to a set of rows. An
|
|
59
|
+
* omitted filter matches everything; provided filters are AND-ed.
|
|
60
|
+
*
|
|
61
|
+
* @param rows - The rows to filter
|
|
62
|
+
* @param filter - The active filters
|
|
63
|
+
* @returns The matching rows (a new array)
|
|
64
|
+
*/
|
|
65
|
+
function filterRouteRows(rows, filter) {
|
|
66
|
+
const method = filter.method?.toUpperCase();
|
|
67
|
+
const path = filter.path?.toLowerCase();
|
|
68
|
+
const name = filter.name?.toLowerCase();
|
|
69
|
+
return rows.filter((row) => {
|
|
70
|
+
if (method && row.method !== method) return false;
|
|
71
|
+
if (path && !row.path.toLowerCase().includes(path)) return false;
|
|
72
|
+
if (name && !row.name.toLowerCase().includes(name)) return false;
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Sort rows by path (ascending), then by HTTP-method order within a path, so
|
|
78
|
+
* every verb of one resource lists together in a predictable sequence.
|
|
79
|
+
*
|
|
80
|
+
* @param rows - The rows to sort
|
|
81
|
+
* @returns A new, sorted array
|
|
82
|
+
*/
|
|
83
|
+
function sortRouteRows(rows) {
|
|
84
|
+
return [...rows].sort((a, b) => {
|
|
85
|
+
if (a.path !== b.path) return a.path < b.path ? -1 : 1;
|
|
86
|
+
return methodRank(a.method) - methodRank(b.method);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
//#endregion
|
|
91
|
+
export { filterRouteRows, methodRank, sortRouteRows, toRouteRow };
|
|
92
|
+
//# sourceMappingURL=route-row.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-row.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/core/src/cli/commands/routes/route-row.ts"],"sourcesContent":["import type { Route } from \"../../../router/types\";\n\n/**\n * A single registered route, normalized to the flat, display-ready shape the\n * `warlock routes` table (and its `--json` output) render. Kept separate from\n * the live {@link Route} so the formatter and filters never touch the handler\n * function, validation object, or Fastify server options — only printable\n * scalars.\n */\nexport type RouteRow = {\n /** Uppercased HTTP verb (`\"all\"` → `\"ALL\"`). */\n method: string;\n\n /** Full request path (prefix already folded in by the router). */\n path: string;\n\n /** Route name, or `\"\"` when the route was registered without one. */\n name: string;\n\n /** Handler/controller-action label — the handler function name, or `\"anonymous\"`. */\n action: string;\n\n /** Number of middleware attached to the route. */\n middleware: number;\n\n /** Relative source file the route was registered from, or `\"\"`. */\n source: string;\n};\n\n/** Filters accepted by `warlock routes`, each optional and additive (AND-ed). */\nexport type RouteFilter = {\n /** Exact HTTP method (case-insensitive). */\n method?: string;\n\n /** Case-insensitive substring matched against the path. */\n path?: string;\n\n /** Case-insensitive substring matched against the route name. */\n name?: string;\n};\n\n/**\n * Display order of HTTP methods — used to rank rows within a path and to order\n * the per-method breakdown in the summary line.\n */\nexport const METHOD_ORDER = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"OPTIONS\",\n \"HEAD\",\n \"ALL\",\n];\n\n/**\n * Rank of a method for sorting. Unknown methods sort last (stable among\n * themselves).\n *\n * @param method - Uppercased HTTP verb\n * @returns The sort index\n */\nexport function methodRank(method: string): number {\n const index = METHOD_ORDER.indexOf(method);\n return index === -1 ? METHOD_ORDER.length : index;\n}\n\n/**\n * Derive the handler/controller-action label for a route. Uses the handler\n * function's name, stripping the `bound ` prefix that `Function.prototype.bind`\n * prepends, and falls back to `\"anonymous\"` for an unnamed handler.\n *\n * @param route - The route to label\n * @returns A printable action label\n */\nfunction routeAction(route: Route): string {\n const handler = route.handler as unknown;\n\n if (typeof handler !== \"function\") return \"anonymous\";\n\n const name = handler.name?.replace(/^bound /, \"\").trim();\n\n return name ? name : \"anonymous\";\n}\n\n/**\n * Normalize a live {@link Route} into a printable {@link RouteRow}.\n *\n * @param route - The registered route\n * @returns The display-ready row\n */\nexport function toRouteRow(route: Route): RouteRow {\n return {\n method: route.method.toUpperCase(),\n path: route.path,\n name: route.name ?? \"\",\n action: routeAction(route),\n middleware: route.middleware?.length ?? 0,\n source: route.sourceFile ?? \"\",\n };\n}\n\n/**\n * Apply the `--method` / `--path` / `--name` filters to a set of rows. An\n * omitted filter matches everything; provided filters are AND-ed.\n *\n * @param rows - The rows to filter\n * @param filter - The active filters\n * @returns The matching rows (a new array)\n */\nexport function filterRouteRows(rows: RouteRow[], filter: RouteFilter): RouteRow[] {\n const method = filter.method?.toUpperCase();\n const path = filter.path?.toLowerCase();\n const name = filter.name?.toLowerCase();\n\n return rows.filter((row) => {\n if (method && row.method !== method) return false;\n if (path && !row.path.toLowerCase().includes(path)) return false;\n if (name && !row.name.toLowerCase().includes(name)) return false;\n return true;\n });\n}\n\n/**\n * Sort rows by path (ascending), then by HTTP-method order within a path, so\n * every verb of one resource lists together in a predictable sequence.\n *\n * @param rows - The rows to sort\n * @returns A new, sorted array\n */\nexport function sortRouteRows(rows: RouteRow[]): RouteRow[] {\n return [...rows].sort((a, b) => {\n if (a.path !== b.path) return a.path < b.path ? -1 : 1;\n return methodRank(a.method) - methodRank(b.method);\n });\n}\n"],"mappings":";;;;;AA6CA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;AASA,SAAgB,WAAW,QAAwB;CACjD,MAAM,QAAQ,aAAa,QAAQ,MAAM;CACzC,OAAO,UAAU,KAAK,aAAa,SAAS;AAC9C;;;;;;;;;AAUA,SAAS,YAAY,OAAsB;CACzC,MAAM,UAAU,MAAM;CAEtB,IAAI,OAAO,YAAY,YAAY,OAAO;CAE1C,MAAM,OAAO,QAAQ,MAAM,QAAQ,WAAW,EAAE,CAAC,CAAC,KAAK;CAEvD,OAAO,OAAO,OAAO;AACvB;;;;;;;AAQA,SAAgB,WAAW,OAAwB;CACjD,OAAO;EACL,QAAQ,MAAM,OAAO,YAAY;EACjC,MAAM,MAAM;EACZ,MAAM,MAAM,QAAQ;EACpB,QAAQ,YAAY,KAAK;EACzB,YAAY,MAAM,YAAY,UAAU;EACxC,QAAQ,MAAM,cAAc;CAC9B;AACF;;;;;;;;;AAUA,SAAgB,gBAAgB,MAAkB,QAAiC;CACjF,MAAM,SAAS,OAAO,QAAQ,YAAY;CAC1C,MAAM,OAAO,OAAO,MAAM,YAAY;CACtC,MAAM,OAAO,OAAO,MAAM,YAAY;CAEtC,OAAO,KAAK,QAAQ,QAAQ;EAC1B,IAAI,UAAU,IAAI,WAAW,QAAQ,OAAO;EAC5C,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,SAAS,IAAI,GAAG,OAAO;EAC3D,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,SAAS,IAAI,GAAG,OAAO;EAC3D,OAAO;CACT,CAAC;AACH;;;;;;;;AASA,SAAgB,cAAc,MAA8B;CAC1D,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;EAC9B,IAAI,EAAE,SAAS,EAAE,MAAM,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK;EACrD,OAAO,WAAW,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM;CACnD,CAAC;AACH"}
|