@trojanbox-vcp-test/site-edit-engine 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.
Files changed (174) hide show
  1. package/README.md +85 -0
  2. package/dist/execute-integration/execute-fixture-harness.d.ts +25 -0
  3. package/dist/execute-integration/execute-fixture-harness.js +37 -0
  4. package/dist/index.d.ts +3 -0
  5. package/dist/index.js +2 -0
  6. package/dist/internal/ast/diagnostics/index.d.ts +5 -0
  7. package/dist/internal/ast/diagnostics/index.js +25 -0
  8. package/dist/internal/ast/history/index.d.ts +15 -0
  9. package/dist/internal/ast/history/index.js +62 -0
  10. package/dist/internal/ast/index.d.ts +8 -0
  11. package/dist/internal/ast/index.js +5 -0
  12. package/dist/internal/ast/locators/index.d.ts +1 -0
  13. package/dist/internal/ast/locators/index.js +1 -0
  14. package/dist/internal/ast/locators/resolve-locator.d.ts +16 -0
  15. package/dist/internal/ast/locators/resolve-locator.js +920 -0
  16. package/dist/internal/ast/parser/SourceParser.d.ts +30 -0
  17. package/dist/internal/ast/parser/SourceParser.js +49 -0
  18. package/dist/internal/ast/parser/index.d.ts +21 -0
  19. package/dist/internal/ast/parser/index.js +64 -0
  20. package/dist/internal/ast/primitives/conditional/conditional-primitives.d.ts +18 -0
  21. package/dist/internal/ast/primitives/conditional/conditional-primitives.js +237 -0
  22. package/dist/internal/ast/primitives/conditional/index.d.ts +1 -0
  23. package/dist/internal/ast/primitives/conditional/index.js +1 -0
  24. package/dist/internal/ast/primitives/imports/add-import.d.ts +18 -0
  25. package/dist/internal/ast/primitives/imports/add-import.js +111 -0
  26. package/dist/internal/ast/primitives/imports/index.d.ts +2 -0
  27. package/dist/internal/ast/primitives/imports/index.js +2 -0
  28. package/dist/internal/ast/primitives/imports/remove-import.d.ts +15 -0
  29. package/dist/internal/ast/primitives/imports/remove-import.js +72 -0
  30. package/dist/internal/ast/primitives/index.d.ts +10 -0
  31. package/dist/internal/ast/primitives/index.js +10 -0
  32. package/dist/internal/ast/primitives/jsx/index.d.ts +4 -0
  33. package/dist/internal/ast/primitives/jsx/index.js +4 -0
  34. package/dist/internal/ast/primitives/jsx/insert-child.d.ts +11 -0
  35. package/dist/internal/ast/primitives/jsx/insert-child.js +69 -0
  36. package/dist/internal/ast/primitives/jsx/move-node.d.ts +9 -0
  37. package/dist/internal/ast/primitives/jsx/move-node.js +76 -0
  38. package/dist/internal/ast/primitives/jsx/remove-node.d.ts +7 -0
  39. package/dist/internal/ast/primitives/jsx/remove-node.js +36 -0
  40. package/dist/internal/ast/primitives/jsx/update-text.d.ts +8 -0
  41. package/dist/internal/ast/primitives/jsx/update-text.js +81 -0
  42. package/dist/internal/ast/primitives/next/index.d.ts +1 -0
  43. package/dist/internal/ast/primitives/next/index.js +1 -0
  44. package/dist/internal/ast/primitives/next/next-primitives.d.ts +43 -0
  45. package/dist/internal/ast/primitives/next/next-primitives.js +211 -0
  46. package/dist/internal/ast/primitives/shared.d.ts +60 -0
  47. package/dist/internal/ast/primitives/shared.js +176 -0
  48. package/dist/internal/ast/primitives/style/class-expression.d.ts +23 -0
  49. package/dist/internal/ast/primitives/style/class-expression.js +174 -0
  50. package/dist/internal/ast/primitives/style/index.d.ts +1 -0
  51. package/dist/internal/ast/primitives/style/index.js +1 -0
  52. package/dist/internal/ast/primitives/style/style-primitives.d.ts +49 -0
  53. package/dist/internal/ast/primitives/style/style-primitives.js +555 -0
  54. package/dist/internal/ast/primitives/values/index.d.ts +1 -0
  55. package/dist/internal/ast/primitives/values/index.js +1 -0
  56. package/dist/internal/ast/primitives/values/value-primitives.d.ts +42 -0
  57. package/dist/internal/ast/primitives/values/value-primitives.js +158 -0
  58. package/dist/internal/ast/printer/SourcePrinter.d.ts +21 -0
  59. package/dist/internal/ast/printer/SourcePrinter.js +76 -0
  60. package/dist/internal/ast/printer/index.d.ts +6 -0
  61. package/dist/internal/ast/printer/index.js +126 -0
  62. package/dist/internal/ast/types.d.ts +190 -0
  63. package/dist/internal/ast/types.js +1 -0
  64. package/dist/internal/capability/capability-resolver.d.ts +16 -0
  65. package/dist/internal/capability/capability-resolver.js +127 -0
  66. package/dist/internal/classname-source.d.ts +24 -0
  67. package/dist/internal/classname-source.js +220 -0
  68. package/dist/internal/contracts/IEditEngineRuntime.d.ts +18 -0
  69. package/dist/internal/contracts/IEditEngineRuntime.js +1 -0
  70. package/dist/internal/domain/EditDiagnostic.d.ts +38 -0
  71. package/dist/internal/domain/EditDiagnostic.js +43 -0
  72. package/dist/internal/events/event-bus.d.ts +14 -0
  73. package/dist/internal/events/event-bus.js +21 -0
  74. package/dist/internal/graph/graph-builder.d.ts +12 -0
  75. package/dist/internal/graph/graph-builder.js +1371 -0
  76. package/dist/internal/graph/import-resolver.d.ts +31 -0
  77. package/dist/internal/graph/import-resolver.js +109 -0
  78. package/dist/internal/graph/project-graph-builder.d.ts +32 -0
  79. package/dist/internal/graph/project-graph-builder.js +133 -0
  80. package/dist/internal/graph/types.d.ts +114 -0
  81. package/dist/internal/graph/types.js +6 -0
  82. package/dist/internal/history/undo-redo.d.ts +28 -0
  83. package/dist/internal/history/undo-redo.js +42 -0
  84. package/dist/internal/index.d.ts +2 -0
  85. package/dist/internal/index.js +1 -0
  86. package/dist/internal/planner/planner.d.ts +104 -0
  87. package/dist/internal/planner/planner.js +2533 -0
  88. package/dist/internal/planner/types.d.ts +275 -0
  89. package/dist/internal/planner/types.js +6 -0
  90. package/dist/internal/protocol/boundary.d.ts +10 -0
  91. package/dist/internal/protocol/boundary.js +3 -0
  92. package/dist/internal/protocol/capability.d.ts +47 -0
  93. package/dist/internal/protocol/capability.js +8 -0
  94. package/dist/internal/protocol/error.d.ts +43 -0
  95. package/dist/internal/protocol/error.js +38 -0
  96. package/dist/internal/protocol/event.d.ts +39 -0
  97. package/dist/internal/protocol/event.js +3 -0
  98. package/dist/internal/protocol/identity.d.ts +26 -0
  99. package/dist/internal/protocol/identity.js +30 -0
  100. package/dist/internal/protocol/operation.d.ts +224 -0
  101. package/dist/internal/protocol/operation.js +8 -0
  102. package/dist/internal/protocol/render.d.ts +212 -0
  103. package/dist/internal/protocol/render.js +3 -0
  104. package/dist/internal/protocol.d.ts +9 -0
  105. package/dist/internal/protocol.js +2 -0
  106. package/dist/internal/provenance/binding-graph.d.ts +39 -0
  107. package/dist/internal/provenance/binding-graph.js +184 -0
  108. package/dist/internal/provenance/capability-policy.d.ts +15 -0
  109. package/dist/internal/provenance/capability-policy.js +96 -0
  110. package/dist/internal/provenance/data-source-classifier.d.ts +14 -0
  111. package/dist/internal/provenance/data-source-classifier.js +281 -0
  112. package/dist/internal/provenance/resolve-text-provenance.d.ts +45 -0
  113. package/dist/internal/provenance/resolve-text-provenance.js +3090 -0
  114. package/dist/internal/provenance/types.d.ts +89 -0
  115. package/dist/internal/provenance/types.js +1 -0
  116. package/dist/internal/render/component-semantic.d.ts +11 -0
  117. package/dist/internal/render/component-semantic.js +141 -0
  118. package/dist/internal/render/content-model.d.ts +3 -0
  119. package/dist/internal/render/content-model.js +89 -0
  120. package/dist/internal/render/media-model.d.ts +3 -0
  121. package/dist/internal/render/media-model.js +45 -0
  122. package/dist/internal/render/provenance-types.d.ts +33 -0
  123. package/dist/internal/render/provenance-types.js +1 -0
  124. package/dist/internal/render/render-projection.d.ts +24 -0
  125. package/dist/internal/render/render-projection.js +281 -0
  126. package/dist/internal/render/tailwind-style-model.d.ts +19 -0
  127. package/dist/internal/render/tailwind-style-model.js +1187 -0
  128. package/dist/internal/runtime/EditEngineRuntime.d.ts +25 -0
  129. package/dist/internal/runtime/EditEngineRuntime.js +89 -0
  130. package/dist/internal/runtime/EditEngineRuntimeSnapshot.d.ts +31 -0
  131. package/dist/internal/runtime/EditEngineRuntimeSnapshot.js +15 -0
  132. package/dist/internal/runtime/InternalEditEngine.d.ts +44 -0
  133. package/dist/internal/runtime/InternalEditEngine.js +1391 -0
  134. package/dist/internal/runtime.d.ts +3 -0
  135. package/dist/internal/runtime.js +1 -0
  136. package/dist/internal/topology/topology.d.ts +6 -0
  137. package/dist/internal/topology/topology.js +98 -0
  138. package/dist/internal/topology/types.d.ts +35 -0
  139. package/dist/internal/topology/types.js +5 -0
  140. package/dist/internal/types.d.ts +1 -0
  141. package/dist/internal/types.js +1 -0
  142. package/dist/internal/writeback/in-memory-fs.d.ts +7 -0
  143. package/dist/internal/writeback/in-memory-fs.js +44 -0
  144. package/dist/internal/writeback/types.d.ts +45 -0
  145. package/dist/internal/writeback/types.js +7 -0
  146. package/dist/internal/writeback/writeback-service.d.ts +7 -0
  147. package/dist/internal/writeback/writeback-service.js +568 -0
  148. package/dist/internal-adapter.d.ts +18 -0
  149. package/dist/internal-adapter.js +350 -0
  150. package/dist/next-app-router-fs.d.ts +2 -0
  151. package/dist/next-app-router-fs.js +64 -0
  152. package/dist/next-app-router.d.ts +11 -0
  153. package/dist/next-app-router.js +140 -0
  154. package/dist/preview-runtime.d.ts +394 -0
  155. package/dist/preview-runtime.js +102 -0
  156. package/dist/public-file-system.d.ts +7 -0
  157. package/dist/public-file-system.js +1 -0
  158. package/dist/runtime-sync.d.ts +95 -0
  159. package/dist/runtime-sync.js +321 -0
  160. package/dist/runtime.d.ts +340 -0
  161. package/dist/runtime.js +134 -0
  162. package/dist/site-edit-instrumentation.d.ts +19 -0
  163. package/dist/site-edit-instrumentation.js +322 -0
  164. package/dist/snapshot-file-system.d.ts +19 -0
  165. package/dist/snapshot-file-system.js +49 -0
  166. package/dist/source-watcher.d.ts +20 -0
  167. package/dist/source-watcher.js +150 -0
  168. package/dist/source-writeback-test-harness.d.ts +244 -0
  169. package/dist/source-writeback-test-harness.js +119 -0
  170. package/dist/types.d.ts +68 -0
  171. package/dist/types.js +1 -0
  172. package/dist/webpack-loader.cjs +592 -0
  173. package/dist/webpack-loader.d.ts +27 -0
  174. package/package.json +66 -0
