@aotter/mantle-web 0.1.0-alpha.9 → 0.1.2-alpha.2

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.
Files changed (43) hide show
  1. package/README.md +147 -0
  2. package/dist/dto/ComposeLlmsTxtRequest.d.ts +9 -5
  3. package/dist/dto/ComposeLlmsTxtRequest.d.ts.map +1 -1
  4. package/dist/dto/ComposeSitemapRequest.d.ts +8 -3
  5. package/dist/dto/ComposeSitemapRequest.d.ts.map +1 -1
  6. package/dist/dto/RenderListLiveRequest.d.ts +5 -0
  7. package/dist/dto/RenderListLiveRequest.d.ts.map +1 -1
  8. package/dist/model/TemplateRegistry.d.ts +2 -0
  9. package/dist/model/TemplateRegistry.d.ts.map +1 -1
  10. package/dist/model/TemplateRegistry.js.map +1 -1
  11. package/dist/service/HtmlRenderer.d.ts +1 -0
  12. package/dist/service/HtmlRenderer.d.ts.map +1 -1
  13. package/dist/service/HtmlRenderer.js +1 -0
  14. package/dist/service/HtmlRenderer.js.map +1 -1
  15. package/dist/service/PublicPathResolver.d.ts +2 -0
  16. package/dist/service/PublicPathResolver.d.ts.map +1 -1
  17. package/dist/service/PublicPathResolver.js +1 -0
  18. package/dist/service/PublicPathResolver.js.map +1 -1
  19. package/dist/service/PublishedCollectionPager.d.ts +5 -0
  20. package/dist/service/PublishedCollectionPager.d.ts.map +1 -0
  21. package/dist/service/PublishedCollectionPager.js +37 -0
  22. package/dist/service/PublishedCollectionPager.js.map +1 -0
  23. package/dist/service/SitemapSerializer.d.ts +1 -0
  24. package/dist/service/SitemapSerializer.d.ts.map +1 -1
  25. package/dist/service/SitemapSerializer.js +5 -0
  26. package/dist/service/SitemapSerializer.js.map +1 -1
  27. package/dist/usecase/ComposeLlmsTxtUseCase.d.ts +5 -9
  28. package/dist/usecase/ComposeLlmsTxtUseCase.d.ts.map +1 -1
  29. package/dist/usecase/ComposeLlmsTxtUseCase.js +15 -20
  30. package/dist/usecase/ComposeLlmsTxtUseCase.js.map +1 -1
  31. package/dist/usecase/ComposeSitemapUseCase.d.ts +9 -8
  32. package/dist/usecase/ComposeSitemapUseCase.d.ts.map +1 -1
  33. package/dist/usecase/ComposeSitemapUseCase.js +41 -13
  34. package/dist/usecase/ComposeSitemapUseCase.js.map +1 -1
  35. package/dist/usecase/RenderListLiveUseCase.d.ts +4 -1
  36. package/dist/usecase/RenderListLiveUseCase.d.ts.map +1 -1
  37. package/dist/usecase/RenderListLiveUseCase.js +7 -3
  38. package/dist/usecase/RenderListLiveUseCase.js.map +1 -1
  39. package/dist/webmcp.d.ts +74 -0
  40. package/dist/webmcp.d.ts.map +1 -0
  41. package/dist/webmcp.js +197 -0
  42. package/dist/webmcp.js.map +1 -0
  43. package/package.json +8 -4
