@aotter/mantle-runtime 0.1.0-alpha.2 → 0.1.0-alpha.4
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/SeoMeta.d.ts +1 -1
- package/dist/domain/model/SeoMeta.d.ts.map +1 -1
- package/dist/domain/model/TemplateRegistry.d.ts +3 -4
- package/dist/domain/model/TemplateRegistry.d.ts.map +1 -1
- package/dist/domain/model/TemplateRegistry.js.map +1 -1
- package/dist/domain/port/AssetServer.d.ts +3 -2
- package/dist/domain/port/AssetServer.d.ts.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/MarkdownSerializer.d.ts +6 -9
- package/dist/domain/service/MarkdownSerializer.d.ts.map +1 -1
- package/dist/domain/service/MarkdownSerializer.js +77 -32
- package/dist/domain/service/MarkdownSerializer.js.map +1 -1
- package/dist/domain/service/SeoMetaComposer.d.ts +13 -0
- package/dist/domain/service/SeoMetaComposer.d.ts.map +1 -1
- package/dist/domain/service/SeoMetaComposer.js +58 -9
- package/dist/domain/service/SeoMetaComposer.js.map +1 -1
- package/dist/domain/service/SitemapSerializer.d.ts +1 -1
- package/dist/domain/service/SitemapSerializer.d.ts.map +1 -1
- package/dist/domain/service/SitemapSerializer.js +1 -1
- package/dist/domain/service/SitemapSerializer.js.map +1 -1
- package/dist/domain/service/ViewSqlCompiler.d.ts +10 -0
- package/dist/domain/service/ViewSqlCompiler.d.ts.map +1 -1
- package/dist/domain/service/ViewSqlCompiler.js +55 -1
- package/dist/domain/service/ViewSqlCompiler.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- 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 +31 -1
- package/dist/infrastructure/boot/canonicalMigrations.js.map +1 -1
- package/dist/infrastructure/boot/index.d.ts +1 -1
- package/dist/infrastructure/boot/index.d.ts.map +1 -1
- package/dist/infrastructure/boot/index.js +1 -1
- package/dist/infrastructure/boot/index.js.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts +12 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.d.ts.map +1 -1
- package/dist/infrastructure/mcp/McpJsonRpcDispatcher.js +39 -7
- 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 +3 -1
- package/dist/infrastructure/mcp/McpToolCatalog.js.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.d.ts.map +1 -1
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js +19 -5
- package/dist/infrastructure/persistence/DatabaseSiteConfigRepository.js.map +1 -1
- package/dist/infrastructure/testing/IndexCoverageHarness.d.ts.map +1 -1
- package/dist/infrastructure/testing/IndexCoverageHarness.js +5 -4
- package/dist/infrastructure/testing/IndexCoverageHarness.js.map +1 -1
- package/dist/runtime.d.ts +2 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +39 -4
- package/dist/runtime.js.map +1 -1
- package/dist/usecase/content/ListEntriesUseCase.js +2 -2
- package/dist/usecase/content/ListEntriesUseCase.js.map +1 -1
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts +4 -0
- package/dist/usecase/dto/render/ComposeEntrySeoMetaRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts +6 -1
- package/dist/usecase/dto/render/ComposeLlmsTxtRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts +4 -2
- package/dist/usecase/dto/render/ComposeSitemapRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts +5 -0
- package/dist/usecase/dto/render/PreviewEntryRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts +5 -0
- package/dist/usecase/dto/render/RenderEntryLiveRequest.d.ts.map +1 -1
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts +4 -0
- package/dist/usecase/dto/render/RenderListLiveRequest.d.ts.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js +13 -6
- package/dist/usecase/render/ComposeEntrySeoMetaUseCase.js.map +1 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts +4 -2
- package/dist/usecase/render/ComposeLlmsTxtUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js +13 -2
- package/dist/usecase/render/ComposeLlmsTxtUseCase.js.map +1 -1
- package/dist/usecase/render/ComposeSitemapUseCase.d.ts.map +1 -1
- package/dist/usecase/render/ComposeSitemapUseCase.js +13 -3
- package/dist/usecase/render/ComposeSitemapUseCase.js.map +1 -1
- package/dist/usecase/render/PreviewEntryUseCase.js +2 -2
- package/dist/usecase/render/PreviewEntryUseCase.js.map +1 -1
- package/dist/usecase/render/RenderEntryLiveUseCase.js +2 -2
- package/dist/usecase/render/RenderEntryLiveUseCase.js.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.d.ts.map +1 -1
- package/dist/usecase/render/RenderListLiveUseCase.js +2 -1
- package/dist/usecase/render/RenderListLiveUseCase.js.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts +2 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.d.ts.map +1 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js +4 -1
- package/dist/usecase/site/UpdateSiteSettingsUseCase.js.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.d.ts.map +1 -1
- package/dist/usecase/view/ExecuteViewUseCase.js +3 -1
- package/dist/usecase/view/ExecuteViewUseCase.js.map +1 -1
- package/package.json +2 -2
|
@@ -14,7 +14,7 @@ export interface SeoMeta {
|
|
|
14
14
|
readonly canonical: string;
|
|
15
15
|
/** Absolute URL of the markdown mirror — `<link rel="alternate"
|
|
16
16
|
* type="text/markdown">`. AEO-critical. */
|
|
17
|
-
readonly alternateMarkdown: string;
|
|
17
|
+
readonly alternateMarkdown: string | null;
|
|
18
18
|
/** One per locale this entry has a translation in, plus an
|
|
19
19
|
* `x-default` row when the site has multiple locales. */
|
|
20
20
|
readonly hreflangs: ReadonlyArray<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoMeta.d.ts","sourceRoot":"","sources":["../../../src/domain/model/SeoMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAO;IACtB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;gDAC4C;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SeoMeta.d.ts","sourceRoot":"","sources":["../../../src/domain/model/SeoMeta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,OAAO;IACtB,yDAAyD;IACzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;gDAC4C;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C;8DAC0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,mDAAmD;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,EAAE;QACX,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QACrC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,0BAA0B;IAC1B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,CAAC;QACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;IACF;iCAC6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC"}
|
|
@@ -10,10 +10,9 @@ import type { MediaAsset } from "../port/MediaStorage.js";
|
|
|
10
10
|
* their public surface (Hono + hono/jsx) call their JSX → string
|
|
11
11
|
* function before the template returns.
|
|
12
12
|
*
|
|
13
|
-
* Schemas without a registered entry/list template
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* templates).
|
|
13
|
+
* Schemas without a registered entry/list template skip HTML.
|
|
14
|
+
* Their agent mirrors are emitted only when a public path resolves
|
|
15
|
+
* and the entry has serializable content.
|
|
17
16
|
*
|
|
18
17
|
* `seo` is populated when the renderer is given a composed SeoMeta
|
|
19
18
|
* block — templates render `<SeoTags seo={seo} />` (or read fields
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateRegistry.d.ts","sourceRoot":"","sources":["../../../src/domain/model/TemplateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"TemplateRegistry.d.ts","sourceRoot":"","sources":["../../../src/domain/model/TemplateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAC;AAC1D,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,MAAM,CAAC;AAExD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IAEzD,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,GAAG,IAAI;IAIjE,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI;IAI/D,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI/D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;CAG9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateRegistry.js","sourceRoot":"","sources":["../../../src/domain/model/TemplateRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TemplateRegistry.js","sourceRoot":"","sources":["../../../src/domain/model/TemplateRegistry.ts"],"names":[],"mappings":"AA4CA,MAAM,OAAO,gBAAgB;IACV,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC3C,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEzD,qBAAqB,CAAC,UAAkB,EAAE,CAAgB;QACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,oBAAoB,CAAC,UAAkB,EAAE,CAAe;QACtD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,gBAAgB,CAAC,UAAkB;QACjC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;IAED,eAAe,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `AssetServer` — static-asset serving for the admin SPA. The admin
|
|
3
3
|
* SPA itself lives in `@aotter/mantle-admin-ui` as a pre-built
|
|
4
|
-
* `dist
|
|
5
|
-
*
|
|
4
|
+
* `dist/`; `mantle generate` copies it into the consumer's static root.
|
|
5
|
+
* The adapter binds `AssetServer` to whatever serves that directory.
|
|
6
|
+
* The runtime knows nothing about MIME
|
|
6
7
|
* types, caching headers, or compression — it just asks the port and
|
|
7
8
|
* returns the response.
|
|
8
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetServer.d.ts","sourceRoot":"","sources":["../../../src/domain/port/AssetServer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"AssetServer.d.ts","sourceRoot":"","sources":["../../../src/domain/port/AssetServer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CAC/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocaleNegotiator.d.ts","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"LocaleNegotiator.d.ts","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,WAAW,EACX,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,CAYzE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAa1E;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAKvE;AAED;;2CAE2C;AAC3C,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { URL_LOCALE, toUrlLocale, } from "@aotter/mantle-spec";
|
|
1
|
+
import { DEFAULT_SITE_ICONS, URL_LOCALE, toUrlLocale, } from "@aotter/mantle-spec";
|
|
2
2
|
/**
|
|
3
3
|
* Locale + SiteConfig helpers used at request entry by every public
|
|
4
4
|
* router. Pure functions on existing spec types — no I/O, no env.
|
|
@@ -28,7 +28,7 @@ export function siteConfigFromDefaults(defaults) {
|
|
|
28
28
|
origin: defaults.origin ?? "",
|
|
29
29
|
locales,
|
|
30
30
|
canonicalLocale: locales[0] ?? null,
|
|
31
|
-
|
|
31
|
+
icons: defaults.icons ?? DEFAULT_SITE_ICONS,
|
|
32
32
|
media: { purposes: [...(defaults.media?.purposes ?? [])] },
|
|
33
33
|
};
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocaleNegotiator.js","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,WAAW,GAGZ,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;QACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;QAC7B,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;QACnC,
|
|
1
|
+
{"version":3,"file":"LocaleNegotiator.js","sourceRoot":"","sources":["../../../src/domain/service/LocaleNegotiator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,WAAW,GAGZ,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,OAAO;QACL,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE;QAC7C,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;QACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;QAC7B,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI;QACnC,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,kBAAkB;QAC3C,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,IAAgB;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,yEAAyE;IACzE,gEAAgE;IAChE,sEAAsE;IACtE,8DAA8D;IAC9D,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAgB;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED;;2CAE2C;AAC3C,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -19,21 +19,17 @@ import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
|
19
19
|
*
|
|
20
20
|
* <content>
|
|
21
21
|
*
|
|
22
|
-
* Entries without
|
|
23
|
-
* mirror — see `getMarkdownBody` below for the dual-field rule.
|
|
22
|
+
* Entries without serializable public content skip the `.md` mirror.
|
|
24
23
|
*
|
|
25
24
|
* Pure transformation — no I/O. Lives in `domain/service/`.
|
|
26
25
|
*/
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* from it) declares `body`. Both are markdown text under the hood;
|
|
31
|
-
* accept either everywhere a markdown payload is read so consumers
|
|
32
|
-
* don't have to choose. Single predicate so `serializeEntryAsMarkdown`,
|
|
33
|
-
* `serializeLlmsTxt`, and the article-signal heuristic stay in sync.
|
|
27
|
+
* `content`/`body` win, then structured sections, then a non-empty
|
|
28
|
+
* description/summary. One predicate keeps mirrors and metadata in sync.
|
|
34
29
|
*/
|
|
35
30
|
export declare function getMarkdownBody(entry: Entry): string | null;
|
|
36
31
|
export declare function hasMarkdownBody(entry: Entry): boolean;
|
|
32
|
+
export declare function getEntryDescription(entry: Entry): string | null;
|
|
37
33
|
export declare function serializeEntryAsMarkdown(entry: Entry): string | null;
|
|
38
34
|
/**
|
|
39
35
|
* Per-locale `/llms.txt` index. One section per collection, one bullet
|
|
@@ -44,5 +40,6 @@ export declare function serializeLlmsTxt(args: {
|
|
|
44
40
|
readonly site: SiteConfig;
|
|
45
41
|
readonly locale: string;
|
|
46
42
|
readonly entriesByCollection: ReadonlyMap<string, readonly Entry[]>;
|
|
47
|
-
|
|
43
|
+
readonly pathFor: (entry: Entry) => string | null;
|
|
44
|
+
}): string | null;
|
|
48
45
|
//# sourceMappingURL=MarkdownSerializer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownSerializer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D
|
|
1
|
+
{"version":3,"file":"MarkdownSerializer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAS3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAErD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAuBpE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC;CACnD,GAAG,MAAM,GAAG,IAAI,CAsBhB"}
|
|
@@ -19,43 +19,48 @@ import { absoluteUrl, appendMarkdownExt } from "./AbsoluteUrl.js";
|
|
|
19
19
|
*
|
|
20
20
|
* <content>
|
|
21
21
|
*
|
|
22
|
-
* Entries without
|
|
23
|
-
* mirror — see `getMarkdownBody` below for the dual-field rule.
|
|
22
|
+
* Entries without serializable public content skip the `.md` mirror.
|
|
24
23
|
*
|
|
25
24
|
* Pure transformation — no I/O. Lives in `domain/service/`.
|
|
26
25
|
*/
|
|
27
26
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* from it) declares `body`. Both are markdown text under the hood;
|
|
31
|
-
* accept either everywhere a markdown payload is read so consumers
|
|
32
|
-
* don't have to choose. Single predicate so `serializeEntryAsMarkdown`,
|
|
33
|
-
* `serializeLlmsTxt`, and the article-signal heuristic stay in sync.
|
|
27
|
+
* `content`/`body` win, then structured sections, then a non-empty
|
|
28
|
+
* description/summary. One predicate keeps mirrors and metadata in sync.
|
|
34
29
|
*/
|
|
35
30
|
export function getMarkdownBody(entry) {
|
|
36
31
|
const data = entry.data;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
32
|
+
for (const key of ["content", "body"]) {
|
|
33
|
+
const value = nonEmptyString(data[key]);
|
|
34
|
+
if (value)
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
const sections = serializeSections(data["sections"]);
|
|
38
|
+
if (sections)
|
|
39
|
+
return sections;
|
|
40
|
+
return getEntryDescription(entry);
|
|
42
41
|
}
|
|
43
42
|
export function hasMarkdownBody(entry) {
|
|
44
43
|
return getMarkdownBody(entry) !== null;
|
|
45
44
|
}
|
|
45
|
+
export function getEntryDescription(entry) {
|
|
46
|
+
return nonEmptyString(entry.data["description"])
|
|
47
|
+
?? nonEmptyString(entry.data["summary"]);
|
|
48
|
+
}
|
|
46
49
|
export function serializeEntryAsMarkdown(entry) {
|
|
47
50
|
const data = entry.data;
|
|
48
51
|
const content = getMarkdownBody(entry);
|
|
49
52
|
if (content == null)
|
|
50
53
|
return null;
|
|
51
54
|
const fm = [];
|
|
52
|
-
for (const k of ["title", "
|
|
55
|
+
for (const k of ["title", "slug", "locale", "publishedAt"]) {
|
|
53
56
|
const v = k === "locale" ? entry.locale : data[k];
|
|
54
57
|
if (typeof v === "string" && v.length > 0)
|
|
55
58
|
fm.push([k, v]);
|
|
56
59
|
}
|
|
57
60
|
const title = data["title"] ?? entry.id;
|
|
58
|
-
const description =
|
|
61
|
+
const description = getEntryDescription(entry);
|
|
62
|
+
if (description)
|
|
63
|
+
fm.splice(1, 0, ["description", description]);
|
|
59
64
|
let out = "---\n";
|
|
60
65
|
for (const [k, v] of fm)
|
|
61
66
|
out += `${k}: ${yamlScalar(v)}\n`;
|
|
@@ -74,31 +79,71 @@ export function serializeEntryAsMarkdown(entry) {
|
|
|
74
79
|
* so agent consumers can rely on a stable structure.
|
|
75
80
|
*/
|
|
76
81
|
export function serializeLlmsTxt(args) {
|
|
77
|
-
const { site, locale, entriesByCollection } = args;
|
|
78
|
-
const
|
|
79
|
-
let out = `# ${site.title}\n\n`;
|
|
80
|
-
if (site.description)
|
|
81
|
-
out += `> ${site.description}\n\n`;
|
|
82
|
-
if (locale)
|
|
83
|
-
out += `Locale: ${locale}\n\n`;
|
|
82
|
+
const { site, locale, entriesByCollection, pathFor } = args;
|
|
83
|
+
const sections = [];
|
|
84
84
|
for (const [collection, entries] of entriesByCollection) {
|
|
85
|
-
|
|
86
|
-
continue;
|
|
87
|
-
out += `## ${collection}\n\n`;
|
|
85
|
+
const bullets = [];
|
|
88
86
|
for (const e of entries) {
|
|
89
87
|
if (!hasMarkdownBody(e))
|
|
90
88
|
continue;
|
|
91
89
|
const data = e.data;
|
|
92
90
|
const title = data["title"] ?? e.id;
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
91
|
+
const path = pathFor(e);
|
|
92
|
+
if (!path)
|
|
93
|
+
continue;
|
|
94
|
+
const desc = getEntryDescription(e) ?? "";
|
|
95
|
+
const url = appendMarkdownExt(absoluteUrl(site.origin, path));
|
|
96
|
+
bullets.push(desc ? `- [${title}](${url}): ${desc}` : `- [${title}](${url})`);
|
|
98
97
|
}
|
|
99
|
-
|
|
98
|
+
if (bullets.length > 0)
|
|
99
|
+
sections.push(`## ${collection}\n\n${bullets.join("\n")}`);
|
|
100
100
|
}
|
|
101
|
-
|
|
101
|
+
if (sections.length === 0)
|
|
102
|
+
return null;
|
|
103
|
+
let out = `# ${site.title}\n\n`;
|
|
104
|
+
if (site.description)
|
|
105
|
+
out += `> ${site.description}\n\n`;
|
|
106
|
+
if (locale)
|
|
107
|
+
out += `Locale: ${locale}\n\n`;
|
|
108
|
+
return `${out}${sections.join("\n\n")}\n`;
|
|
109
|
+
}
|
|
110
|
+
function serializeSections(value) {
|
|
111
|
+
if (!Array.isArray(value))
|
|
112
|
+
return null;
|
|
113
|
+
const sections = value.map(serializeSection).filter((section) => section.length > 0);
|
|
114
|
+
return sections.length > 0 ? sections.join("\n\n") : null;
|
|
115
|
+
}
|
|
116
|
+
function serializeSection(value) {
|
|
117
|
+
if (!isRecord(value))
|
|
118
|
+
return "";
|
|
119
|
+
const heading = nonEmptyString(value["title"]);
|
|
120
|
+
const lines = heading ? [`## ${heading}`] : [];
|
|
121
|
+
for (const key of ["eyebrow", "body", "description", "quote", "value"]) {
|
|
122
|
+
const text = nonEmptyString(value[key]);
|
|
123
|
+
if (text && text !== heading)
|
|
124
|
+
lines.push(text);
|
|
125
|
+
}
|
|
126
|
+
if (Array.isArray(value["items"])) {
|
|
127
|
+
for (const item of value["items"]) {
|
|
128
|
+
if (!isRecord(item))
|
|
129
|
+
continue;
|
|
130
|
+
const title = nonEmptyString(item["title"]);
|
|
131
|
+
const body = nonEmptyString(item["body"])
|
|
132
|
+
?? nonEmptyString(item["description"])
|
|
133
|
+
?? nonEmptyString(item["quote"]);
|
|
134
|
+
if (title && body)
|
|
135
|
+
lines.push(`- **${title}:** ${body}`);
|
|
136
|
+
else if (title ?? body)
|
|
137
|
+
lines.push(`- ${title ?? body}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return lines.join("\n\n");
|
|
141
|
+
}
|
|
142
|
+
function nonEmptyString(value) {
|
|
143
|
+
return typeof value === "string" && value.trim() ? value : null;
|
|
144
|
+
}
|
|
145
|
+
function isRecord(value) {
|
|
146
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
102
147
|
}
|
|
103
148
|
function yamlScalar(s) {
|
|
104
149
|
if (/^[A-Za-z0-9._/-][\w. /:-]*$/.test(s) && !/^(true|false|null|yes|no|on|off)$/i.test(s)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../../src/domain/service/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,8 +33,21 @@ export interface ComposeEntrySeoMetaArgs {
|
|
|
33
33
|
/** og:type. Defaults to `article` when the entry has a `publishedAt`
|
|
34
34
|
* (or `updatedAt`) field, `website` otherwise. */
|
|
35
35
|
readonly type?: "article" | "website";
|
|
36
|
+
/** Public-route locale for non-localized entries mounted under a locale URL. */
|
|
37
|
+
readonly locale?: string;
|
|
36
38
|
}
|
|
37
39
|
export declare function composeEntrySeoMeta(args: ComposeEntrySeoMetaArgs): SeoMeta;
|
|
40
|
+
export interface ComposePageSeoMetaArgs {
|
|
41
|
+
readonly site: SiteConfig;
|
|
42
|
+
readonly locale: string;
|
|
43
|
+
readonly publicPath: string;
|
|
44
|
+
readonly title?: string;
|
|
45
|
+
readonly description?: string | null;
|
|
46
|
+
readonly markdown: boolean;
|
|
47
|
+
readonly pathForLocale: (locale: string) => string;
|
|
48
|
+
}
|
|
49
|
+
/** SEO for public home/list pages that are not represented by one Entry. */
|
|
50
|
+
export declare function composePageSeoMeta(args: ComposePageSeoMetaArgs): SeoMeta;
|
|
38
51
|
/**
|
|
39
52
|
* Render the SEO meta block as an HTML fragment. Templates embed this
|
|
40
53
|
* verbatim inside `<head>` via `raw(renderSeoTagsHtml(seo))`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoMetaComposer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;yDACqD;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;wEACoE;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACtD;uDACmD;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"SeoMetaComposer.d.ts","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAKnD;;;;;;;;;;;;;;;GAeG;AACH,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B;yDACqD;IACrD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;wEACoE;IACpE,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IACtD;uDACmD;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IACtC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,OAAO,CAkD1E;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACpD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAiDxE;AAmFD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAgDvD"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { toUrlLocale } from "@aotter/mantle-spec";
|
|
2
2
|
import { absoluteUrl, appendMarkdownExt } from "./AbsoluteUrl.js";
|
|
3
3
|
import { escapeHtml as escapeAttr } from "./HtmlEscaping.js";
|
|
4
|
-
import { hasMarkdownBody } from "./MarkdownSerializer.js";
|
|
4
|
+
import { getEntryDescription, hasMarkdownBody } from "./MarkdownSerializer.js";
|
|
5
5
|
export function composeEntrySeoMeta(args) {
|
|
6
6
|
const { entry, site, publicPath, siblings = [], type } = args;
|
|
7
7
|
const data = entry.data;
|
|
8
8
|
const canonical = absoluteUrl(site.origin, publicPath);
|
|
9
|
-
const alternateMarkdown = appendMarkdownExt(canonical);
|
|
9
|
+
const alternateMarkdown = hasMarkdownBody(entry) ? appendMarkdownExt(canonical) : null;
|
|
10
10
|
const title = stringField(data, "title") ?? site.title;
|
|
11
|
-
const description =
|
|
11
|
+
const description = getEntryDescription(entry) ?? site.description ?? null;
|
|
12
12
|
const image = stringField(data, "coverUrl") ?? stringField(data, "ogImage") ?? null;
|
|
13
13
|
const ogType = type ?? (hasArticleSignal(entry) ? "article" : "website");
|
|
14
|
-
const entryLocale = entry.locale ?? site.canonicalLocale ?? "en";
|
|
14
|
+
const entryLocale = args.locale ?? entry.locale ?? site.canonicalLocale ?? "en";
|
|
15
15
|
const hreflangs = buildHreflangs({
|
|
16
16
|
site,
|
|
17
17
|
currentLocale: entryLocale,
|
|
@@ -46,13 +46,60 @@ export function composeEntrySeoMeta(args) {
|
|
|
46
46
|
image,
|
|
47
47
|
data,
|
|
48
48
|
site,
|
|
49
|
+
locale: entryLocale,
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** SEO for public home/list pages that are not represented by one Entry. */
|
|
54
|
+
export function composePageSeoMeta(args) {
|
|
55
|
+
const { site, locale, publicPath, pathForLocale } = args;
|
|
56
|
+
const canonical = absoluteUrl(site.origin, publicPath);
|
|
57
|
+
const title = args.title ?? site.title;
|
|
58
|
+
const description = args.description ?? site.description ?? null;
|
|
59
|
+
const hreflangs = [
|
|
60
|
+
...site.locales.map((candidate) => ({
|
|
61
|
+
locale: candidate,
|
|
62
|
+
href: absoluteUrl(site.origin, pathForLocale(candidate)),
|
|
63
|
+
})),
|
|
64
|
+
{
|
|
65
|
+
locale: "x-default",
|
|
66
|
+
href: absoluteUrl(site.origin, pathForLocale(site.canonicalLocale ?? site.locales[0] ?? locale)),
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
return {
|
|
70
|
+
canonical,
|
|
71
|
+
alternateMarkdown: args.markdown ? appendMarkdownExt(canonical) : null,
|
|
72
|
+
hreflangs,
|
|
73
|
+
description,
|
|
74
|
+
og: {
|
|
75
|
+
type: "website",
|
|
76
|
+
url: canonical,
|
|
77
|
+
title,
|
|
78
|
+
siteName: site.title || site.brand,
|
|
79
|
+
description,
|
|
80
|
+
image: null,
|
|
81
|
+
locale,
|
|
82
|
+
},
|
|
83
|
+
twitter: {
|
|
84
|
+
card: "summary",
|
|
85
|
+
title,
|
|
86
|
+
description,
|
|
87
|
+
image: null,
|
|
88
|
+
},
|
|
89
|
+
jsonLd: buildJsonLd({
|
|
90
|
+
ogType: "website",
|
|
91
|
+
title,
|
|
92
|
+
description,
|
|
93
|
+
canonical,
|
|
94
|
+
image: null,
|
|
95
|
+
data: {},
|
|
96
|
+
site,
|
|
97
|
+
locale,
|
|
49
98
|
}),
|
|
50
99
|
};
|
|
51
100
|
}
|
|
52
101
|
function buildHreflangs(args) {
|
|
53
102
|
const { site, currentLocale, currentPublicPath, siblings } = args;
|
|
54
|
-
if (site.locales.length <= 1)
|
|
55
|
-
return [];
|
|
56
103
|
const out = [];
|
|
57
104
|
const seen = new Set();
|
|
58
105
|
const push = (locale, path) => {
|
|
@@ -76,7 +123,7 @@ function buildHreflangs(args) {
|
|
|
76
123
|
return out;
|
|
77
124
|
}
|
|
78
125
|
function buildJsonLd(args) {
|
|
79
|
-
const { ogType, title, description, canonical, image, data, site } = args;
|
|
126
|
+
const { ogType, title, description, canonical, image, data, site, locale } = args;
|
|
80
127
|
const publishedAtMs = numericField(data, "publishedAt");
|
|
81
128
|
const updatedAtMs = numericField(data, "updatedAt");
|
|
82
129
|
const base = {
|
|
@@ -87,7 +134,7 @@ function buildJsonLd(args) {
|
|
|
87
134
|
url: canonical,
|
|
88
135
|
description: description ?? undefined,
|
|
89
136
|
image: image ?? undefined,
|
|
90
|
-
inLanguage:
|
|
137
|
+
inLanguage: locale,
|
|
91
138
|
publisher: site.title || site.brand
|
|
92
139
|
? {
|
|
93
140
|
"@type": "Organization",
|
|
@@ -122,7 +169,9 @@ function hasArticleSignal(entry) {
|
|
|
122
169
|
export function renderSeoTagsHtml(meta) {
|
|
123
170
|
const parts = [];
|
|
124
171
|
parts.push(`<link rel="canonical" href="${escapeAttr(meta.canonical)}">`);
|
|
125
|
-
|
|
172
|
+
if (meta.alternateMarkdown) {
|
|
173
|
+
parts.push(`<link rel="alternate" type="text/markdown" href="${escapeAttr(meta.alternateMarkdown)}">`);
|
|
174
|
+
}
|
|
126
175
|
for (const h of meta.hreflangs) {
|
|
127
176
|
parts.push(`<link rel="alternate" hreflang="${escapeAttr(h.locale)}" href="${escapeAttr(h.href)}">`);
|
|
128
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoMetaComposer.js","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+B,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,UAAU,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"SeoMetaComposer.js","sourceRoot":"","sources":["../../../src/domain/service/SeoMetaComposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import type { Entry, SiteConfig } from "@aotter/mantle-spec";
|
|
|
8
8
|
* locale) row surfaces under the consumer's routing.
|
|
9
9
|
*/
|
|
10
10
|
export interface SitemapEntry {
|
|
11
|
-
readonly entry
|
|
11
|
+
readonly entry?: Entry;
|
|
12
12
|
readonly path: string;
|
|
13
13
|
}
|
|
14
14
|
export interface SitemapInput {
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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,CAAC,EAAE,KAAK,CAAC;IACvB,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"}
|
|
@@ -8,7 +8,7 @@ export function serializeSitemap(input) {
|
|
|
8
8
|
const loc = absoluteUrl(site.origin ?? "", path);
|
|
9
9
|
out.push(" <url>");
|
|
10
10
|
out.push(` <loc>${escapeXml(loc)}</loc>`);
|
|
11
|
-
if (entry
|
|
11
|
+
if (entry?.updatedAt) {
|
|
12
12
|
out.push(` <lastmod>${new Date(entry.updatedAt).toISOString()}</lastmod>`);
|
|
13
13
|
}
|
|
14
14
|
out.push(" </url>");
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,EAAE,SAAS,EAAE,CAAC;YACrB,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"}
|
|
@@ -29,6 +29,16 @@ export interface CompileViewOptions {
|
|
|
29
29
|
readonly show?: number;
|
|
30
30
|
/** Site-local Better Auth user id for identity-bound filters. */
|
|
31
31
|
readonly ctxUserId?: string;
|
|
32
|
+
/** Admin-only substring search over manifest-allowlisted output fields. */
|
|
33
|
+
readonly search?: {
|
|
34
|
+
readonly term: string;
|
|
35
|
+
readonly fields: readonly string[];
|
|
36
|
+
};
|
|
37
|
+
/** Admin-only exact filters over manifest-allowlisted output fields. */
|
|
38
|
+
readonly filters?: ReadonlyArray<{
|
|
39
|
+
readonly field: string;
|
|
40
|
+
readonly value: string;
|
|
41
|
+
}>;
|
|
32
42
|
}
|
|
33
43
|
export declare function compileView(view: ViewManifest, options?: CompileViewOptions, schema?: SchemaManifest): CompiledView;
|
|
34
44
|
//# sourceMappingURL=ViewSqlCompiler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAChF,wEAAwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtF;AAoCD,wBAAgB,WAAW,CACzB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,kBAAuB,EAChC,MAAM,CAAC,EAAE,cAAc,GACtB,YAAY,CA8Cd"}
|