@aotter/mantle-runtime 0.1.0-alpha.1 → 0.1.0-alpha.11
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/README.md +37 -4
- package/dist/MantleRuntime.d.ts +96 -0
- package/dist/MantleRuntime.d.ts.map +1 -0
- package/dist/MantleRuntime.js +197 -0
- package/dist/MantleRuntime.js.map +1 -0
- package/dist/domain/model/HandlerContext.d.ts +3 -4
- package/dist/domain/model/HandlerContext.d.ts.map +1 -1
- package/dist/domain/model/PreparedMantleRevision.d.ts +14 -0
- package/dist/domain/model/PreparedMantleRevision.d.ts.map +1 -0
- package/dist/domain/model/PreparedMantleRevision.js +8 -0
- package/dist/domain/model/PreparedMantleRevision.js.map +1 -0
- package/dist/domain/model/index.d.ts +1 -2
- package/dist/domain/model/index.d.ts.map +1 -1
- package/dist/domain/model/index.js +0 -1
- package/dist/domain/model/index.js.map +1 -1
- package/dist/domain/port/Clock.d.ts +1 -2
- package/dist/domain/port/Clock.d.ts.map +1 -1
- package/dist/domain/port/Clock.js.map +1 -1
- package/dist/domain/port/DatabaseDriver.d.ts +13 -21
- package/dist/domain/port/DatabaseDriver.d.ts.map +1 -1
- package/dist/domain/port/EntryReader.d.ts +1 -1
- package/dist/domain/port/EntryReader.d.ts.map +1 -1
- package/dist/domain/port/EntryRepository.d.ts +19 -4
- package/dist/domain/port/EntryRepository.d.ts.map +1 -1
- package/dist/domain/port/HandlerRegistry.d.ts +1 -1
- package/dist/domain/port/IdGenerator.d.ts +3 -4
- package/dist/domain/port/IdGenerator.d.ts.map +1 -1
- package/dist/domain/port/IdGenerator.js.map +1 -1
- package/dist/domain/port/MantleStorageAdapter.d.ts +23 -0
- package/dist/domain/port/MantleStorageAdapter.d.ts.map +1 -0
- package/dist/domain/port/MantleStorageAdapter.js +2 -0
- package/dist/domain/port/MantleStorageAdapter.js.map +1 -0
- package/dist/domain/port/SiteConfigRepository.d.ts +12 -10
- package/dist/domain/port/SiteConfigRepository.d.ts.map +1 -1
- package/dist/domain/port/ViewQueryExecutor.d.ts +29 -0
- package/dist/domain/port/ViewQueryExecutor.d.ts.map +1 -0
- package/dist/domain/port/ViewQueryExecutor.js +2 -0
- package/dist/domain/port/ViewQueryExecutor.js.map +1 -0
- package/dist/domain/port/index.d.ts +5 -2
- package/dist/domain/port/index.d.ts.map +1 -1
- package/dist/domain/port/index.js.map +1 -1
- package/dist/domain/service/LocaleNegotiator.d.ts.map +1 -1
- package/dist/domain/service/LocaleNegotiator.js +2 -2
- package/dist/domain/service/LocaleNegotiator.js.map +1 -1
- package/dist/domain/service/RuntimePlanCompiler.d.ts +89 -0
- package/dist/domain/service/RuntimePlanCompiler.d.ts.map +1 -0
- package/dist/domain/service/RuntimePlanCompiler.js +230 -0
- package/dist/domain/service/RuntimePlanCompiler.js.map +1 -0
- package/dist/domain/service/TriggerIndex.d.ts +5 -3
- package/dist/domain/service/TriggerIndex.d.ts.map +1 -1
- package/dist/domain/service/TriggerIndex.js +16 -4
- package/dist/domain/service/TriggerIndex.js.map +1 -1
- package/dist/domain/service/ViewParamCoercer.d.ts +1 -1
- package/dist/domain/service/ViewParamCoercer.js +1 -1
- package/dist/domain/service/index.d.ts +1 -9
- package/dist/domain/service/index.d.ts.map +1 -1
- package/dist/domain/service/index.js +1 -9
- package/dist/domain/service/index.js.map +1 -1
- package/dist/domain/service/io/EntryDeleteGuard.js +1 -1
- package/dist/domain/service/io/EntryDeleteGuard.js.map +1 -1
- package/dist/domain/service/io/EntryWriteGuard.d.ts +2 -2
- package/dist/domain/service/io/EntryWriteGuard.d.ts.map +1 -1
- package/dist/domain/service/io/EntryWriteGuard.js +1 -3
- package/dist/domain/service/io/EntryWriteGuard.js.map +1 -1
- package/dist/index.d.ts +17 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -11
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/boot/SqliteMigrationRunner.d.ts +10 -0
- package/dist/infrastructure/boot/SqliteMigrationRunner.d.ts.map +1 -0
- package/dist/infrastructure/boot/SqliteMigrationRunner.js +41 -0
- package/dist/infrastructure/boot/SqliteMigrationRunner.js.map +1 -0
- package/dist/infrastructure/boot/bootState.d.ts +9 -0
- package/dist/infrastructure/boot/bootState.d.ts.map +1 -0
- package/dist/infrastructure/boot/bootState.js +32 -0
- package/dist/infrastructure/boot/bootState.js.map +1 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts +2 -0
- package/dist/infrastructure/boot/canonicalMigrations.d.ts.map +1 -1
- package/dist/infrastructure/boot/canonicalMigrations.js +166 -87
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
- package/dist/infrastructure/boot/index.d.ts +3 -1
- package/dist/infrastructure/boot/index.d.ts.map +1 -1
- package/dist/infrastructure/boot/index.js +3 -1
- package/dist/infrastructure/boot/index.js.map +1 -1
- package/dist/infrastructure/http/createMantleRequestHandler.d.ts +12 -0
- package/dist/infrastructure/http/createMantleRequestHandler.d.ts.map +1 -0
- package/dist/infrastructure/http/createMantleRequestHandler.js +127 -0
- package/dist/infrastructure/http/createMantleRequestHandler.js.map +1 -0
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +18 -23
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +64 -39
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpToolCatalog.js +84 -19
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
- package/dist/infrastructure/mcp/index.d.ts +1 -1
- package/dist/infrastructure/mcp/index.d.ts.map +1 -1
- package/dist/infrastructure/mcp/index.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts +4 -8
- package/dist/infrastructure/persistence/DatabaseEntryRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js +75 -36
- package/dist/infrastructure/persistence/DatabaseEntryRepository.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +39 -31
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -1
- package/dist/infrastructure/persistence/Pagination.d.ts +3 -0
- package/dist/infrastructure/persistence/Pagination.d.ts.map +1 -1
- package/dist/infrastructure/persistence/Pagination.js +28 -0
- package/dist/infrastructure/persistence/Pagination.js.map +1 -1
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts +22 -0
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.d.ts.map +1 -0
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js +86 -0
- package/dist/infrastructure/storage/SqliteMantleStorageAdapter.js.map +1 -0
- package/dist/{domain/service/ViewSqlCompiler.d.ts → infrastructure/storage/SqliteViewCompiler.d.ts} +9 -10
- package/dist/infrastructure/storage/SqliteViewCompiler.d.ts.map +1 -0
- package/dist/infrastructure/storage/SqliteViewCompiler.js +307 -0
- package/dist/infrastructure/storage/SqliteViewCompiler.js.map +1 -0
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts +2 -2
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts.map +1 -1
- package/dist/infrastructure/testing/IndexCoverageHarness.js +9 -8
- package/dist/infrastructure/testing/IndexCoverageHarness.js.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.d.ts +16 -35
- package/dist/usecase/boot/ValidateBootUseCase.d.ts.map +1 -1
- package/dist/usecase/boot/ValidateBootUseCase.js +79 -254
- package/dist/usecase/boot/ValidateBootUseCase.js.map +1 -1
- package/dist/usecase/boot/index.d.ts +1 -1
- package/dist/usecase/boot/index.d.ts.map +1 -1
- package/dist/usecase/boot/index.js +1 -1
- package/dist/usecase/boot/index.js.map +1 -1
- package/dist/usecase/content/ArchiveUseCase.d.ts +1 -1
- package/dist/usecase/content/ArchiveUseCase.js +1 -1
- package/dist/usecase/content/CreateDraftUseCase.d.ts +3 -3
- package/dist/usecase/content/CreateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/CreateDraftUseCase.js +5 -5
- package/dist/usecase/content/CreateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/DeleteEntryUseCase.d.ts +3 -5
- package/dist/usecase/content/DeleteEntryUseCase.d.ts.map +1 -1
- package/dist/usecase/content/DeleteEntryUseCase.js +3 -5
- package/dist/usecase/content/DeleteEntryUseCase.js.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.d.ts.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.js +30 -3
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -1
- package/dist/usecase/content/RequestPublishUseCase.d.ts +4 -12
- package/dist/usecase/content/RequestPublishUseCase.d.ts.map +1 -1
- package/dist/usecase/content/RequestPublishUseCase.js +3 -21
- package/dist/usecase/content/RequestPublishUseCase.js.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.d.ts +2 -2
- package/dist/usecase/content/UpdateDraftUseCase.d.ts.map +1 -1
- package/dist/usecase/content/UpdateDraftUseCase.js +4 -4
- package/dist/usecase/content/UpdateDraftUseCase.js.map +1 -1
- package/dist/usecase/content/diagnostics.d.ts +1 -0
- package/dist/usecase/content/diagnostics.d.ts.map +1 -1
- package/dist/usecase/content/diagnostics.js +10 -0
- package/dist/usecase/content/diagnostics.js.map +1 -1
- package/dist/usecase/dto/content/index.d.ts +10 -1
- package/dist/usecase/dto/content/index.d.ts.map +1 -1
- package/dist/usecase/dto/index.d.ts +0 -1
- package/dist/usecase/dto/index.d.ts.map +1 -1
- package/dist/usecase/dto/index.js +0 -1
- package/dist/usecase/dto/index.js.map +1 -1
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts +2 -2
- package/dist/usecase/dto/view/ExecuteViewRequest.d.ts.map +1 -1
- package/dist/usecase/index.d.ts +0 -1
- package/dist/usecase/index.d.ts.map +1 -1
- package/dist/usecase/index.js +0 -1
- package/dist/usecase/index.js.map +1 -1
- package/dist/usecase/media/diagnostics.js +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts +3 -3
- package/dist/usecase/procedure/InvokeBuiltinUseCase.d.ts.map +1 -1
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js +2 -2
- package/dist/usecase/procedure/InvokeBuiltinUseCase.js.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts +3 -2
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js +35 -2
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.d.ts +8 -16
- package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.js +23 -94
- package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -1
- package/dist/usecase/view/index.d.ts +2 -1
- package/dist/usecase/view/index.d.ts.map +1 -1
- package/dist/usecase/view/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/domain/model/SeoMeta.d.ts +0 -47
- package/dist/domain/model/SeoMeta.d.ts.map +0 -1
- package/dist/domain/model/SeoMeta.js +0 -2
- package/dist/domain/model/SeoMeta.js.map +0 -1
- package/dist/domain/model/TemplateRegistry.d.ts +0 -50
- package/dist/domain/model/TemplateRegistry.d.ts.map +0 -1
- package/dist/domain/model/TemplateRegistry.js +0 -17
- package/dist/domain/model/TemplateRegistry.js.map +0 -1
- package/dist/domain/port/AssetServer.d.ts +0 -21
- package/dist/domain/port/AssetServer.d.ts.map +0 -1
- package/dist/domain/port/AssetServer.js +0 -2
- package/dist/domain/port/AssetServer.js.map +0 -1
- package/dist/domain/service/AbsoluteUrl.d.ts +0 -6
- package/dist/domain/service/AbsoluteUrl.d.ts.map +0 -1
- package/dist/domain/service/AbsoluteUrl.js +0 -33
- package/dist/domain/service/AbsoluteUrl.js.map +0 -1
- package/dist/domain/service/HtmlEscaping.d.ts +0 -2
- package/dist/domain/service/HtmlEscaping.d.ts.map +0 -1
- package/dist/domain/service/HtmlEscaping.js +0 -9
- package/dist/domain/service/HtmlEscaping.js.map +0 -1
- package/dist/domain/service/HtmlRenderer.d.ts +0 -36
- package/dist/domain/service/HtmlRenderer.d.ts.map +0 -1
- package/dist/domain/service/HtmlRenderer.js +0 -73
- package/dist/domain/service/HtmlRenderer.js.map +0 -1
- package/dist/domain/service/MarkdownSerializer.d.ts +0 -48
- package/dist/domain/service/MarkdownSerializer.d.ts.map +0 -1
- package/dist/domain/service/MarkdownSerializer.js +0 -109
- package/dist/domain/service/MarkdownSerializer.js.map +0 -1
- package/dist/domain/service/McpToolNaming.d.ts +0 -31
- package/dist/domain/service/McpToolNaming.d.ts.map +0 -1
- package/dist/domain/service/McpToolNaming.js +0 -48
- package/dist/domain/service/McpToolNaming.js.map +0 -1
- package/dist/domain/service/PreviewBanner.d.ts +0 -10
- package/dist/domain/service/PreviewBanner.d.ts.map +0 -1
- package/dist/domain/service/PreviewBanner.js +0 -30
- package/dist/domain/service/PreviewBanner.js.map +0 -1
- package/dist/domain/service/PublicPathResolver.d.ts +0 -46
- package/dist/domain/service/PublicPathResolver.d.ts.map +0 -1
- package/dist/domain/service/PublicPathResolver.js +0 -36
- package/dist/domain/service/PublicPathResolver.js.map +0 -1
- package/dist/domain/service/SeoMetaComposer.d.ts +0 -47
- package/dist/domain/service/SeoMetaComposer.d.ts.map +0 -1
- package/dist/domain/service/SeoMetaComposer.js +0 -164
- package/dist/domain/service/SeoMetaComposer.js.map +0 -1
- package/dist/domain/service/SitemapSerializer.d.ts +0 -19
- package/dist/domain/service/SitemapSerializer.d.ts.map +0 -1
- package/dist/domain/service/SitemapSerializer.js +0 -27
- package/dist/domain/service/SitemapSerializer.js.map +0 -1
- package/dist/domain/service/ViewSqlCompiler.d.ts.map +0 -1
- package/dist/domain/service/ViewSqlCompiler.js +0 -198
- package/dist/domain/service/ViewSqlCompiler.js.map +0 -1
- package/dist/domain/service/io/MediaAssetReferences.d.ts +0 -13
- package/dist/domain/service/io/MediaAssetReferences.d.ts.map +0 -1
- package/dist/domain/service/io/MediaAssetReferences.js +0 -48
- package/dist/domain/service/io/MediaAssetReferences.js.map +0 -1
- package/dist/runtime.d.ts +0 -141
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -177
- package/dist/runtime.js.map +0 -1
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +0 -14
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js +0 -2
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.js.map +0 -1
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +0 -8
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js +0 -2
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.js.map +0 -1
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +0 -11
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/ComposeSitemapRequest.js +0 -2
- package/dist/usecase/dto/render/ComposeSitemapRequest.js.map +0 -1
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +0 -13
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/PreviewEntryRequest.js +0 -2
- package/dist/usecase/dto/render/PreviewEntryRequest.js.map +0 -1
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +0 -14
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js +0 -2
- package/dist/usecase/dto/render/RenderEntryLiveRequest.js.map +0 -1
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +0 -11
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +0 -1
- package/dist/usecase/dto/render/RenderListLiveRequest.js +0 -2
- package/dist/usecase/dto/render/RenderListLiveRequest.js.map +0 -1
- package/dist/usecase/dto/render/index.d.ts +0 -7
- package/dist/usecase/dto/render/index.d.ts.map +0 -1
- package/dist/usecase/dto/render/index.js +0 -7
- package/dist/usecase/dto/render/index.js.map +0 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +0 -28
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +0 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +0 -59
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +0 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +0 -16
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +0 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js +0 -36
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +0 -1
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts +0 -15
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +0 -1
- package/dist/usecase/render/ComposeSitemapUseCase.js +0 -28
- package/dist/usecase/render/ComposeSitemapUseCase.js.map +0 -1
- package/dist/usecase/render/PreviewEntryUseCase.d.ts +0 -28
- package/dist/usecase/render/PreviewEntryUseCase.d.ts.map +0 -1
- package/dist/usecase/render/PreviewEntryUseCase.js +0 -72
- package/dist/usecase/render/PreviewEntryUseCase.js.map +0 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts +0 -36
- package/dist/usecase/render/RenderEntryLiveUseCase.d.ts.map +0 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js +0 -62
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +0 -1
- package/dist/usecase/render/RenderListLiveUseCase.d.ts +0 -25
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +0 -1
- package/dist/usecase/render/RenderListLiveUseCase.js +0 -45
- package/dist/usecase/render/RenderListLiveUseCase.js.map +0 -1
- package/dist/usecase/render/index.d.ts +0 -7
- package/dist/usecase/render/index.d.ts.map +0 -1
- package/dist/usecase/render/index.js +0 -7
- package/dist/usecase/render/index.js.map +0 -1
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
import { toUrlLocale } from "@aotter/mantle-spec";
|
|
2
|
-
import { absoluteUrl, appendMarkdownExt } from "./AbsoluteUrl.js";
|
|
3
|
-
import { escapeHtml as escapeAttr } from "./HtmlEscaping.js";
|
|
4
|
-
import { hasMarkdownBody } from "./MarkdownSerializer.js";
|
|
5
|
-
export function composeEntrySeoMeta(args) {
|
|
6
|
-
const { entry, site, publicPath, siblings = [], type } = args;
|
|
7
|
-
const data = entry.data;
|
|
8
|
-
const canonical = absoluteUrl(site.origin, publicPath);
|
|
9
|
-
const alternateMarkdown = appendMarkdownExt(canonical);
|
|
10
|
-
const title = stringField(data, "title") ?? site.title;
|
|
11
|
-
const description = stringField(data, "description") ?? site.description ?? null;
|
|
12
|
-
const image = stringField(data, "coverUrl") ?? stringField(data, "ogImage") ?? null;
|
|
13
|
-
const ogType = type ?? (hasArticleSignal(entry) ? "article" : "website");
|
|
14
|
-
const entryLocale = entry.locale ?? site.canonicalLocale ?? "en";
|
|
15
|
-
const hreflangs = buildHreflangs({
|
|
16
|
-
site,
|
|
17
|
-
currentLocale: entryLocale,
|
|
18
|
-
currentPublicPath: publicPath,
|
|
19
|
-
siblings,
|
|
20
|
-
});
|
|
21
|
-
return {
|
|
22
|
-
canonical,
|
|
23
|
-
alternateMarkdown,
|
|
24
|
-
hreflangs,
|
|
25
|
-
description: description ?? null,
|
|
26
|
-
og: {
|
|
27
|
-
type: ogType,
|
|
28
|
-
url: canonical,
|
|
29
|
-
title,
|
|
30
|
-
siteName: site.title || site.brand,
|
|
31
|
-
description: description ?? null,
|
|
32
|
-
image,
|
|
33
|
-
locale: entryLocale,
|
|
34
|
-
},
|
|
35
|
-
twitter: {
|
|
36
|
-
card: image ? "summary_large_image" : "summary",
|
|
37
|
-
title,
|
|
38
|
-
description: description ?? null,
|
|
39
|
-
image,
|
|
40
|
-
},
|
|
41
|
-
jsonLd: buildJsonLd({
|
|
42
|
-
ogType,
|
|
43
|
-
title,
|
|
44
|
-
description,
|
|
45
|
-
canonical,
|
|
46
|
-
image,
|
|
47
|
-
data,
|
|
48
|
-
site,
|
|
49
|
-
}),
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function buildHreflangs(args) {
|
|
53
|
-
const { site, currentLocale, currentPublicPath, siblings } = args;
|
|
54
|
-
if (site.locales.length <= 1)
|
|
55
|
-
return [];
|
|
56
|
-
const out = [];
|
|
57
|
-
const seen = new Set();
|
|
58
|
-
const push = (locale, path) => {
|
|
59
|
-
const key = locale.toLowerCase();
|
|
60
|
-
if (seen.has(key))
|
|
61
|
-
return;
|
|
62
|
-
seen.add(key);
|
|
63
|
-
out.push({ locale, href: absoluteUrl(site.origin, path) });
|
|
64
|
-
};
|
|
65
|
-
push(currentLocale, currentPublicPath);
|
|
66
|
-
for (const s of siblings)
|
|
67
|
-
push(s.locale, s.publicPath);
|
|
68
|
-
// x-default points at the canonical-locale variant when known,
|
|
69
|
-
// falling back to the current entry's URL otherwise. Search engines
|
|
70
|
-
// expect this row alongside the per-locale ones.
|
|
71
|
-
const canonicalSibling = siblings.find((s) => site.canonicalLocale && s.locale.toLowerCase() === site.canonicalLocale.toLowerCase());
|
|
72
|
-
out.push({
|
|
73
|
-
locale: "x-default",
|
|
74
|
-
href: absoluteUrl(site.origin, canonicalSibling?.publicPath ?? currentPublicPath),
|
|
75
|
-
});
|
|
76
|
-
return out;
|
|
77
|
-
}
|
|
78
|
-
function buildJsonLd(args) {
|
|
79
|
-
const { ogType, title, description, canonical, image, data, site } = args;
|
|
80
|
-
const publishedAtMs = numericField(data, "publishedAt");
|
|
81
|
-
const updatedAtMs = numericField(data, "updatedAt");
|
|
82
|
-
const base = {
|
|
83
|
-
"@context": "https://schema.org",
|
|
84
|
-
"@type": ogType === "article" ? "Article" : "WebPage",
|
|
85
|
-
headline: title,
|
|
86
|
-
name: title,
|
|
87
|
-
url: canonical,
|
|
88
|
-
description: description ?? undefined,
|
|
89
|
-
image: image ?? undefined,
|
|
90
|
-
inLanguage: site.canonicalLocale ?? undefined,
|
|
91
|
-
publisher: site.title || site.brand
|
|
92
|
-
? {
|
|
93
|
-
"@type": "Organization",
|
|
94
|
-
name: site.title || site.brand,
|
|
95
|
-
}
|
|
96
|
-
: undefined,
|
|
97
|
-
datePublished: publishedAtMs ? new Date(publishedAtMs).toISOString() : undefined,
|
|
98
|
-
dateModified: updatedAtMs ? new Date(updatedAtMs).toISOString() : undefined,
|
|
99
|
-
};
|
|
100
|
-
// Drop undefined keys so JSON.stringify produces a clean object.
|
|
101
|
-
return Object.fromEntries(Object.entries(base).filter(([, v]) => v !== undefined));
|
|
102
|
-
}
|
|
103
|
-
function stringField(data, key) {
|
|
104
|
-
const v = data[key];
|
|
105
|
-
return typeof v === "string" && v.length > 0 ? v : null;
|
|
106
|
-
}
|
|
107
|
-
function numericField(data, key) {
|
|
108
|
-
const v = data[key];
|
|
109
|
-
return typeof v === "number" && Number.isFinite(v) ? v : null;
|
|
110
|
-
}
|
|
111
|
-
function hasArticleSignal(entry) {
|
|
112
|
-
return typeof entry.data["publishedAt"] === "number" || hasMarkdownBody(entry);
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Render the SEO meta block as an HTML fragment. Templates embed this
|
|
116
|
-
* verbatim inside `<head>` via `raw(renderSeoTagsHtml(seo))`.
|
|
117
|
-
*
|
|
118
|
-
* Order matters slightly for crawlers — canonical first, alternates
|
|
119
|
-
* (markdown then hreflang) before og:/twitter so the discoverability
|
|
120
|
-
* bones land before the rich-preview block.
|
|
121
|
-
*/
|
|
122
|
-
export function renderSeoTagsHtml(meta) {
|
|
123
|
-
const parts = [];
|
|
124
|
-
parts.push(`<link rel="canonical" href="${escapeAttr(meta.canonical)}">`);
|
|
125
|
-
parts.push(`<link rel="alternate" type="text/markdown" href="${escapeAttr(meta.alternateMarkdown)}">`);
|
|
126
|
-
for (const h of meta.hreflangs) {
|
|
127
|
-
parts.push(`<link rel="alternate" hreflang="${escapeAttr(h.locale)}" href="${escapeAttr(h.href)}">`);
|
|
128
|
-
}
|
|
129
|
-
if (meta.description) {
|
|
130
|
-
parts.push(`<meta name="description" content="${escapeAttr(meta.description)}">`);
|
|
131
|
-
}
|
|
132
|
-
parts.push(`<meta name="generator" content="mantle">`);
|
|
133
|
-
parts.push(`<meta property="og:type" content="${escapeAttr(meta.og.type)}">`);
|
|
134
|
-
parts.push(`<meta property="og:url" content="${escapeAttr(meta.og.url)}">`);
|
|
135
|
-
parts.push(`<meta property="og:title" content="${escapeAttr(meta.og.title)}">`);
|
|
136
|
-
if (meta.og.siteName) {
|
|
137
|
-
parts.push(`<meta property="og:site_name" content="${escapeAttr(meta.og.siteName)}">`);
|
|
138
|
-
}
|
|
139
|
-
if (meta.og.description) {
|
|
140
|
-
parts.push(`<meta property="og:description" content="${escapeAttr(meta.og.description)}">`);
|
|
141
|
-
}
|
|
142
|
-
if (meta.og.image) {
|
|
143
|
-
parts.push(`<meta property="og:image" content="${escapeAttr(meta.og.image)}">`);
|
|
144
|
-
}
|
|
145
|
-
parts.push(`<meta property="og:locale" content="${escapeAttr(toUrlLocale(meta.og.locale))}">`);
|
|
146
|
-
parts.push(`<meta name="twitter:card" content="${escapeAttr(meta.twitter.card)}">`);
|
|
147
|
-
parts.push(`<meta name="twitter:title" content="${escapeAttr(meta.twitter.title)}">`);
|
|
148
|
-
if (meta.twitter.description) {
|
|
149
|
-
parts.push(`<meta name="twitter:description" content="${escapeAttr(meta.twitter.description)}">`);
|
|
150
|
-
}
|
|
151
|
-
if (meta.twitter.image) {
|
|
152
|
-
parts.push(`<meta name="twitter:image" content="${escapeAttr(meta.twitter.image)}">`);
|
|
153
|
-
}
|
|
154
|
-
if (meta.jsonLd) {
|
|
155
|
-
parts.push(`<script type="application/ld+json">${escapeJsonLd(meta.jsonLd)}</script>`);
|
|
156
|
-
}
|
|
157
|
-
return parts.join("\n");
|
|
158
|
-
}
|
|
159
|
-
function escapeJsonLd(obj) {
|
|
160
|
-
// `</script>` inside JSON-LD is the only nested-script pitfall;
|
|
161
|
-
// escaping the closing `</` keeps the embedded JSON strict-parseable.
|
|
162
|
-
return JSON.stringify(obj).replace(/<\//g, "<\\/");
|
|
163
|
-
}
|
|
164
|
-
//# sourceMappingURL=SeoMetaComposer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SeoMetaComposer.js","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
2
|
-
/**
|
|
3
|
-
* Hreflang alternates are deferred to v0.1.x (need cross-locale entry
|
|
4
|
-
* pairing first); only minimal `loc + lastmod` shipped.
|
|
5
|
-
*
|
|
6
|
-
* Entries arrive pre-mapped from storage row to public path — the
|
|
7
|
-
* caller (`ComposeSitemapUseCase`) decides how a (collection, slug,
|
|
8
|
-
* locale) row surfaces under the consumer's routing.
|
|
9
|
-
*/
|
|
10
|
-
export interface SitemapEntry {
|
|
11
|
-
readonly entry: Entry;
|
|
12
|
-
readonly path: string;
|
|
13
|
-
}
|
|
14
|
-
export interface SitemapInput {
|
|
15
|
-
readonly site: SiteConfig;
|
|
16
|
-
readonly entries: readonly SitemapEntry[];
|
|
17
|
-
}
|
|
18
|
-
export declare function serializeSitemap(input: SitemapInput): string;
|
|
19
|
-
//# sourceMappingURL=SitemapSerializer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SitemapSerializer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/SitemapSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAgB5D"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { absoluteUrl } from "./AbsoluteUrl.js";
|
|
2
|
-
export function serializeSitemap(input) {
|
|
3
|
-
const { site, entries } = input;
|
|
4
|
-
const out = [];
|
|
5
|
-
out.push(`<?xml version="1.0" encoding="UTF-8"?>`);
|
|
6
|
-
out.push(`<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`);
|
|
7
|
-
for (const { entry, path } of entries) {
|
|
8
|
-
const loc = absoluteUrl(site.origin ?? "", path);
|
|
9
|
-
out.push(" <url>");
|
|
10
|
-
out.push(` <loc>${escapeXml(loc)}</loc>`);
|
|
11
|
-
if (entry.updatedAt) {
|
|
12
|
-
out.push(` <lastmod>${new Date(entry.updatedAt).toISOString()}</lastmod>`);
|
|
13
|
-
}
|
|
14
|
-
out.push(" </url>");
|
|
15
|
-
}
|
|
16
|
-
out.push("</urlset>");
|
|
17
|
-
return out.join("\n") + "\n";
|
|
18
|
-
}
|
|
19
|
-
function escapeXml(s) {
|
|
20
|
-
return s
|
|
21
|
-
.replace(/&/g, "&")
|
|
22
|
-
.replace(/</g, "<")
|
|
23
|
-
.replace(/>/g, ">")
|
|
24
|
-
.replace(/"/g, """)
|
|
25
|
-
.replace(/'/g, "'");
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=SitemapSerializer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SitemapSerializer.js","sourceRoot":"","sources":["../../../src/domain/service/SitemapSerializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAoB/C,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAChC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACnD,GAAG,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IACzE,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACjD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewSqlCompiler.d.ts","sourceRoot":"","sources":["../../../src/domain/service/ViewSqlCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAG7B;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAoCD,wBAAgB,WAAW,CACzB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,kBAAuB,EAChC,MAAM,CAAC,EAAE,cAAc,GACtB,YAAY,CAwCd"}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import { DiagnosticError, isCtxUserRef, isParamRef, runtimeDiagnostic, schemaIndexedFieldSql, } from "@aotter/mantle-spec";
|
|
2
|
-
import { clampPage, clampShow } from "./Pagination.js";
|
|
3
|
-
// alias → SQL column. Aliases mirror RESERVED_ENTRY_COLUMNS from
|
|
4
|
-
// spec; SQL column shape (snake_case) is local to the storage layout.
|
|
5
|
-
// The compile-time check below ensures the alias set stays in sync —
|
|
6
|
-
// adding to spec without updating here is a type error.
|
|
7
|
-
const RESERVED_COLUMN = {
|
|
8
|
-
id: "id",
|
|
9
|
-
status: "status",
|
|
10
|
-
version: "version",
|
|
11
|
-
createdAt: "created_at",
|
|
12
|
-
updatedAt: "updated_at",
|
|
13
|
-
authorId: "author_id",
|
|
14
|
-
};
|
|
15
|
-
const _aliasCheck = RESERVED_COLUMN;
|
|
16
|
-
void _aliasCheck;
|
|
17
|
-
const DEFAULT_PROJECTION = Object.entries(RESERVED_COLUMN)
|
|
18
|
-
.map(([alias, col]) => (alias === col ? col : `${col} AS ${alias}`))
|
|
19
|
-
.join(", ");
|
|
20
|
-
const SQL_COMPARISON_OP = {
|
|
21
|
-
eq: "=",
|
|
22
|
-
gt: ">",
|
|
23
|
-
gte: ">=",
|
|
24
|
-
lt: "<",
|
|
25
|
-
lte: "<=",
|
|
26
|
-
};
|
|
27
|
-
export function compileView(view, options = {}, schema) {
|
|
28
|
-
if (schema && schema.metadata.name !== view.spec.from) {
|
|
29
|
-
throw new DiagnosticError(runtimeDiagnostic({
|
|
30
|
-
code: "INTERNAL_ERROR",
|
|
31
|
-
severity: "error",
|
|
32
|
-
path: "compileView/schema",
|
|
33
|
-
value: schema.metadata.name,
|
|
34
|
-
expected: `Schema '${view.spec.from}' referenced by View.spec.from`,
|
|
35
|
-
message: `View '${view.metadata.name}' cannot compile against Schema '${schema.metadata.name}'.`,
|
|
36
|
-
}));
|
|
37
|
-
}
|
|
38
|
-
const sqlParams = [view.spec.from];
|
|
39
|
-
const selectExpr = buildSelect(view.spec.fields, schema);
|
|
40
|
-
const whereParts = ["collection = ?"];
|
|
41
|
-
if (view.spec.filter) {
|
|
42
|
-
const compiled = compileFilter(view.spec.filter, options.params ?? {}, options.ctxUserId, schema);
|
|
43
|
-
if (compiled !== null) {
|
|
44
|
-
whereParts.push(`(${compiled.sql})`);
|
|
45
|
-
sqlParams.push(...compiled.params);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const where = `WHERE ${whereParts.join(" AND ")}`;
|
|
49
|
-
const orderBy = buildOrderBy(view.spec.orderBy, schema);
|
|
50
|
-
const effectiveShow = clampShow(options.show, view.spec.limit);
|
|
51
|
-
const effectivePage = clampPage(options.page);
|
|
52
|
-
// Cap the offset so a huge `?page=` can't render in exponential
|
|
53
|
-
// notation (`5e+21`) or exceed SQLite's INT64 range — either makes
|
|
54
|
-
// D1 reject the literal and surfaces as a 500 instead of an empty
|
|
55
|
-
// page. MAX_SAFE_INTEGER (~9e15) stringifies as plain digits and is
|
|
56
|
-
// well under INT64 max; any page past the data just returns no rows.
|
|
57
|
-
const offset = Math.min((effectivePage - 1) * effectiveShow, Number.MAX_SAFE_INTEGER);
|
|
58
|
-
const sql = `SELECT ${selectExpr} FROM entries ${where}${orderBy} LIMIT ${effectiveShow} OFFSET ${offset}`;
|
|
59
|
-
return { sql, params: sqlParams, effectivePage, effectiveShow };
|
|
60
|
-
}
|
|
61
|
-
function buildSelect(fields, schema) {
|
|
62
|
-
if (!fields || fields.length === 0)
|
|
63
|
-
return DEFAULT_PROJECTION;
|
|
64
|
-
return fields.map((field) => fieldExpr(field, schema)).join(", ");
|
|
65
|
-
}
|
|
66
|
-
function fieldExpr(field, schema) {
|
|
67
|
-
const reserved = RESERVED_COLUMN[field];
|
|
68
|
-
const expression = fieldRefExpr(field, schema);
|
|
69
|
-
if (reserved === field)
|
|
70
|
-
return expression;
|
|
71
|
-
return `${expression} AS ${reserved ? field : quoteIdent(field)}`;
|
|
72
|
-
}
|
|
73
|
-
function fieldRefExpr(field, schema) {
|
|
74
|
-
const reserved = RESERVED_COLUMN[field];
|
|
75
|
-
if (reserved)
|
|
76
|
-
return reserved;
|
|
77
|
-
const indexed = schema ? schemaIndexedFieldSql(schema, field) : null;
|
|
78
|
-
if (indexed)
|
|
79
|
-
return indexed;
|
|
80
|
-
return `json_extract(data, ${quotedJsonPath(field)})`;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Returns `null` when the node has no constraint to emit: an `eq`
|
|
84
|
-
* whose `{ $param }` ref is unresolved, or an AND/OR whose children
|
|
85
|
-
* all dropped. v0.1.0 parser enforces required-only param refs so
|
|
86
|
-
* the drop path is dead today; kept so v0.1.x "optional param ref"
|
|
87
|
-
* promotion is a parser-only change.
|
|
88
|
-
*
|
|
89
|
-
* Each node returns its own `{ sql, params }` (vs. pushing into a
|
|
90
|
-
* shared array) so a dropped sub-tree can never leave orphan params
|
|
91
|
-
* bound to the parent's `?` placeholders.
|
|
92
|
-
*/
|
|
93
|
-
function compileFilter(node, paramValues, ctxUserId, schema) {
|
|
94
|
-
const comparison = getFilterComparison(node);
|
|
95
|
-
if (comparison) {
|
|
96
|
-
const value = comparison.node.value;
|
|
97
|
-
let bound;
|
|
98
|
-
if (isCtxUserRef(value)) {
|
|
99
|
-
if (!ctxUserId)
|
|
100
|
-
throw new Error('View filter requires ctx.user.id.');
|
|
101
|
-
bound = ctxUserId;
|
|
102
|
-
}
|
|
103
|
-
else if (isParamRef(value)) {
|
|
104
|
-
const resolved = paramValues[value.$param];
|
|
105
|
-
if (resolved === undefined)
|
|
106
|
-
return null;
|
|
107
|
-
bound = resolved;
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
bound = value;
|
|
111
|
-
}
|
|
112
|
-
return {
|
|
113
|
-
sql: `${fieldRefExpr(comparison.node.field, schema)} ${SQL_COMPARISON_OP[comparison.op]} ?`,
|
|
114
|
-
params: [bound],
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
const op = "and" in node ? "AND" : "OR";
|
|
118
|
-
const children = "and" in node ? node.and : "or" in node ? node.or : [];
|
|
119
|
-
const compiled = children
|
|
120
|
-
.map((c) => compileFilter(c, paramValues, ctxUserId, schema))
|
|
121
|
-
.filter((c) => c !== null);
|
|
122
|
-
if (compiled.length === 0)
|
|
123
|
-
return null;
|
|
124
|
-
return {
|
|
125
|
-
sql: compiled.map((c) => `(${c.sql})`).join(` ${op} `),
|
|
126
|
-
params: compiled.flatMap((c) => c.params),
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
function getFilterComparison(node) {
|
|
130
|
-
if ("eq" in node)
|
|
131
|
-
return { op: "eq", node: node.eq };
|
|
132
|
-
if ("gt" in node)
|
|
133
|
-
return { op: "gt", node: node.gt };
|
|
134
|
-
if ("gte" in node)
|
|
135
|
-
return { op: "gte", node: node.gte };
|
|
136
|
-
if ("lt" in node)
|
|
137
|
-
return { op: "lt", node: node.lt };
|
|
138
|
-
if ("lte" in node)
|
|
139
|
-
return { op: "lte", node: node.lte };
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
function buildOrderBy(orderBy, schema) {
|
|
143
|
-
if (!orderBy || orderBy.length === 0)
|
|
144
|
-
return "";
|
|
145
|
-
const parts = orderBy.map((o) => {
|
|
146
|
-
// Closed-set map, never interpolate the raw value: `direction` is
|
|
147
|
-
// only a compile-time "asc"|"desc" type, but manifests are parsed
|
|
148
|
-
// from YAML, so an out-of-enum string (e.g. `DESC LIMIT 0 --`)
|
|
149
|
-
// could otherwise reach the SQL string verbatim.
|
|
150
|
-
const dir = o.direction === "desc" ? "DESC" : "ASC";
|
|
151
|
-
return `${fieldRefExpr(o.field, schema)} ${dir}`;
|
|
152
|
-
});
|
|
153
|
-
return ` ORDER BY ${parts.join(", ")}`;
|
|
154
|
-
}
|
|
155
|
-
// Schema JSON property keys can be arbitrary strings per RFC 8259,
|
|
156
|
-
// but SQLite's JSON1 path syntax (`$."key"`) has no documented way
|
|
157
|
-
// to escape an inner `"` or `\` inside a quoted key — doubled-quote
|
|
158
|
-
// escaping is the SQLite identifier convention, NOT a JSON-path
|
|
159
|
-
// convention. So we always quote the path/alias (admitting hyphens,
|
|
160
|
-
// spaces, etc.) but refuse `"`, `\`, and `\0` in field names —
|
|
161
|
-
// those break either the JSON-path resolution or the SQL string
|
|
162
|
-
// literal. Real Schema authors don't use those characters in keys;
|
|
163
|
-
// rejecting them keeps the path always-resolvable.
|
|
164
|
-
const FORBIDDEN_FIELD_CHARS = /["\\\0]/;
|
|
165
|
-
function assertFieldNameSafe(name, callsite) {
|
|
166
|
-
if (!FORBIDDEN_FIELD_CHARS.test(name))
|
|
167
|
-
return;
|
|
168
|
-
throw new DiagnosticError(runtimeDiagnostic({
|
|
169
|
-
code: "INTERNAL_ERROR",
|
|
170
|
-
severity: "error",
|
|
171
|
-
path: `compileView/${callsite}`,
|
|
172
|
-
value: name,
|
|
173
|
-
expected: 'field name without `"`, `\\`, or NUL',
|
|
174
|
-
message: `field name '${name}' contains an unrepresentable character (\", \\, or NUL); Schema validation should have caught this.`,
|
|
175
|
-
}));
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Emit `'$."<field>"'` — a SQL string literal containing a SQLite
|
|
179
|
-
* JSON path. Doubles single quotes for the surrounding SQL literal
|
|
180
|
-
* (SQLite literal escape). Field name itself is guaranteed free of
|
|
181
|
-
* `"` / `\` / NUL by `assertFieldNameSafe`, so the inner double-
|
|
182
|
-
* quoted key needs no further escape.
|
|
183
|
-
*/
|
|
184
|
-
function quotedJsonPath(field) {
|
|
185
|
-
assertFieldNameSafe(field, "quotedJsonPath");
|
|
186
|
-
// Only `'` needs escaping for the surrounding SQL literal; field
|
|
187
|
-
// is guaranteed free of `"` / `\` / NUL.
|
|
188
|
-
return `'$."${field.replace(/'/g, "''")}"'`;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* SQLite quoted-identifier alias (`"hero-image"`). Used as the result
|
|
192
|
-
* column name so callers read the field back under its declared key.
|
|
193
|
-
*/
|
|
194
|
-
function quoteIdent(name) {
|
|
195
|
-
assertFieldNameSafe(name, "quoteIdent");
|
|
196
|
-
return `"${name}"`;
|
|
197
|
-
}
|
|
198
|
-
//# sourceMappingURL=ViewSqlCompiler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ViewSqlCompiler.js","sourceRoot":"","sources":["../../../src/domain/service/ViewSqlCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Entry } from "@aotter/mantle-spec";
|
|
2
|
-
import type { MediaAssetRepository } from "../../port/MediaAssetRepository.js";
|
|
3
|
-
import type { MediaAsset } from "../../port/MediaStorage.js";
|
|
4
|
-
/**
|
|
5
|
-
* Extract media asset references from entry data by convention.
|
|
6
|
-
* Starters use `coverAssetId`, `imageAssetId`, nested `{ assetId }`, etc.
|
|
7
|
-
* The schema-level source of truth remains `x-mantle-ref: media_assets`;
|
|
8
|
-
* this convention keeps the render path schema-agnostic until the
|
|
9
|
-
* manifest compiler exposes field metadata at runtime.
|
|
10
|
-
*/
|
|
11
|
-
export declare function collectMediaAssetIds(value: unknown): readonly string[];
|
|
12
|
-
export declare function resolveMediaAssetsForEntries(repo: MediaAssetRepository | null, entries: readonly Entry[]): Promise<ReadonlyMap<string, MediaAsset> | undefined>;
|
|
13
|
-
//# sourceMappingURL=MediaAssetReferences.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaAssetReferences.d.ts","sourceRoot":"","sources":["../../../../src/domain/service/io/MediaAssetReferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAItE;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,oBAAoB,GAAG,IAAI,EACjC,OAAO,EAAE,SAAS,KAAK,EAAE,GACxB,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,CAKtD"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Extract media asset references from entry data by convention.
|
|
3
|
-
* Starters use `coverAssetId`, `imageAssetId`, nested `{ assetId }`, etc.
|
|
4
|
-
* The schema-level source of truth remains `x-mantle-ref: media_assets`;
|
|
5
|
-
* this convention keeps the render path schema-agnostic until the
|
|
6
|
-
* manifest compiler exposes field metadata at runtime.
|
|
7
|
-
*/
|
|
8
|
-
export function collectMediaAssetIds(value) {
|
|
9
|
-
const out = [];
|
|
10
|
-
collect(value, out);
|
|
11
|
-
return [...new Set(out)];
|
|
12
|
-
}
|
|
13
|
-
export async function resolveMediaAssetsForEntries(repo, entries) {
|
|
14
|
-
if (!repo)
|
|
15
|
-
return undefined;
|
|
16
|
-
const ids = collectMediaAssetIds(entries.map((entry) => entry.data));
|
|
17
|
-
if (ids.length === 0)
|
|
18
|
-
return undefined;
|
|
19
|
-
return repo.findManyByIds(ids);
|
|
20
|
-
}
|
|
21
|
-
function collect(value, out) {
|
|
22
|
-
if (value == null)
|
|
23
|
-
return;
|
|
24
|
-
if (Array.isArray(value)) {
|
|
25
|
-
for (const item of value)
|
|
26
|
-
collect(item, out);
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
if (typeof value !== "object")
|
|
30
|
-
return;
|
|
31
|
-
for (const [key, child] of Object.entries(value)) {
|
|
32
|
-
if (typeof child === "string" &&
|
|
33
|
-
(key === "assetId" || key.endsWith("AssetId")) &&
|
|
34
|
-
child.length > 0) {
|
|
35
|
-
out.push(child);
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
if (Array.isArray(child) && key.endsWith("AssetIds")) {
|
|
39
|
-
for (const item of child) {
|
|
40
|
-
if (typeof item === "string" && item.length > 0)
|
|
41
|
-
out.push(item);
|
|
42
|
-
}
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
collect(child, out);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=MediaAssetReferences.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaAssetReferences.js","sourceRoot":"","sources":["../../../../src/domain/service/io/MediaAssetReferences.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAiC,EACjC,OAAyB;IAEzB,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,GAAa;IAC5C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO;IAC1B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IACtC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC9C,KAAK,CAAC,MAAM,GAAG,CAAC,EAChB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC;YACD,SAAS;QACX,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|