@rendiv/studio 0.1.1 → 0.1.3
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/LICENSE +1 -1
- package/dist/apply-overrides.d.ts +32 -0
- package/dist/apply-overrides.d.ts.map +1 -0
- package/dist/apply-overrides.js +388 -0
- package/dist/apply-overrides.js.map +1 -0
- package/dist/vite-plugin-studio.d.ts.map +1 -1
- package/dist/vite-plugin-studio.js +81 -0
- package/dist/vite-plugin-studio.js.map +1 -1
- package/package.json +3 -3
- package/ui/Preview.tsx +1 -0
- package/ui/StudioApp.tsx +215 -14
- package/ui/TimelineEditor.tsx +573 -0
- package/ui/timeline/track-layout.ts +94 -0
- package/ui/timeline/types.ts +39 -0
- package/ui/timeline/use-timeline-drag.ts +98 -0
- package/ui/timeline/use-timeline-zoom.ts +65 -0
package/LICENSE
CHANGED
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
|
|
177
177
|
END OF TERMS AND CONDITIONS
|
|
178
178
|
|
|
179
|
-
Copyright
|
|
179
|
+
Copyright 2026 Rendiv Contributors
|
|
180
180
|
|
|
181
181
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
182
182
|
you may not use this file except in compliance with the License.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
interface TimelineOverride {
|
|
2
|
+
from: number;
|
|
3
|
+
durationInFrames: number;
|
|
4
|
+
trackIndex?: number;
|
|
5
|
+
}
|
|
6
|
+
interface AppliedChange {
|
|
7
|
+
namePath: string;
|
|
8
|
+
file: string;
|
|
9
|
+
line: number;
|
|
10
|
+
changes: string[];
|
|
11
|
+
}
|
|
12
|
+
interface SkippedOverride {
|
|
13
|
+
namePath: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
values: {
|
|
16
|
+
from: number;
|
|
17
|
+
durationInFrames: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface ApplyResult {
|
|
21
|
+
applied: AppliedChange[];
|
|
22
|
+
skipped: SkippedOverride[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Apply timeline overrides to source code files.
|
|
26
|
+
*
|
|
27
|
+
* Parses .tsx/.jsx files using TypeScript compiler API, finds matching
|
|
28
|
+
* Sequence / Series.Sequence elements, and updates their props.
|
|
29
|
+
*/
|
|
30
|
+
export declare function applyOverridesToSource(root: string, overrides: Record<string, TimelineOverride>): Promise<ApplyResult>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=apply-overrides.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-overrides.d.ts","sourceRoot":"","sources":["../src/apply-overrides.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAgQD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,OAAO,CAAC,WAAW,CAAC,CAoJtB"}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { readFile, writeFile, readdir } from 'node:fs/promises';
|
|
2
|
+
import { join, extname, relative } from 'node:path';
|
|
3
|
+
function parseNamePath(namePath) {
|
|
4
|
+
const parts = namePath.split('/');
|
|
5
|
+
if (parts.length < 2)
|
|
6
|
+
return null;
|
|
7
|
+
const compositionId = parts[0];
|
|
8
|
+
const segments = [];
|
|
9
|
+
for (let i = 1; i < parts.length; i++) {
|
|
10
|
+
const match = parts[i].match(/^(.+)\[(\d+)\]$/);
|
|
11
|
+
if (!match)
|
|
12
|
+
return null;
|
|
13
|
+
segments.push({ name: match[1], from: Number(match[2]) });
|
|
14
|
+
}
|
|
15
|
+
return { compositionId, segments };
|
|
16
|
+
}
|
|
17
|
+
// Recursively collect .tsx/.jsx source files, skipping common non-source dirs
|
|
18
|
+
async function collectSourceFiles(root) {
|
|
19
|
+
const skip = new Set(['node_modules', 'dist', '.studio', '.git', '.next', 'build', 'coverage']);
|
|
20
|
+
const results = [];
|
|
21
|
+
async function walk(dir) {
|
|
22
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
23
|
+
for (const entry of entries) {
|
|
24
|
+
if (skip.has(entry.name))
|
|
25
|
+
continue;
|
|
26
|
+
const full = join(dir, entry.name);
|
|
27
|
+
if (entry.isDirectory()) {
|
|
28
|
+
await walk(full);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const ext = extname(entry.name);
|
|
32
|
+
if (ext === '.tsx' || ext === '.jsx') {
|
|
33
|
+
results.push(full);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
await walk(root);
|
|
39
|
+
return results;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Use TypeScript compiler to find Sequence JSX elements and build
|
|
43
|
+
* a mapping of namePaths to source locations + prop positions.
|
|
44
|
+
*/
|
|
45
|
+
async function findSequencesInFile(filePath, content) {
|
|
46
|
+
// Dynamic import — TypeScript is a devDependency
|
|
47
|
+
const ts = await import('typescript');
|
|
48
|
+
const sf = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
49
|
+
const results = new Map();
|
|
50
|
+
// Helper: extract numeric literal value from a JSX attribute
|
|
51
|
+
function getNumericValue(attr) {
|
|
52
|
+
const init = attr.initializer;
|
|
53
|
+
if (!init)
|
|
54
|
+
return null;
|
|
55
|
+
// name={60}
|
|
56
|
+
if (ts.isJsxExpression(init) && init.expression) {
|
|
57
|
+
const expr = init.expression;
|
|
58
|
+
if (ts.isNumericLiteral(expr)) {
|
|
59
|
+
return Number(expr.text);
|
|
60
|
+
}
|
|
61
|
+
// Handle negative/positive prefix: name={-60} or name={+60}
|
|
62
|
+
if (ts.isPrefixUnaryExpression(expr) && ts.isNumericLiteral(expr.operand)) {
|
|
63
|
+
const value = Number(expr.operand.text);
|
|
64
|
+
if (expr.operator === ts.SyntaxKind.MinusToken)
|
|
65
|
+
return -value;
|
|
66
|
+
if (expr.operator === ts.SyntaxKind.PlusToken)
|
|
67
|
+
return value;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
// Helper: extract string literal value from a JSX attribute
|
|
73
|
+
function getStringValue(attr) {
|
|
74
|
+
const init = attr.initializer;
|
|
75
|
+
if (!init)
|
|
76
|
+
return null;
|
|
77
|
+
// name="Foo"
|
|
78
|
+
if (ts.isStringLiteral(init))
|
|
79
|
+
return init.text;
|
|
80
|
+
// name={"Foo"}
|
|
81
|
+
if (ts.isJsxExpression(init) && init.expression && ts.isStringLiteral(init.expression)) {
|
|
82
|
+
return init.expression.text;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
function getPropRange(attr) {
|
|
87
|
+
return {
|
|
88
|
+
attrStart: attr.getStart(sf),
|
|
89
|
+
attrEnd: attr.getEnd(),
|
|
90
|
+
valueStart: attr.initializer.getStart(sf),
|
|
91
|
+
valueEnd: attr.initializer.getEnd(),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Walk the AST looking for Series-like containers with Sequence children
|
|
95
|
+
function visit(node) {
|
|
96
|
+
// Match: <Series> / <TransitionSeries> containing .Sequence children
|
|
97
|
+
if (ts.isJsxElement(node)) {
|
|
98
|
+
const tag = node.openingElement.tagName;
|
|
99
|
+
const tagText = tag.getText(sf);
|
|
100
|
+
// Check for Series / TransitionSeries containers
|
|
101
|
+
if (tagText === 'Series' || tagText === 'TransitionSeries') {
|
|
102
|
+
// Walk children to find .Sequence elements and compute accumulated from
|
|
103
|
+
let accumulatedFrom = 0;
|
|
104
|
+
for (const child of node.children) {
|
|
105
|
+
if (!ts.isJsxElement(child) && !ts.isJsxSelfClosingElement(child))
|
|
106
|
+
continue;
|
|
107
|
+
const childOpen = ts.isJsxElement(child) ? child.openingElement : child;
|
|
108
|
+
const childTag = childOpen.tagName.getText(sf);
|
|
109
|
+
// Check if this is a .Sequence child (Series.Sequence or TransitionSeries.Sequence)
|
|
110
|
+
if (!childTag.endsWith('.Sequence')) {
|
|
111
|
+
// Might be a .Transition — check for timing to extract overlap duration
|
|
112
|
+
if (childTag.endsWith('.Transition')) {
|
|
113
|
+
// Transitions reduce accumulatedFrom by their duration.
|
|
114
|
+
// Parse timing prop to extract duration.
|
|
115
|
+
const timingAttr = findAttr(childOpen, 'timing');
|
|
116
|
+
if (timingAttr) {
|
|
117
|
+
const timingText = timingAttr.initializer?.getText(sf) ?? '';
|
|
118
|
+
// Match linearTiming({ durationInFrames: N }) pattern
|
|
119
|
+
const durMatch = timingText.match(/durationInFrames\s*:\s*(\d+)/);
|
|
120
|
+
if (durMatch) {
|
|
121
|
+
accumulatedFrom -= Number(durMatch[1]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
const attrs = childOpen.attributes;
|
|
128
|
+
let durationValue = null;
|
|
129
|
+
let offsetValue = null;
|
|
130
|
+
let nameValue = null;
|
|
131
|
+
let durationProp;
|
|
132
|
+
let offsetProp;
|
|
133
|
+
let trackIndexProp;
|
|
134
|
+
let lastPropEnd = childOpen.attributes.getEnd();
|
|
135
|
+
for (const attr of attrs.properties) {
|
|
136
|
+
if (!ts.isJsxAttribute(attr))
|
|
137
|
+
continue;
|
|
138
|
+
const attrName = attr.name.getText(sf);
|
|
139
|
+
if (attrName === 'durationInFrames') {
|
|
140
|
+
durationValue = getNumericValue(attr);
|
|
141
|
+
if (durationValue !== null)
|
|
142
|
+
durationProp = getPropRange(attr);
|
|
143
|
+
}
|
|
144
|
+
else if (attrName === 'offset') {
|
|
145
|
+
offsetValue = getNumericValue(attr);
|
|
146
|
+
if (offsetValue !== null)
|
|
147
|
+
offsetProp = getPropRange(attr);
|
|
148
|
+
}
|
|
149
|
+
else if (attrName === 'trackIndex') {
|
|
150
|
+
if (getNumericValue(attr) !== null)
|
|
151
|
+
trackIndexProp = getPropRange(attr);
|
|
152
|
+
}
|
|
153
|
+
else if (attrName === 'name') {
|
|
154
|
+
nameValue = getStringValue(attr);
|
|
155
|
+
}
|
|
156
|
+
const end = attr.getEnd();
|
|
157
|
+
if (end > lastPropEnd)
|
|
158
|
+
lastPropEnd = end;
|
|
159
|
+
}
|
|
160
|
+
if (durationValue === null)
|
|
161
|
+
continue;
|
|
162
|
+
// Derive name from first child component if not explicit
|
|
163
|
+
let derivedName = nameValue;
|
|
164
|
+
if (!derivedName && ts.isJsxElement(child)) {
|
|
165
|
+
for (const grandChild of child.children) {
|
|
166
|
+
if (ts.isJsxElement(grandChild) || ts.isJsxSelfClosingElement(grandChild)) {
|
|
167
|
+
const gcTag = (ts.isJsxElement(grandChild) ? grandChild.openingElement : grandChild).tagName;
|
|
168
|
+
derivedName = gcTag.getText(sf);
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const seqFrom = accumulatedFrom + (offsetValue ?? 0);
|
|
174
|
+
const displayName = derivedName ?? 'Sequence';
|
|
175
|
+
// We don't know the composition ID from static analysis, so use a partial key
|
|
176
|
+
const partialKey = `${displayName}[${seqFrom}]`;
|
|
177
|
+
const line = sf.getLineAndCharacterOfPosition(childOpen.getStart(sf)).line + 1;
|
|
178
|
+
results.set(partialKey, { line, baseFrom: accumulatedFrom, durationProp, offsetProp, trackIndexProp, lastPropEnd });
|
|
179
|
+
accumulatedFrom = seqFrom + durationValue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// Also match bare <Sequence from={N} durationInFrames={M}>
|
|
184
|
+
const openEl = ts.isJsxElement(node) ? node.openingElement :
|
|
185
|
+
ts.isJsxSelfClosingElement(node) ? node : null;
|
|
186
|
+
if (openEl) {
|
|
187
|
+
const tagText = openEl.tagName.getText(sf);
|
|
188
|
+
if (tagText === 'Sequence') {
|
|
189
|
+
let fromValue = null;
|
|
190
|
+
let durationValue = null;
|
|
191
|
+
let nameValue = null;
|
|
192
|
+
let fromProp;
|
|
193
|
+
let durationProp;
|
|
194
|
+
let trackIndexProp;
|
|
195
|
+
let lastPropEnd = openEl.attributes.getEnd();
|
|
196
|
+
for (const attr of openEl.attributes.properties) {
|
|
197
|
+
if (!ts.isJsxAttribute(attr))
|
|
198
|
+
continue;
|
|
199
|
+
const attrName = attr.name.getText(sf);
|
|
200
|
+
if (attrName === 'from') {
|
|
201
|
+
fromValue = getNumericValue(attr);
|
|
202
|
+
if (fromValue !== null)
|
|
203
|
+
fromProp = getPropRange(attr);
|
|
204
|
+
}
|
|
205
|
+
else if (attrName === 'durationInFrames') {
|
|
206
|
+
durationValue = getNumericValue(attr);
|
|
207
|
+
if (durationValue !== null)
|
|
208
|
+
durationProp = getPropRange(attr);
|
|
209
|
+
}
|
|
210
|
+
else if (attrName === 'trackIndex') {
|
|
211
|
+
if (getNumericValue(attr) !== null)
|
|
212
|
+
trackIndexProp = getPropRange(attr);
|
|
213
|
+
}
|
|
214
|
+
else if (attrName === 'name') {
|
|
215
|
+
nameValue = getStringValue(attr);
|
|
216
|
+
}
|
|
217
|
+
const end = attr.getEnd();
|
|
218
|
+
if (end > lastPropEnd)
|
|
219
|
+
lastPropEnd = end;
|
|
220
|
+
}
|
|
221
|
+
const seqFrom = fromValue ?? 0;
|
|
222
|
+
const displayName = nameValue ?? 'Sequence';
|
|
223
|
+
const partialKey = `${displayName}[${seqFrom}]`;
|
|
224
|
+
const line = sf.getLineAndCharacterOfPosition(openEl.getStart(sf)).line + 1;
|
|
225
|
+
results.set(partialKey, { line, baseFrom: seqFrom, fromProp, durationProp, trackIndexProp, lastPropEnd });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
ts.forEachChild(node, visit);
|
|
229
|
+
}
|
|
230
|
+
function findAttr(element, name) {
|
|
231
|
+
for (const attr of element.attributes.properties) {
|
|
232
|
+
if (ts.isJsxAttribute(attr) && attr.name.getText(sf) === name)
|
|
233
|
+
return attr;
|
|
234
|
+
}
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
visit(sf);
|
|
238
|
+
return results;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Apply timeline overrides to source code files.
|
|
242
|
+
*
|
|
243
|
+
* Parses .tsx/.jsx files using TypeScript compiler API, finds matching
|
|
244
|
+
* Sequence / Series.Sequence elements, and updates their props.
|
|
245
|
+
*/
|
|
246
|
+
export async function applyOverridesToSource(root, overrides) {
|
|
247
|
+
const result = { applied: [], skipped: [] };
|
|
248
|
+
// Group overrides by composition ID
|
|
249
|
+
const byComposition = new Map();
|
|
250
|
+
for (const [namePath, override] of Object.entries(overrides)) {
|
|
251
|
+
const parsed = parseNamePath(namePath);
|
|
252
|
+
if (!parsed) {
|
|
253
|
+
result.skipped.push({ namePath, reason: 'Could not parse namePath', values: { from: override.from, durationInFrames: override.durationInFrames } });
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// Build the leaf segment key (matches what we'll find in source)
|
|
257
|
+
const leaf = parsed.segments[parsed.segments.length - 1];
|
|
258
|
+
const leafKey = `${leaf.name}[${leaf.from}]`;
|
|
259
|
+
const nested = parsed.segments.length > 1;
|
|
260
|
+
if (!byComposition.has(parsed.compositionId))
|
|
261
|
+
byComposition.set(parsed.compositionId, []);
|
|
262
|
+
byComposition.get(parsed.compositionId).push({ namePath, leafKey, override, nested });
|
|
263
|
+
}
|
|
264
|
+
// Collect source files
|
|
265
|
+
const srcFiles = await collectSourceFiles(root);
|
|
266
|
+
// For each file, look for matching sequences
|
|
267
|
+
for (const file of srcFiles) {
|
|
268
|
+
const content = await readFile(file, 'utf-8');
|
|
269
|
+
// Quick check: does the file contain any relevant keywords?
|
|
270
|
+
if (!content.includes('Sequence') && !content.includes('Series'))
|
|
271
|
+
continue;
|
|
272
|
+
const sequences = await findSequencesInFile(file, content);
|
|
273
|
+
if (sequences.size === 0)
|
|
274
|
+
continue;
|
|
275
|
+
const replacements = [];
|
|
276
|
+
const relPath = relative(root, file);
|
|
277
|
+
// Try to match overrides against found sequences
|
|
278
|
+
for (const [, entries] of byComposition) {
|
|
279
|
+
for (const entry of entries) {
|
|
280
|
+
const match = sequences.get(entry.leafKey);
|
|
281
|
+
if (!match)
|
|
282
|
+
continue;
|
|
283
|
+
const changes = [];
|
|
284
|
+
// Update durationInFrames if changed and prop exists
|
|
285
|
+
if (match.durationProp) {
|
|
286
|
+
const currentDurText = content.slice(match.durationProp.valueStart, match.durationProp.valueEnd);
|
|
287
|
+
const newDurText = `{${entry.override.durationInFrames}}`;
|
|
288
|
+
if (currentDurText !== newDurText) {
|
|
289
|
+
replacements.push({ start: match.durationProp.valueStart, end: match.durationProp.valueEnd, newText: newDurText });
|
|
290
|
+
changes.push(`durationInFrames → ${entry.override.durationInFrames}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Update from if changed and prop exists (bare Sequence only)
|
|
294
|
+
if (match.fromProp) {
|
|
295
|
+
const currentFromText = content.slice(match.fromProp.valueStart, match.fromProp.valueEnd);
|
|
296
|
+
const newFromText = `{${entry.override.from}}`;
|
|
297
|
+
if (currentFromText !== newFromText) {
|
|
298
|
+
replacements.push({ start: match.fromProp.valueStart, end: match.fromProp.valueEnd, newText: newFromText });
|
|
299
|
+
changes.push(`from → ${entry.override.from}`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// For Series.Sequence: handle from change via offset prop
|
|
303
|
+
if (!match.fromProp && match.durationProp) {
|
|
304
|
+
// This is likely a Series.Sequence — compute offset relative to the
|
|
305
|
+
// base accumulated position (the position before any offset is applied).
|
|
306
|
+
const neededOffset = entry.override.from - match.baseFrom;
|
|
307
|
+
if (neededOffset !== 0) {
|
|
308
|
+
if (match.offsetProp) {
|
|
309
|
+
// Update existing offset prop
|
|
310
|
+
const newOffsetText = `{${neededOffset}}`;
|
|
311
|
+
replacements.push({ start: match.offsetProp.valueStart, end: match.offsetProp.valueEnd, newText: newOffsetText });
|
|
312
|
+
changes.push(`offset → ${neededOffset}`);
|
|
313
|
+
}
|
|
314
|
+
else {
|
|
315
|
+
// Insert offset prop after durationInFrames
|
|
316
|
+
const insertPos = match.durationProp.attrEnd;
|
|
317
|
+
replacements.push({ start: insertPos, end: insertPos, newText: ` offset={${neededOffset}}` });
|
|
318
|
+
changes.push(`offset={${neededOffset}} (added)`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
else if (match.offsetProp) {
|
|
322
|
+
// Offset is 0 — remove the existing offset prop (+ preceding space)
|
|
323
|
+
let removeStart = match.offsetProp.attrStart;
|
|
324
|
+
if (removeStart > 0 && content[removeStart - 1] === ' ')
|
|
325
|
+
removeStart--;
|
|
326
|
+
replacements.push({ start: removeStart, end: match.offsetProp.attrEnd, newText: '' });
|
|
327
|
+
changes.push(`offset removed`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Handle trackIndex prop
|
|
331
|
+
if (entry.override.trackIndex !== undefined) {
|
|
332
|
+
const newTrackText = `{${entry.override.trackIndex}}`;
|
|
333
|
+
if (match.trackIndexProp) {
|
|
334
|
+
// Update existing trackIndex prop
|
|
335
|
+
const currentText = content.slice(match.trackIndexProp.valueStart, match.trackIndexProp.valueEnd);
|
|
336
|
+
if (currentText !== newTrackText) {
|
|
337
|
+
replacements.push({ start: match.trackIndexProp.valueStart, end: match.trackIndexProp.valueEnd, newText: newTrackText });
|
|
338
|
+
changes.push(`trackIndex → ${entry.override.trackIndex}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
// Insert trackIndex prop after last existing prop
|
|
343
|
+
const insertPos = match.lastPropEnd;
|
|
344
|
+
replacements.push({ start: insertPos, end: insertPos, newText: ` trackIndex={${entry.override.trackIndex}}` });
|
|
345
|
+
changes.push(`trackIndex={${entry.override.trackIndex}} (added)`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else if (match.trackIndexProp) {
|
|
349
|
+
// No trackIndex in override — remove existing prop (+ preceding space)
|
|
350
|
+
let removeStart = match.trackIndexProp.attrStart;
|
|
351
|
+
if (removeStart > 0 && content[removeStart - 1] === ' ')
|
|
352
|
+
removeStart--;
|
|
353
|
+
replacements.push({ start: removeStart, end: match.trackIndexProp.attrEnd, newText: '' });
|
|
354
|
+
changes.push(`trackIndex removed`);
|
|
355
|
+
}
|
|
356
|
+
if (changes.length > 0) {
|
|
357
|
+
result.applied.push({ namePath: entry.namePath, file: relPath, line: match.line, changes });
|
|
358
|
+
// Mark as applied by removing from entries
|
|
359
|
+
const idx = entries.indexOf(entry);
|
|
360
|
+
entries.splice(idx, 1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Write modified file if there are replacements
|
|
365
|
+
if (replacements.length > 0) {
|
|
366
|
+
replacements.sort((a, b) => b.start - a.start); // reverse order
|
|
367
|
+
let modified = content;
|
|
368
|
+
for (const r of replacements) {
|
|
369
|
+
modified = modified.slice(0, r.start) + r.newText + modified.slice(r.end);
|
|
370
|
+
}
|
|
371
|
+
await writeFile(file, modified, 'utf-8');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// Collect unapplied overrides
|
|
375
|
+
for (const [, entries] of byComposition) {
|
|
376
|
+
for (const entry of entries) {
|
|
377
|
+
result.skipped.push({
|
|
378
|
+
namePath: entry.namePath,
|
|
379
|
+
reason: entry.nested
|
|
380
|
+
? 'Nested sequence — could not match in source'
|
|
381
|
+
: 'Could not find matching Sequence with literal props',
|
|
382
|
+
values: { from: entry.override.from, durationInFrames: entry.override.durationInFrames },
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return result;
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=apply-overrides.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-overrides.js","sourceRoot":"","sources":["../src/apply-overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-studio.d.ts","sourceRoot":"","sources":["../src/vite-plugin-studio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin-studio.d.ts","sourceRoot":"","sources":["../src/vite-plugin-studio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAMnC,MAAM,WAAW,mBAAmB;IAClC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AA4HD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAyKvE"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { readFile, writeFile, unlink } from 'node:fs/promises';
|
|
2
|
+
import { watch } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
1
4
|
let renderJobs = [];
|
|
2
5
|
let nextJobId = 1;
|
|
3
6
|
let activeJobId = null;
|
|
@@ -96,9 +99,87 @@ function jsonResponse(res, data, status = 200) {
|
|
|
96
99
|
}
|
|
97
100
|
export function rendivStudioPlugin(options) {
|
|
98
101
|
const { studioHtmlFileName, entryPoint } = options;
|
|
102
|
+
// Timeline overrides persistence — stored at project root so they survive server restarts
|
|
103
|
+
const overridesFile = join(process.cwd(), 'timeline-overrides.json');
|
|
104
|
+
async function readOverrides() {
|
|
105
|
+
try {
|
|
106
|
+
const raw = await readFile(overridesFile, 'utf-8');
|
|
107
|
+
return JSON.parse(raw);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return {};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Track when the server itself writes overrides so the file watcher can ignore self-writes
|
|
114
|
+
let lastSelfWriteTime = 0;
|
|
115
|
+
async function writeOverrides(data) {
|
|
116
|
+
lastSelfWriteTime = Date.now();
|
|
117
|
+
await writeFile(overridesFile, JSON.stringify(data, null, 2));
|
|
118
|
+
}
|
|
99
119
|
return {
|
|
100
120
|
name: 'rendiv-studio',
|
|
101
121
|
configureServer(server) {
|
|
122
|
+
// Timeline override API endpoints
|
|
123
|
+
server.middlewares.use((req, res, next) => {
|
|
124
|
+
// GET /timeline/overrides — read all overrides
|
|
125
|
+
if (req.method === 'GET' && req.url === '/__rendiv_api__/timeline/overrides') {
|
|
126
|
+
readOverrides().then((overrides) => {
|
|
127
|
+
jsonResponse(res, { overrides });
|
|
128
|
+
}).catch(() => {
|
|
129
|
+
jsonResponse(res, { overrides: {} });
|
|
130
|
+
});
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// PUT /timeline/overrides — write all overrides
|
|
134
|
+
if (req.method === 'PUT' && req.url === '/__rendiv_api__/timeline/overrides') {
|
|
135
|
+
readBody(req).then(async (raw) => {
|
|
136
|
+
const body = JSON.parse(raw);
|
|
137
|
+
await writeOverrides(body.overrides ?? {});
|
|
138
|
+
jsonResponse(res, { ok: true });
|
|
139
|
+
}).catch((err) => {
|
|
140
|
+
jsonResponse(res, { error: String(err) }, 500);
|
|
141
|
+
});
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
// DELETE /timeline/overrides — clear all overrides
|
|
145
|
+
if (req.method === 'DELETE' && req.url === '/__rendiv_api__/timeline/overrides') {
|
|
146
|
+
unlink(overridesFile).catch(() => { }).then(() => {
|
|
147
|
+
jsonResponse(res, { ok: true });
|
|
148
|
+
});
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
next();
|
|
152
|
+
});
|
|
153
|
+
// Watch timeline-overrides.json for external edits and push updates to clients
|
|
154
|
+
let overridesWatcher;
|
|
155
|
+
let watchDebounce;
|
|
156
|
+
try {
|
|
157
|
+
overridesWatcher = watch(overridesFile, () => {
|
|
158
|
+
// Ignore changes caused by our own writes (within 500ms)
|
|
159
|
+
if (Date.now() - lastSelfWriteTime < 500)
|
|
160
|
+
return;
|
|
161
|
+
if (watchDebounce)
|
|
162
|
+
clearTimeout(watchDebounce);
|
|
163
|
+
watchDebounce = setTimeout(() => {
|
|
164
|
+
readOverrides()
|
|
165
|
+
.then((overrides) => {
|
|
166
|
+
server.ws.send({
|
|
167
|
+
type: 'custom',
|
|
168
|
+
event: 'rendiv:overrides-update',
|
|
169
|
+
data: { overrides },
|
|
170
|
+
});
|
|
171
|
+
})
|
|
172
|
+
.catch(() => { });
|
|
173
|
+
}, 100);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// File doesn't exist yet — that's fine, watch will be set up when it's first created
|
|
178
|
+
}
|
|
179
|
+
// Clean up watcher when server closes
|
|
180
|
+
server.httpServer?.on('close', () => {
|
|
181
|
+
overridesWatcher?.close();
|
|
182
|
+
});
|
|
102
183
|
// Render queue API endpoints
|
|
103
184
|
server.middlewares.use((req, res, next) => {
|
|
104
185
|
// GET /queue — return all jobs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin-studio.js","sourceRoot":"","sources":["../src/vite-plugin-studio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vite-plugin-studio.js","sourceRoot":"","sources":["../src/vite-plugin-studio.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rendiv/studio",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"@vitejs/plugin-react": "^4.3.0",
|
|
20
20
|
"vite": "^6.0.0",
|
|
21
|
-
"@rendiv/
|
|
22
|
-
"@rendiv/
|
|
21
|
+
"@rendiv/bundler": "0.1.3",
|
|
22
|
+
"@rendiv/renderer": "0.1.3"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"@types/node": "^22.0.0",
|
package/ui/Preview.tsx
CHANGED
|
@@ -203,6 +203,7 @@ export const Preview: React.FC<PreviewProps> = ({
|
|
|
203
203
|
key={composition.id}
|
|
204
204
|
ref={playerRef}
|
|
205
205
|
component={composition.component}
|
|
206
|
+
compositionId={composition.id}
|
|
206
207
|
durationInFrames={composition.durationInFrames}
|
|
207
208
|
fps={composition.fps}
|
|
208
209
|
compositionWidth={composition.width}
|