UNPKG

vite-plugin-circular-dependency

Version:
2 lines (1 loc) 5.91 kB
import n from"chalk";import{writeFileSync as e}from"node:fs";import{createFilter as t}from"@rollup/pluginutils";import{join as o,relative as r}from"node:path";class d{moduleId;importerModuleIds;children=null;constructor(n,e){this.moduleId=n,this.importerModuleIds=e}}function i(n,e){const t=new Set;!function n(o){t.add(o.moduleId);(function(n){const{importerModuleIds:t}=n;return t.map(n=>e.get(n)).filter(Boolean)})(o).forEach(e=>{t.has(e.moduleId)||n(e),o.children||(o.children=new Set),o.children.add(e)})}(n)}function u(n){const e=new Map,t=new Set;return function n(o,r){const{moduleId:d,children:i}=o;t.has(d)||(r.add(d),i?.forEach(t=>{const{moduleId:o}=t;r.has(o)?function(n,e){const t=n.sort((n,e)=>n.moduleId<e.moduleId?-1:1),o=t.map(n=>n.moduleId).join("-");e.set(o,t)}(function(n,e){const t=[];let o=n;do{if(t.push(o),!o.children)break;o=Array.from(o.children).find(n=>e.has(n.moduleId)&&!t.includes(n))}while(o&&o!==n);return t}(t,r),e):n(t,r)}),t.add(d),r.delete(d))}(n,new Set),e}const s=(n,t)=>{const o=(n=>'<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title>Dependency Graph with Vis.js</title>\n <style>\n #network {\n width: 100%;\n height: 600px;\n }\n </style>\n <script src="https://unpkg.com/vis-network/standalone/umd/vis-network.min.js"><\/script>\n </head>\n <body>\n <div id="network"></div>\n <script>\n const transformJson = (input) => {\n const output = {};\n for (const key in input) {\n const dependencies = input[key];\n const transformedDependencies = dependencies.map((depArray) => {\n return [...depArray, key];\n });\n output[key] = transformedDependencies;\n }\n return output;\n };\n const originData = {{DATA}}\n const data = transformJson(originData);\n\n const nodes = new Set();\n const edges = [];\n\n // 处理数据,构建节点和边\n for (const key in data) {\n data[key].forEach((linkArray) => {\n for (let i = 0; i < linkArray.length - 1; i++) {\n edges.push({ from: linkArray[i], to: linkArray[i + 1] });\n nodes.add(linkArray[i]);\n nodes.add(linkArray[i + 1]);\n }\n });\n }\n\n const nodesArray = Array.from(nodes).map((node) => {\n const fileName = node.split("/").pop(); // 获取文件名\n return { id: node, label: fileName, title: node }; // 设置悬浮显示完整路径\n });\n\n // 创建网络图\n const container = document.getElementById("network");\n const dataVis = {\n nodes: new vis.DataSet(nodesArray),\n edges: new vis.DataSet(edges),\n };\n const options = {\n physics: true,\n manipulation: {\n enabled: false,\n },\n nodes: {\n // 添加节点形状设置\n shape: "dot", // 设置节点为圆形\n size: 8, // 设置节点大小\n },\n edges: {\n arrows: {\n to: { enabled: true, scaleFactor: 1, type: "arrow" }, // 添加箭头\n },\n },\n };\n const network = new vis.Network(container, dataVis, options);\n <\/script>\n </body>\n</html>\n'.replace("{{DATA}}",JSON.stringify(n)))(n);e(t,o,"utf-8")};function c(t,o){const r=function(n,e){const t=function(n,e){return e.map(e=>e.map(e=>n.formatOutModulePath(e.moduleId)))}(n,function(n){return Array.from(n.values()).filter(n=>n.length)}(e)),o=function(n){return n.reduce((n,e)=>{const t=e[0];return n[t]||(n[t]=[]),n[t].push(e),n},{})}(t);return n.formatOut(o)}(t,o);!function(t,o){const{outputFilePath:r,outputInteractiveFilePath:d}=t;r?function(n,t){e(n.outputFilePath,JSON.stringify(t,null,"\t"))}(t,o):function(e,t){Object.entries(t).forEach(t=>{const[o,r]=t;console.group(),console.log("\n\n"+n.yellow(e.formatOutModulePath(o))),r.forEach(e=>{console.log("\t"+e.map(e=>n.red(e)).join(n.blue(" -> ")))}),console.groupEnd()})}(t,o),d&&s(o,d)}(t,r),function(n,e){if(n.circleImportThrowErr&&Object.keys(e).length)throw new Error("has circular dependencies in this project")}(t,r)}function a(n){const e=function(n){let{include:e=[/\.[jt]sx?$/,/\.vue$/,/\.vue\?vue/,/\.svelte$/],exclude:t=[/[\\/]node_modules[\\/]/,/[\\/]\.git[\\/]/],outputFilePath:r="",outputInteractiveFilePath:d="",circleImportThrowErr:i=!0,formatOutModulePath:u,formatOut:s,ignoreDynamicImport:c=!1}=n??{};r&&(r=o(process.cwd(),r));return{include:e,exclude:t,outputFilePath:r,outputInteractiveFilePath:d,circleImportThrowErr:i,ignoreDynamicImport:c,formatOutModulePath:u??l,formatOut:s??p}}(n),{ignoreModuleIdSet:r,processIgnore:d}=function(){const n=/@circular-ignore/gi,e=e=>n.test(e),t=new Set,o=(n,o)=>{e(o)&&t.add(n)};return{ignoreModuleIdSet:t,processIgnore:o}}(),{include:i,exclude:u}=e,s=t(i,u),{getRootModuleNode:c,handleLoadModule:a,moduleIdNodeMap:m}=function(){const{getRootModuleId:n,setRootModuleId:e}=function(){let n;return{getRootModuleId:()=>n,setRootModuleId(e){n||(n=e)}}}(),t=new Map;return{getRootModuleNode:()=>t.get(n()),handleLoadModule:e,moduleIdNodeMap:t}}();return{...e,filter:n=>s(n)&&!r.has(n),getRootModuleNode:c,handleLoadModule:a,processIgnore:d,moduleIdNodeMap:m}}function l(n){return r(process.cwd(),n)}function p(n){return n}var m=n=>{const e=a(n),{filter:t,getRootModuleNode:o,handleLoadModule:r,moduleIdNodeMap:s,processIgnore:l}=e;return{name:"vite-plugin-circular-dependency",enforce:"pre",load:n=>{t(n)&&r(n)},transform(n,e){l(e,n)},moduleParsed:n=>{const{id:o}=n;if(!t(o))return;const r=function(n,e){const t=function(n,e){const{importedIds:t,dynamicallyImportedIds:o}=n;return e.ignoreDynamicImport?t:[...t,...o]}(n,e),{id:o}=n;return new d(o,t)}(n,e);s.set(n.id,r)},generateBundle(){const n=o();if(!n)return void console.error("Failed to generate entry module");i(n,s);const t=u(n);c(e,t)}}};export{m as default};