@next-core/cook 1.4.0 → 1.6.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/CHANGELOG.md +30 -0
- package/dist/cjs/AnalysisContext.js.map +1 -1
- package/dist/cjs/lint.js +73 -66
- package/dist/cjs/lint.js.map +1 -1
- package/dist/cjs/precook.js +76 -77
- package/dist/cjs/precook.js.map +1 -1
- package/dist/esm/AnalysisContext.js.map +1 -1
- package/dist/esm/lint.js +73 -66
- package/dist/esm/lint.js.map +1 -1
- package/dist/esm/precook.js +77 -78
- package/dist/esm/precook.js.map +1 -1
- package/dist/types/AnalysisContext.d.ts +2 -1
- package/dist/types/precook.d.ts +14 -3
- package/package.json +4 -4
package/dist/cjs/precook.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/precook.ts"],"names":["precook","rootAst","expressionOnly","visitors","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","AnalysisEnvironment","rootContext","AnalysisContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","Evaluate","Array","isArray","n","beforeVisit","ResolveBinding","name","add","__GlobalVariable","elements","env","closure","OrdinaryFunctionCreate","CallFunction","left","right","callee","arguments","expression","test","consequent","alternate","object","computed","property","properties","key","value","argument","expressions","tag","quasi","body","runningContext","oldEnv","blockEnv","BlockDeclarationInstantiation","catchEnv","BoundNamesInstantiation","param","lexicalBinding","kind","newEnv","iterationEnv","init","loopEnv","update","fn","fo","CreateBinding","InstantiateOrdinaryFunctionExpression","discriminant","cases","block","handler","finalizer","declarations","id","__UnknownNode","console","warn","GetIdentifierReference","HasBinding","OuterEnv","code","var","topLevel","PrepareOrdinaryCall","FunctionDeclarationInstantiation","ECMAScriptCode","pop","F","calleeContext","localEnv","Environment","func","formals","FormalParameters","hasParameterExpressions","varDeclarations","varNames","varEnv","lexEnv","lexDeclarations","functionExpression","scope","funcEnv","params"],"mappings":"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","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Statement,\n SwitchCase,\n VariableDeclaration,\n} from \"@babel/types\";\nimport { hasOwnProperty } from \"./hasOwnProperty\";\nimport {\n AnalysisContext,\n AnalysisEnvironment,\n AnalysisFunctionObject,\n} from \"./AnalysisContext\";\nimport { EstreeNode, EstreeVisitors, NodeWithBoundNames } from \"./interfaces\";\nimport {\n collectBoundNames,\n collectScopedDeclarations,\n containsExpression,\n} from \"./traverse\";\n\nexport interface PrecookOptions {\n expressionOnly?: boolean;\n visitors?: EstreeVisitors;\n hooks?: PrecookHooks;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode): void;\n}\n\n/**\n * Analysis an AST of a storyboard function or an evaluation expression.\n *\n * @param rootAst - The root AST.\n * @param options - Analysis options.\n * @returns A set of global variables the root AST attempts to access.\n */\nexport function precook(\n rootAst: Expression | FunctionDeclaration,\n { expressionOnly, visitors, hooks = {} }: PrecookOptions = {}\n): Set<string> {\n const attemptToVisitGlobals = new Set<string>();\n const analysisContextStack: AnalysisContext[] = [];\n const rootEnv = new AnalysisEnvironment(null);\n const rootContext = new AnalysisContext();\n rootContext.VariableEnvironment = rootEnv;\n rootContext.LexicalEnvironment = rootEnv;\n analysisContextStack.push(rootContext);\n\n function getRunningContext(): AnalysisContext {\n return analysisContextStack[analysisContextStack.length - 1];\n }\n\n function visit(node: EstreeNode): void {\n if (hasOwnProperty(visitors, node.type)) {\n visitors[node.type](node);\n }\n }\n\n function Evaluate(node: EstreeNode | EstreeNode[]): void {\n if (Array.isArray(node)) {\n for (const n of node) {\n Evaluate(n);\n }\n } else if (node) {\n // `node` maybe `null` in some cases.\n hooks.beforeVisit?.(node);\n visitors && visit(node);\n // Expressions:\n switch (node.type) {\n case \"Identifier\":\n if (!ResolveBinding(node.name)) {\n attemptToVisitGlobals.add(node.name);\n if (visitors && hasOwnProperty(visitors, \"__GlobalVariable\")) {\n visitors.__GlobalVariable(node);\n }\n }\n return;\n case \"ArrayExpression\":\n case \"ArrayPattern\":\n Evaluate(node.elements);\n return;\n case \"ArrowFunctionExpression\": {\n const env = getRunningContext().LexicalEnvironment;\n const closure = OrdinaryFunctionCreate(node, env);\n CallFunction(closure);\n return;\n }\n case \"AssignmentPattern\":\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n Evaluate(node.left);\n Evaluate(node.right);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n Evaluate(node.callee);\n Evaluate(node.arguments);\n return;\n case \"ChainExpression\":\n Evaluate(node.expression);\n return;\n case \"ConditionalExpression\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n Evaluate(node.alternate);\n return;\n case \"MemberExpression\":\n Evaluate(node.object);\n if (node.computed) {\n Evaluate(node.property);\n }\n return;\n case \"ObjectExpression\":\n case \"ObjectPattern\":\n Evaluate(node.properties);\n return;\n case \"Property\":\n if (node.computed) {\n Evaluate(node.key);\n }\n Evaluate(node.value);\n return;\n case \"RestElement\":\n case \"SpreadElement\":\n case \"UnaryExpression\":\n Evaluate(node.argument);\n return;\n case \"SequenceExpression\":\n case \"TemplateLiteral\":\n Evaluate(node.expressions);\n return;\n case \"TaggedTemplateExpression\":\n Evaluate(node.tag);\n Evaluate(node.quasi);\n return;\n case \"Literal\":\n return;\n }\n if (!expressionOnly) {\n // Statements and assignments:\n switch (node.type) {\n case \"AssignmentExpression\":\n Evaluate(node.right);\n Evaluate(node.left);\n return;\n case \"BlockStatement\": {\n if (!node.body.length) {\n return;\n }\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.body, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"BreakStatement\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n return;\n case \"CatchClause\": {\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const catchEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.param, catchEnv);\n runningContext.LexicalEnvironment = catchEnv;\n Evaluate(node.param);\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"DoWhileStatement\":\n Evaluate(node.body);\n Evaluate(node.test);\n return;\n case \"ExpressionStatement\":\n case \"TSAsExpression\":\n Evaluate(node.expression);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\": {\n // ForIn/OfHeadEvaluation\n const lexicalBinding =\n node.left.type === \"VariableDeclaration\" &&\n node.left.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const newEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, newEnv);\n runningContext.LexicalEnvironment = newEnv;\n }\n Evaluate(node.right);\n runningContext.LexicalEnvironment = oldEnv;\n\n // ForIn/OfBodyEvaluation\n if (lexicalBinding) {\n const iterationEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, iterationEnv);\n runningContext.LexicalEnvironment = iterationEnv;\n }\n Evaluate(node.left);\n Evaluate(node.body);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"ForStatement\": {\n const lexicalBinding =\n node.init?.type === \"VariableDeclaration\" &&\n node.init.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const loopEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(\n node.init as VariableDeclaration,\n loopEnv\n );\n runningContext.LexicalEnvironment = loopEnv;\n }\n Evaluate(node.init);\n Evaluate(node.test);\n Evaluate(node.body);\n Evaluate(node.update);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"FunctionDeclaration\": {\n const [fn] = collectBoundNames(node);\n const env = getRunningContext().LexicalEnvironment;\n const fo = OrdinaryFunctionCreate(node, env);\n env.CreateBinding(fn);\n CallFunction(fo);\n return;\n }\n case \"FunctionExpression\": {\n const closure = InstantiateOrdinaryFunctionExpression(node);\n CallFunction(closure);\n return;\n }\n case \"IfStatement\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n Evaluate(node.alternate);\n return;\n case \"ReturnStatement\":\n case \"ThrowStatement\":\n case \"UpdateExpression\":\n Evaluate(node.argument);\n return;\n case \"SwitchCase\":\n Evaluate(node.test);\n Evaluate(node.consequent);\n return;\n case \"SwitchStatement\": {\n Evaluate(node.discriminant);\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.cases, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n Evaluate(node.cases);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"TryStatement\":\n Evaluate(node.block);\n Evaluate(node.handler);\n Evaluate(node.finalizer);\n return;\n case \"VariableDeclaration\":\n Evaluate(node.declarations);\n return;\n case \"VariableDeclarator\":\n Evaluate(node.id);\n Evaluate(node.init);\n return;\n case \"WhileStatement\":\n Evaluate(node.test);\n Evaluate(node.body);\n return;\n }\n }\n if (visitors && hasOwnProperty(visitors, \"__UnknownNode\")) {\n visitors.__UnknownNode(node);\n } else {\n // eslint-disable-next-line no-console\n console.warn(`Unsupported node type \\`${node.type}\\``);\n }\n }\n }\n\n function BoundNamesInstantiation(\n declarations: NodeWithBoundNames | NodeWithBoundNames[],\n env: AnalysisEnvironment\n ): void {\n for (const name of collectBoundNames(declarations)) {\n env.CreateBinding(name);\n }\n }\n\n function ResolveBinding(name: string): boolean {\n const env = getRunningContext().LexicalEnvironment;\n return GetIdentifierReference(env, name);\n }\n\n function GetIdentifierReference(\n env: AnalysisEnvironment,\n name: string\n ): boolean {\n return (\n !!env &&\n (env.HasBinding(name) || GetIdentifierReference(env.OuterEnv, name))\n );\n }\n\n function BlockDeclarationInstantiation(\n code: Statement[] | SwitchCase[],\n env: AnalysisEnvironment\n ): void {\n const declarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: false,\n });\n BoundNamesInstantiation(declarations, env);\n }\n\n function CallFunction(closure: AnalysisFunctionObject): void {\n PrepareOrdinaryCall(closure);\n FunctionDeclarationInstantiation(closure);\n Evaluate(closure.ECMAScriptCode);\n analysisContextStack.pop();\n }\n\n function PrepareOrdinaryCall(F: AnalysisFunctionObject): void {\n const calleeContext = new AnalysisContext();\n const localEnv = new AnalysisEnvironment(F.Environment);\n calleeContext.VariableEnvironment = localEnv;\n calleeContext.LexicalEnvironment = localEnv;\n analysisContextStack.push(calleeContext);\n }\n\n function FunctionDeclarationInstantiation(\n func: AnalysisFunctionObject\n ): void {\n const calleeContext = getRunningContext();\n const code = func.ECMAScriptCode;\n const formals = func.FormalParameters;\n const hasParameterExpressions = containsExpression(formals);\n const varDeclarations = collectScopedDeclarations(code, {\n var: true,\n topLevel: true,\n });\n const varNames = collectBoundNames(varDeclarations);\n\n const env = calleeContext.LexicalEnvironment;\n BoundNamesInstantiation(formals, env);\n\n Evaluate(formals);\n\n let varEnv: AnalysisEnvironment;\n if (!hasParameterExpressions) {\n // NOTE: Only a single Environment Record is needed for the parameters\n // and top-level vars.\n for (const n of varNames) {\n env.CreateBinding(n);\n }\n varEnv = env;\n } else {\n // NOTE: A separate Environment Record is needed to ensure that closures\n // created by expressions in the formal parameter list do not have\n // visibility of declarations in the function body.\n varEnv = new AnalysisEnvironment(env);\n calleeContext.VariableEnvironment = varEnv;\n for (const n of varNames) {\n varEnv.CreateBinding(n);\n }\n }\n const lexEnv = varEnv;\n calleeContext.LexicalEnvironment = lexEnv;\n\n const lexDeclarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: true,\n });\n BoundNamesInstantiation(lexDeclarations, lexEnv);\n }\n\n function InstantiateOrdinaryFunctionExpression(\n functionExpression: FunctionExpression\n ): AnalysisFunctionObject {\n const scope = getRunningContext().LexicalEnvironment;\n if (!functionExpression.id) {\n return OrdinaryFunctionCreate(functionExpression, scope);\n }\n const name = functionExpression.id.name;\n const funcEnv = new AnalysisEnvironment(scope);\n funcEnv.CreateBinding(name);\n return OrdinaryFunctionCreate(functionExpression, funcEnv);\n }\n\n function OrdinaryFunctionCreate(\n {\n params,\n body,\n }: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression,\n scope: AnalysisEnvironment\n ): AnalysisFunctionObject {\n return {\n FormalParameters: params,\n ECMAScriptCode: body.type === \"BlockStatement\" ? body.body : body,\n Environment: scope,\n };\n }\n\n Evaluate(rootAst);\n\n return attemptToVisitGlobals;\n}\n"],"file":"precook.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/precook.ts"],"names":["precook","rootAst","expressionOnly","visitors","withParent","hooks","attemptToVisitGlobals","Set","analysisContextStack","rootEnv","AnalysisEnvironment","rootContext","AnalysisContext","VariableEnvironment","LexicalEnvironment","push","getRunningContext","length","visit","node","type","EvaluateChildren","keys","parent","key","Evaluate","concat","Array","isArray","forEach","n","index","slice","beforeVisit","ResolveBinding","name","beforeVisitGlobal","add","env","closure","OrdinaryFunctionCreate","CallFunction","computed","body","runningContext","oldEnv","blockEnv","BlockDeclarationInstantiation","catchEnv","BoundNamesInstantiation","param","lexicalBinding","left","kind","newEnv","iterationEnv","init","loopEnv","fn","fo","CreateBinding","InstantiateOrdinaryFunctionExpression","cases","silent","beforeVisitUnknown","console","warn","declarations","GetIdentifierReference","HasBinding","OuterEnv","code","var","topLevel","PrepareOrdinaryCall","FunctionDeclarationInstantiation","ECMAScriptCode","Function","pop","F","calleeContext","localEnv","Environment","func","formals","FormalParameters","hasParameterExpressions","varDeclarations","varNames","varEnv","lexEnv","lexDeclarations","functionExpression","scope","id","funcEnv","params","undefined"],"mappings":"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","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Identifier,\n Statement,\n SwitchCase,\n VariableDeclaration,\n} from \"@babel/types\";\nimport { hasOwnProperty } from \"./hasOwnProperty\";\nimport {\n AnalysisContext,\n AnalysisEnvironment,\n AnalysisFunctionObject,\n} from \"./AnalysisContext\";\nimport { EstreeNode, EstreeVisitors, NodeWithBoundNames } from \"./interfaces\";\nimport {\n collectBoundNames,\n collectScopedDeclarations,\n containsExpression,\n} from \"./traverse\";\n\nexport interface PrecookOptions {\n expressionOnly?: boolean;\n /** @deprecated Use hooks instead. */\n visitors?: EstreeVisitors;\n hooks?: PrecookHooks;\n withParent?: boolean;\n}\n\nexport type EstreeParent = EstreeParentItem[];\n\nexport interface EstreeParentItem {\n node: EstreeNode;\n key: string;\n index?: number;\n}\n\nexport interface PrecookHooks {\n beforeVisit?(node: EstreeNode, parent?: EstreeParent): void;\n beforeVisitGlobal?(node: Identifier, parent?: EstreeParent): void;\n /** Return true if want to silent warnings for unknown nodes. */\n beforeVisitUnknown?(node: EstreeNode, parent?: EstreeParent): boolean | void;\n}\n\n/**\n * Analysis an AST of a storyboard function or an evaluation expression.\n *\n * @param rootAst - The root AST.\n * @param options - Analysis options.\n * @returns A set of global variables the root AST attempts to access.\n */\nexport function precook(\n rootAst: Expression | FunctionDeclaration,\n { expressionOnly, visitors, withParent, hooks = {} }: PrecookOptions = {}\n): Set<string> {\n const attemptToVisitGlobals = new Set<string>();\n const analysisContextStack: AnalysisContext[] = [];\n const rootEnv = new AnalysisEnvironment(null);\n const rootContext = new AnalysisContext();\n rootContext.VariableEnvironment = rootEnv;\n rootContext.LexicalEnvironment = rootEnv;\n analysisContextStack.push(rootContext);\n\n function getRunningContext(): AnalysisContext {\n return analysisContextStack[analysisContextStack.length - 1];\n }\n\n function visit(node: EstreeNode): void {\n if (hasOwnProperty(visitors, node.type)) {\n visitors[node.type](node);\n }\n }\n\n function EvaluateChildren<T extends EstreeNode>(\n node: T,\n keys: (keyof T)[],\n parent?: EstreeParent\n ): void {\n for (const key of keys) {\n Evaluate(\n node[key] as unknown as EstreeNode | EstreeNode[],\n parent?.concat({ node, key } as EstreeParentItem)\n );\n }\n }\n\n function Evaluate(\n node: EstreeNode | EstreeNode[],\n parent?: EstreeParent\n ): void {\n if (Array.isArray(node)) {\n node.forEach((n, index) => {\n Evaluate(\n n,\n parent\n ? parent.slice(0, -1).concat({\n ...parent[parent.length - 1],\n index,\n })\n : parent\n );\n });\n } else if (node) {\n // `node` maybe `null` in some cases.\n hooks.beforeVisit?.(node, parent);\n visitors && visit(node);\n // Expressions:\n switch (node.type) {\n case \"Identifier\":\n if (!ResolveBinding(node.name)) {\n hooks.beforeVisitGlobal?.(node, parent);\n attemptToVisitGlobals.add(node.name);\n }\n return;\n case \"ArrayExpression\":\n case \"ArrayPattern\":\n EvaluateChildren(node, [\"elements\"], parent);\n return;\n case \"ArrowFunctionExpression\": {\n const env = getRunningContext().LexicalEnvironment;\n const closure = OrdinaryFunctionCreate(node, env);\n CallFunction(closure, parent);\n return;\n }\n case \"AssignmentPattern\":\n case \"BinaryExpression\":\n case \"LogicalExpression\":\n EvaluateChildren(node, [\"left\", \"right\"], parent);\n return;\n case \"CallExpression\":\n case \"NewExpression\":\n EvaluateChildren(node, [\"callee\", \"arguments\"], parent);\n return;\n case \"ChainExpression\":\n EvaluateChildren(node, [\"expression\"], parent);\n return;\n case \"ConditionalExpression\":\n EvaluateChildren(node, [\"test\", \"consequent\", \"alternate\"], parent);\n return;\n case \"MemberExpression\":\n EvaluateChildren(node, [\"object\"], parent);\n if (node.computed) {\n EvaluateChildren(node, [\"property\"], parent);\n }\n return;\n case \"ObjectExpression\":\n case \"ObjectPattern\":\n EvaluateChildren(node, [\"properties\"], parent);\n return;\n case \"Property\":\n if (node.computed) {\n EvaluateChildren(node, [\"key\"], parent);\n }\n EvaluateChildren(node, [\"value\"], parent);\n return;\n case \"RestElement\":\n case \"SpreadElement\":\n case \"UnaryExpression\":\n EvaluateChildren(node, [\"argument\"], parent);\n return;\n case \"SequenceExpression\":\n case \"TemplateLiteral\":\n EvaluateChildren(node, [\"expressions\"], parent);\n return;\n case \"TaggedTemplateExpression\":\n EvaluateChildren(node, [\"tag\", \"quasi\"], parent);\n return;\n case \"Literal\":\n return;\n }\n if (!expressionOnly) {\n // Statements and assignments:\n switch (node.type) {\n case \"AssignmentExpression\":\n EvaluateChildren(node, [\"right\", \"left\"], parent);\n return;\n case \"BlockStatement\": {\n if (!node.body.length) {\n return;\n }\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.body, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n EvaluateChildren(node, [\"body\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"BreakStatement\":\n case \"ContinueStatement\":\n case \"EmptyStatement\":\n return;\n case \"CatchClause\": {\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const catchEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.param, catchEnv);\n runningContext.LexicalEnvironment = catchEnv;\n EvaluateChildren(node, [\"param\", \"body\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"DoWhileStatement\":\n EvaluateChildren(node, [\"body\", \"test\"], parent);\n return;\n case \"ExpressionStatement\":\n case \"TSAsExpression\":\n EvaluateChildren(node, [\"expression\"], parent);\n return;\n case \"ForInStatement\":\n case \"ForOfStatement\": {\n // ForIn/OfHeadEvaluation\n const lexicalBinding =\n node.left.type === \"VariableDeclaration\" &&\n node.left.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const newEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, newEnv);\n runningContext.LexicalEnvironment = newEnv;\n }\n EvaluateChildren(node, [\"right\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n\n // ForIn/OfBodyEvaluation\n if (lexicalBinding) {\n const iterationEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(node.left, iterationEnv);\n runningContext.LexicalEnvironment = iterationEnv;\n }\n EvaluateChildren(node, [\"left\", \"body\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"ForStatement\": {\n const lexicalBinding =\n node.init?.type === \"VariableDeclaration\" &&\n node.init.kind !== \"var\";\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n if (lexicalBinding) {\n const loopEnv = new AnalysisEnvironment(oldEnv);\n BoundNamesInstantiation(\n node.init as VariableDeclaration,\n loopEnv\n );\n runningContext.LexicalEnvironment = loopEnv;\n }\n EvaluateChildren(node, [\"init\", \"test\", \"body\", \"update\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"FunctionDeclaration\": {\n const [fn] = collectBoundNames(node);\n const env = getRunningContext().LexicalEnvironment;\n const fo = OrdinaryFunctionCreate(node, env);\n env.CreateBinding(fn);\n CallFunction(fo, parent);\n return;\n }\n case \"FunctionExpression\": {\n const closure = InstantiateOrdinaryFunctionExpression(node);\n CallFunction(closure, parent);\n return;\n }\n case \"IfStatement\":\n EvaluateChildren(node, [\"test\", \"consequent\", \"alternate\"], parent);\n return;\n case \"ReturnStatement\":\n case \"ThrowStatement\":\n case \"UpdateExpression\":\n EvaluateChildren(node, [\"argument\"], parent);\n return;\n case \"SwitchCase\":\n EvaluateChildren(node, [\"test\", \"consequent\"], parent);\n return;\n case \"SwitchStatement\": {\n EvaluateChildren(node, [\"discriminant\"], parent);\n const runningContext = getRunningContext();\n const oldEnv = runningContext.LexicalEnvironment;\n const blockEnv = new AnalysisEnvironment(oldEnv);\n BlockDeclarationInstantiation(node.cases, blockEnv);\n runningContext.LexicalEnvironment = blockEnv;\n EvaluateChildren(node, [\"cases\"], parent);\n runningContext.LexicalEnvironment = oldEnv;\n return;\n }\n case \"TryStatement\":\n EvaluateChildren(node, [\"block\", \"handler\", \"finalizer\"], parent);\n return;\n case \"VariableDeclaration\":\n EvaluateChildren(node, [\"declarations\"], parent);\n return;\n case \"VariableDeclarator\":\n EvaluateChildren(node, [\"id\", \"init\"], parent);\n return;\n case \"WhileStatement\":\n EvaluateChildren(node, [\"test\", \"body\"], parent);\n return;\n }\n }\n const silent = hooks.beforeVisitUnknown?.(node, parent);\n if (!silent) {\n // eslint-disable-next-line no-console\n console.warn(`Unsupported node type \\`${node.type}\\``);\n }\n }\n }\n\n function BoundNamesInstantiation(\n declarations: NodeWithBoundNames | NodeWithBoundNames[],\n env: AnalysisEnvironment\n ): void {\n for (const name of collectBoundNames(declarations)) {\n env.CreateBinding(name);\n }\n }\n\n function ResolveBinding(name: string): boolean {\n const env = getRunningContext().LexicalEnvironment;\n return GetIdentifierReference(env, name);\n }\n\n function GetIdentifierReference(\n env: AnalysisEnvironment,\n name: string\n ): boolean {\n return (\n !!env &&\n (env.HasBinding(name) || GetIdentifierReference(env.OuterEnv, name))\n );\n }\n\n function BlockDeclarationInstantiation(\n code: Statement[] | SwitchCase[],\n env: AnalysisEnvironment\n ): void {\n const declarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: false,\n });\n BoundNamesInstantiation(declarations, env);\n }\n\n function CallFunction(\n closure: AnalysisFunctionObject,\n parent?: EstreeParent\n ): void {\n PrepareOrdinaryCall(closure);\n FunctionDeclarationInstantiation(closure, parent);\n Evaluate(\n closure.ECMAScriptCode,\n parent\n ?.concat({\n node: closure.Function,\n key: \"body\",\n })\n .concat(\n closure.Function.body.type === \"BlockStatement\"\n ? {\n node: closure.Function.body,\n key: \"body\",\n }\n : []\n )\n );\n analysisContextStack.pop();\n }\n\n function PrepareOrdinaryCall(F: AnalysisFunctionObject): void {\n const calleeContext = new AnalysisContext();\n const localEnv = new AnalysisEnvironment(F.Environment);\n calleeContext.VariableEnvironment = localEnv;\n calleeContext.LexicalEnvironment = localEnv;\n analysisContextStack.push(calleeContext);\n }\n\n function FunctionDeclarationInstantiation(\n func: AnalysisFunctionObject,\n parent?: EstreeParent\n ): void {\n const calleeContext = getRunningContext();\n const code = func.ECMAScriptCode;\n const formals = func.FormalParameters;\n const hasParameterExpressions = containsExpression(formals);\n const varDeclarations = collectScopedDeclarations(code, {\n var: true,\n topLevel: true,\n });\n const varNames = collectBoundNames(varDeclarations);\n\n const env = calleeContext.LexicalEnvironment;\n BoundNamesInstantiation(formals, env);\n\n Evaluate(formals, parent?.concat({ node: func.Function, key: \"params\" }));\n\n let varEnv: AnalysisEnvironment;\n if (!hasParameterExpressions) {\n // NOTE: Only a single Environment Record is needed for the parameters\n // and top-level vars.\n for (const n of varNames) {\n env.CreateBinding(n);\n }\n varEnv = env;\n } else {\n // NOTE: A separate Environment Record is needed to ensure that closures\n // created by expressions in the formal parameter list do not have\n // visibility of declarations in the function body.\n varEnv = new AnalysisEnvironment(env);\n calleeContext.VariableEnvironment = varEnv;\n for (const n of varNames) {\n varEnv.CreateBinding(n);\n }\n }\n const lexEnv = varEnv;\n calleeContext.LexicalEnvironment = lexEnv;\n\n const lexDeclarations = collectScopedDeclarations(code, {\n var: false,\n topLevel: true,\n });\n BoundNamesInstantiation(lexDeclarations, lexEnv);\n }\n\n function InstantiateOrdinaryFunctionExpression(\n functionExpression: FunctionExpression\n ): AnalysisFunctionObject {\n const scope = getRunningContext().LexicalEnvironment;\n if (!functionExpression.id) {\n return OrdinaryFunctionCreate(functionExpression, scope);\n }\n const name = functionExpression.id.name;\n const funcEnv = new AnalysisEnvironment(scope);\n funcEnv.CreateBinding(name);\n return OrdinaryFunctionCreate(functionExpression, funcEnv);\n }\n\n function OrdinaryFunctionCreate(\n func: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression,\n scope: AnalysisEnvironment\n ): AnalysisFunctionObject {\n return {\n Function: func,\n FormalParameters: func.params,\n ECMAScriptCode:\n func.body.type === \"BlockStatement\" ? func.body.body : func.body,\n Environment: scope,\n };\n }\n\n Evaluate(rootAst, withParent ? [] : undefined);\n\n return attemptToVisitGlobals;\n}\n"],"file":"precook.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../../src/AnalysisContext.ts"],"names":["AnalysisContext","AnalysisEnvironment","constructor","outer","Set","OuterEnv","HasBinding","name","bindingSet","has","CreateBinding","add"],"mappings":";AAQA;AACA,OAAO,MAAMA,eAAN,CAAsB;AAAA;AAAA;;AAAA;AAAA;;AAAA,C,CAK7B;;AACA,OAAO,MAAMC,mBAAN,CAA0B;AAI/BC,EAAAA,WAAW,CAACC,KAAD,EAA6B;AAAA;;AAAA,wCAFV,IAAIC,GAAJ,EAEU;;AACtC,SAAKC,QAAL,GAAgBF,KAAhB;AACD;;AAEDG,EAAAA,UAAU,CAACC,IAAD,EAAwB;AAChC,WAAO,KAAKC,UAAL,CAAgBC,GAAhB,CAAoBF,IAApB,CAAP;AACD;;AAEDG,EAAAA,aAAa,CAACH,IAAD,EAAqB;AAChC,SAAKC,UAAL,CAAgBG,GAAhB,CAAoBJ,IAApB;AACD;;AAd8B","sourcesContent":["import {\n ArrowFunctionExpression,\n Expression,\n FunctionDeclaration,\n FunctionExpression,\n Statement,\n} from \"@babel/types\";\n\n// https://tc39.es/ecma262/#sec-execution-contexts\nexport class AnalysisContext {\n VariableEnvironment: AnalysisEnvironment;\n LexicalEnvironment: AnalysisEnvironment;\n}\n\n// https://tc39.es/ecma262/#sec-environment-records\nexport class AnalysisEnvironment {\n readonly OuterEnv: AnalysisEnvironment;\n private readonly bindingSet = new Set<string>();\n\n constructor(outer: AnalysisEnvironment) {\n this.OuterEnv = outer;\n }\n\n HasBinding(name: string): boolean {\n return this.bindingSet.has(name);\n }\n\n CreateBinding(name: string): void {\n this.bindingSet.add(name);\n }\n}\n\nexport interface AnalysisFunctionObject {\n Function: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression;\n FormalParameters: FunctionDeclaration[\"params\"];\n ECMAScriptCode: Statement[] | Expression;\n Environment: AnalysisEnvironment;\n}\n"],"file":"AnalysisContext.js"}
|
package/dist/esm/lint.js
CHANGED
|
@@ -68,93 +68,100 @@ export function lint(source) {
|
|
|
68
68
|
}
|
|
69
69
|
});
|
|
70
70
|
} else {
|
|
71
|
-
var FunctionVisitor = node => {
|
|
72
|
-
if (node.async || node.generator) {
|
|
73
|
-
errors.push({
|
|
74
|
-
type: "SyntaxError",
|
|
75
|
-
message: "".concat(node.async ? "Async" : "Generator", " function is not allowed"),
|
|
76
|
-
loc: node.loc
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
71
|
precook(func, {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (node.value === null) {
|
|
90
|
-
errors.push({
|
|
91
|
-
type: "SyntaxError",
|
|
92
|
-
message: "Invalid regular expression",
|
|
93
|
-
loc: node.loc
|
|
94
|
-
});
|
|
95
|
-
} else if (node.regex.flags.includes("u")) {
|
|
96
|
-
errors.push({
|
|
97
|
-
type: "SyntaxError",
|
|
98
|
-
message: "Unsupported unicode flag in regular expression",
|
|
99
|
-
loc: node.loc
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
ObjectExpression(node) {
|
|
106
|
-
for (var prop of node.properties) {
|
|
107
|
-
if (prop.type === "Property") {
|
|
108
|
-
if (prop.kind !== "init") {
|
|
72
|
+
hooks: {
|
|
73
|
+
beforeVisit(node) {
|
|
74
|
+
switch (node.type) {
|
|
75
|
+
case "ArrowFunctionExpression":
|
|
76
|
+
case "FunctionDeclaration":
|
|
77
|
+
case "FunctionExpression":
|
|
78
|
+
if (node.async || node.generator) {
|
|
109
79
|
errors.push({
|
|
110
80
|
type: "SyntaxError",
|
|
111
|
-
message: "
|
|
112
|
-
loc:
|
|
81
|
+
message: "".concat(node.async ? "Async" : "Generator", " function is not allowed"),
|
|
82
|
+
loc: node.loc
|
|
113
83
|
});
|
|
114
|
-
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
break;
|
|
87
|
+
|
|
88
|
+
case "Literal":
|
|
89
|
+
if (node.regex) {
|
|
90
|
+
if (node.value === null) {
|
|
91
|
+
errors.push({
|
|
92
|
+
type: "SyntaxError",
|
|
93
|
+
message: "Invalid regular expression",
|
|
94
|
+
loc: node.loc
|
|
95
|
+
});
|
|
96
|
+
} else if (node.regex.flags.includes("u")) {
|
|
97
|
+
errors.push({
|
|
98
|
+
type: "SyntaxError",
|
|
99
|
+
message: "Unsupported unicode flag in regular expression",
|
|
100
|
+
loc: node.loc
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
break;
|
|
106
|
+
|
|
107
|
+
case "ObjectExpression":
|
|
108
|
+
for (var prop of node.properties) {
|
|
109
|
+
if (prop.type === "Property") {
|
|
110
|
+
if (prop.kind !== "init") {
|
|
111
|
+
errors.push({
|
|
112
|
+
type: "SyntaxError",
|
|
113
|
+
message: "Unsupported object getter/setter property",
|
|
114
|
+
loc: prop.loc
|
|
115
|
+
});
|
|
116
|
+
} else if (!prop.computed && prop.key.type === "Identifier" && prop.key.name === "__proto__") {
|
|
117
|
+
errors.push({
|
|
118
|
+
type: "TypeError",
|
|
119
|
+
message: "Setting '__proto__' property is not allowed",
|
|
120
|
+
loc: prop.key.loc
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
break;
|
|
127
|
+
|
|
128
|
+
case "VariableDeclaration":
|
|
129
|
+
if (node.kind === "var" && rules !== null && rules !== void 0 && rules.noVar) {
|
|
115
130
|
errors.push({
|
|
116
|
-
type: "
|
|
117
|
-
message: "
|
|
118
|
-
loc:
|
|
131
|
+
type: "SyntaxError",
|
|
132
|
+
message: "Var declaration is not recommended, use `let` or `const` instead",
|
|
133
|
+
loc: {
|
|
134
|
+
start: node.loc.start,
|
|
135
|
+
end: {
|
|
136
|
+
line: node.loc.end.line,
|
|
137
|
+
// Only decorate the "var".
|
|
138
|
+
column: node.loc.start.column + 3
|
|
139
|
+
}
|
|
140
|
+
}
|
|
119
141
|
});
|
|
120
142
|
}
|
|
121
|
-
|
|
143
|
+
|
|
144
|
+
break;
|
|
122
145
|
}
|
|
123
146
|
},
|
|
124
147
|
|
|
125
|
-
|
|
126
|
-
if (node.
|
|
148
|
+
beforeVisitGlobal(node) {
|
|
149
|
+
if (node.name === "arguments") {
|
|
127
150
|
errors.push({
|
|
128
151
|
type: "SyntaxError",
|
|
129
|
-
message: "
|
|
130
|
-
loc:
|
|
131
|
-
start: node.loc.start,
|
|
132
|
-
end: {
|
|
133
|
-
line: node.loc.end.line,
|
|
134
|
-
// Only decorate the "var".
|
|
135
|
-
column: node.loc.start.column + 3
|
|
136
|
-
}
|
|
137
|
-
}
|
|
152
|
+
message: "Use the rest parameters instead of 'arguments'",
|
|
153
|
+
loc: node.loc
|
|
138
154
|
});
|
|
139
155
|
}
|
|
140
156
|
},
|
|
141
157
|
|
|
142
|
-
|
|
158
|
+
beforeVisitUnknown(node) {
|
|
143
159
|
errors.push({
|
|
144
160
|
type: "SyntaxError",
|
|
145
161
|
message: "Unsupported syntax: `".concat(node.type, "`"),
|
|
146
162
|
loc: node.loc
|
|
147
163
|
});
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
__GlobalVariable(node) {
|
|
151
|
-
if (node.name === "arguments") {
|
|
152
|
-
errors.push({
|
|
153
|
-
type: "SyntaxError",
|
|
154
|
-
message: "Use the rest parameters instead of 'arguments'",
|
|
155
|
-
loc: node.loc
|
|
156
|
-
});
|
|
157
|
-
}
|
|
164
|
+
return true;
|
|
158
165
|
}
|
|
159
166
|
|
|
160
167
|
}
|
package/dist/esm/lint.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lint.ts"],"names":["parseForAnalysis","precook","lint","source","typescript","rules","errors","file","body","program","jsNodes","node","type","startsWith","test","push","message","loc","func","isFunctionDeclaration","unshift","start","line","column","end","FunctionVisitor","async","generator","visitors","ArrowFunctionExpression","FunctionDeclaration","FunctionExpression","Literal","regex","value","flags","includes","ObjectExpression","prop","properties","kind","computed","key","name","VariableDeclaration","noVar","__UnknownNode","__GlobalVariable"],"mappings":"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","sourcesContent":["import { ParseResult } from \"@babel/parser\";\nimport {\n ArrowFunctionExpression,\n File,\n FunctionDeclaration,\n FunctionExpression,\n Identifier,\n SourceLocation,\n Statement,\n VariableDeclaration,\n} from \"@babel/types\";\nimport {\n EstreeLiteral,\n CookRules,\n EstreeObjectExpression,\n EstreeVisitorFn,\n EstreeNode,\n} from \"./interfaces\";\nimport { parseForAnalysis } from \"./parse\";\nimport { precook } from \"./precook\";\n\nexport interface LintOptions {\n typescript?: boolean;\n rules?: CookRules;\n}\n\nexport interface LintError {\n type: \"SyntaxError\" | \"TypeError\";\n message: string;\n loc: SourceLocation;\n}\n\n/** For next-core internal or devtools usage only. */\nexport function lint(\n source: string | ParseResult<File>,\n { typescript, rules }: LintOptions = {}\n): LintError[] {\n const errors: LintError[] = [];\n const file =\n typeof source === \"string\"\n ? parseForAnalysis(source, { typescript })\n : source;\n if (!file) {\n // Return no errors if parse failed.\n return errors;\n }\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported TypeScript syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n let func: FunctionDeclaration;\n for (const node of jsNodes) {\n const isFunctionDeclaration = node.type === \"FunctionDeclaration\";\n if (isFunctionDeclaration && !func) {\n func = node;\n } else {\n errors.push({\n type: \"SyntaxError\",\n message: isFunctionDeclaration\n ? \"Expect a single function declaration\"\n : `\\`${node.type}\\` is not allowed in top level`,\n loc: node.loc,\n });\n }\n }\n if (!func) {\n errors.unshift({\n type: \"SyntaxError\",\n message: \"Function declaration not found\",\n loc: {\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 },\n },\n });\n } else {\n const FunctionVisitor: EstreeVisitorFn = (\n node: FunctionDeclaration | FunctionExpression | ArrowFunctionExpression\n ) => {\n if (node.async || node.generator) {\n errors.push({\n type: \"SyntaxError\",\n message: `${\n node.async ? \"Async\" : \"Generator\"\n } function is not allowed`,\n loc: node.loc,\n });\n }\n };\n precook(func, {\n visitors: {\n ArrowFunctionExpression: FunctionVisitor,\n FunctionDeclaration: FunctionVisitor,\n FunctionExpression: FunctionVisitor,\n Literal(node: EstreeLiteral) {\n if (node.regex) {\n if (node.value === null) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Invalid regular expression\",\n loc: node.loc,\n });\n } else if (node.regex.flags.includes(\"u\")) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported unicode flag in regular expression\",\n loc: node.loc,\n });\n }\n }\n },\n ObjectExpression(node: EstreeObjectExpression) {\n for (const prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.kind !== \"init\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported object getter/setter property\",\n loc: prop.loc,\n });\n } else if (\n !prop.computed &&\n prop.key.type === \"Identifier\" &&\n prop.key.name === \"__proto__\"\n ) {\n errors.push({\n type: \"TypeError\",\n message: \"Setting '__proto__' property is not allowed\",\n loc: prop.key.loc,\n });\n }\n }\n }\n },\n VariableDeclaration(node: VariableDeclaration) {\n if (node.kind === \"var\" && rules?.noVar) {\n errors.push({\n type: \"SyntaxError\",\n message:\n \"Var declaration is not recommended, use `let` or `const` instead\",\n loc: {\n start: node.loc.start,\n end: {\n line: node.loc.end.line,\n // Only decorate the \"var\".\n column: node.loc.start.column + 3,\n },\n },\n });\n }\n },\n __UnknownNode(node: EstreeNode) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n },\n __GlobalVariable(node: Identifier) {\n if (node.name === \"arguments\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Use the rest parameters instead of 'arguments'\",\n loc: node.loc,\n });\n }\n },\n },\n });\n }\n return errors;\n}\n"],"file":"lint.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/lint.ts"],"names":["parseForAnalysis","precook","lint","source","typescript","rules","errors","file","body","program","jsNodes","node","type","startsWith","test","push","message","loc","func","isFunctionDeclaration","unshift","start","line","column","end","hooks","beforeVisit","async","generator","regex","value","flags","includes","prop","properties","kind","computed","key","name","noVar","beforeVisitGlobal","beforeVisitUnknown"],"mappings":"AAQA,SAASA,gBAAT,QAAiC,SAAjC;AACA,SAASC,OAAT,QAAwB,WAAxB;;AAaA;AACA,OAAO,SAASC,IAAT,CACLC,MADK,EAGQ;AAAA,MADb;AAAEC,IAAAA,UAAF;AAAcC,IAAAA;AAAd,GACa,uEADwB,EACxB;AACb,MAAMC,MAAmB,GAAG,EAA5B;AACA,MAAMC,IAAI,GACR,OAAOJ,MAAP,KAAkB,QAAlB,GACIH,gBAAgB,CAACG,MAAD,EAAS;AAAEC,IAAAA;AAAF,GAAT,CADpB,GAEID,MAHN;;AAIA,MAAI,CAACI,IAAL,EAAW;AACT;AACA,WAAOD,MAAP;AACD;;AACD,MAAME,IAAI,GAAGD,IAAI,CAACE,OAAL,CAAaD,IAA1B;AACA,MAAME,OAAoB,GAAGN,UAAU,GAAG,EAAH,GAAQI,IAA/C;;AACA,MAAIJ,UAAJ,EAAgB;AACd,SAAK,IAAMO,IAAX,IAAmBH,IAAnB,EAAyB;AACvB,UAAIG,IAAI,CAACC,IAAL,CAAUC,UAAV,CAAqB,IAArB,CAAJ,EAAgC;AAC9B,YAAI,qBAAqBC,IAArB,CAA0BH,IAAI,CAACC,IAA/B,CAAJ,EAA0C;AACxCN,UAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,YAAAA,IAAI,EAAE,aADI;AAEVI,YAAAA,OAAO,4CAAsCL,IAAI,CAACC,IAA3C,MAFG;AAGVK,YAAAA,GAAG,EAAEN,IAAI,CAACM;AAHA,WAAZ;AAKD;AACF,OARD,MAQO;AACLP,QAAAA,OAAO,CAACK,IAAR,CAAaJ,IAAb;AACD;AACF;AACF;;AACD,MAAIO,IAAJ;;AACA,OAAK,IAAMP,KAAX,IAAmBD,OAAnB,EAA4B;AAC1B,QAAMS,qBAAqB,GAAGR,KAAI,CAACC,IAAL,KAAc,qBAA5C;;AACA,QAAIO,qBAAqB,IAAI,CAACD,IAA9B,EAAoC;AAClCA,MAAAA,IAAI,GAAGP,KAAP;AACD,KAFD,MAEO;AACLL,MAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,QAAAA,IAAI,EAAE,aADI;AAEVI,QAAAA,OAAO,EAAEG,qBAAqB,GAC1B,sCAD0B,cAErBR,KAAI,CAACC,IAFgB,kCAFpB;AAKVK,QAAAA,GAAG,EAAEN,KAAI,CAACM;AALA,OAAZ;AAOD;AACF;;AACD,MAAI,CAACC,IAAL,EAAW;AACTZ,IAAAA,MAAM,CAACc,OAAP,CAAe;AACbR,MAAAA,IAAI,EAAE,aADO;AAEbI,MAAAA,OAAO,EAAE,gCAFI;AAGbC,MAAAA,GAAG,EAAE;AACHI,QAAAA,KAAK,EAAE;AAAEC,UAAAA,IAAI,EAAE,CAAR;AAAWC,UAAAA,MAAM,EAAE;AAAnB,SADJ;AAEHC,QAAAA,GAAG,EAAE;AAAEF,UAAAA,IAAI,EAAE,CAAR;AAAWC,UAAAA,MAAM,EAAE;AAAnB;AAFF;AAHQ,KAAf;AAQD,GATD,MASO;AACLtB,IAAAA,OAAO,CAACiB,IAAD,EAAO;AACZO,MAAAA,KAAK,EAAE;AACLC,QAAAA,WAAW,CAACf,IAAD,EAAO;AAChB,kBAAQA,IAAI,CAACC,IAAb;AACE,iBAAK,yBAAL;AACA,iBAAK,qBAAL;AACA,iBAAK,oBAAL;AACE,kBAAID,IAAI,CAACgB,KAAL,IAAchB,IAAI,CAACiB,SAAvB,EAAkC;AAChCtB,gBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,kBAAAA,IAAI,EAAE,aADI;AAEVI,kBAAAA,OAAO,YACLL,IAAI,CAACgB,KAAL,GAAa,OAAb,GAAuB,WADlB,6BAFG;AAKVV,kBAAAA,GAAG,EAAEN,IAAI,CAACM;AALA,iBAAZ;AAOD;;AACD;;AACF,iBAAK,SAAL;AACE,kBAAIN,IAAI,CAACkB,KAAT,EAAgB;AACd,oBAAIlB,IAAI,CAACmB,KAAL,KAAe,IAAnB,EAAyB;AACvBxB,kBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,oBAAAA,IAAI,EAAE,aADI;AAEVI,oBAAAA,OAAO,EAAE,4BAFC;AAGVC,oBAAAA,GAAG,EAAEN,IAAI,CAACM;AAHA,mBAAZ;AAKD,iBAND,MAMO,IAAIN,IAAI,CAACkB,KAAL,CAAWE,KAAX,CAAiBC,QAAjB,CAA0B,GAA1B,CAAJ,EAAoC;AACzC1B,kBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,oBAAAA,IAAI,EAAE,aADI;AAEVI,oBAAAA,OAAO,EAAE,gDAFC;AAGVC,oBAAAA,GAAG,EAAEN,IAAI,CAACM;AAHA,mBAAZ;AAKD;AACF;;AACD;;AACF,iBAAK,kBAAL;AACE,mBAAK,IAAMgB,IAAX,IAAmBtB,IAAI,CAACuB,UAAxB,EAAoC;AAClC,oBAAID,IAAI,CAACrB,IAAL,KAAc,UAAlB,EAA8B;AAC5B,sBAAIqB,IAAI,CAACE,IAAL,KAAc,MAAlB,EAA0B;AACxB7B,oBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,sBAAAA,IAAI,EAAE,aADI;AAEVI,sBAAAA,OAAO,EAAE,2CAFC;AAGVC,sBAAAA,GAAG,EAAEgB,IAAI,CAAChB;AAHA,qBAAZ;AAKD,mBAND,MAMO,IACL,CAACgB,IAAI,CAACG,QAAN,IACAH,IAAI,CAACI,GAAL,CAASzB,IAAT,KAAkB,YADlB,IAEAqB,IAAI,CAACI,GAAL,CAASC,IAAT,KAAkB,WAHb,EAIL;AACAhC,oBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,sBAAAA,IAAI,EAAE,WADI;AAEVI,sBAAAA,OAAO,EAAE,6CAFC;AAGVC,sBAAAA,GAAG,EAAEgB,IAAI,CAACI,GAAL,CAASpB;AAHJ,qBAAZ;AAKD;AACF;AACF;;AACD;;AACF,iBAAK,qBAAL;AACE,kBAAIN,IAAI,CAACwB,IAAL,KAAc,KAAd,IAAuB9B,KAAvB,aAAuBA,KAAvB,eAAuBA,KAAK,CAAEkC,KAAlC,EAAyC;AACvCjC,gBAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,kBAAAA,IAAI,EAAE,aADI;AAEVI,kBAAAA,OAAO,EACL,kEAHQ;AAIVC,kBAAAA,GAAG,EAAE;AACHI,oBAAAA,KAAK,EAAEV,IAAI,CAACM,GAAL,CAASI,KADb;AAEHG,oBAAAA,GAAG,EAAE;AACHF,sBAAAA,IAAI,EAAEX,IAAI,CAACM,GAAL,CAASO,GAAT,CAAaF,IADhB;AAEH;AACAC,sBAAAA,MAAM,EAAEZ,IAAI,CAACM,GAAL,CAASI,KAAT,CAAeE,MAAf,GAAwB;AAH7B;AAFF;AAJK,iBAAZ;AAaD;;AACD;AAtEJ;AAwED,SA1EI;;AA2ELiB,QAAAA,iBAAiB,CAAC7B,IAAD,EAAO;AACtB,cAAIA,IAAI,CAAC2B,IAAL,KAAc,WAAlB,EAA+B;AAC7BhC,YAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,cAAAA,IAAI,EAAE,aADI;AAEVI,cAAAA,OAAO,EAAE,gDAFC;AAGVC,cAAAA,GAAG,EAAEN,IAAI,CAACM;AAHA,aAAZ;AAKD;AACF,SAnFI;;AAoFLwB,QAAAA,kBAAkB,CAAC9B,IAAD,EAAO;AACvBL,UAAAA,MAAM,CAACS,IAAP,CAAY;AACVH,YAAAA,IAAI,EAAE,aADI;AAEVI,YAAAA,OAAO,iCAA2BL,IAAI,CAACC,IAAhC,MAFG;AAGVK,YAAAA,GAAG,EAAEN,IAAI,CAACM;AAHA,WAAZ;AAKA,iBAAO,IAAP;AACD;;AA3FI;AADK,KAAP,CAAP;AA+FD;;AACD,SAAOX,MAAP;AACD","sourcesContent":["import { ParseResult } from \"@babel/parser\";\nimport {\n File,\n FunctionDeclaration,\n SourceLocation,\n Statement,\n} from \"@babel/types\";\nimport { CookRules } from \"./interfaces\";\nimport { parseForAnalysis } from \"./parse\";\nimport { precook } from \"./precook\";\n\nexport interface LintOptions {\n typescript?: boolean;\n rules?: CookRules;\n}\n\nexport interface LintError {\n type: \"SyntaxError\" | \"TypeError\";\n message: string;\n loc: SourceLocation;\n}\n\n/** For next-core internal or devtools usage only. */\nexport function lint(\n source: string | ParseResult<File>,\n { typescript, rules }: LintOptions = {}\n): LintError[] {\n const errors: LintError[] = [];\n const file =\n typeof source === \"string\"\n ? parseForAnalysis(source, { typescript })\n : source;\n if (!file) {\n // Return no errors if parse failed.\n return errors;\n }\n const body = file.program.body;\n const jsNodes: Statement[] = typescript ? [] : body;\n if (typescript) {\n for (const node of body) {\n if (node.type.startsWith(\"TS\")) {\n if (/Enum|Import|Export/.test(node.type)) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported TypeScript syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n }\n } else {\n jsNodes.push(node);\n }\n }\n }\n let func: FunctionDeclaration;\n for (const node of jsNodes) {\n const isFunctionDeclaration = node.type === \"FunctionDeclaration\";\n if (isFunctionDeclaration && !func) {\n func = node;\n } else {\n errors.push({\n type: \"SyntaxError\",\n message: isFunctionDeclaration\n ? \"Expect a single function declaration\"\n : `\\`${node.type}\\` is not allowed in top level`,\n loc: node.loc,\n });\n }\n }\n if (!func) {\n errors.unshift({\n type: \"SyntaxError\",\n message: \"Function declaration not found\",\n loc: {\n start: { line: 1, column: 0 },\n end: { line: 1, column: 0 },\n },\n });\n } else {\n precook(func, {\n hooks: {\n beforeVisit(node) {\n switch (node.type) {\n case \"ArrowFunctionExpression\":\n case \"FunctionDeclaration\":\n case \"FunctionExpression\":\n if (node.async || node.generator) {\n errors.push({\n type: \"SyntaxError\",\n message: `${\n node.async ? \"Async\" : \"Generator\"\n } function is not allowed`,\n loc: node.loc,\n });\n }\n break;\n case \"Literal\":\n if (node.regex) {\n if (node.value === null) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Invalid regular expression\",\n loc: node.loc,\n });\n } else if (node.regex.flags.includes(\"u\")) {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported unicode flag in regular expression\",\n loc: node.loc,\n });\n }\n }\n break;\n case \"ObjectExpression\":\n for (const prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.kind !== \"init\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Unsupported object getter/setter property\",\n loc: prop.loc,\n });\n } else if (\n !prop.computed &&\n prop.key.type === \"Identifier\" &&\n prop.key.name === \"__proto__\"\n ) {\n errors.push({\n type: \"TypeError\",\n message: \"Setting '__proto__' property is not allowed\",\n loc: prop.key.loc,\n });\n }\n }\n }\n break;\n case \"VariableDeclaration\":\n if (node.kind === \"var\" && rules?.noVar) {\n errors.push({\n type: \"SyntaxError\",\n message:\n \"Var declaration is not recommended, use `let` or `const` instead\",\n loc: {\n start: node.loc.start,\n end: {\n line: node.loc.end.line,\n // Only decorate the \"var\".\n column: node.loc.start.column + 3,\n },\n },\n });\n }\n break;\n }\n },\n beforeVisitGlobal(node) {\n if (node.name === \"arguments\") {\n errors.push({\n type: \"SyntaxError\",\n message: \"Use the rest parameters instead of 'arguments'\",\n loc: node.loc,\n });\n }\n },\n beforeVisitUnknown(node) {\n errors.push({\n type: \"SyntaxError\",\n message: `Unsupported syntax: \\`${node.type}\\``,\n loc: node.loc,\n });\n return true;\n },\n },\n });\n }\n return errors;\n}\n"],"file":"lint.js"}
|