@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.
@@ -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,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,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"}
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,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,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"}
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
@@ -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,YAAY,CAAC;AAC3B,cAAc,SAAS,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
@@ -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,YAAY,CAAC;AAC3B,cAAc,SAAS,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
- /** Theme-facing alias for Puck's root config. */
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.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudajs/theme-engine",
3
- "version": "0.2.1",
3
+ "version": "1.0.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -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
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"slots.js","sourceRoot":"","sources":["../../src/ai/slots.ts"],"names":[],"mappings":"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"}