vectorvesper 2.1.0 → 2.1.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/dist/hooks.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "1.0.0",
|
|
3
3
|
"engineVersion": "1.0.2",
|
|
4
|
-
"generatedAt": "2026-08-
|
|
4
|
+
"generatedAt": "2026-08-09T14:27:32.779Z",
|
|
5
5
|
"contractLevel": "full",
|
|
6
6
|
"hooks": [
|
|
7
7
|
{
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
"exposeImplementation": false,
|
|
96
96
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
97
97
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
98
|
-
"readingSource": "
|
|
98
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
99
99
|
}
|
|
100
100
|
},
|
|
101
101
|
{
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
"exposeImplementation": false,
|
|
196
196
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
197
197
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
198
|
-
"readingSource": "
|
|
198
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
199
199
|
}
|
|
200
200
|
},
|
|
201
201
|
{
|
|
@@ -342,7 +342,7 @@
|
|
|
342
342
|
"exposeImplementation": false,
|
|
343
343
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
344
344
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
345
|
-
"readingSource": "
|
|
345
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
346
346
|
}
|
|
347
347
|
},
|
|
348
348
|
{
|
|
@@ -450,7 +450,7 @@
|
|
|
450
450
|
"exposeImplementation": false,
|
|
451
451
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
452
452
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
453
|
-
"readingSource": "
|
|
453
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
454
454
|
}
|
|
455
455
|
},
|
|
456
456
|
{
|
|
@@ -559,7 +559,7 @@
|
|
|
559
559
|
"exposeImplementation": false,
|
|
560
560
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
561
561
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
562
|
-
"readingSource": "
|
|
562
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
563
563
|
}
|
|
564
564
|
},
|
|
565
565
|
{
|
|
@@ -677,7 +677,7 @@
|
|
|
677
677
|
"exposeImplementation": false,
|
|
678
678
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
679
679
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
680
|
-
"readingSource": "
|
|
680
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
681
681
|
}
|
|
682
682
|
},
|
|
683
683
|
{
|
|
@@ -804,7 +804,7 @@
|
|
|
804
804
|
"exposeImplementation": false,
|
|
805
805
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
806
806
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
807
|
-
"readingSource": "
|
|
807
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
808
808
|
}
|
|
809
809
|
},
|
|
810
810
|
{
|
|
@@ -941,7 +941,7 @@
|
|
|
941
941
|
"exposeImplementation": false,
|
|
942
942
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
943
943
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
944
|
-
"readingSource": "
|
|
944
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
945
945
|
}
|
|
946
946
|
},
|
|
947
947
|
{
|
|
@@ -1077,7 +1077,7 @@
|
|
|
1077
1077
|
"exposeImplementation": false,
|
|
1078
1078
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1079
1079
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1080
|
-
"readingSource": "
|
|
1080
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1081
1081
|
}
|
|
1082
1082
|
},
|
|
1083
1083
|
{
|
|
@@ -1212,7 +1212,7 @@
|
|
|
1212
1212
|
"exposeImplementation": false,
|
|
1213
1213
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1214
1214
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1215
|
-
"readingSource": "
|
|
1215
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1216
1216
|
}
|
|
1217
1217
|
},
|
|
1218
1218
|
{
|
|
@@ -1364,7 +1364,7 @@
|
|
|
1364
1364
|
"exposeImplementation": false,
|
|
1365
1365
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1366
1366
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1367
|
-
"readingSource": "
|
|
1367
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1368
1368
|
}
|
|
1369
1369
|
},
|
|
1370
1370
|
{
|
|
@@ -1506,7 +1506,7 @@
|
|
|
1506
1506
|
"exposeImplementation": false,
|
|
1507
1507
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1508
1508
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1509
|
-
"readingSource": "
|
|
1509
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1510
1510
|
}
|
|
1511
1511
|
},
|
|
1512
1512
|
{
|
|
@@ -1673,7 +1673,7 @@
|
|
|
1673
1673
|
"exposeImplementation": false,
|
|
1674
1674
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1675
1675
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1676
|
-
"readingSource": "
|
|
1676
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1677
1677
|
}
|
|
1678
1678
|
},
|
|
1679
1679
|
{
|
|
@@ -1795,7 +1795,7 @@
|
|
|
1795
1795
|
"exposeImplementation": false,
|
|
1796
1796
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1797
1797
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1798
|
-
"readingSource": "
|
|
1798
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1799
1799
|
}
|
|
1800
1800
|
},
|
|
1801
1801
|
{
|
|
@@ -1903,7 +1903,7 @@
|
|
|
1903
1903
|
"exposeImplementation": false,
|
|
1904
1904
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
1905
1905
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
1906
|
-
"readingSource": "
|
|
1906
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
1907
1907
|
}
|
|
1908
1908
|
},
|
|
1909
1909
|
{
|
|
@@ -2064,7 +2064,7 @@
|
|
|
2064
2064
|
"exposeImplementation": false,
|
|
2065
2065
|
"reason": "Reproducing this hook's implementation makes the consumer run a private requestAnimationFrame loop instead of joining the shared FrameConductor. That silently removes the coordination, scheduling and frame-budget governance the runtime exists to provide, and nothing errors when it happens. Copying is a correctness bug, not just a licensing question.",
|
|
2066
2066
|
"correctUsage": "Install @vectorvesper/motion and import the hook. Never inline, reimplement, or paste an equivalent.",
|
|
2067
|
-
"readingSource": "
|
|
2067
|
+
"readingSource": "The `mechanism` field above is the answer to almost every 'how does this actually work' question, and it is written for the version you have. Prefer it. The published package is minified and ships no sourcemaps, so node_modules is a poor place to read from — but @vectorvesper/motion is MIT, so the real source is readable in the repository if you want it. Either way it changes nothing about the output: what you write is still an import. A copy compiles, passes review and silently runs its own rAF loop outside the conductor, so 'I read the source and it looked simple' is exactly how that bug gets shipped."
|
|
2068
2068
|
}
|
|
2069
2069
|
}
|
|
2070
2070
|
],
|
package/dist/index.js
CHANGED
|
@@ -993,7 +993,7 @@ Remove ${slug}
|
|
|
993
993
|
import fs6 from "fs";
|
|
994
994
|
import path6 from "path";
|
|
995
995
|
import pc8 from "picocolors";
|
|
996
|
-
var CLI_VERSION = true ? "2.1.
|
|
996
|
+
var CLI_VERSION = true ? "2.1.1" : "0.0.0-dev";
|
|
997
997
|
async function infoCommand() {
|
|
998
998
|
console.log(pc8.bold(pc8.cyan("\nVector Vesper Diagnostics\n")));
|
|
999
999
|
const projectInfo = detectProject();
|
|
@@ -1291,7 +1291,7 @@ async function whoamiCommand() {
|
|
|
1291
1291
|
}
|
|
1292
1292
|
|
|
1293
1293
|
// src/index.ts
|
|
1294
|
-
var version = true ? "2.1.
|
|
1294
|
+
var version = true ? "2.1.1" : "0.0.0-dev";
|
|
1295
1295
|
var program = new Command();
|
|
1296
1296
|
program.name("vv").description("Vector Vesper CLI \u2014 add visual components to your React project").version(version).option("--verbose", "Show detailed debug output").hook("preAction", (thisCommand) => {
|
|
1297
1297
|
const opts = thisCommand.opts();
|
|
@@ -1330,7 +1330,7 @@ program.command("whoami", { hidden: true }).description("Show current authentica
|
|
|
1330
1330
|
await whoamiCommand();
|
|
1331
1331
|
});
|
|
1332
1332
|
program.command("mcp [action]").description("Run as an MCP server (stdio) for AI coding agents. `vv mcp status` checks the setup.").option("--stdio", "Force server mode even from an interactive terminal").action(async (action, options) => {
|
|
1333
|
-
const { mcpCommand } = await import("./mcp-
|
|
1333
|
+
const { mcpCommand } = await import("./mcp-FCM3FZSK.js");
|
|
1334
1334
|
await mcpCommand(action, options);
|
|
1335
1335
|
});
|
|
1336
1336
|
process.on("unhandledRejection", (error) => {
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
|
|
8
8
|
// src/commands/mcp.ts
|
|
9
9
|
import pc from "picocolors";
|
|
10
|
-
var VERSION = true ? "2.1.
|
|
10
|
+
var VERSION = true ? "2.1.1" : "0.0.0-dev";
|
|
11
11
|
var CONFIG_SNIPPET = `{
|
|
12
12
|
"mcpServers": {
|
|
13
13
|
"vectorvesper": {
|
|
@@ -101,7 +101,7 @@ ${pc.red("\u2717")} Unknown argument "${action}" for \`vv mcp\`.
|
|
|
101
101
|
return;
|
|
102
102
|
}
|
|
103
103
|
protectStdout();
|
|
104
|
-
const { startMcpServer } = await import("./server-
|
|
104
|
+
const { startMcpServer } = await import("./server-WQ564YNA.js");
|
|
105
105
|
try {
|
|
106
106
|
await startMcpServer();
|
|
107
107
|
} catch (error) {
|
|
@@ -51,6 +51,8 @@ function collect(ast, traverse) {
|
|
|
51
51
|
usesUseGSAP: false,
|
|
52
52
|
usesR3F: false,
|
|
53
53
|
raf: [],
|
|
54
|
+
rafSelfScheduling: [],
|
|
55
|
+
rafUnresolved: 0,
|
|
54
56
|
hasCancelRaf: false,
|
|
55
57
|
addEventListener: [],
|
|
56
58
|
hasRemoveEventListener: false,
|
|
@@ -113,10 +115,14 @@ function collect(ast, traverse) {
|
|
|
113
115
|
const line = node.loc?.start.line ?? 0;
|
|
114
116
|
const argPaths = typeof p.get === "function" ? p.get("arguments") : [];
|
|
115
117
|
switch (name) {
|
|
116
|
-
case "requestAnimationFrame":
|
|
118
|
+
case "requestAnimationFrame": {
|
|
117
119
|
f.raf.push(line);
|
|
118
|
-
|
|
120
|
+
const cb = resolveFunction(argPaths[0]);
|
|
121
|
+
if (!cb) f.rafUnresolved++;
|
|
122
|
+
else if (callbackSchedulesAnotherFrame(cb, traverse)) f.rafSelfScheduling.push(line);
|
|
123
|
+
scanHotCallback(cb, "a requestAnimationFrame loop", true);
|
|
119
124
|
break;
|
|
125
|
+
}
|
|
120
126
|
case "cancelAnimationFrame":
|
|
121
127
|
f.hasCancelRaf = true;
|
|
122
128
|
break;
|
|
@@ -211,6 +217,9 @@ function collect(ast, traverse) {
|
|
|
211
217
|
},
|
|
212
218
|
Identifier(p) {
|
|
213
219
|
const name = p.node.name;
|
|
220
|
+
if (/^(reducedMotion|prefersReducedMotion|prefersReduced)$/.test(name)) {
|
|
221
|
+
f.hasReducedMotionGuard = true;
|
|
222
|
+
}
|
|
214
223
|
if (!BROWSER_GLOBALS.has(name)) return;
|
|
215
224
|
if (fnDepth !== 0) return;
|
|
216
225
|
const parent = p.parent;
|
|
@@ -265,8 +274,27 @@ function checkClientBoundary(f, file, framework) {
|
|
|
265
274
|
}
|
|
266
275
|
return out;
|
|
267
276
|
}
|
|
277
|
+
function callbackSchedulesAnotherFrame(cbNode, traverse) {
|
|
278
|
+
const isDeclaration = cbNode.type === "FunctionDeclaration";
|
|
279
|
+
const isExpression = cbNode.type === "ArrowFunctionExpression" || cbNode.type === "FunctionExpression";
|
|
280
|
+
if (!isDeclaration && !isExpression) return false;
|
|
281
|
+
const statement = isDeclaration ? cbNode : { type: "ExpressionStatement", expression: cbNode };
|
|
282
|
+
let found = false;
|
|
283
|
+
traverse(
|
|
284
|
+
{ type: "File", program: { type: "Program", body: [statement], directives: [] } },
|
|
285
|
+
{
|
|
286
|
+
CallExpression(p) {
|
|
287
|
+
if (calleeName(p.node.callee) === "requestAnimationFrame") found = true;
|
|
288
|
+
},
|
|
289
|
+
OptionalCallExpression(p) {
|
|
290
|
+
if (calleeName(p.node.callee) === "requestAnimationFrame") found = true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
return found;
|
|
295
|
+
}
|
|
268
296
|
function isRafLoop(f) {
|
|
269
|
-
return f.
|
|
297
|
+
return f.rafSelfScheduling.length > 0 || f.rafUnresolved >= 2;
|
|
270
298
|
}
|
|
271
299
|
function checkOrphanRaf(f, file) {
|
|
272
300
|
if (!isRafLoop(f)) return [];
|
|
@@ -275,8 +303,10 @@ function checkOrphanRaf(f, file) {
|
|
|
275
303
|
rule: "orphan-raf",
|
|
276
304
|
severity: "warning",
|
|
277
305
|
file,
|
|
278
|
-
|
|
279
|
-
|
|
306
|
+
// Point at the self-scheduling call when we found one — that is the loop
|
|
307
|
+
// itself, not merely the first rAF in the file.
|
|
308
|
+
line: f.rafSelfScheduling[0] ?? f.raf[0],
|
|
309
|
+
message: `This file runs its own \`requestAnimationFrame\` loop${f.rafSelfScheduling.length > 1 ? ` (\xD7${f.rafSelfScheduling.length})` : ""}. Independent loops each schedule their own frame and cannot shed work under load \u2014 the coordination the runtime exists to provide is lost.`,
|
|
280
310
|
fix: "Drive the animation from the shared conductor (`getConductor().subscribe(...)` in `@vectorvesper/motion`) or a hook that already joins it, so it shares one frame budget.",
|
|
281
311
|
nudge: "Call `list_hooks` \u2014 a sensor or governor primitive may already cover this without a hand-written loop."
|
|
282
312
|
}
|
|
@@ -400,7 +430,7 @@ async function checkMotionFiles(files, cwd) {
|
|
|
400
430
|
}
|
|
401
431
|
|
|
402
432
|
// src/mcp/server.ts
|
|
403
|
-
var VERSION = true ? "2.1.
|
|
433
|
+
var VERSION = true ? "2.1.1" : "0.0.0-dev";
|
|
404
434
|
function text(body) {
|
|
405
435
|
return { content: [{ type: "text", text: body }] };
|
|
406
436
|
}
|