@aotter/mantle-runtime 0.0.11-alpha.46 → 0.0.11-alpha.48
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/dist/domain/model/HandlerContext.d.ts +12 -0
- package/dist/domain/model/HandlerContext.d.ts.map +1 -1
- package/dist/domain/model/SeoMeta.d.ts +0 -2
- package/dist/domain/model/SeoMeta.d.ts.map +1 -1
- package/dist/domain/port/DatabaseDriver.d.ts +0 -1
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -1
- package/dist/domain/port/DeferredHookDispatcher.d.ts +4 -1
- package/dist/domain/port/DeferredHookDispatcher.d.ts.map +1 -1
- package/dist/domain/port/DeferredHookDispatcher.js +2 -1
- package/dist/domain/port/DeferredHookDispatcher.js.map +1 -1
- package/dist/domain/port/EntryRepository.d.ts +0 -8
- package/dist/domain/port/EntryRepository.d.ts.map +1 -1
- package/dist/domain/port/PublishOrchestrator.d.ts +0 -1
- package/dist/domain/port/PublishOrchestrator.d.ts.map +1 -1
- package/dist/domain/port/index.d.ts +1 -2
- package/dist/domain/port/index.d.ts.map +1 -1
- package/dist/domain/port/index.js.map +1 -1
- package/dist/domain/service/AuthPredicateEvaluator.d.ts +4 -4
- package/dist/domain/service/AuthPredicateEvaluator.d.ts.map +1 -1
- package/dist/domain/service/AuthPredicateEvaluator.js +13 -2
- package/dist/domain/service/AuthPredicateEvaluator.js.map +1 -1
- package/dist/domain/service/HtmlEscaping.d.ts +2 -0
- package/dist/domain/service/HtmlEscaping.d.ts.map +1 -0
- package/dist/domain/service/HtmlEscaping.js +9 -0
- package/dist/domain/service/HtmlEscaping.js.map +1 -0
- package/dist/domain/service/PreviewBanner.js +1 -8
- package/dist/domain/service/PreviewBanner.js.map +1 -1
- package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -1
- package/dist/domain/service/SeoMetaComposer.js +1 -11
- package/dist/domain/service/SeoMetaComposer.js.map +1 -1
- package/dist/domain/service/index.d.ts +0 -1
- package/dist/domain/service/index.d.ts.map +1 -1
- package/dist/domain/service/index.js +0 -1
- package/dist/domain/service/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +0 -1
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +0 -1
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +6 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +33 -29
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -1
- package/dist/infrastructure/mcp/McpResponses.d.ts +0 -10
- package/dist/infrastructure/mcp/McpResponses.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpResponses.js +0 -29
- package/dist/infrastructure/mcp/McpResponses.js.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts +0 -2
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.js +23 -9
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
- package/dist/infrastructure/mcp/index.d.ts +2 -2
- package/dist/infrastructure/mcp/index.d.ts.map +1 -1
- package/dist/infrastructure/mcp/index.js +2 -2
- package/dist/infrastructure/mcp/index.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +1 -2
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +1 -37
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.js +1 -22
- package/dist/infrastructure/persistence/DatabaseMediaAssetRepository.js.map +1 -1
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts +3 -6
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js +0 -21
- package/dist/infrastructure/persistence/LifecycleHookingEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/Pagination.d.ts +4 -0
- package/dist/infrastructure/persistence/Pagination.d.ts.map +1 -0
- package/dist/infrastructure/persistence/Pagination.js +15 -0
- package/dist/infrastructure/persistence/Pagination.js.map +1 -0
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +2 -2
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js +19 -28
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +24 -5
- package/dist/runtime.js.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.js +53 -0
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
- package/dist/usecase/content/ArchiveUseCase.d.ts.map +1 -1
- package/dist/usecase/content/ArchiveUseCase.js +4 -6
- package/dist/usecase/content/ArchiveUseCase.js.map +1 -1
- package/dist/usecase/content/AuthoringContext.d.ts +3 -0
- package/dist/usecase/content/AuthoringContext.d.ts.map +1 -0
- package/dist/usecase/content/AuthoringContext.js +8 -0
- package/dist/usecase/content/AuthoringContext.js.map +1 -0
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/CreateDraftUseCase.js +1 -9
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.d.ts +4 -3
- package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.js +1 -4
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.js +1 -9
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/diagnostics.d.ts +0 -13
- package/dist/usecase/content/diagnostics.d.ts.map +1 -1
- package/dist/usecase/content/diagnostics.js +0 -31
- package/dist/usecase/content/diagnostics.js.map +1 -1
- package/dist/usecase/dto/content/index.d.ts +1 -11
- package/dist/usecase/dto/content/index.d.ts.map +1 -1
- package/dist/usecase/dto/procedure/index.d.ts +1 -3
- package/dist/usecase/dto/procedure/index.d.ts.map +1 -1
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +2 -16
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +1 -4
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -1
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +4 -6
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -1
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts +2 -2
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.d.ts.map +1 -1
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js +1 -0
- package/dist/usecase/lifecycle/RunDeferredHookUseCase.js.map +1 -1
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts +15 -5
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.d.ts.map +1 -1
- package/dist/usecase/lifecycle/RunLifecycleHooksUseCase.js.map +1 -1
- package/dist/usecase/lifecycle/index.d.ts +1 -1
- package/dist/usecase/lifecycle/index.d.ts.map +1 -1
- package/dist/usecase/lifecycle/index.js.map +1 -1
- package/dist/usecase/media/index.d.ts +1 -1
- package/dist/usecase/media/index.d.ts.map +1 -1
- package/dist/usecase/media/index.js +1 -1
- package/dist/usecase/media/index.js.map +1 -1
- package/dist/usecase/media/mediaAllowlist.d.ts +0 -5
- package/dist/usecase/media/mediaAllowlist.d.ts.map +1 -1
- package/dist/usecase/media/mediaAllowlist.js +0 -5
- package/dist/usecase/media/mediaAllowlist.js.map +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js +2 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts +9 -8
- package/dist/usecase/procedure/InvokeProcedureUseCase.d.ts.map +1 -1
- package/dist/usecase/procedure/InvokeProcedureUseCase.js +82 -13
- package/dist/usecase/procedure/InvokeProcedureUseCase.js.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +3 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +5 -0
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +3 -3
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.js +4 -5
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +2 -2
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js +2 -2
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -1
- package/dist/usecase/render/index.d.ts +1 -1
- package/dist/usecase/render/index.d.ts.map +1 -1
- package/dist/usecase/render/index.js +1 -4
- package/dist/usecase/render/index.js.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.d.ts +14 -4
- package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.js +73 -3
- package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -1
- package/package.json +2 -2
- package/dist/domain/port/LifecycleHookRunner.d.ts +0 -41
- package/dist/domain/port/LifecycleHookRunner.d.ts.map +0 -1
- package/dist/domain/port/LifecycleHookRunner.js +0 -2
- package/dist/domain/port/LifecycleHookRunner.js.map +0 -1
- package/dist/domain/service/EntrySeoSupport.d.ts +0 -27
- package/dist/domain/service/EntrySeoSupport.d.ts.map +0 -1
- package/dist/domain/service/EntrySeoSupport.js +0 -13
- package/dist/domain/service/EntrySeoSupport.js.map +0 -1
- package/dist/infrastructure/http/DiagnosticResponse.d.ts +0 -12
- package/dist/infrastructure/http/DiagnosticResponse.d.ts.map +0 -1
- package/dist/infrastructure/http/DiagnosticResponse.js +0 -14
- package/dist/infrastructure/http/DiagnosticResponse.js.map +0 -1
- package/dist/infrastructure/http/index.d.ts +0 -2
- package/dist/infrastructure/http/index.d.ts.map +0 -1
- package/dist/infrastructure/http/index.js +0 -2
- package/dist/infrastructure/http/index.js.map +0 -1
|
@@ -8,17 +8,19 @@ import { evaluateAuthAll } from "../../domain/service/AuthPredicateEvaluator.js"
|
|
|
8
8
|
*
|
|
9
9
|
* Order of operations:
|
|
10
10
|
* 1. Evaluate `requires.auth.all` predicates against `ctx`. Deny ⇒
|
|
11
|
-
* `AUTH_DENIED`.
|
|
11
|
+
* `UNAUTHENTICATED` or `AUTH_DENIED`.
|
|
12
12
|
* 2. Validate `input` against the Procedure's `input` JSON Schema.
|
|
13
13
|
* Fail ⇒ `INPUT_VALIDATION_FAILED` (first zod issue).
|
|
14
|
-
* 3.
|
|
14
|
+
* 3. Invoke an optional guard Procedure with validated input and the
|
|
15
|
+
* same caller context. Any failure denies the target.
|
|
16
|
+
* 4. Dispatch by `handler.kind`:
|
|
15
17
|
* - `ref`: resolve in registry, call (`InvokeFailure` → unwrap;
|
|
16
18
|
* other throws → `INTERNAL_ERROR`).
|
|
17
19
|
* - `builtin`: delegate to `InvokeBuiltinUseCase` (project +
|
|
18
20
|
* stamp + chokepoint write per POC ADR-0014). When no builtin
|
|
19
21
|
* collaborator was injected (test paths, ref-only runtimes) the
|
|
20
22
|
* use case returns `HANDLER_BUILTIN_NOT_IN_V010`.
|
|
21
|
-
*
|
|
23
|
+
* 5. Validate the result against the `output` schema. Fail ⇒
|
|
22
24
|
* `OUTPUT_VALIDATION_FAILED` (handler / builtin bug).
|
|
23
25
|
*/
|
|
24
26
|
/**
|
|
@@ -39,6 +41,7 @@ export class InvokeFailure extends Error {
|
|
|
39
41
|
export class InvokeProcedureUseCase {
|
|
40
42
|
registry;
|
|
41
43
|
builtin;
|
|
44
|
+
proceduresByName;
|
|
42
45
|
// Per-Procedure compiled zod schemas. zod composition is pure
|
|
43
46
|
// object-tree assembly (no `new Function`) — Workers-CSP-safe.
|
|
44
47
|
// Cached per use-case instance because `jsonSchemaToZod` walks the
|
|
@@ -47,13 +50,17 @@ export class InvokeProcedureUseCase {
|
|
|
47
50
|
// because the runtime owns the use case instance.
|
|
48
51
|
inputCache = new Map();
|
|
49
52
|
outputCache = new Map();
|
|
50
|
-
constructor(registry, builtin) {
|
|
53
|
+
constructor(registry, builtin, proceduresByName = new Map()) {
|
|
51
54
|
this.registry = registry;
|
|
52
55
|
this.builtin = builtin;
|
|
56
|
+
this.proceduresByName = proceduresByName;
|
|
53
57
|
}
|
|
54
58
|
async execute(request) {
|
|
59
|
+
return this.executeInternal(request, true);
|
|
60
|
+
}
|
|
61
|
+
async executeInternal(request, allowGuard) {
|
|
55
62
|
const { procedure, input, ctx } = request;
|
|
56
|
-
const phase =
|
|
63
|
+
const phase = "runtime";
|
|
57
64
|
const procPath = request.pathPrefix ?? `manifest:Procedure/${procedure.metadata.name}`;
|
|
58
65
|
// 1. Auth.
|
|
59
66
|
const denial = evaluateAuthAll(procedure.spec.requires, ctx, procPath, phase);
|
|
@@ -76,7 +83,75 @@ export class InvokeProcedureUseCase {
|
|
|
76
83
|
}),
|
|
77
84
|
};
|
|
78
85
|
}
|
|
79
|
-
// 3.
|
|
86
|
+
// 3. Dynamic guard. It receives only target input that passed the
|
|
87
|
+
// target schema, shares the same caller context, and runs through
|
|
88
|
+
// this exact auth/input/handler/output pipeline. Boot rejects guard
|
|
89
|
+
// chains; allowGuard is defense-in-depth for boot-bypass paths.
|
|
90
|
+
const guardName = procedure.spec.requires?.guard?.procedure;
|
|
91
|
+
if (guardName) {
|
|
92
|
+
if (!allowGuard) {
|
|
93
|
+
return {
|
|
94
|
+
ok: false,
|
|
95
|
+
diagnostic: makeDiagnostic({
|
|
96
|
+
code: "GUARD_CHAIN_NOT_ALLOWED",
|
|
97
|
+
phase,
|
|
98
|
+
severity: "error",
|
|
99
|
+
path: `${procPath}#/requires/guard/procedure`,
|
|
100
|
+
value: guardName,
|
|
101
|
+
expected: "an unguarded Procedure",
|
|
102
|
+
}),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const guard = this.proceduresByName.get(guardName);
|
|
106
|
+
if (!guard) {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
diagnostic: makeDiagnostic({
|
|
110
|
+
code: "GUARD_PROCEDURE_UNKNOWN",
|
|
111
|
+
phase,
|
|
112
|
+
severity: "error",
|
|
113
|
+
path: `${procPath}#/requires/guard/procedure`,
|
|
114
|
+
value: guardName,
|
|
115
|
+
expected: "name of a declared Procedure",
|
|
116
|
+
}),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (guard.metadata.name === procedure.metadata.name) {
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
diagnostic: makeDiagnostic({
|
|
123
|
+
code: "GUARD_SELF_REFERENCE",
|
|
124
|
+
phase,
|
|
125
|
+
severity: "error",
|
|
126
|
+
path: `${procPath}#/requires/guard/procedure`,
|
|
127
|
+
value: guardName,
|
|
128
|
+
expected: "a different, unguarded Procedure",
|
|
129
|
+
}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (guard.spec.handler.kind !== "ref") {
|
|
133
|
+
return {
|
|
134
|
+
ok: false,
|
|
135
|
+
diagnostic: makeDiagnostic({
|
|
136
|
+
code: "GUARD_PROCEDURE_BUILTIN",
|
|
137
|
+
phase,
|
|
138
|
+
severity: "error",
|
|
139
|
+
path: `${procPath}#/requires/guard/procedure`,
|
|
140
|
+
value: guardName,
|
|
141
|
+
expected: "a Procedure with handler.kind: ref",
|
|
142
|
+
}),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const guardResult = await this.executeInternal({
|
|
146
|
+
procedure: guard,
|
|
147
|
+
input: inputResult.data,
|
|
148
|
+
ctx,
|
|
149
|
+
pathPrefix: `${procPath}#/requires/guard/${guardName}`,
|
|
150
|
+
}, false);
|
|
151
|
+
if (!guardResult.ok)
|
|
152
|
+
return guardResult;
|
|
153
|
+
}
|
|
154
|
+
// 4. Dispatch by handler kind.
|
|
80
155
|
const handlerBinding = procedure.spec.handler;
|
|
81
156
|
const handlerLabel = handlerBinding.kind === "builtin"
|
|
82
157
|
? `builtin/${handlerBinding.op}`
|
|
@@ -143,7 +218,7 @@ export class InvokeProcedureUseCase {
|
|
|
143
218
|
}),
|
|
144
219
|
};
|
|
145
220
|
}
|
|
146
|
-
//
|
|
221
|
+
// 5. Output validation.
|
|
147
222
|
const outputValidator = this.compileOutput(procedure);
|
|
148
223
|
const outputResult = outputValidator.safeParse(result);
|
|
149
224
|
if (!outputResult.success) {
|
|
@@ -163,12 +238,6 @@ export class InvokeProcedureUseCase {
|
|
|
163
238
|
}
|
|
164
239
|
return { ok: true, data: result };
|
|
165
240
|
}
|
|
166
|
-
/** Test seam — clear validator caches between tests when manifests
|
|
167
|
-
* change between runs. Production paths never call this. */
|
|
168
|
-
_clearValidatorCaches() {
|
|
169
|
-
this.inputCache.clear();
|
|
170
|
-
this.outputCache.clear();
|
|
171
|
-
}
|
|
172
241
|
compileInput(p) {
|
|
173
242
|
const k = p.metadata.name;
|
|
174
243
|
let v = this.inputCache.get(k);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InvokeProcedureUseCase.js","sourceRoot":"","sources":["../../../src/usecase/procedure/InvokeProcedureUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,eAAe,EACf,cAAc,EACd,eAAe,GAIhB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AAQjF
|
|
1
|
+
{"version":3,"file":"InvokeProcedureUseCase.js","sourceRoot":"","sources":["../../../src/usecase/procedure/InvokeProcedureUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
1
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
2
3
|
import { type SeoMeta } from "../../domain/service/SeoMetaComposer.js";
|
|
4
|
+
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
3
5
|
import type { ComposeEntrySeoMetaRequest } from "../dto/render/ComposeEntrySeoMetaRequest.js";
|
|
4
6
|
/**
|
|
5
7
|
* Compose the SEO/AEO meta block for an entry. Reads sibling
|
|
@@ -22,4 +24,5 @@ export declare class ComposeEntrySeoMetaUseCase {
|
|
|
22
24
|
constructor(db: DatabaseDriver);
|
|
23
25
|
execute(request: ComposeEntrySeoMetaRequest): Promise<SeoMeta>;
|
|
24
26
|
}
|
|
27
|
+
export declare function composeSeoIfPathed(composer: Pick<ComposeEntrySeoMetaUseCase, "execute">, paths: PublicPathResolver | null, entry: Entry, site: SiteConfig): Promise<SeoMeta | undefined>;
|
|
25
28
|
//# sourceMappingURL=ComposeEntrySeoMetaUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeEntrySeoMetaUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComposeEntrySeoMetaUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAEL,KAAK,OAAO,EAEb,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAErF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAE9F;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,0BAA0B;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEzC,OAAO,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAAC,OAAO,CAAC;CAMrE;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,CAAC,EACrD,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAG9B"}
|
|
@@ -28,6 +28,11 @@ export class ComposeEntrySeoMetaUseCase {
|
|
|
28
28
|
return composeEntrySeoMeta({ entry, site, publicPath, siblings, type });
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
export async function composeSeoIfPathed(composer, paths, entry, site) {
|
|
32
|
+
if (!paths?.forEntry(entry))
|
|
33
|
+
return undefined;
|
|
34
|
+
return composer.execute({ entry, site, paths });
|
|
35
|
+
}
|
|
31
36
|
async function readSiblings(db, current, site, paths) {
|
|
32
37
|
const slug = current.data["slug"];
|
|
33
38
|
if (typeof slug !== "string" || slug.length === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeEntrySeoMetaUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,GAGpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAG9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,0BAA0B;IACR;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAAmC;QAC/C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,KAAK,UAAU,YAAY,CACzB,EAAkB,EAClB,OAAc,EACd,IAAgB,EAChB,KAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,eAAe,CAAC,EAAE,EAAE;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,WAAW;KACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CACvC,CACF,CAAC;IACF,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"ComposeEntrySeoMetaUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/ComposeEntrySeoMetaUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,GAGpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAG9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,0BAA0B;IACR;IAA7B,YAA6B,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,OAAmC;QAC/C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAqD,EACrD,KAAgC,EAChC,KAAY,EACZ,IAAgB;IAEhB,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC9C,OAAO,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,EAAkB,EAClB,OAAc,EACd,IAAgB,EAChB,KAAyB;IAEzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3B,eAAe,CAAC,EAAE,EAAE;QAClB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,WAAW;KACpB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CACvC,CACF,CAAC;IACF,MAAM,GAAG,GAAyB,EAAE,CAAC;IACrC,KAAK,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -4,9 +4,9 @@ import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepositor
|
|
|
4
4
|
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
5
5
|
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
6
6
|
import type { PreviewEntryRequest } from "../dto/render/PreviewEntryRequest.js";
|
|
7
|
-
import { type
|
|
7
|
+
import { type ComposeEntrySeoMetaUseCase } from "./ComposeEntrySeoMetaUseCase.js";
|
|
8
8
|
/**
|
|
9
|
-
* Render an entry with a preview banner. Walks
|
|
9
|
+
* Render an entry with a preview banner. Walks the default status order until a
|
|
10
10
|
* matching row is found, renders via the registered template, then
|
|
11
11
|
* injects the banner just inside `<body>`. Returns `null` when no
|
|
12
12
|
* matching row exists or no template is registered.
|
|
@@ -22,7 +22,7 @@ export declare class PreviewEntryUseCase {
|
|
|
22
22
|
private readonly composeSeo;
|
|
23
23
|
private readonly schemas;
|
|
24
24
|
private readonly mediaAssets;
|
|
25
|
-
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo:
|
|
25
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: Pick<ComposeEntrySeoMetaUseCase, "execute">, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
|
|
26
26
|
execute(request: PreviewEntryRequest): Promise<string | null>;
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=PreviewEntryUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAQrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAEL,KAAK,
|
|
1
|
+
{"version":3,"file":"PreviewEntryUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAQrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,iCAAiC,CAAC;AAWzC;;;;;;;;;GASG;AACH,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBALX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,CAAC,EACvD,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA8BpE"}
|
|
@@ -2,7 +2,7 @@ import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
|
|
|
2
2
|
import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryReader.js";
|
|
3
3
|
import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
4
|
import { defaultPreviewBanner, injectPreviewBanner, } from "../../domain/service/PreviewBanner.js";
|
|
5
|
-
import { composeSeoIfPathed, } from "
|
|
5
|
+
import { composeSeoIfPathed, } from "./ComposeEntrySeoMetaUseCase.js";
|
|
6
6
|
import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
|
|
7
7
|
/** Default fallback: prefer drafts, fall back to published, then
|
|
8
8
|
* archived. Authors typically open `?preview=1` to see WIP. */
|
|
@@ -12,7 +12,7 @@ const DEFAULT_PREVIEW_STATUS_ORDER = [
|
|
|
12
12
|
"archived",
|
|
13
13
|
];
|
|
14
14
|
/**
|
|
15
|
-
* Render an entry with a preview banner. Walks
|
|
15
|
+
* Render an entry with a preview banner. Walks the default status order until a
|
|
16
16
|
* matching row is found, renders via the registered template, then
|
|
17
17
|
* injects the banner just inside `<body>`. Returns `null` when no
|
|
18
18
|
* matching row exists or no template is registered.
|
|
@@ -37,9 +37,8 @@ export class PreviewEntryUseCase {
|
|
|
37
37
|
this.mediaAssets = mediaAssets;
|
|
38
38
|
}
|
|
39
39
|
async execute(request) {
|
|
40
|
-
const order = request.statusOrder ?? DEFAULT_PREVIEW_STATUS_ORDER;
|
|
41
40
|
let raw = null;
|
|
42
|
-
for (const status of
|
|
41
|
+
for (const status of DEFAULT_PREVIEW_STATUS_ORDER) {
|
|
43
42
|
raw = await readEntryBySlug(this.db, {
|
|
44
43
|
collection: request.collection,
|
|
45
44
|
slug: request.slug,
|
|
@@ -67,7 +66,7 @@ export class PreviewEntryUseCase {
|
|
|
67
66
|
});
|
|
68
67
|
if (html === null)
|
|
69
68
|
return null;
|
|
70
|
-
const banner =
|
|
69
|
+
const banner = defaultPreviewBanner(entry.status, request.slug);
|
|
71
70
|
return injectPreviewBanner(html, banner);
|
|
72
71
|
}
|
|
73
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,kBAAkB,GAEnB,MAAM,
|
|
1
|
+
{"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;gEACgE;AAChE,MAAM,4BAA4B,GAAgC;IAChE,OAAO;IACP,WAAW;IACX,UAAU;CACX,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,OAAO,mBAAmB;IAEX;IACA;IACA;IACA;IACA;IACA;IANnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuD,EACvD,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAA6C;QACvD,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,IAAI,GAAG,GAAiB,IAAI,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,4BAA4B,EAAE,CAAC;YAClD,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;gBACnC,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,GAAG;gBAAE,MAAM;QACjB,CAAC;QACD,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,oEAAoE;QACpE,8DAA8D;QAC9D,+DAA+D;QAC/D,8CAA8C;QAC9C,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;YACX,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -4,7 +4,7 @@ import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepositor
|
|
|
4
4
|
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
5
5
|
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
6
6
|
import type { RenderEntryLiveRequest } from "../dto/render/RenderEntryLiveRequest.js";
|
|
7
|
-
import { type
|
|
7
|
+
import { type ComposeEntrySeoMetaUseCase } from "./ComposeEntrySeoMetaUseCase.js";
|
|
8
8
|
/**
|
|
9
9
|
* Render a single entry from current DB state. Used by adapter live-
|
|
10
10
|
* dev routes (`MANTLE_LOCAL_DEV=1`) to bypass the KV cache and pick up
|
|
@@ -31,7 +31,7 @@ export declare class RenderEntryLiveUseCase {
|
|
|
31
31
|
private readonly composeSeo;
|
|
32
32
|
private readonly schemas;
|
|
33
33
|
private readonly mediaAssets;
|
|
34
|
-
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo:
|
|
34
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: Pick<ComposeEntrySeoMetaUseCase, "execute">, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
|
|
35
35
|
execute(request: RenderEntryLiveRequest): Promise<string | null>;
|
|
36
36
|
}
|
|
37
37
|
//# sourceMappingURL=RenderEntryLiveUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderEntryLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAEL,KAAK,
|
|
1
|
+
{"version":3,"file":"RenderEntryLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAEL,KAAK,0BAA0B,EAChC,MAAM,iCAAiC,CAAC;AAGzC;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBALX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,kBAAkB,GAAG,IAAI,EAChC,UAAU,EAAE,IAAI,CAAC,0BAA0B,EAAE,SAAS,CAAC,EACvD,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAsBvE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readEntryBySlug } from "../../domain/service/io/PublishedEntries.js";
|
|
2
2
|
import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryReader.js";
|
|
3
3
|
import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
|
-
import { composeSeoIfPathed, } from "
|
|
4
|
+
import { composeSeoIfPathed, } from "./ComposeEntrySeoMetaUseCase.js";
|
|
5
5
|
import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
|
|
6
6
|
/**
|
|
7
7
|
* Render a single entry from current DB state. Used by adapter live-
|
|
@@ -38,7 +38,7 @@ export class RenderEntryLiveUseCase {
|
|
|
38
38
|
this.mediaAssets = mediaAssets;
|
|
39
39
|
}
|
|
40
40
|
async execute(request) {
|
|
41
|
-
const status =
|
|
41
|
+
const status = "published";
|
|
42
42
|
const raw = await readEntryBySlug(this.db, {
|
|
43
43
|
collection: request.collection,
|
|
44
44
|
slug: request.slug,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderEntryLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EACL,kBAAkB,GAEnB,MAAM,
|
|
1
|
+
{"version":3,"file":"RenderEntryLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,OAAO,EACL,kBAAkB,GAEnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,OAAO,sBAAsB;IAEd;IACA;IACA;IACA;IACA;IACA;IANnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,KAAgC,EAChC,UAAuD,EACvD,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAA6C;QACvD,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC3C,MAAM,MAAM,GAAG,WAAW,CAAC;QAC3B,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;YACzC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACtE,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,eAAe,CAAC;YACrB,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;YACX,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -3,5 +3,5 @@ export { ComposeSitemapUseCase, SITEMAP_MAX_URLS_DEFAULT, } from "./ComposeSitem
|
|
|
3
3
|
export { RenderEntryLiveUseCase } from "./RenderEntryLiveUseCase.js";
|
|
4
4
|
export { RenderListLiveUseCase } from "./RenderListLiveUseCase.js";
|
|
5
5
|
export { PreviewEntryUseCase } from "./PreviewEntryUseCase.js";
|
|
6
|
-
export { ComposeEntrySeoMetaUseCase } from "./ComposeEntrySeoMetaUseCase.js";
|
|
6
|
+
export { ComposeEntrySeoMetaUseCase, composeSeoIfPathed, } from "./ComposeEntrySeoMetaUseCase.js";
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|
|
@@ -3,8 +3,5 @@ export { ComposeSitemapUseCase, SITEMAP_MAX_URLS_DEFAULT, } from "./ComposeSitem
|
|
|
3
3
|
export { RenderEntryLiveUseCase } from "./RenderEntryLiveUseCase.js";
|
|
4
4
|
export { RenderListLiveUseCase } from "./RenderListLiveUseCase.js";
|
|
5
5
|
export { PreviewEntryUseCase } from "./PreviewEntryUseCase.js";
|
|
6
|
-
export { ComposeEntrySeoMetaUseCase } from "./ComposeEntrySeoMetaUseCase.js";
|
|
7
|
-
// `composeSeoIfPathed` + `SeoComposer` moved to
|
|
8
|
-
// `domain/service/EntrySeoSupport.ts` so `HtmlPublishOrchestrator`
|
|
9
|
-
// (infra) can import without crossing the infra→usecase boundary.
|
|
6
|
+
export { ComposeEntrySeoMetaUseCase, composeSeoIfPathed, } from "./ComposeEntrySeoMetaUseCase.js";
|
|
10
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,iCAAiC,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type Diagnostic } from "@aotter/mantle-spec";
|
|
2
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
3
|
import type { ExecuteViewRequest } from "../dto/view/ExecuteViewRequest.js";
|
|
4
|
+
import type { InvokeProcedureResponse } from "../dto/procedure/index.js";
|
|
5
|
+
import type { HandlerContext } from "../../domain/model/HandlerContext.js";
|
|
4
6
|
/**
|
|
5
7
|
* Compile a View manifest and run it against `DatabaseDriver`. The
|
|
6
|
-
*
|
|
7
|
-
* against `View.spec.params`
|
|
8
|
-
*
|
|
8
|
+
* REST adapters coerce query strings and MCP passes typed JSON; this use
|
|
9
|
+
* case validates the converged param map against `View.spec.params` after
|
|
10
|
+
* static auth and before an optional guard.
|
|
9
11
|
*/
|
|
10
12
|
export interface ViewQueryResult<R = Record<string, unknown>> {
|
|
11
13
|
readonly rows: readonly R[];
|
|
@@ -23,9 +25,17 @@ export type ExecuteViewResponse<R = Record<string, unknown>> = {
|
|
|
23
25
|
readonly ok: false;
|
|
24
26
|
readonly diagnostic: Diagnostic;
|
|
25
27
|
};
|
|
28
|
+
export type InvokeViewGuard = (request: {
|
|
29
|
+
readonly procedure: string;
|
|
30
|
+
readonly input: Record<string, unknown>;
|
|
31
|
+
readonly ctx: HandlerContext;
|
|
32
|
+
readonly pathPrefix: string;
|
|
33
|
+
}) => Promise<InvokeProcedureResponse>;
|
|
26
34
|
export declare class ExecuteViewUseCase {
|
|
27
35
|
private readonly db;
|
|
28
|
-
|
|
36
|
+
private readonly invokeGuard?;
|
|
37
|
+
private readonly paramsCache;
|
|
38
|
+
constructor(db: DatabaseDriver, invokeGuard?: InvokeViewGuard | undefined);
|
|
29
39
|
execute<R = Record<string, unknown>>(request: ExecuteViewRequest): Promise<ExecuteViewResponse<R>>;
|
|
30
40
|
}
|
|
31
41
|
//# sourceMappingURL=ExecuteViewUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecuteViewUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/view/ExecuteViewUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ExecuteViewUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/view/ExecuteViewUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E;;;;;GAKG;AAEH,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;4DAEwD;IACxD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACvD;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAEvC,qBAAa,kBAAkB;IAI3B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAJ/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,EAAE,EAAE,cAAc,EAClB,WAAW,CAAC,EAAE,eAAe,YAAA;IAG1C,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAwInC"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import { makeDiagnostic, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
1
|
+
import { firstZodIssueAsJsonPointer, jsonSchemaToZod, makeDiagnostic, readJsonPointer, runtimeDiagnostic, } from "@aotter/mantle-spec";
|
|
2
2
|
import { evaluateAuthAll } from "../../domain/service/AuthPredicateEvaluator.js";
|
|
3
3
|
import { compileView } from "../../domain/service/ViewSqlCompiler.js";
|
|
4
4
|
export class ExecuteViewUseCase {
|
|
5
5
|
db;
|
|
6
|
-
|
|
6
|
+
invokeGuard;
|
|
7
|
+
paramsCache = new Map();
|
|
8
|
+
constructor(db, invokeGuard) {
|
|
7
9
|
this.db = db;
|
|
10
|
+
this.invokeGuard = invokeGuard;
|
|
8
11
|
}
|
|
9
12
|
async execute(request) {
|
|
10
13
|
const viewPath = request.pathPrefix ?? `manifest:View/${request.view.metadata.name}`;
|
|
@@ -28,9 +31,76 @@ export class ExecuteViewUseCase {
|
|
|
28
31
|
if (denial)
|
|
29
32
|
return { ok: false, diagnostic: denial };
|
|
30
33
|
}
|
|
34
|
+
// Validate the adapter-coerced map after static auth so protected
|
|
35
|
+
// Views do not expose parameter-schema details to unauthorized
|
|
36
|
+
// callers. MCP sends already-typed JSON; REST passes coerced query
|
|
37
|
+
// values. Both converge here before the dynamic guard.
|
|
38
|
+
let validatedParams = request.options?.params ?? {};
|
|
39
|
+
if (request.view.spec.params) {
|
|
40
|
+
let validator = this.paramsCache.get(request.view.metadata.name);
|
|
41
|
+
if (!validator) {
|
|
42
|
+
validator = jsonSchemaToZod(request.view.spec.params);
|
|
43
|
+
this.paramsCache.set(request.view.metadata.name, validator);
|
|
44
|
+
}
|
|
45
|
+
const parsed = validator.safeParse(validatedParams);
|
|
46
|
+
if (!parsed.success) {
|
|
47
|
+
const { instancePath, message } = firstZodIssueAsJsonPointer(parsed.error);
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
diagnostic: makeDiagnostic({
|
|
51
|
+
code: "INPUT_VALIDATION_FAILED",
|
|
52
|
+
phase: "runtime",
|
|
53
|
+
severity: "error",
|
|
54
|
+
path: `${viewPath}#/params${instancePath}`,
|
|
55
|
+
value: readJsonPointer(validatedParams, instancePath),
|
|
56
|
+
expected: message,
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
validatedParams = parsed.data;
|
|
61
|
+
}
|
|
62
|
+
const guardName = requires?.guard?.procedure;
|
|
63
|
+
if (guardName) {
|
|
64
|
+
if (!request.ctx) {
|
|
65
|
+
return {
|
|
66
|
+
ok: false,
|
|
67
|
+
diagnostic: makeDiagnostic({
|
|
68
|
+
code: "UNAUTHENTICATED",
|
|
69
|
+
phase: "runtime",
|
|
70
|
+
severity: "error",
|
|
71
|
+
path: `${viewPath}#/requires/guard`,
|
|
72
|
+
expected: "caller context supplied by the adapter for a guarded View",
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (!this.invokeGuard) {
|
|
77
|
+
return {
|
|
78
|
+
ok: false,
|
|
79
|
+
diagnostic: makeDiagnostic({
|
|
80
|
+
code: "GUARD_PROCEDURE_UNKNOWN",
|
|
81
|
+
phase: "runtime",
|
|
82
|
+
severity: "error",
|
|
83
|
+
path: `${viewPath}#/requires/guard/procedure`,
|
|
84
|
+
value: guardName,
|
|
85
|
+
expected: "guard invoker wired into the runtime",
|
|
86
|
+
}),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const guarded = await this.invokeGuard({
|
|
90
|
+
procedure: guardName,
|
|
91
|
+
input: validatedParams,
|
|
92
|
+
ctx: request.ctx,
|
|
93
|
+
pathPrefix: `${viewPath}#/requires/guard/${guardName}`,
|
|
94
|
+
});
|
|
95
|
+
if (!guarded.ok)
|
|
96
|
+
return guarded;
|
|
97
|
+
}
|
|
31
98
|
let compiled;
|
|
32
99
|
try {
|
|
33
|
-
compiled = compileView(request.view,
|
|
100
|
+
compiled = compileView(request.view, {
|
|
101
|
+
...request.options,
|
|
102
|
+
params: validatedParams,
|
|
103
|
+
});
|
|
34
104
|
}
|
|
35
105
|
catch (err) {
|
|
36
106
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecuteViewUseCase.js","sourceRoot":"","sources":["../../../src/usecase/view/ExecuteViewUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"ExecuteViewUseCase.js","sourceRoot":"","sources":["../../../src/usecase/view/ExecuteViewUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aotter/mantle-runtime",
|
|
3
|
-
"version": "0.0.11-alpha.
|
|
3
|
+
"version": "0.0.11-alpha.48",
|
|
4
4
|
"description": "Runtime engine for mantle: dispatcher + entry-writer + view executor + content-ops + render pipeline + auth + MCP. Defines adapter-agnostic ports. MUST NOT import D1Database / KVNamespace types.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://mantle.tools/",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"README.md"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@aotter/mantle-spec": "0.0.11-alpha.
|
|
32
|
+
"@aotter/mantle-spec": "0.0.11-alpha.48"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"zod": "^4.0.0"
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { LifecycleHook } from "@aotter/mantle-spec";
|
|
2
|
-
import type { EntryRow } from "../model/EntryRow.js";
|
|
3
|
-
import type { HandlerContext } from "../model/HandlerContext.js";
|
|
4
|
-
/**
|
|
5
|
-
* Fires every Trigger bound to (schema, hook) in alphabetical name
|
|
6
|
-
* order (POC ADR-0014). Implemented by `usecase/lifecycle/
|
|
7
|
-
* RunLifecycleHooksUseCase`; consumed by the entry-writer decorator
|
|
8
|
-
* (`infrastructure/persistence/LifecycleHookingEntryRepository`).
|
|
9
|
-
*
|
|
10
|
-
* Honors per-Trigger `errorPolicy`:
|
|
11
|
-
* - `abort` (only allowed on before_*): handler throw → `run` throws
|
|
12
|
-
* a DiagnosticError so the surrounding mutation cancels.
|
|
13
|
-
* - `continue`: handler throw is logged via `console.error` and
|
|
14
|
-
* swallowed. (POC v0.1.x parity; observability table is v0.2.)
|
|
15
|
-
*
|
|
16
|
-
* The runner itself awaits every Trigger inline. The decorator decides
|
|
17
|
-
* whether to ride on `ctx.waitUntil` (CF Workers fast-path) or
|
|
18
|
-
* inline-await the result; it's not the runner's concern.
|
|
19
|
-
*
|
|
20
|
-
* Lives in `domain/port/` per Aotter clean-arch convention; the
|
|
21
|
-
* implementing use case lives in `usecase/lifecycle/` and is wired at
|
|
22
|
-
* the assembly root.
|
|
23
|
-
*/
|
|
24
|
-
export interface LifecycleHookRunner {
|
|
25
|
-
run(request: RunLifecycleHookRequest): Promise<void>;
|
|
26
|
-
}
|
|
27
|
-
export interface RunLifecycleHookRequest {
|
|
28
|
-
readonly hook: LifecycleHook;
|
|
29
|
-
readonly schema: string;
|
|
30
|
-
/** Pre-mutation row for `before_*` hooks; persisted post-mutation
|
|
31
|
-
* row for `after_*`. `null` only on `before_create` (no row exists
|
|
32
|
-
* yet). */
|
|
33
|
-
readonly entry: EntryRow | null;
|
|
34
|
-
readonly ctx: HandlerContext;
|
|
35
|
-
/** Pre-projection original input. For builtin Procedure path this is
|
|
36
|
-
* the procedure's full input (incl. side-channel fields like a
|
|
37
|
-
* CAPTCHA token); for non-builtin paths (admin / MCP createDraft)
|
|
38
|
-
* it's typically the raw write payload. May be undefined. */
|
|
39
|
-
readonly originalInput?: unknown;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=LifecycleHookRunner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LifecycleHookRunner.d.ts","sourceRoot":"","sources":["../../../src/domain/port/LifecycleHookRunner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;gBAEY;IACZ,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC;IAC7B;;;kEAG8D;IAC9D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC"}
|