@trojanbox-vcp-test/site-edit-engine 0.1.0 → 0.2.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/index.d.ts +3 -0
- package/dist/index.js +127 -2
- package/dist/internal/protocol/operation.d.ts +2 -0
- package/dist/internal/protocol/render.d.ts +3 -30
- package/dist/internal/protocol.d.ts +1 -1
- package/dist/next-app-router.js +1 -140
- package/dist/preview-runtime.d.ts +249 -303
- package/dist/runtime-sync.d.ts +8 -8
- package/dist/runtime.d.ts +1 -127
- package/dist/site-edit-instrumentation.d.ts +1 -1
- package/dist/source-watcher.js +1 -150
- package/dist/types.d.ts +12 -14
- package/dist/webpack-loader.cjs +50 -588
- package/package.json +2 -2
- package/dist/execute-integration/execute-fixture-harness.d.ts +0 -25
- package/dist/execute-integration/execute-fixture-harness.js +0 -37
- package/dist/internal/ast/diagnostics/index.d.ts +0 -5
- package/dist/internal/ast/diagnostics/index.js +0 -25
- package/dist/internal/ast/history/index.d.ts +0 -15
- package/dist/internal/ast/history/index.js +0 -62
- package/dist/internal/ast/index.d.ts +0 -8
- package/dist/internal/ast/index.js +0 -5
- package/dist/internal/ast/locators/index.d.ts +0 -1
- package/dist/internal/ast/locators/index.js +0 -1
- package/dist/internal/ast/locators/resolve-locator.d.ts +0 -16
- package/dist/internal/ast/locators/resolve-locator.js +0 -920
- package/dist/internal/ast/parser/SourceParser.d.ts +0 -30
- package/dist/internal/ast/parser/SourceParser.js +0 -49
- package/dist/internal/ast/parser/index.d.ts +0 -21
- package/dist/internal/ast/parser/index.js +0 -64
- package/dist/internal/ast/primitives/conditional/conditional-primitives.d.ts +0 -18
- package/dist/internal/ast/primitives/conditional/conditional-primitives.js +0 -237
- package/dist/internal/ast/primitives/conditional/index.d.ts +0 -1
- package/dist/internal/ast/primitives/conditional/index.js +0 -1
- package/dist/internal/ast/primitives/imports/add-import.d.ts +0 -18
- package/dist/internal/ast/primitives/imports/add-import.js +0 -111
- package/dist/internal/ast/primitives/imports/index.d.ts +0 -2
- package/dist/internal/ast/primitives/imports/index.js +0 -2
- package/dist/internal/ast/primitives/imports/remove-import.d.ts +0 -15
- package/dist/internal/ast/primitives/imports/remove-import.js +0 -72
- package/dist/internal/ast/primitives/index.d.ts +0 -10
- package/dist/internal/ast/primitives/index.js +0 -10
- package/dist/internal/ast/primitives/jsx/index.d.ts +0 -4
- package/dist/internal/ast/primitives/jsx/index.js +0 -4
- package/dist/internal/ast/primitives/jsx/insert-child.d.ts +0 -11
- package/dist/internal/ast/primitives/jsx/insert-child.js +0 -69
- package/dist/internal/ast/primitives/jsx/move-node.d.ts +0 -9
- package/dist/internal/ast/primitives/jsx/move-node.js +0 -76
- package/dist/internal/ast/primitives/jsx/remove-node.d.ts +0 -7
- package/dist/internal/ast/primitives/jsx/remove-node.js +0 -36
- package/dist/internal/ast/primitives/jsx/update-text.d.ts +0 -8
- package/dist/internal/ast/primitives/jsx/update-text.js +0 -81
- package/dist/internal/ast/primitives/next/index.d.ts +0 -1
- package/dist/internal/ast/primitives/next/index.js +0 -1
- package/dist/internal/ast/primitives/next/next-primitives.d.ts +0 -43
- package/dist/internal/ast/primitives/next/next-primitives.js +0 -211
- package/dist/internal/ast/primitives/shared.d.ts +0 -60
- package/dist/internal/ast/primitives/shared.js +0 -176
- package/dist/internal/ast/primitives/style/class-expression.d.ts +0 -23
- package/dist/internal/ast/primitives/style/class-expression.js +0 -174
- package/dist/internal/ast/primitives/style/index.d.ts +0 -1
- package/dist/internal/ast/primitives/style/index.js +0 -1
- package/dist/internal/ast/primitives/style/style-primitives.d.ts +0 -49
- package/dist/internal/ast/primitives/style/style-primitives.js +0 -555
- package/dist/internal/ast/primitives/values/index.d.ts +0 -1
- package/dist/internal/ast/primitives/values/index.js +0 -1
- package/dist/internal/ast/primitives/values/value-primitives.d.ts +0 -42
- package/dist/internal/ast/primitives/values/value-primitives.js +0 -158
- package/dist/internal/ast/printer/SourcePrinter.d.ts +0 -21
- package/dist/internal/ast/printer/SourcePrinter.js +0 -76
- package/dist/internal/ast/printer/index.d.ts +0 -6
- package/dist/internal/ast/printer/index.js +0 -126
- package/dist/internal/ast/types.d.ts +0 -190
- package/dist/internal/ast/types.js +0 -1
- package/dist/internal/capability/capability-resolver.d.ts +0 -16
- package/dist/internal/capability/capability-resolver.js +0 -127
- package/dist/internal/classname-source.d.ts +0 -24
- package/dist/internal/classname-source.js +0 -220
- package/dist/internal/contracts/IEditEngineRuntime.d.ts +0 -18
- package/dist/internal/contracts/IEditEngineRuntime.js +0 -1
- package/dist/internal/domain/EditDiagnostic.d.ts +0 -38
- package/dist/internal/domain/EditDiagnostic.js +0 -43
- package/dist/internal/events/event-bus.d.ts +0 -14
- package/dist/internal/events/event-bus.js +0 -21
- package/dist/internal/graph/graph-builder.d.ts +0 -12
- package/dist/internal/graph/graph-builder.js +0 -1371
- package/dist/internal/graph/import-resolver.d.ts +0 -31
- package/dist/internal/graph/import-resolver.js +0 -109
- package/dist/internal/graph/project-graph-builder.d.ts +0 -32
- package/dist/internal/graph/project-graph-builder.js +0 -133
- package/dist/internal/graph/types.d.ts +0 -114
- package/dist/internal/graph/types.js +0 -6
- package/dist/internal/history/undo-redo.d.ts +0 -28
- package/dist/internal/history/undo-redo.js +0 -42
- package/dist/internal/index.d.ts +0 -2
- package/dist/internal/index.js +0 -1
- package/dist/internal/planner/planner.d.ts +0 -104
- package/dist/internal/planner/planner.js +0 -2533
- package/dist/internal/planner/types.d.ts +0 -275
- package/dist/internal/planner/types.js +0 -6
- package/dist/internal/protocol/boundary.js +0 -3
- package/dist/internal/protocol/capability.js +0 -8
- package/dist/internal/protocol/error.js +0 -38
- package/dist/internal/protocol/event.js +0 -3
- package/dist/internal/protocol/identity.js +0 -30
- package/dist/internal/protocol/operation.js +0 -8
- package/dist/internal/protocol/render.js +0 -3
- package/dist/internal/protocol.js +0 -2
- package/dist/internal/provenance/binding-graph.d.ts +0 -39
- package/dist/internal/provenance/binding-graph.js +0 -184
- package/dist/internal/provenance/capability-policy.d.ts +0 -15
- package/dist/internal/provenance/capability-policy.js +0 -96
- package/dist/internal/provenance/data-source-classifier.d.ts +0 -14
- package/dist/internal/provenance/data-source-classifier.js +0 -281
- package/dist/internal/provenance/resolve-text-provenance.d.ts +0 -45
- package/dist/internal/provenance/resolve-text-provenance.js +0 -3090
- package/dist/internal/provenance/types.d.ts +0 -89
- package/dist/internal/provenance/types.js +0 -1
- package/dist/internal/render/component-semantic.d.ts +0 -11
- package/dist/internal/render/component-semantic.js +0 -141
- package/dist/internal/render/content-model.d.ts +0 -3
- package/dist/internal/render/content-model.js +0 -89
- package/dist/internal/render/media-model.d.ts +0 -3
- package/dist/internal/render/media-model.js +0 -45
- package/dist/internal/render/provenance-types.d.ts +0 -33
- package/dist/internal/render/provenance-types.js +0 -1
- package/dist/internal/render/render-projection.d.ts +0 -24
- package/dist/internal/render/render-projection.js +0 -281
- package/dist/internal/render/tailwind-style-model.d.ts +0 -19
- package/dist/internal/render/tailwind-style-model.js +0 -1187
- package/dist/internal/runtime/EditEngineRuntime.d.ts +0 -25
- package/dist/internal/runtime/EditEngineRuntime.js +0 -89
- package/dist/internal/runtime/EditEngineRuntimeSnapshot.d.ts +0 -31
- package/dist/internal/runtime/EditEngineRuntimeSnapshot.js +0 -15
- package/dist/internal/runtime/InternalEditEngine.d.ts +0 -44
- package/dist/internal/runtime/InternalEditEngine.js +0 -1391
- package/dist/internal/runtime.d.ts +0 -3
- package/dist/internal/runtime.js +0 -1
- package/dist/internal/topology/topology.d.ts +0 -6
- package/dist/internal/topology/topology.js +0 -98
- package/dist/internal/topology/types.d.ts +0 -35
- package/dist/internal/topology/types.js +0 -5
- package/dist/internal/types.d.ts +0 -1
- package/dist/internal/types.js +0 -1
- package/dist/internal/writeback/in-memory-fs.d.ts +0 -7
- package/dist/internal/writeback/in-memory-fs.js +0 -44
- package/dist/internal/writeback/types.d.ts +0 -45
- package/dist/internal/writeback/types.js +0 -7
- package/dist/internal/writeback/writeback-service.d.ts +0 -7
- package/dist/internal/writeback/writeback-service.js +0 -568
- package/dist/internal-adapter.d.ts +0 -18
- package/dist/internal-adapter.js +0 -350
- package/dist/next-app-router-fs.js +0 -64
- package/dist/preview-runtime.js +0 -102
- package/dist/public-file-system.js +0 -1
- package/dist/runtime-sync.js +0 -321
- package/dist/runtime.js +0 -134
- package/dist/site-edit-instrumentation.js +0 -322
- package/dist/snapshot-file-system.d.ts +0 -19
- package/dist/snapshot-file-system.js +0 -49
- package/dist/source-writeback-test-harness.d.ts +0 -244
- package/dist/source-writeback-test-harness.js +0 -119
- package/dist/types.js +0 -1
package/dist/runtime-sync.d.ts
CHANGED
|
@@ -12,24 +12,24 @@ export type SiteEditRuntimeAttributes = {
|
|
|
12
12
|
readonly [key in keyof typeof SITE_EDIT_RUNTIME_ATTRIBUTES]: string;
|
|
13
13
|
};
|
|
14
14
|
export type SiteEditRenderDocumentDiff = {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
addedKeys: string[];
|
|
16
|
+
removedKeys: string[];
|
|
17
|
+
retainedKeys: string[];
|
|
18
18
|
changed_parentKeys: string[];
|
|
19
|
-
|
|
19
|
+
changedChildOrderKeys: string[];
|
|
20
20
|
};
|
|
21
21
|
export type SiteEditRuntimeElementSnapshot = {
|
|
22
22
|
key: string;
|
|
23
23
|
instance_index?: number;
|
|
24
24
|
instance_count?: number;
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
tagName: string;
|
|
26
|
+
sourceKind?: string;
|
|
27
27
|
componentName?: string;
|
|
28
28
|
sourceFile?: string;
|
|
29
29
|
parentKey?: string;
|
|
30
30
|
text_preview?: string;
|
|
31
31
|
attributes: Record<string, string>;
|
|
32
|
-
|
|
32
|
+
runtimeFlags: {
|
|
33
33
|
editable: boolean;
|
|
34
34
|
movable: boolean;
|
|
35
35
|
removable: boolean;
|
|
@@ -64,7 +64,7 @@ export type SiteEditRuntimeReadyInput = {
|
|
|
64
64
|
next_document: SiteEditRenderDocument;
|
|
65
65
|
request?: SiteEditOperationRequest;
|
|
66
66
|
result: SiteEditOperationResult;
|
|
67
|
-
|
|
67
|
+
selectedKey?: string | null;
|
|
68
68
|
timeout_ms?: number;
|
|
69
69
|
};
|
|
70
70
|
export declare function diffSiteEditRenderDocuments(previous_document: SiteEditRenderDocument, next_document: SiteEditRenderDocument): SiteEditRenderDocumentDiff;
|
package/dist/runtime.d.ts
CHANGED
|
@@ -155,39 +155,6 @@ export declare class SnapshotSiteEditEngineRuntime implements SiteEditEngineRunt
|
|
|
155
155
|
} | undefined;
|
|
156
156
|
componentSemantic?: Record<string, unknown> | undefined;
|
|
157
157
|
};
|
|
158
|
-
getObjectStyleDetail(key: string, routeId?: string): {
|
|
159
|
-
key: string;
|
|
160
|
-
styleSource?: {
|
|
161
|
-
kind: "class-name-source";
|
|
162
|
-
className: string;
|
|
163
|
-
sourceKind: "missing" | "static-attribute" | "static-expression" | "dynamic-expression";
|
|
164
|
-
editable: boolean;
|
|
165
|
-
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")[];
|
|
166
|
-
sourcePath?: string | undefined;
|
|
167
|
-
diagnostics?: {
|
|
168
|
-
code: "missing-class-name" | "dynamic-binding" | "non-string-binding";
|
|
169
|
-
message: string;
|
|
170
|
-
}[] | undefined;
|
|
171
|
-
} | undefined;
|
|
172
|
-
styleModel?: Record<string, unknown> | {
|
|
173
|
-
kind: "css-style-model";
|
|
174
|
-
properties: {
|
|
175
|
-
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";
|
|
176
|
-
value: string | number | boolean | null;
|
|
177
|
-
editable: boolean;
|
|
178
|
-
resolvedValue?: string | number | boolean | null | undefined;
|
|
179
|
-
breakpoint?: "sm" | "md" | "lg" | "xl" | "2xl" | undefined;
|
|
180
|
-
state?: "hover" | "active" | "focus" | "disabled" | undefined;
|
|
181
|
-
variants?: string[] | undefined;
|
|
182
|
-
options?: (string | number)[] | undefined;
|
|
183
|
-
diagnostics?: {
|
|
184
|
-
code: string;
|
|
185
|
-
message: string;
|
|
186
|
-
}[] | undefined;
|
|
187
|
-
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;
|
|
188
|
-
}[];
|
|
189
|
-
} | undefined;
|
|
190
|
-
};
|
|
191
158
|
getObjectContentDetail(key: string, routeId?: string): {
|
|
192
159
|
key: string;
|
|
193
160
|
contentModel?: Record<string, unknown> | undefined;
|
|
@@ -238,100 +205,7 @@ export declare class SnapshotSiteEditEngineRuntime implements SiteEditEngineRunt
|
|
|
238
205
|
message: string;
|
|
239
206
|
}[];
|
|
240
207
|
};
|
|
241
|
-
setClassNameSource(request: Parameters<SiteEditEngineRuntime["setClassNameSource"]>[0]): Promise<
|
|
242
|
-
ok: true;
|
|
243
|
-
source: {
|
|
244
|
-
key: string;
|
|
245
|
-
routeId: string;
|
|
246
|
-
filePath: string;
|
|
247
|
-
componentName: string;
|
|
248
|
-
sourceKind: "missing" | "expression" | "stringLiteral";
|
|
249
|
-
attrRaw: string | null;
|
|
250
|
-
valueRaw: string | null;
|
|
251
|
-
attrRange: {
|
|
252
|
-
start: number;
|
|
253
|
-
end: number;
|
|
254
|
-
startLine?: number | undefined;
|
|
255
|
-
startColumn?: number | undefined;
|
|
256
|
-
endLine?: number | undefined;
|
|
257
|
-
endColumn?: number | undefined;
|
|
258
|
-
} | null;
|
|
259
|
-
valueRange: {
|
|
260
|
-
start: number;
|
|
261
|
-
end: number;
|
|
262
|
-
startLine?: number | undefined;
|
|
263
|
-
startColumn?: number | undefined;
|
|
264
|
-
endLine?: number | undefined;
|
|
265
|
-
endColumn?: number | undefined;
|
|
266
|
-
} | null;
|
|
267
|
-
openingElementRange: {
|
|
268
|
-
start: number;
|
|
269
|
-
end: number;
|
|
270
|
-
startLine?: number | undefined;
|
|
271
|
-
startColumn?: number | undefined;
|
|
272
|
-
endLine?: number | undefined;
|
|
273
|
-
endColumn?: number | undefined;
|
|
274
|
-
};
|
|
275
|
-
version: {
|
|
276
|
-
documentVersion: number;
|
|
277
|
-
contentHash: string;
|
|
278
|
-
parserVersion: string;
|
|
279
|
-
};
|
|
280
|
-
diagnostics: {
|
|
281
|
-
code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
|
|
282
|
-
message: string;
|
|
283
|
-
}[];
|
|
284
|
-
};
|
|
285
|
-
} | {
|
|
286
|
-
ok: false;
|
|
287
|
-
reason: "node_not_found" | "document_version_stale" | "file_hash_mismatch" | "range_mismatch" | "old_attr_mismatch" | "invalid_new_attr" | "unsupported_target" | "write_failed";
|
|
288
|
-
diagnostics: {
|
|
289
|
-
code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
|
|
290
|
-
message: string;
|
|
291
|
-
}[];
|
|
292
|
-
current?: {
|
|
293
|
-
key: string;
|
|
294
|
-
routeId: string;
|
|
295
|
-
filePath: string;
|
|
296
|
-
componentName: string;
|
|
297
|
-
sourceKind: "missing" | "expression" | "stringLiteral";
|
|
298
|
-
attrRaw: string | null;
|
|
299
|
-
valueRaw: string | null;
|
|
300
|
-
attrRange: {
|
|
301
|
-
start: number;
|
|
302
|
-
end: number;
|
|
303
|
-
startLine?: number | undefined;
|
|
304
|
-
startColumn?: number | undefined;
|
|
305
|
-
endLine?: number | undefined;
|
|
306
|
-
endColumn?: number | undefined;
|
|
307
|
-
} | null;
|
|
308
|
-
valueRange: {
|
|
309
|
-
start: number;
|
|
310
|
-
end: number;
|
|
311
|
-
startLine?: number | undefined;
|
|
312
|
-
startColumn?: number | undefined;
|
|
313
|
-
endLine?: number | undefined;
|
|
314
|
-
endColumn?: number | undefined;
|
|
315
|
-
} | null;
|
|
316
|
-
openingElementRange: {
|
|
317
|
-
start: number;
|
|
318
|
-
end: number;
|
|
319
|
-
startLine?: number | undefined;
|
|
320
|
-
startColumn?: number | undefined;
|
|
321
|
-
endLine?: number | undefined;
|
|
322
|
-
endColumn?: number | undefined;
|
|
323
|
-
};
|
|
324
|
-
version: {
|
|
325
|
-
documentVersion: number;
|
|
326
|
-
contentHash: string;
|
|
327
|
-
parserVersion: string;
|
|
328
|
-
};
|
|
329
|
-
diagnostics: {
|
|
330
|
-
code: "missing-class-name" | "unsupported-attribute-name" | "source-locator-warning" | "invalid-new-attr" | "version-conflict" | "write-failed";
|
|
331
|
-
message: string;
|
|
332
|
-
}[];
|
|
333
|
-
} | undefined;
|
|
334
|
-
}>;
|
|
208
|
+
setClassNameSource(request: Parameters<SiteEditEngineRuntime["setClassNameSource"]>[0]): Promise<import("@trojanbox-vcp-test/contracts").SiteEditSetClassNameSourceResult>;
|
|
335
209
|
planOperation(request: Parameters<SiteEditEngineRuntime["planOperation"]>[0]): Promise<SiteEditPlanOperationResult>;
|
|
336
210
|
dispose(): void;
|
|
337
211
|
private createEngine;
|
|
@@ -10,7 +10,7 @@ export type SiteEditInstrumentedElement = {
|
|
|
10
10
|
tag: string;
|
|
11
11
|
componentName: string;
|
|
12
12
|
sourceFile: string;
|
|
13
|
-
|
|
13
|
+
sourceKind: "jsx" | "component-call";
|
|
14
14
|
};
|
|
15
15
|
export type SiteEditInstrumentationResult = {
|
|
16
16
|
code: string;
|
package/dist/source-watcher.js
CHANGED
|
@@ -1,150 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
const defaultWatchDirs = [
|
|
4
|
-
"app",
|
|
5
|
-
"src/app",
|
|
6
|
-
"components",
|
|
7
|
-
"src/components",
|
|
8
|
-
"lib",
|
|
9
|
-
"src/lib",
|
|
10
|
-
];
|
|
11
|
-
const sourceFilePattern = /\.(?:tsx|ts|jsx|js|mjs|cjs|css|scss|sass)$/;
|
|
12
|
-
const ignoredPathPattern = /^(?:\.next|node_modules|\.git)(?:\/|$)/;
|
|
13
|
-
export class SiteEditSourceWatcher {
|
|
14
|
-
constructor(options) {
|
|
15
|
-
this.options = options;
|
|
16
|
-
this.watchers = [];
|
|
17
|
-
this.fileMtimes = new Map();
|
|
18
|
-
this.pollingTimer = null;
|
|
19
|
-
this.isPolling = false;
|
|
20
|
-
}
|
|
21
|
-
start() {
|
|
22
|
-
for (const relativeDirectory of this.getWatchDirs()) {
|
|
23
|
-
const baseDir = path.join(this.options.projectRoot, relativeDirectory);
|
|
24
|
-
if (!fs.existsSync(baseDir)) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (this.registerWatcher(baseDir, true)) {
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
for (const nestedDir of collectSubdirectories(baseDir)) {
|
|
31
|
-
this.registerWatcher(nestedDir, false);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
this.scanFiles();
|
|
35
|
-
this.pollingTimer = setInterval(() => this.poll(), this.options.interval_ms ?? 1_000);
|
|
36
|
-
return () => this.stop();
|
|
37
|
-
}
|
|
38
|
-
stop() {
|
|
39
|
-
if (this.pollingTimer) {
|
|
40
|
-
clearInterval(this.pollingTimer);
|
|
41
|
-
this.pollingTimer = null;
|
|
42
|
-
}
|
|
43
|
-
for (const watcher of this.watchers) {
|
|
44
|
-
watcher.close();
|
|
45
|
-
}
|
|
46
|
-
this.watchers.length = 0;
|
|
47
|
-
}
|
|
48
|
-
getWatchDirs() {
|
|
49
|
-
return this.options.watch_dirs?.length
|
|
50
|
-
? this.options.watch_dirs
|
|
51
|
-
: defaultWatchDirs;
|
|
52
|
-
}
|
|
53
|
-
registerWatcher(baseDir, recursive) {
|
|
54
|
-
try {
|
|
55
|
-
const watcher = fs.watch(baseDir, { recursive }, (_eventType, filename) => {
|
|
56
|
-
const changedFile = normalizeChangedFile(this.options.projectRoot, baseDir, filename);
|
|
57
|
-
if (changedFile) {
|
|
58
|
-
this.options.on_change(changedFile);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
this.watchers.push(watcher);
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
poll() {
|
|
69
|
-
if (this.isPolling) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
this.isPolling = true;
|
|
73
|
-
try {
|
|
74
|
-
this.scanFiles();
|
|
75
|
-
}
|
|
76
|
-
finally {
|
|
77
|
-
this.isPolling = false;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
scanFiles() {
|
|
81
|
-
for (const relativeDirectory of this.getWatchDirs()) {
|
|
82
|
-
const baseDir = path.join(this.options.projectRoot, relativeDirectory);
|
|
83
|
-
if (!fs.existsSync(baseDir)) {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
for (const absoluteFile of collectWatchedFiles(this.options.projectRoot, baseDir)) {
|
|
87
|
-
try {
|
|
88
|
-
const stat = fs.statSync(absoluteFile);
|
|
89
|
-
const relativeFile = toProjectRelativePath(this.options.projectRoot, absoluteFile);
|
|
90
|
-
const previousMtime = this.fileMtimes.get(relativeFile);
|
|
91
|
-
if (previousMtime !== undefined && previousMtime !== stat.mtimeMs) {
|
|
92
|
-
this.options.on_change(relativeFile);
|
|
93
|
-
}
|
|
94
|
-
this.fileMtimes.set(relativeFile, stat.mtimeMs);
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
// Files can disappear while Next is recompiling; the next scan settles state.
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
function collectSubdirectories(baseDir) {
|
|
104
|
-
const directories = [baseDir];
|
|
105
|
-
for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {
|
|
106
|
-
if (!entry.isDirectory() ||
|
|
107
|
-
entry.name.startsWith(".") ||
|
|
108
|
-
entry.name === "node_modules") {
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
directories.push(...collectSubdirectories(path.join(baseDir, entry.name)));
|
|
112
|
-
}
|
|
113
|
-
return directories;
|
|
114
|
-
}
|
|
115
|
-
function collectWatchedFiles(projectRoot, baseDir) {
|
|
116
|
-
const files = [];
|
|
117
|
-
for (const entry of fs.readdirSync(baseDir, { withFileTypes: true })) {
|
|
118
|
-
const absolutePath = path.join(baseDir, entry.name);
|
|
119
|
-
if (entry.isDirectory()) {
|
|
120
|
-
if (entry.name.startsWith(".") || entry.name === "node_modules") {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
files.push(...collectWatchedFiles(projectRoot, absolutePath));
|
|
124
|
-
continue;
|
|
125
|
-
}
|
|
126
|
-
const relativeFile = toProjectRelativePath(projectRoot, absolutePath);
|
|
127
|
-
if (!ignoredPathPattern.test(relativeFile) &&
|
|
128
|
-
sourceFilePattern.test(relativeFile)) {
|
|
129
|
-
files.push(absolutePath);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return files;
|
|
133
|
-
}
|
|
134
|
-
function normalizeChangedFile(projectRoot, baseDir, filename) {
|
|
135
|
-
if (!filename) {
|
|
136
|
-
return null;
|
|
137
|
-
}
|
|
138
|
-
const absoluteFile = path.join(baseDir, filename.toString());
|
|
139
|
-
const relativeFile = toProjectRelativePath(projectRoot, absoluteFile);
|
|
140
|
-
if (!relativeFile ||
|
|
141
|
-
relativeFile.startsWith("..") ||
|
|
142
|
-
ignoredPathPattern.test(relativeFile) ||
|
|
143
|
-
!sourceFilePattern.test(relativeFile)) {
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
return relativeFile;
|
|
147
|
-
}
|
|
148
|
-
function toProjectRelativePath(projectRoot, absoluteFile) {
|
|
149
|
-
return path.relative(projectRoot, absoluteFile).replace(/\\/g, "/");
|
|
150
|
-
}
|
|
1
|
+
import r from"node:fs";import c from"node:path";var g=["app","src/app","components","src/components","lib","src/lib"],u=/\.(?:tsx|ts|jsx|js|mjs|cjs|css|scss|sass)$/,f=/^(?:\.next|node_modules|\.git)(?:\/|$)/,a=class{constructor(t){this.options=t,this.watchers=[],this.fileMtimes=new Map,this.pollingTimer=null,this.isPolling=!1}start(){for(let t of this.getWatchDirs()){let s=c.join(this.options.projectRoot,t);if(r.existsSync(s)&&!this.registerWatcher(s,!0))for(let i of p(s))this.registerWatcher(i,!1)}return this.scanFiles(),this.pollingTimer=setInterval(()=>this.poll(),this.options.interval_ms??1e3),()=>this.stop()}stop(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null);for(let t of this.watchers)t.close();this.watchers.length=0}getWatchDirs(){return this.options.watch_dirs?.length?this.options.watch_dirs:g}registerWatcher(t,s){try{let i=r.watch(t,{recursive:s},(e,n)=>{let l=d(this.options.projectRoot,t,n);l&&this.options.on_change(l)});return this.watchers.push(i),!0}catch{return!1}}poll(){if(!this.isPolling){this.isPolling=!0;try{this.scanFiles()}finally{this.isPolling=!1}}}scanFiles(){for(let t of this.getWatchDirs()){let s=c.join(this.options.projectRoot,t);if(r.existsSync(s))for(let i of m(this.options.projectRoot,s))try{let e=r.statSync(i),n=h(this.options.projectRoot,i),l=this.fileMtimes.get(n);l!==void 0&&l!==e.mtimeMs&&this.options.on_change(n),this.fileMtimes.set(n,e.mtimeMs)}catch{}}}};function p(o){let t=[o];for(let s of r.readdirSync(o,{withFileTypes:!0}))!s.isDirectory()||s.name.startsWith(".")||s.name==="node_modules"||t.push(...p(c.join(o,s.name)));return t}function m(o,t){let s=[];for(let i of r.readdirSync(t,{withFileTypes:!0})){let e=c.join(t,i.name);if(i.isDirectory()){if(i.name.startsWith(".")||i.name==="node_modules")continue;s.push(...m(o,e));continue}let n=h(o,e);!f.test(n)&&u.test(n)&&s.push(e)}return s}function d(o,t,s){if(!s)return null;let i=c.join(t,s.toString()),e=h(o,i);return!e||e.startsWith("..")||f.test(e)||!u.test(e)?null:e}function h(o,t){return c.relative(o,t).replace(/\\/g,"/")}export{a as SiteEditSourceWatcher};
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SiteEditEvent, SiteEditGetClassNameSourceResult, SiteEditObjectCapabilities, SiteEditObjectContentDetail, SiteEditObjectEditContext, SiteEditObjectMediaDetail,
|
|
1
|
+
import type { SiteEditCommandSuccess, SiteEditEvent, SiteEditGetClassNameSourceCommandResult, SiteEditGetClassNameSourceResult, SiteEditObjectCapabilities, SiteEditObjectContentDetail, SiteEditObjectEditContext, SiteEditObjectMediaDetail, SiteEditObjectSummary, SiteEditOperationCommandResult, SiteEditOperationRequest, SiteEditPatchPlan, SiteEditRenderDocument, SiteEditSetClassNameSourceRequest, SiteEditSetClassNameSourceResult } from "@trojanbox-vcp-test/contracts";
|
|
2
2
|
import type { SiteEditProjectFileSystem } from "./public-file-system.js";
|
|
3
3
|
export type { SiteEditProjectFileSystem } from "./public-file-system.js";
|
|
4
4
|
export interface SiteEditSnapshotFile {
|
|
@@ -19,7 +19,7 @@ export interface SiteEditEngineRuntimeOptions {
|
|
|
19
19
|
dev?: boolean;
|
|
20
20
|
}
|
|
21
21
|
export interface SiteEditPlanOperationResult {
|
|
22
|
-
result:
|
|
22
|
+
result: SiteEditOperationCommandResult;
|
|
23
23
|
patchPlan?: SiteEditPatchPlan;
|
|
24
24
|
}
|
|
25
25
|
export interface SiteEditEngineRuntime {
|
|
@@ -29,7 +29,6 @@ export interface SiteEditEngineRuntime {
|
|
|
29
29
|
getObjectCapabilities(key: string, routeId?: string): SiteEditObjectCapabilities;
|
|
30
30
|
getObjectSummary(key: string, routeId?: string): SiteEditObjectSummary;
|
|
31
31
|
getObjectEditContext(key: string, routeId?: string): SiteEditObjectEditContext;
|
|
32
|
-
getObjectStyleDetail(key: string, routeId?: string): SiteEditObjectStyleDetail;
|
|
33
32
|
getObjectContentDetail(key: string, routeId?: string): SiteEditObjectContentDetail;
|
|
34
33
|
getObjectMediaDetail(key: string, routeId?: string): SiteEditObjectMediaDetail;
|
|
35
34
|
getClassNameSource(key: string, routeId?: string): SiteEditGetClassNameSourceResult;
|
|
@@ -50,18 +49,17 @@ export interface PreviewSiteEditEngineRuntime {
|
|
|
50
49
|
readonly status: "idle" | "building" | "ready" | "error" | "disposed";
|
|
51
50
|
registerRoute(routeId: string, entryFile: string): void;
|
|
52
51
|
setActiveRoute(routeId: string): Promise<void>;
|
|
53
|
-
getDocument(routeId: string): SiteEditRenderDocument
|
|
54
|
-
getObjectCapabilities(key: string, routeId?: string): SiteEditObjectCapabilities
|
|
55
|
-
getObjectSummary(key: string, routeId?: string): SiteEditObjectSummary
|
|
56
|
-
getObjectEditContext(key: string, routeId?: string): SiteEditObjectEditContext
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
getClassNameSource(key: string, routeId?: string): SiteEditGetClassNameSourceResult;
|
|
52
|
+
getDocument(routeId: string): SiteEditCommandSuccess<SiteEditRenderDocument>;
|
|
53
|
+
getObjectCapabilities(key: string, routeId?: string): SiteEditCommandSuccess<SiteEditObjectCapabilities>;
|
|
54
|
+
getObjectSummary(key: string, routeId?: string): SiteEditCommandSuccess<SiteEditObjectSummary>;
|
|
55
|
+
getObjectEditContext(key: string, routeId?: string): SiteEditCommandSuccess<SiteEditObjectEditContext>;
|
|
56
|
+
getObjectContentDetail(key: string, routeId?: string): SiteEditCommandSuccess<SiteEditObjectContentDetail>;
|
|
57
|
+
getObjectMediaDetail(key: string, routeId?: string): SiteEditCommandSuccess<SiteEditObjectMediaDetail>;
|
|
58
|
+
getClassNameSource(key: string, routeId?: string): SiteEditGetClassNameSourceCommandResult;
|
|
61
59
|
setClassNameSource(request: SiteEditSetClassNameSourceRequest): Promise<SiteEditSetClassNameSourceResult>;
|
|
62
|
-
executeOperation(request: SiteEditOperationRequest): Promise<
|
|
63
|
-
undo(): Promise<
|
|
64
|
-
redo(): Promise<
|
|
60
|
+
executeOperation(request: SiteEditOperationRequest): Promise<SiteEditOperationCommandResult>;
|
|
61
|
+
undo(): Promise<SiteEditOperationCommandResult>;
|
|
62
|
+
redo(): Promise<SiteEditOperationCommandResult>;
|
|
65
63
|
notifyFileChanged(file: string): void;
|
|
66
64
|
subscribe(listener: (event: SiteEditEvent) => void): () => void;
|
|
67
65
|
dispose(): void;
|