Commit Graph

63 Commits

Author SHA1 Message Date
Sathya Gunasekaran d9c61bac70 [hir][be] Improve debug printing of invariant 2022-10-27 16:43:31 +01:00
Sathya Gunasekaran fd6cb34843 [ssa] Run SSA in RPO traversal
This prevents us from looking up state in blocks that have not been visited.
2022-10-27 16:43:28 +01:00
Sathya Gunasekaran 15104ab21b [ssa] Infer arguments of a function 2022-10-27 15:16:56 +01:00
Sathya Gunasekaran fed106a8eb [ssa][be] Fix printing of SSA blocks 2022-10-27 15:16:52 +01:00
Sathya Gunasekaran 97757ea988 [hir] Run SSA pass before InferReferenceEffects pass 2022-10-27 15:16:49 +01:00
Sathya Gunasekaran 6b9f07624f [hir] Add support for handling phis in InferReferenceEffects
This just piggybacks on the infrastructure for handling Env.#variables. 

In the future, a better approach would be to simplify the environment creation 
and merging by leveraging the SSA property of the new IR -- 1) We don't need to 
track IdentifierId per environment as they are all    unique 2) Rather than 
tracking values, we can just track Identifiers because    Identifiers can never 
be reassigned.
2022-10-27 15:16:46 +01:00
Sathya Gunasekaran de6afc2c52 [ssa] Update lvalue based on whether it has a memberPath or not
The semantics of lvalue changes based on whether lvalue.place.memberPath is null 
or not. If it's null, then lvalue.place acts as the lvalue for the instruction, 
otherwise it's just a reference to the memberPath specified location. 

Ideally we'd have an MemberExpression IR that lowers this complex lvalue into a 
temporary Place, uses this temporary place and stores back to the 
MemberExpression. 

Working around for now, will refactor to create a MemberExpression in the future 
if necessary for other analysis.
2022-10-27 14:11:23 +01:00
Sathya Gunasekaran c8aaa7f172 [ssa] Use Identifier for updating SSA
Instead of using Place, use Identifier as the unit of comparison in SSA. 

Place is too high level and can not be substituted for other Places (even those 
with the same Identifier) as Place contain higher level metadata such as 
memberPath.
2022-10-27 14:11:19 +01:00
Sathya Gunasekaran 588a098149 [hir][be] Remove unused param 2022-10-27 14:11:16 +01:00
Sathya Gunasekaran 1396ee28a4 [ssa][be] Refactor to be more idiomatic typescript 2022-10-27 14:11:12 +01:00
Joseph Savona e262d9e5ba only run validation if code is actually transformed
Disables post-codegen validation if there were no React functions in the input.
2022-10-25 08:33:20 -07:00
Jan Kassens eb13f84b2d [fix] consistently import from react
Instead of a combination of `react` and `React`, consistently use `react` which 
is the preferred name to import.
2022-10-25 11:00:27 -04:00
Sathya Gunasekaran 34e02dab32 [ssa] Fix lookup of global values
Currently, HIR doesn't load global idenfifiers into a temporary Place which 
means our SSA transform breaks when it tries to lookup this global identifier. 

Instead of throwing, let's log and return the old place. This works for now but 
will probably break when we start mutating globals, but at that point our HIR 
builder will need fixes.
2022-10-24 16:04:20 +01:00
Sathya Gunasekaran 75871d7de7 [ssa] Add support for other kinds of Instructions 2022-10-24 16:04:19 +01:00
Sathya Gunasekaran bb91cbbf62 [hir][be] Use a Map to store ObjectExpression.properties
Semantically this seems like a better fit as we're using Map like methods to 
iterate and update values anyway.
2022-10-24 16:04:18 +01:00
Sathya Gunasekaran f54d121d71 [hir][be] Use a Map to store JsxExpression.props
Semantically this seems like a better fit as we're using Map like methods to 
iterate and update values anyway.
2022-10-24 16:04:18 +01:00
Sathya Gunasekaran c347e8b6d2 [ssa][be] Delete dead code
Leftover from 4eba7a87ec6b27d1e8bad697ff6c0ac5db1ae7ad
2022-10-24 15:49:49 +01:00
Sathya Gunasekaran 152c3e81d3 [hir][be] Use .kind() to update and find ValueKind 2022-10-24 15:49:45 +01:00
Joseph Savona f4df345420 Improve playground validation, workaround lack of JSX support
ESLint's default parser doesn't support any non-standard syntax, which includes 
JSX. So when I added the ESLint validation step to the playground, it meant that 
valid examples containing JSX still reported "invalid output". I tried to use an 
alternative parser, but I couldn't figure out the right webpack incantations to 
make `@babel/eslint-parser` or `hermes-eslint` work. I even tried recreating 
some of their code to avoid problematic imports, no dice. 

Instead this PR: 

* No longer uses the `postCodegenValidator` step, and runs the validation on the 
output after compilation completes. This is better anyway since we can see the 
output *and* the error messages 

* Shows rule violations as an "Invalid output" comment 

* Shows parser errors as a note (mostly to indicate that the validation step 
couldn't run, there could still be no-use-before-define violations that weren't 
found) 

Invalid example: 

<img width="1502" alt="Screen Shot 2022-10-21 at 9 50 23 AM" 
src="https://user-images.githubusercontent.com/6425824/197249007-1ec244a0-6dfe-4ec6-a0d0-60302efd86bd.png"> 

Sample example but with some JSX: 

<img width="1500" alt="Screen Shot 2022-10-21 at 9 50 39 AM" 
src="https://user-images.githubusercontent.com/6425824/197249030-e68ba968-4101-47c7-a148-f548f84f375c.png">
2022-10-21 11:00:39 -07:00
Joseph Savona a7450572fa import runtime from "React.unstable_ForgetRuntime"
Imports the runtime from `React.unstable_ForgetRuntime` rather than from a 
separate module. The hope is that any code that gets transformed already has a 
dependency on React anyway, so we can avoid adding a new dependency that other 
systems don't know about. 

