@batterai/host 0.1.0
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/CHANGELOG.md +6 -0
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/dist/cache/dependency-graph.d.ts +18 -0
- package/dist/cache/dependency-graph.d.ts.map +1 -0
- package/dist/cache/dependency-graph.js +30 -0
- package/dist/cache/dependency-graph.js.map +1 -0
- package/dist/cache/render-cache.d.ts +39 -0
- package/dist/cache/render-cache.d.ts.map +1 -0
- package/dist/cache/render-cache.js +60 -0
- package/dist/cache/render-cache.js.map +1 -0
- package/dist/client/mount.d.ts +9 -0
- package/dist/client/mount.d.ts.map +1 -0
- package/dist/client/mount.js +69 -0
- package/dist/client/mount.js.map +1 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -0
- package/dist/collab/in-memory-page-draft-store.d.ts +44 -0
- package/dist/collab/in-memory-page-draft-store.d.ts.map +1 -0
- package/dist/collab/in-memory-page-draft-store.js +217 -0
- package/dist/collab/in-memory-page-draft-store.js.map +1 -0
- package/dist/collab/page-doc-page-draft-store.d.ts +41 -0
- package/dist/collab/page-doc-page-draft-store.d.ts.map +1 -0
- package/dist/collab/page-doc-page-draft-store.js +328 -0
- package/dist/collab/page-doc-page-draft-store.js.map +1 -0
- package/dist/collab/page-draft-store.d.ts +152 -0
- package/dist/collab/page-draft-store.d.ts.map +1 -0
- package/dist/collab/page-draft-store.js +61 -0
- package/dist/collab/page-draft-store.js.map +1 -0
- package/dist/content-source/conformance/cases-delegation.d.ts +3 -0
- package/dist/content-source/conformance/cases-delegation.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-delegation.js +55 -0
- package/dist/content-source/conformance/cases-delegation.js.map +1 -0
- package/dist/content-source/conformance/cases-fidelity.d.ts +3 -0
- package/dist/content-source/conformance/cases-fidelity.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-fidelity.js +67 -0
- package/dist/content-source/conformance/cases-fidelity.js.map +1 -0
- package/dist/content-source/conformance/cases-isolation.d.ts +3 -0
- package/dist/content-source/conformance/cases-isolation.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-isolation.js +57 -0
- package/dist/content-source/conformance/cases-isolation.js.map +1 -0
- package/dist/content-source/conformance/cases-permissions.d.ts +3 -0
- package/dist/content-source/conformance/cases-permissions.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-permissions.js +50 -0
- package/dist/content-source/conformance/cases-permissions.js.map +1 -0
- package/dist/content-source/conformance/cases-reads.d.ts +3 -0
- package/dist/content-source/conformance/cases-reads.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-reads.js +216 -0
- package/dist/content-source/conformance/cases-reads.js.map +1 -0
- package/dist/content-source/conformance/cases-writes.d.ts +11 -0
- package/dist/content-source/conformance/cases-writes.d.ts.map +1 -0
- package/dist/content-source/conformance/cases-writes.js +73 -0
- package/dist/content-source/conformance/cases-writes.js.map +1 -0
- package/dist/content-source/conformance/session-required.d.ts +10 -0
- package/dist/content-source/conformance/session-required.d.ts.map +1 -0
- package/dist/content-source/conformance/session-required.js +11 -0
- package/dist/content-source/conformance/session-required.js.map +1 -0
- package/dist/content-source/conformance/sessionless-viewer.d.ts +12 -0
- package/dist/content-source/conformance/sessionless-viewer.d.ts.map +1 -0
- package/dist/content-source/conformance/sessionless-viewer.js +5 -0
- package/dist/content-source/conformance/sessionless-viewer.js.map +1 -0
- package/dist/content-source/conformance/target.d.ts +111 -0
- package/dist/content-source/conformance/target.d.ts.map +1 -0
- package/dist/content-source/conformance/target.js +2 -0
- package/dist/content-source/conformance/target.js.map +1 -0
- package/dist/content-source/conformance-kit.d.ts +4 -0
- package/dist/content-source/conformance-kit.d.ts.map +1 -0
- package/dist/content-source/conformance-kit.js +41 -0
- package/dist/content-source/conformance-kit.js.map +1 -0
- package/dist/content-source/content-source.d.ts +153 -0
- package/dist/content-source/content-source.d.ts.map +1 -0
- package/dist/content-source/content-source.js +12 -0
- package/dist/content-source/content-source.js.map +1 -0
- package/dist/content-source/permissions.d.ts +46 -0
- package/dist/content-source/permissions.d.ts.map +1 -0
- package/dist/content-source/permissions.js +33 -0
- package/dist/content-source/permissions.js.map +1 -0
- package/dist/content-source/viewer.d.ts +48 -0
- package/dist/content-source/viewer.d.ts.map +1 -0
- package/dist/content-source/viewer.js +24 -0
- package/dist/content-source/viewer.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/cms-lifecycle-store.d.ts +72 -0
- package/dist/lifecycle/cms-lifecycle-store.d.ts.map +1 -0
- package/dist/lifecycle/cms-lifecycle-store.js +150 -0
- package/dist/lifecycle/cms-lifecycle-store.js.map +1 -0
- package/dist/lifecycle/lifecycle-store.d.ts +35 -0
- package/dist/lifecycle/lifecycle-store.d.ts.map +1 -0
- package/dist/lifecycle/lifecycle-store.js +69 -0
- package/dist/lifecycle/lifecycle-store.js.map +1 -0
- package/dist/lifecycle/version-token.d.ts +30 -0
- package/dist/lifecycle/version-token.d.ts.map +1 -0
- package/dist/lifecycle/version-token.js +22 -0
- package/dist/lifecycle/version-token.js.map +1 -0
- package/dist/messages.d.ts +26 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +31 -0
- package/dist/messages.js.map +1 -0
- package/dist/render/image-usage-preview.d.ts +19 -0
- package/dist/render/image-usage-preview.d.ts.map +1 -0
- package/dist/render/image-usage-preview.js +25 -0
- package/dist/render/image-usage-preview.js.map +1 -0
- package/dist/render/image-usage.d.ts +32 -0
- package/dist/render/image-usage.d.ts.map +1 -0
- package/dist/render/image-usage.js +116 -0
- package/dist/render/image-usage.js.map +1 -0
- package/dist/render/page-renderer.d.ts +44 -0
- package/dist/render/page-renderer.d.ts.map +1 -0
- package/dist/render/page-renderer.js +115 -0
- package/dist/render/page-renderer.js.map +1 -0
- package/dist/resolver/data-loader.d.ts +49 -0
- package/dist/resolver/data-loader.d.ts.map +1 -0
- package/dist/resolver/data-loader.js +121 -0
- package/dist/resolver/data-loader.js.map +1 -0
- package/dist/resolver/resolution-service.d.ts +49 -0
- package/dist/resolver/resolution-service.d.ts.map +1 -0
- package/dist/resolver/resolution-service.js +193 -0
- package/dist/resolver/resolution-service.js.map +1 -0
- package/dist/routing/route-resolver.d.ts +73 -0
- package/dist/routing/route-resolver.d.ts.map +1 -0
- package/dist/routing/route-resolver.js +114 -0
- package/dist/routing/route-resolver.js.map +1 -0
- package/dist/scope-engine/build-stack.d.ts +49 -0
- package/dist/scope-engine/build-stack.d.ts.map +1 -0
- package/dist/scope-engine/build-stack.js +77 -0
- package/dist/scope-engine/build-stack.js.map +1 -0
- package/dist/scope-engine/repeater-query.d.ts +9 -0
- package/dist/scope-engine/repeater-query.d.ts.map +1 -0
- package/dist/scope-engine/repeater-query.js +39 -0
- package/dist/scope-engine/repeater-query.js.map +1 -0
- package/dist/seo/metadata.d.ts +30 -0
- package/dist/seo/metadata.d.ts.map +1 -0
- package/dist/seo/metadata.js +118 -0
- package/dist/seo/metadata.js.map +1 -0
- package/dist/seo/sitemap.d.ts +11 -0
- package/dist/seo/sitemap.d.ts.map +1 -0
- package/dist/seo/sitemap.js +20 -0
- package/dist/seo/sitemap.js.map +1 -0
- package/dist/write/write-path.d.ts +63 -0
- package/dist/write/write-path.d.ts.map +1 -0
- package/dist/write/write-path.js +139 -0
- package/dist/write/write-path.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Invariant-I filter/sort/limit (decision 004 §2.3): the authoritative,
|
|
3
|
+
* adapter-independent truth pass using bind-core's evaluators — one engine,
|
|
4
|
+
* never N adapter dialects. Order of operations is contract: filter -> sort
|
|
5
|
+
* -> slice(pageSize) — pagination never truncates a filtered set early.
|
|
6
|
+
*/
|
|
7
|
+
import { evaluateCondition, evaluateValue, } from "@batterai/bind-core";
|
|
8
|
+
export function applyRepeaterQuery(candidates, query, itemStackFor, data) {
|
|
9
|
+
let result = candidates.map((instance, index) => ({ instance, index }));
|
|
10
|
+
if (query.filter) {
|
|
11
|
+
if (query.filter.k !== "cond") {
|
|
12
|
+
throw new Error("repeater filter must be a CondExpr (validateExpr enforces at author time)");
|
|
13
|
+
}
|
|
14
|
+
const cond = query.filter.condition;
|
|
15
|
+
result = result.filter(({ instance, index }) => evaluateCondition(cond, itemStackFor(instance, index), data));
|
|
16
|
+
}
|
|
17
|
+
if (query.sort) {
|
|
18
|
+
if (query.sort.k !== "ref") {
|
|
19
|
+
throw new Error("repeater sort must be a RefExpr (validateExpr enforces at author time)");
|
|
20
|
+
}
|
|
21
|
+
const sortRef = query.sort;
|
|
22
|
+
const keyed = result.map((r) => ({
|
|
23
|
+
...r,
|
|
24
|
+
key: evaluateValue(sortRef, itemStackFor(r.instance, r.index), data),
|
|
25
|
+
}));
|
|
26
|
+
keyed.sort((a, b) => {
|
|
27
|
+
if (a.key === b.key)
|
|
28
|
+
return 0;
|
|
29
|
+
if (a.key === null)
|
|
30
|
+
return 1;
|
|
31
|
+
if (b.key === null)
|
|
32
|
+
return -1;
|
|
33
|
+
return a.key < b.key ? -1 : 1;
|
|
34
|
+
});
|
|
35
|
+
result = keyed;
|
|
36
|
+
}
|
|
37
|
+
return result.slice(0, query.pageSize).map((r) => r.instance);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=repeater-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repeater-query.js","sourceRoot":"","sources":["../../src/scope-engine/repeater-query.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,iBAAiB,EACjB,aAAa,GAKd,MAAM,qBAAqB,CAAC;AAE7B,MAAM,UAAU,kBAAkB,CAChC,UAA+B,EAC/B,KAAoB,EACpB,YAA+D,EAC/D,IAAc;IAEd,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAExE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;QACpC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7C,iBAAiB,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/B,GAAG,CAAC;YACJ,GAAG,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;SACrE,CAAC,CAAC,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG;gBAAE,OAAO,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAC;YAC9B,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEO metadata model (decision 004 §7; plan "SEO full v1"). Fields reuse
|
|
3
|
+
* PropValue's literal|binding shape — bound meta resolves through the SAME
|
|
4
|
+
* bind-core resolver as everything else; JSON-LD is a CLOSED template set,
|
|
5
|
+
* never an arbitrary authoring surface.
|
|
6
|
+
*/
|
|
7
|
+
import { type BindingExpr, type DataView, type Locale, type PropValue, type ResolveCtx, type ScopeStack } from "@batterai/bind-core";
|
|
8
|
+
export type JsonLdTemplate = {
|
|
9
|
+
readonly type: "Article";
|
|
10
|
+
readonly headline: BindingExpr;
|
|
11
|
+
readonly datePublished: BindingExpr;
|
|
12
|
+
readonly author?: BindingExpr;
|
|
13
|
+
} | {
|
|
14
|
+
readonly type: "WebPage";
|
|
15
|
+
readonly name: BindingExpr;
|
|
16
|
+
};
|
|
17
|
+
export interface PageMetadataModel {
|
|
18
|
+
readonly title: PropValue<string>;
|
|
19
|
+
readonly description?: PropValue<string>;
|
|
20
|
+
readonly canonical?: PropValue<string>;
|
|
21
|
+
readonly ogTitle?: PropValue<string>;
|
|
22
|
+
readonly ogDescription?: PropValue<string>;
|
|
23
|
+
readonly ogImage?: PropValue<string>;
|
|
24
|
+
readonly twitterCard?: "summary" | "summary_large_image";
|
|
25
|
+
readonly jsonLd?: JsonLdTemplate;
|
|
26
|
+
}
|
|
27
|
+
/** Renders <head> content: title/meta/OG/JSON-LD — html-text/attribute-context
|
|
28
|
+
* escaped per invariant H. Part of the SAME cached HTML artifact as the body. */
|
|
29
|
+
export declare function renderMetadataHead(metadata: PageMetadataModel, stack: ScopeStack, view: DataView, ctx: ResolveCtx, locale?: Locale): string;
|
|
30
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/seo/metadata.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,qBAAqB,CAAC;AAU7B,MAAM,MAAM,cAAc,GACtB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;CAClC;AAgCD;iFACiF;AACjF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,UAAU,EACf,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAuER"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SEO metadata model (decision 004 §7; plan "SEO full v1"). Fields reuse
|
|
3
|
+
* PropValue's literal|binding shape — bound meta resolves through the SAME
|
|
4
|
+
* bind-core resolver as everything else; JSON-LD is a CLOSED template set,
|
|
5
|
+
* never an arbitrary authoring surface.
|
|
6
|
+
*/
|
|
7
|
+
import { MalformedExpr, MissingData, resolve, } from "@batterai/bind-core";
|
|
8
|
+
import { defaultEscaper } from "@batterai/bind-core";
|
|
9
|
+
import { hostMessage } from "../messages.js";
|
|
10
|
+
/** A broken metadata binding: degrade the FIELD, never the page (the body
|
|
11
|
+
* already carries its own visible be-broken-binding diagnostics). */
|
|
12
|
+
class BrokenMeta {
|
|
13
|
+
reason;
|
|
14
|
+
constructor(reason) {
|
|
15
|
+
this.reason = reason;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function resolveProp(prop, stack, view, ctx) {
|
|
19
|
+
if (!prop)
|
|
20
|
+
return undefined;
|
|
21
|
+
try {
|
|
22
|
+
if (prop.kind === "literal")
|
|
23
|
+
return typeof prop.value === "string" ? prop.value : undefined;
|
|
24
|
+
if (prop.kind === "binding") {
|
|
25
|
+
const rv = resolve(prop.bind.$bind, stack, view, ctx);
|
|
26
|
+
if (rv.kind === "string")
|
|
27
|
+
return rv.value;
|
|
28
|
+
if (rv.kind === "number")
|
|
29
|
+
return String(rv.value);
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
// Rich metadata values flatten to plain text (titles are text, not markup).
|
|
33
|
+
return prop.rich.doc
|
|
34
|
+
.map((n) => (n.t === "text" ? n.text : resolveText(n.expr, stack, view, ctx)))
|
|
35
|
+
.join("");
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
if (e instanceof MissingData || e instanceof MalformedExpr)
|
|
39
|
+
return new BrokenMeta(e.message);
|
|
40
|
+
throw e;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function resolveText(expr, stack, view, ctx) {
|
|
44
|
+
const rv = resolve(expr, stack, view, ctx);
|
|
45
|
+
return rv.kind === "string" ? rv.value : rv.kind === "number" ? String(rv.value) : "";
|
|
46
|
+
}
|
|
47
|
+
/** Renders <head> content: title/meta/OG/JSON-LD — html-text/attribute-context
|
|
48
|
+
* escaped per invariant H. Part of the SAME cached HTML artifact as the body. */
|
|
49
|
+
export function renderMetadataHead(metadata, stack, view, ctx, locale) {
|
|
50
|
+
const esc = (s) => defaultEscaper.escape(s, { kind: "html-text" });
|
|
51
|
+
const attr = (s) => defaultEscaper.escape(s, { kind: "attribute", attrName: "content" });
|
|
52
|
+
const parts = [];
|
|
53
|
+
// A broken metadata binding degrades PER FIELD (the tag is omitted or shows
|
|
54
|
+
// an explicit marker) and always leaves a monitorable diagnostic meta —
|
|
55
|
+
// never a 500 for the whole page, never a silent absence.
|
|
56
|
+
const brokenDiag = (field, b) => parts.push(`<meta name="be:broken-metadata" content="${attr(`${field}: ${b.reason}`)}">`);
|
|
57
|
+
const ok = (field, v) => {
|
|
58
|
+
if (v instanceof BrokenMeta) {
|
|
59
|
+
brokenDiag(field, v);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
return v;
|
|
63
|
+
};
|
|
64
|
+
const rawTitle = resolveProp(metadata.title, stack, view, ctx);
|
|
65
|
+
// Title is mandatory: broken => explicit visible marker in the tab, not "".
|
|
66
|
+
const title = rawTitle instanceof BrokenMeta ? hostMessage(locale, "metadata.brokenTitle") : (rawTitle ?? "");
|
|
67
|
+
if (rawTitle instanceof BrokenMeta)
|
|
68
|
+
brokenDiag("title", rawTitle);
|
|
69
|
+
parts.push(`<title>${esc(title)}</title>`);
|
|
70
|
+
const description = ok("description", resolveProp(metadata.description, stack, view, ctx));
|
|
71
|
+
if (description)
|
|
72
|
+
parts.push(`<meta name="description" content="${attr(description)}">`);
|
|
73
|
+
const canonical = ok("canonical", resolveProp(metadata.canonical, stack, view, ctx));
|
|
74
|
+
if (canonical) {
|
|
75
|
+
parts.push(`<link rel="canonical" href="${defaultEscaper.escape(canonical, { kind: "url", allowedSchemes: ["https", "http"] })}">`);
|
|
76
|
+
}
|
|
77
|
+
const ogTitle = ok("ogTitle", resolveProp(metadata.ogTitle, stack, view, ctx)) ?? title;
|
|
78
|
+
parts.push(`<meta property="og:title" content="${attr(ogTitle)}">`);
|
|
79
|
+
const ogDescription = ok("ogDescription", resolveProp(metadata.ogDescription, stack, view, ctx)) ?? description;
|
|
80
|
+
if (ogDescription)
|
|
81
|
+
parts.push(`<meta property="og:description" content="${attr(ogDescription)}">`);
|
|
82
|
+
const ogImage = ok("ogImage", resolveProp(metadata.ogImage, stack, view, ctx));
|
|
83
|
+
if (ogImage)
|
|
84
|
+
parts.push(`<meta property="og:image" content="${attr(ogImage)}">`);
|
|
85
|
+
if (metadata.twitterCard) {
|
|
86
|
+
parts.push(`<meta name="twitter:card" content="${metadata.twitterCard}">`);
|
|
87
|
+
}
|
|
88
|
+
if (metadata.jsonLd) {
|
|
89
|
+
try {
|
|
90
|
+
const ld = metadata.jsonLd.type === "Article"
|
|
91
|
+
? {
|
|
92
|
+
"@context": "https://schema.org",
|
|
93
|
+
"@type": "Article",
|
|
94
|
+
headline: resolveText(metadata.jsonLd.headline, stack, view, ctx),
|
|
95
|
+
datePublished: resolveText(metadata.jsonLd.datePublished, stack, view, ctx),
|
|
96
|
+
...(metadata.jsonLd.author
|
|
97
|
+
? { author: { "@type": "Person", name: resolveText(metadata.jsonLd.author, stack, view, ctx) } }
|
|
98
|
+
: {}),
|
|
99
|
+
}
|
|
100
|
+
: {
|
|
101
|
+
"@context": "https://schema.org",
|
|
102
|
+
"@type": "WebPage",
|
|
103
|
+
name: resolveText(metadata.jsonLd.name, stack, view, ctx),
|
|
104
|
+
};
|
|
105
|
+
// </script> breakout guard for JSON-LD payloads.
|
|
106
|
+
parts.push(`<script type="application/ld+json">${JSON.stringify(ld).replace(/</g, "\\u003c")}</script>`);
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
// Partial JSON-LD is worse than none (search engines reject it whole).
|
|
110
|
+
if (e instanceof MissingData || e instanceof MalformedExpr)
|
|
111
|
+
brokenDiag("jsonLd", new BrokenMeta(e.message));
|
|
112
|
+
else
|
|
113
|
+
throw e;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return parts.join("\n");
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/seo/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sitemap + robots (decision 004 §7.2). Bounded per-file with sitemap-index
|
|
3
|
+
* chaining beyond the protocol's 50k limit — never a silently truncated file.
|
|
4
|
+
*/
|
|
5
|
+
import type { Viewer } from "../content-source/viewer";
|
|
6
|
+
import type { RouteResolver } from "../routing/route-resolver";
|
|
7
|
+
export declare function generateSitemap(resolver: RouteResolver, viewer: Viewer, baseUrl: string): Promise<string>;
|
|
8
|
+
export declare function generateRobotsTxt(baseUrl: string, opts: {
|
|
9
|
+
allowIndexing: boolean;
|
|
10
|
+
}): string;
|
|
11
|
+
//# sourceMappingURL=sitemap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/seo/sitemap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,wBAAsB,eAAe,CACnC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,aAAa,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAI3F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const SITEMAP_LIMIT = 50_000;
|
|
2
|
+
export async function generateSitemap(resolver, viewer, baseUrl) {
|
|
3
|
+
const urls = [];
|
|
4
|
+
for await (const route of resolver.listPublicRoutes(viewer)) {
|
|
5
|
+
urls.push(`<url><loc>${baseUrl}${escapeXml(route.path)}</loc><lastmod>${route.lastModified.slice(0, 10)}</lastmod></url>`);
|
|
6
|
+
if (urls.length > SITEMAP_LIMIT) {
|
|
7
|
+
throw new Error(`sitemap: over ${SITEMAP_LIMIT} URLs — implement sitemap-index chaining before shipping this site (no silent truncation)`);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls.join("\n")}\n</urlset>\n`;
|
|
11
|
+
}
|
|
12
|
+
export function generateRobotsTxt(baseUrl, opts) {
|
|
13
|
+
return opts.allowIndexing
|
|
14
|
+
? `User-agent: *\nAllow: /\nSitemap: ${baseUrl}/sitemap.xml\n`
|
|
15
|
+
: `User-agent: *\nDisallow: /\n`;
|
|
16
|
+
}
|
|
17
|
+
function escapeXml(s) {
|
|
18
|
+
return s.replace(/[&<>'"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", "'": "'", '"': """ })[c]);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=sitemap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/seo/sitemap.ts"],"names":[],"mappings":"AAOA,MAAM,aAAa,GAAG,MAAM,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAuB,EACvB,MAAc,EACd,OAAe;IAEf,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,IAAI,CAAC,IAAI,CACP,aAAa,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAChH,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,iBAAiB,aAAa,2FAA2F,CAC1H,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,yGAAyG,IAAI,CAAC,IAAI,CACvH,IAAI,CACL,eAAe,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAgC;IACjF,OAAO,IAAI,CAAC,aAAa;QACvB,CAAC,CAAC,qCAAqC,OAAO,gBAAgB;QAC9D,CAAC,CAAC,8BAA8B,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AACtH,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The write path (decision 004 §5; invariant P): pre-focus per-field authz,
|
|
3
|
+
* drafts-only writes, CAS via adapter capability, dependency-graph
|
|
4
|
+
* invalidation on success. One authz decision, two call sites (pre-focus UI
|
|
5
|
+
* gate + mutate()'s defense-in-depth) — no drift.
|
|
6
|
+
*/
|
|
7
|
+
import type { FieldName, Locale, PageId, PropValue, RichValue, ScopeStack, WriteScope, WriteTarget } from "@batterai/bind-core";
|
|
8
|
+
import type { HostApi } from "@batterai/contract";
|
|
9
|
+
import type { ContentSource, EntityProvider } from "../content-source/content-source";
|
|
10
|
+
import type { FieldAccess, Viewer } from "../content-source/viewer";
|
|
11
|
+
import type { BindingDependencyGraph } from "../cache/dependency-graph";
|
|
12
|
+
import type { ContentVersionToken } from "../lifecycle/version-token";
|
|
13
|
+
export declare class WriteUnauthorized extends Error {
|
|
14
|
+
readonly target: WriteTarget;
|
|
15
|
+
readonly reason: string;
|
|
16
|
+
constructor(target: WriteTarget, reason: string);
|
|
17
|
+
}
|
|
18
|
+
export declare class StaleWrite extends Error {
|
|
19
|
+
readonly target: WriteTarget;
|
|
20
|
+
readonly detail: string;
|
|
21
|
+
constructor(target: WriteTarget, detail: string);
|
|
22
|
+
}
|
|
23
|
+
/** Adapters throw this shape (or the host maps their native stale error onto it). */
|
|
24
|
+
export declare class AdapterStaleVersion extends Error {
|
|
25
|
+
constructor();
|
|
26
|
+
}
|
|
27
|
+
/** CMS-native instance fields take RAW values (a structural wrapper would be
|
|
28
|
+
* PATCHed verbatim into Payload/Strapi and 500). Rich/binding payloads to an
|
|
29
|
+
* instance field are the record-edit path (plan Phase 7.5) — refused typed
|
|
30
|
+
* until that path defines their storage semantics, never silently coerced. */
|
|
31
|
+
export declare class UnsupportedInstanceWriteValue extends Error {
|
|
32
|
+
readonly target: WriteTarget;
|
|
33
|
+
constructor(target: WriteTarget, kind: string);
|
|
34
|
+
}
|
|
35
|
+
/** THE pre-focus check (invariant P) — called before the overlay mounts AND
|
|
36
|
+
* re-checked inside mutate(). Non-editable-with-reason, never bare false. */
|
|
37
|
+
export declare function checkWriteAuthz(provider: EntityProvider, target: WriteTarget, viewer: Viewer): Promise<FieldAccess>;
|
|
38
|
+
/** Edit-target resolution (decision 004 §5.4): a PURE function of
|
|
39
|
+
* (stack, existing PropValue kind, field) — never a UX guess. */
|
|
40
|
+
export declare function resolveWriteScope(stack: ScopeStack, pageId: PageId, nodeId: string, currentPropKind: "literal" | "binding" | "rich"): WriteScope;
|
|
41
|
+
export declare function buildWriteTarget(stack: ScopeStack, pageId: PageId, nodeId: string, field: FieldName, currentPropKind: "literal" | "binding" | "rich", locale: Locale): WriteTarget;
|
|
42
|
+
export interface MutateOpts {
|
|
43
|
+
/** CAS precondition read at edit-session open (instance-field writes). */
|
|
44
|
+
readonly expectedVersion?: ContentVersionToken;
|
|
45
|
+
}
|
|
46
|
+
export interface PageDraftWriter {
|
|
47
|
+
writePageProp(pageId: PageId, nodeId: string, field: FieldName, value: PropValue | RichValue): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare class HostApiImpl implements HostApi {
|
|
50
|
+
private readonly provider;
|
|
51
|
+
private readonly source;
|
|
52
|
+
private readonly pageDrafts;
|
|
53
|
+
private readonly viewer;
|
|
54
|
+
private readonly depGraph;
|
|
55
|
+
private readonly queryHandler;
|
|
56
|
+
constructor(provider: EntityProvider, source: ContentSource, pageDrafts: PageDraftWriter, viewer: Viewer, depGraph: BindingDependencyGraph, queryHandler: (resource: string, params?: Readonly<Record<string, unknown>>) => Promise<unknown>);
|
|
57
|
+
query(resource: string, params?: Readonly<Record<string, unknown>>): Promise<unknown>;
|
|
58
|
+
/** Order (decision 004 §5.3): authz -> drafts-only write -> CAS -> invalidate. */
|
|
59
|
+
mutate(target: WriteTarget, value: PropValue | RichValue, opts?: MutateOpts): Promise<{
|
|
60
|
+
readonly version?: ContentVersionToken;
|
|
61
|
+
} | void>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=write-path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-path.d.ts","sourceRoot":"","sources":["../../src/write/write-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { CURRENT_SCHEMA_VERSION } from "@batterai/bind-core";
|
|
2
|
+
import { hostMessage } from "../messages.js";
|
|
3
|
+
export class WriteUnauthorized extends Error {
|
|
4
|
+
target;
|
|
5
|
+
reason;
|
|
6
|
+
constructor(target, reason) {
|
|
7
|
+
super(`WriteUnauthorized: ${reason}`);
|
|
8
|
+
this.target = target;
|
|
9
|
+
this.reason = reason;
|
|
10
|
+
this.name = "WriteUnauthorized";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class StaleWrite extends Error {
|
|
14
|
+
target;
|
|
15
|
+
detail;
|
|
16
|
+
constructor(target, detail) {
|
|
17
|
+
super(`StaleWrite: ${detail}`);
|
|
18
|
+
this.target = target;
|
|
19
|
+
this.detail = detail;
|
|
20
|
+
this.name = "StaleWrite";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Adapters throw this shape (or the host maps their native stale error onto it). */
|
|
24
|
+
export class AdapterStaleVersion extends Error {
|
|
25
|
+
constructor() {
|
|
26
|
+
super("adapter: version precondition failed");
|
|
27
|
+
this.name = "AdapterStaleVersion";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** CMS-native instance fields take RAW values (a structural wrapper would be
|
|
31
|
+
* PATCHed verbatim into Payload/Strapi and 500). Rich/binding payloads to an
|
|
32
|
+
* instance field are the record-edit path (plan Phase 7.5) — refused typed
|
|
33
|
+
* until that path defines their storage semantics, never silently coerced. */
|
|
34
|
+
export class UnsupportedInstanceWriteValue extends Error {
|
|
35
|
+
target;
|
|
36
|
+
constructor(target, kind) {
|
|
37
|
+
super(hostMessage(target.locale, "write.unsupportedInstanceValue", { kind }));
|
|
38
|
+
this.target = target;
|
|
39
|
+
this.name = "UnsupportedInstanceWriteValue";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** THE pre-focus check (invariant P) — called before the overlay mounts AND
|
|
43
|
+
* re-checked inside mutate(). Non-editable-with-reason, never bare false. */
|
|
44
|
+
export async function checkWriteAuthz(provider, target, viewer) {
|
|
45
|
+
if (target.scope.kind === "page-local") {
|
|
46
|
+
// Page-local props have no per-field CMS ACL and are host-managed. Every
|
|
47
|
+
// Viewer carries a delegated CMS session (decision 012, invariant D4), so
|
|
48
|
+
// there is no coarser identity gate to apply here — the CMS authorizes the
|
|
49
|
+
// persisted mutation. battery-editor is not a second authority.
|
|
50
|
+
return { canRead: true, canWrite: true };
|
|
51
|
+
}
|
|
52
|
+
const described = await provider.describe(target.scope.contentTypeId, viewer);
|
|
53
|
+
const field = described.readableFields.find((f) => f.schema.name === target.field);
|
|
54
|
+
if (!field) {
|
|
55
|
+
return { canRead: false, canWrite: false, writeReason: hostMessage(viewer.locale, "write.fieldUnreadable") };
|
|
56
|
+
}
|
|
57
|
+
return field.access;
|
|
58
|
+
}
|
|
59
|
+
/** Edit-target resolution (decision 004 §5.4): a PURE function of
|
|
60
|
+
* (stack, existing PropValue kind, field) — never a UX guess. */
|
|
61
|
+
export function resolveWriteScope(stack, pageId, nodeId, currentPropKind) {
|
|
62
|
+
const innermostInstance = [...stack].reverse().find((f) => f.kind === "instance");
|
|
63
|
+
if (innermostInstance && innermostInstance.kind === "instance" && currentPropKind !== "literal") {
|
|
64
|
+
return {
|
|
65
|
+
kind: "instance-field",
|
|
66
|
+
contentTypeId: innermostInstance.instance.contentTypeId,
|
|
67
|
+
instanceId: innermostInstance.instance.id,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { kind: "page-local", pageId, nodeId };
|
|
71
|
+
}
|
|
72
|
+
export function buildWriteTarget(stack, pageId, nodeId, field, currentPropKind, locale) {
|
|
73
|
+
return {
|
|
74
|
+
scope: resolveWriteScope(stack, pageId, nodeId, currentPropKind),
|
|
75
|
+
field,
|
|
76
|
+
locale,
|
|
77
|
+
schemaVersion: CURRENT_SCHEMA_VERSION,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export class HostApiImpl {
|
|
81
|
+
provider;
|
|
82
|
+
source;
|
|
83
|
+
pageDrafts;
|
|
84
|
+
viewer;
|
|
85
|
+
depGraph;
|
|
86
|
+
queryHandler;
|
|
87
|
+
constructor(provider, source, pageDrafts, viewer, depGraph, queryHandler) {
|
|
88
|
+
this.provider = provider;
|
|
89
|
+
this.source = source;
|
|
90
|
+
this.pageDrafts = pageDrafts;
|
|
91
|
+
this.viewer = viewer;
|
|
92
|
+
this.depGraph = depGraph;
|
|
93
|
+
this.queryHandler = queryHandler;
|
|
94
|
+
}
|
|
95
|
+
query(resource, params) {
|
|
96
|
+
return this.queryHandler(resource, params);
|
|
97
|
+
}
|
|
98
|
+
/** Order (decision 004 §5.3): authz -> drafts-only write -> CAS -> invalidate. */
|
|
99
|
+
async mutate(target, value, opts) {
|
|
100
|
+
const access = await checkWriteAuthz(this.provider, target, this.viewer);
|
|
101
|
+
if (!access.canWrite) {
|
|
102
|
+
throw new WriteUnauthorized(target, access.writeReason ?? "schrijven niet toegestaan");
|
|
103
|
+
}
|
|
104
|
+
if (target.scope.kind === "page-local") {
|
|
105
|
+
await this.pageDrafts.writePageProp(target.scope.pageId, target.scope.nodeId, target.field, value);
|
|
106
|
+
this.depGraph.invalidate({ kind: "page", pageId: target.scope.pageId });
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
// Unwrap to the CMS-native RAW value (see UnsupportedInstanceWriteValue).
|
|
110
|
+
if (!("kind" in value) || value.kind !== "literal") {
|
|
111
|
+
throw new UnsupportedInstanceWriteValue(target, "kind" in value ? value.kind : "rich");
|
|
112
|
+
}
|
|
113
|
+
let nextVersion;
|
|
114
|
+
try {
|
|
115
|
+
const result = await this.source.writeInstanceField(target.scope.contentTypeId, target.scope.instanceId, target.field, value.value, opts?.expectedVersion, this.viewer);
|
|
116
|
+
nextVersion = result.version;
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
if (e instanceof AdapterStaleVersion) {
|
|
120
|
+
throw new StaleWrite(target, "de inhoud is intussen door iemand anders gewijzigd");
|
|
121
|
+
}
|
|
122
|
+
throw e;
|
|
123
|
+
}
|
|
124
|
+
this.depGraph.invalidate({
|
|
125
|
+
kind: "instance",
|
|
126
|
+
contentTypeId: target.scope.contentTypeId,
|
|
127
|
+
instanceId: target.scope.instanceId,
|
|
128
|
+
});
|
|
129
|
+
// Content-type-granular invalidation for repeater-bound pages (decision
|
|
130
|
+
// 004 §6.4's conservative granularity).
|
|
131
|
+
this.depGraph.invalidate({
|
|
132
|
+
kind: "instance",
|
|
133
|
+
contentTypeId: target.scope.contentTypeId,
|
|
134
|
+
instanceId: "*",
|
|
135
|
+
});
|
|
136
|
+
return { version: nextVersion };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=write-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-path.js","sourceRoot":"","sources":["../../src/write/write-path.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@batterai/host",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./client": {
|
|
12
|
+
"types": "./dist/client.d.ts",
|
|
13
|
+
"import": "./dist/client.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"check": "tsc --noEmit",
|
|
18
|
+
"build": "node ../../scripts/build-package.mjs",
|
|
19
|
+
"prepack": "bun run build"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@batterai/bind-core": "^0.1.0",
|
|
23
|
+
"@batterai/contract": "^0.1.0",
|
|
24
|
+
"@batterai/block-sdk": "^0.1.0",
|
|
25
|
+
"@batterai/media": "^0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^22.13.0"
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"README.md",
|
|
36
|
+
"CHANGELOG.md"
|
|
37
|
+
],
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=20.11"
|
|
40
|
+
},
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
}
|
|
44
|
+
}
|