@sudajs/theme-engine 0.2.1 → 1.0.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/dist/agent.d.ts +288 -20
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +73 -9
- package/dist/agent.js.map +1 -1
- package/dist/check.d.ts +54 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +120 -0
- package/dist/check.js.map +1 -0
- package/dist/components/base-blocks.d.ts.map +1 -1
- package/dist/components/base-blocks.js +90 -6
- package/dist/components/base-blocks.js.map +1 -1
- package/dist/components/containers.d.ts.map +1 -1
- package/dist/components/containers.js +51 -2
- package/dist/components/containers.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +38 -18
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/ai/slots.d.ts +0 -33
- package/dist/ai/slots.d.ts.map +0 -1
- package/dist/ai/slots.js +0 -139
- package/dist/ai/slots.js.map +0 -1
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAG5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
export * from "./types.js";
|
|
3
3
|
export * from "./manifest.js";
|
|
4
4
|
export * from "./registry.js";
|
|
5
|
-
export * from "./ai/slots.js";
|
|
6
5
|
export * from "./assets.js";
|
|
7
6
|
export * from "./agent.js";
|
|
7
|
+
export * from "./check.js";
|
|
8
8
|
export * from "./cms/index.js";
|
|
9
9
|
// Editor building blocks (client-safe)
|
|
10
10
|
export * from "./fields/index.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,uCAAuC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAE/B,yCAAyC;AACzC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/server.d.ts
CHANGED
|
@@ -9,6 +9,6 @@ export * from "./types.js";
|
|
|
9
9
|
export { themeManifestSchema, parseThemeManifest, safeParseThemeManifest } from "./manifest.js";
|
|
10
10
|
export * from "./registry.js";
|
|
11
11
|
export * from "./registry/filesystem.js";
|
|
12
|
-
export * from "./ai/slots.js";
|
|
13
12
|
export * from "./agent.js";
|
|
13
|
+
export * from "./check.js";
|
|
14
14
|
//# sourceMappingURL=server.d.ts.map
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7F,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,GAC/B,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7F,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -12,6 +12,6 @@ export * from "./types.js";
|
|
|
12
12
|
export { themeManifestSchema, parseThemeManifest, safeParseThemeManifest } from "./manifest.js";
|
|
13
13
|
export * from "./registry.js";
|
|
14
14
|
export * from "./registry/filesystem.js";
|
|
15
|
-
export * from "./ai/slots.js";
|
|
16
15
|
export * from "./agent.js";
|
|
16
|
+
export * from "./check.js";
|
|
17
17
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0CAA0C;AAC1C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAyB,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAA4B,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAIjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,cAAc,aAAa,CAAC;AAE5B,sDAAsD;AACtD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7F,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,0CAA0C;AAC1C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAyB,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAA4B,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EACL,oBAAoB,EACpB,gBAAgB,GAIjB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AACjC,cAAc,aAAa,CAAC;AAE5B,sDAAsD;AACtD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC7F,cAAc,YAAY,CAAC;AAC3B,cAAc,uBAAuB,CAAC;AACtC,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
1
|
import type { ComponentConfig as PuckComponentConfig, Config, Data, DefaultComponentProps, DefaultComponents, Fields as PuckFields, RootConfig as PuckRootConfig } from "@puckeditor/core";
|
|
2
|
+
import type { ComponentAiParams } from "@puckeditor/plugin-ai";
|
|
2
3
|
import type { ReactElement } from "react";
|
|
3
4
|
import type { ThemeContentCapabilities } from "./cms/types.js";
|
|
4
5
|
import type { ThemeRenderMetadata } from "./components/metadata.js";
|
|
5
6
|
import type { SudaField, SudaFieldExtension } from "./fields/suda-fields.js";
|
|
7
|
+
/**
|
|
8
|
+
* Component-level AI configuration. We reuse Puck's `ComponentAiParams` shape
|
|
9
|
+
* verbatim so any field Puck adds in the future flows through unchanged — the
|
|
10
|
+
* only Suda-specific tightening is that `instructions` is **required**, not
|
|
11
|
+
* optional. Without it the page-generation agent has no way to tell what the
|
|
12
|
+
* component is for, so {@link SudaComponentConfig} mandates it.
|
|
13
|
+
*
|
|
14
|
+
* Authors should describe (at a minimum):
|
|
15
|
+
*
|
|
16
|
+
* - **Purpose** — the business or content role of the component.
|
|
17
|
+
* - **Use when / Avoid when** — page types and intents that select this
|
|
18
|
+
* component versus a similar one.
|
|
19
|
+
* - **Placement** — where in the page the component normally belongs.
|
|
20
|
+
* - **Frequency** — once per page, multiple times, or with adjacency limits.
|
|
21
|
+
* - **Composition** — required neighbouring or child content where relevant.
|
|
22
|
+
*
|
|
23
|
+
* Avoid restating the component label, describing visual styling that does
|
|
24
|
+
* not change semantics, or duplicating site-wide rules (brand voice, factual
|
|
25
|
+
* constraints) — those belong in the global AI context.
|
|
26
|
+
*/
|
|
27
|
+
export type SudaComponentAi = Omit<ComponentAiParams, "instructions"> & {
|
|
28
|
+
/** Non-empty instructions used by the page-generation agent. Required. */
|
|
29
|
+
instructions: string;
|
|
30
|
+
};
|
|
6
31
|
/**
|
|
7
32
|
* Theme-facing alias for Puck's component config. Generic on the component's
|
|
8
33
|
* prop shape so `fields` and `defaultProps` are strictly typed against the
|
|
@@ -10,12 +35,22 @@ import type { SudaField, SudaFieldExtension } from "./fields/suda-fields.js";
|
|
|
10
35
|
*
|
|
11
36
|
* We pass the props through Puck's `ComponentConfigParams` shape (`{ props }`)
|
|
12
37
|
* so generic forwarding satisfies its `LeftOrExactRight` constraint.
|
|
38
|
+
*
|
|
39
|
+
* Suda contracts an `ai` field on every component (Puck's plugin-ai keeps it
|
|
40
|
+
* optional; we tighten it here so themes always describe their components for
|
|
41
|
+
* AI). Use {@link SudaComponentAi} to author the description.
|
|
13
42
|
*/
|
|
14
|
-
export type SudaComponentConfig<Props extends DefaultComponentProps = DefaultComponentProps> = PuckComponentConfig<{
|
|
43
|
+
export type SudaComponentConfig<Props extends DefaultComponentProps = DefaultComponentProps> = Omit<PuckComponentConfig<{
|
|
15
44
|
props: Props;
|
|
16
45
|
fields: Record<string, SudaFieldExtension>;
|
|
17
|
-
}
|
|
18
|
-
|
|
46
|
+
}>, "ai"> & {
|
|
47
|
+
ai: SudaComponentAi;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Theme-facing alias for Puck's root config. The Suda layout root usually has
|
|
51
|
+
* no AI-generated content, so `ai` remains optional here (set
|
|
52
|
+
* `ai: { exclude: true }` to make the intent explicit when needed).
|
|
53
|
+
*/
|
|
19
54
|
export type SudaRootConfig<Props extends DefaultComponentProps = DefaultComponentProps> = PuckRootConfig<{
|
|
20
55
|
props: Props;
|
|
21
56
|
fields: Record<string, SudaFieldExtension>;
|
|
@@ -111,19 +146,6 @@ export interface ThemeStarterPage {
|
|
|
111
146
|
isHome?: boolean;
|
|
112
147
|
data: PageData;
|
|
113
148
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Declares a slot inside a theme's prop tree that the AI assistant is allowed
|
|
116
|
-
* to read/write. Used to scope AI edits to safe, content-only fields.
|
|
117
|
-
*/
|
|
118
|
-
export interface AiSlotDescriptor {
|
|
119
|
-
/** Dot/bracket path into a component's props, e.g. "blocks[0].heading". */
|
|
120
|
-
path: string;
|
|
121
|
-
/** Human label shown to the assistant. */
|
|
122
|
-
label: string;
|
|
123
|
-
kind: "text" | "richtext" | "image" | "url" | "list";
|
|
124
|
-
/** Optional guidance the assistant should respect. */
|
|
125
|
-
hint?: string;
|
|
126
|
-
}
|
|
127
149
|
export interface ThemeRenderContext {
|
|
128
150
|
theme: Pick<ThemeModule, "pageConfig" | "layoutConfig">;
|
|
129
151
|
pageData: PageData;
|
|
@@ -161,8 +183,6 @@ export interface ThemeModule {
|
|
|
161
183
|
starterPages: ThemeStarterPage[];
|
|
162
184
|
/** Optional advanced renderer. Defaults to Puck Render. */
|
|
163
185
|
rendering?: ThemeRenderingOptions;
|
|
164
|
-
/** AI-editable slots, by component type. Optional. */
|
|
165
|
-
aiSlots?: Record<string, AiSlotDescriptor[]>;
|
|
166
186
|
/**
|
|
167
187
|
* Optional declaration of structured CMS views the theme supports
|
|
168
188
|
* (post.index/post.detail/tag.index/tag.detail) and their default routes.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,IAAI,mBAAmB,EACtC,MAAM,EACN,IAAI,EACJ,qBAAqB,EACrB,iBAAiB,EACjB,MAAM,IAAI,UAAU,EACpB,UAAU,IAAI,cAAc,EAC7B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/ai/slots.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { AiSlotDescriptor, PageData } from "../types.js";
|
|
2
|
-
/**
|
|
3
|
-
* A concrete AI-editable slot located inside a page document, produced by
|
|
4
|
-
* {@link extractAiSlots}. Identifies the component instance plus the prop path
|
|
5
|
-
* and current value, so the assistant can propose edits scoped to safe fields.
|
|
6
|
-
*/
|
|
7
|
-
export interface ResolvedAiSlot {
|
|
8
|
-
/** Puck component instance id (`props.id`). */
|
|
9
|
-
componentId: string;
|
|
10
|
-
/** Puck component type. */
|
|
11
|
-
type: string;
|
|
12
|
-
descriptor: AiSlotDescriptor;
|
|
13
|
-
value: unknown;
|
|
14
|
-
}
|
|
15
|
-
/** A single edit the assistant wants to apply. */
|
|
16
|
-
export interface AiSlotEdit {
|
|
17
|
-
componentId: string;
|
|
18
|
-
path: string;
|
|
19
|
-
value: unknown;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Walks a page document and returns every AI-editable slot declared by the
|
|
23
|
-
* theme's `aiSlots` map (keyed by component type).
|
|
24
|
-
*/
|
|
25
|
-
export declare function extractAiSlots(data: PageData, aiSlots: Record<string, AiSlotDescriptor[]> | undefined): ResolvedAiSlot[];
|
|
26
|
-
/**
|
|
27
|
-
* Applies a batch of AI edits to a page document, scoped strictly to the
|
|
28
|
-
* declared `aiSlots` for each component type. Edits targeting unknown
|
|
29
|
-
* components or paths outside the allow-list are ignored. Returns a new
|
|
30
|
-
* document; the input is not mutated.
|
|
31
|
-
*/
|
|
32
|
-
export declare function applyAiValues(data: PageData, aiSlots: Record<string, AiSlotDescriptor[]> | undefined, edits: AiSlotEdit[]): PageData;
|
|
33
|
-
//# sourceMappingURL=slots.d.ts.map
|
package/dist/ai/slots.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../src/ai/slots.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,kDAAkD;AAClD,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AA6FD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,GAAG,SAAS,GACtD,cAAc,EAAE,CAqBlB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,GAAG,SAAS,EACvD,KAAK,EAAE,UAAU,EAAE,GAClB,QAAQ,CAgCV"}
|
package/dist/ai/slots.js
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
function getContent(data) {
|
|
2
|
-
const content = data.content;
|
|
3
|
-
if (!Array.isArray(content)) {
|
|
4
|
-
return [];
|
|
5
|
-
}
|
|
6
|
-
return content.filter((item) => typeof item === "object" &&
|
|
7
|
-
item !== null &&
|
|
8
|
-
typeof item.type === "string" &&
|
|
9
|
-
typeof item.props === "object" &&
|
|
10
|
-
item.props !== null);
|
|
11
|
-
}
|
|
12
|
-
/** Splits a dot/bracket path into segments: `blocks[0].heading` -> ["blocks","0","heading"]. */
|
|
13
|
-
function parsePath(path) {
|
|
14
|
-
return path
|
|
15
|
-
.replace(/\[(\w+)\]/g, ".$1")
|
|
16
|
-
.split(".")
|
|
17
|
-
.filter((segment) => segment.length > 0);
|
|
18
|
-
}
|
|
19
|
-
function getAtPath(root, path) {
|
|
20
|
-
let current = root;
|
|
21
|
-
for (const segment of parsePath(path)) {
|
|
22
|
-
if (current === null || current === undefined) {
|
|
23
|
-
return undefined;
|
|
24
|
-
}
|
|
25
|
-
if (Array.isArray(current)) {
|
|
26
|
-
const index = Number(segment);
|
|
27
|
-
if (!Number.isInteger(index)) {
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
current = current[index];
|
|
31
|
-
}
|
|
32
|
-
else if (typeof current === "object") {
|
|
33
|
-
current = current[segment];
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return current;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Immutably sets `value` at `path` within `root`, creating intermediate
|
|
43
|
-
* objects/arrays as needed. Returns a shallow-cloned copy; the original is not
|
|
44
|
-
* mutated.
|
|
45
|
-
*/
|
|
46
|
-
function setAtPath(root, path, value) {
|
|
47
|
-
const segments = parsePath(path);
|
|
48
|
-
if (segments.length === 0) {
|
|
49
|
-
return root;
|
|
50
|
-
}
|
|
51
|
-
const clone = (node, nextSegment) => {
|
|
52
|
-
if (Array.isArray(node)) {
|
|
53
|
-
return [...node];
|
|
54
|
-
}
|
|
55
|
-
if (node && typeof node === "object") {
|
|
56
|
-
return { ...node };
|
|
57
|
-
}
|
|
58
|
-
// Decide container shape from the next key.
|
|
59
|
-
return Number.isInteger(Number(nextSegment)) ? [] : {};
|
|
60
|
-
};
|
|
61
|
-
const result = clone(root, segments[0]);
|
|
62
|
-
let cursor = result;
|
|
63
|
-
for (let i = 0; i < segments.length - 1; i += 1) {
|
|
64
|
-
const segment = segments[i];
|
|
65
|
-
const nextSegment = segments[i + 1];
|
|
66
|
-
const key = Array.isArray(cursor) ? Number(segment) : segment;
|
|
67
|
-
const existing = cursor[key];
|
|
68
|
-
const child = clone(existing, nextSegment);
|
|
69
|
-
cursor[key] = child;
|
|
70
|
-
cursor = child;
|
|
71
|
-
}
|
|
72
|
-
const lastSegment = segments[segments.length - 1];
|
|
73
|
-
const lastKey = Array.isArray(cursor) ? Number(lastSegment) : lastSegment;
|
|
74
|
-
cursor[lastKey] = value;
|
|
75
|
-
return result;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Walks a page document and returns every AI-editable slot declared by the
|
|
79
|
-
* theme's `aiSlots` map (keyed by component type).
|
|
80
|
-
*/
|
|
81
|
-
export function extractAiSlots(data, aiSlots) {
|
|
82
|
-
if (!aiSlots) {
|
|
83
|
-
return [];
|
|
84
|
-
}
|
|
85
|
-
const slots = [];
|
|
86
|
-
for (const item of getContent(data)) {
|
|
87
|
-
const descriptors = aiSlots[item.type];
|
|
88
|
-
if (!descriptors) {
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
const componentId = typeof item.props.id === "string" ? item.props.id : "";
|
|
92
|
-
for (const descriptor of descriptors) {
|
|
93
|
-
slots.push({
|
|
94
|
-
componentId,
|
|
95
|
-
type: item.type,
|
|
96
|
-
descriptor,
|
|
97
|
-
value: getAtPath(item.props, descriptor.path),
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return slots;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Applies a batch of AI edits to a page document, scoped strictly to the
|
|
105
|
-
* declared `aiSlots` for each component type. Edits targeting unknown
|
|
106
|
-
* components or paths outside the allow-list are ignored. Returns a new
|
|
107
|
-
* document; the input is not mutated.
|
|
108
|
-
*/
|
|
109
|
-
export function applyAiValues(data, aiSlots, edits) {
|
|
110
|
-
if (!aiSlots || edits.length === 0) {
|
|
111
|
-
return data;
|
|
112
|
-
}
|
|
113
|
-
const editsByComponent = new Map();
|
|
114
|
-
for (const edit of edits) {
|
|
115
|
-
const list = editsByComponent.get(edit.componentId) ?? [];
|
|
116
|
-
list.push(edit);
|
|
117
|
-
editsByComponent.set(edit.componentId, list);
|
|
118
|
-
}
|
|
119
|
-
const content = getContent(data);
|
|
120
|
-
const nextContent = content.map((item) => {
|
|
121
|
-
const componentId = typeof item.props.id === "string" ? item.props.id : "";
|
|
122
|
-
const componentEdits = editsByComponent.get(componentId);
|
|
123
|
-
const descriptors = aiSlots[item.type];
|
|
124
|
-
if (!componentEdits || !descriptors) {
|
|
125
|
-
return item;
|
|
126
|
-
}
|
|
127
|
-
const allowedPaths = new Set(descriptors.map((d) => d.path));
|
|
128
|
-
let props = item.props;
|
|
129
|
-
for (const edit of componentEdits) {
|
|
130
|
-
if (!allowedPaths.has(edit.path)) {
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
props = setAtPath(props, edit.path, edit.value);
|
|
134
|
-
}
|
|
135
|
-
return props === item.props ? item : { ...item, props };
|
|
136
|
-
});
|
|
137
|
-
return { ...data, content: nextContent };
|
|
138
|
-
}
|
|
139
|
-
//# sourceMappingURL=slots.js.map
|
package/dist/ai/slots.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slots.js","sourceRoot":"","sources":["../../src/ai/slots.ts"],"names":[],"mappings":"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"}
|