Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
try {
// console.log(
// JSON.stringify(
// acorn.parse(lJavaScriptSource, { sourceType: "module", ecmaVersion: 11 }),
// null,
// " "
// )
// );
// ecmaVersion 11 necessary for acorn to understand dynamic imports
// default ecmaVersion for acorn 7 is still 10.
return acorn.parse(lJavaScriptSource, {
sourceType: "module",
ecmaVersion: 11
});
} catch (e) {
return acornLoose.parse(lJavaScriptSource, { sourceType: "module" });
}
}
// Check if the command has valid syntax...
debug( 'Processing command...' );
tmp = processCommand( cmd );
if ( tmp instanceof Error ) {
debug( 'Unable to process command.' );
debug( 'Error: %s', tmp.message );
debug( 'Attempting to detect multi-line input...' );
if ( hasMultilineError( cmd ) ) {
debug( 'Detected multi-line input. Waiting for additional lines...' );
repl._cmd.push( line );
repl._multiline_mode = true;
displayPrompt( repl, false );
return;
}
// Still possible that a user is attempting to enter an object literal across multiple lines...
ast = parseLoose( cmd );
// Check for a trailing node which is being interpreted as a block statement, as this could be an object literal...
node = ast.body[ ast.body.length-1 ];
if ( node.type === 'BlockStatement' && node.end === ast.end ) {
tmp = cmd.slice( node.start, node.end );
if ( hasMultilineError( tmp ) ) {
debug( 'Detected multi-line input. Waiting for additional lines...' );
repl._cmd.push( line );
repl._multiline_mode = true;
displayPrompt( repl, false );
return;
}
}
debug( 'Multi-line input not detected.' );
repl._ostream.write( 'Error: '+tmp.message+'\n' );
repl._cmd.length = 0;
var script;
var node;
var opts;
var ast;
var obj;
var res;
// Case: `<|>` (a command devoid of expressions/statements)
if ( trim( expression ) === '' ) {
debug( 'Auto-completion triggered without a filter. Empty expression.' );
out.push.apply( out, objectKeys( context ) );
out.push.apply( out, RESERVED_KEYWORDS_COMMON );
return '';
}
debug( 'Parsing expression into an AST.' );
ast = parse( expression );
debug( 'Resolving local scopes within the AST.' );
ast = resolveLocalScopes( ast );
// Get the last program top-level AST "node":
debug( 'Number of statements: %d', ast.body.length );
node = ast.body[ ast.body.length-1 ];
// Check for an empty trailing "expression"...
if (
node.end !== ast.end &&
expression[ node.end ] === ';' &&
trim( expression.slice( node.end+1 ) ) === ''
) {
debug( 'Auto-completion triggered without a filter. Empty expression.' );
out.push.apply( out, RESERVED_KEYWORDS_COMMON );
var files;
var stats;
var args;
var ast;
var arg;
var dir;
var f;
var i;
// Get the list of argument types for the desired file system API:
debug( 'File system API: %s', alias );
args = fsAliasArgs( alias );
// Parse the expression into an AST:
debug( 'Expression: %s', expression );
ast = parse( expression );
// Check whether the argument which triggered TAB completion has a corresponding argument type which is completable:
debug( 'Checking if argument is completable...' );
arg = args[ ast.body[ 0 ].expression.arguments.length-1 ];
if ( !arg ) {
debug( 'Argument which triggered TAB completion is not completable.' );
return '';
}
debug( 'Argument is completable.' );
// Split the path to complete into two components: subdirectory path and filter...
subdir = path.match( pathRegExp() );
filter = subdir[ 2 ];
subdir = subdir[ 1 ] || '';
debug( 'Searching for completion candidates...' );
}
// To ensure that "un-silenced" variable/function declarations produce a return value, check the last node for declarations...
else if ( node.type === 'VariableDeclaration' ) {
debug( 'Found a trailing variable declaration which is not silenced. Appending expression...' );
tmp = node.declarations[ node.declarations.length-1 ];
code += ';' + tmp.id.name; // return the assigned value of last declared variable
} else if ( node.type === 'FunctionDeclaration' ) {
debug( 'Found a trailing function declaration which is not silenced. Appending expression...' );
code += ';' + node.id.name;
}
return code;
}
debug( 'Checking for a trailing object literal...' );
// Make a best-effort attempt to parse the code string into an AST:
ast = parseLoose( code );
// If the body is empty, assume that we have been given an unterminated comment...
if ( ast.body.length === 0 ) {
debug( 'Detected unterminated comment.' );
return err; // original error message
}
// Get the last (non-empty) node:
for ( i = ast.body.length-1; i >= 0; i-- ) {
node = ast.body[ i ];
if ( node.type !== 'EmptyStatement' ) {
break;
}
}
// Check for a trailing node which is interpreted as a block statement, as this node could be an object literal...
if ( node.type === 'BlockStatement' ) {
debug( 'Last (non-empty) statement interpreted as a block statement. Checking if object literal...' );
.reduce((acc, next) => {
const path = `./src/components/views/${next.replace(".stories.js", "")}`;
const file = fs.readFileSync(`./src/stories/${next}`, "utf8");
const ast = acorn.parse(file, {sourceType: "module"});
const imports = ast.body.reduce((acc, next) => {
const obj = {};
if (next.type === "ImportDeclaration") {
const defaultSpecifier = next.specifiers.find(
c => c.type === "ImportDefaultSpecifier",
);
if (
defaultSpecifier &&
(specifiers.includes(defaultSpecifier.local.name) ||
defaultSpecifier.local.name.includes("Mock"))
) {
obj.source = next.source.value;
obj.type = defaultSpecifier.local.name;
obj.imports = [];
next.specifiers.forEach(s => {
exports.parseAstExpressions = (script) => {
const ast = AstParser.parse(script);
if (!ast.body || !script) return [];
return ast.body.map(e => script.substring(e.start, e.end)) || [];
};
static getParamNames(func: Function | string, methodName?: string): string[] {
const ret: string[] = [];
const parsed = parse(func.toString());
const checkNode = (node: any, methodName?: string) => {
if (methodName && !(node.key && (node.key as any).name === methodName)) {
return;
}
const params = node.value ? node.value.params : node.params;
ret.push(...params.map((p: any) => {
switch (p.type) {
case 'AssignmentPattern':
return p.left.name;
case 'RestElement':
return '...' + p.argument.name;
default:
return p.name;
}
const ParserWithJsx = entry => Parser.parse(parseJsx(entry));
let Parser = require("acorn-loose");
let ParserWalk = require("acorn-walk");
const parseImportFromExport = require("./parseImportFromExport");
const parseJsx = require("./parseJsx");
const injectImportUsingExportWalk = require("./walk");
Parser = Parser.LooseParser.extend(parseImportFromExport);
ParserWalk = injectImportUsingExportWalk(ParserWalk);
const ParserWithJsx = entry => Parser.parse(parseJsx(entry));
module.exports = { Parser: ParserWithJsx, ParserWalk };