From f454151e7a6324143d27e22c5671acea3f9a0455 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 2 Mar 2023 13:51:11 +0100 Subject: [PATCH] JS: Convert TypeScript import assertions --- .../extractor/lib/typescript/src/main.ts | 1 + .../ts/extractor/TypeScriptASTConverter.java | 38 +- .../tests/ts/input/import-assertion.ts | 13 + .../ts/output/trap/import-assertion.ts.trap | 1117 +++++++++++++++++ 4 files changed, 1162 insertions(+), 7 deletions(-) create mode 100644 javascript/extractor/tests/ts/input/import-assertion.ts create mode 100644 javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap diff --git a/javascript/extractor/lib/typescript/src/main.ts b/javascript/extractor/lib/typescript/src/main.ts index 440e621efd2..0116421a217 100644 --- a/javascript/extractor/lib/typescript/src/main.ts +++ b/javascript/extractor/lib/typescript/src/main.ts @@ -224,6 +224,7 @@ const astProperties: string[] = [ "argument", "argumentExpression", "arguments", + "assertClause", "assertsModifier", "asteriskToken", "attributes", diff --git a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java index 3783a44936e..f003381064c 100644 --- a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java @@ -342,6 +342,10 @@ public class TypeScriptASTConverter { return convertArrowFunction(node, loc); case "AsExpression": return convertTypeAssertionExpression(node, loc); + case "AssertClause": + return convertAssertClause(node, loc); + case "AssertEntry": + return convertAssertEntry(node, loc); case "SatisfiesExpression": return convertSatisfiesExpression(node, loc); case "AwaitExpression": @@ -887,8 +891,8 @@ public class TypeScriptASTConverter { private Node convertCallExpression(JsonObject node, SourceLocation loc) throws ParseError { List arguments = convertChildren(node, "arguments"); - if (arguments.size() == 1 && hasKind(node.get("expression"), "ImportKeyword")) { - return new DynamicImport(loc, arguments.get(0), null); // TODO: preserve import attributes + if (arguments.size() >= 1 && hasKind(node.get("expression"), "ImportKeyword")) { + return new DynamicImport(loc, arguments.get(0), arguments.size() > 1 ? arguments.get(1) : null); } Expression callee = convertChild(node, "expression"); List typeArguments = convertChildrenAsTypes(node, "typeArguments"); @@ -1193,15 +1197,16 @@ public class TypeScriptASTConverter { private Node convertExportDeclaration(JsonObject node, SourceLocation loc) throws ParseError { Literal source = tryConvertChild(node, "moduleSpecifier", Literal.class); + Expression assertion = convertChild(node, "assertClause"); if (hasChild(node, "exportClause")) { boolean hasTypeKeyword = node.get("isTypeOnly").getAsBoolean(); List specifiers = hasKind(node.get("exportClause"), "NamespaceExport") ? Collections.singletonList(convertChild(node, "exportClause")) : convertChildren(node.get("exportClause").getAsJsonObject(), "elements"); - return new ExportNamedDeclaration(loc, null, specifiers, source, null, hasTypeKeyword); // TODO: preserve import assertions + return new ExportNamedDeclaration(loc, null, specifiers, source, assertion, hasTypeKeyword); } else { - return new ExportAllDeclaration(loc, source, null); // TODO: preserve import assertions + return new ExportAllDeclaration(loc, source, assertion); } } @@ -1383,6 +1388,7 @@ public class TypeScriptASTConverter { private Node convertImportDeclaration(JsonObject node, SourceLocation loc) throws ParseError { Literal src = tryConvertChild(node, "moduleSpecifier", Literal.class); + Expression assertion = convertChild(node, "assertClause"); List specifiers = new ArrayList<>(); boolean hasTypeKeyword = false; if (hasChild(node, "importClause")) { @@ -1400,7 +1406,7 @@ public class TypeScriptASTConverter { } hasTypeKeyword = importClause.get("isTypeOnly").getAsBoolean(); } - ImportDeclaration importDecl = new ImportDeclaration(loc, specifiers, src, null, hasTypeKeyword); // TODO: preserve import assertions + ImportDeclaration importDecl = new ImportDeclaration(loc, specifiers, src, assertion, hasTypeKeyword); attachSymbolInformation(importDecl, node); return importDecl; } @@ -1746,7 +1752,7 @@ public class TypeScriptASTConverter { if (hasFlag(node, "NestedNamespace")) { // In a nested namespace declaration `namespace A.B`, the nested namespace `B` // is implicitly exported. - return new ExportNamedDeclaration(loc, decl, new ArrayList<>(), null, null); // TODO: preserve import assertion + return new ExportNamedDeclaration(loc, decl, new ArrayList<>(), null, null); } else { return fixExports(loc, decl); } @@ -2276,6 +2282,24 @@ public class TypeScriptASTConverter { return new TypeAssertion(loc, convertChild(node, "expression"), type, false); } + private Node convertAssertClause(JsonObject node, SourceLocation loc) throws ParseError { + List properties = new ArrayList<>(); + for (INode child : convertChildren(node, "elements")) { + properties.add((Property)child); + } + return new ObjectExpression(loc, properties); + } + + private Node convertAssertEntry(JsonObject node, SourceLocation loc) throws ParseError { + return new Property( + loc, + convertChild(node, "key"), + convertChild(node, "value"), + "init", + false, + false); + } + private Node convertSatisfiesExpression(JsonObject node, SourceLocation loc) throws ParseError { ITypeExpression type = convertChildAsType(node, "type"); return new SatisfiesExpr(loc, convertChild(node, "expression"), type); @@ -2455,7 +2479,7 @@ public class TypeScriptASTConverter { advance(loc, skipped); // capture group 1 is `default`, if present if (m.group(1) == null) - return new ExportNamedDeclaration(outerLoc, (Statement) decl, new ArrayList<>(), null, null); // TODO: preserve import assertions + return new ExportNamedDeclaration(outerLoc, (Statement) decl, new ArrayList<>(), null, null); return new ExportDefaultDeclaration(outerLoc, decl); } return decl; diff --git a/javascript/extractor/tests/ts/input/import-assertion.ts b/javascript/extractor/tests/ts/input/import-assertion.ts new file mode 100644 index 00000000000..b138341aa63 --- /dev/null +++ b/javascript/extractor/tests/ts/input/import-assertion.ts @@ -0,0 +1,13 @@ +import "module" assert { type: "json" }; +import * as v1 from "module" assert { type: "json" }; +import { v2 } from "module" assert { type: "json" }; +import v3 from "module" assert { type: "json" }; + +export { v4 } from "module" assert { type: "json" }; +export * from "module" assert { type: "json" }; +export * as v5 from "module" assert { type: "json" }; + +const v6 = import("module", { assert: { type: "json" } }); + +import "module"; // missing semicolon +assert({ type: "json" }); // function call, not import assertion diff --git a/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap new file mode 100644 index 00000000000..d82dca7dee7 --- /dev/null +++ b/javascript/extractor/tests/ts/output/trap/import-assertion.ts.trap @@ -0,0 +1,1117 @@ +#10000=@"/import-assertion.ts;sourcefile" +files(#10000,"/import-assertion.ts") +#10001=@"/;folder" +folders(#10001,"/") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +#20002=* +comments(#20002,0,#20001," missing semicolon","// missing semicolon") +#20003=@"loc,{#10000},12,18,12,37" +locations_default(#20003,#10000,12,18,12,37) +hasLocation(#20002,#20003) +#20004=* +comments(#20004,0,#20001," function call, not import assertion","// func ... sertion") +#20005=@"loc,{#10000},13,27,13,64" +locations_default(#20005,#10000,13,27,13,64) +hasLocation(#20004,#20005) +#20006=* +lines(#20006,#20001,"import ""module"" assert { type: ""json"" };"," +") +#20007=@"loc,{#10000},1,1,1,40" +locations_default(#20007,#10000,1,1,1,40) +hasLocation(#20006,#20007) +#20008=* +lines(#20008,#20001,"import * as v1 from ""module"" assert { type: ""json"" };"," +") +#20009=@"loc,{#10000},2,1,2,53" +locations_default(#20009,#10000,2,1,2,53) +hasLocation(#20008,#20009) +#20010=* +lines(#20010,#20001,"import { v2 } from ""module"" assert { type: ""json"" };"," +") +#20011=@"loc,{#10000},3,1,3,52" +locations_default(#20011,#10000,3,1,3,52) +hasLocation(#20010,#20011) +#20012=* +lines(#20012,#20001,"import v3 from ""module"" assert { type: ""json"" };"," +") +#20013=@"loc,{#10000},4,1,4,48" +locations_default(#20013,#10000,4,1,4,48) +hasLocation(#20012,#20013) +#20014=* +lines(#20014,#20001,""," +") +#20015=@"loc,{#10000},5,1,5,0" +locations_default(#20015,#10000,5,1,5,0) +hasLocation(#20014,#20015) +#20016=* +lines(#20016,#20001,"export { v4 } from ""module"" assert { type: ""json"" };"," +") +#20017=@"loc,{#10000},6,1,6,52" +locations_default(#20017,#10000,6,1,6,52) +hasLocation(#20016,#20017) +#20018=* +lines(#20018,#20001,"export * from ""module"" assert { type: ""json"" };"," +") +#20019=@"loc,{#10000},7,1,7,47" +locations_default(#20019,#10000,7,1,7,47) +hasLocation(#20018,#20019) +#20020=* +lines(#20020,#20001,"export * as v5 from ""module"" assert { type: ""json"" };"," +") +#20021=@"loc,{#10000},8,1,8,53" +locations_default(#20021,#10000,8,1,8,53) +hasLocation(#20020,#20021) +#20022=* +lines(#20022,#20001,""," +") +#20023=@"loc,{#10000},9,1,9,0" +locations_default(#20023,#10000,9,1,9,0) +hasLocation(#20022,#20023) +#20024=* +lines(#20024,#20001,"const v6 = import(""module"", { assert: { type: ""json"" } });"," +") +#20025=@"loc,{#10000},10,1,10,58" +locations_default(#20025,#10000,10,1,10,58) +hasLocation(#20024,#20025) +#20026=* +lines(#20026,#20001,""," +") +#20027=@"loc,{#10000},11,1,11,0" +locations_default(#20027,#10000,11,1,11,0) +hasLocation(#20026,#20027) +#20028=* +lines(#20028,#20001,"import ""module""; // missing semicolon"," +") +#20029=@"loc,{#10000},12,1,12,37" +locations_default(#20029,#10000,12,1,12,37) +hasLocation(#20028,#20029) +#20030=* +lines(#20030,#20001,"assert({ type: ""json"" }); // function call, not import assertion"," +") +#20031=@"loc,{#10000},13,1,13,64" +locations_default(#20031,#10000,13,1,13,64) +hasLocation(#20030,#20031) +numlines(#20001,13,10,2) +#20032=* +tokeninfo(#20032,7,#20001,0,"import") +#20033=@"loc,{#10000},1,1,1,6" +locations_default(#20033,#10000,1,1,1,6) +hasLocation(#20032,#20033) +#20034=* +tokeninfo(#20034,4,#20001,1,"""module""") +#20035=@"loc,{#10000},1,8,1,15" +locations_default(#20035,#10000,1,8,1,15) +hasLocation(#20034,#20035) +#20036=* +tokeninfo(#20036,7,#20001,2,"assert") +#20037=@"loc,{#10000},1,17,1,22" +locations_default(#20037,#10000,1,17,1,22) +hasLocation(#20036,#20037) +#20038=* +tokeninfo(#20038,8,#20001,3,"{") +#20039=@"loc,{#10000},1,24,1,24" +locations_default(#20039,#10000,1,24,1,24) +hasLocation(#20038,#20039) +#20040=* +tokeninfo(#20040,7,#20001,4,"type") +#20041=@"loc,{#10000},1,26,1,29" +locations_default(#20041,#10000,1,26,1,29) +hasLocation(#20040,#20041) +#20042=* +tokeninfo(#20042,8,#20001,5,":") +#20043=@"loc,{#10000},1,30,1,30" +locations_default(#20043,#10000,1,30,1,30) +hasLocation(#20042,#20043) +#20044=* +tokeninfo(#20044,4,#20001,6,"""json""") +#20045=@"loc,{#10000},1,32,1,37" +locations_default(#20045,#10000,1,32,1,37) +hasLocation(#20044,#20045) +#20046=* +tokeninfo(#20046,8,#20001,7,"}") +#20047=@"loc,{#10000},1,39,1,39" +locations_default(#20047,#10000,1,39,1,39) +hasLocation(#20046,#20047) +#20048=* +tokeninfo(#20048,8,#20001,8,";") +#20049=@"loc,{#10000},1,40,1,40" +locations_default(#20049,#10000,1,40,1,40) +hasLocation(#20048,#20049) +#20050=* +tokeninfo(#20050,7,#20001,9,"import") +#20051=@"loc,{#10000},2,1,2,6" +locations_default(#20051,#10000,2,1,2,6) +hasLocation(#20050,#20051) +#20052=* +tokeninfo(#20052,8,#20001,10,"*") +#20053=@"loc,{#10000},2,8,2,8" +locations_default(#20053,#10000,2,8,2,8) +hasLocation(#20052,#20053) +#20054=* +tokeninfo(#20054,7,#20001,11,"as") +#20055=@"loc,{#10000},2,10,2,11" +locations_default(#20055,#10000,2,10,2,11) +hasLocation(#20054,#20055) +#20056=* +tokeninfo(#20056,6,#20001,12,"v1") +#20057=@"loc,{#10000},2,13,2,14" +locations_default(#20057,#10000,2,13,2,14) +hasLocation(#20056,#20057) +#20058=* +tokeninfo(#20058,7,#20001,13,"from") +#20059=@"loc,{#10000},2,16,2,19" +locations_default(#20059,#10000,2,16,2,19) +hasLocation(#20058,#20059) +#20060=* +tokeninfo(#20060,4,#20001,14,"""module""") +#20061=@"loc,{#10000},2,21,2,28" +locations_default(#20061,#10000,2,21,2,28) +hasLocation(#20060,#20061) +#20062=* +tokeninfo(#20062,7,#20001,15,"assert") +#20063=@"loc,{#10000},2,30,2,35" +locations_default(#20063,#10000,2,30,2,35) +hasLocation(#20062,#20063) +#20064=* +tokeninfo(#20064,8,#20001,16,"{") +#20065=@"loc,{#10000},2,37,2,37" +locations_default(#20065,#10000,2,37,2,37) +hasLocation(#20064,#20065) +#20066=* +tokeninfo(#20066,7,#20001,17,"type") +#20067=@"loc,{#10000},2,39,2,42" +locations_default(#20067,#10000,2,39,2,42) +hasLocation(#20066,#20067) +#20068=* +tokeninfo(#20068,8,#20001,18,":") +#20069=@"loc,{#10000},2,43,2,43" +locations_default(#20069,#10000,2,43,2,43) +hasLocation(#20068,#20069) +#20070=* +tokeninfo(#20070,4,#20001,19,"""json""") +#20071=@"loc,{#10000},2,45,2,50" +locations_default(#20071,#10000,2,45,2,50) +hasLocation(#20070,#20071) +#20072=* +tokeninfo(#20072,8,#20001,20,"}") +#20073=@"loc,{#10000},2,52,2,52" +locations_default(#20073,#10000,2,52,2,52) +hasLocation(#20072,#20073) +#20074=* +tokeninfo(#20074,8,#20001,21,";") +#20075=@"loc,{#10000},2,53,2,53" +locations_default(#20075,#10000,2,53,2,53) +hasLocation(#20074,#20075) +#20076=* +tokeninfo(#20076,7,#20001,22,"import") +#20077=@"loc,{#10000},3,1,3,6" +locations_default(#20077,#10000,3,1,3,6) +hasLocation(#20076,#20077) +#20078=* +tokeninfo(#20078,8,#20001,23,"{") +#20079=@"loc,{#10000},3,8,3,8" +locations_default(#20079,#10000,3,8,3,8) +hasLocation(#20078,#20079) +#20080=* +tokeninfo(#20080,6,#20001,24,"v2") +#20081=@"loc,{#10000},3,10,3,11" +locations_default(#20081,#10000,3,10,3,11) +hasLocation(#20080,#20081) +#20082=* +tokeninfo(#20082,8,#20001,25,"}") +#20083=@"loc,{#10000},3,13,3,13" +locations_default(#20083,#10000,3,13,3,13) +hasLocation(#20082,#20083) +#20084=* +tokeninfo(#20084,7,#20001,26,"from") +#20085=@"loc,{#10000},3,15,3,18" +locations_default(#20085,#10000,3,15,3,18) +hasLocation(#20084,#20085) +#20086=* +tokeninfo(#20086,4,#20001,27,"""module""") +#20087=@"loc,{#10000},3,20,3,27" +locations_default(#20087,#10000,3,20,3,27) +hasLocation(#20086,#20087) +#20088=* +tokeninfo(#20088,7,#20001,28,"assert") +#20089=@"loc,{#10000},3,29,3,34" +locations_default(#20089,#10000,3,29,3,34) +hasLocation(#20088,#20089) +#20090=* +tokeninfo(#20090,8,#20001,29,"{") +#20091=@"loc,{#10000},3,36,3,36" +locations_default(#20091,#10000,3,36,3,36) +hasLocation(#20090,#20091) +#20092=* +tokeninfo(#20092,7,#20001,30,"type") +#20093=@"loc,{#10000},3,38,3,41" +locations_default(#20093,#10000,3,38,3,41) +hasLocation(#20092,#20093) +#20094=* +tokeninfo(#20094,8,#20001,31,":") +#20095=@"loc,{#10000},3,42,3,42" +locations_default(#20095,#10000,3,42,3,42) +hasLocation(#20094,#20095) +#20096=* +tokeninfo(#20096,4,#20001,32,"""json""") +#20097=@"loc,{#10000},3,44,3,49" +locations_default(#20097,#10000,3,44,3,49) +hasLocation(#20096,#20097) +#20098=* +tokeninfo(#20098,8,#20001,33,"}") +#20099=@"loc,{#10000},3,51,3,51" +locations_default(#20099,#10000,3,51,3,51) +hasLocation(#20098,#20099) +#20100=* +tokeninfo(#20100,8,#20001,34,";") +#20101=@"loc,{#10000},3,52,3,52" +locations_default(#20101,#10000,3,52,3,52) +hasLocation(#20100,#20101) +#20102=* +tokeninfo(#20102,7,#20001,35,"import") +#20103=@"loc,{#10000},4,1,4,6" +locations_default(#20103,#10000,4,1,4,6) +hasLocation(#20102,#20103) +#20104=* +tokeninfo(#20104,6,#20001,36,"v3") +#20105=@"loc,{#10000},4,8,4,9" +locations_default(#20105,#10000,4,8,4,9) +hasLocation(#20104,#20105) +#20106=* +tokeninfo(#20106,7,#20001,37,"from") +#20107=@"loc,{#10000},4,11,4,14" +locations_default(#20107,#10000,4,11,4,14) +hasLocation(#20106,#20107) +#20108=* +tokeninfo(#20108,4,#20001,38,"""module""") +#20109=@"loc,{#10000},4,16,4,23" +locations_default(#20109,#10000,4,16,4,23) +hasLocation(#20108,#20109) +#20110=* +tokeninfo(#20110,7,#20001,39,"assert") +#20111=@"loc,{#10000},4,25,4,30" +locations_default(#20111,#10000,4,25,4,30) +hasLocation(#20110,#20111) +#20112=* +tokeninfo(#20112,8,#20001,40,"{") +#20113=@"loc,{#10000},4,32,4,32" +locations_default(#20113,#10000,4,32,4,32) +hasLocation(#20112,#20113) +#20114=* +tokeninfo(#20114,7,#20001,41,"type") +#20115=@"loc,{#10000},4,34,4,37" +locations_default(#20115,#10000,4,34,4,37) +hasLocation(#20114,#20115) +#20116=* +tokeninfo(#20116,8,#20001,42,":") +#20117=@"loc,{#10000},4,38,4,38" +locations_default(#20117,#10000,4,38,4,38) +hasLocation(#20116,#20117) +#20118=* +tokeninfo(#20118,4,#20001,43,"""json""") +#20119=@"loc,{#10000},4,40,4,45" +locations_default(#20119,#10000,4,40,4,45) +hasLocation(#20118,#20119) +#20120=* +tokeninfo(#20120,8,#20001,44,"}") +#20121=@"loc,{#10000},4,47,4,47" +locations_default(#20121,#10000,4,47,4,47) +hasLocation(#20120,#20121) +#20122=* +tokeninfo(#20122,8,#20001,45,";") +#20123=@"loc,{#10000},4,48,4,48" +locations_default(#20123,#10000,4,48,4,48) +hasLocation(#20122,#20123) +#20124=* +tokeninfo(#20124,7,#20001,46,"export") +#20125=@"loc,{#10000},6,1,6,6" +locations_default(#20125,#10000,6,1,6,6) +hasLocation(#20124,#20125) +#20126=* +tokeninfo(#20126,8,#20001,47,"{") +#20127=@"loc,{#10000},6,8,6,8" +locations_default(#20127,#10000,6,8,6,8) +hasLocation(#20126,#20127) +#20128=* +tokeninfo(#20128,6,#20001,48,"v4") +#20129=@"loc,{#10000},6,10,6,11" +locations_default(#20129,#10000,6,10,6,11) +hasLocation(#20128,#20129) +#20130=* +tokeninfo(#20130,8,#20001,49,"}") +#20131=@"loc,{#10000},6,13,6,13" +locations_default(#20131,#10000,6,13,6,13) +hasLocation(#20130,#20131) +#20132=* +tokeninfo(#20132,7,#20001,50,"from") +#20133=@"loc,{#10000},6,15,6,18" +locations_default(#20133,#10000,6,15,6,18) +hasLocation(#20132,#20133) +#20134=* +tokeninfo(#20134,4,#20001,51,"""module""") +#20135=@"loc,{#10000},6,20,6,27" +locations_default(#20135,#10000,6,20,6,27) +hasLocation(#20134,#20135) +#20136=* +tokeninfo(#20136,7,#20001,52,"assert") +#20137=@"loc,{#10000},6,29,6,34" +locations_default(#20137,#10000,6,29,6,34) +hasLocation(#20136,#20137) +#20138=* +tokeninfo(#20138,8,#20001,53,"{") +#20139=@"loc,{#10000},6,36,6,36" +locations_default(#20139,#10000,6,36,6,36) +hasLocation(#20138,#20139) +#20140=* +tokeninfo(#20140,7,#20001,54,"type") +#20141=@"loc,{#10000},6,38,6,41" +locations_default(#20141,#10000,6,38,6,41) +hasLocation(#20140,#20141) +#20142=* +tokeninfo(#20142,8,#20001,55,":") +#20143=@"loc,{#10000},6,42,6,42" +locations_default(#20143,#10000,6,42,6,42) +hasLocation(#20142,#20143) +#20144=* +tokeninfo(#20144,4,#20001,56,"""json""") +#20145=@"loc,{#10000},6,44,6,49" +locations_default(#20145,#10000,6,44,6,49) +hasLocation(#20144,#20145) +#20146=* +tokeninfo(#20146,8,#20001,57,"}") +#20147=@"loc,{#10000},6,51,6,51" +locations_default(#20147,#10000,6,51,6,51) +hasLocation(#20146,#20147) +#20148=* +tokeninfo(#20148,8,#20001,58,";") +#20149=@"loc,{#10000},6,52,6,52" +locations_default(#20149,#10000,6,52,6,52) +hasLocation(#20148,#20149) +#20150=* +tokeninfo(#20150,7,#20001,59,"export") +#20151=@"loc,{#10000},7,1,7,6" +locations_default(#20151,#10000,7,1,7,6) +hasLocation(#20150,#20151) +#20152=* +tokeninfo(#20152,8,#20001,60,"*") +#20153=@"loc,{#10000},7,8,7,8" +locations_default(#20153,#10000,7,8,7,8) +hasLocation(#20152,#20153) +#20154=* +tokeninfo(#20154,7,#20001,61,"from") +#20155=@"loc,{#10000},7,10,7,13" +locations_default(#20155,#10000,7,10,7,13) +hasLocation(#20154,#20155) +#20156=* +tokeninfo(#20156,4,#20001,62,"""module""") +#20157=@"loc,{#10000},7,15,7,22" +locations_default(#20157,#10000,7,15,7,22) +hasLocation(#20156,#20157) +#20158=* +tokeninfo(#20158,7,#20001,63,"assert") +#20159=@"loc,{#10000},7,24,7,29" +locations_default(#20159,#10000,7,24,7,29) +hasLocation(#20158,#20159) +#20160=* +tokeninfo(#20160,8,#20001,64,"{") +#20161=@"loc,{#10000},7,31,7,31" +locations_default(#20161,#10000,7,31,7,31) +hasLocation(#20160,#20161) +#20162=* +tokeninfo(#20162,7,#20001,65,"type") +#20163=@"loc,{#10000},7,33,7,36" +locations_default(#20163,#10000,7,33,7,36) +hasLocation(#20162,#20163) +#20164=* +tokeninfo(#20164,8,#20001,66,":") +#20165=@"loc,{#10000},7,37,7,37" +locations_default(#20165,#10000,7,37,7,37) +hasLocation(#20164,#20165) +#20166=* +tokeninfo(#20166,4,#20001,67,"""json""") +#20167=@"loc,{#10000},7,39,7,44" +locations_default(#20167,#10000,7,39,7,44) +hasLocation(#20166,#20167) +#20168=* +tokeninfo(#20168,8,#20001,68,"}") +#20169=@"loc,{#10000},7,46,7,46" +locations_default(#20169,#10000,7,46,7,46) +hasLocation(#20168,#20169) +#20170=* +tokeninfo(#20170,8,#20001,69,";") +#20171=@"loc,{#10000},7,47,7,47" +locations_default(#20171,#10000,7,47,7,47) +hasLocation(#20170,#20171) +#20172=* +tokeninfo(#20172,7,#20001,70,"export") +#20173=@"loc,{#10000},8,1,8,6" +locations_default(#20173,#10000,8,1,8,6) +hasLocation(#20172,#20173) +#20174=* +tokeninfo(#20174,8,#20001,71,"*") +#20175=@"loc,{#10000},8,8,8,8" +locations_default(#20175,#10000,8,8,8,8) +hasLocation(#20174,#20175) +#20176=* +tokeninfo(#20176,7,#20001,72,"as") +#20177=@"loc,{#10000},8,10,8,11" +locations_default(#20177,#10000,8,10,8,11) +hasLocation(#20176,#20177) +#20178=* +tokeninfo(#20178,6,#20001,73,"v5") +#20179=@"loc,{#10000},8,13,8,14" +locations_default(#20179,#10000,8,13,8,14) +hasLocation(#20178,#20179) +#20180=* +tokeninfo(#20180,7,#20001,74,"from") +#20181=@"loc,{#10000},8,16,8,19" +locations_default(#20181,#10000,8,16,8,19) +hasLocation(#20180,#20181) +#20182=* +tokeninfo(#20182,4,#20001,75,"""module""") +#20183=@"loc,{#10000},8,21,8,28" +locations_default(#20183,#10000,8,21,8,28) +hasLocation(#20182,#20183) +#20184=* +tokeninfo(#20184,7,#20001,76,"assert") +#20185=@"loc,{#10000},8,30,8,35" +locations_default(#20185,#10000,8,30,8,35) +hasLocation(#20184,#20185) +#20186=* +tokeninfo(#20186,8,#20001,77,"{") +#20187=@"loc,{#10000},8,37,8,37" +locations_default(#20187,#10000,8,37,8,37) +hasLocation(#20186,#20187) +#20188=* +tokeninfo(#20188,7,#20001,78,"type") +#20189=@"loc,{#10000},8,39,8,42" +locations_default(#20189,#10000,8,39,8,42) +hasLocation(#20188,#20189) +#20190=* +tokeninfo(#20190,8,#20001,79,":") +#20191=@"loc,{#10000},8,43,8,43" +locations_default(#20191,#10000,8,43,8,43) +hasLocation(#20190,#20191) +#20192=* +tokeninfo(#20192,4,#20001,80,"""json""") +#20193=@"loc,{#10000},8,45,8,50" +locations_default(#20193,#10000,8,45,8,50) +hasLocation(#20192,#20193) +#20194=* +tokeninfo(#20194,8,#20001,81,"}") +#20195=@"loc,{#10000},8,52,8,52" +locations_default(#20195,#10000,8,52,8,52) +hasLocation(#20194,#20195) +#20196=* +tokeninfo(#20196,8,#20001,82,";") +#20197=@"loc,{#10000},8,53,8,53" +locations_default(#20197,#10000,8,53,8,53) +hasLocation(#20196,#20197) +#20198=* +tokeninfo(#20198,7,#20001,83,"const") +#20199=@"loc,{#10000},10,1,10,5" +locations_default(#20199,#10000,10,1,10,5) +hasLocation(#20198,#20199) +#20200=* +tokeninfo(#20200,6,#20001,84,"v6") +#20201=@"loc,{#10000},10,7,10,8" +locations_default(#20201,#10000,10,7,10,8) +hasLocation(#20200,#20201) +#20202=* +tokeninfo(#20202,8,#20001,85,"=") +#20203=@"loc,{#10000},10,10,10,10" +locations_default(#20203,#10000,10,10,10,10) +hasLocation(#20202,#20203) +#20204=* +tokeninfo(#20204,7,#20001,86,"import") +#20205=@"loc,{#10000},10,12,10,17" +locations_default(#20205,#10000,10,12,10,17) +hasLocation(#20204,#20205) +#20206=* +tokeninfo(#20206,8,#20001,87,"(") +#20207=@"loc,{#10000},10,18,10,18" +locations_default(#20207,#10000,10,18,10,18) +hasLocation(#20206,#20207) +#20208=* +tokeninfo(#20208,4,#20001,88,"""module""") +#20209=@"loc,{#10000},10,19,10,26" +locations_default(#20209,#10000,10,19,10,26) +hasLocation(#20208,#20209) +#20210=* +tokeninfo(#20210,8,#20001,89,",") +#20211=@"loc,{#10000},10,27,10,27" +locations_default(#20211,#10000,10,27,10,27) +hasLocation(#20210,#20211) +#20212=* +tokeninfo(#20212,8,#20001,90,"{") +#20213=@"loc,{#10000},10,29,10,29" +locations_default(#20213,#10000,10,29,10,29) +hasLocation(#20212,#20213) +#20214=* +tokeninfo(#20214,7,#20001,91,"assert") +#20215=@"loc,{#10000},10,31,10,36" +locations_default(#20215,#10000,10,31,10,36) +hasLocation(#20214,#20215) +#20216=* +tokeninfo(#20216,8,#20001,92,":") +#20217=@"loc,{#10000},10,37,10,37" +locations_default(#20217,#10000,10,37,10,37) +hasLocation(#20216,#20217) +#20218=* +tokeninfo(#20218,8,#20001,93,"{") +#20219=@"loc,{#10000},10,39,10,39" +locations_default(#20219,#10000,10,39,10,39) +hasLocation(#20218,#20219) +#20220=* +tokeninfo(#20220,7,#20001,94,"type") +#20221=@"loc,{#10000},10,41,10,44" +locations_default(#20221,#10000,10,41,10,44) +hasLocation(#20220,#20221) +#20222=* +tokeninfo(#20222,8,#20001,95,":") +#20223=@"loc,{#10000},10,45,10,45" +locations_default(#20223,#10000,10,45,10,45) +hasLocation(#20222,#20223) +#20224=* +tokeninfo(#20224,4,#20001,96,"""json""") +#20225=@"loc,{#10000},10,47,10,52" +locations_default(#20225,#10000,10,47,10,52) +hasLocation(#20224,#20225) +#20226=* +tokeninfo(#20226,8,#20001,97,"}") +#20227=@"loc,{#10000},10,54,10,54" +locations_default(#20227,#10000,10,54,10,54) +hasLocation(#20226,#20227) +#20228=* +tokeninfo(#20228,8,#20001,98,"}") +#20229=@"loc,{#10000},10,56,10,56" +locations_default(#20229,#10000,10,56,10,56) +hasLocation(#20228,#20229) +#20230=* +tokeninfo(#20230,8,#20001,99,")") +#20231=@"loc,{#10000},10,57,10,57" +locations_default(#20231,#10000,10,57,10,57) +hasLocation(#20230,#20231) +#20232=* +tokeninfo(#20232,8,#20001,100,";") +#20233=@"loc,{#10000},10,58,10,58" +locations_default(#20233,#10000,10,58,10,58) +hasLocation(#20232,#20233) +#20234=* +tokeninfo(#20234,7,#20001,101,"import") +#20235=@"loc,{#10000},12,1,12,6" +locations_default(#20235,#10000,12,1,12,6) +hasLocation(#20234,#20235) +#20236=* +tokeninfo(#20236,4,#20001,102,"""module""") +#20237=@"loc,{#10000},12,8,12,15" +locations_default(#20237,#10000,12,8,12,15) +hasLocation(#20236,#20237) +#20238=* +tokeninfo(#20238,8,#20001,103,";") +#20239=@"loc,{#10000},12,16,12,16" +locations_default(#20239,#10000,12,16,12,16) +hasLocation(#20238,#20239) +#20240=* +tokeninfo(#20240,7,#20001,104,"assert") +#20241=@"loc,{#10000},13,1,13,6" +locations_default(#20241,#10000,13,1,13,6) +hasLocation(#20240,#20241) +next_token(#20002,#20240) +#20242=* +tokeninfo(#20242,8,#20001,105,"(") +#20243=@"loc,{#10000},13,7,13,7" +locations_default(#20243,#10000,13,7,13,7) +hasLocation(#20242,#20243) +#20244=* +tokeninfo(#20244,8,#20001,106,"{") +#20245=@"loc,{#10000},13,8,13,8" +locations_default(#20245,#10000,13,8,13,8) +hasLocation(#20244,#20245) +#20246=* +tokeninfo(#20246,7,#20001,107,"type") +#20247=@"loc,{#10000},13,10,13,13" +locations_default(#20247,#10000,13,10,13,13) +hasLocation(#20246,#20247) +#20248=* +tokeninfo(#20248,8,#20001,108,":") +#20249=@"loc,{#10000},13,14,13,14" +locations_default(#20249,#10000,13,14,13,14) +hasLocation(#20248,#20249) +#20250=* +tokeninfo(#20250,4,#20001,109,"""json""") +#20251=@"loc,{#10000},13,16,13,21" +locations_default(#20251,#10000,13,16,13,21) +hasLocation(#20250,#20251) +#20252=* +tokeninfo(#20252,8,#20001,110,"}") +#20253=@"loc,{#10000},13,23,13,23" +locations_default(#20253,#10000,13,23,13,23) +hasLocation(#20252,#20253) +#20254=* +tokeninfo(#20254,8,#20001,111,")") +#20255=@"loc,{#10000},13,24,13,24" +locations_default(#20255,#10000,13,24,13,24) +hasLocation(#20254,#20255) +#20256=* +tokeninfo(#20256,8,#20001,112,";") +#20257=@"loc,{#10000},13,25,13,25" +locations_default(#20257,#10000,13,25,13,25) +hasLocation(#20256,#20257) +#20258=* +tokeninfo(#20258,0,#20001,113,"") +#20259=@"loc,{#10000},14,1,14,0" +locations_default(#20259,#10000,14,1,14,0) +hasLocation(#20258,#20259) +next_token(#20004,#20258) +toplevels(#20001,0) +#20260=@"loc,{#10000},1,1,14,0" +locations_default(#20260,#10000,1,1,14,0) +hasLocation(#20001,#20260) +#20261=@"module;{#10000},1,1" +scopes(#20261,3) +scopenodes(#20001,#20261) +scopenesting(#20261,#20000) +is_module(#20001) +is_es2015_module(#20001) +#20262=@"var;{v1};{#20261}" +variables(#20262,"v1",#20261) +#20263=@"var;{v2};{#20261}" +variables(#20263,"v2",#20261) +#20264=@"var;{v3};{#20261}" +variables(#20264,"v3",#20261) +#20265=@"local_type_name;{v1};{#20261}" +local_type_names(#20265,"v1",#20261) +#20266=@"local_type_name;{v2};{#20261}" +local_type_names(#20266,"v2",#20261) +#20267=@"local_type_name;{v3};{#20261}" +local_type_names(#20267,"v3",#20261) +#20268=@"local_namespace_name;{v1};{#20261}" +local_namespace_names(#20268,"v1",#20261) +#20269=@"local_namespace_name;{v2};{#20261}" +local_namespace_names(#20269,"v2",#20261) +#20270=@"local_namespace_name;{v3};{#20261}" +local_namespace_names(#20270,"v3",#20261) +variables(#20262,"v1",#20261) +variables(#20263,"v2",#20261) +variables(#20264,"v3",#20261) +#20271=@"var;{v6};{#20261}" +variables(#20271,"v6",#20261) +local_type_names(#20265,"v1",#20261) +local_type_names(#20266,"v2",#20261) +local_type_names(#20267,"v3",#20261) +local_namespace_names(#20268,"v1",#20261) +local_namespace_names(#20269,"v2",#20261) +local_namespace_names(#20270,"v3",#20261) +#20272=* +stmts(#20272,27,#20001,0,"import ... son"" };") +hasLocation(#20272,#20007) +stmt_containers(#20272,#20001) +#20273=* +exprs(#20273,4,#20272,-1,"""module""") +hasLocation(#20273,#20035) +enclosing_stmt(#20273,#20272) +expr_containers(#20273,#20001) +literals("module","""module""",#20273) +#20274=* +regexpterm(#20274,14,#20273,0,"module") +#20275=@"loc,{#10000},1,9,1,14" +locations_default(#20275,#10000,1,9,1,14) +hasLocation(#20274,#20275) +regexp_const_value(#20274,"module") +#20276=* +stmts(#20276,27,#20001,1,"import ... son"" };") +hasLocation(#20276,#20009) +stmt_containers(#20276,#20001) +#20277=* +exprs(#20277,4,#20276,-1,"""module""") +hasLocation(#20277,#20061) +enclosing_stmt(#20277,#20276) +expr_containers(#20277,#20001) +literals("module","""module""",#20277) +#20278=* +regexpterm(#20278,14,#20277,0,"module") +#20279=@"loc,{#10000},2,22,2,27" +locations_default(#20279,#10000,2,22,2,27) +hasLocation(#20278,#20279) +regexp_const_value(#20278,"module") +#20280=* +exprs(#20280,85,#20276,0,"* as v1") +#20281=@"loc,{#10000},2,8,2,14" +locations_default(#20281,#10000,2,8,2,14) +hasLocation(#20280,#20281) +enclosing_stmt(#20280,#20276) +expr_containers(#20280,#20001) +#20282=* +exprs(#20282,78,#20280,1,"v1") +hasLocation(#20282,#20057) +enclosing_stmt(#20282,#20276) +expr_containers(#20282,#20001) +literals("v1","v1",#20282) +decl(#20282,#20262) +typedecl(#20282,#20265) +namespacedecl(#20282,#20268) +#20283=* +stmts(#20283,27,#20001,2,"import ... son"" };") +hasLocation(#20283,#20011) +stmt_containers(#20283,#20001) +#20284=* +exprs(#20284,4,#20283,-1,"""module""") +hasLocation(#20284,#20087) +enclosing_stmt(#20284,#20283) +expr_containers(#20284,#20001) +literals("module","""module""",#20284) +#20285=* +regexpterm(#20285,14,#20284,0,"module") +#20286=@"loc,{#10000},3,21,3,26" +locations_default(#20286,#10000,3,21,3,26) +hasLocation(#20285,#20286) +regexp_const_value(#20285,"module") +#20287=* +exprs(#20287,83,#20283,0,"v2") +hasLocation(#20287,#20081) +enclosing_stmt(#20287,#20283) +expr_containers(#20287,#20001) +#20288=* +exprs(#20288,0,#20287,0,"v2") +hasLocation(#20288,#20081) +enclosing_stmt(#20288,#20283) +expr_containers(#20288,#20001) +literals("v2","v2",#20288) +#20289=* +exprs(#20289,78,#20287,1,"v2") +hasLocation(#20289,#20081) +enclosing_stmt(#20289,#20283) +expr_containers(#20289,#20001) +literals("v2","v2",#20289) +decl(#20289,#20263) +typedecl(#20289,#20266) +namespacedecl(#20289,#20269) +#20290=* +stmts(#20290,27,#20001,3,"import ... son"" };") +hasLocation(#20290,#20013) +stmt_containers(#20290,#20001) +#20291=* +exprs(#20291,4,#20290,-1,"""module""") +hasLocation(#20291,#20109) +enclosing_stmt(#20291,#20290) +expr_containers(#20291,#20001) +literals("module","""module""",#20291) +#20292=* +regexpterm(#20292,14,#20291,0,"module") +#20293=@"loc,{#10000},4,17,4,22" +locations_default(#20293,#10000,4,17,4,22) +hasLocation(#20292,#20293) +regexp_const_value(#20292,"module") +#20294=* +exprs(#20294,84,#20290,0,"v3") +hasLocation(#20294,#20105) +enclosing_stmt(#20294,#20290) +expr_containers(#20294,#20001) +#20295=* +exprs(#20295,78,#20294,1,"v3") +hasLocation(#20295,#20105) +enclosing_stmt(#20295,#20290) +expr_containers(#20295,#20001) +literals("v3","v3",#20295) +decl(#20295,#20264) +typedecl(#20295,#20267) +namespacedecl(#20295,#20270) +#20296=* +stmts(#20296,30,#20001,4,"export ... son"" };") +hasLocation(#20296,#20017) +stmt_containers(#20296,#20001) +#20297=* +exprs(#20297,4,#20296,-2,"""module""") +hasLocation(#20297,#20135) +enclosing_stmt(#20297,#20296) +expr_containers(#20297,#20001) +literals("module","""module""",#20297) +#20298=* +regexpterm(#20298,14,#20297,0,"module") +#20299=@"loc,{#10000},6,21,6,26" +locations_default(#20299,#10000,6,21,6,26) +hasLocation(#20298,#20299) +regexp_const_value(#20298,"module") +#20300=* +exprs(#20300,86,#20296,0,"v4") +hasLocation(#20300,#20129) +enclosing_stmt(#20300,#20296) +expr_containers(#20300,#20001) +#20301=* +exprs(#20301,0,#20300,0,"v4") +hasLocation(#20301,#20129) +enclosing_stmt(#20301,#20296) +expr_containers(#20301,#20001) +literals("v4","v4",#20301) +#20302=* +exprs(#20302,0,#20300,1,"v4") +hasLocation(#20302,#20129) +enclosing_stmt(#20302,#20296) +expr_containers(#20302,#20001) +literals("v4","v4",#20302) +#20303=* +stmts(#20303,28,#20001,5,"export ... son"" };") +hasLocation(#20303,#20019) +stmt_containers(#20303,#20001) +#20304=* +exprs(#20304,4,#20303,0,"""module""") +hasLocation(#20304,#20157) +enclosing_stmt(#20304,#20303) +expr_containers(#20304,#20001) +literals("module","""module""",#20304) +#20305=* +regexpterm(#20305,14,#20304,0,"module") +#20306=@"loc,{#10000},7,16,7,21" +locations_default(#20306,#10000,7,16,7,21) +hasLocation(#20305,#20306) +regexp_const_value(#20305,"module") +#20307=* +stmts(#20307,30,#20001,6,"export ... son"" };") +hasLocation(#20307,#20021) +stmt_containers(#20307,#20001) +#20308=* +exprs(#20308,4,#20307,-2,"""module""") +hasLocation(#20308,#20183) +enclosing_stmt(#20308,#20307) +expr_containers(#20308,#20001) +literals("module","""module""",#20308) +#20309=* +regexpterm(#20309,14,#20308,0,"module") +#20310=@"loc,{#10000},8,22,8,27" +locations_default(#20310,#10000,8,22,8,27) +hasLocation(#20309,#20310) +regexp_const_value(#20309,"module") +#20311=* +exprs(#20311,96,#20307,0,"* as v5") +#20312=@"loc,{#10000},8,8,8,14" +locations_default(#20312,#10000,8,8,8,14) +hasLocation(#20311,#20312) +enclosing_stmt(#20311,#20307) +expr_containers(#20311,#20001) +#20313=* +exprs(#20313,0,#20311,1,"v5") +hasLocation(#20313,#20179) +enclosing_stmt(#20313,#20307) +expr_containers(#20313,#20001) +literals("v5","v5",#20313) +#20314=* +stmts(#20314,22,#20001,7,"const v ... "" } });") +hasLocation(#20314,#20025) +stmt_containers(#20314,#20001) +#20315=* +exprs(#20315,64,#20314,0,"v6 = im ... n"" } })") +#20316=@"loc,{#10000},10,7,10,57" +locations_default(#20316,#10000,10,7,10,57) +hasLocation(#20315,#20316) +enclosing_stmt(#20315,#20314) +expr_containers(#20315,#20001) +#20317=* +exprs(#20317,78,#20315,0,"v6") +hasLocation(#20317,#20201) +enclosing_stmt(#20317,#20314) +expr_containers(#20317,#20001) +literals("v6","v6",#20317) +decl(#20317,#20271) +#20318=* +exprs(#20318,13,#20315,1,"import( ... n"" } })") +#20319=@"loc,{#10000},10,12,10,57" +locations_default(#20319,#10000,10,12,10,57) +hasLocation(#20318,#20319) +enclosing_stmt(#20318,#20314) +expr_containers(#20318,#20001) +#20320=* +exprs(#20320,79,#20318,-1,"import") +hasLocation(#20320,#20205) +enclosing_stmt(#20320,#20314) +expr_containers(#20320,#20001) +literals("import","import",#20320) +#20321=@"var;{import};{#20000}" +variables(#20321,"import",#20000) +bind(#20320,#20321) +#20322=* +exprs(#20322,4,#20318,0,"""module""") +hasLocation(#20322,#20209) +enclosing_stmt(#20322,#20314) +expr_containers(#20322,#20001) +literals("module","""module""",#20322) +#20323=* +regexpterm(#20323,14,#20322,0,"module") +#20324=@"loc,{#10000},10,20,10,25" +locations_default(#20324,#10000,10,20,10,25) +hasLocation(#20323,#20324) +regexp_const_value(#20323,"module") +#20325=* +exprs(#20325,8,#20318,1,"{ asser ... on"" } }") +#20326=@"loc,{#10000},10,29,10,56" +locations_default(#20326,#10000,10,29,10,56) +hasLocation(#20325,#20326) +enclosing_stmt(#20325,#20314) +expr_containers(#20325,#20001) +#20327=* +properties(#20327,#20325,0,0,"assert: ... json"" }") +#20328=@"loc,{#10000},10,31,10,54" +locations_default(#20328,#10000,10,31,10,54) +hasLocation(#20327,#20328) +#20329=* +exprs(#20329,0,#20327,0,"assert") +hasLocation(#20329,#20215) +enclosing_stmt(#20329,#20314) +expr_containers(#20329,#20001) +literals("assert","assert",#20329) +#20330=* +exprs(#20330,8,#20327,1,"{ type: ""json"" }") +#20331=@"loc,{#10000},10,39,10,54" +locations_default(#20331,#10000,10,39,10,54) +hasLocation(#20330,#20331) +enclosing_stmt(#20330,#20314) +expr_containers(#20330,#20001) +#20332=* +properties(#20332,#20330,0,0,"type: ""json""") +#20333=@"loc,{#10000},10,41,10,52" +locations_default(#20333,#10000,10,41,10,52) +hasLocation(#20332,#20333) +#20334=* +exprs(#20334,0,#20332,0,"type") +hasLocation(#20334,#20221) +enclosing_stmt(#20334,#20314) +expr_containers(#20334,#20001) +literals("type","type",#20334) +#20335=* +exprs(#20335,4,#20332,1,"""json""") +hasLocation(#20335,#20225) +enclosing_stmt(#20335,#20314) +expr_containers(#20335,#20001) +literals("json","""json""",#20335) +#20336=* +regexpterm(#20336,14,#20335,0,"json") +#20337=@"loc,{#10000},10,48,10,51" +locations_default(#20337,#10000,10,48,10,51) +hasLocation(#20336,#20337) +regexp_const_value(#20336,"json") +#20338=* +stmts(#20338,27,#20001,8,"import ""module"";") +#20339=@"loc,{#10000},12,1,12,16" +locations_default(#20339,#10000,12,1,12,16) +hasLocation(#20338,#20339) +stmt_containers(#20338,#20001) +#20340=* +exprs(#20340,4,#20338,-1,"""module""") +hasLocation(#20340,#20237) +enclosing_stmt(#20340,#20338) +expr_containers(#20340,#20001) +literals("module","""module""",#20340) +#20341=* +regexpterm(#20341,14,#20340,0,"module") +#20342=@"loc,{#10000},12,9,12,14" +locations_default(#20342,#10000,12,9,12,14) +hasLocation(#20341,#20342) +regexp_const_value(#20341,"module") +#20343=* +stmts(#20343,2,#20001,9,"assert( ... on"" });") +#20344=@"loc,{#10000},13,1,13,25" +locations_default(#20344,#10000,13,1,13,25) +hasLocation(#20343,#20344) +stmt_containers(#20343,#20001) +#20345=* +exprs(#20345,13,#20343,0,"assert( ... son"" })") +#20346=@"loc,{#10000},13,1,13,24" +locations_default(#20346,#10000,13,1,13,24) +hasLocation(#20345,#20346) +enclosing_stmt(#20345,#20343) +expr_containers(#20345,#20001) +#20347=* +exprs(#20347,79,#20345,-1,"assert") +hasLocation(#20347,#20241) +enclosing_stmt(#20347,#20343) +expr_containers(#20347,#20001) +literals("assert","assert",#20347) +#20348=@"var;{assert};{#20000}" +variables(#20348,"assert",#20000) +bind(#20347,#20348) +#20349=* +exprs(#20349,8,#20345,0,"{ type: ""json"" }") +#20350=@"loc,{#10000},13,8,13,23" +locations_default(#20350,#10000,13,8,13,23) +hasLocation(#20349,#20350) +enclosing_stmt(#20349,#20343) +expr_containers(#20349,#20001) +#20351=* +properties(#20351,#20349,0,0,"type: ""json""") +#20352=@"loc,{#10000},13,10,13,21" +locations_default(#20352,#10000,13,10,13,21) +hasLocation(#20351,#20352) +#20353=* +exprs(#20353,0,#20351,0,"type") +hasLocation(#20353,#20247) +enclosing_stmt(#20353,#20343) +expr_containers(#20353,#20001) +literals("type","type",#20353) +#20354=* +exprs(#20354,4,#20351,1,"""json""") +hasLocation(#20354,#20251) +enclosing_stmt(#20354,#20343) +expr_containers(#20354,#20001) +literals("json","""json""",#20354) +#20355=* +regexpterm(#20355,14,#20354,0,"json") +#20356=@"loc,{#10000},13,17,13,20" +locations_default(#20356,#10000,13,17,13,20) +hasLocation(#20355,#20356) +regexp_const_value(#20355,"json") +#20357=* +entry_cfg_node(#20357,#20001) +#20358=@"loc,{#10000},1,1,1,0" +locations_default(#20358,#10000,1,1,1,0) +hasLocation(#20357,#20358) +#20359=* +exit_cfg_node(#20359,#20001) +hasLocation(#20359,#20259) +successor(#20343,#20347) +successor(#20349,#20353) +successor(#20354,#20351) +successor(#20353,#20354) +successor(#20351,#20345) +successor(#20347,#20349) +successor(#20345,#20359) +successor(#20338,#20343) +successor(#20314,#20317) +successor(#20325,#20329) +successor(#20330,#20334) +successor(#20335,#20332) +successor(#20334,#20335) +successor(#20332,#20327) +successor(#20329,#20330) +successor(#20327,#20318) +successor(#20322,#20325) +successor(#20320,#20322) +successor(#20318,#20315) +successor(#20317,#20320) +successor(#20315,#20338) +successor(#20307,#20308) +successor(#20311,#20313) +successor(#20313,#20314) +successor(#20308,#20311) +successor(#20303,#20304) +successor(#20304,#20307) +successor(#20296,#20297) +successor(#20300,#20301) +successor(#20302,#20303) +successor(#20301,#20302) +successor(#20297,#20300) +successor(#20290,#20296) +successor(#20283,#20290) +successor(#20276,#20283) +successor(#20272,#20276) +successor(#20294,#20272) +successor(#20287,#20294) +successor(#20280,#20287) +successor(#20357,#20280) +numlines(#10000,13,10,2) +filetype(#10000,"typescript")