vue-hook-optimizer 0.0.59 → 0.0.61

Sign up to get free protection for your applications and to get access to all the features.
package/dist/index.mjs CHANGED
@@ -315,6 +315,108 @@ function processSetup(ast, parentScope, parentPath, _spread, _lineOffset = 0) {
315
315
  }
316
316
  }
317
317
  }, parentScope, parentPath);
318
+ function traverseHooks(node, patentScope) {
319
+ if (node.type === "ExpressionStatement" && node.expression.type === "CallExpression" && node.expression.callee.type === "Identifier" || node.type === "CallExpression" && node.callee.type === "Identifier") {
320
+ const hookName = (() => {
321
+ if (node.type === "ExpressionStatement" && node.expression.type === "CallExpression" && node.expression.callee.type === "Identifier") {
322
+ return node.expression.callee.name;
323
+ }
324
+ if (node.type === "CallExpression" && node.callee.type === "Identifier") {
325
+ return node.callee.name;
326
+ }
327
+ })() || "";
328
+ if (!hookName) {
329
+ return;
330
+ }
331
+ const hookBinding = patentScope.getBinding(hookName);
332
+ if (!(hookBinding === void 0 || hookBinding?.scope.block.type === "Program" || parentScope === hookBinding?.scope)) {
333
+ return;
334
+ }
335
+ const expression = node.type === "ExpressionStatement" ? node.expression : node;
336
+ const watchArgs = /* @__PURE__ */ new Set();
337
+ if (hookName === "provide") {
338
+ traverse2(expression, {
339
+ Identifier(path1) {
340
+ const binding = path1.scope.getBinding(path1.node.name);
341
+ if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
342
+ const _node = nodeCollection.getNode(path1.node.name);
343
+ if (_node?.info?.used) {
344
+ _node?.info?.used?.add(hookName);
345
+ } else if (_node) {
346
+ _node.info = {
347
+ ..._node?.info,
348
+ used: /* @__PURE__ */ new Set([hookName])
349
+ };
350
+ }
351
+ }
352
+ }
353
+ }, patentScope, node);
354
+ } else if (hookName === "watch") {
355
+ if (expression.arguments[0].type === "Identifier") {
356
+ const binding = patentScope.getBinding(expression.arguments[0].name);
357
+ if (graph.nodes.has(expression.arguments[0].name) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
358
+ watchArgs.add(expression.arguments[0]);
359
+ }
360
+ } else {
361
+ traverse2(expression.arguments[0], {
362
+ Identifier(path1) {
363
+ const binding = path1.scope.getBinding(path1.node.name);
364
+ if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
365
+ watchArgs.add(path1.node);
366
+ }
367
+ }
368
+ }, patentScope, node);
369
+ }
370
+ } else if (hookName === "useEffect" && expression.arguments[1].type === "ArrayExpression") {
371
+ traverse2(expression.arguments[1], {
372
+ Identifier(path1) {
373
+ const binding = path1.scope.getBinding(path1.node.name);
374
+ if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
375
+ watchArgs.add(path1.node);
376
+ }
377
+ }
378
+ }, patentScope, node);
379
+ }
380
+ expression.arguments.forEach((argNode, index) => {
381
+ if (hookName === "watch" && index === 0 && argNode.type === "Identifier") {
382
+ const _node = nodeCollection.getNode(argNode.name);
383
+ if (_node?.info?.used) {
384
+ _node?.info?.used?.add(hookName);
385
+ } else if (_node) {
386
+ _node.info = {
387
+ ..._node?.info,
388
+ used: /* @__PURE__ */ new Set([hookName])
389
+ };
390
+ }
391
+ return;
392
+ }
393
+ traverse2(argNode, {
394
+ Identifier(path1) {
395
+ const binding = path1.scope.getBinding(path1.node.name);
396
+ if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
397
+ if (["watch", "useEffect"].includes(hookName) && watchArgs.size > 0) {
398
+ const watchArgsNames = Array.from(watchArgs).map((arg) => arg.name);
399
+ watchArgs.forEach((watchArg) => {
400
+ if (!watchArgsNames.includes(path1.node.name)) {
401
+ graph.edges.get(watchArg.name)?.add(path1.node.name);
402
+ }
403
+ });
404
+ }
405
+ const _node = nodeCollection.getNode(path1.node.name);
406
+ if (_node?.info?.used) {
407
+ _node?.info?.used?.add(hookName);
408
+ } else if (_node) {
409
+ _node.info = {
410
+ ..._node?.info,
411
+ used: /* @__PURE__ */ new Set([hookName])
412
+ };
413
+ }
414
+ }
415
+ }
416
+ }, patentScope, node);
417
+ });
418
+ }
419
+ }
318
420
  traverse2(ast, {
319
421
  FunctionDeclaration(path) {
320
422
  const name = path.node.id?.name;
@@ -392,6 +494,9 @@ function processSetup(ast, parentScope, parentPath, _spread, _lineOffset = 0) {
392
494
  "ArrowFunctionExpression",
393
495
  "FunctionDeclaration"
394
496
  ].includes(path.node.init.type) && path.node.id.type === "Identifier") {
497
+ if (path.node.init.type === "CallExpression" && path.node.init.callee.type === "Identifier" && ["watch", "watchEffect"].includes(path.node.init.callee.name)) {
498
+ traverseHooks(path.node.init, path.scope);
499
+ }
395
500
  const name = path.node.id?.name;
396
501
  if (name && graph.nodes.has(name)) {
397
502
  traverse2(path.node.init, {
@@ -468,94 +573,24 @@ function processSetup(ast, parentScope, parentPath, _spread, _lineOffset = 0) {
468
573
  }
469
574
  },
470
575
  ExpressionStatement(path) {
471
- if (path.node.expression.type === "CallExpression" && path.node.expression.callee.type === "Identifier") {
472
- const hookName = path.node.expression.callee.name;
473
- const hookBinding = path.scope.getBinding(hookName);
474
- if (!(hookBinding === void 0 || hookBinding?.scope.block.type === "Program" || parentScope === hookBinding?.scope)) {
475
- return;
476
- }
477
- const watchArgs = /* @__PURE__ */ new Set();
478
- if (hookName === "provide") {
479
- traverse2(path.node.expression, {
480
- Identifier(path1) {
481
- const binding = path1.scope.getBinding(path1.node.name);
482
- if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
483
- const _node = nodeCollection.getNode(path1.node.name);
484
- if (_node?.info?.used) {
485
- _node?.info?.used?.add(hookName);
486
- } else if (_node) {
487
- _node.info = {
488
- ..._node?.info,
489
- used: /* @__PURE__ */ new Set([hookName])
490
- };
491
- }
492
- }
493
- }
494
- }, path.scope, path);
495
- } else if (hookName === "watch") {
496
- if (path.node.expression.arguments[0].type === "Identifier") {
497
- const binding = path.scope.getBinding(path.node.expression.arguments[0].name);
498
- if (graph.nodes.has(path.node.expression.arguments[0].name) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
499
- watchArgs.add(path.node.expression.arguments[0]);
500
- }
501
- } else {
502
- traverse2(path.node.expression.arguments[0], {
503
- Identifier(path1) {
504
- const binding = path1.scope.getBinding(path1.node.name);
505
- if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
506
- watchArgs.add(path1.node);
507
- }
508
- }
509
- }, path.scope, path);
576
+ if (path.type === "ExpressionStatement" && path.node.expression.type === "CallExpression" && path.node.expression.callee.type === "Identifier") {
577
+ const name = path.node.expression.callee.name;
578
+ if (graph.nodes.has(name) && path.scope.block.type === "Program") {
579
+ const _node = nodeCollection.getNode(name);
580
+ if (_node?.info?.used) {
581
+ _node?.info?.used?.add("Call Expression");
582
+ } else if (_node) {
583
+ _node.info = {
584
+ ..._node?.info,
585
+ used: /* @__PURE__ */ new Set(["Call Expression"])
586
+ };
510
587
  }
511
- } else if (hookName === "useEffect" && path.node.expression.arguments[1].type === "ArrayExpression") {
512
- traverse2(path.node.expression.arguments[1], {
513
- Identifier(path1) {
514
- const binding = path1.scope.getBinding(path1.node.name);
515
- if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
516
- watchArgs.add(path1.node);
517
- }
518
- }
519
- }, path.scope, path);
588
+ } else {
589
+ traverseHooks(path.node.expression, path.scope);
520
590
  }
521
- path.node.expression.arguments.forEach((argNode, index) => {
522
- if (hookName === "watch" && index === 0 && argNode.type === "Identifier") {
523
- const _node = nodeCollection.getNode(argNode.name);
524
- if (_node?.info?.used) {
525
- _node?.info?.used?.add(hookName);
526
- } else if (_node) {
527
- _node.info = {
528
- ..._node?.info,
529
- used: /* @__PURE__ */ new Set([hookName])
530
- };
531
- }
532
- return;
533
- }
534
- traverse2(argNode, {
535
- Identifier(path1) {
536
- const binding = path1.scope.getBinding(path1.node.name);
537
- if (graph.nodes.has(path1.node.name) && (path1.parent.type !== "MemberExpression" && path1.parent.type !== "OptionalMemberExpression" || path1.parent.object === path1.node) && (binding?.scope.block.type === "Program" || parentScope === binding?.scope)) {
538
- if (["watch", "useEffect"].includes(hookName) && watchArgs.size > 0) {
539
- const watchArgsNames = Array.from(watchArgs).map((arg) => arg.name);
540
- watchArgs.forEach((watchArg) => {
541
- if (!watchArgsNames.includes(path1.node.name)) {
542
- graph.edges.get(watchArg.name)?.add(path1.node.name);
543
- }
544
- });
545
- }
546
- const _node = nodeCollection.getNode(path1.node.name);
547
- if (_node?.info?.used) {
548
- _node?.info?.used?.add(hookName);
549
- } else if (_node) {
550
- _node.info = {
551
- ..._node?.info,
552
- used: /* @__PURE__ */ new Set([hookName])
553
- };
554
- }
555
- }
556
- }
557
- }, path.scope, path);
558
- });
591
+ }
592
+ if (path.type === "ExpressionStatement" && path.node.expression.type === "AssignmentExpression" && path.node.expression.right.type === "CallExpression" && path.node.expression.right.callee.type === "Identifier") {
593
+ traverseHooks(path.node.expression.right, path.scope);
559
594
  }
560
595
  }
561
596
  }, parentScope, parentPath);
@@ -2199,6 +2234,13 @@ function gen(graph, nodesUsedInTemplate, nodesUsedInStyle = /* @__PURE__ */ new
2199
2234
  }
2200
2235
 
2201
2236
  // src/vis.ts
2237
+ function filterNodeUserd(used) {
2238
+ const usedArray = Array.from(used || []);
2239
+ return new Set(usedArray.filter((u) => ![
2240
+ "Assignment Expression",
2241
+ "Call Expression"
2242
+ ].includes(u)));
2243
+ }
2202
2244
  function getVisData(graph, nodesUsedInTemplate, nodesUsedInStyle = /* @__PURE__ */ new Set()) {
2203
2245
  const usedNodes = /* @__PURE__ */ new Set([...nodesUsedInTemplate, ...nodesUsedInStyle]);
2204
2246
  const nodes = [];
@@ -2209,7 +2251,7 @@ function getVisData(graph, nodesUsedInTemplate, nodesUsedInStyle = /* @__PURE__
2209
2251
  label: node.label,
2210
2252
  shape: node.type === "var" ? "dot" : "diamond",
2211
2253
  group: usedNodes.has(node.label) || node.info?.used?.size ? "used" : "normal",
2212
- title: `${node.info?.used?.size ? `used by ${Array.from(node.info?.used || [])?.map((i) => `\`${i}\``).join(",")}
2254
+ title: `${filterNodeUserd(node.info?.used).size ? `used by ${Array.from(filterNodeUserd(node.info?.used))?.map((i) => `\`${i}\``).join(",")}
2213
2255
 
2214
2256
  ` : ""}${usedNodes.has(node.label) ? `used in ${[
2215
2257
  nodesUsedInStyle.has(node.label) ? "style" : "",