While here, i also cleaned up the `guardThrows` flag (we still parse it if 
present and warn, rather than throwing, to make it easier to adopt the latest 
version in various places).
2022-10-21 09:13:37 -07:00
Joseph Savona 2f34f85011 Enable no-use-before-define validation in playground
#686 added an option to validate generated code after transformation and adds an 
ESLint-based validator function to transform-test. Unfortunately it isn't super 
easy to wire up ESLint for use in a browser: traditionally the ESLint project 
specifically did _not_ support browser builds, but they recently have relaxed 
this because they added a browser playground on their website. There isn't 
official support, but the [playground 
repo](https://github.com/eslint/playground/blob/f3b1f78cc1c06dadfe7bb50c6c0f913c0d23670d/webpack.config.js) 
has a webpack config that, when combined with requiring a specific file, allows 
making things work in a browser. 

I tried using this directly in our playground app but Next's default webpack 
config doesn't work. So I created a separate package, playground-validator, 
which exports a webpack-built version of `eslint.Linter`. Then the playground 
can consume that, and everything works: 

## Test Plan 👀 

Confirmed that a known problematic example displays the validation message in 
playground (both locally and on the preview deployment): 

<img width="1500" alt="Screen Shot 2022-10-20 at 12 22 59 PM" 
src="https://user-images.githubusercontent.com/6425824/197041265-966ffda2-a3d0-450e-8fc4-fd1a7ca06e1a.png">
2022-10-21 08:37:18 -07:00
Joseph Savona 00a58cdab1 Option to validate output with ESLint
Adds a new compiler option `validateNoUseBeforeDefine`, which enables a 
post-codegen pass to validate that there are no usages of values before they are 
defined (which causes a ReferenceError at runtime). This can occur when a value 
is accessed when its in the TDZ (temporary dead zone), after the hoisted 
_declaration_ but before the variable is defined: 

```javascript 

function foo() { 

x; // x is in the TDX here: the binding from the subsequent statement is 
hoisted, but x is not yet defined. 

let x; 

} 

``` 

* The validation is off by default, but enabled in transform-test 

* The validation crashes compilation, rather than bailout, because the code has 
already been mangled and we can't roll back at the point the validation runs. 

* The validator uses ESLint's no-use-before-define rule by printing the program 
to source and then configuring ESLint to use Hermes parser. 

* transform-test now supports tests prefixed with "error." to indicate tests for 
which compilation is expected to crash (not just bailout), and the expect file 
includes the error message.
2022-10-19 13:00:47 -07:00
Jan Kassens 94f1e6f27c Add runtime dependencies to the dependencies
These are used somewhere in the `dist/` directory after building and as such 
should be included in the dependencies of the package.json.
2022-10-19 13:09:03 -04:00
Sathya Gunasekaran eeb01b17e6 [ssa] Remove lambdas for update functions
Rather than passing lambdas above to the builder, pass the builder down and 
update places.
2022-10-18 19:30:53 +01:00
Sathya Gunasekaran b9ce8bdcfd [SSA] Fix identifierID hack
Rather than starting from 1000, start from the last used identifier id.
2022-10-18 18:57:34 +01:00
Sathya Gunasekaran 379251c65f Add SSA-ify pass
The algorithm is described in detail here: 

https://pp.info.uni-karlsruhe.de/uploads/publikationen/braun13cc.pdf 

Note that the SSA form generated is not minimal. A follow on 
RedundantPhiElimination pass 

is required to prune the graph.
2022-10-18 18:45:01 +01:00
Jan Kassens 9524c58486 Replace import from '.' with path name
Somehow these imports aren't compatible with builds inside buck.
2022-10-18 13:14:27 -04:00
Tianyu Yao 95fe4ed0ed Include Utils.Component() in BailOnCapitalizedFunctionCalls
`Utils.Component()` wasn't caught by the bailout, and there are such usage on 
WWW 

Fixes #671
2022-10-17 22:44:03 -07:00
Joseph Savona 704d936009 [easy] rename InferReference{Capability=>Effects}
Forgot to rename the function/file when changing from capability to effect. 

#accept2ship
2022-10-18 08:49:31 -07:00
Tianyu Yao 4712017744 Include Utils.Component() in BailOnCapitalizedFunctionCalls
`Utils.Component()` wasn't caught by the bailout, and there are such usage on 
WWW 

Fixes #671
2022-10-17 14:41:26 -07:00
Lauren Tan 46d7f4f8af Synchronize symbol names with React
In the upstream useMemoCache PR this symbol got renamed and unexpectedly caused 
a RN crash. Synchronize it so the comparison works.
2022-10-17 16:07:50 -04:00
Lauren Tan b03752cbe0 Use for loop instead of Array.prototype.fill
Some prior [microbenchmarking](https://jsbench.me/7ol98ws520/1) showed that a 
for loop outperformed `fill` (which is about ~60% slower). This is the same 
approach we use in the latest useMemoCache PR
2022-10-17 16:07:50 -04:00
Jan Kassens 90e189ae82 Add react-forget-runtime
This is a new module that holds: 

- the `useMemoCache` stub (hopefully to be deleted next week) 

- various helpers that can be imported by the compiler, e.g. the dispatcher 
guard `$startLazy` 

- skipped the implementation of `makeReadOnly` for now as there's already 
multiple copies and I wanted to avoid typescript in this file for now to make 
the build easier (i.e. no build)
2022-10-17 13:08:34 -04:00
Lauren Tan 8f42eda432 Provide full path to tsc
I think my previous stack got mangled somehow
2022-10-17 11:33:24 -04:00
Lauren Tan 9e8224cc59 Pass init to E0007 diagnostic
I'm not sure why exactly but previously this diagnostic message was 

unusually slow to typecheck. Lifting the getter for init outside of the 

diagnostic to the callsite seems to fix the hotspot. Probably some 

interaction with string interpolation, or something else. 

Test case: ran `yarn ts:analyze-trace`, hotspot for Diagnostic.ts no 

longer present
2022-10-14 17:36:20 -04:00
Lauren Tan 33735b90fe Add a ts:analyze-trace command
I think all of us have noticed TS slowing to a crawl in the past couple of weeks 
and I was curious what exactly was causing it. This adds a yarn command to 
generate a TS trace and then runs a script on it to identify any hot spots 
during compilation. 

Example trace and hot spot analysis: 

``` yarn run v1.22.19 $ scripts/ts-analyze-trace.sh Hot Spots ├─ Check file 
[35m/users/laurentan/code/react-forget/forget/src/ir/[36mbabel-utils.ts[39m[35m[39m 
(2326ms) │  └─ Check expression from (line 141, char 5) to (line 141, char 19) 
(1760ms) │     └─ Check expression from (line 141, char 14) to (line 141, char 
18) (1760ms) │        └─ Compare types 658 and 607 (1759ms) │           ├─ 
{"id":658,"kind":"GenericInstantiation","name":"NodePath","instantiatedType":350,"typeArguments":[657],"location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":1}} 
│           │  ├─ 
{"id":350,"kind":"GenericType","name":"NodePath","typeArguments":[351],"location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":1}} 
│           │  │  └─ 
{"id":351,"kind":"TypeParameter","name":"T","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":23}} 
│           │  └─ {"id":657,"kind":"Union","count":2,"types":[430,452]} │        
   │     ├─ 
{"id":430,"kind":"Object","name":"Identifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":156,"char":1}} 
│           │     └─ 
{"id":452,"kind":"Object","name":"JSXIdentifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":982,"char":1}} 
│           └─ 
{"id":607,"kind":"GenericInstantiation","name":"NodePath","instantiatedType":350,"typeArguments":[606],"location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":1}} 
│              ├─ 
{"id":350,"kind":"GenericType","name":"NodePath","typeArguments":[351],"location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":1}} 
│              │  └─ 
{"id":351,"kind":"TypeParameter","name":"T","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@types/babel__traverse[39m[35m/index.d.ts[39m","line":237,"char":23}} 
│              └─ 
{"id":606,"kind":"AliasedUnion","name":"Node","count":252,"types":[353,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605],"location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":38,"char":1}} 
│                 ├─ 
{"id":353,"kind":"Object","name":"AnyTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":625,"char":1}} 
│                 ├─ 
{"id":355,"kind":"Object","name":"ArgumentPlaceholder","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1035,"char":1}} 
│                 ├─ 
{"id":356,"kind":"Object","name":"ArrayExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":39,"char":1}} 
│                 ├─ 
{"id":357,"kind":"Object","name":"ArrayPattern","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":356,"char":1}} 
│                 ├─ 
{"id":358,"kind":"Object","name":"ArrayTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":628,"char":1}} 
│                 ├─ 
{"id":359,"kind":"Object","name":"ArrowFunctionExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":363,"char":1}} 
│                 ├─ 
{"id":360,"kind":"Object","name":"AssignmentExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":43,"char":1}} 
│                 ├─ 
{"id":361,"kind":"Object","name":"AssignmentPattern","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":349,"char":1}} 
│                 ├─ 
{"id":362,"kind":"Object","name":"AwaitExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":523,"char":1}} 
│                 ├─ 
{"id":363,"kind":"Object","name":"BigIntLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":530,"char":1}} 
│                 ├─ 
{"id":364,"kind":"Object","name":"BinaryExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":49,"char":1}} 
│                 ├─ 
{"id":365,"kind":"Object","name":"BindExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1038,"char":1}} 
│                 ├─ 
{"id":366,"kind":"Object","name":"BlockStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":67,"char":1}} 
│                 ├─ 
{"id":367,"kind":"Object","name":"BooleanLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":192,"char":1}} 
│                 ├─ 
{"id":368,"kind":"Object","name":"BooleanLiteralTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":635,"char":1}} 
│                 ├─ 
{"id":369,"kind":"Object","name":"BooleanTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":632,"char":1}} 
│                 ├─ 
{"id":370,"kind":"Object","name":"BreakStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":72,"char":1}} 
│                 ├─ 
{"id":371,"kind":"Object","name":"CallExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":76,"char":1}} 
│                 ├─ 
{"id":372,"kind":"Object","name":"CatchClause","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":84,"char":1}} 
│                 ├─ 
{"id":373,"kind":"Object","name":"ClassAccessorProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":570,"char":1}} 
│                 ├─ 
{"id":374,"kind":"Object","name":"ClassBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":374,"char":1}} 
│                 ├─ 
{"id":375,"kind":"Object","name":"ClassDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":389,"char":1}} 
│                 ├─ 
{"id":376,"kind":"Object","name":"ClassExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":378,"char":1}} 
│                 ├─ 
{"id":377,"kind":"Object","name":"ClassImplements","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":642,"char":1}} 
│                 ├─ 
{"id":378,"kind":"Object","name":"ClassMethod","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":460,"char":1}} 
│                 ├─ 
{"id":379,"kind":"Object","name":"ClassPrivateMethod","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":598,"char":1}} 
│                 ├─ 
{"id":380,"kind":"Object","name":"ClassPrivateProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":587,"char":1}} 
│                 ├─ 
{"id":381,"kind":"Object","name":"ClassProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":553,"char":1}} 
│                 ├─ 
{"id":382,"kind":"Object","name":"ConditionalExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":89,"char":1}} 
│                 ├─ 
{"id":383,"kind":"Object","name":"ContinueStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":95,"char":1}} 
│                 ├─ 
{"id":384,"kind":"Object","name":"DebuggerStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":99,"char":1}} 
│                 ├─ 
{"id":385,"kind":"Object","name":"DecimalLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1069,"char":1}} 
│                 ├─ 
{"id":386,"kind":"Object","name":"DeclareClass","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":647,"char":1}} 
│                 ├─ 
{"id":387,"kind":"Object","name":"DeclareExportAllDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":704,"char":1}} 
│                 ├─ 
{"id":388,"kind":"Object","name":"DeclareExportDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":697,"char":1}} 
│                 ├─ 
{"id":389,"kind":"Object","name":"DeclareFunction","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":656,"char":1}} 
│                 ├─ 
{"id":390,"kind":"Object","name":"DeclareInterface","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":661,"char":1}} 
│                 ├─ 
{"id":391,"kind":"Object","name":"DeclareModule","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":670,"char":1}} 
│                 ├─ 
{"id":392,"kind":"Object","name":"DeclareModuleExports","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":676,"char":1}} 
│                 ├─ 
{"id":393,"kind":"Object","name":"DeclareOpaqueType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":686,"char":1}} 
│                 ├─ 
{"id":394,"kind":"Object","name":"DeclareTypeAlias","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":680,"char":1}} 
│                 ├─ 
{"id":395,"kind":"Object","name":"DeclareVariable","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":693,"char":1}} 
│                 ├─ 
{"id":396,"kind":"Object","name":"DeclaredPredicate","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":709,"char":1}} 
│                 ├─ 
{"id":397,"kind":"Object","name":"Decorator","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1048,"char":1}} 
│                 ├─ 
{"id":398,"kind":"Object","name":"Directive","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":59,"char":1}} 
│                 ├─ 
{"id":399,"kind":"Object","name":"DirectiveLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":63,"char":1}} 
│                 ├─ 
{"id":400,"kind":"Object","name":"DoExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1052,"char":1}} 
│                 ├─ 
{"id":401,"kind":"Object","name":"DoWhileStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":102,"char":1}} 
│                 ├─ 
{"id":402,"kind":"Object","name":"EmptyStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":107,"char":1}} 
│                 ├─ 
{"id":403,"kind":"Object","name":"EmptyTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":764,"char":1}} 
│                 ├─ 
{"id":404,"kind":"Object","name":"EnumBooleanBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":902,"char":1}} 
│                 ├─ 
{"id":405,"kind":"Object","name":"EnumBooleanMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":925,"char":1}} 
│                 ├─ 
{"id":406,"kind":"Object","name":"EnumDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":897,"char":1}} 
│                 ├─ 
{"id":407,"kind":"Object","name":"EnumDefaultedMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":940,"char":1}} 
│                 ├─ 
{"id":408,"kind":"Object","name":"EnumNumberBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":908,"char":1}} 
│                 ├─ 
{"id":409,"kind":"Object","name":"EnumNumberMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":930,"char":1}} 
│                 ├─ 
{"id":410,"kind":"Object","name":"EnumStringBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":914,"char":1}} 
│                 ├─ 
{"id":411,"kind":"Object","name":"EnumStringMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":935,"char":1}} 
│                 ├─ 
{"id":412,"kind":"Object","name":"EnumSymbolBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":920,"char":1}} 
│                 ├─ 
{"id":413,"kind":"Object","name":"ExistsTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":713,"char":1}} 
│                 ├─ 
{"id":414,"kind":"Object","name":"ExportAllDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":402,"char":1}} 
│                 ├─ 
{"id":415,"kind":"Object","name":"ExportDefaultDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":408,"char":1}} 
│                 ├─ 
{"id":416,"kind":"Object","name":"ExportDefaultSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1057,"char":1}} 
│                 ├─ 
{"id":417,"kind":"Object","name":"ExportNamedDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":413,"char":1}} 
│                 ├─ 
{"id":418,"kind":"Object","name":"ExportNamespaceSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":534,"char":1}} 
│                 ├─ 
{"id":419,"kind":"Object","name":"ExportSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":421,"char":1}} 
│                 ├─ 
{"id":420,"kind":"Object","name":"ExpressionStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":110,"char":1}} 
│                 ├─ 
{"id":421,"kind":"Object","name":"File","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":114,"char":1}} 
│                 ├─ 
{"id":422,"kind":"Object","name":"ForInStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":120,"char":1}} 
│                 ├─ 
{"id":423,"kind":"Object","name":"ForOfStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":427,"char":1}} 
│                 ├─ 
{"id":424,"kind":"Object","name":"ForStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":126,"char":1}} 
│                 ├─ 
{"id":425,"kind":"Object","name":"FunctionDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":133,"char":1}} 
│                 ├─ 
{"id":426,"kind":"Object","name":"FunctionExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":145,"char":1}} 
│                 ├─ 
{"id":427,"kind":"Object","name":"FunctionTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":716,"char":1}} 
│                 ├─ 
{"id":428,"kind":"Object","name":"FunctionTypeParam","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":724,"char":1}} 
│                 ├─ 
{"id":429,"kind":"Object","name":"GenericTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":730,"char":1}} 
│                 ├─ 
{"id":430,"kind":"Object","name":"Identifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":156,"char":1}} 
│                 ├─ 
{"id":431,"kind":"Object","name":"IfStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":163,"char":1}} 
│                 ├─ 
{"id":432,"kind":"Object","name":"Import","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":527,"char":1}} 
│                 ├─ 
{"id":433,"kind":"Object","name":"ImportAttribute","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1043,"char":1}} 
│                 ├─ 
{"id":434,"kind":"Object","name":"ImportDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":434,"char":1}} 
│                 ├─ 
{"id":435,"kind":"Object","name":"ImportDefaultSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":441,"char":1}} 
│                 ├─ 
{"id":436,"kind":"Object","name":"ImportNamespaceSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":445,"char":1}} 
│                 ├─ 
{"id":437,"kind":"Object","name":"ImportSpecifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":449,"char":1}} 
│                 ├─ 
{"id":438,"kind":"Object","name":"IndexedAccessType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":944,"char":1}} 
│                 ├─ 
{"id":439,"kind":"Object","name":"InferredPredicate","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":735,"char":1}} 
│                 ├─ 
{"id":440,"kind":"Object","name":"InterfaceDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":743,"char":1}} 
│                 ├─ 
{"id":441,"kind":"Object","name":"InterfaceExtends","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":738,"char":1}} 
│                 ├─ 
{"id":442,"kind":"Object","name":"InterfaceTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":752,"char":1}} 
│                 ├─ 
{"id":443,"kind":"Object","name":"InterpreterDirective","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":55,"char":1}} 
│                 ├─ 
{"id":444,"kind":"Object","name":"IntersectionTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":757,"char":1}} 
│                 ├─ 
{"id":445,"kind":"Object","name":"JSXAttribute","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":955,"char":1}} 
│                 ├─ 
{"id":446,"kind":"Object","name":"JSXClosingElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":960,"char":1}} 
│                 ├─ 
{"id":447,"kind":"Object","name":"JSXClosingFragment","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1020,"char":1}} 
│                 ├─ 
{"id":448,"kind":"Object","name":"JSXElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":964,"char":1}} 
│                 ├─ 
{"id":449,"kind":"Object","name":"JSXEmptyExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":971,"char":1}} 
│                 ├─ 
{"id":450,"kind":"Object","name":"JSXExpressionContainer","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":974,"char":1}} 
│                 ├─ 
{"id":451,"kind":"Object","name":"JSXFragment","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1011,"char":1}} 
│                 ├─ 
{"id":452,"kind":"Object","name":"JSXIdentifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":982,"char":1}} 
│                 ├─ 
{"id":453,"kind":"Object","name":"JSXMemberExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":986,"char":1}} 
│                 ├─ 
{"id":454,"kind":"Object","name":"JSXNamespacedName","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":991,"char":1}} 
│                 ├─ 
{"id":455,"kind":"Object","name":"JSXOpeningElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":996,"char":1}} 
│                 ├─ 
{"id":456,"kind":"Object","name":"JSXOpeningFragment","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1017,"char":1}} 
│                 ├─ 
{"id":457,"kind":"Object","name":"JSXSpreadAttribute","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1003,"char":1}} 
│                 ├─ 
{"id":458,"kind":"Object","name":"JSXSpreadChild","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":978,"char":1}} 
│                 ├─ 
{"id":459,"kind":"Object","name":"JSXText","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1007,"char":1}} 
│                 ├─ 
{"id":460,"kind":"Object","name":"LabeledStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":169,"char":1}} 
│                 ├─ 
{"id":461,"kind":"Object","name":"LogicalExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":209,"char":1}} 
│                 ├─ 
{"id":462,"kind":"Object","name":"MemberExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":215,"char":1}} 
│                 ├─ 
{"id":463,"kind":"Object","name":"MetaProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":455,"char":1}} 
│                 ├─ 
{"id":464,"kind":"Object","name":"MixedTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":761,"char":1}} 
│                 ├─ 
{"id":465,"kind":"Object","name":"ModuleExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1073,"char":1}} 
│                 ├─ 
{"id":466,"kind":"Object","name":"NewExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":222,"char":1}} 
│                 ├─ 
{"id":467,"kind":"Object","name":"Noop","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1023,"char":1}} 
│                 ├─ 
{"id":468,"kind":"Object","name":"NullLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":189,"char":1}} 
│                 ├─ 
{"id":469,"kind":"Object","name":"NullLiteralTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":639,"char":1}} 
│                 ├─ 
{"id":470,"kind":"Object","name":"NullableTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":767,"char":1}} 
│                 ├─ 
{"id":471,"kind":"Object","name":"NumberLiteral$1","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":185,"char":1}} 
│                 ├─ 
{"id":472,"kind":"Object","name":"NumberLiteralTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":771,"char":1}} 
│                 ├─ 
{"id":473,"kind":"Object","name":"NumberTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":775,"char":1}} 
│                 ├─ 
{"id":474,"kind":"Object","name":"NumericLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":178,"char":1}} 
│                 ├─ 
{"id":475,"kind":"Object","name":"ObjectExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":238,"char":1}} 
│                 ├─ 
{"id":476,"kind":"Object","name":"ObjectMethod","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":242,"char":1}} 
│                 ├─ 
{"id":477,"kind":"Object","name":"ObjectPattern","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":479,"char":1}} 
│                 ├─ 
{"id":478,"kind":"Object","name":"ObjectProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":255,"char":1}} 
│                 ├─ 
{"id":479,"kind":"Object","name":"ObjectTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":778,"char":1}} 
│                 ├─ 
{"id":480,"kind":"Object","name":"ObjectTypeCallProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":795,"char":1}} 
│                 ├─ 
{"id":481,"kind":"Object","name":"ObjectTypeIndexer","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":800,"char":1}} 
│                 ├─ 
{"id":482,"kind":"Object","name":"ObjectTypeInternalSlot","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":787,"char":1}} 
│                 ├─ 
{"id":483,"kind":"Object","name":"ObjectTypeProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":808,"char":1}} 
│                 ├─ 
{"id":484,"kind":"Object","name":"ObjectTypeSpreadProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":819,"char":1}} 
│                 ├─ 
{"id":485,"kind":"Object","name":"OpaqueType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":823,"char":1}} 
│                 ├─ 
{"id":486,"kind":"Object","name":"OptionalCallExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":545,"char":1}} 
│                 ├─ 
{"id":487,"kind":"Object","name":"OptionalIndexedAccessType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":949,"char":1}} 
│                 ├─ 
{"id":488,"kind":"Object","name":"OptionalMemberExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":538,"char":1}} 
│                 ├─ 
{"id":489,"kind":"Object","name":"ParenthesizedExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":288,"char":1}} 
│                 ├─ 
{"id":490,"kind":"Object","name":"PipelineBareFunction","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1084,"char":1}} 
│                 ├─ 
{"id":491,"kind":"Object","name":"PipelinePrimaryTopicReference","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1088,"char":1}} 
│                 ├─ 
{"id":492,"kind":"Object","name":"PipelineTopicExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1080,"char":1}} 
│                 ├─ 
{"id":493,"kind":"Object","name":"Placeholder","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1026,"char":1}} 
│                 ├─ 
{"id":494,"kind":"Object","name":"PrivateName","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":617,"char":1}} 
│                 ├─ 
{"id":495,"kind":"Object","name":"Program","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":230,"char":1}} 
│                 ├─ 
{"id":496,"kind":"Object","name":"QualifiedTypeIdentifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":830,"char":1}} 
│                 ├─ 
{"id":497,"kind":"Object","name":"RecordExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1061,"char":1}} 
│                 ├─ 
{"id":498,"kind":"Object","name":"RegExpLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":196,"char":1}} 
│                 ├─ 
{"id":499,"kind":"Object","name":"RegexLiteral$1","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":204,"char":1}} 
│                 ├─ 
{"id":500,"kind":"Object","name":"RestElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":263,"char":1}} 
│                 ├─ 
{"id":501,"kind":"Object","name":"RestProperty$1","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":273,"char":1}} 
│                 ├─ 
{"id":502,"kind":"Object","name":"ReturnStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":280,"char":1}} 
│                 ├─ 
{"id":503,"kind":"Object","name":"SequenceExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":284,"char":1}} 
│                 ├─ 
{"id":504,"kind":"Object","name":"SpreadElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":485,"char":1}} 
│                 ├─ 
{"id":505,"kind":"Object","name":"SpreadProperty$1","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":492,"char":1}} 
│                 ├─ 
{"id":506,"kind":"Object","name":"StaticBlock","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":621,"char":1}} 
│                 ├─ 
{"id":507,"kind":"Object","name":"StringLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":174,"char":1}} 
│                 ├─ 
{"id":508,"kind":"Object","name":"StringLiteralTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":835,"char":1}} 
│                 ├─ 
{"id":509,"kind":"Object","name":"StringTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":839,"char":1}} 
│                 ├─ 
{"id":510,"kind":"Object","name":"Super","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":496,"char":1}} 
│                 ├─ 
{"id":511,"kind":"Object","name":"SwitchCase","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":292,"char":1}} 
│                 ├─ 
{"id":512,"kind":"Object","name":"SwitchStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":297,"char":1}} 
│                 ├─ 
{"id":513,"kind":"Object","name":"SymbolTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":842,"char":1}} 
│                 ├─ 
{"id":514,"kind":"Object","name":"TSAnyKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1171,"char":1}} 
│                 ├─ 
{"id":515,"kind":"Object","name":"TSArrayType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1246,"char":1}} 
│                 ├─ 
{"id":516,"kind":"Object","name":"TSAsExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1342,"char":1}} 
│                 ├─ 
{"id":517,"kind":"Object","name":"TSBigIntKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1177,"char":1}} 
│                 ├─ 
{"id":518,"kind":"Object","name":"TSBooleanKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1174,"char":1}} 
│                 ├─ 
{"id":519,"kind":"Object","name":"TSCallSignatureDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1132,"char":1}} 
│                 ├─ 
{"id":520,"kind":"Object","name":"TSConditionalType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1276,"char":1}} 
│                 ├─ 
{"id":521,"kind":"Object","name":"TSConstructSignatureDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1138,"char":1}} 
│                 ├─ 
{"id":522,"kind":"Object","name":"TSConstructorType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1219,"char":1}} 
│                 ├─ 
{"id":523,"kind":"Object","name":"TSDeclareFunction","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1099,"char":1}} 
│                 ├─ 
{"id":524,"kind":"Object","name":"TSDeclareMethod","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1109,"char":1}} 
│                 ├─ 
{"id":525,"kind":"Object","name":"TSEnumDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1352,"char":1}} 
│                 ├─ 
{"id":526,"kind":"Object","name":"TSEnumMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1360,"char":1}} 
│                 ├─ 
{"id":527,"kind":"Object","name":"TSExportAssignment","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1397,"char":1}} 
│                 ├─ 
{"id":528,"kind":"Object","name":"TSExpressionWithTypeArguments","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1313,"char":1}} 
│                 ├─ 
{"id":529,"kind":"Object","name":"TSExternalModuleReference","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1389,"char":1}} 
│                 ├─ 
{"id":530,"kind":"Object","name":"TSFunctionType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1213,"char":1}} 
│                 ├─ 
{"id":531,"kind":"Object","name":"TSImportEqualsDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1382,"char":1}} 
│                 ├─ 
{"id":532,"kind":"Object","name":"TSImportType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1376,"char":1}} 
│                 ├─ 
{"id":533,"kind":"Object","name":"TSIndexSignature","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1164,"char":1}} 
│                 ├─ 
{"id":534,"kind":"Object","name":"TSIndexedAccessType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1296,"char":1}} 
│                 ├─ 
{"id":535,"kind":"Object","name":"TSInferType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1283,"char":1}} 
│                 ├─ 
{"id":536,"kind":"Object","name":"TSInstantiationExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1337,"char":1}} 
│                 ├─ 
{"id":537,"kind":"Object","name":"TSInterfaceBody","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1326,"char":1}} 
│                 ├─ 
{"id":538,"kind":"Object","name":"TSInterfaceDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1318,"char":1}} 
│                 ├─ 
{"id":539,"kind":"Object","name":"TSIntersectionType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1272,"char":1}} 
│                 ├─ 
{"id":540,"kind":"Object","name":"TSIntrinsicKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1180,"char":1}} 
│                 ├─ 
{"id":541,"kind":"Object","name":"TSLiteralType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1309,"char":1}} 
│                 ├─ 
{"id":542,"kind":"Object","name":"TSMappedType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1301,"char":1}} 
│                 ├─ 
{"id":543,"kind":"Object","name":"TSMethodSignature","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1154,"char":1}} 
│                 ├─ 
{"id":544,"kind":"Object","name":"TSModuleBlock","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1372,"char":1}} 
│                 ├─ 
{"id":545,"kind":"Object","name":"TSModuleDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1365,"char":1}} 
│                 ├─ 
{"id":546,"kind":"Object","name":"TSNamedTupleMember","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1262,"char":1}} 
│                 ├─ 
{"id":547,"kind":"Object","name":"TSNamespaceExportDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1401,"char":1}} 
│                 ├─ 
{"id":548,"kind":"Object","name":"TSNeverKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1183,"char":1}} 
│                 ├─ 
{"id":549,"kind":"Object","name":"TSNonNullExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1393,"char":1}} 
│                 ├─ 
{"id":550,"kind":"Object","name":"TSNullKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1186,"char":1}} 
│                 ├─ 
{"id":551,"kind":"Object","name":"TSNumberKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1189,"char":1}} 
│                 ├─ 
{"id":552,"kind":"Object","name":"TSObjectKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1192,"char":1}} 
│                 ├─ 
{"id":553,"kind":"Object","name":"TSOptionalType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1254,"char":1}} 
│                 ├─ 
{"id":554,"kind":"Object","name":"TSParameterProperty","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1091,"char":1}} 
│                 ├─ 
{"id":555,"kind":"Object","name":"TSParenthesizedType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1287,"char":1}} 
│                 ├─ 
{"id":556,"kind":"Object","name":"TSPropertySignature","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1144,"char":1}} 
│                 ├─ 
{"id":557,"kind":"Object","name":"TSQualifiedName","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1127,"char":1}} 
│                 ├─ 
{"id":558,"kind":"Object","name":"TSRestType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1258,"char":1}} 
│                 ├─ 
{"id":559,"kind":"Object","name":"TSStringKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1195,"char":1}} 
│                 ├─ 
{"id":560,"kind":"Object","name":"TSSymbolKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1198,"char":1}} 
│                 ├─ 
{"id":561,"kind":"Object","name":"TSThisType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1210,"char":1}} 
│                 ├─ 
{"id":562,"kind":"Object","name":"TSTupleType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1250,"char":1}} 
│                 ├─ 
{"id":563,"kind":"Object","name":"TSTypeAliasDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1330,"char":1}} 
│                 ├─ 
{"id":564,"kind":"Object","name":"TSTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1405,"char":1}} 
│                 ├─ 
{"id":565,"kind":"Object","name":"TSTypeAssertion","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1347,"char":1}} 
│                 ├─ 
{"id":566,"kind":"Object","name":"TSTypeLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1242,"char":1}} 
│                 ├─ 
{"id":567,"kind":"Object","name":"TSTypeOperator","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1291,"char":1}} 
│                 ├─ 
{"id":568,"kind":"Object","name":"TSTypeParameter","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1417,"char":1}} 
│                 ├─ 
{"id":569,"kind":"Object","name":"TSTypeParameterDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1413,"char":1}} 
│                 ├─ 
{"id":570,"kind":"Object","name":"TSTypeParameterInstantiation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1409,"char":1}} 
│                 ├─ 
{"id":571,"kind":"Object","name":"TSTypePredicate","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1231,"char":1}} 
│                 ├─ 
{"id":572,"kind":"Object","name":"TSTypeQuery","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1237,"char":1}} 
│                 ├─ 
{"id":573,"kind":"Object","name":"TSTypeReference","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1226,"char":1}} 
│                 ├─ 
{"id":574,"kind":"Object","name":"TSUndefinedKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1201,"char":1}} 
│                 ├─ 
{"id":575,"kind":"Object","name":"TSUnionType","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1268,"char":1}} 
│                 ├─ 
{"id":576,"kind":"Object","name":"TSUnknownKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1204,"char":1}} 
│                 ├─ 
{"id":577,"kind":"Object","name":"TSVoidKeyword","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1207,"char":1}} 
│                 ├─ 
{"id":578,"kind":"Object","name":"TaggedTemplateExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":499,"char":1}} 
│                 ├─ 
{"id":579,"kind":"Object","name":"TemplateElement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":505,"char":1}} 
│                 ├─ 
{"id":580,"kind":"Object","name":"TemplateLiteral","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":513,"char":1}} 
│                 ├─ 
{"id":581,"kind":"Object","name":"ThisExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":302,"char":1}} 
│                 ├─ 
{"id":582,"kind":"Object","name":"ThisTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":845,"char":1}} 
│                 ├─ 
{"id":583,"kind":"Object","name":"ThrowStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":305,"char":1}} 
│                 ├─ 
{"id":584,"kind":"Object","name":"TopicReference","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1077,"char":1}} 
│                 ├─ 
{"id":585,"kind":"Object","name":"TryStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":309,"char":1}} 
│                 ├─ 
{"id":586,"kind":"Object","name":"TupleExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1065,"char":1}} 
│                 ├─ 
{"id":587,"kind":"Object","name":"TupleTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":848,"char":1}} 
│                 ├─ 
{"id":588,"kind":"Object","name":"TypeAlias","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":856,"char":1}} 
│                 ├─ 
{"id":589,"kind":"Object","name":"TypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":862,"char":1}} 
│                 ├─ 
{"id":590,"kind":"Object","name":"TypeCastExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":866,"char":1}} 
│                 ├─ 
{"id":591,"kind":"Object","name":"TypeParameter","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":871,"char":1}} 
│                 ├─ 
{"id":592,"kind":"Object","name":"TypeParameterDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":878,"char":1}} 
│                 ├─ 
{"id":593,"kind":"Object","name":"TypeParameterInstantiation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":882,"char":1}} 
│                 ├─ 
{"id":594,"kind":"Object","name":"TypeofTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":852,"char":1}} 
│                 ├─ 
{"id":595,"kind":"Object","name":"UnaryExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":315,"char":1}} 
│                 ├─ 
{"id":596,"kind":"Object","name":"UnionTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":886,"char":1}} 
│                 ├─ 
{"id":597,"kind":"Object","name":"UpdateExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":321,"char":1}} 
│                 ├─ 
{"id":598,"kind":"Object","name":"V8IntrinsicIdentifier","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":1031,"char":1}} 
│                 ├─ 
{"id":599,"kind":"Object","name":"VariableDeclaration","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":327,"char":1}} 
│                 ├─ 
{"id":600,"kind":"Object","name":"VariableDeclarator","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":333,"char":1}} 
│                 ├─ 
{"id":601,"kind":"Object","name":"Variance","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":890,"char":1}} 
│                 ├─ 
{"id":602,"kind":"Object","name":"VoidTypeAnnotation","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":894,"char":1}} 
│                 ├─ 
{"id":603,"kind":"Object","name":"WhileStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":339,"char":1}} 
│                 ├─ 
{"id":604,"kind":"Object","name":"WithStatement","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":344,"char":1}} 
│                 └─ 
{"id":605,"kind":"Object","name":"YieldExpression","location":{"path":"[35m/users/laurentan/code/react-forget/forget/node_modules/[36m@babel/types[39m[35m/lib/index.d.ts[39m","line":518,"char":1}} 
└─ Check file 
[35m/users/laurentan/code/react-forget/forget/src/[36mdiagnostic.ts[39m[35m[39m 
(809ms)    └─ Check expression from (line 222, char 14) to (line 228, char 8) 
(698ms)       └─ Check expression from (line 227, char 21) to (line 227, char 
74) (697ms)          └─ Check expression from (line 227, char 29) to (line 227, 
char 61) (697ms)             └─ Check expression from (line 227, char 39) to 
(line 227, char 60) (697ms) 

No duplicate packages found Done in 16.27s. ```
2022-10-14 17:36:19 -04:00
Lauren Tan e939cacf97 Don't console.error in dev
Previously the PassManager would console.error if an unexpected error was 
thrown, to help with debugging jest. However because we now capture all 
invariants in compiler passes as bailouts, these are already captured in fixture 
tests. 

Additionally, we also already console.error if we find an unexpected bailout in 
a fixture test. So this is purely redundant and removing reduces some noise when 
running tests.
2022-10-14 12:10:58 -04:00
Lauren Tan 101ee3a440 Allow capitalized function identifiers to be allowlisted
The current allowlist for capitalized function identifiers only allows stdlib JS 
modules. This PR introduces a new compiler option to allow passing in a set of 
allowed capitalized user function identifiers. It's a hack (in the absence of a 
type system) to let us check that capitalized function calls are only possible 
for identifiers that aren't bound to a React component. 

I considered adding a mechanism in fixtures to configure compiler options 
per-fixture, but opted to keep it simple for now and special case a 
`ReactForgetSecretInternals` identifier as one allowed user function in 
transform tests.
2022-10-14 12:10:55 -04:00
Lauren Tan 58100e3d60 Use CompilerError invariant
The CompilerError module's `invariant` is wired up to our bailout system so in 
compiler passes should be preferred to the raw `invariant` module. 

We should probably add an internal eslint rule to suggest using CompilerError if 
the file is in one of the compiler pass directories.
2022-10-14 12:10:53 -04:00
Jan Kassens b1006e12cd Invariant for use before definition of reactive values (#662) 2022-10-13 16:17:39 -04:00
Joseph Savona 0000ab6ca4 [new-arch] HIR cleanup per discussion
* Renames `Capability` to `Effect` and clarifies the kinds as Freeze, Read, and 
Mutate. The real intent of what we're inferring/representing is "what effect 
does this reference to the value have on its value". Ie freeze freezes the 
value, mutate mutates it. 

* Consolidates Capability and EffectKind into Effect 

* Renames some properties on Place for clarity 

* Adds `value: ValueKind` to Place, which indicates the (merged) kind of the 
value at that place at that point in the program. 

* Changes HIR printing to show the effect and the value kind 

* Simplifies some inference logic
2022-10-13 11:23:14 -07:00
mofeiZ 73059d9a4f [Playground][Nit] Add delete + overtype for autoclosing brackets
Fix for papercut: playground should now be smart about autoclosing brackets. 

Before: 


https://user-images.githubusercontent.com/34200447/195653419-0eb529e4-0aed-4894-9db6-bfe1554aaded.mov 

Now: 


https://user-images.githubusercontent.com/34200447/195653738-07abed36-d9e8-4842-bac5-9e84b72c0704.mov
2022-10-13 13:16:56 -04:00
Joseph Savona 144e856264 Cleanup reverse postordering
Splits out the reverse postorder logic from `shrink` into a separate method.
2022-10-13 07:58:06 -07:00
Sathya Gunasekaran b01fbfa7fb Change function parameters to type Place
So that we can infer a Capability of Freeze for components
2022-10-13 11:29:58 +01:00
Joseph Savona 5149ce0fbb [new-arch] Store HIR blocks in reverse postorder
* Changes HIR to store blocks in reverse postorder, which allows forward data 
flow analysis to iterate the blocks in order and (in the absence of loops) see 
all predecessors before visiting a successor. 

* Updates reference kind inference to exploit this ordering 

Note that the approach of modifying the ordering in `mapTerminalSuccessors()` 
feels gross, i'd like to split this up a bit.
2022-10-12 16:11:15 -07:00
Joseph Savona 3d4130140a [new-arch] Scaffolding and fixtures for mutability lifetime inference
Scaffolds out mutable lifetime inference and the potential two-pass approach, 
with motivating examples. Also adds some fixtures that collectively demonstrate 
a bunch of cases of aliasing: 

* direct assignment `a = b` 

* property assignment `a.b = b` 

* array literals `a = [b]` 

* object literals `a = {b}` 

* mutable arguments to the same call `foo(mut a, mut b)` 

* return values aliasing arguments `a = foo(mut b)` 

* aliasing that occurs only after multiple loop iterations 

All of these fixtures use an empty `if (varName) {}` as a way to check that an 
otherwise readonly usage of a variable is correctly inferred as mutable.
2022-10-12 10:54:09 -07:00
Joseph Savona 94adcf91b1 [new-arch] Cleanup unused analysis (#651) 2022-10-11 12:00:45 -07:00
Joseph Savona beb6e1431c [new-arch] Improve reference-kind analysis
This implements an alternative approach to reference kind inference in the new 
architecture based on feedback. Here, we track an environment that maps 
top-level identifiers (IdentifierId) to the "kind" of value stored: immutable, 
mutable, frozen, or maybe-frozen. We then do a forward data flow analysis 
updating this environment based on the semantics of each instruction combined 
with the types of values present. For example a reference of a value in a 
"mutable" position is inferred as readonly if the value is known to be frozen or 
immutable. Similarly, a usage of a reference in a "freeze" position is inferred 
as a freeze if the value is not yet definitively frozen, and inferred as 
readonly if the value is already frozen. 

When multiple control paths converge we merge the previous and new incoming 
environments, and only reprocess the block if the environment changed relative 
to the previous value. This has some noticeable benefits over the previous 
version: 

* We now infer precisely where `makeReadOnly()` calls need to be inserted, aka 
points where a value needs to be frozen may not yet be frozen. 

* We track immutable values and can infer their usage as readonly rather than 
mutable. 

* The system handles aliasing by representing values as distinct from variables, 
so that we can handle situations such as: 

```javascript 

const a = [];  // env: {a: value0; value0: mutable} 

const b = a;   // env: {a: value0, b: value0; value0: mutable} 

freeze(a);     // env: {a: value0, b: value0; value0: frozen} 

mayMutate(b);  // ordinarily inferred as a mutable reference, but we know its 
readonly 

```
2022-10-11 11:32:49 -07:00
Jan Kassens 7f17dd84d1 Import useMemoCache from unstable name
I didn't make this an option as it's unclear we'll really need this. We can 
always add an option later, I think. 

This is the name that's available on facebook.com at the moment.
2022-10-11 13:16:01 -04:00
Jan Kassens e575e22925 Add hash of Babel plugin to Jest transform
Jest caches based on the hash of the babel config. This caused us to not break 
that cache when the we made changes to the plugin. 

Fixes #643
2022-10-06 16:59:12 -04:00