@@ -0,0 +1,394 @@
1
+ import type { PreviewSiteEditEngineRuntime, PreviewSiteEditEngineRuntimeOptions } from "./types.js";
2
+ export declare class PreviewFileSystemSiteEditEngineRuntime implements PreviewSiteEditEngineRuntime {
3
+ private readonly options;
4
+ private readonly engine;
5
+ private readonly listeners;
6
+ constructor(options: PreviewSiteEditEngineRuntimeOptions);
7
+ get status(): PreviewSiteEditEngineRuntime["status"];
8
+ registerRoute(routeId: string, entryFile: string): void;
9
+ setActiveRoute(routeId: string): Promise<void>;
10
+ getDocument(routeId: string): {
11
+ siteId: string;
12
+ snapshotId: string;
13
+ routeId: string;
14
+ version: number;
15
+ rootKeys: string[];
16
+ entries: {
17
+ key: string;
18
+ tag: string;
19
+ label: string;
20
+ parentKey: string | null;
21
+ childKeys: string[];
22
+ operationSummary: {
23
+ canUpdateText: boolean;
24
+ canInsertChild: boolean;
25
+ canMove: boolean;
26
+ canRemove: boolean;
27
+ };
28
+ }[];
29
+ };
30
+ getObjectCapabilities(key: string, routeId?: string): {
31
+ key: string;
32
+ canUpdateText: boolean;
33
+ canInsertChild: boolean;
34
+ canMove: boolean;
35
+ canRemove: boolean;
36
+ boundaryKind: "component-boundary" | "repeat-region" | "conditional-region" | "fragment-region" | "opaque-region" | null;
37
+ isOpaque: boolean;
38
+ };
39
+ getObjectSummary(key: string, routeId?: string): {
40
+ key: string;
41
+ tag: string;
42
+ label: string;
43
+ capabilities: {
44
+ constraints: {
45
+ kind: "component-boundary" | "repeat-region" | "conditional-region" | "opaque-region" | "void-element" | "read-only" | "cross-file-required" | "import-required";
46
+ message: string;
47
+ }[];
48
+ };
49
+ isOpaque: boolean;
50
+ ancestors: {
51
+ key: string;
52
+ label: string;
53
+ tag: string;
54
+ }[];
55
+ provenanceChain?: {
56
+ editMode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
57
+ diagnostics: {
58
+ code: string;
59
+ message: string;
60
+ }[];
61
+ } | undefined;
62
+ };
63
+ getObjectEditContext(key: string, routeId?: string): {
64
+ key: string;
65
+ componentName: string;
66
+ sourceFile: string;
67
+ capabilities: {
68
+ key: string;
69
+ canUpdateText: boolean;
70
+ canInsertChild: boolean;
71
+ canMove: boolean;
72
+ canRemove: boolean;
73
+ constraints: {
74
+ kind: "component-boundary" | "repeat-region" | "conditional-region" | "opaque-region" | "void-element" | "read-only" | "cross-file-required" | "import-required";
75
+ message: string;
76
+ }[];
77
+ editModes?: {
78
+ updateText?: {
79
+ mode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
80
+ reasonCode?: string | undefined;
81
+ } | undefined;
82
+ insertChild?: {
83
+ mode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
84
+ reasonCode?: string | undefined;
85
+ } | undefined;
86
+ move?: {
87
+ mode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
88
+ reasonCode?: string | undefined;
89
+ } | undefined;
90
+ remove?: {
91
+ mode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
92
+ reasonCode?: string | undefined;
93
+ } | undefined;
94
+ } | undefined;
95
+ };
96
+ writeTarget: {
97
+ kind: "jsx-node" | "component-proxy" | "value-binding" | "route-export";
98
+ file: string;
99
+ componentName: string;
100
+ isProxy: boolean;
101
+ };
102
+ textSegments: {
103
+ index: number;
104
+ value: string;
105
+ editable: boolean;
106
+ source: {
107
+ kind: "literal" | "binding" | "imported-binding" | "repeat-template";
108
+ file: string;
109
+ expression: string;
110
+ bindingName?: string | undefined;
111
+ path?: (string | number)[] | undefined;
112
+ } | null;
113
+ }[];
114
+ boundaryKind: "component-boundary" | "repeat-region" | "conditional-region" | "fragment-region" | "opaque-region" | null;
115
+ children: {
116
+ key: string;
117
+ label: string;
118
+ tag: string;
119
+ }[];
120
+ siblings: {
121
+ key: string;
122
+ label: string;
123
+ tag: string;
124
+ }[];
125
+ effectiveWriteTarget?: {
126
+ kind: "jsx-node" | "route-export" | "value-path" | "external-entry";
127
+ isProxy: boolean;
128
+ file?: string | undefined;
129
+ displayPath?: string | undefined;
130
+ sourceType?: "api-field" | "cms-field" | "i18n-message" | "config-entry" | undefined;
131
+ sourceId?: string | undefined;
132
+ } | undefined;
133
+ provenanceChain?: {
134
+ finalSource: {
135
+ kind: "api-field" | "cms-field" | "i18n-message" | "config-entry" | "binding" | "imported-binding" | "repeat-template" | "jsx-literal" | "component-prop" | "object-field" | "array-item" | "conditional-branch";
136
+ file: string;
137
+ displayPath: string;
138
+ externalSource?: {
139
+ sourceType: "api-field" | "cms-field" | "i18n-message" | "config-entry";
140
+ sourceId: string;
141
+ adapterId?: string | undefined;
142
+ } | undefined;
143
+ } | null;
144
+ chain: {
145
+ kind: "api-field" | "cms-field" | "i18n-message" | "config-entry" | "binding" | "imported-binding" | "repeat-template" | "jsx-literal" | "component-prop" | "object-field" | "array-item" | "conditional-branch";
146
+ file: string;
147
+ displayName: string;
148
+ canEditHere: boolean;
149
+ }[];
150
+ confidence: "exact" | "safe-derived" | "partial" | "unknown";
151
+ editMode: "direct" | "proxy" | "upstream" | "readonly" | "unsupported";
152
+ diagnostics: {
153
+ code: string;
154
+ message: string;
155
+ }[];
156
+ } | undefined;
157
+ componentSemantic?: Record<string, unknown> | undefined;
158
+ };
159
+ getObjectStyleDetail(key: string, routeId?: string): {
160
+ key: string;
161
+ styleSource?: {
162
+ kind: "class-name-source";
163
+ className: string;
164
+ sourceKind: "missing" | "static-attribute" | "static-expression" | "dynamic-expression";
165
+ editable: boolean;
166
+ operationBoundary: ("update-text" | "remove-node" | "insert-child" | "move-node" | "replace-rich-text-content" | "insert-rich-text-block" | "remove-rich-text-block" | "set-media-field" | "set-component-slot-content" | "set-object-field" | "insert-object-field" | "remove-object-field" | "update-array-item" | "insert-array-item" | "remove-array-item" | "move-array-item" | "replace-conditional-expression" | "set-conditional-branch-content" | "set-jsx-prop" | "remove-jsx-prop" | "set-class-name" | "add-class-token" | "remove-class-token" | "set-style-property" | "set-style-properties" | "set-css-module-class" | "set-directive" | "remove-directive" | "set-route-export" | "set-metadata-field" | "set-generate-metadata")[];
167
+ sourcePath?: string | undefined;
168
+ diagnostics?: {
169
+ code: "missing-class-name" | "dynamic-binding" | "non-string-binding";
170
+ message: string;
171
+ }[] | undefined;
172
+ } | undefined;
173
+ styleModel?: Record<string, unknown> | {
174
+ kind: "css-style-model";
175
+ properties: {
176
+ property: "display" | "position" | "top" | "right" | "bottom" | "left" | "zIndex" | "flexDirection" | "flexWrap" | "flexGrow" | "flexShrink" | "flexBasis" | "order" | "gridTemplateColumns" | "gridTemplateRows" | "columns" | "gridColumn" | "gridRow" | "gap" | "gapX" | "gapY" | "spaceX" | "spaceY" | "alignItems" | "justifyContent" | "marginTop" | "marginRight" | "marginBottom" | "marginLeft" | "paddingTop" | "paddingRight" | "paddingBottom" | "paddingLeft" | "width" | "height" | "minWidth" | "minHeight" | "maxWidth" | "maxHeight" | "overflow" | "fontFamily" | "fontSize" | "fontWeight" | "lineHeight" | "letterSpacing" | "textAlign" | "textTransform" | "textDecoration" | "textOverflow" | "textIndent" | "writingMode" | "whiteSpace" | "wordBreak" | "lineClamp" | "fontVariantNumeric" | "screenReaderOnly" | "color" | "backgroundColor" | "backgroundImage" | "borderStyle" | "borderWidth" | "borderRadius" | "borderColor" | "objectFit" | "objectPosition" | "aspectRatio" | "opacity" | "boxShadow" | "transform" | "transformOrigin" | "transitionProperty" | "transitionDuration" | "transitionTimingFunction" | "animation" | "pointerEvents" | "cursor" | "userSelect" | "fontStyle" | "textUnderlineOffset" | "scrollMarginTop" | "alignSelf" | "flex" | "outlineStyle" | "resize" | "ringWidth" | "ringColor" | "backdropFilter" | "overscrollBehavior" | "divideWidth" | "divideColor";
177
+ value: string | number | boolean | null;
178
+ editable: boolean;
179
+ resolvedValue?: string | number | boolean | null | undefined;
180
+ breakpoint?: "sm" | "md" | "lg" | "xl" | "2xl" | undefined;
181
+ state?: "hover" | "active" | "focus" | "disabled" | undefined;
182
+ variants?: string[] | undefined;
183
+ options?: (string | number)[] | undefined;
184
+ diagnostics?: {
185
+ code: string;
186
+ message: string;
187
+ }[] | undefined;
188
+ operationBoundary?: ("update-text" | "remove-node" | "insert-child" | "move-node" | "replace-rich-text-content" | "insert-rich-text-block" | "remove-rich-text-block" | "set-media-field" | "set-component-slot-content" | "set-object-field" | "insert-object-field" | "remove-object-field" | "update-array-item" | "insert-array-item" | "remove-array-item" | "move-array-item" | "replace-conditional-expression" | "set-conditional-branch-content" | "set-jsx-prop" | "remove-jsx-prop" | "set-class-name" | "add-class-token" | "remove-class-token" | "set-style-property" | "set-style-properties" | "set-css-module-class" | "set-directive" | "remove-directive" | "set-route-export" | "set-metadata-field" | "set-generate-metadata")[] | undefined;
189
+ }[];
190
+ } | undefined;
191
+ };
192
+ getObjectContentDetail(key: string, routeId?: string): {
193
+ key: string;
194
+ contentModel?: Record<string, unknown> | undefined;
195
+ };
196
+ getObjectMediaDetail(key: string, routeId?: string): {
197
+ key: string;
198
+ mediaModel?: Record<string, unknown> | undefined;
199
+ };
200
+ getClassNameSource(key: string, routeId?: string): {
201
+ key: string;
202
+ routeId: string;
203
+ filePath: string;
204
+ componentName: string;
205
+ sourceKind: "missing" | "expression" | "stringLiteral";
206
+ attrRaw: string | null;
207
+ valueRaw: string | null;
208
+ attrRange: {
209
+ start: number;
210
+ end: number;
211
+ startLine?: number | undefined;
212
+ startColumn?: number | undefined;
213
+ endLine?: number | undefined;
214
+ endColumn?: number | undefined;
215
+ } | null;
216
+ valueRange: {
217
+ start: number;
218
+ end: number;
219
+ startLine?: number | undefined;
220
+ startColumn?: number | undefined;
221
+ endLine?: number | undefined;
222
+ endColumn?: number | undefined;
223
+ } | null;
224
+ openingElementRange: {
225
+ start: number;
226
+ end: number;
227
+ startLine?: number | undefined;
228
+ startColumn?: number | undefined;
229
+ endLine?: number | undefined;
230
+ endColumn?: number | undefined;
231
+ };
232
+ version: {
233
+ documentVersion: number;
234
+ contentHash: string;
235
+ parserVersion: string;
236
+ };
237
+ diagnostics: {
238
+ code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
239
+ message: string;
240
+ }[];
241
+ };
242
+ setClassNameSource(request: Parameters<PreviewSiteEditEngineRuntime["setClassNameSource"]>[0]): Promise<{
243
+ ok: true;
244
+ source: {
245
+ key: string;
246
+ routeId: string;
247
+ filePath: string;
248
+ componentName: string;
249
+ sourceKind: "missing" | "expression" | "stringLiteral";
250
+ attrRaw: string | null;
251
+ valueRaw: string | null;
252
+ attrRange: {
253
+ start: number;
254
+ end: number;
255
+ startLine?: number | undefined;
256
+ startColumn?: number | undefined;
257
+ endLine?: number | undefined;
258
+ endColumn?: number | undefined;
259
+ } | null;
260
+ valueRange: {
261
+ start: number;
262
+ end: number;
263
+ startLine?: number | undefined;
264
+ startColumn?: number | undefined;
265
+ endLine?: number | undefined;
266
+ endColumn?: number | undefined;
267
+ } | null;
268
+ openingElementRange: {
269
+ start: number;
270
+ end: number;
271
+ startLine?: number | undefined;
272
+ startColumn?: number | undefined;
273
+ endLine?: number | undefined;
274
+ endColumn?: number | undefined;
275
+ };
276
+ version: {
277
+ documentVersion: number;
278
+ contentHash: string;
279
+ parserVersion: string;
280
+ };
281
+ diagnostics: {
282
+ code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
283
+ message: string;
284
+ }[];
285
+ };
286
+ } | {
287
+ ok: false;
288
+ reason: "node_not_found" | "document_version_stale" | "file_hash_mismatch" | "range_mismatch" | "old_attr_mismatch" | "invalid_new_attr" | "unsupported_target" | "write_failed";
289
+ diagnostics: {
290
+ code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
291
+ message: string;
292
+ }[];
293
+ current?: {
294
+ key: string;
295
+ routeId: string;
296
+ filePath: string;
297
+ componentName: string;
298
+ sourceKind: "missing" | "expression" | "stringLiteral";
299
+ attrRaw: string | null;
300
+ valueRaw: string | null;
301
+ attrRange: {
302
+ start: number;
303
+ end: number;
304
+ startLine?: number | undefined;
305
+ startColumn?: number | undefined;
306
+ endLine?: number | undefined;
307
+ endColumn?: number | undefined;
308
+ } | null;
309
+ valueRange: {
310
+ start: number;
311
+ end: number;
312
+ startLine?: number | undefined;
313
+ startColumn?: number | undefined;
314
+ endLine?: number | undefined;
315
+ endColumn?: number | undefined;
316
+ } | null;
317
+ openingElementRange: {
318
+ start: number;
319
+ end: number;
320
+ startLine?: number | undefined;
321
+ startColumn?: number | undefined;
322
+ endLine?: number | undefined;
323
+ endColumn?: number | undefined;
324
+ };
325
+ version: {
326
+ documentVersion: number;
327
+ contentHash: string;
328
+ parserVersion: string;
329
+ };
330
+ diagnostics: {
331
+ code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
332
+ message: string;
333
+ }[];
334
+ } | undefined;
335
+ }>;
336
+ executeOperation(request: Parameters<PreviewSiteEditEngineRuntime["executeOperation"]>[0]): Promise<{
337
+ requestId: string;
338
+ kind: "update-text" | "remove-node" | "insert-child" | "move-node" | "replace-rich-text-content" | "insert-rich-text-block" | "remove-rich-text-block" | "set-media-field" | "set-component-slot-content" | "set-object-field" | "insert-object-field" | "remove-object-field" | "update-array-item" | "insert-array-item" | "remove-array-item" | "move-array-item" | "replace-conditional-expression" | "set-conditional-branch-content" | "set-jsx-prop" | "remove-jsx-prop" | "set-class-name" | "add-class-token" | "remove-class-token" | "set-style-property" | "set-style-properties" | "set-css-module-class" | "set-directive" | "remove-directive" | "set-route-export" | "set-metadata-field" | "set-generate-metadata";
339
+ target: {
340
+ kind: "node";
341
+ key: string;
342
+ } | {
343
+ kind: "route";
344
+ routeId: string;
345
+ };
346
+ ok: boolean;
347
+ resultVersion: number;
348
+ error?: {
349
+ code: "NODE_NOT_FOUND" | "ROUTE_NOT_FOUND" | "CAPABILITY_REJECTED" | "CONSTRAINT_VIOLATED" | "INVALID_PARAMS" | "PLAN_FAILED" | "VERSION_STALE" | "AST_PARSE_ERROR" | "UNSUPPORTED_OPERATION" | "LOCATOR_FAILED" | "INVALID_TARGET" | "WRITE_IO_ERROR" | "CONCURRENT_MODIFIED" | "ROLLBACK_FAILED" | "INTERNAL_ERROR";
350
+ message: string;
351
+ details?: Record<string, unknown> | undefined;
352
+ } | undefined;
353
+ }>;
354
+ undo(): Promise<{
355
+ requestId: string;
356
+ kind: "update-text" | "remove-node" | "insert-child" | "move-node" | "replace-rich-text-content" | "insert-rich-text-block" | "remove-rich-text-block" | "set-media-field" | "set-component-slot-content" | "set-object-field" | "insert-object-field" | "remove-object-field" | "update-array-item" | "insert-array-item" | "remove-array-item" | "move-array-item" | "replace-conditional-expression" | "set-conditional-branch-content" | "set-jsx-prop" | "remove-jsx-prop" | "set-class-name" | "add-class-token" | "remove-class-token" | "set-style-property" | "set-style-properties" | "set-css-module-class" | "set-directive" | "remove-directive" | "set-route-export" | "set-metadata-field" | "set-generate-metadata";
357
+ target: {
358
+ kind: "node";
359
+ key: string;
360
+ } | {
361
+ kind: "route";
362
+ routeId: string;
363
+ };
364
+ ok: boolean;
365
+ resultVersion: number;
366
+ error?: {
367
+ code: "NODE_NOT_FOUND" | "ROUTE_NOT_FOUND" | "CAPABILITY_REJECTED" | "CONSTRAINT_VIOLATED" | "INVALID_PARAMS" | "PLAN_FAILED" | "VERSION_STALE" | "AST_PARSE_ERROR" | "UNSUPPORTED_OPERATION" | "LOCATOR_FAILED" | "INVALID_TARGET" | "WRITE_IO_ERROR" | "CONCURRENT_MODIFIED" | "ROLLBACK_FAILED" | "INTERNAL_ERROR";
368
+ message: string;
369
+ details?: Record<string, unknown> | undefined;
370
+ } | undefined;
371
+ }>;
372
+ redo(): Promise<{
373
+ requestId: string;
374
+ kind: "update-text" | "remove-node" | "insert-child" | "move-node" | "replace-rich-text-content" | "insert-rich-text-block" | "remove-rich-text-block" | "set-media-field" | "set-component-slot-content" | "set-object-field" | "insert-object-field" | "remove-object-field" | "update-array-item" | "insert-array-item" | "remove-array-item" | "move-array-item" | "replace-conditional-expression" | "set-conditional-branch-content" | "set-jsx-prop" | "remove-jsx-prop" | "set-class-name" | "add-class-token" | "remove-class-token" | "set-style-property" | "set-style-properties" | "set-css-module-class" | "set-directive" | "remove-directive" | "set-route-export" | "set-metadata-field" | "set-generate-metadata";
375
+ target: {
376
+ kind: "node";
377
+ key: string;
378
+ } | {
379
+ kind: "route";
380
+ routeId: string;
381
+ };
382
+ ok: boolean;
383
+ resultVersion: number;
384
+ error?: {
385
+ code: "NODE_NOT_FOUND" | "ROUTE_NOT_FOUND" | "CAPABILITY_REJECTED" | "CONSTRAINT_VIOLATED" | "INVALID_PARAMS" | "PLAN_FAILED" | "VERSION_STALE" | "AST_PARSE_ERROR" | "UNSUPPORTED_OPERATION" | "LOCATOR_FAILED" | "INVALID_TARGET" | "WRITE_IO_ERROR" | "CONCURRENT_MODIFIED" | "ROLLBACK_FAILED" | "INTERNAL_ERROR";
386
+ message: string;
387
+ details?: Record<string, unknown> | undefined;
388
+ } | undefined;
389
+ }>;
390
+ notifyFileChanged(file: string): void;
391
+ subscribe(listener: Parameters<PreviewSiteEditEngineRuntime["subscribe"]>[0]): () => void;
392
+ dispose(): void;
393
+ }
394
+ export declare function createPreviewSiteEditEngineRuntime(options: PreviewSiteEditEngineRuntimeOptions): PreviewSiteEditEngineRuntime;
@@ -0,0 +1,102 @@
1
+ import { toInternalOperationRequest, toSiteEditEvent, toSiteEditObjectContentDetail, toSiteEditObjectDetail, toSiteEditObjectEditContext, toSiteEditObjectMediaDetail, toSiteEditObjectStyleDetail, toSiteEditObjectSummary, toSiteEditOperationResult, toSiteEditRenderDocument, } from "./internal-adapter.js";
2
+ import { createEditEngineRuntime } from "./internal/runtime.js";
3
+ export class PreviewFileSystemSiteEditEngineRuntime {
4
+ constructor(options) {
5
+ this.options = options;
6
+ this.listeners = new Set();
7
+ this.engine = createEditEngineRuntime({
8
+ projectRoot: options.projectRoot,
9
+ fileSystem: options.fileSystem,
10
+ routes: options.routes.map((route) => ({
11
+ routeId: route.routeId,
12
+ entryFile: route.entryFile,
13
+ })),
14
+ onEvent: (event) => {
15
+ const siteEditEvent = toSiteEditEvent(event, {
16
+ siteId: options.siteId,
17
+ snapshotId: options.snapshotId,
18
+ });
19
+ if (siteEditEvent) {
20
+ options.onEvent?.(siteEditEvent);
21
+ for (const listener of this.listeners) {
22
+ listener(siteEditEvent);
23
+ }
24
+ }
25
+ },
26
+ dev: options.dev,
27
+ });
28
+ }
29
+ get status() {
30
+ return this.engine.status;
31
+ }
32
+ registerRoute(routeId, entryFile) {
33
+ this.engine.registerRoute(routeId, entryFile);
34
+ }
35
+ async setActiveRoute(routeId) {
36
+ await this.engine.setActiveRoute(routeId);
37
+ }
38
+ getDocument(routeId) {
39
+ return toSiteEditRenderDocument(this.engine.getDocument(routeId), {
40
+ siteId: this.options.siteId,
41
+ snapshotId: this.options.snapshotId,
42
+ });
43
+ }
44
+ getObjectCapabilities(key, routeId) {
45
+ const detail = toSiteEditObjectDetail(this.engine.getRenderDetail(key, routeId));
46
+ return {
47
+ key: detail.key,
48
+ canUpdateText: detail.capabilities.canUpdateText,
49
+ canInsertChild: detail.capabilities.canInsertChild,
50
+ canMove: detail.capabilities.canMove,
51
+ canRemove: detail.capabilities.canRemove,
52
+ boundaryKind: detail.boundaryKind,
53
+ isOpaque: detail.isOpaque,
54
+ };
55
+ }
56
+ getObjectSummary(key, routeId) {
57
+ return toSiteEditObjectSummary(this.engine.getRenderDetail(key, routeId));
58
+ }
59
+ getObjectEditContext(key, routeId) {
60
+ return toSiteEditObjectEditContext(this.engine.getRenderDetail(key, routeId));
61
+ }
62
+ getObjectStyleDetail(key, routeId) {
63
+ return toSiteEditObjectStyleDetail(this.engine.getRenderDetail(key, routeId));
64
+ }
65
+ getObjectContentDetail(key, routeId) {
66
+ return toSiteEditObjectContentDetail(this.engine.getRenderDetail(key, routeId));
67
+ }
68
+ getObjectMediaDetail(key, routeId) {
69
+ return toSiteEditObjectMediaDetail(this.engine.getRenderDetail(key, routeId));
70
+ }
71
+ getClassNameSource(key, routeId) {
72
+ return this.engine.getClassNameSource(key, routeId);
73
+ }
74
+ setClassNameSource(request) {
75
+ return this.engine.setClassNameSource(request);
76
+ }
77
+ async executeOperation(request) {
78
+ return toSiteEditOperationResult(await this.engine.execute(toInternalOperationRequest(request)));
79
+ }
80
+ async undo() {
81
+ return toSiteEditOperationResult(await this.engine.undo());
82
+ }
83
+ async redo() {
84
+ return toSiteEditOperationResult(await this.engine.redo());
85
+ }
86
+ notifyFileChanged(file) {
87
+ this.engine.notifyFileChanged(file);
88
+ }
89
+ subscribe(listener) {
90
+ this.listeners.add(listener);
91
+ return () => {
92
+ this.listeners.delete(listener);
93
+ };
94
+ }
95
+ dispose() {
96
+ this.listeners.clear();
97
+ this.engine.dispose();
98
+ }
99
+ }
100
+ export function createPreviewSiteEditEngineRuntime(options) {
101
+ return new PreviewFileSystemSiteEditEngineRuntime(options);
102
+ }
@@ -0,0 +1,7 @@
1
+ export interface SiteEditProjectFileSystem {
2
+ readFile(file: string): Promise<string>;
3
+ writeFile(file: string, content: string): Promise<void>;
4
+ exists(file: string): Promise<boolean>;
5
+ getVersion(file: string): number;
6
+ bumpVersion(file: string): number;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,95 @@
1
+ import type { SiteEditOperationRequest, SiteEditOperationResult, SiteEditOperationType, SiteEditRenderDocument } from "@trojanbox-vcp-test/contracts";
2
+ export declare const DEFAULT_SITE_EDIT_RUNTIME_READY_TIMEOUT_MS = 1500;
3
+ export declare const SITE_EDIT_RUNTIME_READY_POLL_INTERVAL_MS = 16;
4
+ export declare const SITE_EDIT_RUNTIME_ATTRIBUTES: {
5
+ readonly key: "data-vcp-edit-key";
6
+ readonly parentKey: "data-vcp-edit-parent-key";
7
+ readonly movable: "data-vcp-movable";
8
+ readonly removable: "data-vcp-removable";
9
+ readonly flags: "data-vcp-flags";
10
+ };
11
+ export type SiteEditRuntimeAttributes = {
12
+ readonly [key in keyof typeof SITE_EDIT_RUNTIME_ATTRIBUTES]: string;
13
+ };
14
+ export type SiteEditRenderDocumentDiff = {
15
+ added_keys: string[];
16
+ removed_keys: string[];
17
+ retained_keys: string[];
18
+ changed_parentKeys: string[];
19
+ changed_child_order_keys: string[];
20
+ };
21
+ export type SiteEditRuntimeElementSnapshot = {
22
+ key: string;
23
+ instance_index?: number;
24
+ instance_count?: number;
25
+ tag_name: string;
26
+ source_kind?: string;
27
+ componentName?: string;
28
+ sourceFile?: string;
29
+ parentKey?: string;
30
+ text_preview?: string;
31
+ attributes: Record<string, string>;
32
+ runtime_flags: {
33
+ editable: boolean;
34
+ movable: boolean;
35
+ removable: boolean;
36
+ text_editable: boolean;
37
+ container: boolean;
38
+ };
39
+ };
40
+ export type SiteEditRuntimeElementRef = {
41
+ key: string;
42
+ instance_index?: number;
43
+ instance_count?: number;
44
+ };
45
+ export type SiteEditQueryDocument = Pick<Document, "querySelector"> & Partial<Pick<Document, "querySelectorAll">>;
46
+ export type SiteEditRuntimeReadySuccess = {
47
+ ok: true;
48
+ version: number;
49
+ observed_keys: string[];
50
+ check: string;
51
+ };
52
+ export type SiteEditRuntimeReadyFailure = {
53
+ ok: false;
54
+ version: number;
55
+ reason: "missing-root" | "missing-target" | "removed-target-still-present" | "missing-added-key" | "missing-selected-key" | "text-mismatch" | "order-mismatch" | "unsupported-operation" | "timeout";
56
+ check: string;
57
+ message: string;
58
+ observed_keys?: string[];
59
+ };
60
+ export type SiteEditRuntimeReadyResult = SiteEditRuntimeReadySuccess | SiteEditRuntimeReadyFailure;
61
+ export type SiteEditRuntimeReadyInput = {
62
+ routeId: string;
63
+ previous_document: SiteEditRenderDocument;
64
+ next_document: SiteEditRenderDocument;
65
+ request?: SiteEditOperationRequest;
66
+ result: SiteEditOperationResult;
67
+ selected_key?: string | null;
68
+ timeout_ms?: number;
69
+ };
70
+ export declare function diffSiteEditRenderDocuments(previous_document: SiteEditRenderDocument, next_document: SiteEditRenderDocument): SiteEditRenderDocumentDiff;
71
+ export declare function isSiteEditRuntimeSyncedOperation(kind: SiteEditOperationType): boolean;
72
+ export declare class SiteEditRuntimeDomAdapter {
73
+ private readonly documentLike;
74
+ private readonly attributes;
75
+ constructor(documentLike?: SiteEditQueryDocument | null, attributes?: SiteEditRuntimeAttributes);
76
+ getKeyFromElement(element: Element): string | null;
77
+ findEditableElement(element: Element | null): Element | null;
78
+ findElementByKey(key: string): Element | null;
79
+ findElementByRef(ref: SiteEditRuntimeElementRef): Element | null;
80
+ snapshot(element: Element): SiteEditRuntimeElementSnapshot;
81
+ private resolveInstancePosition;
82
+ }
83
+ export declare class SiteEditRuntimeReadyProbe {
84
+ private readonly dom;
85
+ constructor(documentLike: SiteEditQueryDocument, attributes?: SiteEditRuntimeAttributes);
86
+ probe(input: SiteEditRuntimeReadyInput, diff?: SiteEditRenderDocumentDiff): SiteEditRuntimeReadyResult;
87
+ private checkOperationProjection;
88
+ private checkTextProjection;
89
+ private checkMovedNodeProjection;
90
+ private checkGenericDiffProjection;
91
+ private checkAddedKeys;
92
+ private isChildOrderReady;
93
+ }
94
+ export declare function getSiteEditNodeTargetKey(input?: Pick<SiteEditOperationRequest | SiteEditOperationResult, "target">): string | null;
95
+ export declare function hasSiteEditDocumentKey(document: SiteEditRenderDocument, key: string): boolean;