package/README.md CHANGED
@@ -23,3 +23,150 @@ const html = await web.renderEntryLive.execute({
23
23
 
24
24
  Omit this package when an application only needs Mantle parsing, planning, or
25
25
  headless runtime operations.
26
+
27
+ ## Public content pages
28
+
29
+ `renderListLive.execute` returns `{ html, nextCursor? } | null`.
30
+ `composeLlmsTxt.execute` returns `{ body, nextCursor? } | null`, where `body`
31
+ can be null for a page without serializable public documents.
32
+ `composeSitemap.execute` returns `{ body, nextCursor? }` for one sitemap part.
33
+ These alpha APIs now return explicit pages: a custom adapter must expose or
34
+ follow `nextCursor`, including when the current llms page has no body.
35
+
36
+ Lists and llms default to 50 entries. Pass `cursor` from the previous result and
37
+ optionally `limit` to change page size. Ordering is `updatedAt DESC, id DESC`;
38
+ these are live forward pages, not a snapshot during concurrent publication.
39
+ The reader limits each page to 2,000 rows and 1 MiB of data JSON, except a single
40
+ oversized entry is returned alone so iteration can advance.
41
+
42
+ For root llms, omit `locale`, pass `locales: site.locales`, and provide
43
+ `pathFor(entry, locale)` to expand shared entries without repeated database reads.
44
+ For a sitemap, `maxUrls` is entries per part (default 2,000). Serve an index with
45
+ `composeSitemap.index(request, cursor => partUrl(cursor))`; every part must use
46
+ the same request projection and limit. Parts have the standard 50,000-URL /
47
+ 50-MiB protocol ceilings and fail explicitly if custom expansion exceeds them.
48
+ The index walks bounded metadata pages, so its database work is proportional
49
+ to site size. `additionalPaths` appears only in the first part.
50
+
51
+ A custom sitemap `pathFor` receives full bounded data unless `dataFields` names
52
+ its required top-level fields. Built-in path resolution projects only `slug`.
53
+ Custom `PublicPathResolver` implementations can declare `dataFields` for the
54
+ Cloudflare mount to use; omission retains full data. Missing projected keys
55
+ are null and envelope fields, including locale, remain available.
56
+
57
+ Cloudflare's public mount supplies `nextPageUrl` to list templates and publishes
58
+ HTTP continuation links. Templates must render their own accessible navigation
59
+ when this URL is present (escape it like any other attribute). This replaces
60
+ the adapter's injected English Next link; update existing list templates when
61
+ adopting this version. For example, with Hono's escaping `html` tagged template:
62
+
63
+ ```ts
64
+ import { html } from "hono/html";
65
+
66
+ templates.registerListTemplate("posts", ({ entries, nextPageUrl }) =>
67
+ html`<main>${entries.map(entry => html`<article>${entry.data.title}</article>`)}
68
+ ${nextPageUrl ? html`<nav aria-label="Pagination"><a rel="next" href="${nextPageUrl}">Next</a></nav>` : ""}
69
+ </main>`.toString(),
70
+ );
71
+ ```
72
+
73
+ Custom adapters pass `pathForPage(cursor)` to `renderListLive.execute` to provide
74
+ their own URL mapping. Cloudflare serves `/sitemap.xml?part=1&cursor=...` parts
75
+ automatically. Preview authorization and public-response cache policy still apply.
76
+
77
+ ## WebMCP (opt in)
78
+
79
+ Browsers implementing the draft imperative WebMCP API can expose public Mantle
80
+ capabilities as tools. Importing the subpath has no registration side effect;
81
+ registration begins only when `bindWebMcp` is called.
82
+
83
+ ### Fresh server-backed site
84
+
85
+ Declare a public View; the Cloudflare adapter publishes its safe tool descriptor
86
+ at `/api/views` and keeps the manifest server-side.
87
+
88
+ ```yaml
89
+ apiVersion: cms.mantle.aotter.net/v1
90
+ kind: View
91
+ metadata:
92
+ name: recent-posts
93
+ spec:
94
+ surface: public
95
+ from: posts
96
+ limit: 20
97
+ ```
98
+
99
+ The default binding discovers and invokes those same-origin View routes:
100
+
101
+ ```ts
102
+ import { bindWebMcp } from "@aotter/mantle-web/webmcp";
103
+
104
+ const binding = await bindWebMcp();
105
+ ```
106
+
107
+ ### Fresh browser-local SPA
108
+
109
+ Project the active plan and dispatch through the active local Runtime. Keeping
110
+ Runtime lookup inside `invoke` lets the SPA switch bundles without stale
111
+ closures.
112
+
113
+ ```ts
114
+ import { projectCallableCapabilities } from "@aotter/mantle-runtime";
115
+ import { bindWebMcp } from "@aotter/mantle-web/webmcp";
116
+
117
+ const capabilities = projectCallableCapabilities(plan, { surface: "public" });
118
+ async function invokeMantle(capability, input, signal) {
119
+ signal.throwIfAborted();
120
+ const runtime = await getRuntime();
121
+ if (capability.kind === "procedure") {
122
+ const result = await runtime.invokeTrigger({
123
+ trigger: capability.trigger,
124
+ input,
125
+ ctx: getContext(),
126
+ });
127
+ if (!result.ok) throw result.diagnostic;
128
+ return result.data;
129
+ }
130
+ const { page, show, ...params } = input;
131
+ const result = await runtime.executeView({
132
+ view: capability.ownerName,
133
+ options: {
134
+ params,
135
+ page: typeof page === "number" ? page : undefined,
136
+ show: typeof show === "number" ? show : undefined,
137
+ },
138
+ ctx: getContext(),
139
+ });
140
+ if (!result.ok) throw result.diagnostic;
141
+ return result.result;
142
+ }
143
+
144
+ const binding = await bindWebMcp({ capabilities, invoke: invokeMantle });
145
+
146
+ // Unregister when the page/app scope ends.
147
+ binding.dispose();
148
+ ```
149
+
150
+ ### Existing WebMCP site
151
+
152
+ Pass the host's current registry and optional hooks. Mantle inspects and skips
153
+ existing names; it does not replace host registrations.
154
+
155
+ ```ts
156
+ const binding = await bindWebMcp({
157
+ capabilities,
158
+ invoke: invokeMantle,
159
+ modelContext: document.modelContext,
160
+ before(call) {
161
+ analytics.track("webmcp:start", call);
162
+ },
163
+ after({ target }, result) {
164
+ if (result.status === "fulfilled") refreshUi(target);
165
+ },
166
+ });
167
+ ```
168
+
169
+ Unsupported browsers return `{ supported: false }`. Only public capabilities
170
+ are registered. Procedure tools must originate from explicit public MCP
171
+ Triggers, and execution must enter Runtime through that Trigger. `after` is
172
+ observational: its failure never replaces the invocation result.
@@ -3,12 +3,16 @@ import type { WebSiteConfig } from "../model/WebSiteConfig.js";
3
3
  export interface ComposeLlmsTxtRequest {
4
4
  readonly site: WebSiteConfig;
5
5
  /** locale: string → entries with that locale; locale: null →
6
- * non-localized only (matches publish-pipeline semantic). */
7
- readonly locale: string | null;
6
+ * non-localized only; omitted reads all locales for a root page. */
7
+ readonly locale?: string | null;
8
+ /** Root aggregate: read one canonical page, then expand shared entries per locale. */
9
+ readonly locales?: readonly string[];
10
+ readonly cursor?: string;
11
+ readonly limit?: number;
8
12
  /** Include public non-localized entries alongside the requested locale. */
9
13
  readonly includeUnlocalized?: boolean;
10
- /** Optional collection limit used by collection-list markdown mirrors. */
11
- readonly collection?: string;
12
- readonly pathFor?: (entry: Entry) => string | null;
14
+ /** Ordered Schema tables to publish. */
15
+ readonly collections: readonly string[];
16
+ readonly pathFor?: (entry: Entry, locale: string) => string | null;
13
17
  }
14
18
  //# sourceMappingURL=ComposeLlmsTxtRequest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeLlmsTxtRequest.d.ts","sourceRoot":"","sources":["../../src/dto/ComposeLlmsTxtRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B;kEAC8D;IAC9D,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,2EAA2E;IAC3E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC;CACpD"}
1
+ {"version":3,"file":"ComposeLlmsTxtRequest.d.ts","sourceRoot":"","sources":["../../src/dto/ComposeLlmsTxtRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B;yEACqE;IACrE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,sFAAsF;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,wCAAwC;IACxC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CACpE"}
@@ -2,13 +2,18 @@ import type { Entry } from "@aotter/mantle-spec";
2
2
  import type { WebSiteConfig } from "../model/WebSiteConfig.js";
3
3
  export interface ComposeSitemapRequest {
4
4
  readonly site: WebSiteConfig;
5
+ /** Ordered Schema tables whose public routes are serialized. */
6
+ readonly collections: readonly string[];
5
7
  /** Map storage row → one or more public routes. Returning `null` skips. */
6
8
  readonly pathFor?: (entry: Entry) => string | readonly string[] | null;
7
9
  /** Public routes without a backing Entry, such as home and collection lists. */
8
10
  readonly additionalPaths?: readonly string[];
9
- /** Caps the SQL read + memory cost. Defaults to
10
- * SITEMAP_MAX_URLS_DEFAULT (50,000 — the sitemap-protocol per-file
11
- * ceiling). */
11
+ /** Entries per part (default 2,000, bounded by the reader's byte budget).
12
+ * Follow nextCursor or serve the sitemap index to retain all URLs. */
12
13
  readonly maxUrls?: number;
14
+ readonly cursor?: string;
15
+ /** Fields needed by a custom pathFor; omission preserves full entry data.
16
+ * The default mapper only reads slug and projects automatically. */
17
+ readonly dataFields?: readonly string[];
13
18
  }
14
19
  //# sourceMappingURL=ComposeSitemapRequest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeSitemapRequest.d.ts","sourceRoot":"","sources":["../../src/dto/ComposeSitemapRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACvE,gFAAgF;IAChF,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C;;oBAEgB;IAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B"}
1
+ {"version":3,"file":"ComposeSitemapRequest.d.ts","sourceRoot":"","sources":["../../src/dto/ComposeSitemapRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,gEAAgE;IAChE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACvE,gFAAgF;IAChF,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C;0EACsE;IACtE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;wEACoE;IACpE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC"}
@@ -5,6 +5,11 @@ import type { SeoMeta } from "../model/SeoMeta.js";
5
5
  * list page from current DB state on demand (no KV read).
6
6
  */
7
7
  export interface RenderListLiveRequest {
8
+ /** Forward continuation returned by the previous page. Defaults to 50 entries. */
9
+ readonly cursor?: string;
10
+ readonly limit?: number;
11
+ /** Adapter/host-owned URL mapping; templates own visible navigation. */
12
+ readonly pathForPage?: (cursor: string) => string;
8
13
  readonly collection: string;
9
14
  readonly locale: string;
10
15
  /** DB locale filter; null for non-localized collections mounted under a locale URL. */
@@ -1 +1 @@
1
- {"version":3,"file":"RenderListLiveRequest.d.ts","sourceRoot":"","sources":["../../src/dto/RenderListLiveRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"RenderListLiveRequest.d.ts","sourceRoot":"","sources":["../../src/dto/RenderListLiveRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB"}
@@ -30,6 +30,8 @@ export interface EntryContext {
30
30
  readonly seo?: SeoMeta;
31
31
  }
32
32
  export interface ListContext {
33
+ /** Render and escape this URL in host-owned pagination when present. */
34
+ readonly nextPageUrl?: string;
33
35
  readonly collection: string;
34
36
  readonly locale: string;
35
37
  readonly entries: readonly Entry[];
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateRegistry.d.ts","sourceRoot":"","sources":["../../src/model/TemplateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,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,aAAa,CAAC;IAC7B,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
+ {"version":3,"file":"TemplateRegistry.d.ts","sourceRoot":"","sources":["../../src/model/TemplateRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,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,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,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,aAAa,CAAC;IAC7B,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/model/TemplateRegistry.ts"],"names":[],"mappings":"AA6CA,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
+ {"version":3,"file":"TemplateRegistry.js","sourceRoot":"","sources":["../../src/model/TemplateRegistry.ts"],"names":[],"mappings":"AA+CA,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"}
@@ -21,6 +21,7 @@ export interface RenderEntryArgs {
21
21
  * template is registered for `entry.collection`. */
22
22
  export declare function renderEntryHtml(args: RenderEntryArgs): string | null;
23
23
  export interface RenderListArgs {
24
+ readonly nextPageUrl?: string;
24
25
  readonly collection: string;
25
26
  readonly locale: string;
26
27
  readonly entries: ReadonlyArray<Entry>;
@@ -1 +1 @@
1
- {"version":3,"file":"HtmlRenderer.d.ts","sourceRoot":"","sources":["../../src/service/HtmlRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC;mEAC+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD;;;+DAG2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;qDACqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAepE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;mCACmC;AACnC,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAelE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAalE;AAYD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGjF"}
1
+ {"version":3,"file":"HtmlRenderer.d.ts","sourceRoot":"","sources":["../../src/service/HtmlRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC;mEAC+D;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD;;;+DAG2D;IAC3D,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;qDACqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAepE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;mCACmC;AACnC,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAgBlE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAalE;AAYD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGlF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGjF"}
@@ -28,6 +28,7 @@ export function renderListHtml(args) {
28
28
  return null;
29
29
  return injectTrackingTags((args.doctype ?? DEFAULT_DOCTYPE) +
30
30
  tpl({
31
+ nextPageUrl: args.nextPageUrl,
31
32
  collection: args.collection,
32
33
  locale: args.locale,
33
34
  entries: args.entries,
@@ -1 +1 @@
1
- {"version":3,"file":"HtmlRenderer.js","sourceRoot":"","sources":["../../src/service/HtmlRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HtmlRenderer.js","sourceRoot":"","sources":["../../src/service/HtmlRenderer.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,8 @@ export interface PublicPathResolverConfig {
35
35
  readonly collectionRoutes: Readonly<Record<string, CollectionRoute>>;
36
36
  }
37
37
  export interface PublicPathResolver {
38
+ /** Entry data needed for path resolution; omitted custom resolvers receive full data. */
39
+ readonly dataFields?: readonly string[];
38
40
  /** Returns `/{locale}/{segment}/{slug}` style path, or `null` if the
39
41
  * entry has no public URL under this configuration. */
40
42
  forEntry(entry: Entry): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"PublicPathResolver.d.ts","sourceRoot":"","sources":["../../src/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE9D,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,CAMtF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIpD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;kDAE8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,kBAAkB;IACjC;4DACwD;IACxD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC;uCACmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;CAC3D;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,kBAAkB,CAmBpB"}
1
+ {"version":3,"file":"PublicPathResolver.d.ts","sourceRoot":"","sources":["../../src/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE9D,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,MAAM,CAMtF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAIpD;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;kDAE8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,kBAAkB;IACjC,yFAAyF;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC;4DACwD;IACxD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACtC;uCACmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;CAC3D;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,GAC/B,kBAAkB,CAoBpB"}
@@ -15,6 +15,7 @@ export function entryPublicPath(entry) {
15
15
  export function createPublicPathResolver(config) {
16
16
  const routes = config.collectionRoutes;
17
17
  return {
18
+ dataFields: ["slug"],
18
19
  forEntry(entry) {
19
20
  const route = routes[entry.collection];
20
21
  if (!route || route.segment === null)
@@ -1 +1 @@
1
- {"version":3,"file":"PublicPathResolver.js","sourceRoot":"","sources":["../../src/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,KAAoD;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;IACrF,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AA2CD,MAAM,UAAU,wBAAwB,CACtC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACvC,OAAO;QACL,QAAQ,CAAC,KAAY;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9C,OAAO,YAAY,IAAI,GAAG,CAAC;YAC7B,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC;QACpF,CAAC;QACD,QAAQ,CAAC,UAAkB;YACzB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"PublicPathResolver.js","sourceRoot":"","sources":["../../src/service/PublicPathResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,qBAAqB,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,KAAoD;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;IACrF,OAAO,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;AACxC,CAAC;AA6CD,MAAM,UAAU,wBAAwB,CACtC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACvC,OAAO;QACL,UAAU,EAAE,CAAC,MAAM,CAAC;QACpB,QAAQ,CAAC,KAAY;YACnB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC9C,OAAO,YAAY,IAAI,GAAG,CAAC;YAC7B,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,IAAI,EAAE,CAAC;QACpF,CAAC;QACD,QAAQ,CAAC,UAAkB;YACzB,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { EntryReader, PublishedEntryPage, ReadPublishedPageArgs } from "@aotter/mantle-runtime";
2
+ export declare function readPublishedAcrossCollections(reader: EntryReader, collections: readonly string[], args: Omit<ReadPublishedPageArgs, "collection" | "cursor"> & {
3
+ readonly cursor?: string;
4
+ }): Promise<PublishedEntryPage>;
5
+ //# sourceMappingURL=PublishedCollectionPager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishedCollectionPager.d.ts","sourceRoot":"","sources":["../../src/service/PublishedCollectionPager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAQrG,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,SAAS,MAAM,EAAE,EAC9B,IAAI,EAAE,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,QAAQ,CAAC,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF,OAAO,CAAC,kBAAkB,CAAC,CAoB7B"}
@@ -0,0 +1,37 @@
1
+ export async function readPublishedAcrossCollections(reader, collections, args) {
2
+ const decoded = decode(args.cursor);
3
+ const rows = [];
4
+ let index = decoded.collection;
5
+ let cursor = decoded.cursor;
6
+ while (index < collections.length && rows.length < (args.limit ?? 50)) {
7
+ const page = await reader.readPublishedPage({
8
+ ...args,
9
+ collection: collections[index],
10
+ cursor,
11
+ limit: (args.limit ?? 50) - rows.length,
12
+ });
13
+ rows.push(...page.rows);
14
+ if (page.nextCursor) {
15
+ return { rows, nextCursor: encode({ version: 1, collection: index, cursor: page.nextCursor }) };
16
+ }
17
+ index += 1;
18
+ cursor = undefined;
19
+ }
20
+ return { rows, nextCursor: index < collections.length ? encode({ version: 1, collection: index }) : undefined };
21
+ }
22
+ function encode(cursor) {
23
+ return encodeURIComponent(JSON.stringify(cursor));
24
+ }
25
+ function decode(value) {
26
+ if (!value)
27
+ return { version: 1, collection: 0 };
28
+ try {
29
+ const parsed = JSON.parse(decodeURIComponent(value));
30
+ if (parsed.version === 1 && Number.isSafeInteger(parsed.collection) && parsed.collection >= 0 &&
31
+ (parsed.cursor === undefined || typeof parsed.cursor === "string"))
32
+ return parsed;
33
+ }
34
+ catch { }
35
+ throw new RangeError("invalid published collection cursor");
36
+ }
37
+ //# sourceMappingURL=PublishedCollectionPager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublishedCollectionPager.js","sourceRoot":"","sources":["../../src/service/PublishedCollectionPager.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,MAAmB,EACnB,WAA8B,EAC9B,IAAyF;IAEzF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/B,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC5B,OAAO,KAAK,GAAG,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACtE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC;YAC1C,GAAG,IAAI;YACP,UAAU,EAAE,WAAW,CAAC,KAAK,CAAE;YAC/B,MAAM;YACN,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAClG,CAAC;QACD,KAAK,IAAI,CAAC,CAAC;QACX,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,MAAM,CAAC,MAAc;IAC5B,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAoB,CAAC;QACxE,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAW,IAAI,CAAC;YAC1F,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;YAAE,OAAO,MAAgB,CAAC;IAClG,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,IAAI,UAAU,CAAC,qCAAqC,CAAC,CAAC;AAC9D,CAAC"}
@@ -17,4 +17,5 @@ export interface SitemapInput {
17
17
  readonly entries: readonly SitemapEntry[];
18
18
  }
19
19
  export declare function serializeSitemap(input: SitemapInput): string;
20
+ export declare function serializeSitemapIndex(site: WebSiteConfig, paths: readonly string[]): string;
20
21
  //# sourceMappingURL=SitemapSerializer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SitemapSerializer.d.ts","sourceRoot":"","sources":["../../src/service/SitemapSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;;;;;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,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAgB5D"}
1
+ {"version":3,"file":"SitemapSerializer.d.ts","sourceRoot":"","sources":["../../src/service/SitemapSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;;;;;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,aAAa,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;CAC3C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAgB5D;AAWD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAI3F"}
@@ -24,4 +24,9 @@ function escapeXml(s) {
24
24
  .replace(/"/g, "&quot;")
25
25
  .replace(/'/g, "&apos;");
26
26
  }
27
+ export function serializeSitemapIndex(site, paths) {
28
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n`
29
+ + paths.map((path) => ` <sitemap><loc>${escapeXml(absoluteUrl(site.origin ?? "", path))}</loc></sitemap>\n`).join("")
30
+ + "</sitemapindex>\n";
31
+ }
27
32
  //# sourceMappingURL=SitemapSerializer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SitemapSerializer.js","sourceRoot":"","sources":["../../src/service/SitemapSerializer.ts"],"names":[],"mappings":"AAEA,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"}
1
+ {"version":3,"file":"SitemapSerializer.js","sourceRoot":"","sources":["../../src/service/SitemapSerializer.ts"],"names":[],"mappings":"AAEA,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;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAmB,EAAE,KAAwB;IACjF,OAAO,8GAA8G;UACjH,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;UACpH,mBAAmB,CAAC;AAC1B,CAAC"}
@@ -1,18 +1,14 @@
1
1
  import type { EntryReader } from "@aotter/mantle-runtime";
2
2
  import type { PublicPathResolver } from "../service/PublicPathResolver.js";
3
3
  import type { ComposeLlmsTxtRequest } from "../dto/ComposeLlmsTxtRequest.js";
4
- /**
5
- * Compose a `/llms.txt` body from currently-published entries.
6
- *
7
- * - locale: string → entries with `data.locale === locale`
8
- * - locale: null → non-localized entries only. Consumers that want
9
- * a cross-locale aggregate at the root URL should
10
- * iterate site.locales themselves and concat.
11
- */
4
+ /** Compose one bounded discovery page; callers must expose nextCursor. */
12
5
  export declare class ComposeLlmsTxtUseCase {
13
6
  private readonly reader;
14
7
  private readonly paths;
15
8
  constructor(reader: EntryReader, paths: PublicPathResolver | null);
16
- execute(request: ComposeLlmsTxtRequest): Promise<string | null>;
9
+ execute(request: ComposeLlmsTxtRequest): Promise<{
10
+ body: string | null;
11
+ nextCursor?: string;
12
+ } | null>;
17
13
  }
18
14
  //# sourceMappingURL=ComposeLlmsTxtUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeLlmsTxtUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAG7C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAiBtE"}
1
+ {"version":3,"file":"ComposeLlmsTxtUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAE3E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAG7E,0EAA0E;AAC1E,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAG7C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAkB5G"}
@@ -1,12 +1,6 @@
1
1
  import { serializeLlmsTxt } from "../service/MarkdownSerializer.js";
2
- /**
3
- * Compose a `/llms.txt` body from currently-published entries.
4
- *
5
- * - locale: string → entries with `data.locale === locale`
6
- * - locale: null → non-localized entries only. Consumers that want
7
- * a cross-locale aggregate at the root URL should
8
- * iterate site.locales themselves and concat.
9
- */
2
+ import { readPublishedAcrossCollections } from "../service/PublishedCollectionPager.js";
3
+ /** Compose one bounded discovery page; callers must expose nextCursor. */
10
4
  export class ComposeLlmsTxtUseCase {
11
5
  reader;
12
6
  paths;
@@ -17,20 +11,21 @@ export class ComposeLlmsTxtUseCase {
17
11
  async execute(request) {
18
12
  if (!this.paths)
19
13
  return null;
20
- const query = (locale) => this.reader.readPublished({
21
- locale,
22
- collection: request.collection,
14
+ const page = await readPublishedAcrossCollections(this.reader, request.collections, {
15
+ locale: request.locale,
16
+ includeUnlocalized: request.includeUnlocalized,
17
+ cursor: request.cursor,
18
+ limit: request.limit,
23
19
  });
24
- const entries = request.locale !== null && request.includeUnlocalized
25
- ? (await Promise.all([query(request.locale), query(null)])).flat()
26
- : await query(request.locale);
27
- const grouped = groupByCollection(entries);
28
- return serializeLlmsTxt({
20
+ const bodies = (request.locales ?? [request.locale ?? ""]).map((locale) => serializeLlmsTxt({
29
21
  site: request.site,
30
- locale: request.locale ?? "",
31
- entriesByCollection: grouped,
32
- pathFor: request.pathFor ?? ((entry) => this.paths.forEntry(entry)),
33
- });
22
+ locale,
23
+ entriesByCollection: groupByCollection(request.locales
24
+ ? page.rows.filter((entry) => !entry.locale || entry.locale === locale)
25
+ : page.rows),
26
+ pathFor: (entry) => request.pathFor ? request.pathFor(entry, locale) : this.paths.forEntry(entry),
27
+ })).filter((body) => body !== null);
28
+ return { body: bodies.length ? bodies.join("\n---\n\n") : null, nextCursor: page.nextCursor };
34
29
  }
35
30
  }
36
31
  function groupByCollection(entries) {
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeLlmsTxtUseCase.js","sourceRoot":"","sources":["../../src/usecase/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAGpE;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IAFnB,YACmB,MAAmB,EACnB,KAAgC;QADhC,WAAM,GAAN,MAAM,CAAa;QACnB,UAAK,GAAL,KAAK,CAA2B;IAChD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7B,MAAM,KAAK,GAAG,CAAC,MAAqB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YACjE,MAAM;YACN,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,kBAAkB;YACnE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAClE,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,gBAAgB,CAAC;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,mBAAmB,EAAE,OAAO;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SACrE,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,OAAyB;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"ComposeLlmsTxtUseCase.js","sourceRoot":"","sources":["../../src/usecase/ComposeLlmsTxtUseCase.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,0EAA0E;AAC1E,MAAM,OAAO,qBAAqB;IAEb;IACA;IAFnB,YACmB,MAAmB,EACnB,KAAgC;QADhC,WAAM,GAAN,MAAM,CAAa;QACnB,UAAK,GAAL,KAAK,CAA2B;IAChD,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;YAClF,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC;YAC1F,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,MAAM;YACN,mBAAmB,EAAE,iBAAiB,CAAC,OAAO,CAAC,OAAO;gBACpD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;gBACvE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;SACnG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAChG,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,OAAyB;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,GAAG;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAChB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,15 +1,16 @@
1
1
  import type { EntryReader } from "@aotter/mantle-runtime";
2
2
  import type { ComposeSitemapRequest } from "../dto/ComposeSitemapRequest.js";
3
- /**
4
- * Compose `sitemap.xml` from every published entry across all
5
- * collections + locales. Result is XML text; consumer routes it as
6
- * `application/xml`. See ComposeSitemapRequest for the pathFor +
7
- * maxUrls knobs.
8
- */
9
- export declare const SITEMAP_MAX_URLS_DEFAULT = 50000;
3
+ /** Entries per sitemap part; the protocol ceiling remains 50,000 URLs. */
4
+ export declare const SITEMAP_MAX_URLS_DEFAULT = 2000;
10
5
  export declare class ComposeSitemapUseCase {
11
6
  private readonly reader;
12
7
  constructor(reader: EntryReader);
13
- execute(request: ComposeSitemapRequest): Promise<string>;
8
+ execute(request: ComposeSitemapRequest): Promise<{
9
+ body: string;
10
+ nextCursor?: string;
11
+ }>;
12
+ /** Walk bounded metadata pages to derive the exact part boundaries. No entry cache.
13
+ * ponytail: O(N) metadata reads per index MISS; persist part boundaries only if this dominates. */
14
+ index(request: ComposeSitemapRequest, partPath: (cursor?: string) => string): Promise<string>;
14
15
  }
15
16
  //# sourceMappingURL=ComposeSitemapUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeSitemapUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;CAoB/D"}
1
+ {"version":3,"file":"ComposeSitemapUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAG7E,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAE1C,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA6B7F;uGACmG;IAC7F,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAiBpG"}
@@ -1,12 +1,8 @@
1
1
  import { entryPublicPath } from "../service/PublicPathResolver.js";
2
- import { serializeSitemap } from "../service/SitemapSerializer.js";
3
- /**
4
- * Compose `sitemap.xml` from every published entry across all
5
- * collections + locales. Result is XML text; consumer routes it as
6
- * `application/xml`. See ComposeSitemapRequest for the pathFor +
7
- * maxUrls knobs.
8
- */
9
- export const SITEMAP_MAX_URLS_DEFAULT = 50000;
2
+ import { serializeSitemap, serializeSitemapIndex } from "../service/SitemapSerializer.js";
3
+ import { readPublishedAcrossCollections } from "../service/PublishedCollectionPager.js";
4
+ /** Entries per sitemap part; the protocol ceiling remains 50,000 URLs. */
5
+ export const SITEMAP_MAX_URLS_DEFAULT = 2000;
10
6
  export class ComposeSitemapUseCase {
11
7
  reader;
12
8
  constructor(reader) {
@@ -14,7 +10,10 @@ export class ComposeSitemapUseCase {
14
10
  }
15
11
  async execute(request) {
16
12
  const cap = request.maxUrls ?? SITEMAP_MAX_URLS_DEFAULT;
17
- const all = await this.reader.readPublished({ limit: cap });
13
+ const page = await readPublishedAcrossCollections(this.reader, request.collections, {
14
+ limit: cap, cursor: request.cursor,
15
+ dataFields: request.dataFields ?? (request.pathFor ? undefined : ["slug"]),
16
+ });
18
17
  const mapper = request.pathFor ?? entryPublicPath;
19
18
  const entries = [];
20
19
  const seen = new Set();
@@ -24,15 +23,44 @@ export class ComposeSitemapUseCase {
24
23
  seen.add(path);
25
24
  entries.push(entry ? { entry, path } : { path });
26
25
  };
27
- for (const path of request.additionalPaths ?? [])
28
- push(path);
29
- for (const e of all) {
26
+ if (!request.cursor)
27
+ for (const path of request.additionalPaths ?? [])
28
+ push(path);
29
+ for (const e of page.rows) {
30
30
  const mapped = mapper(e);
31
31
  for (const path of mapped === null ? [] : typeof mapped === "string" ? [mapped] : mapped) {
32
32
  push(path, e);
33
33
  }
34
34
  }
35
- return serializeSitemap({ site: request.site, entries });
35
+ if (entries.length > 50_000)
36
+ throw new Error("sitemap part exceeds 50,000 URLs; reduce maxUrls");
37
+ const body = serializeSitemap({ site: request.site, entries });
38
+ if (new TextEncoder().encode(body).byteLength > 50 * 1024 * 1024) {
39
+ throw new Error("sitemap part exceeds 50 MiB; reduce maxUrls");
40
+ }
41
+ return { body, nextCursor: page.nextCursor };
42
+ }
43
+ /** Walk bounded metadata pages to derive the exact part boundaries. No entry cache.
44
+ * ponytail: O(N) metadata reads per index MISS; persist part boundaries only if this dominates. */
45
+ async index(request, partPath) {
46
+ const paths = [partPath()];
47
+ let cursor;
48
+ do {
49
+ const page = await readPublishedAcrossCollections(this.reader, request.collections, {
50
+ limit: request.maxUrls ?? SITEMAP_MAX_URLS_DEFAULT,
51
+ dataFields: request.dataFields ?? (request.pathFor ? undefined : ["slug"]),
52
+ cursor,
53
+ });
54
+ cursor = page.nextCursor;
55
+ if (cursor)
56
+ paths.push(partPath(cursor));
57
+ if (paths.length > 50_000)
58
+ throw new Error("sitemap index exceeds 50,000 parts");
59
+ } while (cursor);
60
+ const body = serializeSitemapIndex(request.site, paths);
61
+ if (new TextEncoder().encode(body).byteLength > 50 * 1024 * 1024)
62
+ throw new Error("sitemap index exceeds 50 MiB");
63
+ return body;
36
64
  }
37
65
  }
38
66
  //# sourceMappingURL=ComposeSitemapUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeSitemapUseCase.js","sourceRoot":"","sources":["../../src/usecase/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAE9C,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,wBAAwB,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;QAClD,MAAM,OAAO,GAAsC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAa,EAAQ,EAAE;YACjD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,eAAe,IAAI,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzF,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,OAAO,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF"}
1
+ {"version":3,"file":"ComposeSitemapUseCase.js","sourceRoot":"","sources":["../../src/usecase/ComposeSitemapUseCase.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE1F,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AAExF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAEpD,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,wBAAwB,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;YAClF,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM;YAClC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SAC3E,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC;QAClD,MAAM,OAAO,GAAsC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,KAAa,EAAQ,EAAE;YACjD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,eAAe,IAAI,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACzF,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjG,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAC/C,CAAC;IAED;uGACmG;IACnG,KAAK,CAAC,KAAK,CAAC,OAA8B,EAAE,QAAqC;QAC/E,MAAM,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3B,IAAI,MAA0B,CAAC;QAC/B,GAAG,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,8BAA8B,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,EAAE;gBAClF,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,wBAAwB;gBAClD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC1E,MAAM;aACP,CAAC,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YACzB,IAAI,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACnF,CAAC,QAAQ,MAAM,EAAE;QACjB,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClH,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -20,6 +20,9 @@ export declare class RenderListLiveUseCase {
20
20
  private readonly schemas;
21
21
  private readonly mediaAssets;
22
22
  constructor(reader: EntryReader, templates: TemplateRegistry, schemas: ReadonlyMap<string, SchemaManifest>, mediaAssets?: MediaAssetResolver | null);
23
- execute(request: RenderListLiveRequest): Promise<string | null>;
23
+ execute(request: RenderListLiveRequest): Promise<{
24
+ html: string;
25
+ nextCursor?: string;
26
+ } | null>;
24
27
  }
25
28
  //# sourceMappingURL=RenderListLiveUseCase.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,kBAAkB,GAAG,IAAW;IAG1D,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAmBtE"}
1
+ {"version":3,"file":"RenderListLiveUseCase.d.ts","sourceRoot":"","sources":["../../src/usecase/RenderListLiveUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,WAAW,GAAE,kBAAkB,GAAG,IAAW;IAG1D,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAuBrG"}
@@ -24,15 +24,18 @@ export class RenderListLiveUseCase {
24
24
  this.mediaAssets = mediaAssets;
25
25
  }
26
26
  async execute(request) {
27
- const raw = await this.reader.readPublished({
27
+ const page = await this.reader.readPublishedPage({
28
+ cursor: request.cursor,
29
+ limit: request.limit,
28
30
  collection: request.collection,
29
31
  locale: request.contentLocale === undefined ? request.locale : request.contentLocale,
30
32
  });
31
- const entries = await joinParentForList(this.reader, this.schemas, raw, {
33
+ const entries = await joinParentForList(this.reader, this.schemas, page.rows, {
32
34
  parentStatus: "published",
33
35
  });
34
36
  const mediaAssets = await resolveMediaAssetsForEntries(this.mediaAssets, entries);
35
- return renderListHtml({
37
+ const html = renderListHtml({
38
+ nextPageUrl: page.nextCursor ? request.pathForPage?.(page.nextCursor) : undefined,
36
39
  collection: request.collection,
37
40
  locale: request.locale,
38
41
  entries,
@@ -41,6 +44,7 @@ export class RenderListLiveUseCase {
41
44
  mediaAssets,
42
45
  seo: request.seo,
43
46
  });
47
+ return html === null ? null : { html, nextCursor: page.nextCursor };
44
48
  }
45
49
  }
46
50
  //# sourceMappingURL=RenderListLiveUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../src/usecase/RenderListLiveUseCase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACL,4BAA4B,GAE7B,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IACA;IAJnB,YACmB,MAAmB,EACnB,SAA2B,EAC3B,OAA4C,EAC5C,cAAyC,IAAI;QAH7C,WAAM,GAAN,MAAM,CAAa;QACnB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAkC;IAC7D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAC1C,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;SACrF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACtE,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;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"RenderListLiveUseCase.js","sourceRoot":"","sources":["../../src/usecase/RenderListLiveUseCase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACL,4BAA4B,GAE7B,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAEb;IACA;IACA;IACA;IAJnB,YACmB,MAAmB,EACnB,SAA2B,EAC3B,OAA4C,EAC5C,cAAyC,IAAI;QAH7C,WAAM,GAAN,MAAM,CAAa;QACnB,cAAS,GAAT,SAAS,CAAkB;QAC3B,YAAO,GAAP,OAAO,CAAqC;QAC5C,gBAAW,GAAX,WAAW,CAAkC;IAC7D,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,OAA8B;QAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,MAAM,EAAE,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa;SACrF,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;YAC5E,YAAY,EAAE,WAAW;SAC1B,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,4BAA4B,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,cAAc,CAAC;YAC1B,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;YACjF,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;YACX,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ import type { RuntimeCallableCapability } from "@aotter/mantle-runtime";
2
+ export type WebMcpTarget = Readonly<{
3
+ readonly kind: "view";
4
+ readonly name: string;
5
+ }> | Readonly<{
6
+ readonly kind: "procedure";
7
+ readonly name: string;
8
+ }>;
9
+ export interface WebMcpCall {
10
+ readonly name: string;
11
+ readonly target: WebMcpTarget;
12
+ readonly input: Readonly<Record<string, unknown>>;
13
+ readonly signal: AbortSignal;
14
+ }
15
+ export interface WebMcpTool {
16
+ readonly name: string;
17
+ readonly title?: string;
18
+ readonly description: string;
19
+ readonly inputSchema: Record<string, unknown>;
20
+ readonly annotations: {
21
+ readonly readOnlyHint: boolean;
22
+ readonly untrustedContentHint?: boolean;
23
+ };
24
+ execute(input: Record<string, unknown>, context: {
25
+ readonly signal?: AbortSignal;
26
+ }): Promise<unknown>;
27
+ }
28
+ export interface WebMcpModelContext {
29
+ registerTool(tool: WebMcpTool, options: {
30
+ readonly signal: AbortSignal;
31
+ }): void | Promise<void>;
32
+ getTools?(): readonly {
33
+ readonly name: string;
34
+ }[] | Promise<readonly {
35
+ readonly name: string;
36
+ }[]>;
37
+ }
38
+ export interface WebMcpBinding {
39
+ readonly supported: boolean;
40
+ readonly registered: readonly string[];
41
+ readonly skipped: readonly string[];
42
+ dispose(): void;
43
+ }
44
+ export interface PublicWebMcpView {
45
+ readonly name: string;
46
+ readonly target: Readonly<{
47
+ readonly kind: "view";
48
+ readonly name: string;
49
+ }>;
50
+ readonly title?: string;
51
+ readonly description: string;
52
+ readonly inputSchema: Record<string, unknown>;
53
+ }
54
+ export type WebMcpInvoker = (capability: RuntimeCallableCapability, input: Readonly<Record<string, unknown>>, signal: AbortSignal) => Promise<unknown>;
55
+ interface CommonBindWebMcpOptions {
56
+ readonly modelContext?: WebMcpModelContext;
57
+ readonly before?: (call: WebMcpCall) => void | Promise<void>;
58
+ readonly after?: (call: WebMcpCall, result: PromiseSettledResult<unknown>) => void | Promise<void>;
59
+ }
60
+ export type BindWebMcpOptions = (CommonBindWebMcpOptions & {
61
+ readonly capabilities: readonly RuntimeCallableCapability[];
62
+ readonly invoke: WebMcpInvoker;
63
+ readonly fetch?: never;
64
+ readonly endpointPrefix?: never;
65
+ }) | (CommonBindWebMcpOptions & {
66
+ readonly capabilities?: never;
67
+ readonly invoke?: never;
68
+ readonly fetch?: typeof fetch;
69
+ readonly endpointPrefix?: string;
70
+ });
71
+ /** Opt-in browser binding over public callable capabilities. */
72
+ export declare function bindWebMcp(options?: BindWebMcpOptions): Promise<WebMcpBinding>;
73
+ export {};
74
+ //# sourceMappingURL=webmcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webmcp.d.ts","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
package/dist/webmcp.js ADDED
@@ -0,0 +1,197 @@
1
+ /** Opt-in browser binding over public callable capabilities. */
2
+ export async function bindWebMcp(options = {}) {
3
+ const modelContext = options.modelContext ?? browserModelContext();
4
+ if (!modelContext)
5
+ return unsupportedBinding();
6
+ const controller = new AbortController();
7
+ try {
8
+ const capabilities = await resolveCapabilities(options, controller.signal);
9
+ assertUniqueNames(capabilities);
10
+ const existing = modelContext.getTools
11
+ ? new Set((await modelContext.getTools()).map((tool) => tool.name))
12
+ : new Set();
13
+ const skipped = capabilities
14
+ .filter((capability) => existing.has(capability.name))
15
+ .map((capability) => capability.name);
16
+ const pending = capabilities.filter((capability) => !existing.has(capability.name));
17
+ await Promise.all(pending.map((capability) => modelContext.registerTool(toWebMcpTool(capability, options), { signal: controller.signal })));
18
+ return binding(pending.map((capability) => capability.name), skipped, controller);
19
+ }
20
+ catch (error) {
21
+ controller.abort();
22
+ throw error;
23
+ }
24
+ }
25
+ function resolveCapabilities(options, signal) {
26
+ const capabilities = options.capabilities;
27
+ const invoke = options.invoke;
28
+ if (capabilities === undefined && invoke === undefined) {
29
+ return serverCapabilities(options, signal);
30
+ }
31
+ if (!Array.isArray(capabilities) || typeof invoke !== "function") {
32
+ throw new TypeError("WebMCP capabilities and invoke must be provided together.");
33
+ }
34
+ return localCapabilities(capabilities, invoke);
35
+ }
36
+ function localCapabilities(capabilities, invoke) {
37
+ return capabilities
38
+ .filter((capability) => capability.surface === "public")
39
+ .map((capability) => ({
40
+ name: capability.name,
41
+ ...(capability.title ? { title: capability.title } : {}),
42
+ description: capability.description,
43
+ inputSchema: capability.inputSchema,
44
+ annotations: {
45
+ readOnlyHint: capability.kind === "view" || capability.inputSchema.readOnly === true,
46
+ ...(capability.kind === "view" ? { untrustedContentHint: true } : {}),
47
+ },
48
+ target: Object.freeze({ kind: capability.kind, name: capability.ownerName }),
49
+ invoke: (input, signal) => invoke(capability, input, signal),
50
+ }));
51
+ }
52
+ async function serverCapabilities(options, signal) {
53
+ const prefix = endpointPrefix(options.endpointPrefix);
54
+ const fetcher = options.fetch ?? fetch;
55
+ const response = await fetcher(prefix, {
56
+ method: "GET",
57
+ credentials: "same-origin",
58
+ headers: { accept: "application/json" },
59
+ signal,
60
+ });
61
+ if (!response.ok)
62
+ throw new Error(`Mantle WebMCP catalog failed (${response.status}).`);
63
+ return readCatalog(await response.json()).map((view) => ({
64
+ ...view,
65
+ annotations: { readOnlyHint: true, untrustedContentHint: true },
66
+ invoke: (input, invocationSignal) => queryView(view, input, invocationSignal, prefix, fetcher),
67
+ }));
68
+ }
69
+ function toWebMcpTool(capability, options) {
70
+ return {
71
+ name: capability.name,
72
+ ...(capability.title ? { title: capability.title } : {}),
73
+ description: capability.description,
74
+ inputSchema: capability.inputSchema,
75
+ annotations: capability.annotations,
76
+ execute: async (input, context) => {
77
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
78
+ throw new TypeError("WebMCP tool input must be an object.");
79
+ }
80
+ const signal = context.signal ?? new AbortController().signal;
81
+ const call = Object.freeze({
82
+ name: capability.name,
83
+ target: capability.target,
84
+ input,
85
+ signal,
86
+ });
87
+ let result;
88
+ try {
89
+ signal.throwIfAborted();
90
+ await options.before?.(call);
91
+ result = {
92
+ status: "fulfilled",
93
+ value: await capability.invoke(input, signal),
94
+ };
95
+ }
96
+ catch (reason) {
97
+ result = { status: "rejected", reason };
98
+ }
99
+ try {
100
+ await options.after?.(call, result);
101
+ }
102
+ catch {
103
+ // Observational hooks never change the domain result.
104
+ }
105
+ if (result.status === "fulfilled")
106
+ return result.value;
107
+ throw result.reason;
108
+ },
109
+ };
110
+ }
111
+ function endpointPrefix(prefix = "/api/views") {
112
+ const normalized = prefix.replace(/\/$/u, "");
113
+ if (!/^\/(?!\/)[^\\?#]*$/u.test(normalized)) {
114
+ throw new TypeError("WebMCP endpointPrefix must be a same-origin absolute path.");
115
+ }
116
+ return normalized;
117
+ }
118
+ async function queryView(view, input, signal, prefix, fetcher) {
119
+ const query = new URLSearchParams();
120
+ for (const [key, value] of Object.entries(input)) {
121
+ if (["string", "number", "boolean"].includes(typeof value)) {
122
+ query.set(key, String(value));
123
+ }
124
+ }
125
+ const search = query.size ? `?${query}` : "";
126
+ const response = await fetcher(`${prefix}/${encodeURIComponent(view.target.name)}${search}`, {
127
+ method: "GET",
128
+ credentials: "same-origin",
129
+ headers: { accept: "application/json" },
130
+ signal,
131
+ });
132
+ if (!response.ok) {
133
+ throw new Error(`Mantle View '${view.target.name}' failed (${response.status}).`);
134
+ }
135
+ const body = await response.json();
136
+ return isRecord(body) && body.ok === true ? body.data : body;
137
+ }
138
+ function readCatalog(body) {
139
+ if (!isRecord(body) || body.ok !== true || !Array.isArray(body.data)) {
140
+ throw new TypeError("Mantle WebMCP catalog response is invalid.");
141
+ }
142
+ return body.data.map((value) => {
143
+ if (!isRecord(value)
144
+ || typeof value.name !== "string"
145
+ || typeof value.description !== "string"
146
+ || !isRecord(value.inputSchema)
147
+ || !isRecord(value.target)
148
+ || value.target.kind !== "view"
149
+ || typeof value.target.name !== "string"
150
+ || (value.title !== undefined && typeof value.title !== "string")) {
151
+ throw new TypeError("Mantle WebMCP catalog contains an invalid View.");
152
+ }
153
+ return Object.freeze({
154
+ name: value.name,
155
+ target: Object.freeze({ kind: "view", name: value.target.name }),
156
+ ...(value.title ? { title: value.title } : {}),
157
+ description: value.description,
158
+ inputSchema: value.inputSchema,
159
+ });
160
+ });
161
+ }
162
+ function isRecord(value) {
163
+ return !!value && typeof value === "object" && !Array.isArray(value);
164
+ }
165
+ function assertUniqueNames(capabilities) {
166
+ const names = new Set();
167
+ for (const capability of capabilities) {
168
+ if (names.has(capability.name)) {
169
+ throw new TypeError(`Duplicate WebMCP capability name '${capability.name}'.`);
170
+ }
171
+ names.add(capability.name);
172
+ }
173
+ }
174
+ function browserModelContext() {
175
+ const modelContext = globalThis
176
+ .document?.modelContext;
177
+ return modelContext && typeof modelContext.registerTool === "function"
178
+ ? modelContext
179
+ : undefined;
180
+ }
181
+ function binding(registered, skipped, controller) {
182
+ return Object.freeze({
183
+ supported: true,
184
+ registered: Object.freeze(registered),
185
+ skipped: Object.freeze(skipped),
186
+ dispose: () => controller.abort(),
187
+ });
188
+ }
189
+ function unsupportedBinding() {
190
+ return Object.freeze({
191
+ supported: false,
192
+ registered: Object.freeze([]),
193
+ skipped: Object.freeze([]),
194
+ dispose: () => { },
195
+ });
196
+ }
197
+ //# sourceMappingURL=webmcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webmcp.js","sourceRoot":"","sources":["../src/webmcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aotter/mantle-web",
3
- "version": "0.1.0-alpha.9",
3
+ "version": "0.1.2-alpha.2",
4
4
  "description": "Optional public document composition for Mantle: HTML, Markdown, llms.txt, sitemap, SEO, and preview.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://mantle.tools/",
@@ -22,6 +22,10 @@
22
22
  ".": {
23
23
  "types": "./dist/index.d.ts",
24
24
  "import": "./dist/index.js"
25
+ },
26
+ "./webmcp": {
27
+ "types": "./dist/webmcp.d.ts",
28
+ "import": "./dist/webmcp.js"
25
29
  }
26
30
  },
27
31
  "files": [
@@ -29,13 +33,13 @@
29
33
  "README.md"
30
34
  ],
31
35
  "dependencies": {
32
- "@aotter/mantle-spec": "0.1.0-alpha.9",
33
- "@aotter/mantle-runtime": "0.1.0-alpha.9"
36
+ "@aotter/mantle-runtime": "0.1.2-alpha.2",
37
+ "@aotter/mantle-spec": "0.1.2-alpha.2"
34
38
  },
35
39
  "devDependencies": {
36
40
  "@types/node": "^26",
37
41
  "typescript": "^6.0.3",
38
- "vitest": "^4.1.10"
42
+ "vitest": "^4.1.11"
39
43
  },
40
44
  "scripts": {
41
45
  "prebuild": "rm -rf dist .tsbuildinfo",