@aotter/mantle-web 0.1.2-alpha.6 → 0.1.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.
package/README.md CHANGED
@@ -24,7 +24,37 @@ const html = await web.renderEntryLive.execute({
24
24
  Omit this package when an application only needs Mantle parsing, planning, or
25
25
  headless runtime operations.
26
26
 
27
- ## Public content pages
27
+ ## Frontend client
28
+
29
+ `@aotter/mantle-web/client` is browser safe. Pass an origin and the contract
30
+ projected by `projectFrontendContract(plan)` from `@aotter/mantle-web/client-runtime`:
31
+
32
+ ```ts
33
+ import { createMantleClient } from '@aotter/mantle-web/client';
34
+ const client = createMantleClient({ origin, contract, accessToken: () => accessToken });
35
+ const page = await client.view('published-posts', {}, { page: 1, show: 20 });
36
+ await client.call('submit-comment-http', { postId, text });
37
+ ```
38
+
39
+ Calls use HTTP Trigger names, not internal Procedure names. Runtime owns validation,
40
+ authorization and diagnostics. `MantleClientError` preserves status, diagnostic and
41
+ WWW-Authenticate; mutation retries are the caller's explicit decision. DELETE follows
42
+ the existing HTTP dispatcher contract (path parameters only).
43
+
44
+ For same-Worker SSR, `createMantleWorker({ frontend(request, { client, env,
45
+ executionCtx }) { ... } })` supplies a client bound to the current caller. It
46
+ dispatches locally through the same runtime HTTP handlers, without network traffic.
47
+ Native routes win and reserved paths never reach the frontend fallback. Never retain
48
+ this client between SSR requests. Set an explicit public Cache-Control only for public
49
+ pages; the Worker strips public caching from credentialed and private responses.
50
+
51
+ External browsers use OAuth authorization code + PKCE and bearer credentials with
52
+ exact configured `frontendOrigins`. This client does not implement login, persist
53
+ tokens, or grant Cloud members tenant staff access. External SSR supplies its own
54
+ request-local token resolver. Start external page caches with `private, no-store`;
55
+ any separate cache needs an explicit bounded freshness or invalidation contract.
56
+
57
+ ## Public document operations
28
58
 
29
59
  `renderListLive.execute` returns `{ html, nextCursor? } | null`.
30
60
  `composeLlmsTxt.execute` returns `{ body, nextCursor? } | null`, where `body`
@@ -0,0 +1,21 @@
1
+ import { type RuntimePlan, type MantleRuntime, type HandlerContext } from "@aotter/mantle-runtime";
2
+ import { type FrontendContract } from "./client.js";
3
+ /** Expose only declared public Views and HTTP Triggers, never an internal reader. */
4
+ export declare function projectFrontendContract(plan: RuntimePlan): FrontendContract;
5
+ /** One client per SSR request. No network request, SQL access or auth shortcut. */
6
+ export declare function createRuntimeClient(options: {
7
+ origin: string;
8
+ plan: RuntimePlan;
9
+ getRuntime: () => Promise<MantleRuntime>;
10
+ context: HandlerContext;
11
+ }): {
12
+ view<T = unknown>(name: string, params?: Record<string, unknown>, paging?: {
13
+ page?: number;
14
+ show?: number;
15
+ signal?: AbortSignal;
16
+ }): Promise<T>;
17
+ call<T = unknown>(name: string, input: Record<string, unknown>, settings?: {
18
+ signal?: AbortSignal;
19
+ }): Promise<T>;
20
+ };
21
+ //# sourceMappingURL=client-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-runtime.d.ts","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC5J,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExE,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAU3E;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE;;YAQ2xC,CAAC;YAAc,CAAC;cAAgB,CAAC;;;cAAitB,CAAC;;EADlqE"}
@@ -0,0 +1,24 @@
1
+ import { createMantleRequestHandler, projectCallableCapabilities } from "@aotter/mantle-runtime";
2
+ import { createMantleClient } from "./client.js";
3
+ /** Expose only declared public Views and HTTP Triggers, never an internal reader. */
4
+ export function projectFrontendContract(plan) {
5
+ const views = projectCallableCapabilities(plan, { surface: "public" }).filter(item => item.kind === "view");
6
+ return {
7
+ version: 1, fingerprint: plan.semanticFingerprint,
8
+ views: views.map(view => ({ name: view.ownerName, inputSchema: view.inputSchema, outputSchema: { type: "object", required: ["rows", "page", "show", "hasMore"], properties: { rows: { type: "array", items: { type: "object" } }, page: { type: "number" }, show: { type: "number" }, hasMore: { type: "boolean" } } }, requires: plan.views[view.ownerName]?.manifest.spec.requires })),
9
+ calls: plan.httpRoutes.map(route => {
10
+ const procedure = plan.procedures[route.procedure].manifest.spec;
11
+ return { name: route.trigger, procedure: route.procedure, method: route.method, path: route.path, inputSchema: procedure.input, outputSchema: procedure.output, requires: procedure.requires };
12
+ }),
13
+ };
14
+ }
15
+ /** One client per SSR request. No network request, SQL access or auth shortcut. */
16
+ export function createRuntimeClient(options) {
17
+ const handle = createMantleRequestHandler(options);
18
+ return createMantleClient({ origin: options.origin, contract: projectFrontendContract(options.plan), fetch: async (input) => {
19
+ const request = input instanceof Request ? input : new Request(input);
20
+ request.signal.throwIfAborted();
21
+ return await handle(request, options.context) ?? new Response(null, { status: 404 });
22
+ } });
23
+ }
24
+ //# sourceMappingURL=client-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-runtime.js","sourceRoot":"","sources":["../src/client-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,2BAA2B,EAA6D,MAAM,wBAAwB,CAAC;AAC5J,OAAO,EAAE,kBAAkB,EAAyB,MAAM,aAAa,CAAC;AAExE,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,IAAiB;IACvD,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC5G,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,mBAAmB;QACjD,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxX,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACjC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;QACjM,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,OAAiH;IACnJ,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACnD,OAAO,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YACxH,MAAM,OAAO,GAAG,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;YACtE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAChC,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACvF,CAAC,EAAE,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,45 @@
1
+ /** Browser-safe contract. The server projects it from its sealed RuntimePlan. */
2
+ export interface FrontendContract {
3
+ readonly version: 1;
4
+ readonly fingerprint: string;
5
+ readonly views: readonly {
6
+ name: string;
7
+ inputSchema: unknown;
8
+ outputSchema: unknown;
9
+ requires?: unknown;
10
+ }[];
11
+ readonly calls: readonly {
12
+ name: string;
13
+ procedure: string;
14
+ method: string;
15
+ path: string;
16
+ inputSchema: unknown;
17
+ outputSchema: unknown;
18
+ requires?: unknown;
19
+ }[];
20
+ }
21
+ export declare class MantleClientError extends Error {
22
+ readonly status: number;
23
+ readonly diagnostic: unknown;
24
+ readonly challenge: string | null;
25
+ constructor(status: number, diagnostic: unknown, challenge: string | null);
26
+ }
27
+ export interface MantleClientOptions {
28
+ readonly origin: string;
29
+ readonly contract: FrontendContract;
30
+ readonly fetch?: typeof fetch;
31
+ /** Resolve for this request; do not share a user's client across SSR requests. */
32
+ readonly accessToken?: () => string | undefined | Promise<string | undefined>;
33
+ }
34
+ export declare function createMantleClient(options: MantleClientOptions): {
35
+ view<T = unknown>(name: string, params?: Record<string, unknown>, paging?: {
36
+ page?: number;
37
+ show?: number;
38
+ signal?: AbortSignal;
39
+ }): Promise<T>;
40
+ /** Invoke the named HTTP Trigger, retaining its Procedure's authorization. */
41
+ call<T = unknown>(name: string, input: Record<string, unknown>, settings?: {
42
+ signal?: AbortSignal;
43
+ }): Promise<T>;
44
+ };
45
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC7G,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC/J;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAE,QAAQ,CAAC,UAAU,EAAE,OAAO;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;gBAA/E,MAAM,EAAE,MAAM,EAAW,UAAU,EAAE,OAAO,EAAW,SAAS,EAAE,MAAM,GAAG,IAAI;CAIrG;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC/E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;SA4BtD,CAAC,kBAAkB,MAAM,WAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAAe;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAQ,OAAO,CAAC,CAAC,CAAC;IAQtJ,8EAA8E;SACzE,CAAC,kBAAkB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAAY;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,GAAQ,OAAO,CAAC,CAAC,CAAC;EAavH"}
package/dist/client.js ADDED
@@ -0,0 +1,82 @@
1
+ export class MantleClientError extends Error {
2
+ status;
3
+ diagnostic;
4
+ challenge;
5
+ constructor(status, diagnostic, challenge) {
6
+ super(`Mantle request failed (${status})`);
7
+ this.status = status;
8
+ this.diagnostic = diagnostic;
9
+ this.challenge = challenge;
10
+ this.name = "MantleClientError";
11
+ }
12
+ }
13
+ export function createMantleClient(options) {
14
+ const origin = new URL(options.origin);
15
+ if (!/^https?:$/.test(origin.protocol) || origin.username || origin.password || origin.pathname !== "/" || origin.search || origin.hash)
16
+ throw new TypeError("Expected a backend origin");
17
+ if (options.contract.version !== 1)
18
+ throw new TypeError("Unsupported frontend contract");
19
+ const views = new Map(options.contract.views.map(view => [view.name, view]));
20
+ const calls = new Map(options.contract.calls.map(call => [call.name, call]));
21
+ if (views.size !== options.contract.views.length || calls.size !== options.contract.calls.length)
22
+ throw new TypeError("Duplicate frontend capability");
23
+ for (const view of views.values())
24
+ if (!/^[\w-]+$/.test(view.name))
25
+ throw new TypeError("Invalid View name");
26
+ for (const call of calls.values()) {
27
+ if (!["POST", "PUT", "PATCH", "DELETE"].includes(call.method)
28
+ || !call.path.startsWith("/api/") || /[?#\\]/.test(call.path)
29
+ || new URL(call.path, origin).pathname !== call.path.replaceAll("{", "%7B").replaceAll("}", "%7D"))
30
+ throw new TypeError("Invalid HTTP Trigger route");
31
+ }
32
+ const request = async (url, init) => {
33
+ init.signal?.throwIfAborted();
34
+ const token = await options.accessToken?.();
35
+ const headers = new Headers(init.headers);
36
+ if (token)
37
+ headers.set("authorization", `Bearer ${token}`);
38
+ const response = await (options.fetch ?? globalThis.fetch)(new Request(url, { ...init, headers, credentials: token ? "omit" : "same-origin", redirect: "manual" }));
39
+ // Workers supports manual redirects; browsers expose them as opaque redirects.
40
+ if (response.type === "opaqueredirect" || response.status >= 300 && response.status < 400)
41
+ throw new MantleClientError(response.status, { code: "UNEXPECTED_REDIRECT" }, null);
42
+ let body;
43
+ try {
44
+ body = await response.json();
45
+ }
46
+ catch {
47
+ throw new MantleClientError(response.status, null, response.headers.get("www-authenticate"));
48
+ }
49
+ if (!response.ok || body?.ok !== true)
50
+ throw new MantleClientError(response.status, body?.diagnostic ?? null, response.headers.get("www-authenticate"));
51
+ return body.data;
52
+ };
53
+ return {
54
+ view(name, params = {}, paging = {}) {
55
+ if (!views.has(name))
56
+ throw new TypeError("Unknown public View");
57
+ const url = new URL(`/api/views/${name}`, origin);
58
+ for (const [key, value] of Object.entries({ ...params, ...(paging.page === undefined ? {} : { page: paging.page }), ...(paging.show === undefined ? {} : { show: paging.show }) })) {
59
+ if (value !== undefined)
60
+ url.searchParams.set(key, typeof value === "object" ? JSON.stringify(value) : String(value));
61
+ }
62
+ return request(url, { signal: paging.signal });
63
+ },
64
+ /** Invoke the named HTTP Trigger, retaining its Procedure's authorization. */
65
+ call(name, input, settings = {}) {
66
+ const call = calls.get(name);
67
+ if (!call)
68
+ throw new TypeError("Unknown HTTP Trigger");
69
+ const path = call.path.replace(/\{([^}]+)\}/g, (_match, key) => {
70
+ const value = input[key];
71
+ if (typeof value !== "string" && typeof value !== "number")
72
+ throw new TypeError(`Missing route parameter ${key}`);
73
+ const encoded = encodeURIComponent(String(value));
74
+ if (!encoded || encoded === "." || encoded === "..")
75
+ throw new TypeError("Invalid route parameter");
76
+ return encoded;
77
+ });
78
+ return request(new URL(path, origin), { method: call.method, headers: { "content-type": "application/json" }, body: JSON.stringify(input), signal: settings.signal });
79
+ },
80
+ };
81
+ }
82
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { SiteConfig } from "@aotter/mantle-spec";
2
2
  /** Site fields consumed by public document composition. */
3
- export type WebSiteConfig = Pick<SiteConfig, "title" | "description" | "origin" | "locales" | "canonicalLocale" | "brand" | "icons" | "ga4MeasurementId" | "facebookPixelId">;
3
+ export type WebSiteConfig = Pick<SiteConfig, "title" | "description" | "origin" | "locales" | "canonicalLocale" | "brand" | "icons">;
4
4
  //# sourceMappingURL=WebSiteConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebSiteConfig.d.ts","sourceRoot":"","sources":["../../src/model/WebSiteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,UAAU,EACR,OAAO,GACP,aAAa,GACb,QAAQ,GACR,SAAS,GACT,iBAAiB,GACjB,OAAO,GACP,OAAO,GACP,kBAAkB,GAClB,iBAAiB,CACpB,CAAC"}
1
+ {"version":3,"file":"WebSiteConfig.d.ts","sourceRoot":"","sources":["../../src/model/WebSiteConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,2DAA2D;AAC3D,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,UAAU,EACR,OAAO,GACP,aAAa,GACb,QAAQ,GACR,SAAS,GACT,iBAAiB,GACjB,OAAO,GACP,OAAO,CACV,CAAC"}
@@ -34,7 +34,4 @@ export interface RenderListArgs {
34
34
  /** Returns the full HTML doc or `null` if no list template is
35
35
  * registered for `collection`. */
36
36
  export declare function renderListHtml(args: RenderListArgs): string | null;
37
- export declare function renderTrackingTagsHtml(site: WebSiteConfig): string;
38
- export declare function normalizeGa4MeasurementId(value: string | undefined): string | null;
39
- export declare function normalizeFacebookPixelId(value: string | undefined): string | null;
40
37
  //# sourceMappingURL=HtmlRenderer.d.ts.map
@@ -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,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"}
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,CAYpE;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,CAalE"}
@@ -12,13 +12,13 @@ export function renderEntryHtml(args) {
12
12
  const tpl = args.templates.getEntryTemplate(args.entry.collection);
13
13
  if (!tpl)
14
14
  return null;
15
- return injectTrackingTags((args.doctype ?? DEFAULT_DOCTYPE) +
15
+ return (args.doctype ?? DEFAULT_DOCTYPE) +
16
16
  tpl({
17
17
  entry: args.entry,
18
18
  site: args.site,
19
19
  mediaAssets: args.mediaAssets,
20
20
  seo: args.seo,
21
- }), args.site);
21
+ });
22
22
  }
23
23
  /** Returns the full HTML doc or `null` if no list template is
24
24
  * registered for `collection`. */
@@ -26,7 +26,7 @@ export function renderListHtml(args) {
26
26
  const tpl = args.templates.getListTemplate(args.collection);
27
27
  if (!tpl)
28
28
  return null;
29
- return injectTrackingTags((args.doctype ?? DEFAULT_DOCTYPE) +
29
+ return (args.doctype ?? DEFAULT_DOCTYPE) +
30
30
  tpl({
31
31
  nextPageUrl: args.nextPageUrl,
32
32
  collection: args.collection,
@@ -35,40 +35,6 @@ export function renderListHtml(args) {
35
35
  site: args.site,
36
36
  mediaAssets: args.mediaAssets,
37
37
  seo: args.seo,
38
- }), args.site);
39
- }
40
- export function renderTrackingTagsHtml(site) {
41
- const ga4Id = normalizeGa4MeasurementId(site.ga4MeasurementId);
42
- const pixelId = normalizeFacebookPixelId(site.facebookPixelId);
43
- const parts = [];
44
- if (ga4Id) {
45
- parts.push(`<script async src="https://www.googletagmanager.com/gtag/js?id=${ga4Id}"></script>`);
46
- parts.push(`<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}gtag('js',new Date());gtag('config','${ga4Id}');</script>`);
47
- }
48
- if (pixelId) {
49
- parts.push(`<script>!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments);};if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s);}(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');fbq('init','${pixelId}');fbq('track','PageView');</script>`);
50
- parts.push(`<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=${pixelId}&ev=PageView&noscript=1"/></noscript>`);
51
- }
52
- return parts.length > 0 ? `\n${parts.join("\n")}\n` : "";
53
- }
54
- function injectTrackingTags(html, site) {
55
- const tags = renderTrackingTagsHtml(site);
56
- if (!tags)
57
- return html;
58
- const headClose = /<\/head>/i;
59
- if (headClose.test(html))
60
- return html.replace(headClose, `${tags}</head>`);
61
- const bodyOpen = /<body[^>]*>/i;
62
- if (bodyOpen.test(html))
63
- return html.replace(bodyOpen, (match) => `${match}${tags}`);
64
- return `${tags}${html}`;
65
- }
66
- export function normalizeGa4MeasurementId(value) {
67
- const trimmed = value?.trim().toUpperCase() ?? "";
68
- return /^G-[A-Z0-9]{4,32}$/.test(trimmed) ? trimmed : null;
69
- }
70
- export function normalizeFacebookPixelId(value) {
71
- const trimmed = value?.trim() ?? "";
72
- return /^[0-9]{5,32}$/.test(trimmed) ? trimmed : null;
38
+ });
73
39
  }
74
40
  //# sourceMappingURL=HtmlRenderer.js.map
@@ -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":"AAUA;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,iBAAiB,CAAC;AAiB1C;qDACqD;AACrD,MAAM,UAAU,eAAe,CAAC,IAAqB;IACnD,MAAM,GAAG,GAA8B,IAAI,CAAC,SAAS,CAAC,gBAAgB,CACpE,IAAI,CAAC,KAAK,CAAC,UAAU,CACtB,CAAC;IACF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;QACtC,GAAG,CAAC;YACF,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;AACP,CAAC;AAcD;mCACmC;AACnC,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,GAAG,GAA6B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACtF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC;QACtC,GAAG,CAAC;YACF,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAC;AACP,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aotter/mantle-web",
3
- "version": "0.1.2-alpha.6",
3
+ "version": "0.1.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/",
@@ -26,6 +26,14 @@
26
26
  "./webmcp": {
27
27
  "types": "./dist/webmcp.d.ts",
28
28
  "import": "./dist/webmcp.js"
29
+ },
30
+ "./client": {
31
+ "types": "./dist/client.d.ts",
32
+ "import": "./dist/client.js"
33
+ },
34
+ "./client-runtime": {
35
+ "types": "./dist/client-runtime.d.ts",
36
+ "import": "./dist/client-runtime.js"
29
37
  }
30
38
  },
31
39
  "files": [
@@ -33,8 +41,8 @@
33
41
  "README.md"
34
42
  ],
35
43
  "dependencies": {
36
- "@aotter/mantle-runtime": "0.1.2-alpha.6",
37
- "@aotter/mantle-spec": "0.1.2-alpha.6"
44
+ "@aotter/mantle-runtime": "0.1.2",
45
+ "@aotter/mantle-spec": "0.1.2"
38
46
  },
39
47
  "devDependencies": {
40
48
  "@types/node": "^26",