// Détecte les identifiants référencés sans liaison (ReferenceError potentielle) via @babel/traverse const FE = require("path").resolve(__dirname, "../../../frontend/node_modules") + "/" const parser = require(FE + "@babel/parser") const traverse = require(FE + "@babel/traverse").default const fs = require("fs") const globals = new Set(Object.getOwnPropertyNames(globalThis).concat(["require","module","exports","__dirname","__filename","process","Buffer","console","setTimeout","clearTimeout","setInterval","clearInterval","setImmediate","URL","fetch","AbortController","structuredClone","undefined","arguments"])) let bad = 0 for (const file of process.argv.slice(2)) { const ast = parser.parse(fs.readFileSync(file, "utf8"), { sourceType: "script", allowReturnOutsideFunction: true }) traverse(ast, { ReferencedIdentifier(p) { const name = p.node.name if (p.scope.hasBinding(name, true) || globals.has(name)) return if (p.parentPath.isMemberExpression({ property: p.node }) && !p.parentPath.node.computed) return bad++ console.log(file.split("/").pop() + ":" + p.node.loc.start.line + " " + name) } }) } console.log(bad ? bad + " identifiant(s) non lié(s)" : "aucun identifiant non lié")