rn-studio 0.2.1 → 0.3.1
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/bin/rn-studio-init.js +173 -0
- package/bin/rn-studio-server.js +143 -15
- package/dist/StudioProvider.d.ts +5 -18
- package/dist/StudioProvider.d.ts.map +1 -1
- package/dist/StudioProvider.js +190 -41
- package/dist/StudioProvider.js.map +1 -1
- package/dist/ast/AstEngine.d.ts.map +1 -1
- package/dist/ast/AstEngine.js +17 -0
- package/dist/ast/AstEngine.js.map +1 -1
- package/dist/ast/PreviewState.d.ts +41 -0
- package/dist/ast/PreviewState.d.ts.map +1 -0
- package/dist/ast/PreviewState.js +159 -0
- package/dist/ast/PreviewState.js.map +1 -0
- package/dist/ast/UndoStack.d.ts +18 -0
- package/dist/ast/UndoStack.d.ts.map +1 -0
- package/dist/ast/UndoStack.js +105 -0
- package/dist/ast/UndoStack.js.map +1 -0
- package/dist/components/AddPropertyModal.d.ts +19 -0
- package/dist/components/AddPropertyModal.d.ts.map +1 -0
- package/dist/components/AddPropertyModal.js +174 -0
- package/dist/components/AddPropertyModal.js.map +1 -0
- package/dist/components/InspectorPanel.js +101 -6
- package/dist/components/InspectorPanel.js.map +1 -1
- package/dist/components/SelectionOverlay.d.ts.map +1 -1
- package/dist/components/SelectionOverlay.js +5 -0
- package/dist/components/SelectionOverlay.js.map +1 -1
- package/dist/components/StyleEditor.d.ts +5 -3
- package/dist/components/StyleEditor.d.ts.map +1 -1
- package/dist/components/StyleEditor.js +45 -11
- package/dist/components/StyleEditor.js.map +1 -1
- package/dist/data/styleProperties.d.ts +26 -0
- package/dist/data/styleProperties.d.ts.map +1 -0
- package/dist/data/styleProperties.js +142 -0
- package/dist/data/styleProperties.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/autoScroll.d.ts +15 -0
- package/dist/utils/autoScroll.d.ts.map +1 -0
- package/dist/utils/autoScroll.js +132 -0
- package/dist/utils/autoScroll.js.map +1 -0
- package/dist/utils/findFiberBySource.d.ts +17 -0
- package/dist/utils/findFiberBySource.d.ts.map +1 -0
- package/dist/utils/findFiberBySource.js +76 -0
- package/dist/utils/findFiberBySource.js.map +1 -0
- package/dist/utils/persistence.d.ts +12 -0
- package/dist/utils/persistence.d.ts.map +1 -0
- package/dist/utils/persistence.js +44 -0
- package/dist/utils/persistence.js.map +1 -0
- package/package.json +3 -2
package/dist/StudioProvider.js
CHANGED
|
@@ -43,25 +43,15 @@ const WebSocketBridge_1 = require("./bridge/WebSocketBridge");
|
|
|
43
43
|
const FloatingBubble_1 = require("./components/FloatingBubble");
|
|
44
44
|
const SelectionOverlay_1 = require("./components/SelectionOverlay");
|
|
45
45
|
const InspectorPanel_1 = require("./components/InspectorPanel");
|
|
46
|
+
const persistence_1 = require("./utils/persistence");
|
|
47
|
+
const findFiberBySource_1 = require("./utils/findFiberBySource");
|
|
46
48
|
/**
|
|
47
|
-
* Shared mutable ref to the app root view. Populated by
|
|
48
|
-
* and consumed by `<SelectionOverlay>` for
|
|
49
|
-
*
|
|
50
|
-
* scope avoids having to thread it through context (and keeps the
|
|
51
|
-
* context value shape unchanged for consumers).
|
|
49
|
+
* Shared mutable ref to the app root view. Populated by
|
|
50
|
+
* `<StudioProvider>` and consumed by `<SelectionOverlay>` for
|
|
51
|
+
* hit-testing via `getInspectorDataForViewAtPoint`.
|
|
52
52
|
*/
|
|
53
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
53
54
|
exports.appRootRef = { current: null };
|
|
54
|
-
/**
|
|
55
|
-
* <StudioProvider>
|
|
56
|
-
*
|
|
57
|
-
* Wrap your App.tsx with this provider. When `enabled` is false (the
|
|
58
|
-
* default, intended for production), it renders children verbatim and
|
|
59
|
-
* introduces zero overhead — no context, no bridge, no overlay.
|
|
60
|
-
*
|
|
61
|
-
* When enabled, it manages the studio state machine, opens a WebSocket
|
|
62
|
-
* connection to the CLI server, and renders the floating bubble,
|
|
63
|
-
* selection overlay, and inspector panel above your app.
|
|
64
|
-
*/
|
|
65
55
|
function StudioProvider({ children, enabled = false, serverPort = 7878, bubblePosition = 'bottom-right', }) {
|
|
66
56
|
if (!enabled) {
|
|
67
57
|
return react_1.default.createElement(react_1.default.Fragment, null, children);
|
|
@@ -71,50 +61,193 @@ function StudioProvider({ children, enabled = false, serverPort = 7878, bubblePo
|
|
|
71
61
|
const StudioProviderInner = ({ serverPort, bubblePosition, children }) => {
|
|
72
62
|
const [state, setState] = (0, react_1.useState)('IDLE');
|
|
73
63
|
const [selectedComponent, setSelectedComponent] = (0, react_1.useState)(null);
|
|
64
|
+
const [canUndo, setCanUndo] = (0, react_1.useState)(false);
|
|
65
|
+
const [canRedo, setCanRedo] = (0, react_1.useState)(false);
|
|
66
|
+
const [hasPendingPreview, setHasPendingPreview] = (0, react_1.useState)(false);
|
|
74
67
|
const bridgeRef = (0, react_1.useRef)(null);
|
|
68
|
+
// Keep the current preview file in a ref so effect cleanup can
|
|
69
|
+
// auto-commit without re-running every render.
|
|
70
|
+
const previewFileRef = (0, react_1.useRef)(null);
|
|
75
71
|
if (!bridgeRef.current) {
|
|
76
72
|
bridgeRef.current = new WebSocketBridge_1.WebSocketBridge(serverPort);
|
|
77
73
|
}
|
|
74
|
+
// Connect + subscribe to server messages.
|
|
78
75
|
(0, react_1.useEffect)(() => {
|
|
79
76
|
const bridge = bridgeRef.current;
|
|
80
77
|
bridge.connect();
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
const offStack = bridge.on('STACK_STATE', (msg) => {
|
|
79
|
+
if (msg.payload) {
|
|
80
|
+
setCanUndo(msg.payload.undo > 0);
|
|
81
|
+
setCanRedo(msg.payload.redo > 0);
|
|
82
|
+
}
|
|
84
83
|
});
|
|
85
84
|
return () => {
|
|
86
|
-
|
|
85
|
+
offStack();
|
|
87
86
|
bridge.disconnect();
|
|
88
87
|
};
|
|
89
88
|
}, []);
|
|
90
|
-
|
|
89
|
+
// Persist the last-selected source whenever it changes.
|
|
90
|
+
(0, react_1.useEffect)(() => {
|
|
91
|
+
if (selectedComponent) {
|
|
92
|
+
(0, persistence_1.saveLastSelection)(selectedComponent.source).catch(() => { });
|
|
93
|
+
}
|
|
94
|
+
}, [selectedComponent]);
|
|
95
|
+
// On initial mount, attempt to re-select the previously selected
|
|
96
|
+
// component (survives Cmd+R and Fast Refresh). Best-effort only.
|
|
97
|
+
(0, react_1.useEffect)(() => {
|
|
98
|
+
let cancelled = false;
|
|
99
|
+
(async () => {
|
|
100
|
+
const saved = await (0, persistence_1.loadLastSelection)();
|
|
101
|
+
if (!saved || cancelled)
|
|
102
|
+
return;
|
|
103
|
+
// Wait a frame for the fiber tree to commit.
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
if (cancelled)
|
|
106
|
+
return;
|
|
107
|
+
const fiber = (0, findFiberBySource_1.findFiberBySource)(saved);
|
|
108
|
+
if (!fiber)
|
|
109
|
+
return;
|
|
110
|
+
const props = (fiber.memoizedProps || {});
|
|
111
|
+
const node = {
|
|
112
|
+
id: `${saved.file}:${saved.line}:${saved.column}`,
|
|
113
|
+
componentName: saved.componentName,
|
|
114
|
+
source: saved,
|
|
115
|
+
props,
|
|
116
|
+
styles: [],
|
|
117
|
+
children: [],
|
|
118
|
+
};
|
|
119
|
+
// Silently restore in ACTIVE state so the user can tap the
|
|
120
|
+
// bubble to resume editing, without jarring re-opening the
|
|
121
|
+
// inspector automatically.
|
|
122
|
+
setSelectedComponent(node);
|
|
123
|
+
setState('ACTIVE');
|
|
124
|
+
}, 500);
|
|
125
|
+
})();
|
|
126
|
+
return () => {
|
|
127
|
+
cancelled = true;
|
|
128
|
+
};
|
|
129
|
+
}, []);
|
|
130
|
+
/**
|
|
131
|
+
* Tell the server to consolidate any pending preview edits into a
|
|
132
|
+
* single undo entry. Safe to call even if no preview is active.
|
|
133
|
+
*/
|
|
134
|
+
const autoCommitPreview = (0, react_1.useCallback)(() => {
|
|
135
|
+
if (previewFileRef.current) {
|
|
136
|
+
bridgeRef.current?.send({ type: 'COMMIT_PREVIEW' });
|
|
137
|
+
previewFileRef.current = null;
|
|
138
|
+
}
|
|
139
|
+
setHasPendingPreview(false);
|
|
140
|
+
}, []);
|
|
141
|
+
const toggleActive = (0, react_1.useCallback)(() => {
|
|
142
|
+
autoCommitPreview();
|
|
91
143
|
setState((s) => {
|
|
92
144
|
if (s === 'IDLE')
|
|
93
145
|
return 'ACTIVE';
|
|
94
146
|
setSelectedComponent(null);
|
|
95
147
|
return 'IDLE';
|
|
96
148
|
});
|
|
97
|
-
};
|
|
98
|
-
const selectComponent = (node) => {
|
|
149
|
+
}, [autoCommitPreview]);
|
|
150
|
+
const selectComponent = (0, react_1.useCallback)((node) => {
|
|
151
|
+
// If switching components, auto-commit the previous preview.
|
|
152
|
+
autoCommitPreview();
|
|
99
153
|
setSelectedComponent(node);
|
|
100
154
|
setState('SELECTED');
|
|
101
|
-
|
|
102
|
-
|
|
155
|
+
// Begin a fresh preview for the new selection's file so any
|
|
156
|
+
// style edits land in the preview buffer, not the main stack.
|
|
157
|
+
bridgeRef.current?.send({
|
|
158
|
+
type: 'BEGIN_PREVIEW',
|
|
159
|
+
payload: { file: node.source.file },
|
|
160
|
+
});
|
|
161
|
+
previewFileRef.current = node.source.file;
|
|
162
|
+
}, [autoCommitPreview]);
|
|
163
|
+
const clearSelection = (0, react_1.useCallback)(() => {
|
|
164
|
+
autoCommitPreview();
|
|
103
165
|
setSelectedComponent(null);
|
|
104
166
|
setState('ACTIVE');
|
|
105
|
-
};
|
|
106
|
-
const updateStyle = (key, value) => {
|
|
107
|
-
|
|
167
|
+
}, [autoCommitPreview]);
|
|
168
|
+
const updateStyle = (0, react_1.useCallback)((key, value) => {
|
|
169
|
+
const current = selectedComponent;
|
|
170
|
+
if (!current)
|
|
108
171
|
return;
|
|
109
172
|
bridgeRef.current?.send({
|
|
110
173
|
type: 'STYLE_CHANGE',
|
|
111
|
-
payload: {
|
|
112
|
-
source: selectedComponent.source,
|
|
113
|
-
key,
|
|
114
|
-
value,
|
|
115
|
-
},
|
|
174
|
+
payload: { source: current.source, key, value },
|
|
116
175
|
});
|
|
117
|
-
|
|
176
|
+
setHasPendingPreview(true);
|
|
177
|
+
// Optimistically update the local styles list so the editor
|
|
178
|
+
// reflects the new value without a round-trip.
|
|
179
|
+
setSelectedComponent({
|
|
180
|
+
...current,
|
|
181
|
+
styles: upsertLocalStyle(current.styles, key, value),
|
|
182
|
+
});
|
|
183
|
+
}, [selectedComponent]);
|
|
184
|
+
const addStyleProperty = (0, react_1.useCallback)((key, value) => {
|
|
185
|
+
const current = selectedComponent;
|
|
186
|
+
if (!current)
|
|
187
|
+
return;
|
|
188
|
+
// Booleans aren't writable via AST here yet; skip.
|
|
189
|
+
if (typeof value === 'boolean')
|
|
190
|
+
return;
|
|
191
|
+
bridgeRef.current?.send({
|
|
192
|
+
type: 'STYLE_CHANGE',
|
|
193
|
+
payload: { source: current.source, key, value },
|
|
194
|
+
});
|
|
195
|
+
setHasPendingPreview(true);
|
|
196
|
+
setSelectedComponent({
|
|
197
|
+
...current,
|
|
198
|
+
styles: upsertLocalStyle(current.styles, key, value),
|
|
199
|
+
});
|
|
200
|
+
}, [selectedComponent]);
|
|
201
|
+
const undo = (0, react_1.useCallback)(() => {
|
|
202
|
+
bridgeRef.current?.send({ type: 'UNDO' });
|
|
203
|
+
}, []);
|
|
204
|
+
const redo = (0, react_1.useCallback)(() => {
|
|
205
|
+
bridgeRef.current?.send({ type: 'REDO' });
|
|
206
|
+
}, []);
|
|
207
|
+
const commitPreview = (0, react_1.useCallback)(() => {
|
|
208
|
+
if (!previewFileRef.current) {
|
|
209
|
+
setHasPendingPreview(false);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
bridgeRef.current?.send({ type: 'COMMIT_PREVIEW' });
|
|
213
|
+
// Immediately re-open a fresh preview buffer on the same file so
|
|
214
|
+
// the user can keep editing the same component without losing
|
|
215
|
+
// preview safety on the next change.
|
|
216
|
+
const file = previewFileRef.current;
|
|
217
|
+
bridgeRef.current?.send({
|
|
218
|
+
type: 'BEGIN_PREVIEW',
|
|
219
|
+
payload: { file },
|
|
220
|
+
});
|
|
221
|
+
setHasPendingPreview(false);
|
|
222
|
+
}, []);
|
|
223
|
+
const cancelPreview = (0, react_1.useCallback)(() => {
|
|
224
|
+
if (!previewFileRef.current) {
|
|
225
|
+
setHasPendingPreview(false);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
bridgeRef.current?.send({ type: 'CANCEL_PREVIEW' });
|
|
229
|
+
// After the server restores the file, Metro Fast Refresh will
|
|
230
|
+
// re-render the component with its original styles. We also clear
|
|
231
|
+
// the local optimistic style list on the selected component so
|
|
232
|
+
// the editor reflects the restored values (they'll refill the next
|
|
233
|
+
// time the user taps the component).
|
|
234
|
+
const file = previewFileRef.current;
|
|
235
|
+
setHasPendingPreview(false);
|
|
236
|
+
if (selectedComponent) {
|
|
237
|
+
setSelectedComponent({
|
|
238
|
+
...selectedComponent,
|
|
239
|
+
styles: [],
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// Re-open a fresh preview buffer on the same file.
|
|
243
|
+
bridgeRef.current?.send({
|
|
244
|
+
type: 'BEGIN_PREVIEW',
|
|
245
|
+
payload: { file },
|
|
246
|
+
});
|
|
247
|
+
}, [selectedComponent]);
|
|
248
|
+
const setAppRootRef = (0, react_1.useCallback)((r) => {
|
|
249
|
+
exports.appRootRef.current = r;
|
|
250
|
+
}, []);
|
|
118
251
|
const ctx = {
|
|
119
252
|
isActive: state !== 'IDLE',
|
|
120
253
|
isSelecting: state === 'SELECTING' || state === 'ACTIVE',
|
|
@@ -123,13 +256,14 @@ const StudioProviderInner = ({ serverPort, bubblePosition, children }) => {
|
|
|
123
256
|
selectComponent,
|
|
124
257
|
clearSelection,
|
|
125
258
|
updateStyle,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
259
|
+
addStyleProperty,
|
|
260
|
+
undo,
|
|
261
|
+
redo,
|
|
262
|
+
canUndo,
|
|
263
|
+
canRedo,
|
|
264
|
+
hasPendingPreview,
|
|
265
|
+
commitPreview,
|
|
266
|
+
cancelPreview,
|
|
133
267
|
};
|
|
134
268
|
return (react_1.default.createElement(StudioContext_1.StudioContext.Provider, { value: ctx },
|
|
135
269
|
react_1.default.createElement(react_native_1.View, { ref: setAppRootRef, collapsable: false, style: { flex: 1 } }, children),
|
|
@@ -137,6 +271,21 @@ const StudioProviderInner = ({ serverPort, bubblePosition, children }) => {
|
|
|
137
271
|
react_1.default.createElement(InspectorPanel_1.InspectorPanel, null),
|
|
138
272
|
react_1.default.createElement(FloatingBubble_1.FloatingBubble, { position: bubblePosition })));
|
|
139
273
|
};
|
|
274
|
+
function upsertLocalStyle(list, key, value) {
|
|
275
|
+
const existing = list.findIndex((s) => s.key === key);
|
|
276
|
+
const type = typeof value === 'number'
|
|
277
|
+
? 'number'
|
|
278
|
+
: /color/i.test(key) || /^#[0-9a-f]{3,8}$/i.test(String(value))
|
|
279
|
+
? 'color'
|
|
280
|
+
: 'string';
|
|
281
|
+
const entry = { key, value, type };
|
|
282
|
+
if (existing >= 0) {
|
|
283
|
+
const next = list.slice();
|
|
284
|
+
next[existing] = entry;
|
|
285
|
+
return next;
|
|
286
|
+
}
|
|
287
|
+
return [...list, entry];
|
|
288
|
+
}
|
|
140
289
|
/** Hook for any descendant of `<StudioProvider>` to read studio state. */
|
|
141
290
|
function useStudio() {
|
|
142
291
|
const ctx = (0, react_1.useContext)(StudioContext_1.StudioContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StudioProvider.js","sourceRoot":"","sources":["../src/StudioProvider.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"StudioProvider.js","sourceRoot":"","sources":["../src/StudioProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AstEngine.d.ts","sourceRoot":"","sources":["../../src/ast/AstEngine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AstEngine.d.ts","sourceRoot":"","sources":["../../src/ast/AstEngine.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAgHD;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoKtE"}
|
package/dist/ast/AstEngine.js
CHANGED
|
@@ -65,6 +65,8 @@ exports.rewriteStyle = rewriteStyle;
|
|
|
65
65
|
const parser = __importStar(require("@babel/parser"));
|
|
66
66
|
const recast = __importStar(require("recast"));
|
|
67
67
|
const fs = __importStar(require("fs"));
|
|
68
|
+
const UndoStack_1 = require("./UndoStack");
|
|
69
|
+
const PreviewState = __importStar(require("./PreviewState"));
|
|
68
70
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
69
71
|
const b = recast.types.builders;
|
|
70
72
|
function buildLiteral(value) {
|
|
@@ -276,6 +278,21 @@ async function rewriteStyle(opts) {
|
|
|
276
278
|
throw new Error(`Matched JSX at ${file}:${line}:${column} but could not write style "${key}" — unsupported style expression form.`);
|
|
277
279
|
}
|
|
278
280
|
const output = recast.print(ast).code;
|
|
281
|
+
// No-op guard: don't touch the file if nothing actually changed.
|
|
282
|
+
if (output === source)
|
|
283
|
+
return;
|
|
279
284
|
fs.writeFileSync(file, output, 'utf-8');
|
|
285
|
+
// If a preview is active on this file, absorb the edit into the
|
|
286
|
+
// preview buffer instead of pushing a new undo entry. Otherwise the
|
|
287
|
+
// edit is a regular committed change.
|
|
288
|
+
const absorbed = PreviewState.recordEdit(file);
|
|
289
|
+
if (!absorbed) {
|
|
290
|
+
(0, UndoStack_1.pushEdit)({
|
|
291
|
+
file,
|
|
292
|
+
before: source,
|
|
293
|
+
after: output,
|
|
294
|
+
label: `${key} = ${value}`,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
280
297
|
}
|
|
281
298
|
//# sourceMappingURL=AstEngine.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AstEngine.js","sourceRoot":"","sources":["../../src/ast/AstEngine.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"AstEngine.js","sourceRoot":"","sources":["../../src/ast/AstEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Called by the server when the client sends BEGIN_PREVIEW after
|
|
3
|
+
* selecting a component. Captures the file's current on-disk state
|
|
4
|
+
* so it can be restored on cancel. If a preview was already active
|
|
5
|
+
* for a different file, it is auto-committed first.
|
|
6
|
+
*/
|
|
7
|
+
export declare function begin(file: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Called by AstEngine.rewriteStyle after a successful write. Returns
|
|
10
|
+
* true if the edit was absorbed into the preview buffer (and should
|
|
11
|
+
* therefore NOT be pushed to the main undo stack). Returns false if
|
|
12
|
+
* there is no active preview or the edit targeted a different file.
|
|
13
|
+
*/
|
|
14
|
+
export declare function recordEdit(file: string): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Called when the user taps ✓. Consolidates every edit made during
|
|
17
|
+
* the preview into a single undo entry with the label "preview",
|
|
18
|
+
* then clears the buffer.
|
|
19
|
+
*/
|
|
20
|
+
export declare function commit(): {
|
|
21
|
+
file: string;
|
|
22
|
+
editCount: number;
|
|
23
|
+
} | null;
|
|
24
|
+
/**
|
|
25
|
+
* Called when the user taps ↺. Restores the exact original file
|
|
26
|
+
* content and clears the buffer. Metro Fast Refresh picks up the
|
|
27
|
+
* restore automatically. No entry is pushed to the undo stack.
|
|
28
|
+
*/
|
|
29
|
+
export declare function cancel(): {
|
|
30
|
+
file: string;
|
|
31
|
+
editCount: number;
|
|
32
|
+
} | null;
|
|
33
|
+
export declare function isActive(): boolean;
|
|
34
|
+
export declare function getState(): {
|
|
35
|
+
active: boolean;
|
|
36
|
+
file: string | null;
|
|
37
|
+
editCount: number;
|
|
38
|
+
};
|
|
39
|
+
/** Called on disconnect or manual reset. */
|
|
40
|
+
export declare function reset(): void;
|
|
41
|
+
//# sourceMappingURL=PreviewState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewState.d.ts","sourceRoot":"","sources":["../../src/ast/PreviewState.ts"],"names":[],"mappings":"AA8BA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAYxC;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAIhD;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAmBnE;AAED;;;;GAIG;AACH,wBAAgB,MAAM,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWnE;AAED,wBAAgB,QAAQ,IAAI,OAAO,CAElC;AAED,wBAAgB,QAAQ,IAAI;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,CAMA;AAED,4CAA4C;AAC5C,wBAAgB,KAAK,IAAI,IAAI,CAE5B"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.begin = begin;
|
|
37
|
+
exports.recordEdit = recordEdit;
|
|
38
|
+
exports.commit = commit;
|
|
39
|
+
exports.cancel = cancel;
|
|
40
|
+
exports.isActive = isActive;
|
|
41
|
+
exports.getState = getState;
|
|
42
|
+
exports.reset = reset;
|
|
43
|
+
/**
|
|
44
|
+
* PreviewState
|
|
45
|
+
*
|
|
46
|
+
* Server-side state machine for rn-studio's preview mode. While a
|
|
47
|
+
* preview is active, style changes are still written to disk (so
|
|
48
|
+
* Metro Fast Refresh can visually reflect the edit) but they are
|
|
49
|
+
* held back from the main undo stack.
|
|
50
|
+
*
|
|
51
|
+
* The user has two ways out:
|
|
52
|
+
*
|
|
53
|
+
* - `commit()` — the NET diff between the original and current
|
|
54
|
+
* file is pushed as a single undo entry labeled "preview", and
|
|
55
|
+
* the preview buffer is cleared.
|
|
56
|
+
*
|
|
57
|
+
* - `cancel()` — the original file content is written back to
|
|
58
|
+
* disk verbatim, and the preview buffer is cleared. From the
|
|
59
|
+
* user's perspective it is as if the edits never happened: the
|
|
60
|
+
* file is pristine, the undo stack is untouched.
|
|
61
|
+
*/
|
|
62
|
+
const fs = __importStar(require("fs"));
|
|
63
|
+
const UndoStack_1 = require("./UndoStack");
|
|
64
|
+
let active = null;
|
|
65
|
+
/**
|
|
66
|
+
* Called by the server when the client sends BEGIN_PREVIEW after
|
|
67
|
+
* selecting a component. Captures the file's current on-disk state
|
|
68
|
+
* so it can be restored on cancel. If a preview was already active
|
|
69
|
+
* for a different file, it is auto-committed first.
|
|
70
|
+
*/
|
|
71
|
+
function begin(file) {
|
|
72
|
+
if (active && active.file !== file) {
|
|
73
|
+
// Auto-commit the previous preview so we never leak state.
|
|
74
|
+
commit();
|
|
75
|
+
}
|
|
76
|
+
if (active && active.file === file) {
|
|
77
|
+
// Already previewing this file — nothing to do.
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (!fs.existsSync(file))
|
|
81
|
+
return;
|
|
82
|
+
const originalContent = fs.readFileSync(file, 'utf-8');
|
|
83
|
+
active = { file, originalContent, editCount: 0 };
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Called by AstEngine.rewriteStyle after a successful write. Returns
|
|
87
|
+
* true if the edit was absorbed into the preview buffer (and should
|
|
88
|
+
* therefore NOT be pushed to the main undo stack). Returns false if
|
|
89
|
+
* there is no active preview or the edit targeted a different file.
|
|
90
|
+
*/
|
|
91
|
+
function recordEdit(file) {
|
|
92
|
+
if (!active || active.file !== file)
|
|
93
|
+
return false;
|
|
94
|
+
active.editCount++;
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Called when the user taps ✓. Consolidates every edit made during
|
|
99
|
+
* the preview into a single undo entry with the label "preview",
|
|
100
|
+
* then clears the buffer.
|
|
101
|
+
*/
|
|
102
|
+
function commit() {
|
|
103
|
+
if (!active)
|
|
104
|
+
return null;
|
|
105
|
+
const { file, originalContent, editCount } = active;
|
|
106
|
+
active = null;
|
|
107
|
+
if (editCount === 0)
|
|
108
|
+
return { file, editCount: 0 };
|
|
109
|
+
try {
|
|
110
|
+
const currentContent = fs.readFileSync(file, 'utf-8');
|
|
111
|
+
if (currentContent !== originalContent) {
|
|
112
|
+
(0, UndoStack_1.pushEdit)({
|
|
113
|
+
file,
|
|
114
|
+
before: originalContent,
|
|
115
|
+
after: currentContent,
|
|
116
|
+
label: `preview (${editCount} edit${editCount === 1 ? '' : 's'})`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// File gone / unreadable — nothing to commit.
|
|
122
|
+
}
|
|
123
|
+
return { file, editCount };
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Called when the user taps ↺. Restores the exact original file
|
|
127
|
+
* content and clears the buffer. Metro Fast Refresh picks up the
|
|
128
|
+
* restore automatically. No entry is pushed to the undo stack.
|
|
129
|
+
*/
|
|
130
|
+
function cancel() {
|
|
131
|
+
if (!active)
|
|
132
|
+
return null;
|
|
133
|
+
const { file, originalContent, editCount } = active;
|
|
134
|
+
active = null;
|
|
135
|
+
if (editCount === 0)
|
|
136
|
+
return { file, editCount: 0 };
|
|
137
|
+
try {
|
|
138
|
+
fs.writeFileSync(file, originalContent, 'utf-8');
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// Best-effort; caller surfaces any error back to the client.
|
|
142
|
+
}
|
|
143
|
+
return { file, editCount };
|
|
144
|
+
}
|
|
145
|
+
function isActive() {
|
|
146
|
+
return active !== null;
|
|
147
|
+
}
|
|
148
|
+
function getState() {
|
|
149
|
+
return {
|
|
150
|
+
active: active !== null,
|
|
151
|
+
file: active ? active.file : null,
|
|
152
|
+
editCount: active ? active.editCount : 0,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** Called on disconnect or manual reset. */
|
|
156
|
+
function reset() {
|
|
157
|
+
active = null;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=PreviewState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreviewState.js","sourceRoot":"","sources":["../../src/ast/PreviewState.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface UndoEntry {
|
|
2
|
+
file: string;
|
|
3
|
+
before: string;
|
|
4
|
+
after: string;
|
|
5
|
+
label: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function pushEdit(entry: Omit<UndoEntry, 'timestamp'>): void;
|
|
9
|
+
export declare function undo(): UndoEntry | null;
|
|
10
|
+
export declare function redo(): UndoEntry | null;
|
|
11
|
+
export declare function canUndo(): boolean;
|
|
12
|
+
export declare function canRedo(): boolean;
|
|
13
|
+
export declare function getStackState(): {
|
|
14
|
+
undo: number;
|
|
15
|
+
redo: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function clear(): void;
|
|
18
|
+
//# sourceMappingURL=UndoStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UndoStack.d.ts","sourceRoot":"","sources":["../../src/ast/UndoStack.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG,IAAI,CAIlE;AAED,wBAAgB,IAAI,IAAI,SAAS,GAAG,IAAI,CAYvC;AAED,wBAAgB,IAAI,IAAI,SAAS,GAAG,IAAI,CAWvC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED,wBAAgB,aAAa,IAAI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAE9D;AAED,wBAAgB,KAAK,IAAI,IAAI,CAG5B"}
|