@aotter/mantle-runtime 0.0.11-alpha.14 → 0.0.11-alpha.16
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/TemplateRegistry.d.ts +3 -0
- package/dist/domain/model/TemplateRegistry.d.ts.map +1 -1
- package/dist/domain/model/TemplateRegistry.js.map +1 -1
- package/dist/domain/port/MediaStorage.d.ts +41 -0
- package/dist/domain/port/MediaStorage.d.ts.map +1 -1
- package/dist/domain/port/MediaStorage.js.map +1 -1
- package/dist/domain/service/HtmlRenderer.d.ts +3 -0
- package/dist/domain/service/HtmlRenderer.d.ts.map +1 -1
- package/dist/domain/service/HtmlRenderer.js +7 -1
- package/dist/domain/service/HtmlRenderer.js.map +1 -1
- package/dist/domain/service/McpToolNaming.d.ts +19 -0
- package/dist/domain/service/McpToolNaming.d.ts.map +1 -1
- package/dist/domain/service/McpToolNaming.js +33 -0
- package/dist/domain/service/McpToolNaming.js.map +1 -1
- package/dist/domain/service/io/MediaAssetReferences.d.ts +13 -0
- package/dist/domain/service/io/MediaAssetReferences.d.ts.map +1 -0
- package/dist/domain/service/io/MediaAssetReferences.js +48 -0
- package/dist/domain/service/io/MediaAssetReferences.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +20 -7
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +89 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts +7 -1
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.js +83 -11
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts +3 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.d.ts.map +1 -1
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js +8 -2
- package/dist/infrastructure/render/HtmlPublishOrchestrator.js.map +1 -1
- package/dist/runtime.d.ts +2 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +7 -6
- package/dist/runtime.js.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.js +48 -8
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
- package/dist/usecase/dto/media/index.d.ts +11 -0
- package/dist/usecase/dto/media/index.d.ts.map +1 -1
- package/dist/usecase/media/CreateMediaUploadUseCase.d.ts.map +1 -1
- package/dist/usecase/media/CreateMediaUploadUseCase.js +39 -21
- package/dist/usecase/media/CreateMediaUploadUseCase.js.map +1 -1
- package/dist/usecase/media/UploadMediaVariantUseCase.d.ts +35 -0
- package/dist/usecase/media/UploadMediaVariantUseCase.d.ts.map +1 -0
- package/dist/usecase/media/UploadMediaVariantUseCase.js +75 -0
- package/dist/usecase/media/UploadMediaVariantUseCase.js.map +1 -0
- package/dist/usecase/media/index.d.ts +1 -0
- package/dist/usecase/media/index.d.ts.map +1 -1
- package/dist/usecase/media/index.js +1 -0
- package/dist/usecase/media/index.js.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +3 -1
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.js +6 -1
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +3 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js +6 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.d.ts +3 -1
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.js +6 -1
- package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
1
|
+
import { DiagnosticError, expandPolicyRequired, } from "@aotter/mantle-spec";
|
|
2
2
|
import { mediaMimeRejectedDiagnostic, mediaPurposeRejectedDiagnostic, mediaSvgRejectedDiagnostic, mediaVariantSizeExceededDiagnostic, mediaVariantsIncompleteDiagnostic, mediaVariantsSuspiciousSizeDiagnostic, } from "./diagnostics.js";
|
|
3
3
|
import { MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, isAllowedMime, } from "./mediaAllowlist.js";
|
|
4
4
|
/**
|
|
@@ -92,37 +92,55 @@ export class CreateMediaUploadUseCase {
|
|
|
92
92
|
};
|
|
93
93
|
}
|
|
94
94
|
assertVariantsCoverPolicy(opPath, request, policy) {
|
|
95
|
+
// Expand the `<input accept>`-style grammar (#282) into per-slot
|
|
96
|
+
// acceptable mime sets. The policy validator already rejected
|
|
97
|
+
// overlapping mime sets across slots + empty slots, so variant→slot
|
|
98
|
+
// mapping here is unambiguous: each supplied mime appears in
|
|
99
|
+
// exactly one slot. Role (primary vs alternate) stays free per
|
|
100
|
+
// variant — the agent picks which mime is primary, constrained
|
|
101
|
+
// only by the exactly-one-primary rule below.
|
|
102
|
+
const slots = expandPolicyRequired(policy.required);
|
|
103
|
+
const expandedSet = new Set();
|
|
104
|
+
const mimeToSlot = new Map();
|
|
105
|
+
slots.forEach((mimes, slotIdx) => {
|
|
106
|
+
for (const m of mimes) {
|
|
107
|
+
expandedSet.add(m);
|
|
108
|
+
mimeToSlot.set(m, slotIdx);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
95
111
|
const supplied = request.variants.map((v) => v.mimeType);
|
|
96
|
-
|
|
97
|
-
|
|
112
|
+
// Closed set: any supplied mime outside the expanded acceptable
|
|
113
|
+
// set has no maxBytes coverage and no slot assignment. Reject.
|
|
114
|
+
const extras = request.variants.filter((v) => !expandedSet.has(v.mimeType));
|
|
115
|
+
if (extras.length > 0) {
|
|
98
116
|
throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
|
|
99
117
|
}
|
|
100
|
-
//
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
// and
|
|
104
|
-
//
|
|
105
|
-
const
|
|
106
|
-
const
|
|
107
|
-
|
|
118
|
+
// Exactly one variant per slot — covers "missing slot" and
|
|
119
|
+
// "two variants for the same slot" (e.g. an extra `image/jpeg`
|
|
120
|
+
// when slot 0 = `image/jpg,image/png`: both jpg and png supplied
|
|
121
|
+
// would fill slot 0 twice and leave the png slot unfilled if you
|
|
122
|
+
// count by mime-set).
|
|
123
|
+
const filledSlots = new Set();
|
|
124
|
+
for (const v of request.variants) {
|
|
125
|
+
const slotIdx = mimeToSlot.get(v.mimeType); // safe: extras rejected above
|
|
126
|
+
if (filledSlots.has(slotIdx)) {
|
|
127
|
+
throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
|
|
128
|
+
}
|
|
129
|
+
filledSlots.add(slotIdx);
|
|
130
|
+
}
|
|
131
|
+
if (filledSlots.size !== slots.length) {
|
|
108
132
|
throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
|
|
109
133
|
}
|
|
110
134
|
// Exactly one primary. Storage key layout is `<group>/<role>.<ext>`,
|
|
111
135
|
// so two primaries collide on the same R2 key + ambiguate which
|
|
112
|
-
// variant `<img>` falls back to.
|
|
113
|
-
//
|
|
136
|
+
// variant `<img>` falls back to. Two alternates with different
|
|
137
|
+
// mimes don't collide (different ext); two alternates with the
|
|
138
|
+
// same mime are impossible here because the mime-to-slot mapping
|
|
139
|
+
// would have caught the duplicate above.
|
|
114
140
|
const primaries = request.variants.filter((v) => v.role === "primary");
|
|
115
141
|
if (primaries.length !== 1) {
|
|
116
142
|
throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
|
|
117
143
|
}
|
|
118
|
-
const seen = new Set();
|
|
119
|
-
for (const v of request.variants) {
|
|
120
|
-
const key = `${v.mimeType}/${v.role}`;
|
|
121
|
-
if (seen.has(key)) {
|
|
122
|
-
throw new DiagnosticError(mediaVariantsIncompleteDiagnostic(opPath, policy.name, policy.required, supplied));
|
|
123
|
-
}
|
|
124
|
-
seen.add(key);
|
|
125
|
-
}
|
|
126
144
|
}
|
|
127
145
|
/** Enforce per-mime byte caps from the purpose policy BEFORE the
|
|
128
146
|
* adapter signs presigned PUT URLs. Mantle docs / ADR-0017
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateMediaUploadUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/CreateMediaUploadUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"CreateMediaUploadUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/CreateMediaUploadUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Clock } from "../../domain/port/Clock.js";
|
|
2
|
+
import type { KvCache } from "../../domain/port/KvCache.js";
|
|
3
|
+
import type { MediaStorage } from "../../domain/port/MediaStorage.js";
|
|
4
|
+
import type { UploadMediaVariantRequest } from "../dto/media/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Server-side byte write for one variant of a pending upload — the
|
|
7
|
+
* sandboxed-agent alternative to the presigned-PUT path produced by
|
|
8
|
+
* `createUpload`. Used by the `upload_media_variant` MCP tool when
|
|
9
|
+
* the caller can't reach the storage backend directly (#283 — Claude
|
|
10
|
+
* Cowork's outbound proxy doesn't allowlist R2 hosts; the MCP
|
|
11
|
+
* transport gets traffic to the Worker via api.anthropic.com).
|
|
12
|
+
*
|
|
13
|
+
* Validates the request against the existing `PendingUploadRecord`
|
|
14
|
+
* (must match purpose + role + mimeType + size cap) then asks the
|
|
15
|
+
* storage adapter to write the bytes. The pending record is NOT
|
|
16
|
+
* deleted here — commit still HEAD-verifies the object via the same
|
|
17
|
+
* code path as the presigned-PUT case. All-or-nothing across the
|
|
18
|
+
* variant bundle still applies at commit time; this use case just
|
|
19
|
+
* lands one variant's bytes.
|
|
20
|
+
*
|
|
21
|
+
* Same purpose policies as the presigned path: per-mime `maxBytes`,
|
|
22
|
+
* per-purpose declared variant set, all already validated by
|
|
23
|
+
* `CreateMediaUploadUseCase` when the agent first opened the group.
|
|
24
|
+
*/
|
|
25
|
+
export declare class UploadMediaVariantUseCase {
|
|
26
|
+
private readonly storage;
|
|
27
|
+
private readonly kv;
|
|
28
|
+
private readonly clock;
|
|
29
|
+
constructor(storage: MediaStorage, kv: KvCache, clock: Clock);
|
|
30
|
+
execute(request: UploadMediaVariantRequest): Promise<{
|
|
31
|
+
storageKey: string;
|
|
32
|
+
byteSize: number;
|
|
33
|
+
}>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=UploadMediaVariantUseCase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadMediaVariantUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/UploadMediaVariantUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,KAAK,EACV,YAAY,EAEb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAYvE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAFL,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,KAAK;IAGzB,OAAO,CACX,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAyDrD"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { DiagnosticError } from "@aotter/mantle-spec";
|
|
2
|
+
import { mediaUploadExpiredDiagnostic, mediaVariantSizeExceededDiagnostic, mediaMimeRejectedDiagnostic, } from "./diagnostics.js";
|
|
3
|
+
import { PENDING_UPLOAD_KV_PREFIX } from "./mediaAllowlist.js";
|
|
4
|
+
/**
|
|
5
|
+
* Server-side byte write for one variant of a pending upload — the
|
|
6
|
+
* sandboxed-agent alternative to the presigned-PUT path produced by
|
|
7
|
+
* `createUpload`. Used by the `upload_media_variant` MCP tool when
|
|
8
|
+
* the caller can't reach the storage backend directly (#283 — Claude
|
|
9
|
+
* Cowork's outbound proxy doesn't allowlist R2 hosts; the MCP
|
|
10
|
+
* transport gets traffic to the Worker via api.anthropic.com).
|
|
11
|
+
*
|
|
12
|
+
* Validates the request against the existing `PendingUploadRecord`
|
|
13
|
+
* (must match purpose + role + mimeType + size cap) then asks the
|
|
14
|
+
* storage adapter to write the bytes. The pending record is NOT
|
|
15
|
+
* deleted here — commit still HEAD-verifies the object via the same
|
|
16
|
+
* code path as the presigned-PUT case. All-or-nothing across the
|
|
17
|
+
* variant bundle still applies at commit time; this use case just
|
|
18
|
+
* lands one variant's bytes.
|
|
19
|
+
*
|
|
20
|
+
* Same purpose policies as the presigned path: per-mime `maxBytes`,
|
|
21
|
+
* per-purpose declared variant set, all already validated by
|
|
22
|
+
* `CreateMediaUploadUseCase` when the agent first opened the group.
|
|
23
|
+
*/
|
|
24
|
+
export class UploadMediaVariantUseCase {
|
|
25
|
+
storage;
|
|
26
|
+
kv;
|
|
27
|
+
clock;
|
|
28
|
+
constructor(storage, kv, clock) {
|
|
29
|
+
this.storage = storage;
|
|
30
|
+
this.kv = kv;
|
|
31
|
+
this.clock = clock;
|
|
32
|
+
}
|
|
33
|
+
async execute(request) {
|
|
34
|
+
const opPath = "usecase/UploadMediaVariant";
|
|
35
|
+
const kvKey = `${PENDING_UPLOAD_KV_PREFIX}${request.uploadGroupId}`;
|
|
36
|
+
const raw = await this.kv.get(kvKey);
|
|
37
|
+
if (!raw) {
|
|
38
|
+
throw new DiagnosticError(mediaUploadExpiredDiagnostic(opPath, request.uploadGroupId));
|
|
39
|
+
}
|
|
40
|
+
const record = JSON.parse(raw);
|
|
41
|
+
// Wall-clock expiry check. KV TTL covers the eventual-deletion
|
|
42
|
+
// case, but during the window between `expiresAt` and the TTL
|
|
43
|
+
// firing the record is still readable — reject explicitly so the
|
|
44
|
+
// agent can't ship variant bytes against a stale capability.
|
|
45
|
+
if (this.clock.now() >= record.expiresAt) {
|
|
46
|
+
throw new DiagnosticError(mediaUploadExpiredDiagnostic(opPath, request.uploadGroupId));
|
|
47
|
+
}
|
|
48
|
+
// Find the matching declared variant. The pending record's
|
|
49
|
+
// variants[] is the source of truth for "what role + mime are
|
|
50
|
+
// valid in this group"; an agent uploading something not in the
|
|
51
|
+
// declared set is rejected the same way create-then-PUT would
|
|
52
|
+
// have rejected an unknown storageKey.
|
|
53
|
+
const declared = findMatchingVariant(record.variants, request.role, request.mimeType);
|
|
54
|
+
if (!declared) {
|
|
55
|
+
throw new DiagnosticError(mediaMimeRejectedDiagnostic(opPath, request.mimeType));
|
|
56
|
+
}
|
|
57
|
+
const byteSize = request.bytes.byteLength;
|
|
58
|
+
if (byteSize > declared.maxBytes) {
|
|
59
|
+
throw new DiagnosticError(mediaVariantSizeExceededDiagnostic(opPath, request.mimeType, byteSize, declared.maxBytes));
|
|
60
|
+
}
|
|
61
|
+
const result = await this.storage.putVariantBytes({
|
|
62
|
+
uploadGroupId: request.uploadGroupId,
|
|
63
|
+
purpose: record.purpose,
|
|
64
|
+
role: request.role,
|
|
65
|
+
mimeType: request.mimeType,
|
|
66
|
+
filename: record.filename,
|
|
67
|
+
bytes: request.bytes,
|
|
68
|
+
});
|
|
69
|
+
return { storageKey: result.storageKey, byteSize };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function findMatchingVariant(variants, role, mimeType) {
|
|
73
|
+
return variants.find((v) => v.role === role && v.mimeType === mimeType);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=UploadMediaVariantUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UploadMediaVariantUseCase.js","sourceRoot":"","sources":["../../../src/usecase/media/UploadMediaVariantUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAQtD,OAAO,EACL,4BAA4B,EAC5B,kCAAkC,EAClC,2BAA2B,GAC5B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAM/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,yBAAyB;IAEjB;IACA;IACA;IAHnB,YACmB,OAAqB,EACrB,EAAW,EACX,KAAY;QAFZ,YAAO,GAAP,OAAO,CAAc;QACrB,OAAE,GAAF,EAAE,CAAS;QACX,UAAK,GAAL,KAAK,CAAO;IAC5B,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,OAAkC;QAElC,MAAM,MAAM,GAAG,4BAA4B,CAAC;QAE5C,MAAM,KAAK,GAAG,GAAG,wBAAwB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAwB,CAAC;QAEtD,+DAA+D;QAC/D,8DAA8D;QAC9D,iEAAiE;QACjE,6DAA6D;QAC7D,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,IAAI,eAAe,CACvB,4BAA4B,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAC5D,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,8DAA8D;QAC9D,gEAAgE;QAChE,8DAA8D;QAC9D,uCAAuC;QACvC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CACvB,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CACtD,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QAC1C,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,eAAe,CACvB,kCAAkC,CAChC,MAAM,EACN,OAAO,CAAC,QAAQ,EAChB,QAAQ,EACR,QAAQ,CAAC,QAAQ,CAClB,CACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YAChD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;IACrD,CAAC;CACF;AAED,SAAS,mBAAmB,CAC1B,QAA6C,EAC7C,IAAsB,EACtB,QAAgB;IAEhB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
|
|
2
2
|
export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
|
|
3
|
+
export { UploadMediaVariantUseCase } from "./UploadMediaVariantUseCase.js";
|
|
3
4
|
export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, type MediaMimeType, } from "./mediaAllowlist.js";
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { CreateMediaUploadUseCase } from "./CreateMediaUploadUseCase.js";
|
|
2
2
|
export { CommitMediaUploadUseCase } from "./CommitMediaUploadUseCase.js";
|
|
3
|
+
export { UploadMediaVariantUseCase } from "./UploadMediaVariantUseCase.js";
|
|
3
4
|
export { DEFAULT_MAX_BYTES, MEDIA_MIME_ALLOWLIST, MEDIA_SVG_MIME, PENDING_UPLOAD_KV_PREFIX, PENDING_UPLOAD_KV_TTL_SECONDS, UPLOAD_URL_TTL_SECONDS, extensionForMime, isAllowedMime, } from "./mediaAllowlist.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/usecase/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAEd,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SchemaManifest } from "@aotter/mantle-spec";
|
|
2
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
3
4
|
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
4
5
|
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
5
6
|
import type { PreviewEntryRequest } from "../dto/render/PreviewEntryRequest.js";
|
|
@@ -20,7 +21,8 @@ export declare class PreviewEntryUseCase {
|
|
|
20
21
|
private readonly paths;
|
|
21
22
|
private readonly composeSeo;
|
|
22
23
|
private readonly schemas;
|
|
23
|
-
|
|
24
|
+
private readonly mediaAssets;
|
|
25
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
|
|
24
26
|
execute(request: PreviewEntryRequest): Promise<string | null>;
|
|
25
27
|
}
|
|
26
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,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,WAAW,EACjB,MAAM,yCAAyC,CAAC;
|
|
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,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAWjD;;;;;;;;;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,WAAW,EACvB,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;CA+BpE"}
|
|
@@ -3,6 +3,7 @@ import { joinParentIfTranslation } from "../../domain/service/io/JoinedEntryRead
|
|
|
3
3
|
import { renderEntryHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
4
|
import { defaultPreviewBanner, injectPreviewBanner, } from "../../domain/service/PreviewBanner.js";
|
|
5
5
|
import { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
|
|
6
|
+
import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
|
|
6
7
|
/** Default fallback: prefer drafts, fall back to published, then
|
|
7
8
|
* archived. Authors typically open `?preview=1` to see WIP. */
|
|
8
9
|
const DEFAULT_PREVIEW_STATUS_ORDER = [
|
|
@@ -26,12 +27,14 @@ export class PreviewEntryUseCase {
|
|
|
26
27
|
paths;
|
|
27
28
|
composeSeo;
|
|
28
29
|
schemas;
|
|
29
|
-
|
|
30
|
+
mediaAssets;
|
|
31
|
+
constructor(db, templates, paths, composeSeo, schemas, mediaAssets = null) {
|
|
30
32
|
this.db = db;
|
|
31
33
|
this.templates = templates;
|
|
32
34
|
this.paths = paths;
|
|
33
35
|
this.composeSeo = composeSeo;
|
|
34
36
|
this.schemas = schemas;
|
|
37
|
+
this.mediaAssets = mediaAssets;
|
|
35
38
|
}
|
|
36
39
|
async execute(request) {
|
|
37
40
|
const order = request.statusOrder ?? DEFAULT_PREVIEW_STATUS_ORDER;
|
|
@@ -54,10 +57,12 @@ export class PreviewEntryUseCase {
|
|
|
54
57
|
// published-parent invariant at publish time.
|
|
55
58
|
const entry = await joinParentIfTranslation(this.db, this.schemas, raw);
|
|
56
59
|
const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
|
|
60
|
+
const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, [entry]);
|
|
57
61
|
const html = renderEntryHtml({
|
|
58
62
|
entry,
|
|
59
63
|
site: request.site,
|
|
60
64
|
templates: this.templates,
|
|
65
|
+
mediaAssets,
|
|
61
66
|
seo,
|
|
62
67
|
});
|
|
63
68
|
if (html === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewEntryUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/PreviewEntryUseCase.ts"],"names":[],"mappings":"
|
|
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,yCAAyC,CAAC;AACjD,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,UAAuB,EACvB,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA4B;QACxC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,IAAI,4BAA4B,CAAC;QAClE,IAAI,GAAG,GAAiB,IAAI,CAAC;QAC7B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,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,OAAO,CAAC,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SchemaManifest } from "@aotter/mantle-spec";
|
|
2
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
3
4
|
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
4
5
|
import type { PublicPathResolver } from "../../domain/service/PublicPathResolver.js";
|
|
5
6
|
import type { RenderEntryLiveRequest } from "../dto/render/RenderEntryLiveRequest.js";
|
|
@@ -29,7 +30,8 @@ export declare class RenderEntryLiveUseCase {
|
|
|
29
30
|
private readonly paths;
|
|
30
31
|
private readonly composeSeo;
|
|
31
32
|
private readonly schemas;
|
|
32
|
-
|
|
33
|
+
private readonly mediaAssets;
|
|
34
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, paths: PublicPathResolver | null, composeSeo: SeoComposer, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
|
|
33
35
|
execute(request: RenderEntryLiveRequest): Promise<string | null>;
|
|
34
36
|
}
|
|
35
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,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,WAAW,EACjB,MAAM,yCAAyC,CAAC;
|
|
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,WAAW,EACjB,MAAM,yCAAyC,CAAC;AAGjD;;;;;;;;;;;;;;;;;;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,WAAW,EACvB,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"}
|
|
@@ -2,6 +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 { composeSeoIfPathed, } from "../../domain/service/EntrySeoSupport.js";
|
|
5
|
+
import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
|
|
5
6
|
/**
|
|
6
7
|
* Render a single entry from current DB state. Used by adapter live-
|
|
7
8
|
* dev routes (`MANTLE_LOCAL_DEV=1`) to bypass the KV cache and pick up
|
|
@@ -27,12 +28,14 @@ export class RenderEntryLiveUseCase {
|
|
|
27
28
|
paths;
|
|
28
29
|
composeSeo;
|
|
29
30
|
schemas;
|
|
30
|
-
|
|
31
|
+
mediaAssets;
|
|
32
|
+
constructor(db, templates, paths, composeSeo, schemas, mediaAssets = null) {
|
|
31
33
|
this.db = db;
|
|
32
34
|
this.templates = templates;
|
|
33
35
|
this.paths = paths;
|
|
34
36
|
this.composeSeo = composeSeo;
|
|
35
37
|
this.schemas = schemas;
|
|
38
|
+
this.mediaAssets = mediaAssets;
|
|
36
39
|
}
|
|
37
40
|
async execute(request) {
|
|
38
41
|
const status = request.status ?? "published";
|
|
@@ -48,10 +51,12 @@ export class RenderEntryLiveUseCase {
|
|
|
48
51
|
parentStatus: status,
|
|
49
52
|
});
|
|
50
53
|
const seo = await composeSeoIfPathed(this.composeSeo, this.paths, entry, request.site);
|
|
54
|
+
const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, [entry]);
|
|
51
55
|
return renderEntryHtml({
|
|
52
56
|
entry,
|
|
53
57
|
site: request.site,
|
|
54
58
|
templates: this.templates,
|
|
59
|
+
mediaAssets,
|
|
55
60
|
seo,
|
|
56
61
|
});
|
|
57
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderEntryLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderEntryLiveUseCase.ts"],"names":[],"mappings":"
|
|
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,yCAAyC,CAAC;AACjD,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,UAAuB,EACvB,OAA4C,EAC5C,cAA2C,IAAI;QAL/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,UAAK,GAAL,KAAK,CAA2B;QAChC,eAAU,GAAV,UAAU,CAAa;QACvB,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA+B;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC7C,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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SchemaManifest } from "@aotter/mantle-spec";
|
|
2
2
|
import type { DatabaseDriver } from "../../domain/port/DatabaseDriver.js";
|
|
3
|
+
import type { MediaAssetRepository } from "../../domain/port/MediaAssetRepository.js";
|
|
3
4
|
import type { TemplateRegistry } from "../../domain/model/TemplateRegistry.js";
|
|
4
5
|
import type { RenderListLiveRequest } from "../dto/render/RenderListLiveRequest.js";
|
|
5
6
|
/**
|
|
@@ -17,7 +18,8 @@ export declare class RenderListLiveUseCase {
|
|
|
17
18
|
private readonly db;
|
|
18
19
|
private readonly templates;
|
|
19
20
|
private readonly schemas;
|
|
20
|
-
|
|
21
|
+
private readonly mediaAssets;
|
|
22
|
+
constructor(db: DatabaseDriver, templates: TemplateRegistry, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetRepository | null);
|
|
21
23
|
execute(request: RenderListLiveRequest): Promise<string | null>;
|
|
22
24
|
}
|
|
23
25
|
//# sourceMappingURL=RenderListLiveUseCase.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.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,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAI/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.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;AAI/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAGpF;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,EAAE,EAAE,cAAc,EAClB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,oBAAoB,GAAG,IAAW;IAG5D,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAkBtE"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readPublishedEntries } from "../../domain/service/io/PublishedEntries.js";
|
|
2
2
|
import { joinParentForList } from "../../domain/service/io/JoinedEntryReader.js";
|
|
3
3
|
import { renderListHtml } from "../../domain/service/HtmlRenderer.js";
|
|
4
|
+
import { resolveMediaAssetsForEntries } from "../../domain/service/io/MediaAssetReferences.js";
|
|
4
5
|
/**
|
|
5
6
|
* Render a collection's list page from current DB state. Sibling to
|
|
6
7
|
* `RenderEntryLiveUseCase` for the post-list / page-list surfaces.
|
|
@@ -16,10 +17,12 @@ export class RenderListLiveUseCase {
|
|
|
16
17
|
db;
|
|
17
18
|
templates;
|
|
18
19
|
schemas;
|
|
19
|
-
|
|
20
|
+
mediaAssets;
|
|
21
|
+
constructor(db, templates, schemas, mediaAssets = null) {
|
|
20
22
|
this.db = db;
|
|
21
23
|
this.templates = templates;
|
|
22
24
|
this.schemas = schemas;
|
|
25
|
+
this.mediaAssets = mediaAssets;
|
|
23
26
|
}
|
|
24
27
|
async execute(request) {
|
|
25
28
|
const raw = await readPublishedEntries(this.db, {
|
|
@@ -29,12 +32,14 @@ export class RenderListLiveUseCase {
|
|
|
29
32
|
const entries = await joinParentForList(this.db, this.schemas, raw, {
|
|
30
33
|
parentStatus: "published",
|
|
31
34
|
});
|
|
35
|
+
const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, entries);
|
|
32
36
|
return renderListHtml({
|
|
33
37
|
collection: request.collection,
|
|
34
38
|
locale: request.locale,
|
|
35
39
|
entries,
|
|
36
40
|
site: request.site,
|
|
37
41
|
templates: this.templates,
|
|
42
|
+
mediaAssets,
|
|
38
43
|
});
|
|
39
44
|
}
|
|
40
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../../src/usecase/render/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,iDAAiD,CAAC;AAE/F;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IACA;IAJnB,YACmB,EAAkB,EAClB,SAA2B,EAC3B,OAA4C,EAC5C,cAA2C,IAAI;QAH/C,OAAE,GAAF,EAAE,CAAgB;QAClB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAoC;IAC/D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE;YAC9C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAClE,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClF,OAAO,cAAc,CAAC;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aotter/mantle-runtime",
|
|
3
|
-
"version": "0.0.11-alpha.
|
|
3
|
+
"version": "0.0.11-alpha.16",
|
|
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
|
-
"homepage": "https://
|
|
6
|
+
"homepage": "https://mantle.tools/",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
9
|
"url": "git+https://github.com/aotter/mantle.git",
|
|
@@ -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.16"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"zod": "^4.0.0"
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^25",
|
|
39
39
|
"typescript": "^6.0.3",
|
|
40
|
-
"vitest": "^4.1.
|
|
40
|
+
"vitest": "^4.1.7",
|
|
41
41
|
"zod": "^4.4.2"
|
|
42
42
|
},
|
|
43
43
|
"scripts": {
|