@samitouri / QOS-React-2 / commits / 9207607d37

Delete old architecture

Thanks old architecture! We learned a lot about what does and doesn't work via this POC, but it's time to move forward w the ~~new~~ current architecture.

Joe Savona committed Dec 19, 2022 at 10:04 UTC 9207607d37a50ad85e7f16879fe636a40c71b649
80 files changed -15759
compiler/forget/packages/babel-plugin-react-forget-legacy/package.json deleted
-73
@@ -1,73 +0,0 @@
1 -{
2 - "name": "babel-plugin-react-forget-legacy",
3 - "version": "0.0.1",
4 - "description": "Babel plugin for React Forget.",
5 - "main": "dist/index.js",
6 - "license": "MIT",
7 - "files": [
8 - "src"
9 - ],
10 - "scripts": {
11 - "build": "tsc && scripts/hash-dist.sh",
12 - "bundle:meta": "scripts/bundle-meta.sh",
13 - "dev": "concurrently --kill-others \"tsc --watch\" \"yarn:playground\"",
14 - "playground": "cd packages/playground && yarn && yarn dev",
15 - "test": "yarn build && jest",
16 - "ts:analyze-trace": "scripts/ts-analyze-trace.sh",
17 - "test262": "yarn run --silent test262-harness --preprocessor=scripts/test262-preprocessor.js",
18 - "test262:all": "yarn run --silent test262 'test262/test/**/*.js'",
19 - "test262:ci": "scripts/test262.sh",
20 - "prettier": "node ./scripts/prettier.js write-changed",
21 - "prettier:all": "node ./scripts/prettier.js write",
22 - "prettier:ci": "prettier --check ."
23 - },
24 - "repository": {
25 - "type": "git",
26 - "url": "git+https://github.com/facebook/react-forget.git"
27 - },
28 - "dependencies": {
29 - "@babel/generator": "7.2.0",
30 - "@babel/plugin-syntax-jsx": "^7.18.6",
31 - "@babel/types": "^7.19.0",
32 - "invariant": "^2.2.4",
33 - "prettier": "2.7.1",
34 - "pretty-format": "^24"
35 - },
36 - "devDependencies": {
37 - "@babel/core": "^7.19.1",
38 - "@babel/parser": "^7.19.1",
39 - "@babel/plugin-syntax-typescript": "^7.18.6",
40 - "@babel/plugin-transform-block-scoping": "^7.18.9",
41 - "@babel/plugin-transform-modules-commonjs": "^7.18.6",
42 - "@babel/preset-react": "^7.18.6",
43 - "@babel/preset-typescript": "^7.18.6",
44 - "@babel/traverse": "^7.19.1",
45 - "@hpcc-js/wasm": "^1.15.0",
46 - "@testing-library/react": "^13.4.0",
47 - "@tsconfig/node16-strictest": "^1.0.3",
48 - "@types/eslint": "^8.4.6",
49 - "@types/invariant": "^2.2.35",
50 - "@types/jest": "^29.0.3",
51 - "@types/node": "^18.7.18",
52 - "babel-jest": "^29.0.3",
53 - "chalk": "^3.0.0",
54 - "concurrently": "^7.4.0",
55 - "eslint": "^8.25.0",
56 - "glob": "^7.1.6",
57 - "hermes-eslint": "^0.9.0",
58 - "jest": "^29.0.3",
59 - "jest-environment-jsdom": "^29.0.3",
60 - "react": "^18.2.0",
61 - "react-dom": "^18.2.0",
62 - "test262-harness": "^8.0.0",
63 - "ts-jest": "^29.0.1",
64 - "ts-node": "^10.9.1",
65 - "typescript": "^4.8.3"
66 - },
67 - "resolutions": {
68 - "./**/@babel/parser": "7.7.4",
69 - "./**/@babel/types": "7.7.4",
70 - "@babel/core": "7.2.0",
71 - "@babel/traverse": "7.1.6"
72 - }
73 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/scripts/hash-dist.sh deleted
-6
@@ -1,6 +0,0 @@
1 -#!/usr/bin/env bash
2 -set -eo pipefail
3 -
4 -# Hashes JS files in the dist directory to create a cache-breaker
5 -
6 -find dist -name '*.js' | sort | xargs shasum | shasum | awk '{ print $1 }' > dist/HASH
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BabelPlugin.ts deleted
-42
@@ -1,42 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/// <reference path="./plugin-syntax-jsx.d.ts" />
9 -
10 -import jsx from "@babel/plugin-syntax-jsx";
11 -import type { PluginObj } from "@babel/core";
12 -import type * as BabelCore from "@babel/core";
13 -import { createCompilerDriver } from "./CompilerDriver";
14 -import { CompilerOptions, parseCompilerOptions } from "./CompilerOptions";
15 -
16 -/**
17 - * The React Forget Babel Plugin
18 - * @param {*} babel
19 - * @returns
20 - */
21 -export default function (babel: typeof BabelCore): PluginObj {
22 - return {
23 - name: "react-forget",
24 - inherits: jsx,
25 - visitor: {
26 - Program: {
27 - enter(program, pass) {
28 - let compilerOptions: CompilerOptions;
29 - try {
30 - compilerOptions = parseCompilerOptions(pass.opts);
31 - } catch (err) {
32 - throw new Error(
33 - `PluginOptions is required to be valid CompilerOptions: ${err}.`
34 - );
35 - }
36 - let compiler = createCompilerDriver(compilerOptions, program);
37 - compiler.compile();
38 - },
39 - },
40 - },
41 - };
42 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/DumpLIR.ts deleted
-37
@@ -1,37 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import { OutputKind } from "../CompilerOutputs";
12 -import * as IR from "../IR";
13 -import prettyPrint from "../LIR/PrettyPrinter";
14 -import { PassKind, PassName } from "../Pass";
15 -
16 -/**
17 - * Dump LIR
18 - */
19 -export default {
20 - name: PassName.DumpLIR,
21 - kind: PassKind.IRFunc as const,
22 - run,
23 -};
24 -
25 -export function run(
26 - irFunc: IR.Func,
27 - func: NodePath<t.Function>,
28 - context: CompilerContext
29 -) {
30 - if (context.opts.outputKinds.includes(OutputKind.LIR)) {
31 - const output = [...context.lirProg.funcs.values()]
32 - .map((lirFunc) => prettyPrint(lirFunc))
33 - .join("\n\n");
34 -
35 - context.outputs[OutputKind.LIR] = output;
36 - }
37 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/JS.ts deleted
-588
@@ -1,588 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * JavaScript Generator.
10 - */
11 -
12 -import { Node, NodePath, Scope } from "@babel/traverse";
13 -import * as t from "@babel/types";
14 -import { CompilerContext } from "../CompilerContext";
15 -import { invariant } from "../CompilerError";
16 -import * as IR from "../IR";
17 -import * as LIR from "../LIR";
18 -
19 -export type Code = Node[];
20 -
21 -/**
22 - * "DSL" for writing memoCache manipulation.
23 - */
24 -class MemoCache {
25 - static #RETURN_VALUE = 0;
26 - static #RETURN_INDEX = 1;
27 -
28 - entries: Map<LIR.MemoCache.EntryKey, LIR.MemoCache.Entry>;
29 - id: t.Identifier;
30 - hasRetIdx: boolean;
31 - #guardReads: boolean;
32 -
33 - constructor(
34 - lirMemoCache: LIR.MemoCache.MemoCache,
35 - context: CompilerContext,
36 - scope: Scope
37 - ) {
38 - this.#guardReads = context.opts.flags.guardReads;
39 - lirMemoCache.finializeIndices();
40 - this.entries = lirMemoCache.entries;
41 - if (scope.hasBinding("$")) {
42 - this.id = scope.generateUidIdentifier("$");
43 - } else {
44 - this.id = t.identifier("$");
45 - }
46 -
47 - invariant(
48 - lirMemoCache.retValPos != null,
49 - "retVal should always be allocated!"
50 - );
51 - this.hasRetIdx = lirMemoCache.retIdxPos != null;
52 - this.#guardReads = context.opts.flags.guardReads;
53 - }
54 -
55 - /**
56 - * `$[RETURN_INDEX] === index`
57 - */
58 - isMemoizedReturnIndex(index: number): t.Expression {
59 - return t.binaryExpression(
60 - "===",
61 - this.#cacheMember(MemoCache.#RETURN_INDEX),
62 - t.numericLiteral(index)
63 - );
64 - }
65 -
66 - /**
67 - * `$[RETURN_INDEX] = index`
68 - */
69 - writeReturnIndex(index: number): t.Expression {
70 - invariant(this.hasRetIdx, "Invalid call of writeReturnIndex");
71 - return this.#writeIndex(MemoCache.#RETURN_INDEX, t.numericLiteral(index));
72 - }
73 -
74 - /**
75 - * `$[RETURN_VALUE]`
76 - */
77 - readReturnValue(): t.Expression {
78 - return this.#readIndex(MemoCache.#RETURN_VALUE);
79 - }
80 -
81 - /**
82 - * `$[RETURN_VALUE] = value`
83 - */
84 - writeReturnValue(value: t.Expression): t.Expression {
85 - return this.#writeIndex(MemoCache.#RETURN_VALUE, value);
86 - }
87 -
88 - /**
89 - * `$[entry]`
90 - */
91 - read(entry: LIR.MemoCache.Entry): t.Expression {
92 - return this.#readIndex(entry.index);
93 - }
94 -
95 - /**
96 - * `$[entry] = value`
97 - */
98 - write(entry: LIR.MemoCache.Entry, value: t.Expression): t.Expression {
99 - return this.#writeIndex(entry.index, value);
100 - }
101 -
102 - /**
103 - * `$[entry] == $empty`
104 - */
105 - isEmpty(entry: LIR.MemoCache.Entry): t.BinaryExpression {
106 - return t.binaryExpression(
107 - "===",
108 - this.#cacheMember(entry.index),
109 - t.identifier("$empty")
110 - );
111 - }
112 -
113 - /**
114 - * `$[entry] !== value`
115 - */
116 - isChanged(
117 - entry: LIR.MemoCache.Entry,
118 - value: t.Expression
119 - ): t.BinaryExpression {
120 - return t.binaryExpression("!==", this.#cacheMember(entry.index), value);
121 - }
122 -
123 - #readIndex(index: number): t.Expression {
124 - if (this.#guardReads) {
125 - return t.callExpression(t.identifier("$read"), [
126 - this.id,
127 - t.numericLiteral(index),
128 - ]);
129 - } else {
130 - return this.#cacheMember(index);
131 - }
132 - }
133 -
134 - #writeIndex(index: number, value: t.Expression): t.Expression {
135 - return t.assignmentExpression("=", this.#cacheMember(index), value);
136 - }
137 -
138 - #cacheMember(index: number): t.MemberExpression {
139 - return t.memberExpression(this.id, t.numericLiteral(index), true);
140 - }
141 -}
142 -/**
143 - * JS Func
144 - */
145 -export class Func {
146 - lir: LIR.Func;
147 -
148 - context: CompilerContext;
149 -
150 - /**
151 - * Code are owned by JS Func and are emitted by side effect for better perf.
152 - */
153 - code: Code;
154 -
155 - memoCache: MemoCache;
156 - changeVarIds: Map<string, t.Identifier>;
157 -
158 - constructor(lirFunc: LIR.Func, context: CompilerContext) {
159 - this.code = [];
160 - this.lir = lirFunc;
161 - this.context = context;
162 - this.memoCache = new MemoCache(
163 - this.lir.memoCache,
164 - this.context,
165 - this.lir.ir.ast.scope
166 - );
167 - this.changeVarIds = new Map();
168 - }
169 -
170 - emit(node: Node) {
171 - this.code.push(node);
172 - }
173 -
174 - /**
175 - * Helpers that generate the `useMemoCache` call
176 - * @returns
177 - * let $ = useMemoCache(size)
178 - */
179 - useMemoCacheCall(size: number): t.Statement {
180 - return t.variableDeclaration("let", [
181 - t.variableDeclarator(
182 - /*id*/ this.memoCache.id,
183 - /*init*/ t.callExpression(
184 - /* callee*/ t.identifier("useMemoCache"),
185 - /*arguments*/ [t.numericLiteral(size)]
186 - )
187 - ),
188 - ]);
189 - }
190 -
191 - // Generate calls to utility function that freezes immut objects
192 - emitMakeReadOnly(val: IR.BindingVal) {
193 - if (this.context.opts.flags.addFreeze === true) {
194 - this.code.push(
195 - t.expressionStatement(
196 - t.callExpression(t.identifier("$makeReadOnly"), [
197 - val.binding.identifier,
198 - ])
199 - )
200 - );
201 - }
202 - }
203 -
204 - /**
205 - * Generate code materializing reactions
206 - * @returns
207 - * let c_input = $[i] !== input; // compute the "change/reaction".
208 - * $[i] = input; // replace caches.
209 - *
210 - * Or, with `.flags.condCache`:
211 - * if (c_input) $[i] = input;
212 - */
213 - emitReactiveVal(val: IR.ReactiveVal) {
214 - const valIdent = val.binding.identifier;
215 - const changeVar = this.getChangeVar(valIdent.name);
216 -
217 - const entry = this.memoCache.entries.get(val);
218 - invariant(entry, "ReactiveVals are always cached.");
219 -
220 - // let c_var = $[i] !== var;
221 - this.code.push(
222 - t.variableDeclaration("let", [
223 - t.variableDeclarator(
224 - /*id*/ changeVar,
225 - this.memoCache.isChanged(entry, valIdent)
226 - ),
227 - ])
228 - );
229 -
230 - // $[i] = var
231 - const cacheReplacement = t.expressionStatement(
232 - this.memoCache.write(entry, valIdent)
233 - );
234 -
235 - if (this.context.opts.flags.condCache) {
236 - // if (c_var) $[i] = var;
237 - this.code.push(
238 - t.ifStatement(/*test*/ changeVar, /*consequent*/ cacheReplacement)
239 - );
240 - } else {
241 - this.code.push(cacheReplacement);
242 - }
243 - }
244 -
245 - /**
246 - * @return
247 - * let output1, output2;
248 - */
249 - emitReactiveBlockOutputDecls(block: LIR.ReactiveBlock) {
250 - const vars: t.VariableDeclarator[] = [];
251 - const lets: t.VariableDeclarator[] = [];
252 -
253 - for (const decl of block.outputDecls) {
254 - if (decl.binding.kind === "var") {
255 - vars.push(t.variableDeclarator(decl.binding.identifier));
256 - } else {
257 - lets.push(t.variableDeclarator(decl.binding.identifier));
258 - }
259 - }
260 -
261 - if (vars.length > 0) {
262 - this.code.push(
263 - t.variableDeclaration(/*kind*/ "var", /*declarators*/ vars)
264 - );
265 - }
266 -
267 - if (lets.length > 0) {
268 - this.code.push(
269 - t.variableDeclaration(/*kind*/ "let", /*declarators*/ lets)
270 - );
271 - }
272 - }
273 -
274 - /**
275 - * Generate code materializing {@link ReactiveBlock}
276 - * @return
277 - * let output1, output2;
278 - * if ( Reactions(Inputs) ) {
279 - * ...body
280 - * $[i1] = output1;
281 - * $[i2] = output2;
282 - * } else {
283 - * output1 = $[i1]
284 - * output2 = $[i2]
285 - * }
286 - *
287 - * OR (when there is only outputs w/o any inputs)
288 - * @return
289 - * let output1, output2;
290 - * if ( $.isEmpty(i1) ) {
291 - * ...body
292 - * $[i1] = output1;
293 - * $[i2] = output2;
294 - * } else {
295 - * output1 = $[i1]
296 - * output2 = $[i2]
297 - * }
298 - */
299 - emitReactiveBlock(block: LIR.ReactiveBlock) {
300 - const hasNoInputs = block.inputs.size === 0;
301 - const hasNoOutputs = block.outputs.size === 0;
302 -
303 - let cond: t.Expression;
304 - if (hasNoInputs) {
305 - if (hasNoOutputs) {
306 - // If there is neither inputs nor outputs then it likely doesn't contribute
307 - // to rendering at all. The safest thing may just be keeping them as-is.
308 - for (const instr of block.body) {
309 - if (instr.ir.returnStmts.size > 0) {
310 - for (const [ret, retIdx] of instr.ir.returnStmts) {
311 - ret.replaceWith(this.genRewrittenReturn(ret, retIdx));
312 - }
313 - this.code.push(instr.ast.node);
314 - } else {
315 - this.code.push(instr.ast.node);
316 - }
317 - }
318 - return;
319 - }
320 -
321 - const firstOutput = block.outputs.values().next().value;
322 - const firstOutputEntry = this.memoCache.entries.get(firstOutput);
323 - invariant(firstOutputEntry, "ReactiveBlock outputs are always cached.");
324 - cond = this.memoCache.isEmpty(firstOutputEntry);
325 - } else {
326 - cond = this.genReactions(block.inputs);
327 - }
328 -
329 - // let output1, output2, ...
330 - this.emitReactiveBlockOutputDecls(block);
331 -
332 - let evalBody: t.Statement[] = [];
333 - let skipBody: t.Statement[] = [];
334 -
335 - // ...body
336 - for (const instr of block.body) {
337 - instr.ir.jsxTreeRoots.forEach((root) => this.rewriteExprInJSXTree(root));
338 -
339 - if (instr.ir.isDecl) {
340 - for (const rewrittenInstr of this.genDeclWithOutputsRewritten(instr)) {
341 - evalBody.push(rewrittenInstr);
342 - }
343 - } else {
344 - if (instr.ir.returnStmts.size > 0) {
345 - for (const [ret, retIdx] of instr.ir.returnStmts) {
346 - ret.replaceWith(this.genRewrittenReturn(ret, retIdx));
347 - skipBody.push(this.genReturnReplay(retIdx));
348 - }
349 - evalBody.push(instr.ast.node);
350 - } else {
351 - evalBody.push(instr.ast.node);
352 - }
353 - }
354 - }
355 - for (const output of block.outputs) {
356 - const entry = this.memoCache.entries.get(output);
357 - invariant(entry, "ReactiveBlock outputs are always cached.");
358 -
359 - // Since the binding is re-assigned in the generated code
360 - if (output.binding.kind == "const") {
361 - output.binding.kind = "let";
362 - }
363 -
364 - // $[i] = output
365 - evalBody.push(
366 - t.expressionStatement(
367 - this.memoCache.write(entry, output.binding.identifier)
368 - )
369 - );
370 -
371 - // output = $[i]
372 - skipBody.push(
373 - t.expressionStatement(
374 - t.assignmentExpression(
375 - "=",
376 - output.binding.identifier,
377 - this.memoCache.read(entry)
378 - )
379 - )
380 - );
381 - }
382 -
383 - if (this.context.opts.flags.guardHooks) {
384 - const startLazyCall = t.expressionStatement(
385 - t.callExpression(t.identifier("$startLazy"), [])
386 - );
387 - const endLazyCall = t.expressionStatement(
388 - t.callExpression(t.identifier("$endLazy"), [])
389 - );
390 - evalBody = [
391 - t.tryStatement(
392 - t.blockStatement([startLazyCall, ...evalBody]),
393 - null,
394 - t.blockStatement([endLazyCall])
395 - ),
396 - ];
397 - }
398 -
399 - // if ( Reactive(Inputs) ) { ...evalBody } else { ...memoBody }
400 - this.code.push(
401 - t.ifStatement(
402 - /*test*/ cond,
403 - /*consequent*/ t.blockStatement(evalBody),
404 - /*alternate*/ skipBody.length > 0
405 - ? t.blockStatement(skipBody)
406 - : undefined
407 - )
408 - );
409 - }
410 -
411 - /**
412 - * TODO: Currently, all decls are considered as outputs. We'll need a better check.
413 - */
414 - genDeclWithOutputsRewritten(instr: LIR.Instr): t.Statement[] {
415 - invariant(instr.ir.isDecl, "Should only be called on Decl.");
416 -
417 - const res: t.Statement[] = [];
418 -
419 - // Rewrite ClassDeclaration to assignment to ClassExpression.
420 - if (instr.ast.isClassDeclaration()) {
421 - const cd = instr.ast.node;
422 - res.push(
423 - t.expressionStatement(
424 - t.assignmentExpression(
425 - "=",
426 - cd.id,
427 - t.classExpression(cd.id, cd.superClass, cd.body, cd.decorators)
428 - )
429 - )
430 - );
431 - }
432 -
433 - // Rewrite FunctionDeclaration to assignment to FunctionExpression.
434 - if (instr.ast.isFunctionDeclaration()) {
435 - const fd = instr.ast.node;
436 - invariant(fd.id, "Can you have a FD without a name??");
437 -
438 - res.push(
439 - t.expressionStatement(
440 - t.assignmentExpression(
441 - "=",
442 - fd.id,
443 - t.functionExpression(
444 - fd.id,
445 - fd.params,
446 - fd.body,
447 - fd.generator,
448 - fd.async
449 - )
450 - )
451 - )
452 - );
453 - }
454 -
455 - // Rewrite each VariableDeclarators in VariableDeclaration to assignments.
456 - if (instr.ast.isVariableDeclaration()) {
457 - // A destructuring declarators can produce multiple bindings, so we need
458 - // to narrow to a set first.
459 - const varDeclaratorNodes = new Set<t.VariableDeclarator>();
460 -
461 - for (const def of instr.ir.decls) {
462 - const vd = def.binding.path;
463 - invariant(vd.isVariableDeclarator(), "");
464 - varDeclaratorNodes.add(vd.node);
465 - }
466 -
467 - for (const vd of varDeclaratorNodes) {
468 - if (vd.init) {
469 - res.push(
470 - t.expressionStatement(t.assignmentExpression("=", vd.id, vd.init))
471 - );
472 - }
473 - }
474 - }
475 -
476 - return res;
477 - }
478 -
479 - genRewrittenReturn(
480 - ret: NodePath<t.ReturnStatement>,
481 - retIdx: number
482 - ): t.Statement {
483 - const returnVal = ret.node.argument
484 - ? this.memoCache.writeReturnValue(ret.node.argument)
485 - : t.identifier("undefined");
486 -
487 - if (this.memoCache.hasRetIdx) {
488 - // $[ret] = <ret arg>
489 - return t.returnStatement(
490 - t.sequenceExpression([this.genUpdateReturnIdx(retIdx), returnVal])
491 - );
492 - } else {
493 - return t.returnStatement(returnVal);
494 - }
495 - }
496 -
497 - genUpdateReturnIdx(retIdx: number) {
498 - // $[ret_i] = ret_idx
499 - return this.memoCache.writeReturnIndex(retIdx);
500 - }
501 -
502 - genReturnReplay(retIdx: number): t.Statement {
503 - invariant(retIdx < this.lir.ir.returnCount, "retIdx >= returnCount");
504 - const returnReplay = t.returnStatement(this.memoCache.readReturnValue());
505 - if (this.memoCache.hasRetIdx) {
506 - return t.ifStatement(
507 - this.memoCache.isMemoizedReturnIndex(retIdx),
508 - /*cons*/ returnReplay
509 - );
510 - } else {
511 - // Single Return Optimization
512 - return returnReplay;
513 - }
514 - }
515 -
516 - /**
517 - * Note that it's critical to keep this method a POST-order traveral so that
518 - * the children of @param expr is rewritten BEFORE it's rewritten. Otherwise,
519 - * Babel will complain "Container is falsy".
520 - */
521 - rewriteExprInJSXTree(expr: IR.ExprVal) {
522 - if (IR.isJSXTagVal(expr)) {
523 - expr.children.forEach((child) => this.rewriteExprInJSXTree(child));
524 - }
525 - if (!expr.stable) {
526 - const entry = this.memoCache.entries.get(expr);
527 - if (entry) {
528 - invariant(LIR.MemoCache.isExprEntry(entry), "");
529 - expr.ast.replaceWith(this.genReactiveTenary(entry));
530 - }
531 - }
532 - }
533 -
534 - /**
535 - * Rewrite expression to a tenary to be reactive.
536 - * If inputs of @param entry is empty, @returns
537 - * ( $.isEmpty(i) ) ? ($[i] = expr) : $[i]
538 - * Otherwise, @returns
539 - * ( Reactions(Inputs) ) ? ($[i] = expr) : $[i]
540 - */
541 - genReactiveTenary(entry: LIR.MemoCache.ExprEntry) {
542 - const { inputs } = this.lir.ir.depGraph.getOrCreateVertex(entry.value);
543 - const cacheInvalidation =
544 - inputs.size === 0
545 - ? this.memoCache.isEmpty(entry)
546 - : this.genReactions(inputs);
547 -
548 - const rewrittenExpr = t.conditionalExpression(
549 - cacheInvalidation,
550 - this.memoCache.write(entry, entry.value.ast.path.node),
551 - this.memoCache.read(entry)
552 - );
553 -
554 - // If the expr is originated from the JSX children position, wrap the
555 - // rewritten expression in an JSXExpressionContainer.
556 - return entry.value.ast.path.listKey === "children"
557 - ? t.jsxExpressionContainer(rewrittenExpr)
558 - : rewrittenExpr;
559 - }
560 -
561 - /**
562 - * Helpers that generate code checking the inputs diffing results.
563 - * @param inputs
564 - * @returns
565 - * c_input1 || c_input2 || ...
566 - */
567 - genReactions(inputs: Set<IR.ReactiveVal>): t.Expression {
568 - const inputIdents: t.Expression[] = [...inputs].map((input) =>
569 - this.getChangeVar(input.binding.identifier.name)
570 - );
571 -
572 - return inputIdents.reduce((tree, depIdent) =>
573 - t.logicalExpression("||", tree, depIdent)
574 - );
575 - }
576 -
577 - getChangeVar(varName: string): t.Identifier {
578 - let changeVarIdentifier = this.changeVarIds.get(varName);
579 - if (changeVarIdentifier == null) {
580 - const changeVarName = `c_${varName}`;
581 - changeVarIdentifier = this.lir.ir.ast.scope.hasBinding(changeVarName)
582 - ? this.lir.ir.ast.scope.generateUidIdentifier(changeVarName)
583 - : t.identifier(changeVarName);
584 - this.changeVarIds.set(varName, changeVarIdentifier);
585 - }
586 - return changeVarIdentifier;
587 - }
588 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/JSGen.ts deleted
-188
@@ -1,188 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/traverse";
9 -import type { Function } from "@babel/types";
10 -import * as t from "@babel/types";
11 -import { assertExhaustive } from "../Common/utils";
12 -import type { CompilerContext } from "../CompilerContext";
13 -import { invariant } from "../CompilerError";
14 -import * as IR from "../IR";
15 -import * as LIR from "../LIR";
16 -import { isReactiveBlock, isRenderBlock } from "../LIR";
17 -import { PassKind, PassName } from "../Pass";
18 -import * as JS from "./JS";
19 -
20 -/**
21 - * JavaScript Code Generation.
22 - */
23 -export default {
24 - name: PassName.JSGen,
25 - kind: PassKind.LIRProg as const,
26 - run,
27 - mutatesBabelAST: true,
28 -};
29 -
30 -export function run(lirProg: LIR.Prog, context: CompilerContext) {
31 - if (lirProg.funcs.size === 0) {
32 - return;
33 - }
34 -
35 - const prog = lirProg.ir.ast;
36 - const utils = ["$empty"];
37 - if (context.opts.flags.guardHooks) {
38 - utils.push("$startLazy", "$endLazy");
39 - }
40 - if (context.opts.flags.guardReads) {
41 - utils.push("$read");
42 - }
43 - if (context.opts.flags.addFreeze) {
44 - utils.push("$makeReadOnly");
45 - }
46 - if (utils.length > 0) {
47 - prog.unshiftContainer(
48 - "body",
49 - t.variableDeclaration("const", [
50 - t.variableDeclarator(
51 - t.objectPattern(
52 - utils.map((util) =>
53 - t.objectProperty(
54 - t.identifier(util),
55 - t.identifier(util),
56 - false,
57 - true,
58 - null
59 - )
60 - )
61 - ),
62 - t.identifier("$ForgetRuntime")
63 - ),
64 - ])
65 - );
66 - prog.unshiftContainer(
67 - "body",
68 - t.importDeclaration(
69 - [
70 - t.importSpecifier(
71 - t.identifier("useMemoCache"),
72 - t.identifier("unstable_useMemoCache")
73 - ),
74 - t.importSpecifier(
75 - t.identifier("$ForgetRuntime"),
76 - t.identifier("unstable_ForgetRuntime")
77 - ),
78 - ],
79 - t.stringLiteral("react")
80 - )
81 - );
82 - }
83 -
84 - for (const [irFunc, lirFunc] of lirProg.funcs) {
85 - runFunc(lirFunc, irFunc.ast, context);
86 - }
87 -}
88 -
89 -export function runFunc(
90 - lirFunc: LIR.Func,
91 - func: NodePath<Function>,
92 - context: CompilerContext
93 -) {
94 - const irFunc = lirFunc.ir;
95 - const jsFunc = new JS.Func(lirFunc, context);
96 -
97 - genPrologue();
98 -
99 - for (const block of lirFunc.blocks) {
100 - switch (block.kind) {
101 - case LIR.BlockKind.Render:
102 - invariant(isRenderBlock(block), "");
103 - genRenderBlock(block);
104 - break;
105 - case LIR.BlockKind.Reactive:
106 - invariant(isReactiveBlock(block), "");
107 - genReactiveBlock(block);
108 - break;
109 - default:
110 - assertExhaustive(block.kind, `Unhandled block ${block}`);
111 - }
112 - }
113 -
114 - if (irFunc.isImplicitReturn && !lirFunc.hasSingleReturnPath) {
115 - jsFunc.emit(jsFunc.genUpdateReturnIdx(irFunc.returnCount));
116 - }
117 -
118 - /**
119 - * Prologue ::
120 - * useMemoCache()
121 - * Reactive(Params)
122 - */
123 - function genPrologue(): void {
124 - for (const param of irFunc.params) {
125 - // params are immut
126 - jsFunc.emitMakeReadOnly(param);
127 - if (IR.isReactiveVal(param)) {
128 - jsFunc.emitReactiveVal(param);
129 - }
130 - }
131 - }
132 -
133 - /**
134 - * RenderBlock ::
135 - * | Instr
136 - * | Instr
137 - * Reactive(Inputs)
138 - */
139 - function genRenderBlock(block: LIR.RenderBlock): void {
140 - for (const instr of block.body) {
141 - jsFunc.emit(instr.ast.node);
142 -
143 - for (const decl of instr.ir.decls) {
144 - if (decl.immutable) {
145 - jsFunc.emitMakeReadOnly(decl);
146 - }
147 - if (IR.isReactiveVal(decl)) {
148 - jsFunc.emitReactiveVal(decl);
149 - }
150 - }
151 - }
152 - }
153 -
154 - /**
155 - * @see {@link JS.Func.emitReactiveBlock}
156 - */
157 - function genReactiveBlock(block: LIR.ReactiveBlock): void {
158 - jsFunc.emitReactiveBlock(block);
159 - }
160 -
161 - /**
162 - * Replacing body with generated code.
163 - */
164 - const funcBody = func.get("body");
165 -
166 - // See {@link ReactFuncsInfer} for the reason.
167 - if (!funcBody.isBlockStatement()) throw new Error("Unreachable.");
168 - const directives = funcBody.node.directives;
169 -
170 - let code = jsFunc.code;
171 - code.unshift(jsFunc.useMemoCacheCall(lirFunc.memoCache.size));
172 - funcBody.replaceWithMultiple(code);
173 -
174 - // recover directives.
175 - funcBody.node.directives = directives;
176 - if (
177 - funcBody.node.directives.length === 0 ||
178 - funcBody.node.directives[0]!.value?.value !== "use forget"
179 - ) {
180 - funcBody.node.directives.unshift({
181 - type: "Directive",
182 - value: {
183 - type: "DirectiveLiteral",
184 - value: "use forget",
185 - },
186 - });
187 - }
188 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/LIRGen.ts deleted
-188
@@ -1,188 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { setEmpty, setEq, setIntersect, setSubset } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import { invariant } from "../CompilerError";
13 -import * as IR from "../IR";
14 -import * as LIR from "../LIR";
15 -import { PassKind, PassName } from "../Pass";
16 -
17 -/**
18 - * LIR Generation.
19 - * This pass we lower {@link IR.Func} to {@link LIR.Func} to help with codegen.
20 - *
21 - * The major job of this pass is to treat {@link IR.FuncTopLevel} as
22 - * {@link LIR.Instr} and schedule them into {@link LIR.ReactiveBlock} (which also
23 - * needs to be scheuled according to certain rules).
24 - */
25 -export default {
26 - name: PassName.LIRGen,
27 - kind: PassKind.IRFunc as const,
28 - run,
29 -};
30 -
31 -/**
32 - * Generate LIR for the given @param irFunc.
33 - */
34 -export function run(
35 - irFunc: IR.Func,
36 - func: NodePath<t.Function>,
37 - context: CompilerContext
38 -) {
39 - const lirFunc = new LIR.Func(irFunc);
40 - context.lirProg.funcs.set(irFunc, lirFunc);
41 - const scheduler = new InstrScheduler(lirFunc);
42 -
43 - for (const irFuncTopLevel of irFunc.body) {
44 - const instr = new LIR.Instr(irFuncTopLevel, irFunc);
45 -
46 - if (instr.isPinned()) scheduler.flushActiveList();
47 -
48 - if (instr.isRequiredEveryRender()) {
49 - scheduler.scheduleRenderBlock(LIR.createRenderBlock(instr));
50 - } else {
51 - let reactiveBlock = scheduler.findReactiveBlock(instr.inputs);
52 - if (!reactiveBlock) {
53 - const newReactiveBlock = LIR.createReactiveBlock(instr.inputs);
54 - scheduler.scheduleReactiveBlock(newReactiveBlock);
55 - reactiveBlock = newReactiveBlock;
56 - }
57 - reactiveBlock.emit(instr);
58 - }
59 -
60 - if (instr.isPinned()) scheduler.flushActiveList();
61 - }
62 -
63 - scheduler.flushActiveList();
64 - check(lirFunc, context);
65 -}
66 -
67 -class InstrScheduler {
68 - // TODO: may be faster to use a linked list.
69 - activeList: LIR.Block[];
70 -
71 - lirFunc: LIR.Func;
72 -
73 - constructor(lirFunc: LIR.Func) {
74 - this.lirFunc = lirFunc;
75 - this.activeList = [];
76 - }
77 -
78 - /**
79 - * Insert @param newBlock into the ActiveList by moving it from back to front
80 - * until it hits a RenderBlock or a ReactiveBlock it depends on.
81 - */
82 - scheduleRenderBlock(newBlock: LIR.RenderBlock) {
83 - for (const [i, tailBlock] of [...this.activeList.entries()].reverse()) {
84 - let stop = false;
85 - if (LIR.isRenderBlock(tailBlock)) {
86 - stop = true;
87 - } else {
88 - invariant(LIR.isReactiveBlock(tailBlock), "");
89 - const uses = LIR.getAllUses(newBlock);
90 - if (!setEmpty(uses) && setIntersect(LIR.getAllDefs(tailBlock), uses)) {
91 - // Check if newBlock uses any values declared in tailBlock
92 - // so that we don't create uses-before-decls.
93 - stop = true;
94 - }
95 - }
96 - if (stop) {
97 - // after the tailBlock
98 - this.activeList.splice(i + 1, 0, newBlock);
99 - return;
100 - }
101 - }
102 - // Insert at the front.
103 - this.activeList.splice(0, 0, newBlock);
104 - }
105 -
106 - /**
107 - * Insert @param newBlock into the ActiveList while keeping it sorted in
108 - * a partial order where if i < j, then ActiveList[j].Inputs can't be subset
109 - * of ActiveList[i].Inputs.
110 - */
111 - scheduleReactiveBlock(newBlock: LIR.ReactiveBlock) {
112 - for (const [i, headBlock] of this.activeList.entries()) {
113 - if (LIR.isReactiveBlock(headBlock)) {
114 - if (setSubset(newBlock.inputs, headBlock.inputs)) {
115 - // before the headBlock
116 - this.activeList.splice(i, 0, newBlock);
117 - return;
118 - }
119 - }
120 - }
121 - // Insert at the end.
122 - this.activeList.push(newBlock);
123 - }
124 -
125 - /**
126 - * @returns the active block with the same set of @param inputs, if exists.
127 - */
128 - findReactiveBlock(
129 - inputs: Set<IR.ReactiveVal>
130 - ): LIR.ReactiveBlock | undefined {
131 - for (const block of this.activeList) {
132 - if (LIR.isReactiveBlock(block)) {
133 - if (setEq(inputs, block.inputs)) {
134 - return block;
135 - }
136 - }
137 - }
138 - return undefined;
139 - }
140 -
141 - /**
142 - * Flush all pending blocks in the ActiveList to LIR functions. This is used
143 - * by pinned Instr to create boundaries.
144 - */
145 - flushActiveList() {
146 - for (const block of this.activeList) {
147 - this.lirFunc.addBlock(block);
148 - }
149 - this.activeList = [];
150 - }
151 -}
152 -
153 -/**
154 - * Check the validity of generated @param lirFunc.
155 - */
156 -function check(lirFunc: LIR.Func, context: CompilerContext) {
157 - const declared = new Set<IR.Val>();
158 -
159 - for (const param of lirFunc.ir.params) {
160 - declared.add(param);
161 - }
162 -
163 - for (const block of lirFunc.blocks) {
164 - for (const decl of LIR.getAllDecls(block)) {
165 - declared.add(decl);
166 - }
167 -
168 - // Check use-before-decl for instructions in reactive blocks
169 - if (LIR.isReactiveBlock(block)) {
170 - for (const input of block.inputs) {
171 - if (!declared.has(input)) {
172 - // Find the instr that create the use to fire bailout/diagnostics
173 - for (const instr of block.body) {
174 - if (instr.ir.uses.some((ref) => ref.val === input)) {
175 - context.bailout("LazyInstrInputDefinedLater", {
176 - code: "E0008",
177 - path: instr.ast,
178 - context: {
179 - input: input.ast.path.parentPath ?? input.ast.path,
180 - },
181 - });
182 - }
183 - }
184 - }
185 - }
186 - }
187 - }
188 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/MemoCacheAlloc.ts deleted
-112
@@ -1,112 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { nullableSetEq } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import * as IR from "../IR";
13 -import * as LIR from "../LIR";
14 -import { PassKind, PassName } from "../Pass";
15 -
16 -/**
17 - * MemoCache Allocation.
18 - *
19 - * This pass is responsible for allocating entries into {@link MemoCache}. Each
20 - * entry represents "a unit of computation" that Forget will memoize. This
21 - * includes React-ive inputs (props, states), intermediate values, and React-ive
22 - * outputs (React elements created via JSX).
23 - *
24 - * The smallest unit of computations that can be memoized (so-called the
25 - * "memoization boundary") is constrained by the smallest unit of program
26 - * constructs we collected during {@link DepGraphAnalysis}.
27 - *
28 - * The purpose of having this pass is to be able to fine-tune the memoCache
29 - * allocation to improve the perf characteristics coming from memoization.
30 - * Ideas include:
31 - * 1. Establish criterias on when memoization is considered a saving. Maybe
32 - * sometimes it's cheaper (overall) not not memoize something, and we can
33 - * control that by not allocating an entry for that.
34 - * 2. It's likely that many computations will share the exact same set of react
35 - * func inputs. To help the code generator optimize the tree shape, we could
36 - * use some help here?
37 - */
38 -export default {
39 - name: PassName.MemoCacheAlloc,
40 - kind: PassKind.LIRFunc as const,
41 - run,
42 -};
43 -
44 -/**
45 - * Allocate memoCache for the given React @param func
46 - */
47 -function run(
48 - lirFunc: LIR.Func,
49 - func: NodePath<t.Function>,
50 - context: CompilerContext
51 -) {
52 - const irFunc = lirFunc.ir;
53 -
54 - // Allocating return value cache and return index registers.
55 - lirFunc.memoCache.allocRetVal();
56 - if (
57 - !context.opts.flags.singleReturnShortcut ||
58 - !lirFunc.hasSingleReturnPath
59 - ) {
60 - lirFunc.memoCache.allocRetIdx();
61 - }
62 -
63 - // Allocating entry for reactive vals.
64 - for (const bVal of irFunc.env.decls.values()) {
65 - if (IR.isReactiveVal(bVal)) {
66 - lirFunc.memoCache.allocReactive(bVal);
67 - }
68 - }
69 -
70 - // Allocating entry for block locals.
71 - for (const block of lirFunc.blocks) {
72 - if (!LIR.isReactiveBlock(block)) continue;
73 -
74 - for (const output of block.outputs) {
75 - if (IR.isBindingVal(output)) {
76 - lirFunc.memoCache.allocLocal(output);
77 - }
78 - }
79 - }
80 -
81 - // Allocating entry for JSX values.
82 - for (const irFuncTopLevel of irFunc.body) {
83 - irFuncTopLevel.jsxTreeRoots.forEach((rootVal) =>
84 - visitExprVal(rootVal, undefined)
85 - );
86 - }
87 -
88 - /**
89 - * This performs a pre-order traversal over the JSX tree to accompolish
90 - * memoCache allocations in an optimized manner: we only allocate an new
91 - * entry if the set of inputs of the subtree/leaves changed.
92 - *
93 - * @param parentInputs inputs from parent, undefined if inputs are none.
94 - */
95 - function visitExprVal(
96 - exprVal: IR.ExprVal,
97 - parentInputs: Set<IR.ReactiveVal> | undefined = undefined
98 - ) {
99 - // Prunning for unsafe JSX tag value
100 - if (IR.isJSXTagVal(exprVal) && exprVal.isUnsafeToMemo) return;
101 -
102 - const { inputs } = irFunc.depGraph.getOrCreateVertex(exprVal);
103 - const inputChanged = !nullableSetEq(inputs, parentInputs);
104 - if (inputChanged && !exprVal.stable) {
105 - lirFunc.memoCache.allocExpr(exprVal);
106 - }
107 -
108 - if (IR.isJSXTagVal(exprVal)) {
109 - exprVal.children.forEach((child) => visitExprVal(child, inputs));
110 - }
111 - }
112 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/SanityCheck.ts deleted
-97
@@ -1,97 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { assertExhaustive } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import { invariant } from "../CompilerError";
13 -import { OutputKind } from "../CompilerOutputs";
14 -import * as IR from "../IR";
15 -import * as LIR from "../LIR";
16 -import { isReactiveBlock, isRenderBlock } from "../LIR";
17 -import { PassKind, PassName } from "../Pass";
18 -
19 -/**
20 - * An optional debug step when the output {@link OutputKind.IR} is enabled.
21 - * Records the output IR in the compiler context.
22 - */
23 -export default {
24 - name: PassName.DumpIR,
25 - kind: PassKind.LIRFunc as const,
26 - run,
27 -};
28 -
29 -export function run(
30 - lirFunc: LIR.Func,
31 - _func: NodePath<t.Function>,
32 - _context: CompilerContext
33 -) {
34 - const irFunc = lirFunc.ir;
35 -
36 - const reactiveValues = new Set<string>();
37 - function defineReactiveVal(value: IR.ReactiveVal) {
38 - const name = value.binding.identifier.name;
39 - reactiveValues.add(name);
40 - }
41 -
42 - function useReactiveValues(values: Set<IR.ReactiveVal>) {
43 - for (const reactiveValue of values) {
44 - const name = reactiveValue.binding.identifier.name;
45 - invariant(
46 - reactiveValues.has(name),
47 - `Reactive value "${name}" not yet defined.`
48 - );
49 - }
50 - }
51 -
52 - for (const param of irFunc.params) {
53 - if (IR.isReactiveVal(param)) {
54 - defineReactiveVal(param);
55 - }
56 - }
57 -
58 - function visitJSX(expr: IR.ExprVal) {
59 - if (IR.isJSXTagVal(expr)) {
60 - expr.children.forEach((child) => visitJSX(child));
61 - }
62 - if (!expr.stable) {
63 - const entry = lirFunc.memoCache.entries.get(expr);
64 - if (entry) {
65 - invariant(LIR.MemoCache.isExprEntry(entry), "");
66 - const { inputs } = irFunc.depGraph.getOrCreateVertex(entry.value);
67 - useReactiveValues(inputs);
68 - }
69 - }
70 - }
71 -
72 - for (const block of lirFunc.blocks) {
73 - switch (block.kind) {
74 - case LIR.BlockKind.Render:
75 - invariant(isRenderBlock(block), "Expected render block");
76 - for (const instr of block.body) {
77 - for (const decl of instr.ir.decls) {
78 - if (IR.isReactiveVal(decl)) {
79 - defineReactiveVal(decl);
80 - }
81 - }
82 - }
83 - break;
84 - case LIR.BlockKind.Reactive:
85 - invariant(isReactiveBlock(block), "Expected reactive block");
86 - useReactiveValues(block.inputs);
87 - for (const instr of block.body) {
88 - instr.ir.jsxTreeRoots.forEach((root) => {
89 - visitJSX(root);
90 - });
91 - }
92 - break;
93 - default:
94 - assertExhaustive(block.kind, `Unhandled block ${block}`);
95 - }
96 - }
97 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/BackEnd/index.ts deleted
-17
@@ -1,17 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * Compiler Back End.
10 - * Concerning about code generation.
11 - */
12 -
13 -export { default as DumpLIR } from "./DumpLIR";
14 -export { default as JSGen } from "./JSGen";
15 -export { default as LIRGen } from "./LIRGen";
16 -export { default as MemoCacheAlloc } from "./MemoCacheAlloc";
17 -export { default as SanityCheck } from "./SanityCheck";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Common/Dumper.ts deleted
-113
@@ -1,113 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as t from "@babel/types";
9 -import generate from "@babel/generator";
10 -
11 -/**
12 - * Dumper.
13 - */
14 -
15 -const defaultDumpNodeOption = {
16 - // dump with location.
17 - loc: false,
18 -
19 - // dump with the node type.
20 - type: false,
21 -
22 - // dump as the entire source code instead of a shorten name.
23 - source: false,
24 -
25 - // instead of <anno>, fallback to source.
26 - fallbackToSource: true,
27 -};
28 -
29 -type DumpNodeOption = typeof defaultDumpNodeOption;
30 -
31 -export function dumpNodeLoc(node: t.Node): string {
32 - return `${node.loc?.start.line ?? "?"}:${node.loc?.start.column ?? "?"}`;
33 -}
34 -
35 -/**
36 - * Dump a string form of the @param node to help with debugging.
37 - */
38 -export function dumpNode(
39 - node: t.Node | null | undefined,
40 - options: Partial<DumpNodeOption> = defaultDumpNodeOption
41 -): string {
42 - let str = "";
43 - let opt = { ...defaultDumpNodeOption, ...options };
44 -
45 - if (!node) return "";
46 -
47 - if (opt.loc) {
48 - str += `${dumpNodeLoc(node)} `;
49 - }
50 -
51 - if (opt.source) {
52 - str += generate(node).code;
53 - } else {
54 - switch (node.type) {
55 - case "Identifier":
56 - str += node.name;
57 - break;
58 -
59 - case "JSXIdentifier":
60 - str += `${node.name}`;
61 - break;
62 -
63 - case "VariableDeclarator":
64 - str += `${dumpNode(node.id, { source: true })}`;
65 - break;
66 -
67 - case "JSXMemberExpression":
68 - str += `${dumpNode(node.object)}.${dumpNode(node.property)}`;
69 - break;
70 -
71 - case "JSXNamespacedName":
72 - str += `${dumpNode(node.namespace)}:${dumpNode(node.name)}`;
73 - break;
74 -
75 - case "JSXOpeningElement":
76 - str += dumpNode(node.name);
77 - break;
78 -
79 - case "JSXAttribute":
80 - str += dumpNode(node.name);
81 - break;
82 -
83 - case "FunctionDeclaration":
84 - str += `function ${dumpNode(node.id)}`;
85 - break;
86 -
87 - case "JSXFragment":
88 - str += `<>`;
89 - break;
90 -
91 - case "JSXElement":
92 - if (node.selfClosing) {
93 - str += `<${dumpNode(node.openingElement)} />`;
94 - } else {
95 - str += `<${dumpNode(node.openingElement)}>`;
96 - }
97 - break;
98 -
99 - default:
100 - if (opt.fallbackToSource) {
101 - str += "`" + generate(node, { compact: true }).code + "`";
102 - } else {
103 - str += `<anno>`;
104 - }
105 - }
106 - }
107 -
108 - if (opt.type) {
109 - str += ` : ${node.type}`;
110 - }
111 -
112 - return str;
113 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Common/PathUnion.ts deleted
-39
@@ -1,39 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { Node, NodePath } from "@babel/traverse";
9 -
10 -/**
11 - * A utility type to generate NodePath as a disjointed union type for better
12 - * type refinement and exhaustiveness check.
13 - *
14 - * @see https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types
15 - */
16 -export type PathUnion<N extends Node | undefined | null> = N extends Node
17 - ? NodePath<N>
18 - : N extends undefined
19 - ? NodePath<undefined>
20 - : N extends null
21 - ? NodePath<null>
22 - : never;
23 -
24 -/**
25 - * Cast @param path of type {@link NodePath} to {@link PathUnion}.
26 - *
27 - * This should only be used right before a type refinement (aka. narrowing):
28 - *
29 - * const path = pathUnion(rawPath)
30 - * switch(path.kind) {
31 - * case "A":
32 - * // path is now refined to NodePath<A>
33 - * }
34 - */
35 -export function pathUnion<N extends Node | null | undefined>(
36 - path: NodePath<N>
37 -): PathUnion<N> {
38 - return path as PathUnion<N>;
39 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Common/utils.ts deleted
-83
@@ -1,83 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * Individual util functions.
10 - */
11 -
12 -export function setEq<T>(a: Set<T>, b: Set<T>): boolean {
13 - return a.size === b.size && [...a].every((v) => b.has(v));
14 -}
15 -
16 -export function nullableSetEq<T>(
17 - a: Set<T> | undefined,
18 - b: Set<T> | undefined
19 -): boolean {
20 - if (a === undefined && b === undefined) return true;
21 - if (a === undefined || b === undefined) return false;
22 - return a.size === b.size && [...a].every((v) => b.has(v));
23 -}
24 -
25 -export function setSubset<T>(a: Set<T>, b: Set<T>): boolean {
26 - return a.size <= b.size && [...a].every((v) => b.has(v));
27 -}
28 -
29 -export function setIntersect<T>(a: Set<T>, b: Set<T>): boolean {
30 - return [...a].some((v) => b.has(v));
31 -}
32 -
33 -export function setFirst<T>(s: Set<T>): T {
34 - return [...s][0];
35 -}
36 -
37 -export function setEmpty<T>(s: Set<T>): boolean {
38 - return s.size === 0;
39 -}
40 -
41 -export function hasOwnProperty<T>(obj: T, key: PropertyKey): key is keyof T {
42 - return Object.prototype.hasOwnProperty.call(obj, key);
43 -}
44 -
45 -/**
46 - * Trigger an exhaustivess check in TypeScript and throw at runtime.
47 - *
48 - * Example:
49 - *
50 - * ```ts
51 - * enum ErrorCode = {
52 - * E0001 = "E0001",
53 - * E0002 = "E0002"
54 - * }
55 - *
56 - * switch (code) {
57 - * case ErrorCode.E0001:
58 - * // ...
59 - * default:
60 - * assertExhaustive(code, "Unhandled error code");
61 - * }
62 - * ```
63 - */
64 -export function assertExhaustive(_: never, errorMsg: string): never {
65 - throw new Error(errorMsg);
66 -}
67 -
68 -/**
69 - * Modifies @param array in place, retaining only the items where the predicate returns true.
70 - */
71 -export function retainWhere<T>(
72 - array: Array<T>,
73 - predicate: (item: T) => boolean
74 -) {
75 - let writeIndex = 0;
76 - for (let readIndex = 0; readIndex < array.length; readIndex++) {
77 - const item = array[readIndex];
78 - if (predicate(item) === true) {
79 - array[writeIndex++] = item;
80 - }
81 - }
82 - array.length = writeIndex;
83 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerContext.ts deleted
-173
@@ -1,173 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import invariant from "invariant";
11 -import { CompilerOptions } from "./CompilerOptions";
12 -import { CompilerOutputs, createCompilerOutputs } from "./CompilerOutputs";
13 -import {
14 - buildDiagnostic,
15 - Diagnostic,
16 - DiagnosticLevel,
17 - DiagnosticOpts,
18 - ErrorCode,
19 - NoErrorCode,
20 - printDiagnostic,
21 - printPathCodeFrame,
22 -} from "./Diagnostic";
23 -import * as IR from "./IR";
24 -import * as LIR from "./LIR";
25 -import { Logger } from "./Logger";
26 -
27 -type Bailout = {
28 - code: ErrorCode;
29 - reason: string;
30 - stack: string | null;
31 - source: string | null;
32 -};
33 -
34 -let mostRecentCompilerContext: CompilerContext | null = null;
35 -/**
36 - * @returns CompilerContext used in the most recent call to {@link createCompilerDriver}
37 - */
38 -export function getMostRecentCompilerContext(): CompilerContext {
39 - invariant(
40 - mostRecentCompilerContext != null,
41 - "Can only call getMostRecentCompilerContext() after a call to createCompilerDriver()"
42 - );
43 - return mostRecentCompilerContext;
44 -}
45 -
46 -function createInvariantError(format: string, ...args: any[]) {
47 - Error.stackTraceLimit = 13;
48 - let ii = 0;
49 - const error = new Error(format.replace(/%s/g, () => args[ii++]));
50 - error.name = "Invariant Violation";
51 - popStackFrames(error, 3);
52 - Error.stackTraceLimit = 10;
53 - return error;
54 -}
55 -
56 -function popStackFrames(e: Error, n: number) {
57 - if (e.stack == null) {
58 - return;
59 - }
60 - const stackframes = e.stack.split("\n");
61 - stackframes.splice(1, n);
62 - e.stack = stackframes.join("\n");
63 -}
64 -
65 -/**
66 - * Global shared mutable context throughout the compilation pipeline.
67 - */
68 -export class CompilerContext {
69 - opts: CompilerOptions;
70 - outputs: CompilerOutputs = createCompilerOutputs();
71 - irProg: IR.Prog;
72 - lirProg: LIR.Prog;
73 - logger: Logger;
74 - diagnostics: Diagnostic[] = [];
75 - bailouts: Bailout[] = [];
76 -
77 - constructor(opts: CompilerOptions, prog: NodePath<t.Program>) {
78 - mostRecentCompilerContext = this;
79 - this.irProg = new IR.Prog(prog);
80 - this.lirProg = new LIR.Prog(this.irProg);
81 - this.opts = opts;
82 - this.logger = opts.logger;
83 - }
84 -
85 - createDiagnostic(opts: DiagnosticOpts): Diagnostic {
86 - const diag = buildDiagnostic(opts);
87 - this.diagnostics.push(diag);
88 -
89 - const loc = opts.path?.node.loc ?? null;
90 - this.logger.logEvent({
91 - name: "diagnostics",
92 - opts: {
93 - code: opts.code,
94 - loc,
95 - },
96 - });
97 -
98 - return diag;
99 - }
100 -
101 - /**
102 - * Record a compiler bailout, and emit a user-facing diagnostic. If this is not a user actionable
103 - * bailout, use {@link CompilerContext.bailoutWithoutDiagnostic} instead.
104 - */
105 - bailout(reason: string, opts: DiagnosticOpts) {
106 - const diag = this.createDiagnostic(opts);
107 - this.bailouts.push({
108 - reason,
109 - code: opts.code ?? NoErrorCode,
110 - source: printDiagnostic(diag),
111 - stack: null,
112 - });
113 - this.logger.logEvent({
114 - name: "bailout",
115 - reason,
116 - });
117 - }
118 -
119 - /**
120 - * Record a compiler bailout, with an optional Babel Path to track the source code that triggered
121 - * the bailout. If this is an actionable bailout (ie the user can fix this), use
122 - * {@link CompilerContext.bailout} instead.
123 - */
124 - bailoutWithoutDiagnostic(reason: string, path?: NodePath) {
125 - const source =
126 - path != null
127 - ? printPathCodeFrame(reason, DiagnosticLevel.Error, path)
128 - : null;
129 - this.bailouts.push({
130 - code: NoErrorCode,
131 - reason,
132 - source,
133 - stack: null,
134 - });
135 - this.logger.logEvent({
136 - name: "bailout",
137 - reason,
138 - });
139 - }
140 -
141 - /**
142 - * Record a bailout if there is an invariant violation and a recently created compiler context.
143 - * Note that no diagnostics are emitted. If a diagnostic is desired, use
144 - * {@link CompilerContext.bailout} instead.
145 - */
146 - invariant(
147 - condition: unknown,
148 - format: string,
149 - ...args: any[]
150 - ): asserts condition {
151 - if (condition) {
152 - return;
153 - }
154 - const error = createInvariantError(format, ...args);
155 - const reason = `InvariantViolation: ${error.message}`;
156 - const stack = error.stack ?? null;
157 - this.bailouts.push({
158 - code: NoErrorCode,
159 - reason,
160 - stack,
161 - source: null,
162 - });
163 - this.logger.logEvent({
164 - name: "bailout",
165 - reason,
166 - });
167 - throw error;
168 - }
169 -
170 - hasBailedOut(): boolean {
171 - return this.bailouts.length > 0;
172 - }
173 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerDriver.ts deleted
-68
@@ -1,68 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import * as BE from "./BackEnd";
11 -import { CompilerContext } from "./CompilerContext";
12 -import { CompilerOptions } from "./CompilerOptions";
13 -import * as ME from "./MiddleEnd";
14 -import { PassManager } from "./PassManager";
15 -import * as Validation from "./Validation";
16 -
17 -/**
18 - * Compiler Driver
19 - *
20 - * Owns {@link CompilerContext} and source program.
21 - */
22 -export interface CompilerDriver {
23 - context: CompilerContext;
24 - program: NodePath<t.Program>;
25 - compile(): void;
26 -}
27 -
28 -export function createCompilerDriver(
29 - options: CompilerOptions,
30 - program: NodePath<t.Program>
31 -): CompilerDriver {
32 - const context = new CompilerContext(options, program);
33 -
34 - return {
35 - context,
36 - program,
37 - compile() {
38 - const passManager = new PassManager(program, context);
39 -
40 - // Syntax Analysis and IR Generation.
41 - passManager.addPass(ME.ReactFuncsInfer);
42 - passManager.addPass(ME.ParamAnalysis);
43 - passManager.addPass(ME.BodyAnalysis);
44 - passManager.addPass(ME.SketchyCodeCheck);
45 - passManager.addPass(ME.RefKindInfer);
46 - passManager.addPass(ME.DumpIR);
47 - passManager.addPass(ME.IRCheck);
48 - passManager.addPass(ME.DumpCFG);
49 -
50 - // Dependency Analysis via DepGraph.
51 - passManager.addPass(ME.DepGraphAnalysis);
52 -
53 - // LIR Generation.
54 - passManager.addPass(BE.LIRGen);
55 - passManager.addPass(BE.MemoCacheAlloc);
56 - passManager.addPass(BE.DumpLIR);
57 - passManager.addPass(BE.SanityCheck);
58 -
59 - // JS Generation.
60 - passManager.addPass(BE.JSGen);
61 -
62 - // Optionally sanity-check the transformed output
63 - passManager.addPass(Validation.PostCodegenValidator);
64 -
65 - passManager.runAll();
66 - },
67 - };
68 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerError.ts deleted
-27
@@ -1,27 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import invariant from "invariant";
9 -import { getMostRecentCompilerContext } from "./CompilerContext";
10 -
11 -// Record a bailout if there is an invariant violation and a recently created compiler context.
12 -// Otherwise, just throws a regular invariant.
13 -function compilerInvariant(
14 - condition: unknown,
15 - format: string,
16 - ...args: any[]
17 -): asserts condition {
18 - let context = null;
19 - try {
20 - context = getMostRecentCompilerContext();
21 - } catch (_) {}
22 - if (context != null) {
23 - return context.invariant(condition, format, ...args);
24 - }
25 - return invariant(condition, format, ...args);
26 -}
27 -export { compilerInvariant as invariant };
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerFlags.ts deleted
-132
@@ -1,132 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * Compiler Flags.
10 - */
11 -
12 -export type CompilerFlags = {
13 - // Analysis
14 -
15 - /**
16 - * Although global mutation is unsafe, (render-)local mutation through free
17 - * vars could still be safe. This flag will include references to free vars
18 - * into the analysis and conservatively assume the value itself being mutable.
19 - */
20 - localMutationThroughFreeVars: boolean;
21 -
22 - /**
23 - * Abort compilation of functions with more than one return (implicit or
24 - * explicit).
25 - */
26 - bailOnMultipleReturns: boolean;
27 -
28 - /**
29 - * Abort compilation when a function starting with a capictal letter is
30 - * called as this might indicate a component called w/o JSX.
31 - *
32 - * Examples:
33 - * - `Container(memoizedProps)` might contain hook calls in
34 - * https://fburl.com/code/l9mmhzlg
35 - */
36 - bailOnCapitalizedFunctionCalls: boolean;
37 -
38 - /**
39 - * Bail out on components defined in nested scopes.
40 - *
41 - * Examples:
42 - * - `getter` function call might contain hook calls in
43 - * https://fburl.com/code/yji3smfm
44 - * While this bailout doesn't directly discover this case, HOCs are a
45 - * common source of calls like this.
46 - */
47 - bailOnNestedComponents: boolean;
48 -
49 - /**
50 - * Abort compilation of functions that contain any `useRef` calls.
51 - */
52 - bailOnUseRef: boolean;
53 -
54 - // Optimizations
55 - singleReturnShortcut: boolean;
56 -
57 - // Codegen
58 - /**
59 - * Conditional Cache Replacement For ReactiveVal.
60 - * @See <https://github.com/facebook/react-forget/issues/115>
61 - */
62 - condCache: boolean;
63 -
64 - /**
65 - * Enable runtime guards against reads of uninitialied memo cache values.
66 - */
67 - guardReads: boolean;
68 -
69 - /**
70 - * Enable runtime guards against calls to hooks in reactive blocks. These calls
71 - * are bugs in the compiler or user code not following Rules of Hooks, such
72 - * as calling a component like a function or naming a hook incorrectly.
73 - */
74 - guardHooks: boolean;
75 -
76 - /**
77 - * Experimental runtime logging to collect data
78 - */
79 - addFreeze: boolean;
80 -};
81 -
82 -export function createCompilerFlags(): CompilerFlags {
83 - return {
84 - localMutationThroughFreeVars: false,
85 - bailOnMultipleReturns: false,
86 - bailOnCapitalizedFunctionCalls: false,
87 - bailOnNestedComponents: false,
88 - bailOnUseRef: false,
89 - singleReturnShortcut: true,
90 - condCache: false,
91 - guardReads: false,
92 - guardHooks: false,
93 - addFreeze: false,
94 - };
95 -}
96 -
97 -export function parseCompilerFlags(
98 - flags: object,
99 - ignoreInvalidInput: boolean = false
100 -): CompilerFlags {
101 - const res = createCompilerFlags();
102 - for (const [key, value] of Object.entries(flags)) {
103 - switch (key) {
104 - case "localMutationThroughFreeVars":
105 - case "bailOnMultipleReturns":
106 - case "bailOnCapitalizedFunctionCalls":
107 - case "bailOnNestedComponents":
108 - case "bailOnUseRef":
109 - case "singleReturnShortcut":
110 - case "condCache":
111 - case "guardReads":
112 - case "guardHooks":
113 - case "addFreeze":
114 - if (typeof value !== "boolean") {
115 - throw `Expected boolean for flag '${key}': ${value}`;
116 - }
117 - res[key] = value;
118 - break;
119 - case "guardThrows": {
120 - console.warn(
121 - `the 'guardThrows' flag is no longer supported, this feature is built into React now`
122 - );
123 - break;
124 - }
125 - default:
126 - if (!ignoreInvalidInput) {
127 - throw `Unknown flag: ${key}`;
128 - }
129 - }
130 - }
131 - return res;
132 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerOptions.ts deleted
-160
@@ -1,160 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { PluginOptions } from "@babel/core";
9 -import { hasOwnProperty } from "./Common/utils";
10 -import {
11 - CompilerFlags,
12 - createCompilerFlags,
13 - parseCompilerFlags,
14 -} from "./CompilerFlags";
15 -import { isOutputKind, OutputKind } from "./CompilerOutputs";
16 -import { Logger, noopLogger } from "./Logger";
17 -import { PassName } from "./Pass";
18 -
19 -export type CompilerOptions = {
20 - outputKinds: OutputKind[];
21 -
22 - flags: CompilerFlags;
23 -
24 - /**
25 - * Notify the compiler to stop at certain pass.
26 - */
27 - stopPass: PassName;
28 -
29 - /**
30 - * Set this to true to make Forget opt-in at file level.
31 - * - `"use forget"`
32 - * - `@react forget` (tentative)
33 - */
34 - optIn: boolean;
35 -
36 - /**
37 - * Logger for compiler development errors and warnings.
38 - * By default, logs are disabled.
39 - */
40 - logger: Logger;
41 -
42 - /**
43 - * Capitalized identifier names that can be used in call expressions.
44 - */
45 - allowedCapitalizedUserFunctions: Set<string>;
46 -
47 - /**
48 - * Function to validate source code after codegen. The function is called
49 - * with the *transformed* source code and should return:
50 - * - null or an empty array if there are no errors
51 - * - a list of validation erros with line and column information as well
52 - * as a message describing the error.
53 - */
54 - postCodegenValidator:
55 - | ((source: string) => Array<PostCodegenValidationError> | null)
56 - | null;
57 -};
58 -
59 -type PostCodegenValidationError = {
60 - line: number;
61 - column: number;
62 - message: string;
63 -};
64 -
65 -/**
66 - * Takes an untyped JSON object and converts it to `CompilerOptions`.
67 - *
68 - * @returns A valid `CompilerOptions`.
69 - * @throws An error message describe the invalid input.
70 - */
71 -export function parseCompilerOptions(
72 - pluginOpts: PluginOptions
73 -): CompilerOptions {
74 - const resOpts: CompilerOptions = createCompilerOptions();
75 - if (pluginOpts == null) {
76 - return resOpts;
77 - }
78 - if (typeof pluginOpts !== "object") {
79 - throw "Expected an object";
80 - }
81 - const inputOpts = pluginOpts as {
82 - [P in keyof CompilerOptions]?: any;
83 - };
84 - if (hasOwnProperty(inputOpts, "outputKinds")) {
85 - const outputKinds = inputOpts.outputKinds;
86 - if (
87 - outputKinds == null ||
88 - outputKinds.some((kind: string) => !isOutputKind(kind))
89 - ) {
90 - throw `Invalid value for 'outputKinds': ${outputKinds}`;
91 - }
92 - resOpts.outputKinds = outputKinds;
93 - }
94 - if (hasOwnProperty(inputOpts, "flags")) {
95 - resOpts.flags = parseCompilerFlags(inputOpts.flags);
96 - }
97 - if (hasOwnProperty(inputOpts, "stopPass")) {
98 - const stopPass = inputOpts.stopPass;
99 - if (!(stopPass in PassName)) {
100 - throw `Invalid value for 'stopPass': ${stopPass}`;
101 - }
102 - resOpts.stopPass = stopPass;
103 - }
104 - if (hasOwnProperty(inputOpts, "optIn")) {
105 - const optIn = inputOpts.optIn;
106 - if (typeof optIn !== "boolean") {
107 - throw `Invalid value for 'optIn': ${optIn}`;
108 - }
109 - resOpts.optIn = optIn;
110 - }
111 - if (hasOwnProperty(inputOpts, "logger")) {
112 - const logger = inputOpts.logger;
113 - if (
114 - typeof logger !== "object" ||
115 - typeof logger.error !== "function" ||
116 - typeof logger.warn !== "function" ||
117 - typeof logger.logEvent !== "function"
118 - ) {
119 - throw `Invalid value for 'logger': ${logger}`;
120 - }
121 - resOpts.logger = logger;
122 - }
123 - if (hasOwnProperty(inputOpts, "allowedCapitalizedUserFunctions")) {
124 - const allowedCapitalizedUserFunctions =
125 - inputOpts.allowedCapitalizedUserFunctions;
126 - if (
127 - typeof allowedCapitalizedUserFunctions !== "object" ||
128 - !(allowedCapitalizedUserFunctions instanceof Set)
129 - ) {
130 - throw `Invalid value for 'allowedCapitalizedUserFunctions': ${allowedCapitalizedUserFunctions}`;
131 - }
132 - resOpts.allowedCapitalizedUserFunctions = allowedCapitalizedUserFunctions;
133 - }
134 - if (hasOwnProperty(inputOpts, "postCodegenValidator")) {
135 - const postCodegenValidator = inputOpts.postCodegenValidator;
136 - if (
137 - postCodegenValidator !== null &&
138 - typeof postCodegenValidator !== "function"
139 - ) {
140 - throw `Invalid value for 'postCodegenValidator'`;
141 - }
142 - resOpts.postCodegenValidator = postCodegenValidator;
143 - }
144 - return resOpts;
145 -}
146 -
147 -/**
148 - * Create default {@link CompilerOptions}.
149 - */
150 -export function createCompilerOptions(): CompilerOptions {
151 - return {
152 - outputKinds: [OutputKind.JS],
153 - flags: createCompilerFlags(),
154 - stopPass: PassName.Validator,
155 - optIn: false,
156 - logger: noopLogger,
157 - allowedCapitalizedUserFunctions: new Set(),
158 - postCodegenValidator: null,
159 - };
160 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/CompilerOutputs.ts deleted
-113
@@ -1,113 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import invariant from "invariant";
9 -import parserFlow from "prettier/parser-flow";
10 -import prettier from "prettier/standalone";
11 -import prettyFormat from "pretty-format";
12 -import { SCCGraphSnapshot, ValGraphSnapshot } from "./DepGraph";
13 -
14 -/**
15 - * N.B. we use string enum to ease the interop with untyped code.
16 - */
17 -export enum OutputKind {
18 - IR = "DumpIR",
19 - CFG = "DumpCFG",
20 - ValGraph = "DumpValGraph",
21 - SCCGraph = "DumpSCCGraph",
22 - RedGraph = "DumpRedGraph",
23 - LIR = "DumpLIR",
24 - JS = "EmitJS",
25 -}
26 -
27 -/**
28 - * @returns if @param kind is syntactically valid JavaScript
29 - */
30 -export function isSyntacticallyValidJS(kind: OutputKind) {
31 - return [OutputKind.IR, OutputKind.LIR, OutputKind.JS].includes(kind);
32 -}
33 -
34 -export interface CompilerOutputs {
35 - [OutputKind.IR]: string;
36 - [OutputKind.CFG]: string;
37 - [OutputKind.ValGraph]: ValGraphSnapshot[];
38 - [OutputKind.SCCGraph]: SCCGraphSnapshot[];
39 - [OutputKind.RedGraph]: SCCGraphSnapshot[];
40 - [OutputKind.LIR]: string;
41 - [OutputKind.JS]: string;
42 -}
43 -
44 -export function createCompilerOutputs(): CompilerOutputs {
45 - return {
46 - [OutputKind.IR]: "",
47 - [OutputKind.CFG]: "",
48 - [OutputKind.ValGraph]: [],
49 - [OutputKind.SCCGraph]: [],
50 - [OutputKind.RedGraph]: [],
51 - [OutputKind.LIR]: "",
52 - [OutputKind.JS]: "",
53 - };
54 -}
55 -
56 -export function isOutputKind(kind: string): kind is OutputKind {
57 - return Object.values(OutputKind).includes(kind as OutputKind);
58 -}
59 -
60 -export type PrettyCompilerOutputs = Record<OutputKind, string | undefined>;
61 -
62 -export function stringifyCompilerOutputs(
63 - compilerOutputs: CompilerOutputs
64 -): PrettyCompilerOutputs {
65 - const outputs: PrettyCompilerOutputs = {
66 - [OutputKind.IR]: undefined,
67 - [OutputKind.CFG]: undefined,
68 - [OutputKind.ValGraph]: undefined,
69 - [OutputKind.SCCGraph]: undefined,
70 - [OutputKind.RedGraph]: undefined,
71 - [OutputKind.LIR]: undefined,
72 - [OutputKind.JS]: undefined,
73 - };
74 -
75 - Object.entries(compilerOutputs).forEach(([outputKind, output]) => {
76 - if (isOutputKind(outputKind)) {
77 - if (isSyntacticallyValidJS(outputKind)) {
78 - invariant(
79 - typeof output === "string",
80 - "OutputKind that are JS must have string typed output."
81 - );
82 - if (output !== "") {
83 - try {
84 - outputs[outputKind] = prettier
85 - .format(output, {
86 - parser: "flow",
87 - plugins: [parserFlow],
88 - })
89 - .trim();
90 - } catch (e) {
91 - console.warn("Error formatting output:", e);
92 - }
93 - }
94 - } else if (outputKind === OutputKind.CFG) {
95 - outputs[outputKind] = output;
96 - } else {
97 - invariant(Array.isArray(output), "Graph outputs are arrays.");
98 - if (output.length > 0) {
99 - outputs[outputKind] = output
100 - .map((o: ValGraphSnapshot | SCCGraphSnapshot) =>
101 - prettyFormat(o.toMap())
102 - )
103 - .join("\n");
104 - }
105 - }
106 - }
107 - });
108 -
109 - return outputs;
110 -}
111 -
112 -export { ValGraphSnapshot as ValGraph };
113 -export { SCCGraphSnapshot as SCCGraph };
compiler/forget/packages/babel-plugin-react-forget-legacy/src/ControlFlowGraph/CFGBuilder.ts deleted
-466
@@ -1,466 +0,0 @@
1 -import { NodePath } from "@babel/traverse";
2 -import * as t from "@babel/types";
3 -import { assertExhaustive } from "../Common/utils";
4 -import { invariant } from "../CompilerError";
5 -import * as IR from "../IR";
6 -import { BasicBlock, BlockId, CFG, Terminal } from "./ControlFlowGraph";
7 -
8 -/**
9 - * A work-in-progress block that does not yet have a terminator
10 - */
11 -export type WipBlock = {
12 - id: BlockId;
13 - body: Array<NodePath<t.Statement | t.Expression>>;
14 - parents: Set<IR.FuncTopLevel>;
15 -};
16 -
17 -export enum TerminatorKind {
18 - Fallthrough,
19 - Normal,
20 -}
21 -
22 -/**
23 - * Scope is used to track contextual information such as break/continue targets
24 - * as well as which variables determine whether control flow to the current
25 - * statement can be reached or not.
26 - */
27 -type Scope = LoopScope | ConditionalScope | LabelScope | SwitchScope;
28 -
29 -type LoopScope = {
30 - kind: "loop";
31 - label: string | null;
32 - continueBlock: BlockId;
33 - breakBlock: BlockId;
34 -};
35 -
36 -type ConditionalScope = {
37 - kind: "conditional";
38 - test: NodePath<t.Expression>;
39 -};
40 -
41 -type LabelScope = {
42 - kind: "label";
43 - label: string;
44 - breakBlock: BlockId;
45 -};
46 -
47 -type SwitchScope = {
48 - kind: "switch";
49 - test: NodePath<t.Expression>;
50 - breakBlock: BlockId;
51 -};
52 -
53 -function newWipBlock(id: BlockId): WipBlock {
54 - return {
55 - id,
56 - body: [],
57 - parents: new Set(),
58 - };
59 -}
60 -
61 -/**
62 - * Helper class for constructing a CFG
63 - */
64 -export default class CFGBuilder {
65 - #completed: Map<BlockId, BasicBlock> = new Map();
66 - #nextId: BlockId = 1;
67 - #current: WipBlock = newWipBlock(0);
68 - #entry: BlockId = 0;
69 - #scopes: Array<Scope> = [];
70 -
71 - /**
72 - * Add a parent IR func top level
73 - */
74 - associateParentBlock(block: IR.FuncTopLevel) {
75 - this.#current.parents.add(block);
76 - }
77 -
78 - /**
79 - * Push a statement or expression onto the current block
80 - */
81 - push(stmt: NodePath<t.Statement | t.Expression>) {
82 - this.#current.body.push(stmt);
83 - }
84 -
85 - /**
86 - * Construct a final CFG from this context
87 - */
88 - build(): CFG {
89 - const { id: blockId, body, parents } = this.#current;
90 - this.#completed.set(blockId, {
91 - body,
92 - terminal: { kind: "return", value: null, fallthrough: null },
93 - parents,
94 - });
95 - return shrink({
96 - blocks: this.#completed,
97 - entry: this.#entry,
98 - });
99 - }
100 -
101 - /**
102 - * Terminate the current block w the given terminal, and start a new block
103 - */
104 - terminate(terminal: Terminal) {
105 - const { id: blockId, body, parents } = this.#current;
106 - this.#completed.set(blockId, {
107 - body,
108 - terminal,
109 - parents,
110 - });
111 - const nextId = this.#nextId++;
112 - this.#current = newWipBlock(nextId);
113 - }
114 -
115 - /**
116 - * Terminate the current block w the given terminal, and set the previously
117 - * reserved block as the new current block
118 - */
119 - terminateWithContinuation(terminal: Terminal, continuation: WipBlock) {
120 - const { id: blockId, body, parents } = this.#current;
121 - this.#completed.set(blockId, {
122 - body,
123 - terminal,
124 - parents,
125 - });
126 - this.#current = continuation;
127 - }
128 -
129 - /**
130 - * Reserve a block so that it can be referenced prior to construction.
131 - * Make this the current block with `terminateWithContinuation()` or
132 - * call `complete()` to save it without setting it as the current block.
133 - */
134 - reserve(): WipBlock {
135 - const blockId = this.#nextId++;
136 - return newWipBlock(blockId);
137 - }
138 -
139 - /**
140 - * Save a previously reserved block as completed
141 - */
142 - complete(block: WipBlock, terminal: Terminal) {
143 - const { id: blockId, body, parents } = block;
144 - this.#completed.set(blockId, { body, terminal, parents });
145 - }
146 -
147 - /**
148 - * Create a new block and execute the provided callback with the new block
149 - * set as the current, resetting to the previously active block upon exit.
150 - * The lambda must return a terminal node, which is used to terminate the
151 - * newly constructed block.
152 - */
153 - enter(fn: (blockId: BlockId) => Terminal): BlockId {
154 - const current = this.#current;
155 - const nextId = this.#nextId++;
156 - this.#current = newWipBlock(nextId);
157 - const terminal = fn(nextId);
158 - const { id: blockId, body, parents } = this.#current;
159 - this.#completed.set(blockId, { body, terminal, parents });
160 - this.#current = current;
161 - return nextId;
162 - }
163 -
164 - condition<T>(test: NodePath<t.Expression>, fn: () => T): T {
165 - this.#scopes.push({
166 - kind: "conditional",
167 - test,
168 - });
169 - const value = fn();
170 - const last = this.#scopes.pop();
171 - invariant(
172 - last != null && last.kind === "conditional" && last.test === test,
173 - "Mismatched condition"
174 - );
175 - return value;
176 - }
177 -
178 - label<T>(label: string, breakBlock: BlockId, fn: () => T): T {
179 - this.#scopes.push({
180 - kind: "label",
181 - breakBlock,
182 - label,
183 - });
184 - const value = fn();
185 - const last = this.#scopes.pop();
186 - invariant(
187 - last != null &&
188 - last.kind === "label" &&
189 - last.label === label &&
190 - last.breakBlock === breakBlock,
191 - "Mismatched label"
192 - );
193 - return value;
194 - }
195 -
196 - switch<T>(test: NodePath<t.Expression>, breakBlock: BlockId, fn: () => T): T {
197 - this.#scopes.push({
198 - kind: "switch",
199 - breakBlock,
200 - test,
201 - });
202 - const value = fn();
203 - const last = this.#scopes.pop();
204 - invariant(
205 - last != null && last.kind === "switch" && last.test === test,
206 - "Mismatched label"
207 - );
208 - return value;
209 - }
210 -
211 - /**
212 - * Executes the provided lambda inside a scope in which the provided loop
213 - * information is cached for lookup with `lookupBreak()` and `lookupContinue()`
214 - */
215 - loop<T>(
216 - label: string | null,
217 - /**
218 - * block of the loop body. "continue" jumps here.
219 - */
220 - continueBlock: BlockId,
221 - /**
222 - * block following the loop. "break" jumps here.
223 - */
224 - breakBlock: BlockId,
225 - fn: () => T
226 - ): T {
227 - this.#scopes.push({
228 - kind: "loop",
229 - label,
230 - continueBlock,
231 - breakBlock,
232 - });
233 - const value = fn();
234 - const last = this.#scopes.pop();
235 - invariant(
236 - last != null &&
237 - last.kind === "loop" &&
238 - last.label === label &&
239 - last.continueBlock === continueBlock &&
240 - last.breakBlock === breakBlock,
241 - "Mismatched loops"
242 - );
243 - return value;
244 - }
245 -
246 - /**
247 - * Returns the set of expressions which appear as conditions (if/switch test)
248 - * determining whether control flow to the current point will be reached.
249 - *
250 - * This is intended for recording "control dependencies" at places such as explicit
251 - * break/return which divert from normal control flow.
252 - */
253 - controlExpressions(): Array<NodePath<t.Expression>> | null {
254 - const tests: Array<NodePath<t.Expression>> = [];
255 - this.#scopes.forEach((scope) => {
256 - if (scope.kind === "conditional" || scope.kind === "switch") {
257 - tests.push(scope.test);
258 - }
259 - });
260 - return tests.length === 0 ? null : tests;
261 - }
262 -
263 - /**
264 - * Lookup the block target for a break statement, based on loops and switch statements
265 - * in scope. Throws if there is no available location to break.
266 - */
267 - lookupBreak(label: string | null): BlockId {
268 - for (let ii = this.#scopes.length - 1; ii >= 0; ii--) {
269 - const scope = this.#scopes[ii];
270 - switch (scope.kind) {
271 - case "label":
272 - case "loop": {
273 - if (label === null || label === scope.label) {
274 - return scope.breakBlock;
275 - }
276 - break;
277 - }
278 - case "switch": {
279 - return scope.breakBlock;
280 - }
281 - default: {
282 - // no-op
283 - }
284 - }
285 - }
286 - invariant(false, "Expected a loop or switch to be in scope");
287 - }
288 -
289 - /**
290 - * Lookup the block target for a continue statement, based on loops
291 - * in scope. Throws if there is no available location to continue, or if the given
292 - * label does not correspond to a loop (this should also be validated at parse time).
293 - */
294 - lookupContinue(label: string | null): BlockId {
295 - for (let ii = this.#scopes.length - 1; ii >= 0; ii--) {
296 - const scope = this.#scopes[ii];
297 - if (scope.kind === "loop") {
298 - if (label === null || label === scope.label) {
299 - return scope.continueBlock;
300 - }
301 - } else if (scope.kind === "label" && scope.label === label) {
302 - invariant(false, "Continue may only refer to a labeled loop");
303 - }
304 - }
305 - invariant(false, "Expected a loop to be in scope");
306 - }
307 -}
308 -
309 -/**
310 - * Helper to shrink a CFG to eliminate unreachable node and eliminate jump-only blocks.
311 - */
312 -function shrink(func: CFG): CFG {
313 - const gotos = new Map();
314 - /**
315 - * Given a target block for some terminator, resolves the ideal block that should be
316 - * targeted instead. This transitively resolves any blocks that are simple indirections
317 - * (empty blocks that terminate in a goto).
318 - */
319 - function resolveBlockTarget(blockId: BlockId): BlockId {
320 - let target = gotos.get(blockId) ?? null;
321 - if (target !== null) {
322 - return target;
323 - }
324 - const block = func.blocks.get(blockId)!;
325 - target = getTargetIfIndirection(block);
326 - if (target !== null) {
327 - // the target might also be a simple goto, recurse
328 - target = resolveBlockTarget(target) ?? target;
329 - gotos.set(blockId, target);
330 - return target;
331 - } else {
332 - // If the block wasn't an indirection, return the original input.
333 - return blockId;
334 - }
335 - }
336 -
337 - /**
338 - * Fixpoint iteration to explore all blocks reachable from the entry block,
339 - * and to resolve their terminator targets to avoid indirections.
340 - * This implicitly prunes unreachable blocks since they are never visited and
341 - * therefore not added to the output.
342 - */
343 - const queue = [func.entry];
344 - // new set of output blocks
345 - const blocks: Map<BlockId, BasicBlock> = new Map();
346 - while (queue.length !== 0) {
347 - const blockId = queue.shift()!;
348 - if (blocks.has(blockId)) {
349 - continue;
350 - }
351 - const { body, terminal: prevTerminal, parents } = func.blocks.get(blockId)!;
352 - const terminal = mapTerminalSuccessors(prevTerminal, (prevTarget, kind) => {
353 - const target = resolveBlockTarget(prevTarget);
354 - if (kind == TerminatorKind.Normal) {
355 - queue.push(target);
356 - }
357 - return target;
358 - });
359 - blocks.set(blockId, {
360 - body,
361 - terminal,
362 - parents,
363 - });
364 - }
365 -
366 - for (const block of blocks.values()) {
367 - if (
368 - (block.terminal.kind === "return" || block.terminal.kind === "goto") &&
369 - block.terminal.fallthrough !== null &&
370 - !blocks.has(block.terminal.fallthrough.block)
371 - ) {
372 - // this fallthrough branch wasn't otherwise reachable, prune it
373 - block.terminal.fallthrough = null;
374 - }
375 - }
376 -
377 - return {
378 - blocks,
379 - entry: func.entry,
380 - };
381 -}
382 -
383 -/**
384 - * If the given block is a simple indirection (empty terminated with a goto),
385 - * returns the block being pointed to. Otherwise returns null
386 - */
387 -function getTargetIfIndirection(block: BasicBlock): number | null {
388 - return block.body.length === 0 &&
389 - block.terminal.kind === "goto" &&
390 - block.terminal.fallthrough === null
391 - ? block.terminal.block
392 - : null;
393 -}
394 -
395 -/**
396 - * Maps a terminal node's block assignments using the provided function.
397 - */
398 -function mapTerminalSuccessors(
399 - terminal: Terminal,
400 - fn: (block: BlockId, fallthrough: TerminatorKind) => BlockId
401 -): Terminal {
402 - switch (terminal.kind) {
403 - case "goto": {
404 - const target = fn(terminal.block, TerminatorKind.Normal);
405 - const fallthrough =
406 - terminal.fallthrough !== null
407 - ? {
408 - block: fn(terminal.fallthrough.block, TerminatorKind.Fallthrough),
409 - tests: terminal.fallthrough.tests,
410 - }
411 - : null;
412 - return {
413 - kind: "goto",
414 - block: target,
415 - fallthrough,
416 - };
417 - }
418 - case "if": {
419 - const consequent = fn(terminal.consequent, TerminatorKind.Normal);
420 - const alternate = fn(terminal.alternate, TerminatorKind.Normal);
421 - return {
422 - kind: "if",
423 - test: terminal.test,
424 - consequent,
425 - alternate,
426 - };
427 - }
428 - case "switch": {
429 - const cases = terminal.cases.map((case_) => {
430 - const target = fn(case_.block, TerminatorKind.Normal);
431 - return {
432 - test: case_.test,
433 - block: target,
434 - };
435 - });
436 - return {
437 - kind: "switch",
438 - test: terminal.test,
439 - cases,
440 - };
441 - }
442 - case "return": {
443 - const fallthrough =
444 - terminal.fallthrough !== null
445 - ? {
446 - block: fn(terminal.fallthrough.block, TerminatorKind.Fallthrough),
447 - tests: terminal.fallthrough.tests,
448 - }
449 - : null;
450 - return {
451 - kind: "return",
452 - value: terminal.value,
453 - fallthrough,
454 - };
455 - }
456 - case "throw": {
457 - return terminal;
458 - }
459 - default: {
460 - assertExhaustive(
461 - terminal,
462 - `Unexpected terminal kind '${(terminal as any as Terminal).kind}'`
463 - );
464 - }
465 - }
466 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/ControlFlowGraph/ControlFlowGraph.ts deleted
-125
@@ -1,125 +0,0 @@
1 -import { NodePath } from "@babel/traverse";
2 -import * as t from "@babel/types";
3 -import * as IR from "../IR";
4 -
5 -/**
6 - * A control flow graph comprises of a set of basic blocks plus the entry block id.
7 - */
8 -export type CFG = {
9 - blocks: Map<BlockId, BasicBlock>;
10 - entry: BlockId;
11 -};
12 -
13 -export type BlockId = number;
14 -
15 -/**
16 - * A sequence of zero or more statements that will execute consecutively (barring exceptions)
17 - * followed by a terminal node. The terminal ends the *block*, not the function, though some
18 - * terminals such as throw or return may also exit from the function.
19 - */
20 -export type BasicBlock = {
21 - body: Array<NodePath<t.Statement | t.Expression>>;
22 - terminal: Terminal;
23 - parents: Set<IR.FuncTopLevel>;
24 -};
25 -
26 -/**
27 - * Union of all possible terminal nodes.
28 - */
29 -export type Terminal =
30 - | ReturnTerminal
31 - | GotoTerminal
32 - | ThrowTerminal
33 - | IfTerminal
34 - | SwitchTerminal;
35 -
36 -/**
37 - * Models a `return <expression>`, terminating the block by returning the given value.
38 - */
39 -export type ReturnTerminal = {
40 - kind: "return";
41 - value: NodePath<t.Expression> | null;
42 -
43 - /**
44 - * The block that would otherwise be reached if the return were not present.
45 - * This is only non-null if the fallthrough block is reachable by some other
46 - * control-flow path.
47 - * Represents the block that would otherwise be reached if this return were
48 - * not present, along with the test conditions that are checked to decide if
49 - * this return should be taken. The fallthrough object is only non-null if
50 - * the fallthrough block is reachable by some other control-flow path.
51 - */
52 - fallthrough: {
53 - block: BlockId;
54 - tests: Array<NodePath<t.Expression>> | null;
55 - } | null;
56 -};
57 -
58 -/**
59 - * Models control-flow that unconditionally jumps to another block. In general
60 - * Goto is only used if there is more than one control flow path that will reach
61 - * the target block: if block A is the only block that can flow into block B,
62 - * block A and B would be constructed as a single block.
63 - */
64 -export type GotoTerminal = {
65 - kind: "goto";
66 - block: BlockId;
67 -
68 - /**
69 - * The block that would otherwise be reached if the return were not present.
70 - * This is only non-null if the fallthrough block is reachable by some other
71 - * control-flow path.
72 - * Represents the block that would otherwise be reached if this return were
73 - * not present, along with the test conditions that are checked to decide if
74 - * this return should be taken. The fallthrough object is only non-null if
75 - * the fallthrough block is reachable by some other control-flow path.
76 - */
77 - fallthrough: {
78 - block: BlockId;
79 - tests: Array<NodePath<t.Expression>> | null;
80 - } | null;
81 -};
82 -
83 -/**
84 - * Models a `throw <expression>`. Because this is an exception case, the actual value
85 - * being thrown does not matter and isn't modeled.
86 - */
87 -export type ThrowTerminal = {
88 - kind: "throw";
89 -};
90 -
91 -/**
92 - * Models a if/else conditional branch, which can occur from explicit `if` statements or
93 - * from implicit conditionals such as whether to (re)enter or exit a loop.
94 - */
95 -export type IfTerminal = {
96 - kind: "if";
97 - /**
98 - * The condition being tested to determine whether to enter the consequent (if test is truthy)
99 - * or else the alternate
100 - */
101 - test: NodePath<t.Expression>;
102 - consequent: BlockId;
103 - alternate: BlockId;
104 -};
105 -
106 -/**
107 - * Models a switch statement, where a test value is checked against multiple cases. Default cases
108 - * and fallthrough is made explicit: there will always be exactly one case with a null `test`, which
109 - * represents the default case. Fallthrough is modeled explicitly via gotos in the case blocks.
110 - */
111 -export type SwitchTerminal = {
112 - kind: "switch";
113 - /**
114 - * The expression being evaluated against the possible cases
115 - */
116 - test: NodePath<t.Expression>;
117 - cases: Array<{
118 - /**
119 - * The expression to test to determine if this block should be entered
120 - * null indicates a `default` case, which (bc JS!) may not be the last case.
121 - */
122 - test: NodePath<t.Expression> | null;
123 - block: BlockId;
124 - }>;
125 -};
compiler/forget/packages/babel-plugin-react-forget-legacy/src/ControlFlowGraph/buildCFG.ts deleted
-586
@@ -1,586 +0,0 @@
1 -import { NodePath } from "@babel/traverse";
2 -import * as t from "@babel/types";
3 -import { pathUnion } from "../Common/PathUnion";
4 -import { assertExhaustive } from "../Common/utils";
5 -import { invariant } from "../CompilerError";
6 -import * as IR from "../IR";
7 -import CFGBuilder from "./CFGBuilder";
8 -import {
9 - CFG,
10 - IfTerminal,
11 - ReturnTerminal,
12 - Terminal,
13 - ThrowTerminal,
14 -} from "./ControlFlowGraph";
15 -
16 -/**
17 - * Lower a function declaration into a control flow graph that models aspects of
18 - * control flow that are necessary for memoization. Notably, only control flow
19 - * that occurs at statement granularity is modeled (eg `if`, `for`, `return`
20 - * statements), not control flow at the expression level (ternaries or boolean
21 - * short-circuiting). Throw semantics are also not modeled: in general exceptions
22 - * are treated as exceptional conditions that invalidate memoization.
23 - *
24 - * TODO: consider modeling control-flow at expression level for even more fine-
25 - * grained reactivity.
26 - */
27 -export function buildCFG(func: IR.Func): CFG {
28 - const builder = new CFGBuilder();
29 - for (const topLevel of func.body) {
30 - buildStatement(builder, topLevel.ast, topLevel);
31 - }
32 - return builder.build();
33 -}
34 -
35 -/**
36 - * Helper to lower a statement
37 - */
38 -function buildStatement(
39 - builder: CFGBuilder,
40 - stmtPath: NodePath<t.Statement>,
41 - parent: IR.FuncTopLevel,
42 - label: string | null = null
43 -) {
44 - builder.associateParentBlock(parent);
45 - const stmt = pathUnion(stmtPath);
46 - switch (stmt.type) {
47 - case "ThrowStatement": {
48 - /**
49 - * TODO: consider what to do if there is a try/catch
50 - * one idea is to emit an instruction in the catch block to tell React
51 - * that the memo cache is invalid (not sure that it is though)
52 - */
53 - const terminal: ThrowTerminal = { kind: "throw" };
54 - builder.terminate(terminal);
55 - return;
56 - }
57 - case "ReturnStatement": {
58 - const argument = stmt.get("argument");
59 - const fallthrough = builder.reserve();
60 - const terminal: ReturnTerminal = {
61 - kind: "return",
62 - value: hasNode(argument) ? argument : null,
63 - fallthrough: {
64 - block: fallthrough.id,
65 - tests: builder.controlExpressions(),
66 - },
67 - };
68 - builder.terminateWithContinuation(terminal, fallthrough);
69 - return;
70 - }
71 - case "IfStatement": {
72 - // Block for code following the if
73 - const continuationBlock = builder.reserve();
74 - builder.condition(stmt.get("test"), () => {
75 - // Block for the consequent (if the test is truthy)
76 - const consequentBlock = builder.enter((blockId) => {
77 - // TODO: add associateParentBlock() to all enter calls
78 - // or maybe make it a required arg (?)
79 - buildStatement(builder, stmt.get("consequent"), parent);
80 - return {
81 - kind: "goto",
82 - block: continuationBlock.id,
83 - fallthrough: null,
84 - tests: null,
85 - };
86 - });
87 - // Block for the alternate (if the test is not truthy)
88 - let alternateBlock = null;
89 - const alternate = stmt.get("alternate");
90 - if (hasNode(alternate)) {
91 - alternateBlock = builder.enter((blockId) => {
92 - buildStatement(builder, alternate, parent);
93 - return {
94 - kind: "goto",
95 - block: continuationBlock.id,
96 - fallthrough: null,
97 - tests: null,
98 - };
99 - });
100 - } else {
101 - // If there is no else clause, use the continuation directly
102 - alternateBlock = continuationBlock.id;
103 - }
104 - const terminal: IfTerminal = {
105 - kind: "if",
106 - test: stmt.get("test"),
107 - consequent: consequentBlock,
108 - alternate: alternateBlock,
109 - };
110 - builder.terminateWithContinuation(terminal, continuationBlock);
111 - });
112 - return;
113 - }
114 - case "BlockStatement": {
115 - stmt.get("body").forEach((s) => buildStatement(builder, s, parent));
116 - return;
117 - }
118 - case "BreakStatement": {
119 - const block = builder.lookupBreak(stmt.node.label?.name ?? null);
120 - const continuationBlock = builder.reserve();
121 - builder.terminateWithContinuation(
122 - {
123 - kind: "goto",
124 - block,
125 - // An unlabeled break within a switch statement only bypasses the fallthrough
126 - // branch, which is already reachable otherwise. This type of break doesn't
127 - // bypass normal control flow and doesn't need to record a fallthrough.
128 - fallthrough: {
129 - block: continuationBlock.id,
130 - tests: builder.controlExpressions(),
131 - },
132 - },
133 - continuationBlock
134 - );
135 - return;
136 - }
137 - case "ContinueStatement": {
138 - const block = builder.lookupContinue(stmt.node.label?.name ?? null);
139 - const continuationBlock = builder.reserve();
140 - builder.terminateWithContinuation(
141 - {
142 - kind: "goto",
143 - block,
144 - fallthrough: {
145 - block: continuationBlock.id,
146 - tests: builder.controlExpressions(),
147 - },
148 - },
149 - continuationBlock
150 - );
151 - return;
152 - }
153 - case "ForInStatement": {
154 - // Block used to evaluate whether to (re)enter or exit the loop
155 - const conditionalBlock = builder.reserve();
156 - // Block for code following the loop
157 - const continuationBlock = builder.reserve();
158 - const loopBlock = builder.enter((blockId) => {
159 - return builder.loop(
160 - label,
161 - conditionalBlock.id,
162 - continuationBlock.id,
163 - () => {
164 - buildStatement(builder, stmt.get("body"), parent);
165 - return {
166 - kind: "goto",
167 - block: conditionalBlock.id,
168 - fallthrough: null,
169 - tests: null,
170 - };
171 - }
172 - );
173 - });
174 - // End the block leading up to the loop and jump to the conditional block
175 - builder.terminateWithContinuation(
176 - {
177 - kind: "goto",
178 - block: conditionalBlock.id,
179 - fallthrough: null,
180 - },
181 - conditionalBlock
182 - );
183 - /**
184 - * Terminate the conditional block using the <right> value as the test condition:
185 - * this conceptually represents that the value of <right> influences which branch
186 - * is taken (if it has properties enter the loop, if no properties exit to the continuation)
187 - */
188 - const terminal: IfTerminal = {
189 - kind: "if",
190 - test: stmt.get("right"),
191 - consequent: loopBlock,
192 - alternate: continuationBlock.id,
193 - };
194 - builder.terminateWithContinuation(terminal, continuationBlock);
195 - return;
196 - }
197 - case "ForOfStatement": {
198 - // Block used to evaluate whether to (re)enter or exit the loop
199 - const conditionalBlock = builder.reserve();
200 - // Block for code following the loop
201 - const continuationBlock = builder.reserve();
202 - /**
203 - * Build the loop body, each iteration loops back to the conditional block
204 - * to check whether to continue or exit
205 - */
206 - const loopBlock = builder.enter((blockId) => {
207 - return builder.loop(
208 - label,
209 - conditionalBlock.id,
210 - continuationBlock.id,
211 - () => {
212 - buildStatement(builder, stmt.get("body"), parent);
213 - return {
214 - kind: "goto",
215 - block: conditionalBlock.id,
216 - fallthrough: null,
217 - tests: null,
218 - };
219 - }
220 - );
221 - });
222 - // End the block leading up to the loop and jump to the conditional block
223 - builder.terminateWithContinuation(
224 - {
225 - kind: "goto",
226 - block: conditionalBlock.id,
227 - fallthrough: null,
228 - },
229 - conditionalBlock
230 - );
231 - /**
232 - * Terminate the conditional block using the <right> value as the test condition:
233 - * this conceptually represents that the value of <right> influences which branch
234 - * is taken (even though it isn't actually a boolean check in practice)
235 - */
236 - const terminal: IfTerminal = {
237 - kind: "if",
238 - test: stmt.get("right"),
239 - consequent: loopBlock,
240 - alternate: continuationBlock.id,
241 - };
242 - builder.terminateWithContinuation(terminal, continuationBlock);
243 - return;
244 - }
245 - case "ForStatement": {
246 - /**
247 - * The initializer is evaluated once prior to entering the loop.
248 - * here we are not concerned about scoping, so we can push the
249 - * initializer to the end of of the block leading up to the loop
250 - */
251 - const init = stmt.get("init");
252 - if (hasNode(init)) {
253 - builder.push(init);
254 - }
255 - // Block used to evaluate whether to (re)enter or exit the loop
256 - const conditionalBlock = builder.reserve();
257 - // Block for code following the loop
258 - const continuationBlock = builder.reserve();
259 - /**
260 - * Block for the updater, which runs after each iteration (including upon `continue`)
261 - * Generally this would increment or decrement the loop index variable
262 - */
263 - const updateBlock = builder.reserve();
264 - const update = stmt.get("update");
265 - if (hasNode(update)) {
266 - updateBlock.body.push(
267 - stmt.get("update") as any as NodePath<t.Statement>
268 - );
269 - }
270 - builder.complete(updateBlock, {
271 - kind: "goto",
272 - block: conditionalBlock.id,
273 - fallthrough: null,
274 - });
275 - /**
276 - * Construct the loop itself: the loop body wraps around to the update block
277 - * and the update block is also set as the `continue` target
278 - */
279 - const loopBlock = builder.enter((blockId) => {
280 - return builder.loop(label, updateBlock.id, continuationBlock.id, () => {
281 - buildStatement(builder, stmt.get("body"), parent);
282 - return {
283 - kind: "goto",
284 - block: updateBlock.id,
285 - fallthrough: null,
286 - };
287 - });
288 - });
289 - // End the block leading up to the loop, jumping to the conditional block
290 - builder.terminateWithContinuation(
291 - {
292 - kind: "goto",
293 - block: conditionalBlock.id,
294 - fallthrough: null,
295 - },
296 - conditionalBlock
297 - );
298 -
299 - let terminal: Terminal;
300 - const test = stmt.get("test");
301 - if (hasNode(test)) {
302 - /**
303 - * Terminate the conditional block with the test conditional of the for statement:
304 - * if the condition is true enter the loop block, else exit to the continuation
305 - */
306 - terminal = {
307 - kind: "if",
308 - test,
309 - consequent: loopBlock,
310 - alternate: continuationBlock.id,
311 - };
312 - } else {
313 - /**
314 - * If there is no test, then the "conditional" block unconditionally re-enters the loop.
315 - * this will create an indirection, but `shrink()` will eliminate this in post-processing.
316 - */
317 - terminal = {
318 - kind: "goto",
319 - block: loopBlock,
320 - fallthrough: null,
321 - };
322 - }
323 - builder.terminateWithContinuation(terminal, continuationBlock);
324 - return;
325 - }
326 - case "DoWhileStatement": {
327 - // Block for code following the loop
328 - const continuationBlock = builder.reserve();
329 - // Loop body
330 - const loopBlock = builder.enter((loopBlock) => {
331 - return builder.loop(label, loopBlock, continuationBlock.id, () => {
332 - buildStatement(builder, stmt.get("body"), parent);
333 - /**
334 - * the loop terminates with the while condition, either looping
335 - * around (consequent) or exiting to the continuation (alternate)
336 - */
337 - const terminal: IfTerminal = {
338 - kind: "if",
339 - test: stmt.get("test"),
340 - consequent: loopBlock,
341 - alternate: continuationBlock.id,
342 - };
343 - return terminal;
344 - });
345 - });
346 - // do-while unconditionally enters the loop
347 - builder.terminateWithContinuation(
348 - { kind: "goto", block: loopBlock, fallthrough: null },
349 - continuationBlock
350 - );
351 - return;
352 - }
353 - case "WhileStatement": {
354 - // Block used to evaluate whether to (re)enter or exit the loop
355 - const conditionalBlock = builder.reserve();
356 - // Block for code following the loop
357 - const continuationBlock = builder.reserve();
358 - // Loop body
359 - const loopBlock = builder.enter((blockId) => {
360 - return builder.loop(
361 - label,
362 - conditionalBlock.id,
363 - continuationBlock.id,
364 - () => {
365 - buildStatement(builder, stmt.get("body"), parent);
366 - return {
367 - kind: "goto",
368 - block: conditionalBlock.id,
369 - fallthrough: null,
370 - tests: null,
371 - };
372 - }
373 - );
374 - });
375 - /**
376 - * The code leading up to the loop must jump to the conditional block,
377 - * to evaluate whether to enter the loop or bypass to the continuation.
378 - */
379 - builder.terminateWithContinuation(
380 - {
381 - kind: "goto",
382 - block: conditionalBlock.id,
383 - fallthrough: null,
384 - },
385 - conditionalBlock
386 - );
387 - /**
388 - * The conditional block is empty and exists solely as conditional for
389 - * (re)entering or exiting the loop
390 - */
391 - const terminal: IfTerminal = {
392 - kind: "if",
393 - test: stmt.get("test"),
394 - consequent: loopBlock,
395 - alternate: continuationBlock.id,
396 - };
397 - // Complete the conditional and continue with code after the loop
398 - builder.terminateWithContinuation(terminal, continuationBlock);
399 - return;
400 - }
401 - case "LabeledStatement": {
402 - const label = stmt.node.label.name;
403 - const body = stmt.get("body");
404 - switch (body.node.type) {
405 - case "ForInStatement":
406 - case "ForOfStatement":
407 - case "ForStatement":
408 - case "WhileStatement":
409 - case "DoWhileStatement": {
410 - // Labeled loops can not only break out of the loop to the subsequent code,
411 - // but may also continue to a subsequent iteration of the loop. This means
412 - // the label must be associated specifically with the loop statement (and
413 - // the block generated to test for (re)entry to the block), so special-case
414 - // by passing the label down.
415 - buildStatement(builder, stmt.get("body"), parent, label);
416 - break;
417 - }
418 - default: {
419 - // All other statements create a continuation block to allow `break` to jump
420 - // to the continuation.
421 - const continuationBlock = builder.reserve();
422 - builder.label(label, continuationBlock.id, () => {
423 - buildStatement(builder, stmt.get("body"), parent);
424 - });
425 - // TODO: if there is no break, this can cause code to be split across
426 - // two blocks unnecessarily (ie where the continuation has only one
427 - // incoming edge). shrink() could detect this case and merge the blocks.
428 - builder.terminateWithContinuation(
429 - {
430 - kind: "goto",
431 - block: continuationBlock.id,
432 - fallthrough: null,
433 - },
434 - continuationBlock
435 - );
436 - }
437 - }
438 - return;
439 - }
440 - case "SwitchStatement": {
441 - // Block following the switch
442 - const continuationBlock = builder.reserve();
443 - /**
444 - * The goto target for any cases that fallthrough, which initially starts
445 - * as the continuation block and is then updated as we iterate through cases
446 - * in reverse order.
447 - */
448 - let fallthrough = continuationBlock.id;
449 - /**
450 - * Iterate through cases in reverse order, so that previous blocks can fallthrough
451 - * to successors
452 - */
453 - const cases = [];
454 - let hasDefault = false;
455 - for (let ii = stmt.get("cases").length - 1; ii >= 0; ii--) {
456 - const case_: NodePath<t.SwitchCase> = stmt.get("cases")[ii];
457 - const test = case_.get("test");
458 - if (!hasNode(test)) {
459 - invariant(
460 - !hasDefault,
461 - "Expected at most one `default` branch, this code should have failed to parse"
462 - );
463 - hasDefault = true;
464 - }
465 - const block = builder.enter((_blockId) => {
466 - /**
467 - * Use loop() to save the break target, passing null for the continue target
468 - * since switch doesn't support continue
469 - */
470 - return builder.switch(
471 - stmt.get("discriminant"),
472 - continuationBlock.id,
473 - () => {
474 - case_
475 - .get("consequent")
476 - .forEach((consequent) =>
477 - buildStatement(builder, consequent, parent)
478 - );
479 - /**
480 - * always generate a fallthrough, this may be dead code if there was
481 - * an explicit break
482 - */
483 - return {
484 - kind: "goto",
485 - block: fallthrough,
486 - fallthrough: null,
487 - tests: null,
488 - };
489 - }
490 - );
491 - });
492 - cases.push({ test: hasNode(test) ? test : null, block });
493 - fallthrough = block;
494 - }
495 - /**
496 - * it doesn't matter for our analysis purposes, but reverse the order of the cases
497 - * back to the original to make it match the original code/intent.
498 - */
499 - cases.reverse();
500 - /**
501 - * If there wasn't an explicit default case, generate one to model the fact that execution
502 - * could bypass any of the other cases and jump directly to the continuation.
503 - */
504 - if (!hasDefault) {
505 - cases.push({ test: null, block: continuationBlock.id });
506 - }
507 -
508 - builder.terminateWithContinuation(
509 - { kind: "switch", test: stmt.get("discriminant"), cases },
510 - continuationBlock
511 - );
512 - return;
513 - }
514 - case "TryStatement": {
515 - /**
516 - * NOTE: Accurately modeling control flow within a try statement would require treating
517 - * effectively every expression as a possible branch point (since almost any expression can throw).
518 - * Instead, we model the try statement as an atomic unit from a control-flow perspective,
519 - * and rely on other passes to handle codegen for try statements
520 - */
521 - buildStatement(builder, stmt.get("block"), parent);
522 - const handler = stmt.get("handler");
523 - if (hasNode(handler)) {
524 - // TODO: consider whether we need to track the param
525 - buildStatement(builder, handler.get("body"), parent);
526 - }
527 - const finalizer = stmt.get("finalizer");
528 - if (hasNode(finalizer)) {
529 - buildStatement(builder, finalizer, parent);
530 - }
531 - return;
532 - }
533 - case "ClassDeclaration":
534 - case "DebuggerStatement":
535 - case "DeclareClass":
536 - case "DeclareExportAllDeclaration":
537 - case "DeclareExportDeclaration":
538 - case "DeclareFunction":
539 - case "DeclareInterface":
540 - case "DeclareModule":
541 - case "DeclareModuleExports":
542 - case "DeclareOpaqueType":
543 - case "DeclareTypeAlias":
544 - case "DeclareVariable":
545 - case "EmptyStatement":
546 - case "EnumDeclaration":
547 - case "ExportAllDeclaration":
548 - case "ExportDefaultDeclaration":
549 - case "ExportNamedDeclaration":
550 - case "ExpressionStatement":
551 - case "FunctionDeclaration":
552 - case "ImportDeclaration":
553 - case "InterfaceDeclaration":
554 - case "OpaqueType":
555 - case "TypeAlias":
556 - case "TSDeclareFunction":
557 - case "TSEnumDeclaration":
558 - case "TSExportAssignment":
559 - case "TSImportEqualsDeclaration":
560 - case "TSInterfaceDeclaration":
561 - case "TSModuleDeclaration":
562 - case "TSNamespaceExportDeclaration":
563 - case "TSTypeAliasDeclaration":
564 - case "VariableDeclaration":
565 - case "WithStatement": {
566 - builder.push(stmtPath);
567 - return;
568 - }
569 - default: {
570 - return assertExhaustive(
571 - stmt,
572 - `Unsupported statement kind '${
573 - (stmt as any as NodePath<t.Statement>).type
574 - }'`
575 - );
576 - }
577 - }
578 -}
579 -
580 -/**
581 - * Equivalent to `NodePath.hasNode()` which is missing from older versions of
582 - * @babel.
583 - */
584 -function hasNode<T>(path: NodePath<T | null | undefined>): path is NodePath<T> {
585 - return path.node != null;
586 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/ControlFlowGraph/index.ts deleted
-3
@@ -1,3 +0,0 @@
1 -export * from "./buildCFG";
2 -export * from "./CFGBuilder";
3 -export * from "./ControlFlowGraph";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/DepGraph/SCCGraph.ts deleted
-180
@@ -1,180 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { setFirst } from "../Common/utils";
9 -import { invariant } from "../CompilerError";
10 -import * as IR from "../IR";
11 -import { SCCGraphSnapshot, SCCVertexSnapshot } from "./SCCGraphSnapshot";
12 -import type { ValVertex } from "./ValGraph";
13 -
14 -/**
15 - * SCC Dependency Graph
16 - *
17 - * SCCGraph is used to express the dependence relation between SCC, or Strongly
18 - * Connect Componnets in {@link ValGraph}. In other words, SCCGraph is the
19 - * "condensation" of {@link ValGraph}. It's constructed by contracting SCCs of
20 - * {@link ValVertex} into {@link SCCVertex}s. The resulting graph is guranteed
21 - * to be a DAG, or Directed Acyclic Graph, which has the property to be
22 - * topologically sorted, or scheduled, that we leveraged to perform a change
23 - * propagation process that we called "Dependency Reduction".
24 - *
25 - * Although customized, it is insipred by TDG (Task Dependency Graph) that are
26 - * often used in build systems (e.g. Build Systems à la Carte).
27 - */
28 -export class SCCGraph {
29 - /**
30 - * SCCGraph is represented as an (modified) adjacency list:
31 - * It's a collection of {@link SCCVertex}, and every vertex stores a set of
32 - * outgoing edges (as well as incoming edges in our version).
33 - */
34 - vertices: Set<SCCVertex>;
35 -
36 - /**
37 - * SCCGraph are constructed as a whole.
38 - */
39 - constructor(vertices: Set<SCCVertex>) {
40 - this.vertices = vertices;
41 - }
42 -
43 - /**
44 - * Add a (@param from) --depends on--> (@param to) edge (depdenents) while
45 - * setting up the "backward pointer" (dependencies).
46 - */
47 - addEdge(from: SCCVertex, to: SCCVertex) {
48 - from.outgoings.add(to);
49 - to.incomings.add(from);
50 - }
51 -
52 - /**
53 - * Remove a (@param from) --depends on--> (@param to) edge (depdenents) while
54 - * clearing up the "backward pointer" (dependencies).
55 - */
56 - removeEdge(from: SCCVertex, to: SCCVertex) {
57 - from.outgoings.delete(to);
58 - to.incomings.delete(from);
59 - }
60 -
61 - /**
62 - * A topological-ordered reducer (or scheduler, in the build system term) over
63 - * the {@link SCCGraph} using Kahn's algorithm.
64 - * @see https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm
65 - *
66 - * A fully reduced SCCGraph is consisted of only vertices that have no edges,
67 - * i.e. all {@link SCCVertex.incomings} and {@link SCCVertex.outgoings} have
68 - * been contracted to {@link SCCVertex.inputs} payload.
69 - */
70 - reduce() {
71 - // A queue of all vertices with no incoming edges (0-degree).
72 - const queue = Array.from(this.vertices.values()).filter(
73 - (vertex) => vertex.incomings.size === 0
74 - );
75 -
76 - while (queue.length !== 0) {
77 - const cur = queue.shift();
78 - invariant(cur, "Unexpected Null.");
79 -
80 - // for all its outgoing edges (dependent)
81 - cur.outgoings.forEach((out: SCCVertex) => {
82 - invariant(
83 - out.incomings.has(cur),
84 - "Dependencies and dependents are not paired."
85 - );
86 -
87 - // Propagate inputs to out.
88 - // Except out is itself an Input then the propagration should stop.
89 - if (!out.isInput()) {
90 - cur.inputs.forEach((input) => {
91 - // N.B. out's inputs is a union of all its incomings' inputs.
92 - out.inputs.add(input);
93 - });
94 - }
95 -
96 - // Current dependency reduced. Remove the edge.
97 - this.removeEdge(cur, out);
98 -
99 - // If all incoming edges have been reduced. Add to working queue.
100 - if (out.incomings.size === 0) {
101 - queue.push(out);
102 - }
103 - });
104 - }
105 -
106 - invariant(
107 - this.irreducibleVertices.length === 0,
108 - "DAG should always be fully reduced."
109 - );
110 - }
111 -
112 - /**
113 - * A collcetion of irreducible vertices (due to cycle).
114 - */
115 - get irreducibleVertices(): SCCVertex[] {
116 - return Array.from(this.vertices.values()).filter(
117 - (vertex) => vertex.incomings.size !== 0
118 - );
119 - }
120 -
121 - snapshot() {
122 - return new SCCGraphSnapshot(this);
123 - }
124 -}
125 -
126 -/**
127 - * Strongly Connected Components of {@link ValGraph}.
128 - * Vertices of {@link SCCGraph}.
129 - */
130 -export class SCCVertex {
131 - /**
132 - * Members.
133 - */
134 - members: Set<ValVertex>;
135 -
136 - /**
137 - * Members of a group share the same set of inputs (physically in memory).
138 - */
139 - inputs: Set<IR.ReactiveVal>;
140 -
141 - /**
142 - * Vertices that depend on this vertex (Dependents).
143 - * Outgoing edges ("pointing to") of this vertex.
144 - */
145 - outgoings: Set<SCCVertex>;
146 -
147 - /**
148 - * Vertices that this vertex depends on (Dependencies).
149 - * Incoming edges ("pointing from") of this vertex.
150 - */
151 - incomings: Set<SCCVertex>;
152 -
153 - constructor() {
154 - this.members = new Set();
155 - this.inputs = new Set();
156 - this.outgoings = new Set();
157 - this.incomings = new Set();
158 - }
159 -
160 - /**
161 - * Add @param v to the SCC.
162 - *
163 - * Note that this change the {@link ValVertex}'s input pointing to the inputs
164 - * of SCC so that we can still query {@link ValGraph} for inputs.
165 - */
166 - add(v: ValVertex) {
167 - this.members.add(v);
168 -
169 - v.inputs.forEach((input) => this.inputs.add(input));
170 - v.scc = this;
171 - }
172 -
173 - isInput() {
174 - return this.members.size === 1 && IR.isInputVal(setFirst(this.members).val);
175 - }
176 -
177 - snapshot() {
178 - return new SCCVertexSnapshot(this);
179 - }
180 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/DepGraph/SCCGraphSnapshot.ts deleted
-88
@@ -1,88 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as IR from "../IR";
9 -import type { SCCGraph, SCCVertex } from "./SCCGraph";
10 -import type { MapValue, ValVertexSnapshot } from "./ValGraphSnapshot";
11 -import { reactiveInputTag, stableInputTag } from "./ValGraphSnapshot";
12 -
13 -export class SCCGraphSnapshot {
14 - vertices: SCCVertexSnapshot[];
15 -
16 - constructor(sccGraph: SCCGraph) {
17 - this.vertices = [...sccGraph.vertices.values()].map((v) => v.snapshot());
18 - }
19 -
20 - toMap() {
21 - const lnum = (k: string) => parseInt(k.split(/\[(\d+):/)[1]);
22 -
23 - return new Map(
24 - this.vertices
25 - .map((c) => c.toMapEntry())
26 - .sort(([a], [b]) => lnum(a) - lnum(b))
27 - );
28 - }
29 -}
30 -
31 -export class SCCVertexSnapshot {
32 - members: ValVertexSnapshot[];
33 -
34 - inputs: IR.ValSnapshot[];
35 -
36 - outgoings: ValVertexSnapshot[][];
37 -
38 - incomings: ValVertexSnapshot[][];
39 -
40 - constructor(sccVertex: SCCVertex) {
41 - this.members = [...sccVertex.members].map((v) => v.snapshot());
42 - this.inputs = [...sccVertex.inputs].map((v) => v.snapshot());
43 - this.outgoings = [...sccVertex.outgoings].map((v) =>
44 - [...v.members].map((m) => m.snapshot())
45 - );
46 - this.incomings = [...sccVertex.incomings].map((v) =>
47 - [...v.members].map((m) => m.snapshot())
48 - );
49 - }
50 -
51 - toString() {
52 - const vs = this.members.map((v) => v.val.toString()).join(",");
53 - return `[${vs}]`;
54 - }
55 -
56 - isInput() {
57 - return this.members.length === 1 && this.members[0].val.isInput;
58 - }
59 -
60 - isReactive() {
61 - return this.members.length === 1 && this.members[0].val.isReactive;
62 - }
63 -
64 - toMapEntry(): [string, MapValue] {
65 - const data: MapValue = {};
66 - const key = this.toString();
67 - const inputs = this.inputs.map((val) => val.toString());
68 - const dependencies = this.incomings.map((d) => stringifyVertices(d));
69 - const dependents = this.outgoings.map((d) => stringifyVertices(d));
70 -
71 - if (dependencies.length > 0) data.dependencies = dependencies;
72 - if (dependents.length > 0) data.dependents = dependents;
73 - if (this.isInput()) {
74 - // Set a prototype as a tag in pretty-format.
75 - const tag = this.isReactive() ? reactiveInputTag : stableInputTag;
76 - Object.setPrototypeOf(data, tag);
77 - } else {
78 - data.inputs = inputs;
79 - }
80 -
81 - return [key, data];
82 - }
83 -}
84 -
85 -function stringifyVertices(members: ValVertexSnapshot[]) {
86 - const vs = members.map((v) => v.val.toString()).join(",");
87 - return `[${vs}]`;
88 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/DepGraph/ValGraph.ts deleted
-275
@@ -1,275 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { invariant } from "../CompilerError";
9 -import * as IR from "../IR";
10 -import { SCCGraph, SCCVertex } from "./SCCGraph";
11 -import { ValGraphSnapshot, ValVertexSnapshot } from "./ValGraphSnapshot";
12 -
13 -/**
14 - * Val Dependency Graph
15 - *
16 - * ValGraph is used to express the dependence relation between {@link IR.Val},
17 - * materialzed as {@link ValVertex}. Although it's specialized for our purpose,
18 - * It is inspired by traditional graph IRs e.g. the DDG (Data Dependence Graph)
19 - * and PDG (Program Dependence Graph) that are often found in the compilers
20 - * community e.g. LLVM, HotSpot JVM.
21 - *
22 - * N.B.
23 - * 1. ValGraph can be cyclic. Cicular dependencies (established by either
24 - * direct reference or infered mutation) are intended to be handled as a group
25 - * like mutatually recursive function during the condensation to form a
26 - * {@link SCCGraph} which is a DAG.
27 - * 2. ValGraph is intended to capture the dependence relation between program
28 - * components (i.e. materalized as {@link IR.Val} at the granularity that we
29 - * are concerned about. See {@link DepGraphAnalysis} for the details.
30 - * 3. Due to the nature of undecidability and the limitations from being
31 - * flow-insensitive, mutation (e.g. re-assignment) are handled by assuming
32 - * the worst case where every mutable {@link Ref} may be mutated by,
33 - * therefore depends on, any other {@link Val} that is syntactically possible
34 - * to flow into it. Therefore, the dependency relation captured by this graph
35 - * is intentionally conservative and contains false positives.
36 - */
37 -
38 -export class ValGraph {
39 - /**
40 - * ValGraph is represented as an (modified) adjacency list:
41 - * It's a collection of {@link ValVertex}, and every vertex stores a set of
42 - * outgoing edges (as well as incoming edges in our version).
43 - *
44 - * The collection is a mapping from {@link IR.Val}s to their corresponding
45 - * vertices to ease the lookups needed during construction.
46 - */
47 - vertices: Map<IR.Val, ValVertex> = new Map();
48 -
49 - constructor(funcEnv: IR.FuncEnv) {
50 - // Prepopulate vertices for declarations
51 - for (const [_, b] of funcEnv.decls.entries()) {
52 - this.getOrCreateVertex(b);
53 - }
54 -
55 - // ...and may be free vars.
56 - if (funcEnv.includeFreeVars) {
57 - for (const [_, b] of funcEnv.freeVars.entries()) {
58 - this.getOrCreateVertex(b);
59 - }
60 - }
61 - }
62 -
63 - /**
64 - * Add a (@param from) --is dependency for--> (@param to) edge (dependents) while
65 - * setting up the "backward pointer" (dependencies).
66 - */
67 - addEdge(from: ValVertex, to: ValVertex) {
68 - from.outgoings.add(to);
69 - to.incomings.add(from);
70 - }
71 -
72 - /**
73 - * Remove a (@param from) --is dependency for--> (@param to) edge (dependents) while
74 - * clearing up the "backward pointer" (dependencies).
75 - */
76 - removeEdge(from: ValVertex, to: ValVertex) {
77 - from.outgoings.delete(to);
78 - to.incomings.delete(from);
79 - }
80 -
81 - /**
82 - * @returns the vertex associated with the @param val if it exists, and if it
83 - * does not, create an new vertex and @returns it instead.
84 - *
85 - * This is used to handle the possible presence of "forward references" where
86 - * we may discover {@link dependencies} before we actually visited them and
87 - * created vertices for them.
88 - */
89 - getOrCreateVertex(val: IR.Val): ValVertex {
90 - let vertex = this.vertices.get(val);
91 - if (!vertex) {
92 - vertex = new ValVertex(this, val);
93 - }
94 - return vertex;
95 - }
96 -
97 - /**
98 - * Tarjan's strongly connected components algorithm.
99 - * @see https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm
100 - */
101 - tarjan(): Set<SCCVertex> {
102 - const outputs = new Set<SCCVertex>();
103 - const stack: ValVertex[] = [];
104 -
105 - let index = 0;
106 - for (const v of this.vertices.values()) {
107 - if (v.index === -1) strongConnect(v);
108 - }
109 -
110 - function strongConnect(v: ValVertex) {
111 - v.index = index;
112 - v.lowlink = index;
113 - index++;
114 - stack.push(v);
115 - v.onStack = true;
116 -
117 - // Successors of v
118 - for (const w of v.outgoings) {
119 - if (w.index === -1) {
120 - // Successor w has not yet been visited; recurse on it.
121 - strongConnect(w);
122 - // since w is reachable by v, pick the lowest link.
123 - v.lowlink = Math.min(v.lowlink, w.lowlink);
124 - } else if (w.onStack) {
125 - // Successor w is in stack S and hence in the current SCC.
126 - // see if w has a lower index to becomes v's lowlink.
127 - v.lowlink = Math.min(v.lowlink, w.index);
128 - // If w is not on stack, then (v, w) is an edge pointing to an SCC
129 - // already found (since w has been visited) and must be ignored.
130 - }
131 - }
132 -
133 - // If v is a root node, pop the stack and generate an SCC
134 - if (v.lowlink === v.index) {
135 - const scc = new SCCVertex();
136 - let w;
137 - while (w !== v) {
138 - w = stack.pop();
139 - invariant(w, "stack should not be empty");
140 - w.onStack = false;
141 - scc.add(w);
142 - }
143 - outputs.add(scc);
144 - }
145 - }
146 -
147 - return outputs;
148 - }
149 -
150 - /**
151 - * Graph condensation based on Tarjan.
152 - */
153 - condense(): SCCGraph {
154 - const dag = new SCCGraph(this.tarjan());
155 -
156 - // (v.SCC, w.SCC) is an edge in SCCGraph only if they are different and
157 - // (v, w) is an edge in ValGRaph.
158 - for (const scc of dag.vertices) {
159 - for (const v of scc.members) {
160 - for (const w of v.outgoings) {
161 - invariant(v.scc, "v belongs to a SCC.");
162 - invariant(w.scc, "w belongs to a SCC.");
163 - if (v.scc !== w.scc) {
164 - dag.addEdge(v.scc, w.scc);
165 - }
166 - }
167 - }
168 - }
169 -
170 - return dag;
171 - }
172 -
173 - snapshot() {
174 - return new ValGraphSnapshot(this);
175 - }
176 -}
177 -
178 -/**
179 - * Each vertex represents an unique {@link IR.Val}.
180 - * Vertices of {@link ValGraph}.
181 - */
182 -export class ValVertex {
183 - /**
184 - * The belonging graph.
185 - */
186 - graph: ValGraph;
187 -
188 - /**
189 - * The corresponding {@link IR.Val}
190 - */
191 - val: IR.Val;
192 -
193 - /**
194 - * The set of reactive values flowed into this vertex directly.
195 - */
196 - ownInputs: Set<IR.ReactiveVal>;
197 -
198 - /**
199 - * Vertices that depend on this vertex (Dependents).
200 - * Outgoing edges ("pointing to") of this vertex.
201 - */
202 - outgoings: Set<ValVertex>;
203 -
204 - /**
205 - * Vertices that this vertex depends on (Dependencies).
206 - * Incoming edges ("pointing from") of this vertex.
207 - */
208 - incomings: Set<ValVertex>;
209 -
210 - /**
211 - * Used by Tarjan algorithm.
212 - */
213 - index: number;
214 - lowlink: number;
215 - onStack: boolean;
216 -
217 - /**
218 - * Belonging {@link SCCVertex}
219 - */
220 - scc: SCCVertex | undefined;
221 -
222 - constructor(graph: ValGraph, val: IR.Val) {
223 - this.graph = graph;
224 - this.val = val;
225 - this.ownInputs = new Set();
226 - this.incomings = new Set();
227 - this.outgoings = new Set();
228 - this.index = -1;
229 - this.lowlink = -1;
230 - this.onStack = false;
231 - this.scc = undefined;
232 -
233 - this.graph.vertices.set(val, this);
234 - }
235 -
236 - /**
237 - * This getter @return the latest set of reactive values considered inputs.
238 - * - In returns {@link this.ownInputs} initially until it's grouped into SCC.
239 - */
240 - get inputs(): Set<IR.ReactiveVal> {
241 - if (this.scc) {
242 - return this.scc.inputs;
243 - } else {
244 - return this.ownInputs;
245 - }
246 - }
247 -
248 - /**
249 - * Refine a vertex as "Reactive Input" (i.e. roots) of the graph, which
250 - * should only include the val itself in the inputs payload.
251 - */
252 - refineToReactiveInput(this: ValVertex) {
253 - invariant(IR.isReactiveVal(this.val), "This val must be a ReactiveVal.");
254 - invariant(
255 - this.inputs.size === 0 ||
256 - (this.inputs.size === 1 && this.inputs.has(this.val)),
257 - "Inputs was previously empty or only contain itself."
258 - );
259 - this.inputs.add(this.val);
260 - }
261 -
262 - /**
263 - * In initial construction, dependencies are discovered as (to, from) pair
264 - * due to the nature of AST visitation. This method provides a convenient
265 - * way to add them as (from, to) edges.
266 - */
267 - addDependency(val: IR.Val): void {
268 - const dependency = this.graph.getOrCreateVertex(val);
269 - this.graph.addEdge(dependency, this);
270 - }
271 -
272 - snapshot() {
273 - return new ValVertexSnapshot(this);
274 - }
275 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/DepGraph/ValGraphSnapshot.ts deleted
-71
@@ -1,71 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as IR from "../IR";
9 -import type { ValGraph, ValVertex } from "./ValGraph";
10 -
11 -export class ValGraphSnapshot {
12 - vertices: ValVertexSnapshot[];
13 -
14 - constructor(valGraph: ValGraph) {
15 - this.vertices = [...valGraph.vertices.values()].map((v) => v.snapshot());
16 - }
17 -
18 - toMap() {
19 - return new Map(this.vertices.map((c) => c.toMapEntry()));
20 - }
21 -}
22 -
23 -export type MapValue = {
24 - inputs?: string[];
25 - dependencies?: string[];
26 - dependents?: string[];
27 -};
28 -
29 -export class ReactiveInput {}
30 -export const reactiveInputTag = new ReactiveInput();
31 -
32 -export class StableInput {}
33 -export const stableInputTag = new StableInput();
34 -
35 -export class ValVertexSnapshot {
36 - val: IR.ValSnapshot;
37 -
38 - inputs: IR.ValSnapshot[];
39 -
40 - outgoings: IR.ValSnapshot[];
41 -
42 - incomings: IR.ValSnapshot[];
43 -
44 - constructor(valVertex: ValVertex) {
45 - this.val = valVertex.val.snapshot();
46 - this.inputs = [...valVertex.inputs].map((v) => v.snapshot());
47 - this.outgoings = [...valVertex.outgoings].map((v) => v.val.snapshot());
48 - this.incomings = [...valVertex.incomings].map((v) => v.val.snapshot());
49 - }
50 -
51 - toMapEntry(): [string, MapValue] {
52 - const data: MapValue = {};
53 - const key = this.val.toString();
54 - const inputs = this.inputs.map((val) => val.toString());
55 - const dependencies = this.incomings.map((val) => val.toString());
56 - const dependents = this.outgoings.map((val) => val.toString());
57 -
58 - if (dependencies.length > 0) data.dependencies = dependencies;
59 - if (dependents.length > 0) data.dependents = dependents;
60 -
61 - if (this.val.isInput) {
62 - // Set a prototype as a tag in pretty-format.
63 - const tag = this.val.isReactive ? reactiveInputTag : stableInputTag;
64 - Object.setPrototypeOf(data, tag);
65 - } else {
66 - data.inputs = inputs;
67 - }
68 -
69 - return [key, data];
70 - }
71 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/DepGraph/index.ts deleted
-18
@@ -1,18 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * Graph IRs in the compiler
10 - */
11 -
12 -export * from "./ValGraph";
13 -
14 -export * from "./ValGraphSnapshot";
15 -
16 -export * from "./SCCGraph";
17 -
18 -export * from "./SCCGraphSnapshot";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Diagnostic.ts deleted
-335
@@ -1,335 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/core";
9 -import * as t from "@babel/types";
10 -import { assertExhaustive } from "./Common/utils";
11 -import { Name } from "./IR/Func";
12 -
13 -export enum DiagnosticLevel {
14 - Error = "Error",
15 - Warning = "Warning",
16 -}
17 -type DiagnosticMessage = {
18 - level: DiagnosticLevel;
19 - body: string;
20 - suggestion: string | null;
21 -};
22 -export type Diagnostic = {
23 - code: ErrorCode;
24 - path: NodePath | null;
25 -} & DiagnosticMessage;
26 -
27 -class ForgetError extends Error {
28 - constructor(message: string) {
29 - super(message);
30 - this.name = DiagnosticLevel.Error;
31 - }
32 -}
33 -class ForgetWarning extends Error {
34 - constructor(message: string) {
35 - super(message);
36 - this.name = DiagnosticLevel.Warning;
37 - }
38 -}
39 -
40 -export function mapDiagnosticLevelToErrorCtor(level: DiagnosticLevel) {
41 - switch (level) {
42 - case DiagnosticLevel.Error:
43 - return ForgetError;
44 - case DiagnosticLevel.Warning:
45 - return ForgetWarning;
46 - default:
47 - assertExhaustive(level, `Unhandled diagnostic level: ${level}`);
48 - }
49 -}
50 -
51 -export function printPathCodeFrame(
52 - reason: string,
53 - level: DiagnosticLevel,
54 - path: NodePath
55 -) {
56 - return path
57 - .buildCodeFrameError(reason, mapDiagnosticLevelToErrorCtor(level))
58 - .toString();
59 -}
60 -
61 -export function printDiagnostic({
62 - code,
63 - body,
64 - level,
65 - path,
66 - suggestion,
67 -}: Diagnostic): string {
68 - let buffer = `${body} (${code})`;
69 - if (suggestion != null) {
70 - buffer = `${buffer}\n\n${suggestion}`;
71 - }
72 - if (path != null) {
73 - return printPathCodeFrame(buffer, level, path);
74 - } else {
75 - buffer = `${level}: ${buffer}`;
76 - }
77 - return buffer;
78 -}
79 -
80 -export function buildDiagnostic(opts: DiagnosticOpts): Diagnostic {
81 - const msg = getDiagnosticMessage(opts);
82 - const { code, path } = opts;
83 - return {
84 - code,
85 - path,
86 - ...msg,
87 - };
88 -}
89 -
90 -function getSource(node: NodePath | NodePath[] | null): string | null {
91 - if (node == null) {
92 - return null;
93 - }
94 - return Array.isArray(node)
95 - ? node.map((n) => n.getSource()).join(", ")
96 - : node.getSource();
97 -}
98 -
99 -/**
100 - * Utility type to enforce ErrorCode format. This should only be used in the
101 - * `ErrorCode` type to validate the format, elsewhere we should just pass
102 - * regular strings.
103 - */
104 -type ParseCode<T> = T extends `E${number}` ? T : never;
105 -export const NoErrorCode = "None";
106 -// prettier-ignore
107 -export type ErrorCode =
108 - | typeof NoErrorCode
109 - | ParseCode<"E0001">
110 - | ParseCode<"E0002">
111 - | ParseCode<"E0003">
112 - | ParseCode<"E0004">
113 - | ParseCode<"E0005">
114 - | ParseCode<"E0006">
115 - | ParseCode<"E0007">
116 - | ParseCode<"E0008">
117 - | ParseCode<"E0009">
118 - | ParseCode<"E0010">
119 - | ParseCode<"E0011">
120 - | ParseCode<"E0012">
121 - | ParseCode<"E0013">
122 - | ParseCode<"E0014">
123 - | ParseCode<"E0015">
124 - | ParseCode<"E0016">
125 - | ParseCode<"E0017">
126 - | ParseCode<"E0018">
127 - | ParseCode<"E0019">
128 - | ParseCode<"E0020">
129 - | ParseCode<"E0021">
130 - ;
131 -
132 -// prettier-ignore
133 -export type DiagnosticOpts =
134 - | { code: "E0001"; path: NodePath; context: null }
135 - | { code: "E0002"; path: NodePath; context: null }
136 - | { code: "E0003"; path: NodePath<t.Expression>; context: null }
137 - | { code: "E0004"; path: NodePath; context: null }
138 - | {
139 - code: "E0005";
140 - path: NodePath<t.ObjectProperty>;
141 - context: { callee: NodePath | NodePath[]; key: string };
142 - }
143 - | {
144 - code: "E0006";
145 - path: NodePath;
146 - context: {
147 - callee: NodePath | NodePath[];
148 - tupleLength: number;
149 - attemptedLength: number;
150 - };
151 - }
152 - | {
153 - code: "E0007";
154 - path: NodePath;
155 - context: {
156 - callee: NodePath | NodePath[];
157 - init: NodePath | NodePath[];
158 - };
159 - }
160 - | { code: "E0008"; path: NodePath; context: { input: NodePath } }
161 - | { code: "E0009"; path: NodePath; context: { call: NodePath } }
162 - | { code: "E0010"; path: NodePath; context: { name: Name } }
163 - | { code: "E0011"; path: null; context: null }
164 - | { code: "E0012"; path: NodePath; context: null }
165 - | { code: "E0013"; path: NodePath; context: { name: Name } }
166 - | { code: "E0014"; path: NodePath; context: null }
167 - | { code: "E0015"; path: null; context: { error: Error } }
168 - | { code: "E0016"; path: NodePath; context: null }
169 - | { code: "E0017"; path: NodePath; context: null }
170 - | { code: "E0018"; path: NodePath; context: null }
171 - | { code: "E0019"; path: NodePath; context: null }
172 - | { code: "E0020"; path: NodePath; context: null }
173 - | { code: "E0021"; path: NodePath; context: { name: Name } }
174 - ;
175 -
176 -function getDiagnosticMessage(opts: DiagnosticOpts): DiagnosticMessage {
177 - switch (opts.code) {
178 - case "E0001":
179 - return {
180 - level: DiagnosticLevel.Warning,
181 - body: "Forget does not currently support rest params in Component props.",
182 - suggestion: `Consider destructuring \`${getSource(opts.path)}\`.`,
183 - };
184 - case "E0002":
185 - return {
186 - level: DiagnosticLevel.Warning,
187 - body: "Forget does not currently support tracking the Component props object as a whole.",
188 - suggestion: `Consider destructuring \`${getSource(opts.path)}\`.`,
189 - };
190 - case "E0003":
191 - return {
192 - level: DiagnosticLevel.Warning,
193 - body: "Expression-body React functions are ignored.",
194 - suggestion: null,
195 - };
196 - case "E0004":
197 - return {
198 - level: DiagnosticLevel.Error,
199 - body: "React compiler currently only supports hooks at the Component's top level scope.",
200 - suggestion: `Move \`${opts.path}\` out of \`${opts.path.scope.path.parentPath}\`.`,
201 - };
202 - case "E0005":
203 - return {
204 - level: DiagnosticLevel.Warning,
205 - body: `\`${getSource(
206 - opts.context.callee
207 - )}\` does not have the member \`${
208 - opts.context.key
209 - }\` in its return value.`,
210 - suggestion: `Remove \`${opts.path}\`.`,
211 - };
212 - case "E0006":
213 - return {
214 - level: DiagnosticLevel.Warning,
215 - body: `\`${getSource(
216 - opts.context.callee
217 - )}\` returns a tuple of length ${opts.context.tupleLength}, got ${
218 - opts.context.attemptedLength
219 - } instead.`,
220 - suggestion: `Remove \`${opts.path}\`.`,
221 - };
222 - case "E0007":
223 - return {
224 - level: DiagnosticLevel.Warning,
225 - body: `\`${getSource(
226 - opts.context.callee
227 - )}\` does not have a return value.`,
228 - suggestion: `Do \`${getSource(opts.context.init)}\` instead.`,
229 - };
230 - case "E0008":
231 - return {
232 - level: DiagnosticLevel.Error,
233 - body: "Values used to derive inputs (e.g. passed to Hooks) can only be immutably borrowed afterwards.",
234 - suggestion: `If you are mutating this value, try finish the local mutation before:
235 -
236 -\`\`\`
237 -${opts.context.input}
238 -\`\`\`
239 -
240 -
241 -If you are only reading this value, try annotating the value with \`/*readonly*/\` or \`/*immut*/\` in:
242 -\`\`\`
243 -${getSource(opts.path)}
244 -\`\`\``,
245 - };
246 - case "E0009":
247 - return {
248 - level: DiagnosticLevel.Error,
249 - body: "React compiler currently only supports call expressions when using hooks.",
250 - suggestion: `Try changing \`${getSource(opts.path)}\` to \`${
251 - opts.context.call
252 - }\``,
253 - };
254 - case "E0010":
255 - const parentSource = getSource(opts.path.parentPath);
256 - return {
257 - level: DiagnosticLevel.Error,
258 - body: `\`${opts.context.name}\` is an immutable value enforced by React compiler, and cannot be reassigned or mutated.`,
259 - suggestion:
260 - parentSource == null
261 - ? "Remove the reassignment"
262 - : `Remove the reassignment: \`${parentSource}\``,
263 - };
264 - case "E0011":
265 - return {
266 - level: DiagnosticLevel.Error,
267 - body: "Function has multiple returns and `bailOnMultipleReturns` is enabled.",
268 - suggestion: null,
269 - };
270 - case "E0012":
271 - return {
272 - level: DiagnosticLevel.Error,
273 - body: "Function uses `useRef` hook and `bailOnUseRef` is enabled.",
274 - suggestion: null,
275 - };
276 - case "E0013":
277 - return {
278 - level: DiagnosticLevel.Error,
279 - body: `\`${opts.context.name}\` is an immutable value enforced by React compiler, and cannot be mutated.`,
280 - suggestion: `Remove the mutation: \`${getSource(
281 - opts.path.parentPath
282 - )}\``,
283 - };
284 - case "E0014":
285 - return {
286 - level: DiagnosticLevel.Error,
287 - body: "Function uses a ref-like value from props, arguments or context and `bailOnUseRef` is enabled.",
288 - suggestion: null,
289 - };
290 - case "E0015":
291 - return {
292 - level: DiagnosticLevel.Error,
293 - body: `Unexpected error detected: ${opts.context.error}.`,
294 - suggestion: null,
295 - };
296 - case "E0016":
297 - return {
298 - level: DiagnosticLevel.Error,
299 - body: "A React hook call is under an invalid namespace.",
300 - suggestion: null,
301 - };
302 - case "E0017":
303 - return {
304 - level: DiagnosticLevel.Error,
305 - body: "A hook call is under a valid namespace, but invalid according to eslint.",
306 - suggestion: null,
307 - };
308 - case "E0018":
309 - return {
310 - level: DiagnosticLevel.Error,
311 - body: "React components should not be called directly, but instead constructed using JSX. Other functions should not be capitalized.",
312 - suggestion: null,
313 - };
314 - case "E0019":
315 - return {
316 - level: DiagnosticLevel.Error,
317 - body: "React components not defined on the top level are not supported by Forget.",
318 - suggestion: null,
319 - };
320 - case "E0020":
321 - return {
322 - level: DiagnosticLevel.Error,
323 - body: "Forget does not support the use of the arguments object.",
324 - suggestion: null,
325 - };
326 - case "E0021":
327 - return {
328 - level: DiagnosticLevel.Error,
329 - body: `Input "${opts.context.name}" is detected in a DepGraph cycle. This is dangenrous since Forget may (though not always) generate broken code like accessing "c_input" before it is defined.`,
330 - suggestion: null,
331 - };
332 - default:
333 - assertExhaustive(opts, `Unhandled error code ${opts}`);
334 - }
335 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/Func.ts deleted
-312
@@ -1,312 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { Binding, NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { invariant } from "../CompilerError";
11 -import * as DepGraph from "../DepGraph";
12 -import * as BabelUtils from "./babel-utils";
13 -import { FuncTopLevel } from "./FuncTopLevel";
14 -import {
15 - BindingVal,
16 - createBindingVal,
17 - createFreeVal,
18 - ExprVal,
19 - FreeVal,
20 - Ref,
21 - ValKind,
22 -} from "./Val";
23 -
24 -/**
25 - * IR Function.
26 - */
27 -export class Func {
28 - name: Name;
29 -
30 - ast: NodePath<BabelUtils.NonMethodFunction>;
31 -
32 - kind: FuncKind;
33 -
34 - paramKind: FuncParamKind;
35 -
36 - get params(): BindingVal[] {
37 - return [...this.env.decls.values()].filter((v) => v.kind === ValKind.Param);
38 - }
39 -
40 - // FunctionBody: FunctionStatementList: StatementListItem
41 - body: FuncTopLevel[] = [];
42 -
43 - /**
44 - * Number of return statements. Does not count a potential implicit return at
45 - * the end of the function.
46 - */
47 - returnCount: number = 0;
48 -
49 - isImplicitReturn: boolean = true;
50 -
51 - env: FuncEnv;
52 -
53 - depGraph: DepGraph.ValGraph;
54 -
55 - constructor(
56 - ast: NodePath<BabelUtils.NonMethodFunction>,
57 - name: Name = undefined,
58 - kind: FuncKind = FuncKind.Unknown,
59 - localMutationThroughFreeVars: boolean = false
60 - ) {
61 - this.name = name;
62 - this.ast = ast;
63 - this.kind = kind;
64 - this.paramKind = FuncParamKind.NonSimple;
65 - this.env = new FuncEnv(this, localMutationThroughFreeVars);
66 - this.depGraph = new DepGraph.ValGraph(this.env);
67 - }
68 -}
69 -
70 -/**
71 - * Fucntion Environments
72 - */
73 -export class FuncEnv {
74 - /**
75 - * Its belonging IR function.
76 - */
77 - func: Func;
78 -
79 - /**
80 - * If the environment includes free vars.
81 - */
82 - includeFreeVars: boolean;
83 -
84 - /**
85 - * Declarative Bindings (Top-level).
86 - *
87 - * This correpondences to the "Function Environment Records" in ECMA-262,
88 - * which is used to represent the top-level scope of a function, and contains
89 - * bindings for the top-level declarations within that function.
90 - *
91 - * @see https://tc39.es/ecma262/#sec-function-environment-records
92 - */
93 - decls: Map<Name, BindingVal>;
94 -
95 - /**
96 - * Expressions.
97 - *
98 - * This is used to represent expressions occurred within this function that
99 - * could be interesting to the compiler optimizations, e.g. common
100 - * sub-expressions that could be lifted/treated as declarations.
101 - */
102 - exprs: Map<NodePath<t.Expression>, ExprVal>;
103 -
104 - /**
105 - * Free Variables
106 - *
107 - * This correpondences to the `[[OuterEnv]]` of the "Function Environment
108 - * Records" (i.e. the [[Environment]]` slot of the instantiated
109 - * "ECMAScript Function Objects") AND all the "Environment Records" that are
110 - * transitively accesible through the `[[OuterEnv]]` slot.
111 - *
112 - * It is used to represent the acumulation of all the outer environments of
113 - * the function, and contains all the free variables closed over.
114 - *
115 - * @see https://tc39.es/ecma262/#sec-ecmascript-function-objects
116 - */
117 - freeVars: Map<Name, FreeVal>;
118 -
119 - constructor(func: Func, includeFreeVars: boolean) {
120 - this.func = func;
121 - this.includeFreeVars = includeFreeVars;
122 -
123 - /**
124 - * Add all own bindings from @param scope as default-kinded {@link Val}.
125 - * To ensure their identity being stable, it's critical that they are only
126 - * created once here and later analysis should look them up from here and
127 - * refine their properties via {@link Val.refineTo} which mutates.
128 - */
129 - this.decls = new Map(
130 - Object.entries(func.ast.scope.bindings).map(([name, binding]) => [
131 - name,
132 - createBindingVal(binding),
133 - ])
134 - );
135 -
136 - /**
137 - * TODO: exprs are currently populated during {@link RefKindInfer} when
138 - * iterating over the JSX tree which basically use this as a cache. We
139 - * should consider splitting the initialization and the analysis, despite
140 - * that means we have to do it in two AST passes.
141 - */
142 - this.exprs = new Map();
143 -
144 - /**
145 - * Add all free bindings referenced from @param scope as {@link FreeVal}.
146 - */
147 - this.freeVars = new Map();
148 - if (this.includeFreeVars) {
149 - for (const refIdent of this.#getFuncOuterScopedReferences(func.ast)) {
150 - const name = refIdent.node.name;
151 - let val = this.freeVars.get(name);
152 - if (!val) {
153 - val = createFreeVal(name);
154 - this.freeVars.set(name, val);
155 - }
156 - val.reference(refIdent);
157 - }
158 - }
159 - }
160 -
161 - /**
162 - * @returns RF-level bindings created by @param path.
163 - */
164 - #getFuncScopedBindings(path: NodePath): Binding[] {
165 - return BabelUtils.getScopedBindings(path, this.func.ast.scope);
166 - }
167 -
168 - /**
169 - * @returns identifiers referencing above-RF-level bindings under @param path.
170 - */
171 - #getFuncOuterScopedReferences(path: NodePath): NodePath<t.Identifier>[] {
172 - return BabelUtils.getOuterScopedReferences(path, this.func.ast.scope);
173 - }
174 -
175 - /**
176 - * @returns identifiers referencing RF-level bindings under @param path.
177 - */
178 - #getFuncScopedReferences(
179 - path: NodePath
180 - ): NodePath<t.Identifier | t.JSXIdentifier>[] {
181 - return BabelUtils.getScopedReferences(path, this.func.ast.scope).filter(
182 - (refIdent) => {
183 - if (refIdent.isJSXIdentifier()) return true;
184 -
185 - // We have to perform a doucble check against `val.references` (the
186 - // source of truth) to be sound.
187 - const val = this.decls.get(refIdent.node.name);
188 - invariant(
189 - val !== undefined,
190 - refIdent
191 - .buildCodeFrameError(`Val of ${refIdent.node.name} must exists`)
192 - .toString()
193 - );
194 -
195 - const maybeRef = val.references.get(refIdent);
196 - return Boolean(maybeRef);
197 - }
198 - );
199 - }
200 -
201 - /**
202 - * @return all declarative {@link BindingVal} originated from @param path.
203 - */
204 - getDeclsFrom(path: NodePath): BindingVal[] {
205 - const decls: BindingVal[] = [];
206 -
207 - for (const b of this.#getFuncScopedBindings(path)) {
208 - const val = this.decls.get(b.identifier.name);
209 - invariant(val, `Decl "${b.identifier.name}" must exists.`);
210 - decls.push(val);
211 - }
212 -
213 - return decls;
214 - }
215 -
216 - /**
217 - * @return all {@link Ref} to declarations originated from @param path.
218 - */
219 - getRefsToDeclsFrom(path: NodePath): Ref<BindingVal>[] {
220 - return this.#getFuncScopedReferences(path).map((refIdent) => {
221 - const val = this.decls.get(refIdent.node.name);
222 - invariant(
223 - val !== undefined,
224 - refIdent
225 - .buildCodeFrameError(`Val of ${refIdent.node.name} must exists`)
226 - .toString()
227 - );
228 -
229 - const ref = val.references.get(refIdent);
230 - invariant(
231 - ref !== undefined,
232 - refIdent
233 - .buildCodeFrameError(
234 - `Ref of ${refIdent.node.type} ${refIdent.node.name} must exists`
235 - )
236 - .toString()
237 - );
238 -
239 - return ref;
240 - });
241 - }
242 -
243 - /**
244 - * @returns all free variables originated from @param path
245 - */
246 - getFreeVarsFrom(path: NodePath): Ref<FreeVal>[] {
247 - if (!this.includeFreeVars) return [];
248 -
249 - return this.#getFuncOuterScopedReferences(path).map((refIdent) => {
250 - const val = this.freeVars.get(refIdent.node.name);
251 - invariant(
252 - val !== undefined,
253 - refIdent
254 - .buildCodeFrameError(`Val of ${refIdent.node.name} must exists`)
255 - .toString()
256 - );
257 -
258 - const ref = val.references.get(refIdent);
259 - invariant(
260 - ref !== undefined,
261 - refIdent
262 - .buildCodeFrameError(
263 - `Ref of ${refIdent.node.type} ${refIdent.node.name} must exists`
264 - )
265 - .toString()
266 - );
267 -
268 - return ref;
269 - });
270 - }
271 -}
272 -
273 -/**
274 - * React Function Kinds
275 - * @default Unset, e.g. when "use forget" is used.
276 - */
277 -export enum FuncKind {
278 - Unknown = "Unknown",
279 - Component = "Component",
280 - Hook = "Hook",
281 -}
282 -
283 -/**
284 - * React Function Param Kinds.
285 - * @default NonSimple
286 - * @see https://tc39.es/ecma262/#sec-static-semantics-issimpleparameterlist
287 - */
288 -export enum FuncParamKind {
289 - /**
290 - * FormalParamerers: [empty] or actually having empty bindings.
291 - */
292 - Empty,
293 - /**
294 - * IsSimpleParameterList and not Empty
295 - */
296 - Simple,
297 - /**
298 - * !IsSimpleParameterList and not Empty
299 - */
300 - NonSimple,
301 -}
302 -
303 -/**
304 - * Due to `var` hoisting and TDZ of lexical bindings, name should be sufficient
305 - * to uniquely identify function top-level bindings (e.g. props, states, hooks).
306 - * If needed, we can change this to unique symbol id in the future.
307 - */
308 -export type Name = String | undefined;
309 -
310 -export function hasMultipleReturn(func: Func): boolean {
311 - return func.isImplicitReturn ? func.returnCount > 0 : func.returnCount > 1;
312 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/FuncTopLevel.ts deleted
-113
@@ -1,113 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { FuncEnv } from "./Func";
11 -import { HookCall } from "./Hook";
12 -import { BindingVal, ExprVal, FreeVal, JSXTagVal, Ref, Val } from "./Val";
13 -
14 -/**
15 - * IR Func Top Level
16 - */
17 -export class FuncTopLevel {
18 - /**
19 - * Note that Babel treat Declaration <: Statement while ECMA-262 splits them:
20 - * StatementListItem: Declaration | Statement
21 - */
22 - ast: NodePath<t.Statement>;
23 -
24 - /**
25 - * Declaration:
26 - * HoistableDeclaration
27 - * ClassDeclaration
28 - * LexicalDeclaration
29 - */
30 - isDecl: boolean;
31 -
32 - /**
33 - * Declarations.
34 - */
35 - decls: BindingVal[];
36 -
37 - /**
38 - * References to declarations.
39 - */
40 - refsToDecls: Ref<BindingVal>[];
41 -
42 - /**
43 - * References of free vars.
44 - */
45 - refsToFreeVars: Ref<FreeVal>[];
46 -
47 - /**
48 - * References of expressions.
49 - */
50 - refsToExprs: Ref<ExprVal>[];
51 -
52 - /**
53 - * Hook Calls.
54 - */
55 - hookCalls: HookCall[] = [];
56 -
57 - /**
58 - * JSX Tree Roots.
59 - */
60 - jsxTreeRoots: JSXTagVal[] = [];
61 -
62 - /**
63 - * Potential control flow exits.
64 - */
65 - returnStmts: Map<NodePath<t.ReturnStatement>, number> = new Map();
66 -
67 - includeFreeVars: boolean;
68 -
69 - constructor(stmt: NodePath<t.Statement>, funcEnv: FuncEnv) {
70 - this.ast = stmt;
71 - this.isDecl = stmt.isDeclaration();
72 - this.decls = funcEnv.getDeclsFrom(stmt);
73 - this.refsToDecls = funcEnv.getRefsToDeclsFrom(stmt);
74 - this.refsToFreeVars = funcEnv.getFreeVarsFrom(stmt);
75 - this.refsToExprs = [];
76 - this.includeFreeVars = funcEnv.includeFreeVars;
77 - }
78 -
79 - /**
80 - * All usages.
81 - * - all references to declarations, regardless of the ref kind.
82 - * - all references to expressions.
83 - * - all references to free variables (behind a flag).
84 - */
85 - get uses(): Ref<Val>[] {
86 - return [
87 - ...this.refsToDecls,
88 - ...this.refsToExprs,
89 - ...(this.includeFreeVars ? this.refsToFreeVars : []),
90 - ];
91 - }
92 -
93 - /**
94 - * All usages that are considered potentially mutable (not readonly).
95 - */
96 - get mutableUses(): Ref<Val>[] {
97 - return this.uses.filter((use) => !use.immutable);
98 - }
99 -
100 - /**
101 - * All "defs".
102 - * - all declarations
103 - * - all expressions (yea they are immediately defined and referenced)
104 - * - all mutable uses
105 - */
106 - get defs(): Val[] {
107 - return [
108 - ...this.decls,
109 - ...this.refsToExprs.map((use) => use.val),
110 - ...this.mutableUses.map((use) => use.val),
111 - ];
112 - }
113 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/Hook.ts deleted
-632
@@ -1,632 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { Node, NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { assertExhaustive } from "../Common/utils";
11 -import { CompilerContext } from "../CompilerContext";
12 -import { invariant } from "../CompilerError";
13 -import type { Func, Name } from "./Func";
14 -import { refineToHookRetVal, Val } from "./Val";
15 -
16 -/**
17 - * IR Hook.
18 - *
19 - * {@link HookCall}: the compiler IR for "ret = useHook()" in source.
20 - * {@link Hook}: specifications for each hook.
21 - * {@link HookSig}: signatures for each hook.
22 - */
23 -
24 -export type HookCallExpr = t.CallExpression | t.OptionalCallExpression;
25 -
26 -/**
27 - * Hook Call.
28 - */
29 -export class HookCall {
30 - // AST of the call.
31 - call: NodePath<HookCallExpr>;
32 -
33 - // The Hook resolved from the call.
34 - hook: Hook;
35 -
36 - /**
37 - * Return values.
38 - */
39 - unused_retVals: Map<Name, Val>;
40 -
41 - /**
42 - * To guarantee that the @param hook was resolved from the @param call. It's
43 - * recommmended to use {@link resolveHookCall} as a factory instead.
44 - */
45 - private constructor(call: NodePath<HookCallExpr>, hook: Hook) {
46 - this.call = call;
47 - this.hook = hook;
48 - this.unused_retVals = new Map();
49 - }
50 -
51 - /**
52 - * Using this static factory method can guarantee to @returns a new instance
53 - * with its internal {@link Hook} resolved from the @param call.
54 - */
55 - static resolve(
56 - call: NodePath<HookCallExpr>,
57 - onInvalidHookNamespace?: (
58 - expression: t.Expression,
59 - isBuiltinHook: boolean
60 - ) => void
61 - ): HookCall | undefined {
62 - const maybeHook = matchHookCall(call.node, onInvalidHookNamespace);
63 - return maybeHook && new HookCall(call, maybeHook);
64 - }
65 -
66 - matchRetVals(irFunc: Func, context: CompilerContext) {
67 - matchHookCallRetVals(this, irFunc, context);
68 - }
69 -
70 - toString() {
71 - let name = this.hook.name;
72 - if (isCustomHook(this.hook) && this.hook.isNamedLikeBuiltin) {
73 - name += "%custom";
74 - }
75 - return name;
76 - }
77 -}
78 -
79 -/**
80 - * @returns the specific {@link Hook} resolved from @param call ast
81 - * @throws if @param call ast is not hook.
82 - *
83 - * This is more favorable than {@link resolveHookCall} when there is no need
84 - * to allocate an instance of {@link HookCall}.
85 - */
86 -export function matchHookCall(
87 - call: HookCallExpr,
88 - onInvalidHookNamespace?: (
89 - expression: t.Expression,
90 - isBuiltinHook: boolean
91 - ) => void
92 -): Hook | undefined {
93 - const calleeNode = call.callee;
94 - return matchHookNode(calleeNode, onInvalidHookNamespace);
95 -}
96 -
97 -function matchHookNode(
98 - node: Node,
99 - onInvalidHookNamespace?: (
100 - expression: t.Expression,
101 - isBuiltinHook: boolean
102 - ) => void
103 -): Hook | undefined {
104 - const isPascalCaseNameSpace = (ns: string) => /^[A-Z].*/.test(ns);
105 -
106 - // Base case: orphan identifier.
107 - if (t.isIdentifier(node)) {
108 - return matchHookName(node);
109 - }
110 - // Recursive case: within member expression.
111 - else if (
112 - (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) &&
113 - !node.computed
114 - ) {
115 - // Check substructure.
116 - let maybeHook = matchHookNode(node.property);
117 - if (!maybeHook) return undefined;
118 -
119 - // Following our ESLint plugin, lowercased namespaced hook-like call e.g.
120 - // `x.useHook`, `A.B.useHook` are considered as not hook.
121 - if (
122 - !(t.isIdentifier(node.object) && isPascalCaseNameSpace(node.object.name))
123 - ) {
124 - onInvalidHookNamespace?.(node.object, isBuiltinHook(maybeHook));
125 - return undefined;
126 - }
127 -
128 - // We need to double check the namespace to avoid being fooled
129 - // by cases e.g. `NonReact.useState`.
130 - const underReact =
131 - t.isIdentifier(node.object) &&
132 - node.object.name === "React" &&
133 - t.isIdentifier(node.property);
134 -
135 - if (underReact) {
136 - return maybeHook;
137 - }
138 -
139 - // Any other matches can only be qualified as custom hooks.
140 - return createCustomHook(maybeHook.name, true);
141 - }
142 - // Unknown pattern.
143 - else {
144 - return undefined;
145 - }
146 -}
147 -
148 -function matchHookName(ident: t.Identifier): Hook | undefined {
149 - if (!isHookLikeName(ident.name)) {
150 - return undefined;
151 - }
152 -
153 - // match with builtin hooks.
154 - switch (ident.name) {
155 - case "useState":
156 - return UseState;
157 - case "useReducer":
158 - return UseReducer;
159 - case "useContext":
160 - return UseContext;
161 - case "useRef":
162 - return UseRef;
163 - case "useEffect":
164 - return UseEffect;
165 - case "useLayoutEffect":
166 - return UseLayoutEffect;
167 - case "useCallback":
168 - return UseCallback;
169 - case "useMemo":
170 - return UseMemo;
171 - default:
172 - return createCustomHook(ident.name.slice(3));
173 - }
174 -}
175 -
176 -/**
177 - * Catch all identifiers that begin with "use" followed by an uppercase Latin
178 - * character to exclude identifiers like "user".
179 - */
180 -export function isHookLikeName(name: string): boolean {
181 - // TODO: Deprecate `_` along with its deprecation in react-hooks eslint
182 - return /^_?use[A-Z0-9].*$/.test(name);
183 -}
184 -
185 -/**
186 - * Hook ("Spec")
187 - *
188 - * We will provide the "spec" of builtin hooks. In the future, we may allow
189 - * custom hooks to specify there properties (stateful, effectful) and signature
190 - * (referential stablity and mutability of returned values) through either
191 - * annotations, naming conventions, or {@link CompilerOptions}.
192 - */
193 -export interface Hook {
194 - name: string;
195 -
196 - kind: HookKind;
197 -
198 - signature: HookSig;
199 -
200 - /**
201 - * Hooks that reflexively and transitively depends on builtin stateful hooks.
202 - * This is currently unused.
203 - */
204 - stateful: boolean;
205 -
206 - /**
207 - * Hooks that reflexively and transitively depends on builtin effectful hooks.
208 - * This is currently unused.
209 - */
210 - effectful: boolean;
211 -}
212 -
213 -export interface CustomHook extends Hook {
214 - isNamedLikeBuiltin: boolean;
215 -}
216 -
217 -export enum HookKind {
218 - // Custom Hooks.
219 - Custom = 0,
220 -
221 - // Builtin Hooks.
222 - UseState,
223 - UseReducer,
224 - UseContext,
225 - UseRef,
226 - UseEffect,
227 - UseLayoutEffect,
228 - UseCallback,
229 - UseMemo,
230 -}
231 -
232 -export function isBuiltinHook(hook: Hook) {
233 - return hook.kind > HookKind.Custom;
234 -}
235 -
236 -export function isCustomHook(hook: Hook): hook is CustomHook {
237 - return hook.kind === HookKind.Custom;
238 -}
239 -
240 -/**
241 - * Custom Hooks are hooks provided in the user space.
242 - *
243 - * Until we can tell from either cross-module analysis or user-provided spec,
244 - * we will have to assume the worst case scenarios where it's both stateful
245 - * and effectful.
246 - */
247 -export function createCustomHook(
248 - name: string,
249 - isNamedLikeBuiltin = false
250 -): CustomHook {
251 - return {
252 - name,
253 - isNamedLikeBuiltin,
254 - kind: HookKind.Custom,
255 - stateful: true,
256 - effectful: true,
257 - /**
258 - * Why is custom hook return values immutable?
259 - * @see https://my.workplace.com/groups/335063911811171/permalink/408024221181806/
260 - *
261 - * Tldr; even though mutating hook return values is allowed in today's React,
262 - * it's a bad pattern since it makes it unsafe for the custom hook to
263 - * memoize the return value: it's a quite broken contract.
264 - *
265 - * In Forget, we want to tighten up the cross-call immutable contract. That
266 - * being said, we should either bailout or make it a compiler error.
267 - *
268 - * TODO: error when mutating "wanted-immutable-but-actually-mutable" values.
269 - */
270 - signature: {
271 - retValues: {
272 - kind: "AnyPatternLike",
273 - forall: { immutable: true, stable: false },
274 - },
275 - },
276 - };
277 -}
278 -
279 -export const UseState: Hook = {
280 - name: "State",
281 - kind: HookKind.UseState,
282 - stateful: true,
283 - effectful: false,
284 - signature: {
285 - retValues: /* [state, setState] */ {
286 - kind: "ArrayPattern",
287 - self: { immutable: true, stable: false },
288 - elements: [
289 - { immutable: true, stable: false },
290 - { immutable: true, stable: true },
291 - ],
292 - },
293 - },
294 -};
295 -
296 -export const UseReducer: Hook = {
297 - name: "Reducer",
298 - kind: HookKind.UseReducer,
299 - stateful: true,
300 - effectful: false,
301 - signature: {
302 - retValues: /* [state, dispatch] */ {
303 - kind: "ArrayPattern",
304 - self: { immutable: true, stable: false },
305 - elements: [
306 - { immutable: true, stable: false },
307 - { immutable: true, stable: true },
308 - ],
309 - },
310 - },
311 -};
312 -
313 -export const UseContext: Hook = {
314 - name: "Context",
315 - kind: HookKind.UseContext,
316 - stateful: true,
317 - effectful: false,
318 - signature: {
319 - retValues: /* context value */ {
320 - kind: "AnyPatternLike",
321 - forall: { immutable: true, stable: false },
322 - },
323 - },
324 -};
325 -
326 -/**
327 - * How can ref be {@link IR.HookRetVal} while being mutable? Wouldn't it be
328 - * considered as {@link IR.InputVal}, which are supposed to be deeply immutable?
329 - *
330 - * Technically, `ref.current` shouldn't be read (i.e. unboxing the ref) in the
331 - * render phase, but there is nothing stops people from doing that yet. It's
332 - * also technically safe if the developers ensured `ref.current` is immutable.
333 - *
334 - * To minimize changes/surprises brought up to developers and existing codebase,
335 - * we'll therefore track `useRef` return values as inputs. The ref obj is marked
336 - * as stable but what inside `current` is not.
337 - *
338 - * TODO: in the future, we should add runtime check: if `ref.current` is read
339 - * in render and therefore becoming the inputs of cache key, we should generate
340 - * code (deeply?) `freeze` it on developer mode.
341 - *
342 - * @see https://fb.workplace.com/groups/335063911811171/permalink/380068057310756
343 - *
344 - */
345 -export const UseRef: Hook = {
346 - name: "Ref",
347 - kind: HookKind.UseRef,
348 - stateful: false,
349 - effectful: false,
350 - signature: {
351 - retValues: /* ref object */ {
352 - kind: "ObjectPattern",
353 - self: { immutable: false, stable: true },
354 - properties: {
355 - current: { immutable: false, stable: false },
356 - },
357 - },
358 - },
359 -};
360 -
361 -export const UseEffect: Hook = {
362 - name: "Effect",
363 - kind: HookKind.UseEffect,
364 - stateful: false,
365 - effectful: true,
366 - signature: {
367 - retValues: {
368 - kind: "Void",
369 - },
370 - },
371 -};
372 -
373 -export const UseLayoutEffect: Hook = {
374 - name: "LayoutEffect",
375 - kind: HookKind.UseLayoutEffect,
376 - stateful: false,
377 - effectful: true,
378 - signature: {
379 - retValues: {
380 - kind: "Void",
381 - },
382 - },
383 -};
384 -
385 -export const UseCallback: Hook = {
386 - name: "Callback",
387 - kind: HookKind.UseCallback,
388 - stateful: false,
389 - effectful: false,
390 - signature: {
391 - retValues: /* memoized callback */ {
392 - kind: "AnyPatternLike",
393 - forall: {
394 - immutable: true,
395 - stable: false,
396 - },
397 - },
398 - },
399 -};
400 -
401 -export const UseMemo: Hook = {
402 - name: "Memo",
403 - kind: HookKind.UseMemo,
404 - stateful: false,
405 - effectful: false,
406 - signature: {
407 - retValues: /* memoized value */ {
408 - kind: "AnyPatternLike",
409 - forall: {
410 - immutable: true,
411 - stable: false,
412 - },
413 - },
414 - },
415 -};
416 -
417 -/**
418 - * React Hook Signature
419 - *
420 - * Currenly, only well-known patterns and only own properties are specifiable
421 - * (i.e. 1-level shallow equality). We may add supports to more sophicated
422 - * patterns e.g. AssignmentPattern or RestElement if they became common.
423 - */
424 -
425 -type ValSig = Pick<Val, "immutable" | "stable">;
426 -
427 -/**
428 - * Currently we only care about return values of hooks.
429 - *
430 - * In the future we may need parameters but for now they are all universally
431 - * treated as immutably borrowing.
432 - */
433 -export type HookSig = {
434 - retValues: HookSigVariant;
435 -};
436 -
437 -type HookSigVariant = Void | AnyPatternLike | ArrayPattern | ObjectPattern;
438 -
439 -type Void = {
440 - kind: "Void";
441 -};
442 -
443 -type AnyPatternLike = {
444 - kind: "AnyPatternLike";
445 - // this will apply to all bindings coming from any PatternLike
446 - forall: ValSig;
447 -};
448 -
449 -type ArrayPattern = {
450 - kind: "ArrayPattern";
451 - self: ValSig;
452 - elements: ValSig[];
453 -};
454 -
455 -type ObjectPattern = {
456 - kind: "ObjectPattern";
457 - self: ValSig;
458 - properties: Record<string, ValSig>;
459 -};
460 -
461 -function matchHookCallRetVals(
462 - hookCall: HookCall,
463 - irFunc: Func,
464 - context: CompilerContext
465 -) {
466 - let lval: NodePath<t.LVal> | undefined = undefined;
467 - const parent = hookCall.call.parentPath;
468 -
469 - if (parent.isVariableDeclarator()) {
470 - // e.g. let a = useHook()
471 - lval = parent.get("id");
472 - } else if (parent.isExpressionStatement() || parent.isReturnStatement()) {
473 - // e.g. useHook()
474 - // e.g. return useHook()
475 - // We do not have any values assigned, so nothing to refine.
476 - return;
477 - }
478 -
479 - if (lval == null) {
480 - context.bailout("NonVarDeclHookCallParent", {
481 - code: "E0009",
482 - path: parent,
483 - context: { call: hookCall.call },
484 - });
485 - return;
486 - }
487 -
488 - const pattern = hookCall.hook.signature.retValues;
489 - switch (pattern.kind) {
490 - case "ArrayPattern":
491 - matchArrayPattern(pattern, lval, parent);
492 - break;
493 - case "AnyPatternLike":
494 - matchAnyPatternLike(pattern, lval);
495 - break;
496 - case "ObjectPattern":
497 - matchObjectPattern(pattern, lval, parent);
498 - break;
499 - case "Void":
500 - matchVoid(pattern, lval);
501 - break;
502 - default:
503 - assertExhaustive(pattern, `Unhandled pattern ${pattern}`);
504 - }
505 -
506 - function matchVoid(_pattern: Void, lvals: NodePath<t.LVal>) {
507 - if (lvals.isPatternLike()) {
508 - let init = lvals.parentPath.get("init");
509 - let callee = lvals.parentPath.get("init.callee");
510 - context.createDiagnostic({
511 - code: "E0007",
512 - path: lvals.parentPath,
513 - context: { callee, init },
514 - });
515 - }
516 - }
517 -
518 - function matchObjectPattern(
519 - pattern: ObjectPattern,
520 - lvals: NodePath<t.LVal>,
521 - parent: NodePath
522 - ) {
523 - // var/let/const {...} = ...
524 - if (lvals.isObjectPattern()) {
525 - const lvalsProps = lvals.get("properties");
526 - const patternProps = pattern.properties;
527 - lvalsProps.forEach((lvalsProp) => {
528 - const lvalsPropNode = lvalsProp.node;
529 - if (lvalsPropNode.type !== "ObjectProperty") return;
530 - if (!t.isIdentifier(lvalsPropNode.key)) return;
531 - if (!(lvalsPropNode.key.name in patternProps)) {
532 - const callee = parent.get("init.callee");
533 - context.createDiagnostic({
534 - code: "E0005",
535 - path: lvalsProp as NodePath<t.ObjectProperty>,
536 - context: { callee, key: lvalsPropNode.key.name },
537 - });
538 - return;
539 - }
540 - const sig = patternProps[lvalsPropNode.key.name];
541 - irFunc.env.getDeclsFrom(lvalsProp).forEach((val) => {
542 - refineToHookRetVal(val, hookCall, sig.immutable, sig.stable);
543 - });
544 - });
545 - }
546 - // var/let/const obj = ...
547 - else if (lvals.isIdentifier()) {
548 - irFunc.env.getDeclsFrom(lvals).forEach((val) => {
549 - refineToHookRetVal(
550 - val,
551 - hookCall,
552 - pattern.self.immutable,
553 - pattern.self.stable
554 - );
555 - });
556 - }
557 - // Unknown. Downgrade to the worst case.
558 - else {
559 - irFunc.env.getDeclsFrom(lvals).forEach((val) => {
560 - refineToHookRetVal(val, hookCall, false, false);
561 - });
562 - }
563 - }
564 -
565 - function matchAnyPatternLike(
566 - pattern: AnyPatternLike,
567 - lvals: NodePath<t.LVal>
568 - ) {
569 - if (lvals.isPatternLike()) {
570 - irFunc.env.getDeclsFrom(lvals).forEach((val) => {
571 - refineToHookRetVal(
572 - val,
573 - hookCall,
574 - pattern.forall.immutable,
575 - pattern.forall.stable
576 - );
577 - });
578 - }
579 - // Currenlty, the only non-PatternLike LVal are MemberExpression
580 - else {
581 - invariant(false, "Unreachable.");
582 - }
583 - }
584 -
585 - function matchArrayPattern(
586 - pattern: ArrayPattern,
587 - lvals: NodePath<t.LVal>,
588 - parent: NodePath
589 - ) {
590 - // var/let/const [...] = ...
591 - if (lvals.isArrayPattern()) {
592 - const lvalsEles = lvals.get("elements") as NodePath[];
593 - const patternEles = pattern.elements;
594 - lvalsEles.forEach((lvalsEle, n) => {
595 - if (n >= patternEles.length) {
596 - const callee = parent.get("init.callee");
597 - context.createDiagnostic({
598 - code: "E0006",
599 - path: lvalsEle,
600 - context: {
601 - callee,
602 - attemptedLength: lvalsEles.length,
603 - tupleLength: patternEles.length,
604 - },
605 - });
606 - return;
607 - }
608 - const eleSig = patternEles[n];
609 - irFunc.env.getDeclsFrom(lvalsEle).forEach((val) => {
610 - refineToHookRetVal(val, hookCall, eleSig.immutable, eleSig.stable);
611 - });
612 - });
613 - }
614 - // var/let/const arrObj = ...
615 - else if (lvals.isIdentifier()) {
616 - irFunc.env.getDeclsFrom(lvals).forEach((val) => {
617 - refineToHookRetVal(
618 - val,
619 - hookCall,
620 - pattern.self.immutable,
621 - pattern.self.stable
622 - );
623 - });
624 - }
625 - // Unknown. Downgrade to the worst case.
626 - else {
627 - irFunc.env.getDeclsFrom(lvals).forEach((val) => {
628 - refineToHookRetVal(val, hookCall, false, false);
629 - });
630 - }
631 - }
632 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/JSX.ts deleted
-173
@@ -1,173 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { pathUnion } from "../Common/PathUnion";
11 -import { assertExhaustive } from "../Common/utils";
12 -import { Func } from "./Func";
13 -import {
14 - createExprVal,
15 - createJSXTagVal,
16 - ExprVal,
17 - JSXTagVal,
18 - ValKind,
19 -} from "./Val";
20 -
21 -/**
22 - * React JSX Tree.
23 - */
24 -
25 -/**
26 - * Technically we don't need to distinguish fragments and elements and
27 - * they are lowered to `React.createElement` anyways.
28 - *
29 - * But since Babel and the JSX spec differentiate them syntactically, let's
30 - * call them JSX "tag" then.
31 - */
32 -export type JSXTag = t.JSXElement | t.JSXFragment;
33 -
34 -export class JSXTreeBuilder {
35 - #irFunc: Func;
36 - #rootTag: NodePath<JSXTag>;
37 -
38 - constructor(rootTag: NodePath<JSXTag>, irFunc: Func) {
39 - this.#irFunc = irFunc;
40 - this.#rootTag = rootTag;
41 - }
42 - build(): JSXTagVal {
43 - return this.#jsxTag(this.#rootTag);
44 - }
45 - /**
46 - * Construct a JSX tree and return the {@link JSXTagVal} of root.
47 - */
48 - #jsxTag(tagPath: NodePath<JSXTag>): JSXTagVal {
49 - const val = createJSXTagVal(tagPath);
50 -
51 - const unsafeParent = tagPath.findParent((path) => {
52 - if (
53 - t.isConditional(path) ||
54 - t.isLoop(path) ||
55 - t.isFunction(path) ||
56 - t.isJSXExpressionContainer(path) ||
57 - t.isSwitchStatement(path) ||
58 - t.isLogicalExpression(path)
59 - ) {
60 - return true;
61 - }
62 -
63 - // If Forget runs before Fbt, we should not memoize insde Fbt.
64 - // As the Fbt transform limits allowed content.
65 - // Unsure if this could be loosened within FbtParam.
66 - if (t.isJSXElement(path.node)) {
67 - const name = path.node.openingElement.name;
68 - if (t.isJSXIdentifier(name) && /[Ff]b[st]/.test(name.name)) {
69 - return true;
70 - }
71 - }
72 -
73 - return false;
74 - });
75 -
76 - val.isUnsafeToMemo =
77 - unsafeParent != null && unsafeParent.isDescendant(this.#irFunc.ast);
78 -
79 - const tag = pathUnion(tagPath);
80 - switch (tag.type) {
81 - // <JSXElement attr=ATTRIBUTES>CHILDREN</JSXElement>
82 - case "JSXElement":
83 - const attrs = tag.get("openingElement").get("attributes");
84 -
85 - for (const rawAttr of attrs) {
86 - const attr = pathUnion(rawAttr);
87 - switch (attr.type) {
88 - case "JSXAttribute":
89 - const attrVal = pathUnion(attr.get("value"));
90 - switch (attrVal.type) {
91 - case "JSXExpressionContainer":
92 - this.#expressionContainer(attrVal, val);
93 - break;
94 - case "JSXElement":
95 - case "JSXFragment":
96 - val.children.push(this.#jsxTag(attrVal));
97 - break;
98 - case "StringLiteral":
99 - case undefined:
100 - case null:
101 - break;
102 - default:
103 - assertExhaustive(
104 - attrVal,
105 - `Unhandled ${(attrVal as NodePath).type}.`
106 - );
107 - }
108 - break;
109 - case "JSXSpreadAttribute":
110 - val.children.push(this.#expression(attr.get("argument")));
111 - break;
112 - default:
113 - assertExhaustive(attr, "Unhandled `${(attr as NodePath).type}`.");
114 - }
115 - }
116 - this.#children(tag, val);
117 - break;
118 - case "JSXFragment":
119 - this.#children(tag, val);
120 - break;
121 - default:
122 - assertExhaustive(tag, `Unhandled ${(tag as NodePath).type}.`);
123 - }
124 - return val;
125 - }
126 - #children(tag: NodePath<JSXTag>, parent: JSXTagVal) {
127 - const children = tag.get("children");
128 - for (const rawChild of children) {
129 - const child = pathUnion(rawChild);
130 - switch (child.type) {
131 - case "JSXExpressionContainer":
132 - this.#expressionContainer(child, parent);
133 - break;
134 - case "JSXElement":
135 - case "JSXFragment":
136 - parent.children.push(this.#jsxTag(child));
137 - break;
138 - case "JSXText":
139 - // nothing interesting.
140 - break;
141 - case "JSXSpreadChild":
142 - // React doesn't support this.
143 - break;
144 - default:
145 - assertExhaustive(child, `Unhandled ${(child as NodePath).type}.`);
146 - }
147 - }
148 - }
149 - #expressionContainer(
150 - jsxExprContainer: NodePath<t.JSXExpressionContainer>,
151 - parent: JSXTagVal
152 - ) {
153 - const expr = jsxExprContainer.get("expression");
154 -
155 - // Find sub trees under JSXExpressionContainer e.g. {<JSX />}.
156 - // TODO: verify if we need this again??
157 - expr.traverse({
158 - JSXElement: (jsxEle) => {
159 - parent.children.push(this.#jsxTag(jsxEle));
160 - },
161 - JSXFragment: (jsxFrag) => {
162 - parent.children.push(this.#jsxTag(jsxFrag));
163 - },
164 - });
165 -
166 - if (expr.isExpression()) {
167 - parent.children.push(this.#expression(expr));
168 - }
169 - }
170 - #expression(expr: NodePath<t.Expression>): ExprVal {
171 - return createExprVal(expr, ValKind.Expr, true);
172 - }
173 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/PrettyPrinter.ts deleted
-172
@@ -1,172 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import generate from "@babel/generator";
9 -import * as t from "@babel/types";
10 -import * as IR from ".";
11 -import * as LIR from "../LIR";
12 -
13 -export default function prettyPrint(irFunc: IR.Func) {
14 - renameReactiveVal(irFunc);
15 -
16 - const commentedNodes: t.Node[] = [];
17 - addComments(irFunc, commentedNodes);
18 -
19 - let funcNode = irFunc.ast.node;
20 -
21 - let funcDecl: t.FunctionDeclaration | undefined;
22 -
23 - // Build new FunctionDeclaration from original FunctionExpression
24 - // or ArrowFunctionExpression
25 - if (
26 - t.isFunctionExpression(funcNode) ||
27 - t.isArrowFunctionExpression(funcNode)
28 - ) {
29 - const params = funcNode.params;
30 - let body: t.BlockStatement;
31 -
32 - if (t.isArrowFunctionExpression(funcNode)) {
33 - if (t.isExpression(funcNode.body)) {
34 - const stmt = t.expressionStatement(funcNode.body);
35 - body = t.blockStatement([stmt]);
36 - } else {
37 - body = funcNode.body;
38 - }
39 - } else {
40 - body = funcNode.body;
41 - }
42 -
43 - const name =
44 - irFunc.name !== undefined
45 - ? t.identifier(irFunc.name.toString())
46 - : t.identifier("_anno");
47 -
48 - const commentedNode = t.addComment(name, "leading", irFunc.kind);
49 - commentedNodes.push(commentedNode);
50 -
51 - funcDecl = t.functionDeclaration(name, params, body);
52 - if (irFunc.name === "Cell") console.log(funcDecl);
53 - } else if (t.isFunctionDeclaration(funcNode)) {
54 - funcDecl = funcNode;
55 -
56 - if (funcNode.id) {
57 - const commentedNode = t.addComment(funcNode.id, "leading", irFunc.kind);
58 - commentedNodes.push(commentedNode);
59 - }
60 - }
61 -
62 - if (funcDecl === undefined) {
63 - revertRenameReactiveVal(irFunc);
64 - return;
65 - }
66 -
67 - const babelOutput = generate(funcDecl, { concise: true }).code;
68 -
69 - revertRenameReactiveVal(irFunc);
70 - revertAddComments(commentedNodes);
71 -
72 - return babelOutput;
73 -}
74 -
75 -/**
76 - * Rename every {@link IR.ReactiveVal} by appending a `$` to the name.
77 - */
78 -export function renameReactiveVal(irFunc: IR.Func) {
79 - for (const [name, bVal] of irFunc.env.decls) {
80 - if (IR.isReactiveVal(bVal)) {
81 - irFunc.ast.scope.rename(`${name}`, `$${name}`);
82 - }
83 - }
84 -}
85 -
86 -export function revertRenameReactiveVal(irFunc: IR.Func) {
87 - for (const [name, bVal] of irFunc.env.decls) {
88 - if (IR.isReactiveVal(bVal)) {
89 - irFunc.ast.scope.rename(`$${name}`, `${name}`);
90 - }
91 - }
92 -}
93 -
94 -export function addComments(
95 - irFunc: IR.Func,
96 - commentedNodes: t.Node[],
97 - lirFunc?: LIR.Func
98 -) {
99 - // Add comments to all decls and uses of {@link BindingVal}
100 - for (const bVal of irFunc.env.decls.values()) {
101 - const commentedNode = t.addComment(
102 - bVal.binding.identifier,
103 - "leading",
104 - bVal.getFormatedProperties()
105 - );
106 - commentedNodes.push(commentedNode);
107 -
108 - bVal.references.forEach((ref) => {
109 - const commentedNode = t.addComment(
110 - ref.path.node,
111 - "leading",
112 - ref.getFormatedProperties()
113 - );
114 - commentedNodes.push(commentedNode);
115 - });
116 - }
117 -
118 - // Add comments to all {@link FreeVal}
119 - for (const fVal of irFunc.env.freeVars.values()) {
120 - fVal.references.forEach((ref) => {
121 - const commentedNode = t.addComment(
122 - ref.path.node,
123 - "leading",
124 - ref.getFormatedProperties()
125 - );
126 - commentedNodes.push(commentedNode);
127 - });
128 - }
129 -
130 - if (lirFunc) {
131 - // Add comments to only non-JSX unstable {@link ExprVal}.
132 - for (const eVal of irFunc.env.exprs.values()) {
133 - const entry = lirFunc.memoCache.entries.get(eVal);
134 - if (entry) {
135 - const eValPath = eVal.ast.path;
136 - let commentedNode;
137 - if (IR.isJSXTagVal(eVal)) {
138 - if (eValPath.isJSXElement()) {
139 - // </*$*/ id>
140 - commentedNode = t.addComment(
141 - eValPath.node.openingElement.name,
142 - // Some highlighters can't parse leading comments in JSX right.
143 - "trailing",
144 - "$"
145 - );
146 - } else if (eValPath.isJSXFragment()) {
147 - // </*$*/>
148 - commentedNode = t.addComment(
149 - eValPath.node.openingFragment,
150 - "inner",
151 - "$"
152 - );
153 - }
154 - } else if (IR.isExprVal(eVal)) {
155 - commentedNode = t.addComment(eValPath.node, "leading", "$");
156 - }
157 - if (commentedNode != null) {
158 - commentedNodes.push(commentedNode);
159 - }
160 - }
161 - }
162 - }
163 -}
164 -
165 -/**
166 - * Note: this will remove all comments of the node but it's fine since {@link DumpIR} will not be run in production.
167 - */
168 -export function revertAddComments(commentedNodes: t.Node[]) {
169 - commentedNodes.forEach((commentedNode) => {
170 - t.removeComments(commentedNode);
171 - });
172 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/Prog.ts deleted
-20
@@ -1,20 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/core";
9 -import * as t from "@babel/types";
10 -import { Func } from "./Func";
11 -
12 -export class Prog {
13 - ast: NodePath<t.Program>;
14 -
15 - funcs: Map<NodePath<t.Function>, Func> = new Map();
16 -
17 - constructor(ast: NodePath<t.Program>) {
18 - this.ast = ast;
19 - }
20 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/Val.ts deleted
-616
@@ -1,616 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { Binding, NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { dumpNode, dumpNodeLoc } from "../Common/Dumper";
11 -import { assertExhaustive } from "../Common/utils";
12 -import { invariant } from "../CompilerError";
13 -import { isAllocatingExpr } from "./babel-utils";
14 -import { HookCall } from "./Hook";
15 -import { JSXTag } from "./JSX";
16 -import { ValSnapshot } from "./ValSnapshot";
17 -
18 -/**
19 - * Val Kind.
20 - * N.B. It's an numeric enum and we relied on comparsion for classification.
21 - */
22 -export enum ValKind {
23 - // (Deeply) Immutable Binding
24 - Param, // Props and Hook args are immutable so they are safe to be cache key.
25 - HookRet, // Hook return value are immutable so they are safe to be memoized.
26 - DerivedImmut, // Values derived from other immutables are therefore immutable.
27 -
28 - // Mutable (New) Binding
29 - MutableNew,
30 -
31 - // Unknown Binding
32 - Unknown,
33 -
34 - // Free Variable
35 - Free,
36 -
37 - // Expression
38 - Expr,
39 - JSXTag,
40 -}
41 -
42 -export function isBindingVal(val: Val): val is BindingVal {
43 - return val.kind <= ValKind.Unknown;
44 -}
45 -
46 -export function isHookRetVal(val: Val): val is HookRetVal {
47 - return val.kind === ValKind.HookRet;
48 -}
49 -
50 -export function isDerivedImmutVal(val: Val): val is DerivedImmutVal {
51 - return val.kind === ValKind.DerivedImmut;
52 -}
53 -
54 -export function isFreeVal(val: Val): val is FreeVal {
55 - return val.kind === ValKind.Free;
56 -}
57 -
58 -export function isExprVal(val: Val): val is ExprVal {
59 - return val.kind >= ValKind.Expr;
60 -}
61 -
62 -export function isJSXTagVal(val: Val): val is JSXTagVal {
63 - return val.kind === ValKind.JSXTag;
64 -}
65 -
66 -/**
67 - * Reactive Values and Input Values.
68 - *
69 - * These are {@link BindingVal} that are special to React semantics.
70 - * 1. Conceptually, they are either React states or derivations of states
71 - * (including props, hook return values, and their further derivations). They
72 - * are required to be deeply immutable during a rendering, so that their
73 - * referential identity can be used to approximate if there was a update.
74 - * 2. Analysis-wise, they are the roots of all variations of {@link DepGraph}.
75 - * Specifically, they are the set of values that {@link DepsReduction} pass
76 - * aimed to reduce every other vertcies to depend and _only_ depend on.
77 - * 3. Runtime-wise, they are always recomputed; diffed; and cached in the
78 - * generated code. Most interestingly, they are the sources of reactivity,
79 - * or, speaking in terms of memoization, they form the cache key.
80 - *
81 - * The differences between {@link InputVal} and {@link ReactiveVal} is minimal
82 - * and is only relevant as an implementation details, where ReactiveVal is
83 - * defined as every InputVal that is NOT stable so they can be omitted from the
84 - * analysis and code generation, e.g. we don't need to diff and cache `setState`
85 - * since it's stable and owned by React.
86 - *
87 - * Programming model per-se, one may just say "Props and state aren’t the only
88 - * reactive values. Values that you calculate from them are also reactive."
89 - * (https://beta.reactjs.org/learn/lifecycle-of-reactive-effects#all-variables-declared-in-the-component-body-are-reactive),
90 - * Where "stable reactive values" like `setState` were just optimized.
91 - */
92 -export interface InputVal extends BindingVal {}
93 -export interface ReactiveVal extends InputVal {}
94 -
95 -export function isInputVal(val: Val): val is InputVal {
96 - return val.kind <= ValKind.DerivedImmut;
97 -}
98 -
99 -export function isReactiveVal(val: Val): val is ReactiveVal {
100 - return isInputVal(val) && !val.stable;
101 -}
102 -
103 -export function formatValKind(val: Val): string {
104 - switch (val.kind) {
105 - case ValKind.Param:
106 - return "Param";
107 - case ValKind.HookRet:
108 - invariant(isHookRetVal(val), "");
109 - return `${val.hookCall}`;
110 - case ValKind.DerivedImmut:
111 - invariant(isDerivedImmutVal(val), "");
112 - // Only prepend the derivation sign (~) once.
113 - let fromFmt = formatValKind(val.from);
114 - return fromFmt.startsWith("~") ? fromFmt : `~${fromFmt}`;
115 - case ValKind.MutableNew:
116 - return `MutableNew`;
117 - case ValKind.Unknown:
118 - return "Unknown";
119 - case ValKind.Free:
120 - return "Free";
121 - case ValKind.Expr:
122 - return "Expr";
123 - case ValKind.JSXTag:
124 - return "JSX";
125 - default:
126 - assertExhaustive(val.kind, `Unhandled val ${val}`);
127 - }
128 -}
129 -
130 -type ValNode<Val> = Val extends BindingVal
131 - ? t.Node
132 - : Val extends FreeVal
133 - ? t.Identifier
134 - : Val extends JSXTagVal
135 - ? JSXTag
136 - : t.Expression;
137 -
138 -type ValAST<V extends Val> = {
139 - hasMutated: boolean;
140 - unsafePath: NodePath<ValNode<V>>;
141 - path: NodePath<ValNode<V>>;
142 - replaceWith: NodePath["replaceWith"];
143 -};
144 -
145 -/**
146 - * A proxy to Babel's AST so path access is guarded against mutation.
147 - */
148 -function createValAST<V extends Val>(path: NodePath<ValNode<V>>): ValAST<V> {
149 - let hasMutated = false;
150 - return {
151 - hasMutated,
152 - unsafePath: path,
153 - get path() {
154 - invariant(!hasMutated, "Access path after it's mutated.");
155 - return path;
156 - },
157 - replaceWith(replacement) {
158 - hasMutated = true;
159 - return path.replaceWith(replacement);
160 - },
161 - };
162 -}
163 -
164 -/**
165 - * IR Value.
166 - *
167 -┌──────────────┬───────────────────────┬─────────────────┐
168 -│ IR.Val │ immutable │ mutable │
169 -├──────────────┼───────────────────────┼─────────────────┤
170 -│ stable │ useState, dispatch │ ref obj │
171 -├──────────────┼───────────────────────┼─────────────────┤
172 -│ unstable │ prop, state, hook arg │ anything else │
173 -└──────────────┴───────────────────────┴─────────────────┘
174 - */
175 -export interface Val {
176 - kind: ValKind;
177 -
178 - ast: ValAST<Val> | undefined;
179 -
180 - // Whether or not this value is immutable.
181 - immutable: boolean;
182 -
183 - // Whether or not the identity of this value is stable across re-renders.
184 - // N.B. for ExprVal, it is describing whether or not the expression itself
185 - // creating unstable value, e.g. `c ? x : y` is a stable ExprVal that returns
186 - // unstable values like `x` and `y`, which is likely pre-memoized.
187 - stable: boolean;
188 -
189 - // Reference Record.
190 - // Val owns its Ref.
191 - references: Map<NodePath, Ref<Val>>;
192 -
193 - getFormatedProperties(): string;
194 - getFormatedProperties(immutable: boolean): string;
195 -
196 - toString(): string;
197 - toString(immutable: boolean): string;
198 -
199 - toLoc(): string;
200 -
201 - toJSON(): object;
202 -
203 - snapshot(): ValSnapshot;
204 -}
205 -
206 -export interface BindingVal extends Val {
207 - ast: ValAST<BindingVal>;
208 - binding: Binding;
209 - references: Map<RefPath<BindingVal>, Ref<BindingVal>>;
210 -
211 - /**
212 - * Refine value kinds and properties without changing its identity.
213 - */
214 - refineTo(kind: ValKind, immutable?: boolean, stable?: boolean): void;
215 -}
216 -
217 -export interface HookRetVal extends BindingVal {
218 - kind: ValKind.HookRet;
219 - hookCall: HookCall;
220 -}
221 -
222 -export interface DerivedImmutVal extends BindingVal {
223 - kind: ValKind.DerivedImmut;
224 - from: InputVal;
225 -}
226 -
227 -export interface FreeVal extends Val {
228 - name: string;
229 - ast: undefined;
230 - references: Map<RefPath<FreeVal>, Ref<FreeVal>>;
231 - reference(refPath: RefPath<FreeVal>): Ref<FreeVal>;
232 -}
233 -
234 -export interface ExprVal extends Val {
235 - ast: ValAST<ExprVal>;
236 - references: Map<NodePath, Ref<ExprVal>>;
237 - getRef(): Ref<ExprVal>;
238 -}
239 -
240 -export interface JSXTagVal extends ExprVal {
241 - kind: ValKind.JSXTag;
242 - ast: ValAST<JSXTagVal>;
243 - getRef(): Ref<JSXTagVal>;
244 - children: ExprVal[];
245 - isUnsafeToMemo: boolean;
246 -}
247 -
248 -/**
249 - * N.B. it's more common a value is @param immutable over @param stable.
250 - */
251 -export function createBindingVal(
252 - binding: Binding,
253 - kind: ValKind = ValKind.Unknown,
254 - immutable = false,
255 - stable = false
256 -): BindingVal {
257 - const newVal: BindingVal = {
258 - binding,
259 - kind,
260 - ast: createValAST<BindingVal>(binding.path),
261 - immutable,
262 - stable,
263 - references: new Map<RefPath<BindingVal>, Ref<BindingVal>>(),
264 - refineTo(
265 - this: BindingVal,
266 - kind: ValKind,
267 - immutable = this.immutable,
268 - stable = this.stable
269 - ): void {
270 - this.kind = kind;
271 - this.immutable = immutable;
272 - this.stable = stable;
273 - },
274 - getFormatedProperties(
275 - this: BindingVal,
276 - immutable: boolean = this.immutable
277 - ) {
278 - return formatValProperties(this, immutable);
279 - },
280 - toString(this: BindingVal, immutable: boolean = this.immutable) {
281 - const name = this.binding.identifier.name;
282 - const tracked = isReactiveVal(this) ? "$" : "";
283 - const anno = this.getFormatedProperties(immutable);
284 - const annoFmt = anno[anno.length - 1] === "_" ? anno : `${anno} `;
285 -
286 - return `${annoFmt}${tracked}${name}`.trimStart();
287 - },
288 - toLoc(this: BindingVal) {
289 - return dumpNodeLoc(this.ast.path.node);
290 - },
291 - toJSON() {
292 - return {
293 - kind: this.binding.kind,
294 - identifier: this.binding.identifier.name,
295 - referenced: this.binding.referenced,
296 - references: this.binding.references,
297 - constant: this.binding.constant,
298 - };
299 - },
300 - snapshot(this: BindingVal) {
301 - return new ValSnapshot(this);
302 - },
303 - };
304 -
305 - /**
306 - * Babel doesn't consider LHS of Assignment as {@link Binding.referencePaths}
307 - * because they are "write" rather than "read". Instead, "write" are put under
308 - * {@link Binding.constantViolations}.
309 - *
310 - * @see https://github.com/babel/babel/issues/11313
311 - *
312 - * Our notion of {@link IR.Ref} are canonical symbol references so we need
313 - * to collect both reads and writes.
314 - */
315 - for (const ref of binding.referencePaths) {
316 - if (ref.isIdentifier() || ref.isJSXIdentifier()) {
317 - if (!t.isObjectPattern(ref.parentPath.parentPath)) {
318 - // Older version of babel marks `FOO` in `{x: FOO}` as reference (https://github.com/babel/babel/pull/9492/)
319 - newVal.references.set(ref, createRef<BindingVal>(ref, newVal));
320 - }
321 - } else {
322 - invariant(false, `Babel bindings can only be referenced by identifiers`);
323 - }
324 - }
325 -
326 - // This is considered the single source of truth of our notion of "Reference"
327 - // since it performs the strictest check by far until may be
328 - // https://github.com/babel/babel/issues/14771 is fixed.
329 - for (const write of binding.constantViolations) {
330 - invariant(
331 - write.isAssignmentExpression() ||
332 - write.isUpdateExpression() ||
333 - write.isForInStatement() ||
334 - write.isForOfStatement(),
335 - `Unexpected node type for binding update: %s`,
336 - write.type
337 - );
338 -
339 - let path: NodePath = write;
340 - if (write.isAssignmentExpression()) path = write.get("left");
341 -
342 - if (path.isIdentifier()) {
343 - newVal.references.set(
344 - path,
345 - createRef<BindingVal>(path, newVal, RefKind.Reassign)
346 - );
347 - } else {
348 - path.traverse({
349 - Identifier(ref) {
350 - if (ref.node.name === binding.identifier.name) {
351 - newVal.references.set(
352 - ref,
353 - createRef<BindingVal>(ref, newVal, RefKind.Reassign)
354 - );
355 - }
356 - },
357 - });
358 - }
359 - }
360 -
361 - return newVal;
362 -}
363 -
364 -export function refineToHookRetVal(
365 - val: BindingVal,
366 - hookCall: HookCall,
367 - immutable: boolean = val.immutable,
368 - stable: boolean = val.stable
369 -): HookRetVal {
370 - val.refineTo(ValKind.HookRet, immutable, stable);
371 - invariant(isHookRetVal(val), "");
372 - val.hookCall = hookCall;
373 - return val;
374 -}
375 -
376 -export function refineToDerivedImmutVal(
377 - val: BindingVal,
378 - from: InputVal,
379 - immutable: boolean = val.immutable,
380 - stable: boolean = val.stable
381 -): DerivedImmutVal {
382 - val.refineTo(ValKind.DerivedImmut, immutable, stable);
383 - invariant(isDerivedImmutVal(val), "");
384 - val.from = from;
385 - return val;
386 -}
387 -
388 -/**
389 - * React requires no existence of global shared mutable states, therefore all
390 - * free vars are assumed to be stable and immutable.
391 - *
392 - * That being said, by including this analysis into the system we may
393 - * conservatively refine some of them to be mutable in a case-by-case manner.
394 - */
395 -export function createFreeVal(
396 - name: string,
397 - kind: ValKind = ValKind.Free,
398 - immutable = false,
399 - stable = true
400 -): FreeVal {
401 - const newVal: FreeVal = {
402 - kind,
403 - ast: undefined,
404 - immutable,
405 - stable,
406 - name,
407 - references: new Map<RefPath<FreeVal>, Ref<FreeVal>>(),
408 - reference(this: FreeVal, refPath: RefPath<FreeVal>): Ref<FreeVal> {
409 - const ref = createRef<FreeVal>(refPath, this, RefKind.Unknown);
410 - this.references.set(refPath, ref);
411 - return ref;
412 - },
413 - getFormatedProperties(this: FreeVal, immutable: boolean = this.immutable) {
414 - return formatValProperties(this, immutable);
415 - },
416 - toString(this: FreeVal) {
417 - return `${this.getFormatedProperties()}${this.name}`;
418 - },
419 - toLoc(this: FreeVal) {
420 - return "free";
421 - },
422 - toJSON() {
423 - return {};
424 - },
425 - snapshot(this: FreeVal) {
426 - return new ValSnapshot(this);
427 - },
428 - };
429 - return newVal;
430 -}
431 -
432 -export function createExprVal(
433 - expr: NodePath<t.Expression>,
434 - kind: ValKind = ValKind.Expr,
435 - immutable = false,
436 - stable?: boolean
437 -): ExprVal {
438 - if (typeof stable === "undefined") {
439 - stable = !isAllocatingExpr(expr);
440 - }
441 -
442 - const newVal = {
443 - ast: createValAST(expr),
444 - kind,
445 - immutable,
446 - stable,
447 - references: new Map(),
448 - getRef(): Ref<ExprVal> {
449 - return ref;
450 - },
451 - getFormatedProperties(this: ExprVal, immutable = this.immutable) {
452 - return formatValProperties(this, immutable);
453 - },
454 - toString(this: ExprVal, immutable = this.immutable) {
455 - const anno = this.getFormatedProperties(immutable);
456 - const annoFmt = anno[anno.length - 1] === "_" ? anno : `${anno} `;
457 - const str = dumpNode(this.ast.path.node);
458 - return `${annoFmt}${str}`;
459 - },
460 - toLoc(this: ExprVal) {
461 - return dumpNodeLoc(this.ast.path.node);
462 - },
463 - toJSON(this: ExprVal): any {
464 - const key = this.toString();
465 - if (isJSXTagVal(this)) {
466 - return {
467 - [key]: this.children.map((child) => child.toJSON()),
468 - };
469 - } else {
470 - return key;
471 - }
472 - },
473 - snapshot(this: ExprVal) {
474 - return new ValSnapshot(this);
475 - },
476 - };
477 -
478 - // expressions has only one reference which is itself.
479 - const ref = createRef<ExprVal>(expr, newVal);
480 - newVal.references.set(expr, ref);
481 -
482 - return newVal;
483 -}
484 -
485 -export function createJSXTagVal(expr: NodePath<JSXTag>): JSXTagVal {
486 - const jsxTagVal = createExprVal(expr, ValKind.JSXTag, true, false);
487 - invariant(isJSXTagVal(jsxTagVal), "");
488 -
489 - jsxTagVal.children = [];
490 - jsxTagVal.isUnsafeToMemo = false;
491 - return jsxTagVal;
492 -}
493 -
494 -/**
495 - * References to IR Value
496 - *
497 - * Creation of shared references are known as "borrowing". N.B. we are not
498 - * trying to formally formalize ownership here due to the shared and mutable
499 - * nature of JavaScript references, but we are designing with them in mind:
500 - *
501 - * 1. Immutable vals can't be borrowed as mutable, e.g. `unknown(prop)`. But
502 - * instead of erroring like Rust, we'll just assume `unknown` will only borrow
503 - * `prop` immutably, and eventually resulted in an immutable ref. This is
504 - * partially guranteed by React `freeze(prop)` in DEV (which doesn't work for
505 - * variables destructured from the props object though).
506 - *
507 - * 2. Mutable vals can not be mutated when it's immutably borrowed. when a value
508 - * is passing to JSX/Hook, we'll treat it as if the value is moved and owned by
509 - * React, and later references are considered as immutable borrowes. Forget may
510 - * generate `freeze(val)` in DEV to help guard this.
511 - *
512 - * The mutability of the "borrowing" itself is denoted by {@link RefKind}, while
513 - * the eventual mutablity of the resultant references are denoted via a getter
514 - * {@field immutable}.
515 - *
516 - * The overall strategy (@see BodyAnalysis) is that:
517 - * - Everything is started as Unknown which can either be assumed as mutable
518 - * (the current optimistic default) or immutable (if pessmestic).
519 - * - Refine identifier refs directly flowed into JSX and Hook as Freeze.
520 - * - Refine refs reassign-ed (from Binding.constantViolations) as Reassign.
521 - * - Refine all refs under certain syntactical position (e.g. MemberExpr.object,
522 - * CallExpr.argument) conservatively as Borrow
523 - */
524 -
525 -export enum RefKind {
526 - // Immutable
527 - Freeze,
528 -
529 - // Unknown
530 - Unknown,
531 -
532 - // Mutable
533 - Reassign,
534 - Borrow,
535 - MutBorrow,
536 -}
537 -
538 -type RefPath<Val> = Val extends BindingVal
539 - ? NodePath<t.Identifier | t.JSXIdentifier>
540 - : Val extends FreeVal
541 - ? NodePath<t.Identifier>
542 - : Val extends JSXTagVal
543 - ? NodePath<JSXTag>
544 - : NodePath<t.Expression>;
545 -
546 -export interface Ref<V extends Val> {
547 - kind: RefKind;
548 -
549 - val: V;
550 -
551 - path: RefPath<V>;
552 -
553 - // Whether or not this reference is immutable.
554 - // We can only create immutable reference on immutable value.
555 - get immutable(): boolean;
556 -
557 - /**
558 - * Refine value ref kind and properties without changing its identity.
559 - */
560 - refineTo(kind: RefKind): void;
561 -
562 - getFormatedProperties(): string;
563 - toString(): string;
564 -}
565 -
566 -export function createRef<V extends Val>(
567 - path: RefPath<V>,
568 - val: V,
569 - kind = RefKind.Unknown
570 -): Ref<V> {
571 - return {
572 - path,
573 - val,
574 - kind,
575 - get immutable() {
576 - switch (this.kind) {
577 - case RefKind.Freeze:
578 - return true;
579 - case RefKind.Reassign:
580 - case RefKind.Borrow:
581 - return this.val.immutable;
582 - case RefKind.MutBorrow:
583 - return false;
584 - case RefKind.Unknown:
585 - return true;
586 - default:
587 - assertExhaustive(this.kind, `Unhandled Ref ${this}`);
588 - }
589 - },
590 - refineTo(kind: RefKind) {
591 - this.kind = kind;
592 - },
593 - getFormatedProperties(this: Ref<V>) {
594 - // Override val's mutabiliy formatting to the ref's mutability.
595 - return `&${this.val.getFormatedProperties(this.immutable)}`;
596 - },
597 - toString(this: Ref<V>) {
598 - // Override val's mutabiliy formatting to the ref's mutability.
599 - return `&${this.val.toString(this.immutable)}`;
600 - },
601 - };
602 -}
603 -
604 -/**
605 - * @return properties shared by all {@link Val} formatted, with the
606 - * @param immutable overriable conveniently for {@link Ref}.
607 - *
608 - * This is used by {@link PrettyPrinter} to annotate source with comments.
609 - */
610 -function formatValProperties(val: Val, immutable = val.immutable) {
611 - const kind = val.kind !== ValKind.Unknown && formatValKind(val);
612 - const stable = !isExprVal(val) && val.stable && "_";
613 - const mut = !immutable && "mut";
614 -
615 - return [mut, kind, stable].filter(Boolean).join(" ");
616 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/ValSnapshot.ts deleted
-36
@@ -1,36 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as t from "@babel/types";
9 -import * as IR from ".";
10 -import { dumpNodeLoc } from "../Common/Dumper";
11 -
12 -export class ValSnapshot {
13 - node: t.Node | undefined;
14 -
15 - isInput: boolean;
16 -
17 - isReactive: boolean;
18 -
19 - pretty: string;
20 -
21 - constructor(val: IR.Val) {
22 - this.node = val.ast?.path.node;
23 - this.isInput = IR.isInputVal(val);
24 - this.isReactive = IR.isReactiveVal(val);
25 - // TODO: Add a snapshot version of `toString` to lazily compute this.
26 - this.pretty = val.toString();
27 - }
28 -
29 - toLoc() {
30 - return this.node ? dumpNodeLoc(this.node) : "";
31 - }
32 -
33 - toString() {
34 - return [this.toLoc(), this.pretty].filter(Boolean).join(" ");
35 - }
36 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/__tests__/Hook--test.ts deleted
-87
@@ -1,87 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/core";
9 -import { parse } from "@babel/parser";
10 -import traverse from "@babel/traverse";
11 -import { CallExpression, OptionalCallExpression } from "@babel/types";
12 -import * as Hook from "../Hook";
13 -
14 -/**
15 - * ReactHook Unit Tests
16 - *
17 - * This unit test only focus on the correctness around
18 - * {@link ReactHook.HookCall.resolve}.
19 - */
20 -
21 -describe("ReactHook", () => {
22 - it("Not hook", () => {
23 - // Not hook name.
24 - expect(parseHook("userFetch()")).toBe(undefined);
25 -
26 - // Lowercased namespace
27 - expect(parseHook("x.useState()")).toBe(undefined);
28 - expect(parseHook("jest.useFakeTimer()")).toBe(undefined);
29 -
30 - // Chaining member expression
31 - expect(parseHook("Module?.Other.useMagic()")).toBe(undefined);
32 - expect(parseHook("X.X.useState()")).toBe(undefined);
33 - expect(parseHook("X.React.useState()")).toBe(undefined);
34 - expect(parseHook("React.X.useState()")).toBe(undefined);
35 - });
36 -
37 - it("Builtin hooks", () => {
38 - // Orphan builtins.
39 - expect(parseHook("useState()")).toBe(Hook.UseState);
40 - expect(parseHook("useReducer()")).toBe(Hook.UseReducer);
41 - expect(parseHook("useContext()")).toBe(Hook.UseContext);
42 - expect(parseHook("useRef()")).toBe(Hook.UseRef);
43 - expect(parseHook("useEffect()")).toBe(Hook.UseEffect);
44 - expect(parseHook("useLayoutEffect()")).toBe(Hook.UseLayoutEffect);
45 - expect(parseHook("useCallback()")).toBe(Hook.UseCallback);
46 - expect(parseHook("useMemo()")).toBe(Hook.UseMemo);
47 -
48 - // React-namespaced builtins.
49 - expect(parseHook("React.useState()")).toBe(Hook.UseState);
50 - });
51 -
52 - test.each([
53 - // Unknown hooks.
54 - "useUnkown()",
55 - "React.useUnknown()",
56 -
57 - // Not (or not well) React-namespaced.
58 - "X.useState()",
59 -
60 - // Different custom hooks
61 - "useMagic()",
62 - "Module.useMagic()",
63 - "Module?.useMagic()",
64 - ])("`%s` is a custom hook", (code) => {
65 - const maybeHook = parseHook(code);
66 - expect(maybeHook !== undefined && Hook.isCustomHook(maybeHook)).toBe(true);
67 - });
68 -});
69 -
70 -/**
71 - * Test helper attempting to parse and resolve the first CallExpression in
72 - * @param code as Hook. @returns the hook if resolved, or undefined otherwise.
73 - */
74 -function parseHook(code: string): Hook.Hook | undefined {
75 - let maybeCall: NodePath<CallExpression | OptionalCallExpression> | undefined;
76 - traverse(parse(code), {
77 - CallExpression(call) {
78 - maybeCall = call;
79 - call.stop();
80 - },
81 - OptionalCallExpression(call) {
82 - maybeCall = call;
83 - call.stop();
84 - },
85 - });
86 - return maybeCall && Hook.HookCall.resolve(maybeCall)?.hook;
87 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/__tests__/JSX--test.ts deleted
-164
@@ -1,164 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/core";
9 -import { parse } from "@babel/parser";
10 -import traverse from "@babel/traverse";
11 -import invariant from "invariant";
12 -import { Func } from "../Func";
13 -import { JSXTag, JSXTreeBuilder } from "../JSX";
14 -import { JSXTagVal } from "../Val";
15 -
16 -/**
17 - * React JSX Unit Tests
18 - */
19 -describe("ReactJSX", () => {
20 - it("JSXElement", () => {
21 - expect(parseJSX("<View />")).toMatchInlineSnapshot(`
22 - {
23 - "JSX <View>": [],
24 - }
25 - `);
26 - expect(parseJSX("<View a='a' />")).toMatchInlineSnapshot(`
27 - {
28 - "JSX <View>": [],
29 - }
30 - `);
31 - expect(parseJSX("<View a={a} />")).toMatchInlineSnapshot(`
32 - {
33 - "JSX <View>": [
34 - "Expr a",
35 - ],
36 - }
37 - `);
38 - expect(parseJSX("<View>a</View>")).toMatchInlineSnapshot(`
39 - {
40 - "JSX <View>": [],
41 - }
42 - `);
43 - expect(parseJSX("<View>{a}</View>")).toMatchInlineSnapshot(`
44 - {
45 - "JSX <View>": [
46 - "Expr a",
47 - ],
48 - }
49 - `);
50 - expect(parseJSX("<ListView><View /></ListView>")).toMatchInlineSnapshot(`
51 - {
52 - "JSX <ListView>": [
53 - {
54 - "JSX <View>": [],
55 - },
56 - ],
57 - }
58 - `);
59 - expect(parseJSX("<ListView><View><Text/></View></ListView>"))
60 - .toMatchInlineSnapshot(`
61 - {
62 - "JSX <ListView>": [
63 - {
64 - "JSX <View>": [
65 - {
66 - "JSX <Text>": [],
67 - },
68 - ],
69 - },
70 - ],
71 - }
72 - `);
73 - expect(
74 - parseJSX(`
75 - <ListView a={a}>
76 - {a}
77 - <View b={b}>
78 - {b}
79 - <Text c={c}/>
80 - </View>
81 - </ListView>
82 - `)
83 - ).toMatchInlineSnapshot(`
84 - {
85 - "JSX <ListView>": [
86 - "Expr a",
87 - "Expr a",
88 - {
89 - "JSX <View>": [
90 - "Expr b",
91 - "Expr b",
92 - {
93 - "JSX <Text>": [
94 - "Expr c",
95 - ],
96 - },
97 - ],
98 - },
99 - ],
100 - }
101 - `);
102 - });
103 -
104 - it("JSXFragment", () => {
105 - expect(parseJSX("<></>")).toMatchInlineSnapshot(`
106 - {
107 - "JSX <>": [],
108 - }
109 - `);
110 - expect(
111 - parseJSX(`
112 - <>
113 - 1
114 - {a}
115 - <View/>
116 - <View b={b}/>
117 - </>
118 - `)
119 - ).toMatchInlineSnapshot(`
120 - {
121 - "JSX <>": [
122 - "Expr a",
123 - {
124 - "JSX <View>": [],
125 - },
126 - {
127 - "JSX <View>": [
128 - "Expr b",
129 - ],
130 - },
131 - ],
132 - }
133 - `);
134 - });
135 -});
136 -
137 -function parseJSX(jsxCode: string): JSXTagVal | undefined {
138 - // Wrap under a func to preserve the invariant that parentalFunc exists.
139 - let code = `
140 - function Comp(){ return ${jsxCode}}
141 - `;
142 -
143 - let maybeFunc;
144 - let maybeJSXTree: NodePath<JSXTag> | undefined;
145 - traverse(parse(code, { plugins: ["jsx"] }), {
146 - JSXElement(jsxEle) {
147 - maybeJSXTree = jsxEle;
148 - jsxEle.stop();
149 - },
150 - JSXFragment(jsxFrag) {
151 - maybeJSXTree = jsxFrag;
152 - jsxFrag.stop();
153 - },
154 - Function(func) {
155 - maybeFunc = func;
156 - },
157 - });
158 -
159 - invariant(maybeFunc, "Wrapped here.");
160 - return (
161 - maybeJSXTree &&
162 - new JSXTreeBuilder(maybeJSXTree, new Func(maybeFunc)).build()
163 - );
164 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/__tests__/Val--test.ts deleted
-72
@@ -1,72 +0,0 @@
1 -import { parse } from "@babel/parser";
2 -import traverse, { Binding, NodePath } from "@babel/traverse";
3 -import * as t from "@babel/types";
4 -import {
5 - BindingVal,
6 - createBindingVal,
7 - createRef,
8 - RefKind,
9 - ValKind,
10 -} from "../Val";
11 -
12 -describe("ReactValue", () => {
13 - let def: Binding, ref: NodePath<t.Identifier | t.JSXIdentifier>;
14 - traverse(parse(`var x; use(x)`), {
15 - Identifier(ident) {
16 - if (ident.node.name !== "x") return;
17 - if (ident.isReferenced()) {
18 - ref = ident;
19 - } else {
20 - def = ident.scope.bindings["x"];
21 - }
22 - },
23 - });
24 -
25 - it("immutable stable value", () => {
26 - const v = createBindingVal(def, ValKind.Unknown, true, true);
27 - expect(v.toString()).toMatchInlineSnapshot(`"_x"`);
28 -
29 - const r = createRef<BindingVal>(ref, v, RefKind.Unknown);
30 - expect(r.toString()).toMatchInlineSnapshot(`"&_x"`);
31 -
32 - // Cannot borrow an immutable val as mutable so it still ended as immutable
33 - const mr = createRef<BindingVal>(ref, v, RefKind.Unknown);
34 - expect(mr.toString()).toMatchInlineSnapshot(`"&_x"`);
35 - });
36 -
37 - it("immutable unstable value", () => {
38 - const v = createBindingVal(def, ValKind.Unknown, true, false);
39 - expect(v.toString()).toMatchInlineSnapshot(`"x"`);
40 -
41 - const r = createRef<BindingVal>(ref, v, RefKind.Unknown);
42 - expect(r.toString()).toMatchInlineSnapshot(`"&x"`);
43 -
44 - // Cannot borrow an immutable val as mutable so it still ended as immutable
45 - const mr = createRef<BindingVal>(ref, v, RefKind.Unknown);
46 - expect(mr.toString()).toMatchInlineSnapshot(`"&x"`);
47 - });
48 -
49 - it("mutable stable value", () => {
50 - const v = createBindingVal(def, ValKind.Unknown, false, true);
51 - expect(v.toString()).toMatchInlineSnapshot(`"mut _x"`);
52 -
53 - // Can borrow a mutable value as immutable.
54 - const r = createRef<BindingVal>(ref, v, RefKind.Unknown);
55 - expect(r.toString()).toMatchInlineSnapshot(`"&_x"`);
56 -
57 - const mr = createRef<BindingVal>(ref, v, RefKind.Unknown);
58 - expect(mr.toString()).toMatchInlineSnapshot(`"&_x"`);
59 - });
60 -
61 - it("mutable unstable value", () => {
62 - const v = createBindingVal(def, ValKind.Unknown, false, false);
63 - expect(v.toString()).toMatchInlineSnapshot(`"mut x"`);
64 -
65 - // Can borrow a mutable value as immutable.
66 - const r = createRef<BindingVal>(ref, v, RefKind.Unknown);
67 - expect(r.toString()).toMatchInlineSnapshot(`"&x"`);
68 -
69 - const mr = createRef<BindingVal>(ref, v, RefKind.Unknown);
70 - expect(mr.toString()).toMatchInlineSnapshot(`"&x"`);
71 - });
72 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/babel-utils.ts deleted
-354
@@ -1,354 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { Binding, NodePath, Scope } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { invariant } from "../CompilerError";
11 -
12 -/**
13 - * Babel Utils
14 - *
15 - * This module implements utils (e.g. specialized scope analysis) that
16 - * conceptually fits better in Babel-like toolchain.
17 - */
18 -
19 -/**
20 - * @returns bindings scoped under @param scope that are declared by @param path.
21 - *
22 - * Babel's {@link getBindingIdentifiers} conveniently pattern match on all types
23 - * of nodes to find those {@link Identifier} where {@link Bindings} originated.
24 - * But it has many unwanted quirks:
25 - *
26 - * 1. sometimes include bindings created for inner block scope
27 - *
28 - * function foo(a, b){} // {foo, a, b}
29 - * const foo = function(a, b){} // {foo}
30 - * for (const x of xs){} // {x}
31 - *
32 - * 2. suffers from shadowing, since it can return identifiers with
33 - * the same name but bound on multiple scopes when @param path
34 - * itself introduces new scopes
35 - *
36 - * function foo(foo, b){} // {foo, b} (foo is the param!) duplicate = false
37 - * // {foo: Array(2), b: Array(1)} otherwise
38 - *
39 - * 3. sometimes includes references to existing bindings
40 - * let x; // [x]
41 - * x = 0; // []
42 - * for (x in {}) // [x], but this does not introduce a new binding
43 - *
44 - * N.B. {@link getOuterBindingIdentifiers} special-cased
45 - * {@link FunctionDeclaration} but is still not rigid enough.
46 - *
47 - * This method refined it to only return those bindings that are bound on the
48 - * same scope as @param path, resulting:
49 - *
50 - * function foo(a, b){} // {foo}
51 - * const foo = function(a, b){} // {foo}
52 - * for (const x of xs){} // {}
53 - * function foo(foo, b){} // {foo} (foo is the func)
54 - *
55 - * N.B. we choose return Bindings because it's more generalized. You can
56 - * find path, identifier, name all from it.
57 - */
58 -export function getScopedBindings(path: NodePath, scope: Scope): Binding[] {
59 - // Babel @type doesn't match with the real implementations.
60 - // @ts-ignore
61 - const bindingIdents = path.getBindingIdentifiers(true) as Record<
62 - string,
63 - t.Identifier[]
64 - >;
65 - const res: Binding[] = [];
66 -
67 - for (const [name, ids] of Object.entries(bindingIdents)) {
68 - // Use identifier name and re-lookup from the @param scope
69 - const maybeBinding = scope.getOwnBinding(name);
70 - for (const id of ids) {
71 - // Path may introduce a new binding of `name` under its own scope,
72 - // so we explicitly check whether `id` references the binding
73 - // under @param scope
74 - if (id === maybeBinding?.identifier) {
75 - res.push(maybeBinding);
76 - }
77 - }
78 - }
79 - return res;
80 -}
81 -
82 -/**
83 - * @returns identifiers under @param path referencing bindings on @param scope.
84 - */
85 -export function getScopedReferences(
86 - path: NodePath,
87 - scope: Scope
88 -): NodePath<t.Identifier | t.JSXIdentifier>[] {
89 - const refs: NodePath<t.Identifier | t.JSXIdentifier>[] = [];
90 -
91 - for (const ident of getReferences(path)) {
92 - if (isBoundOnScope(ident, scope)) {
93 - refs.push(ident);
94 - }
95 - }
96 -
97 - return refs;
98 -}
99 -
100 -/**
101 - * @returns identifiers under @param path referencing bindings bound out of
102 - * @param scope.
103 - */
104 -export function getOuterScopedReferences(
105 - path: NodePath,
106 - scope: Scope
107 -): NodePath<t.Identifier>[] {
108 - const refs: NodePath<t.Identifier>[] = [];
109 -
110 - for (const ident of getReferences(path, false)) {
111 - if (isBoundAboveScope(ident, scope)) {
112 - refs.push(ident);
113 - }
114 - }
115 -
116 - return refs;
117 -}
118 -
119 -/**
120 - * @returns references to identifiers under @param path, including itself.
121 - * N.B. our notion of "references" (read and write) is broader than Babel's
122 - * "references" (only "read").
123 - */
124 -export function getReferences(
125 - path: NodePath,
126 - includesJSXIdent: false
127 -): NodePath<t.Identifier>[];
128 -
129 -export function getReferences(
130 - path: NodePath,
131 - includesJSXIdent?: true
132 -): NodePath<t.Identifier | t.JSXIdentifier>[];
133 -
134 -export function getReferences(
135 - path: NodePath,
136 - includesJSXIdent: boolean = true
137 -): NodePath<t.Identifier | t.JSXIdentifier>[] {
138 - const refs: Set<NodePath<t.Identifier | t.JSXIdentifier>> = new Set();
139 -
140 - if (isReferencedIdentifier(path)) {
141 - refs.add(path);
142 - } else {
143 - // Babel actually supports `ReferencedIdentifer()` as virtual type but
144 - // it's not included in `@types`. In addition, we may needs to distinguish
145 - // normal identifiers and JSX identifiers in the future.
146 - path.traverse({
147 - Identifier(ident) {
148 - if (isReferencedIdentifier(ident)) {
149 - refs.add(ident);
150 - }
151 - },
152 - JSXIdentifier(jsxIdent) {
153 - if (includesJSXIdent && jsxIdent.isReferencedIdentifier()) {
154 - refs.add(jsxIdent);
155 - }
156 - },
157 - });
158 -
159 - /**
160 - * We also need to include "writes" in {@link Binding.constantViolations}
161 - * @see Val.ts {@link createBindingVal}. Note that the Identifiers recorded
162 - * here are unsound until {@link IR.Func.getScopedReferences} check against
163 - * with {@link Val.references}.
164 - *
165 - * Note that We don't need to patch `UpdateExpressions` since they are
166 - * already tracked as "read" too.
167 - */
168 - path.traverse({
169 - AssignmentExpression(expr) {
170 - const lhs = expr.get("left");
171 - // Typescript casts, since DefinitelyTyped is missing this class function
172 - invariant(
173 - lhs.getOuterBindingIdentifiers != null,
174 - "Expected getOuterBindingIdentifiers to exist on NodePath"
175 - );
176 - const paths = (lhs as any).getOuterBindingIdentifierPaths() as {
177 - _: NodePath<t.Identifier>;
178 - };
179 - Object.values(paths).forEach((p) => refs.add(p));
180 - },
181 - });
182 - }
183 -
184 - return [...refs];
185 -}
186 -
187 -// Older version of babel marks `FOO` in `{x: FOO}` as reference (https://github.com/babel/babel/pull/9492/)
188 -function isReferencedIdentifier(
189 - path: NodePath<t.Node>
190 -): path is NodePath<t.Identifier | t.JSXIdentifier> {
191 - if (
192 - !path.isReferencedIdentifier() ||
193 - t.isObjectPattern(path.parentPath.parentPath)
194 - ) {
195 - return false;
196 - }
197 - return true;
198 -}
199 -
200 -/**
201 - * Collect all Identifiers targeted by a normal / destructuring assignment.
202 - * We ignore IDENT in the majority of cases. These do not necessarily mutate
203 - * any bound identifiers
204 - * - `call(IDENT)`, or `new IDENT` expressions
205 - * (new Foo(immut.x)).bar = 0;
206 - * foo(immut.x).bar = 0;
207 - * - all "primary expressions" except for IdentifierReference
208 - * - e.g. literals, classes, functions, generators
209 - * (function foo(){}).bar = 0;
210 - * (class foo{}).bar = 0;
211 - *
212 - * https://tc39.es/ecma262/#sec-destructuring-assignment
213 - * https://tc39.es/ecma262/#prod-LeftHandSideExpression
214 - **/
215 -export function getAssignmentTargets(
216 - expr: NodePath<babel.types.Node>
217 -): Set<NodePath<t.Identifier>> {
218 - const refs = new Set<NodePath<t.Identifier>>();
219 - type NotArray<T> = T extends Array<unknown> ? never : T;
220 -
221 - function toArray<T>(o: NotArray<T> | T[]): T[] {
222 - return Array.isArray(o) ? o : [o];
223 - }
224 - function collectIdent(
225 - elem: NodePath<babel.types.Node>,
226 - { inDestructure }: { inDestructure: boolean }
227 - ) {
228 - if (elem.isIdentifier()) {
229 - // collect found identifier
230 - refs.add(elem);
231 - } else if (elem.isMemberExpression() || elem.isOptionalMemberExpression()) {
232 - // recursively visit OBJ_PATH in OBJ_PATH.prop, OBJ_PATH?.prop
233 - toArray(elem.get("object")).forEach((elem) => {
234 - collectIdent(elem, { inDestructure: false });
235 - });
236 - } else if (elem.isArrayPattern()) {
237 - // recursively visit OBJ1, OBJ2 in [OBJ1, OBJ2]
238 - elem.get("elements").forEach((elem) => {
239 - if (elem.node != null)
240 - collectIdent(elem as NodePath<babel.types.Node>, {
241 - inDestructure: true,
242 - });
243 - });
244 - } else if (elem.isObjectPattern()) {
245 - // recursively visit VAL1, VAL2 in {key1: VAL1, key2: VAL2}
246 - elem.get("properties").forEach((elem) => {
247 - if (elem.type === "ObjectProperty") {
248 - collectIdent(elem.get("value") as NodePath, {
249 - inDestructure: true,
250 - });
251 - } else {
252 - collectIdent(elem.get("argument") as NodePath, {
253 - inDestructure: false,
254 - });
255 - }
256 - });
257 - } else if (inDestructure && elem.isAssignmentPattern()) {
258 - // recursively visit LVAL=val
259 - collectIdent(elem.get("left"), { inDestructure: false });
260 - }
261 - }
262 - collectIdent(expr, { inDestructure: false });
263 - return refs;
264 -}
265 -
266 -/**
267 - * @returns whethor or not @param ident is bound to @param scope.
268 - *
269 - * Babel's {@link hasBinding} and {@link hasOwnBinding} are insufficient when
270 - * shadowing came into play, so we perform a stronger check by checking if
271 - * a scope chain look up would be same as direct own scope lookup.
272 - */
273 -export function isBoundOnScope(
274 - ident: NodePath<t.Identifier | t.JSXIdentifier>,
275 - scope: Scope
276 -): boolean {
277 - const bindingFromLookup = ident.scope.getBinding(ident.node.name);
278 - const bindingFromScope = scope.getOwnBinding(ident.node.name);
279 -
280 - if (!bindingFromScope || !bindingFromLookup) return false;
281 -
282 - return bindingFromLookup === bindingFromScope;
283 -}
284 -
285 -export function isBoundAboveScope(
286 - ident: NodePath<t.Identifier | t.JSXIdentifier>,
287 - scope: Scope
288 -): boolean {
289 - const bindingFromLookup = ident.scope.getBinding(ident.node.name);
290 - if (!bindingFromLookup) {
291 - invariant(
292 - ident.scope.hasGlobal(ident.node.name),
293 - `sanity check ${ident.node.name}`
294 - );
295 - return true;
296 - }
297 - let top = bindingFromLookup?.scope.getProgramParent();
298 - let curScope = bindingFromLookup.scope;
299 -
300 - while (curScope !== top) {
301 - if (curScope === scope) return false;
302 - curScope = curScope.parent;
303 - }
304 - return true;
305 -}
306 -
307 -/**
308 - * @returns whether or not @param expr is considered allocating (unstable).
309 - * TODO: we should do this recursively over compound expressions.
310 - */
311 -export function isAllocatingExpr(expr: NodePath<t.Expression>): boolean {
312 - return (
313 - expr.isObjectExpression() ||
314 - expr.isArrayExpression() ||
315 - expr.isFunctionExpression() ||
316 - expr.isArrowFunctionExpression() ||
317 - expr.isClassExpression() ||
318 - expr.isNewExpression() ||
319 - expr.isJSXElement() ||
320 - expr.isJSXFragment() ||
321 - expr.isRegExpLiteral() ||
322 - expr.isCallExpression() ||
323 - expr.isOptionalCallExpression() ||
324 - expr.isTemplateLiteral()
325 - );
326 -}
327 -
328 -/**
329 - * Unlike `t.Function`, this excludes `ClassMethod` and `ClassPrivateMethod`
330 - */
331 -export type NonMethodFunction =
332 - | t.FunctionDeclaration
333 - | t.FunctionExpression
334 - | t.ObjectMethod
335 - | t.ArrowFunctionExpression;
336 -
337 -export function isNonMethodFunction(
338 - node: object | null | undefined,
339 - opts?: object | null
340 -): node is NonMethodFunction {
341 - return (
342 - t.isFunctionDeclaration(node, opts) ||
343 - t.isFunctionExpression(node, opts) ||
344 - t.isObjectMethod(node, opts) ||
345 - t.isArrowFunctionExpression(node, opts)
346 - );
347 -}
348 -
349 -export function isNonMethodFunctionPath(
350 - path: NodePath,
351 - opts?: object | null
352 -): path is NodePath<NonMethodFunction> {
353 - return isNonMethodFunction(path.node, opts);
354 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/IR/index.ts deleted
-31
@@ -1,31 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * The IR in the compiler, or "React IR".
10 - *
11 - * The purpose of IR is to represent the program in the way to help with
12 - * static analysis (e.g. mutability of values, dependencies between values).
13 - *
14 - * Each IR function is lowered from an (inferred) React function.
15 - */
16 -
17 -export * from "./Func";
18 -export * from "./FuncTopLevel";
19 -export {
20 - Hook,
21 - HookCall,
22 - HookCallExpr,
23 - HookKind,
24 - HookSig,
25 - isHookLikeName,
26 - matchHookCall,
27 -} from "./Hook";
28 -export * from "./JSX";
29 -export * from "./Prog";
30 -export * from "./Val";
31 -export * from "./ValSnapshot";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/Block.ts deleted
-163
@@ -1,163 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -import * as IR from "../IR";
8 -import { Instr } from "./Instr";
9 -
10 -/**
11 - * LIR Block.
12 - *
13 - * TODO: revisit this notion and explore the idea of organizing the LIR
14 - * differently (as a tree of "Reactive Scope"):
15 - * - React Func
16 - * - Prologue
17 - * - Input section
18 - * - ReactiveScope (Func.inputs)
19 - * - Instr*
20 - * - ReactiveScope (Instr.inputs)
21 - * - Instr*
22 - * - ReactiveScope
23 - * Where
24 - * type SchedulerUnit = Instr | ReactiveScope
25 - */
26 -export interface Block {
27 - kind: BlockKind;
28 - body: Instr[];
29 -}
30 -
31 -export enum BlockKind {
32 - /**
33 - * {@link RenderBlock} are code that are reactive on their parental reactive
34 - * scope, which is often their containing react functions.
35 - *
36 - * They are generated as-is and are unconditioanlly evaluated every render.
37 - * Such blocks are "unmemoized" in terms of auto-memoization.
38 - */
39 - Render,
40 -
41 - /**
42 - * {@link ReactiveBlock} are code that can be reactive on a smaller subset of
43 - * inputs, i.e. they create their own new reactive scope.
44 - *
45 - * They are generated as being wrapped under a conditional so that they are
46 - * only re-evaluated if their reactive inputs has changed.
47 - *
48 - * Such blocks are "memoized" for auto-memoization, but they are also going to
49 - * be used by reactive effects, etc.
50 - */
51 - Reactive,
52 -}
53 -
54 -export interface RenderBlock extends Block {
55 - kind: BlockKind.Render;
56 -}
57 -
58 -export const isRenderBlock = (block: Block): block is RenderBlock =>
59 - block.kind === BlockKind.Render;
60 -
61 -export function createRenderBlock(instr: Instr): RenderBlock {
62 - return {
63 - kind: BlockKind.Render,
64 - body: [instr],
65 - };
66 -}
67 -
68 -export interface ReactiveBlock extends Block {
69 - kind: BlockKind.Reactive;
70 -
71 - /**
72 - * The set of reactive values invalidates this block.
73 - */
74 - inputs: Set<IR.ReactiveVal>;
75 -
76 - /**
77 - * The set of declarations included in this block.
78 - */
79 - outputDecls: Set<IR.BindingVal>;
80 -
81 - /**
82 - * The set of definitions produced by this block.
83 - */
84 - outputs: Set<IR.BindingVal>;
85 -
86 - /**
87 - * TODO: an fusion optimization can merge other {@link ReactiveBlock} as
88 - * its children to save comparsion.
89 - */
90 - subBlocks: Block[];
91 -
92 - emit(instr: Instr): void;
93 -}
94 -
95 -export function isReactiveBlock(b: Block): b is ReactiveBlock {
96 - return b.kind === BlockKind.Reactive;
97 -}
98 -
99 -export function createReactiveBlock(
100 - inputs: Set<IR.ReactiveVal>
101 -): ReactiveBlock {
102 - return {
103 - kind: BlockKind.Reactive,
104 - body: [],
105 - emit(this: ReactiveBlock, instr: Instr) {
106 - this.body.push(instr);
107 -
108 - for (const decl of instr.ir.decls) {
109 - this.outputDecls.add(decl);
110 - }
111 -
112 - // Add all non-input defs (decls and mutable uses) as outputs.
113 - for (const def of instr.ir.defs) {
114 - if (IR.isBindingVal(def) && !IR.isInputVal(def)) {
115 - this.outputs.add(def);
116 - }
117 - }
118 - },
119 - inputs,
120 - outputDecls: new Set(),
121 - outputs: new Set(),
122 - subBlocks: [],
123 - };
124 -}
125 -
126 -/**
127 - * @returns all uses of a @param block
128 - */
129 -export function getAllUses(block: Block): Set<IR.Val> {
130 - const res = new Set<IR.Val>();
131 - for (const instr of block.body) {
132 - for (const use of instr.ir.uses) {
133 - res.add(use.val);
134 - }
135 - }
136 - return res;
137 -}
138 -
139 -/**
140 - * @returns all definitions of a @param block
141 - */
142 -export function getAllDefs(block: Block): Set<IR.Val> {
143 - const res = new Set<IR.Val>();
144 - for (const instr of block.body) {
145 - for (const def of instr.ir.defs) {
146 - res.add(def);
147 - }
148 - }
149 - return res;
150 -}
151 -
152 -/**
153 - * @returns all declared values of a @param block
154 - */
155 -export function getAllDecls(block: Block): Set<IR.Val> {
156 - const res = new Set<IR.Val>();
157 - for (const instr of block.body) {
158 - for (const def of instr.ir.decls) {
159 - res.add(def);
160 - }
161 - }
162 - return res;
163 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/Func.ts deleted
-35
@@ -1,35 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as IR from "../IR";
9 -import { Block } from "./Block";
10 -import { createMemoCache, MemoCache } from "./MemoCache";
11 -
12 -/**
13 - * LIR Function.
14 - */
15 -export class Func {
16 - // React IR
17 - ir: IR.Func;
18 - hasSingleReturnPath: boolean;
19 -
20 - blocks: Block[] = [];
21 -
22 - // The associated memoization cache IR.
23 - memoCache: MemoCache = createMemoCache();
24 -
25 - constructor(ir: IR.Func) {
26 - this.ir = ir;
27 - this.hasSingleReturnPath =
28 - (!ir.isImplicitReturn && ir.returnCount == 1) ||
29 - (ir.isImplicitReturn && ir.returnCount == 0);
30 - }
31 -
32 - addBlock(block: Block): void {
33 - this.blocks.push(block);
34 - }
35 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/Instr.ts deleted
-70
@@ -1,70 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -import type { NodePath } from "@babel/traverse";
8 -import * as t from "@babel/types";
9 -import * as IR from "../IR";
10 -
11 -/**
12 - * LIR Instruction.
13 - *
14 - * This is a thin abstraction over {@link IR.FuncTopLevel} to help with
15 - * reorder/reoganizing/rescheduling them into {@link LIR.Block} for code gen.
16 - */
17 -export class Instr {
18 - ir: IR.FuncTopLevel;
19 - ast: NodePath<t.Statement>;
20 -
21 - /**
22 - * The set of reactive values invalidates this instr.
23 - */
24 - inputs: Set<IR.ReactiveVal>;
25 -
26 - constructor(topLevel: IR.FuncTopLevel, irFunc: IR.Func) {
27 - this.ir = topLevel;
28 - this.ast = topLevel.ast;
29 - this.inputs = new Set<IR.ReactiveVal>();
30 -
31 - // Iterating over decls and uses of Instr to collect their inputs.
32 - topLevel.decls.forEach((def) =>
33 - irFunc.depGraph
34 - .getOrCreateVertex(def)
35 - .inputs.forEach((val) => this.inputs.add(val))
36 - );
37 - topLevel.uses.forEach((ref) =>
38 - irFunc.depGraph
39 - .getOrCreateVertex(ref.val)
40 - .inputs.forEach((val) => this.inputs.add(val))
41 - );
42 - }
43 -
44 - /**
45 - * @return whether or not this instr is required every render.
46 - *
47 - * This is defined as whether or not the block has inputs or
48 - * contains any hook calls.
49 - */
50 - isRequiredEveryRender(): boolean {
51 - return (
52 - this.ir.hookCalls.length > 0 ||
53 - this.ir.decls.some((bVal) => IR.isInputVal(bVal))
54 - );
55 - }
56 -
57 - /**
58 - * @return whether or not a body item is considered exitable e.g. early return
59 - */
60 - isExitable(): boolean {
61 - return this.ir.returnStmts.size > 0;
62 - }
63 -
64 - /**
65 - * @return whether or not a body item is considered "pinned".
66 - */
67 - isPinned(): boolean {
68 - return this.isExitable();
69 - }
70 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/MemoCache.ts deleted
-175
@@ -1,175 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as IR from "../IR";
9 -
10 -/**
11 - * The Memoization Cache, or MemoCache.
12 - *
13 - * This is the compile-time abstraction device of the runtime memoCache that
14 - * we'll allocate from `React.useMemoCache` hooks for each React functions.
15 - */
16 -
17 -export enum EntryKind {
18 - Fixed = "FIXED",
19 - Reactive = "REACTIVE",
20 - Local = "LOCAL",
21 - Expr = "EXPR",
22 -}
23 -
24 -/**
25 - * MemoCache entries are allocated in the {@link MemoCacheAlloc} pass.
26 - * They are tagged union of three kinds:
27 - */
28 -export interface Entry {
29 - kind: EntryKind;
30 - value: IR.Val | Symbol;
31 - index: number;
32 -}
33 -
34 -/**
35 - * 0. fixed overhead.
36 - */
37 -export interface FixedEntry extends Entry {
38 - kind: EntryKind.Fixed;
39 - value: Symbol;
40 -}
41 -
42 -/**
43 - * 1. used to cache every reactive values.
44 - */
45 -export interface ReactiveEntry extends Entry {
46 - kind: EntryKind.Reactive;
47 - value: IR.ReactiveVal;
48 -}
49 -
50 -/**
51 - * 2. used to cache intermediate non-reactive local bindings.
52 - */
53 -export interface LocalEntry extends Entry {
54 - kind: EntryKind.Local;
55 - value: IR.BindingVal;
56 -}
57 -
58 -/**
59 - * 3. used to cache intermediate (inlined) expressions.
60 - */
61 -export interface ExprEntry extends Entry {
62 - kind: EntryKind.Expr;
63 - value: IR.ExprVal;
64 -}
65 -
66 -export const isReactiveEntry = (entry: Entry): entry is ReactiveEntry =>
67 - entry.kind === EntryKind.Reactive;
68 -
69 -export const isLocalEntry = (entry: Entry): entry is LocalEntry =>
70 - entry.kind === EntryKind.Local;
71 -
72 -export const isExprEntry = (entry: Entry): entry is ExprEntry =>
73 - entry.kind === EntryKind.Expr;
74 -
75 -export const isFixedEntry = (entry: Entry): entry is FixedEntry =>
76 - entry.kind === EntryKind.Fixed;
77 -
78 -export type EntryKey = IR.Val | Symbol;
79 -
80 -export const BAD_INDEX = -1;
81 -
82 -const retValSym = Symbol.for("ret");
83 -const retIdxSym = Symbol.for("ret_idx");
84 -
85 -/**
86 - * A compilation environment is a fancy way to say a bookkeeping that associates
87 - * part of the program (in this case, `props`, `state` variables and `refs`) to
88 - * some compile-time metadata (in this case, the memoCache {@link Entry}).
89 - */
90 -export class MemoCache {
91 - /**
92 - * The underlying entries of the environment
93 - */
94 - entries: Map<EntryKey, Entry>;
95 - retValPos: number | null;
96 - retIdxPos: number | null;
97 -
98 - constructor() {
99 - this.entries = new Map();
100 - this.retValPos = null;
101 - this.retIdxPos = null;
102 - }
103 -
104 - get size() {
105 - return this.entries.size;
106 - }
107 -
108 - alloc(key: EntryKey, entry: Entry) {
109 - this.entries.set(key, entry);
110 - }
111 -
112 - allocRetVal() {
113 - const entry: FixedEntry = {
114 - kind: EntryKind.Fixed,
115 - value: retValSym,
116 - index: BAD_INDEX,
117 - };
118 - this.alloc(retValSym, entry);
119 - }
120 -
121 - allocRetIdx() {
122 - const entry: FixedEntry = {
123 - kind: EntryKind.Fixed,
124 - value: retIdxSym,
125 - index: BAD_INDEX,
126 - };
127 - this.alloc(retIdxSym, entry);
128 - }
129 -
130 - allocReactive(val: IR.ReactiveVal) {
131 - const entry: ReactiveEntry = {
132 - kind: EntryKind.Reactive,
133 - value: val,
134 - index: BAD_INDEX,
135 - };
136 - this.alloc(val, entry);
137 - }
138 -
139 - allocLocal(val: IR.BindingVal) {
140 - const entry: LocalEntry = {
141 - kind: EntryKind.Local,
142 - value: val,
143 - index: BAD_INDEX,
144 - };
145 - this.alloc(val, entry);
146 - }
147 -
148 - allocExpr(val: IR.ExprVal) {
149 - const entry: ExprEntry = {
150 - kind: EntryKind.Expr,
151 - value: val,
152 - index: BAD_INDEX,
153 - };
154 - this.alloc(val, entry);
155 - }
156 -
157 - /**
158 - * Optimizations over LIR have freedom to manipulate the {@link entries} and
159 - * during that process index may change.
160 - *
161 - * This function is intended to be called right before code generation to
162 - * finalize the index in codegen.
163 - */
164 - finializeIndices(this: MemoCache) {
165 - [...this.entries.values()].forEach((entry, index) => {
166 - entry.index = index;
167 - });
168 - this.retValPos = this.entries.get(retValSym)?.index ?? null;
169 - this.retIdxPos = this.entries.get(retIdxSym)?.index ?? null;
170 - }
171 -}
172 -
173 -export function createMemoCache(): MemoCache {
174 - return new MemoCache();
175 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/PrettyPrinter.ts deleted
-155
@@ -1,155 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import generate from "@babel/generator";
9 -import * as t from "@babel/types";
10 -import * as LIR from ".";
11 -import { assertExhaustive } from "../Common/utils";
12 -import { invariant } from "../CompilerError";
13 -import * as IR from "../IR";
14 -import {
15 - addComments,
16 - renameReactiveVal,
17 - revertAddComments,
18 - revertRenameReactiveVal,
19 -} from "../IR/PrettyPrinter";
20 -import {
21 - EntryKind,
22 - isExprEntry,
23 - isFixedEntry,
24 - isLocalEntry,
25 - isReactiveEntry,
26 -} from "./MemoCache";
27 -
28 -export default function prettyPrint(lirFunc: LIR.Func) {
29 - renameReactiveVal(lirFunc.ir);
30 -
31 - const commentedNodes: t.Node[] = [];
32 - addComments(lirFunc.ir, commentedNodes, lirFunc);
33 -
34 - const prettyAST = buildPrettyAST(lirFunc, commentedNodes);
35 - const babelOutput = generate(prettyAST, { concise: true }).code;
36 -
37 - revertRenameReactiveVal(lirFunc.ir);
38 - revertAddComments(commentedNodes);
39 -
40 - return babelOutput;
41 -}
42 -
43 -/**
44 - * Build an @returns AST for pretty printing to avoid mutating
45 - * the original AST.
46 - */
47 -function buildPrettyAST(lirFunc: LIR.Func, commentedNodes: t.Node[]) {
48 - const funcNode = lirFunc.ir.ast.node;
49 -
50 - let name: t.Identifier | undefined;
51 - if ("id" in funcNode && funcNode.id) name = funcNode.id;
52 - else if (lirFunc.ir.name) name = t.identifier(lirFunc.ir.name.toString());
53 -
54 - if (name) {
55 - const commentedNode = t.addComment(name, "leading", lirFunc.ir.kind);
56 - commentedNodes.push(commentedNode);
57 - }
58 -
59 - const params = funcNode.params;
60 - const body = lirFunc.ir.ast.get("body");
61 -
62 - // See {@link ReactFuncsInfer} for the reason.
63 - if (!body.isBlockStatement()) throw new Error("unreachable");
64 - const directives = body.node.directives;
65 -
66 - const stmts: t.Statement[] = [genPrologue(lirFunc)];
67 -
68 - lirFunc.blocks.forEach((block) => {
69 - // Convert ReactiveBlock into IfStatements with a label of outputs
70 - if (LIR.isReactiveBlock(block)) {
71 - const callExpr = t.callExpression(
72 - t.identifier("$$"),
73 - [...block.inputs].map((reactiveVal) =>
74 - // Must clone since it seems comments are only attached to one
75 - // instance of the same node, regardless of how many references exist.
76 - // Same with the following cases.
77 - t.cloneNode(reactiveVal.binding.identifier)
78 - )
79 - );
80 -
81 - const blockStmt = t.blockStatement(
82 - block.body.map((instr) => instr.ast.node)
83 - );
84 -
85 - const ifStmt = t.ifStatement(callExpr, blockStmt);
86 -
87 - const blockOutputs = block.outputs;
88 -
89 - if (blockOutputs.size !== 0) {
90 - const outputIdents = [...blockOutputs].map((o) =>
91 - t.cloneNode(o.binding.identifier)
92 - );
93 -
94 - stmts.push(
95 - t.labeledStatement(
96 - t.identifier("$"),
97 - t.expressionStatement(t.sequenceExpression(outputIdents))
98 - )
99 - );
100 - }
101 -
102 - stmts.push(ifStmt);
103 - }
104 - // RenderBlock
105 - else {
106 - const subStmts = block.body.map((instr) => instr.ast.node);
107 - stmts.push(...subStmts);
108 - }
109 - });
110 -
111 - const ast = t.functionDeclaration(
112 - name ?? t.identifier("_anno"),
113 - params,
114 - t.blockStatement(stmts, directives)
115 - );
116 -
117 - return ast;
118 -}
119 -
120 -function genPrologue(lirFunc: LIR.Func): t.Statement {
121 - const memoCacheArray: t.Identifier[] = [];
122 -
123 - [...lirFunc.memoCache.entries.values()].forEach((e) => {
124 - let ident;
125 -
126 - switch (e.kind) {
127 - case EntryKind.Fixed:
128 - invariant(isFixedEntry(e), "");
129 - ident = t.identifier(e.value.toString());
130 - break;
131 - case EntryKind.Expr:
132 - invariant(isExprEntry(e), "");
133 - ident = t.identifier(IR.formatValKind(e.value).toLowerCase());
134 - t.addComment(ident, "leading", e.value.toLoc());
135 - break;
136 - case EntryKind.Reactive:
137 - case EntryKind.Local:
138 - invariant(isReactiveEntry(e) || isLocalEntry(e), "");
139 - ident = t.cloneNode(e.value.binding.identifier);
140 - break;
141 - default:
142 - assertExhaustive(e.kind, `Unhandled Entry ${e}`);
143 - }
144 -
145 - memoCacheArray.push(ident);
146 - });
147 -
148 - return t.expressionStatement(
149 - t.assignmentExpression(
150 - "=",
151 - t.identifier("$"),
152 - t.arrayExpression(memoCacheArray)
153 - )
154 - );
155 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/Prog.ts deleted
-19
@@ -1,19 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as IR from "../IR";
9 -import { Func } from "./Func";
10 -
11 -export class Prog {
12 - ir: IR.Prog;
13 -
14 - funcs: Map<IR.Func, Func> = new Map();
15 -
16 - constructor(ir: IR.Prog) {
17 - this.ir = ir;
18 - }
19 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/LIR/index.ts deleted
-18
@@ -1,18 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * The LIR (Low-level IR) in the compiler.
10 - *
11 - * Each LIR function is lowered from an IR function
12 - */
13 -
14 -export * from "./Block";
15 -export * from "./Func";
16 -export * from "./Instr";
17 -export * as MemoCache from "./MemoCache";
18 -export * from "./Prog";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Logger.ts deleted
-85
@@ -1,85 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as t from "@babel/types";
9 -import { ErrorCode } from "./Diagnostic";
10 -import * as IR from "./IR";
11 -
12 -/**
13 - * Interface to log from the Babel plugin. In environments where we cannot
14 - * log to stdout/stderr this makes it easy to disable.
15 - */
16 -export interface Logger {
17 - warn(message: string): void;
18 - error(message: string): void;
19 - logEvent(event: LogEvent): void;
20 -}
21 -
22 -/**
23 - * Define events that need to be logged
24 - */
25 -type LogEvent =
26 - | {
27 - name: "bailout";
28 - reason: string;
29 - }
30 - | {
31 - name: "registerReactFunc";
32 - flags: { name: IR.Name; kind: IR.FuncKind };
33 - }
34 - | {
35 - name: "diagnostics";
36 - opts: {
37 - code: ErrorCode;
38 - loc: t.SourceLocation | null;
39 - };
40 - }
41 - | {
42 - name: "matchHookCall";
43 - kind: IR.HookKind;
44 - };
45 -
46 -/**
47 - * Logs to `console`.
48 - */
49 -export const consoleLogger: Logger = {
50 - warn(message: string) {
51 - console.warn(message);
52 - },
53 - error(message: string) {
54 - console.error(message);
55 - },
56 - logEvent(_event: LogEvent) {},
57 -};
58 -
59 -/**
60 - * Logs to an in memory array.
61 - *
62 - * @param logs Logs are written to this array.
63 - */
64 -export function createArrayLogger(logs: Array<string>): Logger {
65 - return {
66 - warn(message: string) {
67 - logs.push(`[WARNING] ${message}`);
68 - },
69 -
70 - error(message: string) {
71 - logs.push(`[ERROR] ${message}`);
72 - },
73 -
74 - logEvent(_event: LogEvent) {},
75 - };
76 -}
77 -
78 -/**
79 - * Does not log anything.
80 - */
81 -export const noopLogger: Logger = {
82 - warn(_message: string) {},
83 - error(_message: string) {},
84 - logEvent(_event: LogEvent) {},
85 -};
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/BodyAnalysis.ts deleted
-284
@@ -1,284 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import { invariant } from "../CompilerError";
12 -import * as IR from "../IR";
13 -import { isJSXTagVal } from "../IR";
14 -import { hasMultipleReturn } from "../IR/Func";
15 -import { PassKind, PassName } from "../Pass";
16 -
17 -/**
18 - * Body Analysis
19 - *
20 - * This middle end analyze the "FunctionBody" position of react func to collect
21 - * each "FunctionStatementList" item as {@link IR.FuncTopLevel} and resolve
22 - * hooks calls as {@link React.HookCall}.
23 - */
24 -export default {
25 - name: PassName.BodyAnalysis,
26 - kind: PassKind.IRFunc as const,
27 - run,
28 -};
29 -
30 -export function run(
31 - irFunc: IR.Func,
32 - func: NodePath<t.Function>,
33 - context: CompilerContext
34 -) {
35 - const funcBody = func.get("body");
36 -
37 - invariant(
38 - funcBody.isBlockStatement(),
39 - "ReactFuncsInfer ruled out expression-body functions."
40 - );
41 -
42 - funcBody.traverse({
43 - // FunctionBody: FunctionStatementList: StatementListItem
44 - Statement(stmt) {
45 - // Traverse only top-level statement list items.
46 - stmt.skip();
47 -
48 - let topLevel = new IR.FuncTopLevel(stmt, irFunc.env);
49 - irFunc.body.push(topLevel);
50 -
51 - visitHookCalls(topLevel);
52 - visitDerivedImmutables(topLevel);
53 - visitJSX(topLevel);
54 - visitArgumentsObject(topLevel);
55 - collectExits(topLevel);
56 - checkBlock(topLevel);
57 - },
58 - });
59 -
60 - if (context.opts.flags.bailOnMultipleReturns && hasMultipleReturn(irFunc)) {
61 - context.bailout("BailOnMultipleReturns", {
62 - code: "E0011",
63 - path: null,
64 - context: null,
65 - });
66 - }
67 -
68 - /**
69 - * Sanity check.
70 - */
71 - function checkBlock(topLevel: IR.FuncTopLevel) {
72 - if (topLevel.isDecl) {
73 - invariant(
74 - topLevel.returnStmts.size === 0,
75 - "Decl won't return: %s",
76 - topLevel.ast.node
77 - );
78 - } else {
79 - invariant(
80 - topLevel.decls.length === 0,
81 - "Only Decl can produce decls: %s",
82 - topLevel.ast.node
83 - );
84 - }
85 - }
86 -
87 - /**
88 - * Visit JSX in @param topLevel
89 - */
90 - function visitJSX(topLevel: IR.FuncTopLevel) {
91 - topLevel.ast.traverse({
92 - JSXElement(jsxEle) {
93 - visitJSXTag(jsxEle);
94 - },
95 - JSXFragment(jsxFrag) {
96 - visitJSXTag(jsxFrag);
97 - },
98 - });
99 -
100 - function visitJSXTag(rootTag: NodePath<IR.JSXTag>) {
101 - rootTag.skip();
102 -
103 - const rootVal = new IR.JSXTreeBuilder(rootTag, irFunc).build();
104 - collectExprInJSXTree(rootVal);
105 - topLevel.jsxTreeRoots.push(rootVal);
106 - }
107 -
108 - function collectExprInJSXTree(expr: IR.ExprVal) {
109 - irFunc.env.exprs.set(expr.ast.path, expr);
110 - topLevel.refsToExprs.push(expr.getRef());
111 -
112 - if (isJSXTagVal(expr)) {
113 - expr.children.forEach((subExpr) => collectExprInJSXTree(subExpr));
114 - }
115 - }
116 - }
117 -
118 - /**
119 - * Visit Hook-like CallExpressions in @param topLevel
120 - *
121 - * N.B. Same as {@link ReactFuncsInfer}, CallExpression are where we look
122 - * for hook calls.
123 - */
124 - function visitHookCalls(topLevel: IR.FuncTopLevel) {
125 - function visitHookCallExpr(call: NodePath<IR.HookCallExpr>) {
126 - function onInvalidHookNamespace(
127 - expression: t.Expression,
128 - isBuiltinHook: boolean
129 - ): void {
130 - if (isBuiltinHook) {
131 - context.bailout("BailOnBuiltinHookWithInvalidHookNamespace", {
132 - code: "E0016",
133 - path: call,
134 - context: null,
135 - });
136 - }
137 - if (isAllPascalCaseNameSpace(expression)) {
138 - context.bailout("BailOnValidHookNamespace", {
139 - code: "E0017",
140 - path: call,
141 - context: null,
142 - });
143 - }
144 - }
145 -
146 - const hookCall = IR.HookCall.resolve(call, onInvalidHookNamespace);
147 - if (hookCall) {
148 - if (
149 - context.opts.flags.bailOnUseRef &&
150 - hookCall.hook.kind === IR.HookKind.UseRef
151 - ) {
152 - context.bailout("BailOnUseRef", {
153 - code: "E0012",
154 - path: call,
155 - context: null,
156 - });
157 - }
158 - // Pattern matching and refine the return position.
159 - hookCall.matchRetVals(irFunc, context);
160 - topLevel.hookCalls.push(hookCall);
161 - }
162 - }
163 - topLevel.ast.traverse({
164 - CallExpression: visitHookCallExpr,
165 - OptionalCallExpression: visitHookCallExpr,
166 - });
167 - }
168 -
169 - /**
170 - * Visit VariableDeclarator to look for derived immutables.
171 - */
172 - function visitDerivedImmutables(topLevel: IR.FuncTopLevel) {
173 - topLevel.ast.traverse({
174 - VariableDeclarator(varDeclarator) {
175 - const lval = varDeclarator.get("id");
176 - const rhs = varDeclarator.get("init");
177 -
178 - if (rhs.isExpression()) {
179 - const from = isDerivedFromInput(rhs);
180 - if (from) {
181 - irFunc.env.getDeclsFrom(lval).forEach((val) => {
182 - IR.refineToDerivedImmutVal(val, from, true);
183 - });
184 - }
185 - }
186 - },
187 - });
188 -
189 - function isDerivedFromInput(
190 - expr: NodePath<t.Expression>
191 - ): IR.InputVal | undefined {
192 - // let x = INPUT
193 - if (expr.isIdentifier()) {
194 - const val = irFunc.env.decls.get(expr.node.name);
195 - if (val && IR.isInputVal(val)) return val;
196 - }
197 - // let x = INPUT.property
198 - if (expr.isMemberExpression()) {
199 - const obj = expr.get("object");
200 - if (obj.isIdentifier() || obj.isMemberExpression()) {
201 - return isDerivedFromInput(obj);
202 - }
203 - }
204 - return undefined;
205 - }
206 - }
207 -
208 - /**
209 - * Looking for `argument` object.
210 - */
211 - function visitArgumentsObject(topLevel: IR.FuncTopLevel) {
212 - topLevel.ast.traverse({
213 - Identifier(ident) {
214 - if (ident.node.name !== "arguments") return;
215 -
216 - // Bailout of handling the special arguments object.
217 - // OK, not actually arguments
218 - if (ident.parent) {
219 - // const foo = {arguments: 1}
220 - // class Foo {arguments = 1}
221 - const isProperty =
222 - t.isProperty(ident.parent) && ident.parent.key === ident.node;
223 - // a.arguments
224 - const isPropertyAccess =
225 - t.isMemberExpression(ident.parent) &&
226 - ident.parent.property === ident.node;
227 - // const foo = {arguments() {}}
228 - // class Foo {arguments() {}}
229 - const isMethod =
230 - (t.isClassMethod(ident.parent) || t.isObjectMethod(ident.parent)) &&
231 - ident.parent.key === ident.node;
232 - // class Foo {#arguments = 1}
233 - const isPrivate = t.isPrivateName(ident.parent);
234 -
235 - if (isProperty || isPropertyAccess || isMethod || isPrivate) return;
236 - }
237 -
238 - context.bailout("ArgumentsObject", {
239 - code: "E0020",
240 - path: ident,
241 - context: null,
242 - });
243 - },
244 - });
245 - }
246 -
247 - /**
248 - * Collect control flow exits.
249 - */
250 - function collectExits(topLevel: IR.FuncTopLevel) {
251 - const stmt = topLevel.ast;
252 - if (stmt.isReturnStatement()) {
253 - // Found top-level return.
254 - irFunc.isImplicitReturn = false;
255 - topLevel.returnStmts.set(stmt, irFunc.returnCount++);
256 - } else {
257 - stmt.traverse({
258 - ReturnStatement(ret) {
259 - if (ret.getFunctionParent() === irFunc.ast) {
260 - topLevel.returnStmts.set(ret, irFunc.returnCount++);
261 - }
262 - },
263 - });
264 - }
265 - }
266 -}
267 -
268 -// Detect benign cases of `A.B.C.useFoo()`
269 -function isAllPascalCaseNameSpace(expression: t.Expression): boolean {
270 - const isPascalCaseNameSpace = (ns: string) => /^[A-Z].*/.test(ns);
271 - if (t.isIdentifier(expression)) {
272 - return isPascalCaseNameSpace(expression.name);
273 - }
274 - if (t.isMemberExpression(expression)) {
275 - if (
276 - t.isIdentifier(expression.property) &&
277 - !isPascalCaseNameSpace(expression.property.name)
278 - ) {
279 - return false;
280 - }
281 - return isAllPascalCaseNameSpace(expression.object);
282 - }
283 - return false;
284 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/DepGraphAnalysis.ts deleted
-322
@@ -1,322 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { assertExhaustive } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import { invariant } from "../CompilerError";
13 -import { OutputKind } from "../CompilerOutputs";
14 -import { BlockId, buildCFG, CFG } from "../ControlFlowGraph";
15 -import * as DepGraph from "../DepGraph";
16 -import * as IR from "../IR";
17 -import { PassKind, PassName } from "../Pass";
18 -
19 -/**
20 - * Dependency Graph Analysis.
21 - *
22 - * This pass
23 - * 1. first constructs a {@link DepGraph.ValGraph} upon {@link IR.Func}.
24 - * 2. then condences the collceted ValGraph into {@link DepGraph.SCCGraph}.
25 - * 3. finally reduces the dependency relations of SCCGraph in-place to a
26 - * "invalidation table" via a topological iterative process.
27 - */
28 -export default {
29 - name: PassName.DepGraphAnalysis,
30 - kind: PassKind.IRFunc as const,
31 - run,
32 -};
33 -
34 -function run(
35 - irFunc: IR.Func,
36 - func: NodePath<t.Function>,
37 - context: CompilerContext
38 -) {
39 - const { outputKinds } = context.opts;
40 -
41 - const valGraph = irFunc.depGraph;
42 - populateValGraph(valGraph, irFunc);
43 - checkValGraph(valGraph);
44 -
45 - if (outputKinds.includes(OutputKind.ValGraph)) {
46 - context.outputs[OutputKind.ValGraph].push(valGraph.snapshot());
47 - }
48 -
49 - const sccGraph = valGraph.condense();
50 - checkSCCGraph(sccGraph, context);
51 -
52 - if (outputKinds.includes(OutputKind.SCCGraph)) {
53 - context.outputs[OutputKind.SCCGraph].push(sccGraph.snapshot());
54 - }
55 -
56 - sccGraph.reduce();
57 -
58 - if (outputKinds.includes(OutputKind.RedGraph)) {
59 - context.outputs[OutputKind.RedGraph].push(sccGraph.snapshot());
60 - }
61 -}
62 -
63 -/**
64 - * Collect direct dependencies for the given @param irFunc and construct the
65 - * initial {@link DepGraph.ValGraph} according to syntax-directed rules.
66 - */
67 -function populateValGraph(valGraph: DepGraph.ValGraph, irFunc: IR.Func) {
68 - // Create vertices for params.
69 - for (const param of irFunc.params) {
70 - visitValDefSite(param);
71 - }
72 -
73 - /**
74 - * Pass over ir function body.
75 - *
76 - * Note: Creating vertices for {@link IR.FuncTopLevel} will form cycles. Instead,
77 - * their dependencies can be computed over their defs and uses. We'll compute
78 - * them later in the BackEnd for the sake of code reorganization.
79 - */
80 - for (const topLevel of irFunc.body) {
81 - /**
82 - * Each topLevel may generate 0 or more {@link Vertex} for each of its
83 - * declarations, e.g. a VariableDeclaration may have multiple VarDeclarators.
84 - */
85 - for (const decl of topLevel.decls) {
86 - visitValDefSite(decl);
87 - }
88 -
89 - /**
90 - * Each topLevel will establish dependencies between its "uses".
91 - * For every mutable refs used in the statement, conservatively assume that
92 - * they may be mutated by (therefore, depends on) all other referenced vals:
93 - */
94 - for (const mutableUse of topLevel.mutableUses) {
95 - const mutableRefVertex = valGraph.getOrCreateVertex(mutableUse.val);
96 - for (const otherUse of topLevel.uses) {
97 - // ignore exprVal.
98 - if (IR.isExprVal(otherUse.val)) continue;
99 - // ignore itself.
100 - if (otherUse.val !== mutableUse.val) {
101 - mutableRefVertex.addDependency(otherUse.val);
102 - }
103 - }
104 - }
105 -
106 - /**
107 - * Each toplevel may have multiple JSX tree which will establish
108 - * parent-children dependencnies within the tree nodes.
109 - */
110 - topLevel.jsxTreeRoots.forEach(visitJSXTag);
111 - function visitJSXTag(jsxTagVal: IR.JSXTagVal) {
112 - const v = valGraph.getOrCreateVertex(jsxTagVal);
113 - for (const child of jsxTagVal.children) {
114 - v.addDependency(child);
115 -
116 - if (IR.isJSXTagVal(child)) {
117 - visitJSXTag(child);
118 - } else {
119 - visitValDefSite(child);
120 - }
121 - }
122 - return v;
123 - }
124 - }
125 -
126 - const cfg = buildCFG(irFunc);
127 - const cfgControlDependencies = computeCfgControlDeps(irFunc, cfg);
128 - for (const [blockId, controlDeps] of cfgControlDependencies) {
129 - if (controlDeps.size === 0) {
130 - continue;
131 - }
132 - const basicBlock = cfg.blocks.get(blockId)!;
133 - basicBlock.parents.forEach((parent) => {
134 - for (const dep of controlDeps) {
135 - for (const val of parent.defs) {
136 - invariant(
137 - !IR.isInputVal(val),
138 - "No inputs should be control dependent."
139 - );
140 - valGraph.getOrCreateVertex(val).addDependency(dep);
141 - }
142 - }
143 - });
144 - }
145 -
146 - /**
147 - * Visit the defintion site of the given @param val to collect other
148 - * referenced identifiers appeared syntactically during its initialization
149 - * as its dependencies. Such informations are captured by constructing a
150 - * fragment of {@link DepGraph} around the vertex associated with this
151 - * @param value.
152 - * @returns the vertex associated with the @param val
153 - */
154 - function visitValDefSite(
155 - val: IR.BindingVal | IR.ExprVal
156 - ): DepGraph.ValVertex {
157 - const vertex = irFunc.depGraph.getOrCreateVertex(val);
158 -
159 - // Inputs e.g. states are always recomputed on every render so there is
160 - // no need to collect their dependencies. e.g. it's safe to ignore edge
161 - // `p -> x` for `[x, setX] = useState(p)`.
162 - if (IR.isInputVal(val)) {
163 - // However, only unstable inputs need to be tracked as "roots" because
164 - // there is no need to "diff" stable values.
165 - if (IR.isReactiveVal(val)) vertex.refineToReactiveInput();
166 - }
167 -
168 - // Note: For VariableDeclaration, the binding.path is already
169 - // narrowed to only its own definitional VariableDeclarator.
170 - irFunc.env.getRefsToDeclsFrom(val.ast.path).map((ref) => {
171 - // Don't add Inputs to each other
172 - if (IR.isInputVal(val) && IR.isInputVal(ref.val)) return;
173 -
174 - vertex.addDependency(ref.val);
175 - });
176 -
177 - return vertex;
178 - }
179 -}
180 -
181 -function checkValGraph(valGraph: DepGraph.ValGraph) {
182 - for (const [val, vertex] of valGraph.vertices) {
183 - if (IR.isReactiveVal(val)) {
184 - invariant(
185 - vertex.inputs.size === 1 && vertex.inputs.has(val),
186 - "Input vertices must only contain itself."
187 - );
188 - }
189 - }
190 -}
191 -
192 -function checkSCCGraph(sccGraph: DepGraph.SCCGraph, context: CompilerContext) {
193 - for (const scc of sccGraph.vertices) {
194 - if (scc.isInput()) continue;
195 -
196 - for (const valVertex of scc.members) {
197 - if (IR.isInputVal(valVertex.val)) {
198 - context.bailout("InputInDepGraphCycle", {
199 - code: "E0021",
200 - path: valVertex.val.ast.path,
201 - context: {
202 - name: valVertex.val.binding.identifier.name,
203 - },
204 - });
205 - }
206 - }
207 - }
208 -}
209 -
210 -export function computeCfgControlDeps(
211 - irFunc: IR.Func,
212 - cfg: CFG
213 -): Map<BlockId, Set<IR.Val>> {
214 - const queue: Array<QueueEntry> = [
215 - { targetBlock: cfg.entry, dependencies: new Set() },
216 - ];
217 - const blockControlDeps: Map<BlockId, ControlDependencies> = new Map();
218 - while (queue.length !== 0) {
219 - const { targetBlock: blockId, dependencies: inputDeps } = queue.shift()!;
220 - let controlDeps = blockControlDeps.get(blockId) ?? null;
221 - if (controlDeps === null) {
222 - controlDeps = new ControlDependencies();
223 - controlDeps.addDependencies(inputDeps);
224 - blockControlDeps.set(blockId, controlDeps);
225 - } else {
226 - const hasChanges = controlDeps.addDependencies(inputDeps);
227 - if (!hasChanges) {
228 - continue;
229 - }
230 - }
231 -
232 - const nextDeps = controlDeps.getDependencies();
233 -
234 - const block = cfg.blocks.get(blockId)!;
235 - switch (block.terminal.kind) {
236 - case "if": {
237 - queue.push({
238 - targetBlock: block.terminal.consequent,
239 - dependencies: nextDeps,
240 - });
241 - queue.push({
242 - targetBlock: block.terminal.alternate,
243 - dependencies: nextDeps,
244 - });
245 - break;
246 - }
247 - case "switch": {
248 - for (const case_ of block.terminal.cases) {
249 - queue.push({
250 - targetBlock: case_.block,
251 - dependencies: nextDeps,
252 - });
253 - }
254 - break;
255 - }
256 - case "return":
257 - case "goto": {
258 - if (block.terminal.kind === "goto") {
259 - queue.push({
260 - targetBlock: block.terminal.block,
261 - dependencies: nextDeps,
262 - });
263 - }
264 - if (block.terminal.fallthrough !== null) {
265 - const { block: fallthroughBlock, tests } = block.terminal.fallthrough;
266 - (tests ?? []).forEach((test) => {
267 - irFunc.env.getRefsToDeclsFrom(test).forEach((ref) => {
268 - nextDeps.add(ref.val);
269 - });
270 - });
271 - queue.push({
272 - targetBlock: fallthroughBlock,
273 - dependencies: nextDeps,
274 - });
275 - }
276 - break;
277 - }
278 - case "throw": {
279 - break;
280 - }
281 - default: {
282 - assertExhaustive(block.terminal, "Unexpected terminal kind");
283 - }
284 - }
285 - }
286 - const finalDeps = new Map();
287 - for (const [blockId, controls] of blockControlDeps) {
288 - finalDeps.set(blockId, controls.getDependencies());
289 - }
290 - return finalDeps;
291 -}
292 -
293 -type QueueEntry = {
294 - /**
295 - * Block being transferred to.
296 - */
297 - targetBlock: BlockId;
298 - /**
299 - * "Control" dependencies which affect early returns or breaks that *may* prevent
300 - * the target block from being reached.
301 - */
302 - dependencies: Set<IR.Val>;
303 -};
304 -
305 -class ControlDependencies {
306 - #dependencies: Set<IR.Val> = new Set();
307 -
308 - addDependencies(deps: Set<IR.Val>): boolean {
309 - let hasChanges = false;
310 - for (const dep of deps) {
311 - if (!this.#dependencies.has(dep)) {
312 - hasChanges = true;
313 - this.#dependencies.add(dep);
314 - }
315 - }
316 - return hasChanges;
317 - }
318 -
319 - getDependencies(): Set<IR.Val> {
320 - return new Set([...this.#dependencies]);
321 - }
322 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/DumpCFG.ts deleted
-124
@@ -1,124 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import { assertExhaustive } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import { OutputKind } from "../CompilerOutputs";
13 -import { buildCFG, Terminal } from "../ControlFlowGraph";
14 -import * as IR from "../IR";
15 -import { PassKind, PassName } from "../Pass";
16 -import { computeCfgControlDeps } from "./DepGraphAnalysis";
17 -
18 -/**
19 - * Dump CFG
20 - */
21 -export default {
22 - name: PassName.DumpCFG,
23 - kind: PassKind.IRFunc as const,
24 - run,
25 -};
26 -
27 -export function run(
28 - irFunc: IR.Func,
29 - func: NodePath<t.Function>,
30 - context: CompilerContext
31 -) {
32 - if (context.opts.outputKinds.includes(OutputKind.CFG)) {
33 - const cfg = buildCFG(irFunc);
34 - const controlDeps = computeCfgControlDeps(irFunc, cfg);
35 - const output = [];
36 - output.push(`entry: bb${cfg.entry}`);
37 - const blockIds = Array.from(cfg.blocks.keys()).sort();
38 - for (const blockId of blockIds) {
39 - const { body, terminal, parents } = cfg.blocks.get(blockId)!;
40 - output.push("");
41 - output.push(`bb${blockId}:`);
42 - for (const stmt of body) {
43 - output.push(" " + String(stmt));
44 - }
45 - output.push("@parents:");
46 - for (const parent of parents) {
47 - let printed = String(parent.ast).trim();
48 - let limit = printed.indexOf("{");
49 - limit = limit === -1 ? 80 : Math.min(80, limit);
50 - output.push(
51 - ` ${parent.ast.node.loc?.start.line}:${
52 - parent.ast.node.loc?.start.column
53 - }: ${printed.substring(0, limit).trim()}${
54 - printed.length > limit ? "..." : ""
55 - }`
56 - );
57 - }
58 - output.push("@controls:");
59 - const deps = controlDeps.get(blockId)!;
60 - for (const dep of deps) {
61 - output.push(` ${dep.toString()}`);
62 - }
63 - output.push("@terminal:");
64 - let terminalOutput = "";
65 - switch (terminal.kind) {
66 - case "return": {
67 - const retValue = terminal.value != null ? String(terminal.value) : "";
68 - terminalOutput = `return ${retValue}`;
69 - if (terminal.fallthrough !== null) {
70 - const { block: fallthroughBlock, tests } = terminal.fallthrough;
71 - terminalOutput = `${terminalOutput} fallthrough:bb${fallthroughBlock} tests=${(
72 - tests ?? []
73 - )
74 - .map((t) => String(t))
75 - .join(" && ")}`;
76 - }
77 - break;
78 - }
79 - case "goto": {
80 - terminalOutput = `goto bb${terminal.block}`;
81 - if (terminal.fallthrough !== null) {
82 - const { block: fallthroughBlock, tests } = terminal.fallthrough;
83 - terminalOutput = `${terminalOutput} fallthrough:bb${fallthroughBlock} tests=${(
84 - tests ?? ["<empty>"]
85 - )
86 - .map((t) => String(t))
87 - .join(" && ")}`;
88 - }
89 - break;
90 - }
91 - case "throw": {
92 - terminalOutput = "throw";
93 - break;
94 - }
95 - case "if": {
96 - terminalOutput = `if (${String(terminal.test)}) then:bb${
97 - terminal.consequent
98 - } else:bb${terminal.alternate}`;
99 - break;
100 - }
101 - case "switch": {
102 - const lines = [`switch (${String(terminal.test)})`];
103 - terminal.cases.forEach((case_) => {
104 - if (case_.test != null) {
105 - lines.push(` case ${String(case_.test)}: bb${case_.block}`);
106 - } else {
107 - lines.push(` default: bb${case_.block}`);
108 - }
109 - });
110 - terminalOutput = lines.join("\n");
111 - break;
112 - }
113 - default: {
114 - assertExhaustive(
115 - terminal,
116 - `Unexpected terminal kind '${(terminal as any as Terminal).kind}'`
117 - );
118 - }
119 - }
120 - output.push(` ${terminalOutput}`);
121 - }
122 - context.outputs[OutputKind.CFG] = output.join("\n");
123 - }
124 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/DumpIR.ts deleted
-38
@@ -1,38 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import { OutputKind } from "../CompilerOutputs";
12 -import * as IR from "../IR";
13 -import prettyPrint from "../IR/PrettyPrinter";
14 -import { PassKind, PassName } from "../Pass";
15 -
16 -/**
17 - * An optional debug step when the output {@link OutputKind.IR} is enabled.
18 - * Records the output IR in the compiler context.
19 - */
20 -export default {
21 - name: PassName.DumpIR,
22 - kind: PassKind.IRFunc as const,
23 - run,
24 -};
25 -
26 -export function run(
27 - irFunc: IR.Func,
28 - func: NodePath<t.Function>,
29 - context: CompilerContext
30 -) {
31 - if (context.opts.outputKinds.includes(OutputKind.IR)) {
32 - const output = [...context.irProg.funcs.values()]
33 - .map((irFunc) => prettyPrint(irFunc))
34 - .join("\n\n");
35 -
36 - context.outputs[OutputKind.IR] = output;
37 - }
38 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/IRCheck.ts deleted
-71
@@ -1,71 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import * as IR from "../IR";
12 -import { PassKind, PassName } from "../Pass";
13 -
14 -/**
15 - * Semantic check over IR.
16 - */
17 -export default {
18 - name: PassName.IRCheck,
19 - kind: PassKind.IRFunc as const,
20 - run,
21 -};
22 -
23 -export function run(
24 - irFunc: IR.Func,
25 - func: NodePath<t.Function>,
26 - context: CompilerContext
27 -) {
28 - for (const [name, val] of irFunc.env.decls) {
29 - if (val.immutable) {
30 - for (const [refPath, ref] of val.references) {
31 - if (ref.kind === IR.RefKind.Reassign) {
32 - // Bindings created from Hook calls, Hook variables and Parameters are
33 - // assumed/enforced to be "immutable" (and `const` in terms of JS).
34 - // Violations of this rule would trigger bailout/deopt.
35 - // Alternatively, we can only treat `const` bindings as DerivedImmut
36 - // and still treat `let` bindings as Unknown.
37 - context.bailout("ReassignImmutableValue", {
38 - code: "E0010",
39 - path: refPath,
40 - context: { name },
41 - });
42 - }
43 - if (ref.kind === IR.RefKind.MutBorrow) {
44 - context.bailout("MutateImmutableValue", {
45 - code: "E0013",
46 - path: refPath,
47 - context: { name },
48 - });
49 - }
50 - }
51 - }
52 - }
53 -
54 - if (context.opts.flags.bailOnUseRef) {
55 - func.traverse({
56 - MemberExpression(expression) {
57 - const { node } = expression;
58 - if (
59 - node.property.type === "Identifier" &&
60 - node.property.name === "current"
61 - ) {
62 - context.bailout("BailOnRefLike", {
63 - code: "E0014",
64 - path: expression,
65 - context: null,
66 - });
67 - }
68 - },
69 - });
70 - }
71 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/ParamAnalysis.ts deleted
-133
@@ -1,133 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import type { Function } from "@babel/types";
10 -import { assertExhaustive } from "../Common/utils";
11 -import type { CompilerContext } from "../CompilerContext";
12 -import { invariant } from "../CompilerError";
13 -import * as IR from "../IR";
14 -import { PassKind, PassName } from "../Pass";
15 -
16 -/**
17 - * Parameter Analysis.
18 - *
19 - * This middle end pass analyze the "FormalParameters" position of ReactFunc and
20 - * resolves bindings considered as {@link IR.FuncInputs}, including "props" to
21 - * Components and (under conservatively approximation) all parameters to Hooks.
22 - *
23 - * Note that treating parameters to Hooks same as "props" to Components imposed
24 - * a new rule of Hooks in that passing arguments to Hooks is effectively
25 - * considered as "immutable borrowing" in the jargons of Rust.
26 - */
27 -export default {
28 - name: PassName.ParamAnalysis,
29 - kind: PassKind.IRFunc as const,
30 - run,
31 -};
32 -
33 -export function run(
34 - irFunc: IR.Func,
35 - func: NodePath<Function>,
36 - context: CompilerContext
37 -) {
38 - // https://tc39.es/ecma262/#prod-FormalParameters
39 - const paramsNode = func.node.params;
40 -
41 - // FormalParameters : [empty]
42 - // Fast path for syntactically empty param e.g. `function foo()`.
43 - // Note that this is incomplete because or the existence of `arguments`.
44 - if (paramsNode.length === 0) {
45 - irFunc.paramKind = IR.FuncParamKind.Empty;
46 - return;
47 - }
48 -
49 - // component Foo(...)
50 - if (irFunc.kind === IR.FuncKind.Component) {
51 - // We assume the first param as Component Props.
52 - const propsParam = func.get("params")[0];
53 -
54 - switch (propsParam.node.type) {
55 - case "ObjectPattern": {
56 - // component Foo({...})
57 - irFunc.paramKind = IR.FuncParamKind.NonSimple;
58 - break;
59 - }
60 - case "RestElement": {
61 - // FormalParameters : FunctionRestParameter
62 - // component Foo(...rest)
63 - irFunc.paramKind = IR.FuncParamKind.NonSimple;
64 - context.createDiagnostic({
65 - code: "E0001",
66 - path: propsParam,
67 - context: null,
68 - });
69 - break;
70 - }
71 - case "ArrayPattern":
72 - case "AssignmentPattern":
73 - case "Identifier":
74 - case "TSParameterProperty": {
75 - irFunc.paramKind = IR.FuncParamKind.Simple;
76 - context.createDiagnostic({
77 - code: "E0002",
78 - path: propsParam,
79 - context: null,
80 - });
81 - break;
82 - }
83 - default:
84 - assertExhaustive(propsParam.node, "Unhandled propsParam");
85 - }
86 - }
87 -
88 - // Currently, we collect all BindingIdentifiers discovered under
89 - // FormalParameters as inputs for all ReactFuncKinds.
90 - //
91 - // TODO: It's likely we don't need to return a map. Refining them is enough.
92 - //
93 - // TODO: In the future, we should specialize for each kinds, e.g.
94 - // - for kind Component, exclude `ref` in `forwardRef((props, ref) => ...)`.
95 - // - for paramKind Simple, track at least one-level down to support
96 - // `let {p1, p2} = props`, `props.foo` or even `props["foo"]`.
97 - // - and only do the most conservative for kind Unknown.
98 - const paramBindings = getParamBindings(irFunc, func);
99 -
100 - // function foo({})
101 - // function foo({}, [])
102 - // Specialize empty destructuring.
103 - if (paramBindings.size === 0) {
104 - irFunc.paramKind = IR.FuncParamKind.Empty;
105 - return;
106 - }
107 -}
108 -
109 -/**
110 - * A helper function to get the Bindings of kind "param" defined in @param func.
111 - */
112 -function getParamBindings(
113 - irFunc: IR.Func,
114 - func: NodePath<Function>
115 -): Map<string, IR.BindingVal> {
116 - const { bindings } = func.scope;
117 - const map = new Map();
118 - for (const [name, b] of Object.entries(bindings)) {
119 - //@ts-ignore: The type of `kind` defined the @type package is not complete.
120 - //See: https://github.com/babel/babel/blob/main/packages/babel-traverse/src/scope/binding.ts#L5
121 - if (b.kind === "param") {
122 - const val = irFunc.env.decls.get(name);
123 - invariant(
124 - typeof val !== "undefined",
125 - "Param must exists in environment."
126 - );
127 -
128 - val.refineTo(IR.ValKind.Param, true, false);
129 - map.set(name, val);
130 - }
131 - }
132 - return map;
133 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/ReactFuncsInfer.ts deleted
-355
@@ -1,355 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import { NodePath } from "@babel/traverse";
9 -import type { Function, Program } from "@babel/types";
10 -import * as t from "@babel/types";
11 -import { pathUnion } from "../Common/PathUnion";
12 -import { assertExhaustive } from "../Common/utils";
13 -import type { CompilerContext } from "../CompilerContext";
14 -import { invariant } from "../CompilerError";
15 -import * as IR from "../IR";
16 -import { isNonMethodFunctionPath, NonMethodFunction } from "../IR/babel-utils";
17 -import { PassKind, PassName } from "../Pass";
18 -
19 -/**
20 - * React Function Inference.
21 - *
22 - * This middle end pass use heurstics to infer JavaScript functions that are
23 - * considered as "React Functions" and will be used as compilation units.
24 - *
25 - * The correctness of this analysis depend on
26 - * - Rules of Hooks, which is materalized by the eslint-plugin-hooks. E.g. we
27 - * don't check reachability of the hook calls in Forget.
28 - * - Sanity, i.e. Forget can go wrong with big anti-patterns. E.g. calling
29 - * Component directly.
30 - */
31 -export default {
32 - name: PassName.ReactFuncsInfer,
33 - kind: PassKind.Prog as const,
34 - run,
35 -};
36 -
37 -export function run(program: NodePath<Program>, context: CompilerContext) {
38 - if (context.opts.optIn) {
39 - const { directives } = program.node;
40 - const useForget = directives.some(
41 - (directive) => directive.value.value === "use forget"
42 - );
43 - if (!useForget) return;
44 - }
45 -
46 - program.traverse({
47 - Function(func) {
48 - runFunc(func, context);
49 - },
50 - });
51 -}
52 -
53 -/**
54 - * Infer whether or not a @param func is a "React Function" using heuristics.
55 - * If it is, register it to the @param context and lower to {@link IR.Func}.
56 - */
57 -export function runFunc(func: NodePath<Function>, context: CompilerContext) {
58 - func.traverse({
59 - /**
60 - * `Directive`s can be used as escape hatches.
61 - */
62 - Directive(directive) {
63 - /**
64 - * Enforced compilation: `function foo(){ "use forget" }`
65 - * This can be used to include false negative.
66 - */
67 - if (directive.node.value.value === "use forget") {
68 - const parentalFunc = directive.findParent(
69 - isNonMethodFunctionPath
70 - ) as NodePath<NonMethodFunction>;
71 - const [name, kind] = getFuncNameAndKind(parentalFunc);
72 - registerReactFunc(parentalFunc, name, kind, context);
73 - }
74 -
75 - /**
76 - * Enforced bailout: `function foo(){ "use no forget" }`
77 - * This can be used to exclused false positive.
78 - */
79 - if (directive.node.value.value === "use no forget") {
80 - // Stop the entire traversal of `func`.
81 - directive.stop();
82 - context.bailoutWithoutDiagnostic("use no forget", directive);
83 - }
84 - },
85 -
86 - /**
87 - * `JSX` presense alone is not safe enough to be considered as a ReactFunc.
88 - * Notably, it could be either a React Component or just a helper function.
89 - *
90 - * We may rethink how to use this information in the future.
91 - */
92 - JSX(jsx) {},
93 -
94 - /**
95 - * `CallExpression`s are where we are looking for hook calls. Similar to
96 - * eslint-plugin-hooks, we don't look for hook names from other places.
97 - */
98 - CallExpression(call) {
99 - // It's possible for a custom hook that only calls other custom hooks, so
100 - // the entry criteria is set to be pretty low.
101 - const hookCall = IR.matchHookCall(call.node);
102 - if (!hookCall) return;
103 - context.logger.logEvent({ name: "matchHookCall", kind: hookCall.kind });
104 -
105 - // To minimize the chance to include false positive, we furthur check
106 - // if the parental function looks like a Component or Hook.
107 - const parentalFunc = call.findParent(
108 - isNonMethodFunctionPath
109 - ) as NodePath<NonMethodFunction>;
110 - invariant(parentalFunc, "parentalFunc exists.");
111 - const [name, kind] = getFuncNameAndKind(parentalFunc);
112 -
113 - if (kind === IR.FuncKind.Unknown) return;
114 -
115 - // According to [Rule of Hooks](https://reactjs.org/docs/hooks-rules.html),
116 - // Hooks should only be called at the RF "Top level". But in practices,
117 - // block scopes e.g. `{}` and `try...catch` are allowed.
118 - // Although we can identify its parental React Func without issues, they
119 - // requires extra work to support. We'll extend their support later.
120 - if (!t.isFunction(call.scope.block)) {
121 - context.createDiagnostic({
122 - code: "E0004",
123 - path: call,
124 - context: null,
125 - });
126 - return;
127 - }
128 -
129 - registerReactFunc(parentalFunc, name, kind, context);
130 - },
131 - });
132 -}
133 -
134 -/**
135 - * @returns the name and infered `FuncKind` of @param parentalFunc
136 - */
137 -function getFuncNameAndKind(
138 - parentalFunc: NodePath<NonMethodFunction>
139 -): [string | undefined, IR.FuncKind] {
140 - const funcName = getFuncName(parentalFunc);
141 - const isInComp = isComponentLike(parentalFunc, funcName);
142 - const isInHook = isHookLike(parentalFunc, funcName);
143 - const kind = isInComp
144 - ? IR.FuncKind.Component
145 - : isInHook
146 - ? IR.FuncKind.Hook
147 - : IR.FuncKind.Unknown;
148 - return [funcName, kind];
149 -}
150 -
151 -/**
152 - * Enforce FunctionBody of @param func is a BlockStatement.
153 - *
154 - * The current heuristics (occurence of hook calls) means function body is
155 - * likely a block (and in cases where it's not, they will be safely omitted).
156 - *
157 - * Note that it doesn't mean we couldn't expand the support to Expression-body
158 - * functions. We just need a thin pre pass rewriting them to BlockStatement ones
159 - * and the rest of the compiler pipeline will stay identical.
160 - */
161 -function validateBlockBody(
162 - func: NodePath<Function>,
163 - context: CompilerContext
164 -): boolean {
165 - const funcBody: NodePath<t.BlockStatement | t.Expression> = func.get("body");
166 -
167 - if (funcBody.isExpression()) {
168 - context.createDiagnostic({
169 - code: "E0003",
170 - path: funcBody,
171 - context: null,
172 - });
173 - }
174 -
175 - return funcBody.isBlockStatement();
176 -}
177 -
178 -/**
179 - * Lower @param func with @param flags to {@link IR.Func} and register it
180 - * into @param context
181 - */
182 -function registerReactFunc(
183 - func: NodePath<NonMethodFunction>,
184 - name: IR.Name,
185 - kind: IR.FuncKind,
186 - context: CompilerContext
187 -) {
188 - if (!validateBlockBody(func, context)) return;
189 -
190 - if (!context.irProg.funcs.has(func)) {
191 - context.logger.logEvent({
192 - name: "registerReactFunc",
193 - flags: { name, kind },
194 - });
195 - const irFunc = new IR.Func(
196 - func,
197 - name,
198 - kind,
199 - context.opts.flags.localMutationThroughFreeVars
200 - );
201 - context.irProg.funcs.set(func, irFunc);
202 - }
203 -}
204 -
205 -/**
206 - * @returns whether or not @param func is like a Component-kinded react func.
207 - */
208 -function isComponentLike(
209 - func: NodePath<Function>,
210 - funcName: string | undefined
211 -) {
212 - return funcName
213 - ? isValidComponentNameNode(funcName)
214 - : isForwardRefCallback(func) || isMemoCallback(func);
215 -}
216 -
217 -/**
218 - * @returns whether or not @param func is like a Hook-kinded react func.
219 - */
220 -function isHookLike(func: NodePath<Function>, funcName: string | undefined) {
221 - return funcName && isValidHookNameNode(funcName);
222 -}
223 -
224 -/**
225 - * Checks if the @param node is a valid React Component name. React Component
226 - * names must always start with a non-lowercase letter. So `MyComponent` or
227 - * `_MyComponent` are valid component names for instance.
228 - */
229 -function isValidComponentNameNode(name: string) {
230 - return !/^[a-z]/.test(name);
231 -}
232 -
233 -function isValidHookNameNode(name: string) {
234 - return IR.isHookLikeName(name);
235 -}
236 -
237 -/**
238 - * @return whether or not @param node is one of React's @param apiName API.
239 - * This was named as `isReactFunction` is eslint-plugin-hooks.
240 - */
241 -function isReactAPI(node: t.Node, apiName: string) {
242 - return (
243 - (node.type === "Identifier" && node.name === apiName) ||
244 - (node.type === "MemberExpression" &&
245 - node.object.type === "Identifier" &&
246 - node.object.name === "React" &&
247 - node.property.type === "Identifier" &&
248 - node.property.name === apiName)
249 - );
250 -}
251 -
252 -/**
253 - * Checks if the @param func is a callback argument of `React.forwardRef`.
254 - */
255 -function isForwardRefCallback(func: NodePath<Function>): boolean {
256 - return !!(
257 - func.parent &&
258 - t.isCallExpression(func.parent) &&
259 - isReactAPI(func.parent.callee, "forwardRef")
260 - );
261 -}
262 -
263 -/**
264 - * Checks if the @param func is a callback argument of `React.memo`.
265 - */
266 -function isMemoCallback(func: NodePath<Function>) {
267 - return !!(
268 - func.parent &&
269 - t.isCallExpression(func.parent) &&
270 - isReactAPI(func.parent.callee, "memo")
271 - );
272 -}
273 -
274 -function getFuncName(func: NodePath<NonMethodFunction>): string | undefined {
275 - const node = getFuncNameNode(func);
276 - return t.isIdentifier(node) ? node.name : undefined;
277 -}
278 -
279 -/**
280 - * Gets the {@link t.Node} representing the name of a @param func AST.
281 - *
282 - * For function declarations it is easy.
283 - * For anonymous function expressions it is much harder. If you search for
284 - * `IsAnonymousFunctionDefinition()` in the ECMAScript spec you'll find places
285 - * where JS gives anonymous function expressions names. We roughly detect the
286 - * same AST nodes with some exceptions to better fit our use case.
287 - */
288 -function getFuncNameNode(funcPath: NodePath<NonMethodFunction>) {
289 - const func = pathUnion(funcPath);
290 - switch (func.type) {
291 - case "FunctionDeclaration": {
292 - // function useHook() {}
293 - //
294 - // Function declaration or function expression names win over any
295 - // assignment statements or other renames.
296 - return func.node.id ?? undefined;
297 - }
298 - case "ArrowFunctionExpression":
299 - case "FunctionExpression": {
300 - if (t.isFunctionExpression(func.node)) {
301 - // const whatever = function useHook() {};
302 - return func.node.id ?? undefined;
303 - }
304 -
305 - if (t.isVariableDeclarator(func.parent) && func.parent.init) {
306 - // const useHook = () => {};
307 - return func.parent.id;
308 - }
309 -
310 - if (
311 - t.isAssignmentExpression(func.parent) &&
312 - func.parent.right === func.node &&
313 - func.parent.operator === "="
314 - ) {
315 - // useHook = () => {};
316 - return func.parent.left;
317 - }
318 -
319 - if (
320 - t.isProperty(func.parent) &&
321 - func.parent.value === func.node &&
322 - !t.isClassPrivateProperty(func.parent) &&
323 - !func.parent.computed
324 - ) {
325 - // {useHook: () => {}}
326 - // {useHook() {}}
327 - return func.parent.key;
328 -
329 - // NOTE: We could also support `ClassProperty` and `MethodDefinition`
330 - // here to be pedantic. However, hooks in a class are an anti-pattern. So
331 - // we don't allow it to error early.
332 - //
333 - // class {useHook = () => {}}
334 - // class {useHook() {}}
335 - }
336 -
337 - if (
338 - t.isAssignmentPattern(func.parent) &&
339 - func.parent.right === func.node
340 - ) {
341 - // const {useHook = () => {}} = {};
342 - // ({useHook = () => {}} = {});
343 - //
344 - // Kinda clowny, but we'd said we'd follow spec convention for
345 - // `IsAnonymousFunctionDefinition()` usage.
346 - return func.parent.left;
347 - }
348 - return undefined;
349 - }
350 - case "ObjectMethod":
351 - return undefined;
352 - default:
353 - assertExhaustive(func, "Unhandled func AST node");
354 - }
355 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/RefKindInfer.ts deleted
-201
@@ -1,201 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import type { Function } from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import * as IR from "../IR";
12 -import { getAssignmentTargets } from "../IR/babel-utils";
13 -import { PassKind, PassName } from "../Pass";
14 -
15 -/**
16 - * Reference Kind Inference
17 - */
18 -export default {
19 - name: PassName.RefKindInfer,
20 - kind: PassKind.IRFunc as const,
21 - run,
22 -};
23 -
24 -const ANNOTATIONS_IMMUT = ["immut", "readonly"];
25 -const ANNOTATIONS_MUT = ["mut", "mutable", "writable"];
26 -
27 -/**
28 - * Eventually, we probably want to move RefKind refinements
29 - * into a single visitor pass and do context sensitive analysis.
30 - * This would avoid:
31 - * - different passes making inconsistent / incompatible refinements
32 - * - each pass needing to collect its context by traversing parent nodes
33 - * / filtering child nodes
34 - */
35 -export function run(
36 - irFunc: IR.Func,
37 - func: NodePath<Function>,
38 - context: CompilerContext
39 -) {
40 - for (const topLevel of irFunc.body) {
41 - refineBorrows(topLevel);
42 - // We refine MutBorrows and Freezes after Borrows and assume
43 - // that a reference kind cannot be both MutBorrow and Freeze
44 - refineMutBorrows(topLevel);
45 - refineFreezes(topLevel);
46 - refineAnnonatedIdents(topLevel);
47 - }
48 -
49 - /**
50 - * Visit @param topLevel and refined "leaked/borrowed" uses as
51 - * {@link IR.RefKind.Borrow}. This is an over approximation.
52 - */
53 - function refineBorrows(topLevel: IR.FuncTopLevel) {
54 - // var/let/const id = NODE
55 - // function id(NODE) NODE
56 - // class id NODE
57 - if (topLevel.isDecl) {
58 - // Everywhere of declarations.
59 - refineUses(irFunc, topLevel.ast, IR.RefKind.Borrow);
60 - }
61 -
62 - topLevel.ast.traverse({
63 - // lhs = NODE
64 - AssignmentExpression(assignExpr) {
65 - refineUses(irFunc, assignExpr.get("right"), IR.RefKind.Borrow);
66 - },
67 -
68 - // NODE.child
69 - // NODE.child()
70 - MemberExpression(memExpr) {
71 - refineUses(irFunc, memExpr.get("object"), IR.RefKind.Borrow);
72 - },
73 - OptionalMemberExpression(memExpr) {
74 - refineUses(irFunc, memExpr.get("object"), IR.RefKind.Borrow);
75 - },
76 -
77 - // non-hook-callee(NODE)
78 - CallExpression(call) {
79 - const hookCall = IR.HookCall.resolve(call);
80 - const args = call.get("arguments");
81 -
82 - // Normal Call.
83 - if (!hookCall) {
84 - args.forEach((arg) => {
85 - refineUses(irFunc, arg, IR.RefKind.Borrow);
86 - });
87 - }
88 - },
89 - });
90 - }
91 -
92 - /**
93 - * Visit @param topLevel and refine mutative borrows
94 - * {@link IR.RefKind.MutBorrow}. This is an under
95 - * approximation, since we do not track aliasing or
96 - * know whether function calls will mutate their arguments.
97 - */
98 - function refineMutBorrows(topLevel: IR.FuncTopLevel) {
99 - topLevel.ast.traverse({
100 - // immutVal.x = 42; [immutVal.x, immutVal.y] = [1, 2]; {a: immutVal.x} = {a: 42};
101 - // (NOT `foo(immutVal.x).bar = 42`)
102 - AssignmentExpression(assignExpr) {
103 - const lhs = assignExpr.get("left");
104 - getAssignmentTargets(lhs).forEach((ident) => {
105 - if (ident != lhs) {
106 - refineUses(irFunc, ident, IR.RefKind.MutBorrow);
107 - }
108 - });
109 - },
110 - // delete immutVal.x; delete immutVal?.x;
111 - // (NOT `delete foo.func(immutVal.x)`)
112 - UnaryExpression(unaryExpr) {
113 - if (unaryExpr.node.operator == "delete") {
114 - const arg = unaryExpr.get("argument");
115 - // getAssignmentTargets will return an overestimate
116 - getAssignmentTargets(arg).forEach((ident) => {
117 - if (ident != arg) {
118 - refineUses(irFunc, ident, IR.RefKind.MutBorrow);
119 - }
120 - });
121 - }
122 - },
123 - // immutVal.x++
124 - UpdateExpression(updateExpr) {
125 - const arg = updateExpr.get("argument");
126 - // getAssignmentTargets will return an overestimate
127 - getAssignmentTargets(arg).forEach((ident) => {
128 - if (ident != arg) {
129 - refineUses(irFunc, ident, IR.RefKind.MutBorrow);
130 - }
131 - });
132 - },
133 - });
134 - }
135 -
136 - /**
137 - * Visit @param topLevel and refine uses moved to React as
138 - * {@link IR.RefKind.Freeze}. This is an under approximation.
139 - */
140 - function refineFreezes(topLevel: IR.FuncTopLevel) {
141 - for (const rootVal of topLevel.jsxTreeRoots) {
142 - refineExprInJSXTree(rootVal);
143 - function refineExprInJSXTree(expr: IR.ExprVal) {
144 - if (IR.isJSXTagVal(expr)) {
145 - expr.children.forEach(refineExprInJSXTree);
146 - } else {
147 - // <JSX attr={IDENT} />
148 - if (expr.ast.path.isIdentifier()) {
149 - refineUses(irFunc, expr.ast.path, IR.RefKind.Freeze);
150 - }
151 - }
152 - }
153 - }
154 -
155 - for (const call of topLevel.hookCalls) {
156 - // callee(IDENT)
157 - call.call.get("arguments").forEach((arg) => {
158 - if (arg.isIdentifier()) {
159 - refineUses(irFunc, arg, IR.RefKind.Freeze);
160 - }
161 - });
162 - }
163 - }
164 -
165 - /**
166 - * Refine identifiers annotated with "immut" and "mut".
167 - */
168 - function refineAnnonatedIdents(topLevel: IR.FuncTopLevel) {
169 - topLevel.ast.traverse({
170 - Identifier(ident) {
171 - if (ANNOTATIONS_IMMUT.some((anno) => hasLeadingComment(ident, anno))) {
172 - refineUses(irFunc, ident, IR.RefKind.Freeze);
173 - }
174 - if (ANNOTATIONS_MUT.some((anno) => hasLeadingComment(ident, anno))) {
175 - refineUses(irFunc, ident, IR.RefKind.MutBorrow);
176 - }
177 - },
178 - });
179 - }
180 -}
181 -
182 -function refineUses(
183 - irFunc: IR.Func,
184 - path: NodePath,
185 - refKind: IR.RefKind
186 -): void {
187 - irFunc.env.getRefsToDeclsFrom(path).forEach((use) => {
188 - use.refineTo(refKind);
189 - });
190 - irFunc.env.getFreeVarsFrom(path).forEach((use) => {
191 - use.refineTo(refKind);
192 - });
193 -}
194 -
195 -function hasLeadingComment(path: NodePath, annotation: string): boolean {
196 - return (
197 - path.node.leadingComments?.some(
198 - (comment) => comment.value.trim().toLowerCase() === annotation
199 - ) ?? false
200 - );
201 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/SketchyCodeCheck.ts deleted
-136
@@ -1,136 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import * as t from "@babel/types";
10 -import type { CompilerContext } from "../CompilerContext";
11 -import * as IR from "../IR";
12 -import { PassKind, PassName } from "../Pass";
13 -
14 -/**
15 - * Sketchy Code Check
16 - *
17 - * This middle end checks for "sketchy" code patterns to potentially bail out
18 - * when found.
19 - */
20 -export default {
21 - name: PassName.SketchyCodeCheck,
22 - kind: PassKind.IRFunc as const,
23 - run,
24 -};
25 -
26 -const ALLOWED_CAPITALIZED_STDLIB_FUNCTIONS = new Set([
27 - "AggregateError",
28 - "Array",
29 - "BigInt",
30 - "Boolean",
31 - "Date",
32 - "Error",
33 - "EvalError",
34 - "Function",
35 - "InternalError",
36 - "Number",
37 - "Object",
38 - "RangeError",
39 - "ReferenceError",
40 - "RegExp",
41 - "String",
42 - "Symbol",
43 - "SyntaxError",
44 - "TypeError",
45 - "URIError",
46 -]);
47 -
48 -function getStaticCallee(expression: t.Node): string | null {
49 - if (t.isIdentifier(expression)) {
50 - return expression.name;
51 - }
52 - if (
53 - t.isMemberExpression(expression) ||
54 - t.isOptionalMemberExpression(expression)
55 - ) {
56 - const { object, property } = expression;
57 - const objectName = getStaticCallee(object);
58 - const propertyName = getStaticCallee(property);
59 - if (objectName && propertyName) {
60 - return `${objectName}.${propertyName}`;
61 - }
62 - }
63 - return null;
64 -}
65 -
66 -export function run(
67 - _irFunc: IR.Func,
68 - func: NodePath<t.Function>,
69 - context: CompilerContext
70 -) {
71 - const funcBody = func.get("body");
72 -
73 - if (context.opts.flags.bailOnCapitalizedFunctionCalls) {
74 - function isValidFunctionCallName(
75 - functionName: string,
76 - fullName: string
77 - ): boolean {
78 - return (
79 - ALLOWED_CAPITALIZED_STDLIB_FUNCTIONS.has(fullName) ||
80 - context.opts.allowedCapitalizedUserFunctions.has(fullName) ||
81 - !/^[A-Z]/.test(functionName)
82 - );
83 - }
84 -
85 - funcBody.traverse({
86 - CallExpression(path) {
87 - const callee = path.get("callee");
88 - if (t.isIdentifier(callee.node)) {
89 - // Allow `Module().method()`;
90 - if (
91 - t.isMemberExpression(path.parent) ||
92 - t.isOptionalMemberExpression(path.parent)
93 - ) {
94 - return;
95 - }
96 - const name = callee.node.name;
97 - if (!isValidFunctionCallName(name, name)) {
98 - context.bailout("BailOnCapitalizedFunctionCalls", {
99 - code: "E0018",
100 - path: callee,
101 - context: null,
102 - });
103 - }
104 - } else if (
105 - t.isMemberExpression(callee.node) ||
106 - t.isOptionalMemberExpression(callee.node)
107 - ) {
108 - if (t.isIdentifier(callee.node.property)) {
109 - const fullName = getStaticCallee(callee.node);
110 - if (
111 - fullName &&
112 - !isValidFunctionCallName(callee.node.property.name, fullName)
113 - ) {
114 - context.bailout("BailOnCapitalizedFunctionCalls", {
115 - code: "E0018",
116 - path: callee,
117 - context: null,
118 - });
119 - }
120 - }
121 - }
122 - },
123 - });
124 - }
125 -
126 - if (
127 - context.opts.flags.bailOnNestedComponents &&
128 - funcBody.scope.parent.parent != null
129 - ) {
130 - context.bailout("BailOnNestedComponents", {
131 - code: "E0019",
132 - path: func,
133 - context: null,
134 - });
135 - }
136 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/__tests__/ReactFuncsInfer-test.ts deleted
-330
@@ -1,330 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -"use strict";
9 -
10 -import { createArrayLogger } from "../../Logger";
11 -import { PassName } from "../../Pass";
12 -import * as TestDriver from "../../__tests__/TestDriver";
13 -import * as IR from "../../IR";
14 -import { printDiagnostic } from "../..";
15 -
16 -const analyze = (source: string) => {
17 - const logs: string[] = [];
18 - const context = TestDriver.analyze(source, {
19 - stopPass: PassName.ReactFuncsInfer,
20 - logger: createArrayLogger(logs),
21 - });
22 - return {
23 - reactFuncs: [...context.irProg.funcs.values()],
24 - logs,
25 - diagnostics: context.diagnostics.map((diag) => printDiagnostic(diag)),
26 - };
27 -};
28 -
29 -describe("ReactFuncsInfer true positive", () => {
30 - it("use forget directive", () => {
31 - const { reactFuncs } = analyze(`
32 - function unknown() {
33 - "use forget";
34 - }
35 - `);
36 -
37 - expect(reactFuncs.length).toBe(1);
38 - expect(reactFuncs[0].name).toBe("unknown");
39 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Unknown);
40 - });
41 -
42 - it("Component with use forget ", () => {
43 - const { reactFuncs } = analyze(`
44 - function Component() {
45 - "use forget";
46 - }
47 - `);
48 -
49 - expect(reactFuncs.length).toBe(1);
50 - expect(reactFuncs[0].name).toBe("Component");
51 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Component);
52 - });
53 -
54 - it("Hook with use forget", () => {
55 - const { reactFuncs } = analyze(`
56 - function useHook() {
57 - "use forget";
58 - }
59 - `);
60 -
61 - expect(reactFuncs.length).toBe(1);
62 - expect(reactFuncs[0].name).toBe("useHook");
63 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Hook);
64 - });
65 -
66 - it("Component with hooks", () => {
67 - const { reactFuncs } = analyze(`
68 - function ComponentWithHook() {
69 - useHook()
70 - }
71 - `);
72 -
73 - expect(reactFuncs.length).toBe(1);
74 - expect(reactFuncs[0].name).toBe("ComponentWithHook");
75 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Component);
76 - });
77 -
78 - it("Component with hooks and use forget", () => {
79 - const { reactFuncs } = analyze(`
80 - function ComponentWithHook() {
81 - "use forget";
82 - useHook()
83 - }
84 - `);
85 -
86 - expect(reactFuncs.length).toBe(1);
87 - expect(reactFuncs[0].name).toBe("ComponentWithHook");
88 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Component);
89 - });
90 -
91 - it("Higher-order Component with hooks", () => {
92 - const { reactFuncs } = analyze(`
93 - function createComponentWithHook() {
94 - return function ComponentWithHook() {
95 - useHook();
96 - };
97 - }
98 - `);
99 -
100 - expect(reactFuncs.length).toBe(1);
101 - expect(reactFuncs[0].name).toBe("ComponentWithHook");
102 - });
103 -
104 - it("Hooks with hooks", () => {
105 - const { reactFuncs } = analyze(`
106 - function useHookWithHook() {
107 - useHook()
108 - }
109 - `);
110 -
111 - expect(reactFuncs.length).toBe(1);
112 - expect(reactFuncs[0].name).toBe("useHookWithHook");
113 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Hook);
114 - });
115 -
116 - it("Hooks with hooks and use forget", () => {
117 - const { reactFuncs } = analyze(`
118 - function useHookWithHook() {
119 - "use forget";
120 - useHook()
121 - }
122 - `);
123 -
124 - expect(reactFuncs.length).toBe(1);
125 - expect(reactFuncs[0].name).toBe("useHookWithHook");
126 - });
127 -
128 - it("Higher-order hooks with hooks", () => {
129 - const { reactFuncs } = analyze(`
130 - function createHook() {
131 - return function useHookWithHook() {
132 - useHook()
133 - }
134 - }
135 - `);
136 -
137 - expect(reactFuncs.length).toBe(1);
138 - expect(reactFuncs[0].name).toBe("useHookWithHook");
139 - expect(reactFuncs[0].kind).toBe(IR.FuncKind.Hook);
140 - });
141 -
142 - it("Memo Callback", () => {
143 - const { reactFuncs } = analyze(`
144 - let a = React.memo(function MemoCallback() {
145 - useHook();
146 - })
147 - let b = memo(() => { useHook() })
148 - `);
149 -
150 - expect(reactFuncs.length).toBe(2);
151 - expect(reactFuncs[0].name).toBe("MemoCallback");
152 - });
153 -
154 - it("ForwardRef Callback", () => {
155 - const { reactFuncs } = analyze(`
156 - let a = React.forwardRef(function ForwardRefCallback() {
157 - useHook();
158 - })
159 - let b = forwardRef(() => { useHook() })
160 - `);
161 -
162 - expect(reactFuncs.length).toBe(2);
163 - expect(reactFuncs[0].name).toBe("ForwardRefCallback");
164 - });
165 -
166 - it("VariableDeclarator", () => {
167 - const { reactFuncs } = analyze(`
168 - const A = () => { useHooks() }
169 - const b = () => { useHooks() } // negative
170 - let c = function C() { useHooks() }
171 - let d = function () { useHooks() } // negative
172 - let e = function E () { useHooks() }
173 - `);
174 -
175 - expect(reactFuncs.length).toBe(3);
176 - expect(reactFuncs[0].name).toBe("A");
177 - expect(reactFuncs[1].name).toBe("C");
178 - expect(reactFuncs[2].name).toBe("E");
179 - });
180 -});
181 -
182 -describe("ReactFuncsInfer true negative", () => {
183 - it("Normal func", () => {
184 - expect(
185 - analyze(`
186 - function normalFunction() {}
187 - `).reactFuncs.length
188 - ).toBe(0);
189 - });
190 -
191 - it("use no forgot directive", () => {
192 - const { reactFuncs } = analyze(`
193 - function Bailout() {
194 - "use no forget";
195 - useHook()
196 - }
197 - `);
198 -
199 - expect(reactFuncs.length).toBe(0);
200 - });
201 -
202 - it("Component with only JSX", () => {
203 - const { reactFuncs } = analyze(`
204 - function ComponentWithOnlyJSX() {
205 - return <Bar />
206 - }
207 - `);
208 -
209 - expect(reactFuncs.length).toBe(0);
210 - });
211 -
212 - it("Function that starts with use but isn't hook", () => {
213 - const { reactFuncs } = analyze(`
214 - function NotReallyHook() {
215 - userFetch();
216 - }
217 - `);
218 -
219 - expect(reactFuncs.length).toBe(0);
220 - });
221 -
222 - it("normal func with hooks", () => {
223 - const { reactFuncs } = analyze(`
224 - function foo() {
225 - useHook()
226 - }
227 - `);
228 -
229 - expect(reactFuncs.length).toBe(0);
230 - });
231 -
232 - it("expression-body func with hooks", () => {
233 - const { reactFuncs, diagnostics, logs } = analyze(`
234 - const useHook = () => useHook()
235 - `);
236 -
237 - expect(reactFuncs.length).toBe(0);
238 - expect(diagnostics).toMatchSnapshot();
239 - expect(logs).toMatchSnapshot();
240 - });
241 -});
242 -
243 -/**
244 - * Test suites specifically for nesting.
245 - */
246 -describe("ReactFuncsInfer Nesting", () => {
247 - it("Component with hook-less mapper", () => {
248 - const { reactFuncs } = analyze(`
249 - function ComponentWithMap({items}) {
250 - useHook()
251 - return (
252 - <div>
253 - {items.map((item, index) => (
254 - <FeedItem key={index} data={item} config={config} />
255 - ))}
256 - </div>
257 - );
258 - }
259 - `);
260 -
261 - expect(reactFuncs.length).toBe(1);
262 - expect(reactFuncs[0].name).toBe("ComponentWithMap");
263 - });
264 -
265 - // It's unclear why you need this, but both will be detected as components.
266 - it("Nested Component", () => {
267 - const { reactFuncs } = analyze(`
268 - function OuterComponent({items}) {
269 - useHook()
270 - function InnerComponnt() {
271 - useHook()
272 - }
273 - }
274 - `);
275 -
276 - expect(reactFuncs.length).toBe(2);
277 - expect(reactFuncs[0].name).toBe("OuterComponent");
278 - expect(reactFuncs[1].name).toBe("InnerComponnt");
279 - });
280 -});
281 -
282 -describe("ReactFuncsInfer error cases", () => {
283 - it("Component use hooks in conditional", () => {
284 - const { diagnostics, logs } = analyze(`
285 - function ComponentWithHookInConditional() {
286 - if (cond) {
287 - useHook()
288 - }
289 - }
290 - `);
291 - expect(diagnostics).toMatchSnapshot();
292 - expect(logs).toMatchSnapshot();
293 - });
294 -
295 - it("Component use hooks in loop", () => {
296 - const { diagnostics, logs } = analyze(`
297 - function ComponentWithHookInConditional() {
298 - for (let i = 0; i < ITEMS.length; i++) {
299 - useHook()
300 - }
301 - }
302 - `);
303 - expect(diagnostics).toMatchSnapshot();
304 - expect(logs).toMatchSnapshot();
305 - });
306 -
307 - it("Component use hooks in a block scope", () => {
308 - const { diagnostics, logs } = analyze(`
309 - function ComponentWithHookInBlock() {
310 - {
311 - useHook()
312 - }
313 - }
314 - `);
315 - expect(diagnostics).toMatchSnapshot();
316 - expect(logs).toMatchSnapshot();
317 - });
318 -
319 - it("Component use hooks in a try-catch block", () => {
320 - const { diagnostics, logs } = analyze(`
321 - function ComponentWithHookInTryCatch() {
322 - try {
323 - useHook()
324 - } catch {}
325 - }
326 - `);
327 - expect(diagnostics).toMatchSnapshot();
328 - expect(logs).toMatchSnapshot();
329 - });
330 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/MiddleEnd/index.ts deleted
-21
@@ -1,21 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/**
9 - * Compiler Middle End.
10 - * Concerning about static analysis.
11 - */
12 -
13 -export { default as BodyAnalysis } from "./BodyAnalysis";
14 -export { default as DepGraphAnalysis } from "./DepGraphAnalysis";
15 -export { default as DumpCFG } from "./DumpCFG";
16 -export { default as DumpIR } from "./DumpIR";
17 -export { default as IRCheck } from "./IRCheck";
18 -export { default as ParamAnalysis } from "./ParamAnalysis";
19 -export { default as ReactFuncsInfer } from "./ReactFuncsInfer";
20 -export { default as RefKindInfer } from "./RefKindInfer";
21 -export { default as SketchyCodeCheck } from "./SketchyCodeCheck";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Pass.ts deleted
-165
@@ -1,165 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import type { Function, Program } from "@babel/types";
10 -import { assertExhaustive } from "./Common/utils";
11 -import type { CompilerContext } from "./CompilerContext";
12 -import * as IR from "./IR";
13 -import * as LIR from "./LIR";
14 -
15 -export enum PassName {
16 - // MiddleEnd
17 - ReactFuncsInfer = 0,
18 - ParamAnalysis,
19 - BodyAnalysis,
20 - SketchyCodeCheck,
21 - RefKindInfer,
22 - DumpIR,
23 - DumpHIR,
24 - IRCheck,
25 - DepGraphAnalysis,
26 - // BackEnd
27 - LIRGen,
28 - MemoCacheAlloc,
29 - DumpLIR,
30 - JSGen,
31 - DumpCFG,
32 - Validator,
33 -}
34 -
35 -export function isBackEndPass(pass: PassName) {
36 - return pass >= PassName.LIRGen;
37 -}
38 -
39 -export enum PassKind {
40 - Prog,
41 - Func,
42 - IRProg,
43 - IRFunc,
44 - LIRProg,
45 - LIRFunc,
46 -}
47 -
48 -export type Pass =
49 - | ProgPass
50 - | FuncPass
51 - | IRProgPass
52 - | IRFuncPass
53 - | LIRProgPass
54 - | LIRFuncPass;
55 -
56 -export type BasePass = {
57 - name: PassName;
58 -
59 - /**
60 - * If set to true, this pass and any passes after it are not allowed to
61 - * bail out as it's not longer possible to do so cleanly.
62 - */
63 - mutatesBabelAST?: boolean;
64 -};
65 -
66 -/**
67 - * Pass run on Babel's `Program` node, which are really just module btw.
68 - */
69 -export type ProgPass = BasePass & {
70 - kind: PassKind.Prog;
71 - run(prog: NodePath<Program>, context: CompilerContext): void;
72 -};
73 -
74 -/**
75 - * Pass on Babel's `Function` node.
76 - */
77 -export type FuncPass = BasePass & {
78 - kind: PassKind.Func;
79 - run(func: NodePath<Function>, context: CompilerContext): void;
80 -};
81 -
82 -/**
83 - * Pass on {@link IR.Prog}
84 - */
85 -export type IRProgPass = BasePass & {
86 - kind: PassKind.IRProg;
87 - run(prog: IR.Prog, context: CompilerContext): void;
88 -};
89 -
90 -/**
91 - * Pass on {@link IR.Func}
92 - */
93 -export type IRFuncPass = BasePass & {
94 - kind: PassKind.IRFunc;
95 - run(
96 - irFunc: IR.Func,
97 - func: NodePath<Function>,
98 - context: CompilerContext
99 - ): void;
100 -};
101 -
102 -/**
103 - * Pass on {@link LIR.Prog}
104 - */
105 -export type LIRProgPass = BasePass & {
106 - kind: PassKind.LIRProg;
107 - run(prog: LIR.Prog, context: CompilerContext): void;
108 -};
109 -
110 -/**
111 - * Pass on {@link LIR.Func}
112 - */
113 -export type LIRFuncPass = BasePass & {
114 - kind: PassKind.LIRFunc;
115 - run(lir: LIR.Func, func: NodePath<Function>, context: CompilerContext): void;
116 -};
117 -
118 -/**
119 - * Run a pass
120 - * @param pass
121 - * @param program
122 - * @param context
123 - */
124 -export function runPass(
125 - pass: Pass,
126 - program: NodePath<Program>,
127 - context: CompilerContext
128 -) {
129 - switch (pass.kind) {
130 - case PassKind.Prog:
131 - pass.run(program, context);
132 - break;
133 -
134 - case PassKind.Func:
135 - program.traverse({
136 - Function(func) {
137 - pass.run(func, context);
138 - },
139 - });
140 - break;
141 -
142 - case PassKind.IRProg:
143 - pass.run(context.irProg, context);
144 - break;
145 -
146 - case PassKind.IRFunc:
147 - for (const [func, irFunc] of context.irProg.funcs) {
148 - pass.run(irFunc, func, context);
149 - }
150 - break;
151 -
152 - case PassKind.LIRProg:
153 - pass.run(context.lirProg, context);
154 - break;
155 -
156 - case PassKind.LIRFunc:
157 - for (const [irFunc, lirFunc] of context.lirProg.funcs) {
158 - pass.run(lirFunc, irFunc.ast, context);
159 - }
160 - break;
161 -
162 - default:
163 - assertExhaustive(pass, `Unhandled pass: ${pass}`);
164 - }
165 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/PassManager.ts deleted
-55
@@ -1,55 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { NodePath } from "@babel/traverse";
9 -import type { Program } from "@babel/types";
10 -import { CompilerContext } from "./CompilerContext";
11 -import { Pass, PassName, runPass } from "./Pass";
12 -
13 -export class PassManager {
14 - program: NodePath<Program>;
15 - context: CompilerContext;
16 - passes: Pass[];
17 -
18 - constructor(program: NodePath<Program>, context: CompilerContext) {
19 - this.program = program;
20 - this.context = context;
21 - this.passes = [];
22 - }
23 -
24 - addPass(pass: Pass) {
25 - this.passes.push(pass);
26 - }
27 -
28 - runAll() {
29 - let hasMutatedBabelAST = false;
30 - for (const pass of this.passes) {
31 - if (pass.mutatesBabelAST) {
32 - hasMutatedBabelAST = true;
33 - }
34 - if (pass.name === PassName.JSGen && this.context.hasBailedOut()) {
35 - break;
36 - }
37 - try {
38 - runPass(pass, this.program, this.context);
39 - } catch (e) {
40 - this.context.bailoutWithoutDiagnostic(`UnexpectedError: ${e}`);
41 - if (hasMutatedBabelAST) {
42 - // The AST has been mutated, we can't bail out anymore.
43 - throw e;
44 - } else {
45 - this.context.logger.error(e.toString());
46 - return;
47 - }
48 - }
49 - // check if this is the stopPass
50 - if (pass.name === this.context.opts.stopPass) {
51 - break;
52 - }
53 - }
54 - }
55 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Validation/NoUseBeforeDefineRule.ts deleted
-372
@@ -1,372 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -// @ts-nocheck
9 -
10 -// NOTE: this file is forked from ESLint's no-use-before-define rule:
11 -// https://github.com/eslint/eslint/blob/15814057fd69319b3744bdea5db2455f85d2e74f/lib/rules/no-use-before-define.js
12 -// The only change is to treat the {functions:false} option similarly to {variables:false},
13 -// ie to disable validation for functions defined at module scope but still check for locally
14 -// defined functions.
15 -
16 -/**
17 - * @fileoverview Rule to flag use of variables before they are defined
18 - * @author Ilya Volodin
19 - */
20 -
21 -("use strict");
22 -
23 -//------------------------------------------------------------------------------
24 -// Helpers
25 -//------------------------------------------------------------------------------
26 -
27 -const SENTINEL_TYPE =
28 - /^(?:(?:Function|Class)(?:Declaration|Expression)|ArrowFunctionExpression|CatchClause|ImportDeclaration|ExportNamedDeclaration)$/u;
29 -const FOR_IN_OF_TYPE = /^For(?:In|Of)Statement$/u;
30 -
31 -/**
32 - * Parses a given value as options.
33 - * @param {any} options A value to parse.
34 - * @returns {Object} The parsed options.
35 - */
36 -function parseOptions(options) {
37 - let functions = true;
38 - let classes = true;
39 - let variables = true;
40 - let allowNamedExports = false;
41 -
42 - if (typeof options === "string") {
43 - functions = options !== "nofunc";
44 - } else if (typeof options === "object" && options !== null) {
45 - functions = options.functions !== false;
46 - classes = options.classes !== false;
47 - variables = options.variables !== false;
48 - allowNamedExports = !!options.allowNamedExports;
49 - }
50 -
51 - return { functions, classes, variables, allowNamedExports };
52 -}
53 -
54 -/**
55 - * Checks whether or not a given location is inside of the range of a given node.
56 - * @param {ASTNode} node An node to check.
57 - * @param {number} location A location to check.
58 - * @returns {boolean} `true` if the location is inside of the range of the node.
59 - */
60 -function isInRange(node, location) {
61 - return node && node.range[0] <= location && location <= node.range[1];
62 -}
63 -
64 -/**
65 - * Checks whether or not a given location is inside of the range of a class static initializer.
66 - * Static initializers are static blocks and initializers of static fields.
67 - * @param {ASTNode} node `ClassBody` node to check static initializers.
68 - * @param {number} location A location to check.
69 - * @returns {boolean} `true` if the location is inside of a class static initializer.
70 - */
71 -function isInClassStaticInitializerRange(node, location) {
72 - return node.body.some(
73 - (classMember) =>
74 - (classMember.type === "StaticBlock" &&
75 - isInRange(classMember, location)) ||
76 - (classMember.type === "PropertyDefinition" &&
77 - classMember.static &&
78 - classMember.value &&
79 - isInRange(classMember.value, location))
80 - );
81 -}
82 -
83 -/**
84 - * Checks whether a given scope is the scope of a class static initializer.
85 - * Static initializers are static blocks and initializers of static fields.
86 - * @param {eslint-scope.Scope} scope A scope to check.
87 - * @returns {boolean} `true` if the scope is a class static initializer scope.
88 - */
89 -function isClassStaticInitializerScope(scope) {
90 - if (scope.type === "class-static-block") {
91 - return true;
92 - }
93 -
94 - if (scope.type === "class-field-initializer") {
95 - // `scope.block` is PropertyDefinition#value node
96 - const propertyDefinition = scope.block.parent;
97 -
98 - return propertyDefinition.static;
99 - }
100 -
101 - return false;
102 -}
103 -
104 -/**
105 - * Checks whether a given reference is evaluated in an execution context
106 - * that isn't the one where the variable it refers to is defined.
107 - * Execution contexts are:
108 - * - top-level
109 - * - functions
110 - * - class field initializers (implicit functions)
111 - * - class static blocks (implicit functions)
112 - * Static class field initializers and class static blocks are automatically run during the class definition evaluation,
113 - * and therefore we'll consider them as a part of the parent execution context.
114 - * Example:
115 - *
116 - * const x = 1;
117 - *
118 - * x; // returns `false`
119 - * () => x; // returns `true`
120 - *
121 - * class C {
122 - * field = x; // returns `true`
123 - * static field = x; // returns `false`
124 - *
125 - * method() {
126 - * x; // returns `true`
127 - * }
128 - *
129 - * static method() {
130 - * x; // returns `true`
131 - * }
132 - *
133 - * static {
134 - * x; // returns `false`
135 - * }
136 - * }
137 - * @param {eslint-scope.Reference} reference A reference to check.
138 - * @returns {boolean} `true` if the reference is from a separate execution context.
139 - */
140 -function isFromSeparateExecutionContext(reference) {
141 - const variable = reference.resolved;
142 - let scope = reference.from;
143 -
144 - // Scope#variableScope represents execution context
145 - while (variable.scope.variableScope !== scope.variableScope) {
146 - if (isClassStaticInitializerScope(scope.variableScope)) {
147 - scope = scope.variableScope.upper;
148 - } else {
149 - return true;
150 - }
151 - }
152 -
153 - return false;
154 -}
155 -
156 -/**
157 - * Checks whether or not a given reference is evaluated during the initialization of its variable.
158 - *
159 - * This returns `true` in the following cases:
160 - *
161 - * var a = a
162 - * var [a = a] = list
163 - * var {a = a} = obj
164 - * for (var a in a) {}
165 - * for (var a of a) {}
166 - * var C = class { [C]; };
167 - * var C = class { static foo = C; };
168 - * var C = class { static { foo = C; } };
169 - * class C extends C {}
170 - * class C extends (class { static foo = C; }) {}
171 - * class C { [C]; }
172 - * @param {Reference} reference A reference to check.
173 - * @returns {boolean} `true` if the reference is evaluated during the initialization.
174 - */
175 -function isEvaluatedDuringInitialization(reference) {
176 - if (isFromSeparateExecutionContext(reference)) {
177 - /*
178 - * Even if the reference appears in the initializer, it isn't evaluated during the initialization.
179 - * For example, `const x = () => x;` is valid.
180 - */
181 - return false;
182 - }
183 -
184 - const location = reference.identifier.range[1];
185 - const definition = reference.resolved.defs[0];
186 -
187 - if (definition.type === "ClassName") {
188 - // `ClassDeclaration` or `ClassExpression`
189 - const classDefinition = definition.node;
190 -
191 - return (
192 - isInRange(classDefinition, location) &&
193 - /*
194 - * Class binding is initialized before running static initializers.
195 - * For example, `class C { static foo = C; static { bar = C; } }` is valid.
196 - */
197 - !isInClassStaticInitializerRange(classDefinition.body, location)
198 - );
199 - }
200 -
201 - let node = definition.name.parent;
202 -
203 - while (node) {
204 - if (node.type === "VariableDeclarator") {
205 - if (isInRange(node.init, location)) {
206 - return true;
207 - }
208 - if (
209 - FOR_IN_OF_TYPE.test(node.parent.parent.type) &&
210 - isInRange(node.parent.parent.right, location)
211 - ) {
212 - return true;
213 - }
214 - break;
215 - } else if (node.type === "AssignmentPattern") {
216 - if (isInRange(node.right, location)) {
217 - return true;
218 - }
219 - } else if (SENTINEL_TYPE.test(node.type)) {
220 - break;
221 - }
222 -
223 - node = node.parent;
224 - }
225 -
226 - return false;
227 -}
228 -
229 -//------------------------------------------------------------------------------
230 -// Rule Definition
231 -//------------------------------------------------------------------------------
232 -
233 -/** @type {import('../shared/types').Rule} */
234 -const NoUseBeforeDefineRule = {
235 - meta: {
236 - type: "problem",
237 -
238 - docs: {
239 - description: "Disallow the use of variables before they are defined",
240 - recommended: false,
241 - url: "https://eslint.org/docs/rules/no-use-before-define",
242 - },
243 -
244 - schema: [
245 - {
246 - oneOf: [
247 - {
248 - enum: ["nofunc"],
249 - },
250 - {
251 - type: "object",
252 - properties: {
253 - functions: { type: "boolean" },
254 - classes: { type: "boolean" },
255 - variables: { type: "boolean" },
256 - allowNamedExports: { type: "boolean" },
257 - },
258 - additionalProperties: false,
259 - },
260 - ],
261 - },
262 - ],
263 -
264 - messages: {
265 - usedBeforeDefined: "'{{name}}' was used before it was defined.",
266 - },
267 - },
268 -
269 - create(context) {
270 - const options = parseOptions(context.options[0]);
271 -
272 - /**
273 - * Determines whether a given reference should be checked.
274 - *
275 - * Returns `false` if the reference is:
276 - * - initialization's (e.g., `let a = 1`).
277 - * - referring to an undefined variable (i.e., if it's an unresolved reference).
278 - * - referring to a variable that is defined, but not in the given source code
279 - * (e.g., global environment variable or `arguments` in functions).
280 - * - allowed by options.
281 - * @param {eslint-scope.Reference} reference The reference
282 - * @returns {boolean} `true` if the reference should be checked
283 - */
284 - function shouldCheck(reference) {
285 - if (reference.init) {
286 - return false;
287 - }
288 -
289 - const { identifier } = reference;
290 -
291 - if (
292 - options.allowNamedExports &&
293 - identifier.parent.type === "ExportSpecifier" &&
294 - identifier.parent.local === identifier
295 - ) {
296 - return false;
297 - }
298 -
299 - const variable = reference.resolved;
300 -
301 - if (!variable || variable.defs.length === 0) {
302 - return false;
303 - }
304 -
305 - const definitionType = variable.defs[0].type;
306 -
307 - if (
308 - ((!options.variables && definitionType === "Variable") ||
309 - (!options.classes && definitionType === "ClassName") ||
310 - (!options.functions && definitionType === "FunctionName")) &&
311 - // don't skip checking the reference if it's in the same execution context, because of TDZ
312 - isFromSeparateExecutionContext(reference)
313 - ) {
314 - return false;
315 - }
316 -
317 - return true;
318 - }
319 -
320 - /**
321 - * Finds and validates all references in a given scope and its child scopes.
322 - * @param {eslint-scope.Scope} scope The scope object.
323 - * @returns {void}
324 - */
325 - function checkReferencesInScope(scope) {
326 - scope.references.filter(shouldCheck).forEach((reference) => {
327 - const variable = reference.resolved;
328 - const definitionIdentifier = variable.defs[0].name;
329 -
330 - if (
331 - reference.identifier.range[1] < definitionIdentifier.range[1] ||
332 - isEvaluatedDuringInitialization(reference)
333 - ) {
334 - context.report({
335 - node: reference.identifier,
336 - messageId: "usedBeforeDefined",
337 - data: reference.identifier,
338 - });
339 - }
340 - });
341 -
342 - scope.childScopes.forEach(checkReferencesInScope);
343 - }
344 -
345 - function isReactFunction(node) {
346 - return (
347 - node.body.type === "BlockStatement" &&
348 - node.body.body.some(
349 - (stmt) =>
350 - stmt.type === "ExpressionStatement" &&
351 - stmt.expression.type === "Literal" &&
352 - stmt.expression.value === "use forget"
353 - )
354 - );
355 - }
356 -
357 - return {
358 - FunctionExpression(node) {
359 - if (isReactFunction(node)) {
360 - checkReferencesInScope(context.getScope());
361 - }
362 - },
363 - FunctionDeclaration(node) {
364 - if (isReactFunction(node)) {
365 - checkReferencesInScope(context.getScope());
366 - }
367 - },
368 - };
369 - },
370 -};
371 -
372 -export default NoUseBeforeDefineRule;
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Validation/PostCodegenValidator.ts deleted
-44
@@ -1,44 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import type { CompilerContext } from "../CompilerContext";
9 -import * as LIR from "../LIR";
10 -import { PassKind, PassName } from "../Pass";
11 -
12 -/**
13 - * Optional post-codegen pass to validate the generated source code does not introduce
14 - * bugs. Enable by passing a `postCodegenValidator` validation function in compiler options.
15 - */
16 -export default {
17 - name: PassName.Validator,
18 - kind: PassKind.LIRProg as const,
19 - run,
20 -};
21 -
22 -export function run(lirProg: LIR.Prog, context: CompilerContext) {
23 - // Only run validation if the input has React functions and was successfully
24 - // transformed (no bailouts)
25 - if (lirProg.funcs.size === 0 || context.bailouts.length !== 0) {
26 - return;
27 - }
28 - const postCodegenValidator = context.opts.postCodegenValidator;
29 - if (postCodegenValidator === null) {
30 - return;
31 - }
32 - const prog = lirProg.ir.ast;
33 - const source = String(prog);
34 - const errors = postCodegenValidator(source);
35 - if (errors != null && errors.length > 0) {
36 - const messages = [];
37 - for (const error of errors) {
38 - messages.push(error.message);
39 - }
40 - throw new Error(
41 - `Generated code failed validation:\n${messages.join("\n")}`
42 - );
43 - }
44 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/Validation/index.ts deleted
-9
@@ -1,9 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -export { default as NoUseBeforeDefineRule } from "./NoUseBeforeDefineRule";
9 -export { default as PostCodegenValidator } from "./PostCodegenValidator";
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/CompilerOptions-test.ts deleted
-79
@@ -1,79 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -"use strict";
9 -
10 -import { PluginOptions } from "@babel/core";
11 -import {
12 - createCompilerOptions,
13 - parseCompilerOptions,
14 -} from "../CompilerOptions";
15 -import { OutputKind } from "../CompilerOutputs";
16 -import { noopLogger } from "../Logger";
17 -import { PassName } from "../Pass";
18 -
19 -describe("CompilerOptions", () => {
20 - function validateCompilerOptionThrows(opt: PluginOptions) {
21 - expect(() => {
22 - parseCompilerOptions(opt);
23 - }).toThrowError();
24 - }
25 -
26 - it("fails invalid compiler options", () => {
27 - validateCompilerOptionThrows(false);
28 - validateCompilerOptionThrows({
29 - outputKinds: ["Zuck"],
30 - });
31 - validateCompilerOptionThrows({
32 - stopPass: ["Zuck"],
33 - });
34 - validateCompilerOptionThrows({
35 - optIn: "Zuck",
36 - });
37 - validateCompilerOptionThrows({
38 - logger: null,
39 - });
40 - validateCompilerOptionThrows({
41 - flags: { "-zuck": true },
42 - });
43 - validateCompilerOptionThrows(false);
44 - });
45 -
46 - it("passes valid compiler options", () => {
47 - expect(parseCompilerOptions({})).toEqual(createCompilerOptions());
48 - expect(parseCompilerOptions(undefined)).toEqual(createCompilerOptions());
49 - const fullInput = {
50 - outputKinds: [OutputKind.JS, OutputKind.LIR],
51 - flags: {
52 - addFreeze: true,
53 - condCache: true,
54 - guardReads: true,
55 - guardHooks: true,
56 - localMutationThroughFreeVars: false,
57 - bailOnMultipleReturns: true,
58 - bailOnCapitalizedFunctionCalls: true,
59 - bailOnNestedComponents: true,
60 - bailOnUseRef: true,
61 - singleReturnShortcut: true,
62 - },
63 - optIn: true,
64 - stopPass: PassName.JSGen,
65 - logger: noopLogger,
66 - allowedCapitalizedUserFunctions: new Set(),
67 - postCodegenValidator: null,
68 - };
69 - expect(parseCompilerOptions(fullInput)).toEqual(fullInput);
70 - });
71 -
72 - it("ignores extra top level keys", () => {
73 - expect(
74 - parseCompilerOptions({
75 - unknownExtraKey: "what?",
76 - })
77 - ).toEqual(createCompilerOptions());
78 - });
79 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/TestDriver.ts deleted
-70
@@ -1,70 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -/* istanbul ignore file */
9 -import type { PluginItem, TransformOptions } from "@babel/core";
10 -import { transformSync } from "@babel/core";
11 -import ReactForgetBabelPlugin from "../BabelPlugin";
12 -import { getMostRecentCompilerContext } from "../CompilerContext";
13 -import { CompilerOptions as ForgetCompilerOptions } from "../CompilerOptions";
14 -import { CompilerOutputs, OutputKind } from "../CompilerOutputs";
15 -
16 -type CompileOptions = {
17 - // enables the "block scoping" plugin, needed to repro a regression
18 - blockScopingTransform?: boolean;
19 -};
20 -
21 -function createBabelOpt(
22 - forgetPluginOptions: Partial<ForgetCompilerOptions>,
23 - compileOptions: CompileOptions
24 -): TransformOptions {
25 - const plugins: PluginItem[] = [[ReactForgetBabelPlugin, forgetPluginOptions]];
26 - if (compileOptions.blockScopingTransform) {
27 - plugins.push(["@babel/plugin-transform-block-scoping", { loose: true }]);
28 - }
29 - return {
30 - plugins,
31 -
32 - // Set it to false so that CodeFrame won't contain ANSI color code.
33 - highlightCode: false,
34 -
35 - compact: true,
36 - };
37 -}
38 -
39 -/**
40 - * @param source
41 - * @param pluginOpt {@link CompilerOptions}
42 - * @returns {@link CompilerContext.outputs}
43 - */
44 -export function compile(
45 - source: string,
46 - forgetPluginOptions: Partial<ForgetCompilerOptions> = {},
47 - compileOptions: CompileOptions = {}
48 -): CompilerOutputs {
49 - const result = transformSync(
50 - source,
51 - createBabelOpt(forgetPluginOptions, compileOptions)
52 - );
53 - if (!result?.code) {
54 - console.error(result);
55 - throw new Error("Compilation failed.");
56 - }
57 -
58 - const { outputs } = getMostRecentCompilerContext();
59 - outputs[OutputKind.JS] = result.code;
60 -
61 - return outputs;
62 -}
63 -
64 -export function analyze(
65 - source: string,
66 - forgetPluginOptions: Partial<ForgetCompilerOptions> = {}
67 -) {
68 - transformSync(source, createBabelOpt(forgetPluginOptions, {}));
69 - return getMostRecentCompilerContext();
70 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/e2e/expectLogs.js deleted
-17
@@ -1,17 +0,0 @@
1 -/**
2 - * Copyright (c) Meta Platforms, Inc. and affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -const logs = [];
9 -
10 -export function log(message) {
11 - logs.push(message);
12 -}
13 -
14 -export function expectLogsAndClear(expected) {
15 - expect(logs).toEqual(expected);
16 - logs.length = 0;
17 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/e2e/hello.e2e.js deleted
-72
@@ -1,72 +0,0 @@
1 -/**
2 - * Copyright (c) Meta Platforms, Inc. and affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as React from "react";
9 -import { render } from "@testing-library/react";
10 -import { expectLogsAndClear, log } from "./expectLogs";
11 -
12 -function Hello({ name }) {
13 - "use forget";
14 - const items = [1, 2, 3].map((item) => <div key={item}>Item {item}</div>);
15 - log("render");
16 - return (
17 - <div>
18 - Hello <b>{name}</b>
19 - {items}
20 - </div>
21 - );
22 -}
23 -
24 -test("hello", () => {
25 - const { asFragment, rerender } = render(<Hello name="World" />);
26 -
27 - expect(asFragment()).toMatchInlineSnapshot(`
28 - <DocumentFragment>
29 - <div>
30 - Hello
31 - <b>
32 - World
33 - </b>
34 - <div>
35 - Item 1
36 - </div>
37 - <div>
38 - Item 2
39 - </div>
40 - <div>
41 - Item 3
42 - </div>
43 - </div>
44 - </DocumentFragment>
45 - `);
46 -
47 - expectLogsAndClear(["render"]);
48 -
49 - rerender(<Hello name="Universe" />);
50 -
51 - expect(asFragment()).toMatchInlineSnapshot(`
52 - <DocumentFragment>
53 - <div>
54 - Hello
55 - <b>
56 - Universe
57 - </b>
58 - <div>
59 - Item 1
60 - </div>
61 - <div>
62 - Item 2
63 - </div>
64 - <div>
65 - Item 3
66 - </div>
67 - </div>
68 - </DocumentFragment>
69 - `);
70 -
71 - expectLogsAndClear(__FORGET__ ? [] : ["render"]);
72 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/e2e/update-button.e2e.js deleted
-67
@@ -1,67 +0,0 @@
1 -/**
2 - * Copyright (c) Meta Platforms, Inc. and affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import * as React from "react";
9 -import { render } from "@testing-library/react";
10 -
11 -function Button({ label }) {
12 - const theme = useTheme();
13 - const style = computeStyle(theme);
14 - return <button color={style}>{label}</button>;
15 -}
16 -
17 -let currentTheme = "light";
18 -function useTheme() {
19 - return currentTheme;
20 -}
21 -
22 -let styleComputations = 0;
23 -function computeStyle(theme) {
24 - styleComputations++;
25 - return theme === "light" ? "white" : "black";
26 -}
27 -
28 -test("update-button", () => {
29 - const { asFragment, rerender } = render(<Button label="Click me" />);
30 - expect(asFragment()).toMatchInlineSnapshot(`
31 - <DocumentFragment>
32 - <button
33 - color="white"
34 - >
35 - Click me
36 - </button>
37 - </DocumentFragment>
38 - `);
39 -
40 - // Update the label, but not the theme
41 - rerender(<Button label="Click again" />);
42 - // `computeStyle` should not be called again when Forget is enabled
43 - expect(styleComputations).toBe(__FORGET__ ? 1 : 2);
44 - expect(asFragment()).toMatchInlineSnapshot(`
45 - <DocumentFragment>
46 - <button
47 - color="white"
48 - >
49 - Click again
50 - </button>
51 - </DocumentFragment>
52 - `);
53 -
54 - currentTheme = "dark";
55 - rerender(<Button label="Click again" />);
56 - expect(asFragment()).toMatchInlineSnapshot(`
57 - <DocumentFragment>
58 - <button
59 - color="black"
60 - >
61 - Click again
62 - </button>
63 - </DocumentFragment>
64 - `);
65 -
66 - expect(styleComputations).toBe(__FORGET__ ? 2 : 3);
67 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/fixtures/todo/README.md deleted
-5
@@ -1,5 +0,0 @@
1 -## TODOs
2 -
3 -This directory contains files that are currently crashing the compiler and
4 -should be moved to `../transform/` as a potential new fixture once the crash
5 -is fixed.
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/fixtures/todo/cfg-for-of-statement-with-assignment.js deleted
-15
@@ -1,15 +0,0 @@
1 -// @Out DumpCFG
2 -function useForOfStatement(x) {
3 - "use forget";
4 - const items = [];
5 - let item;
6 - for (item of x) {
7 - if (shouldBreak()) {
8 - break;
9 - } else if (shouldContinue()) {
10 - continue;
11 - }
12 - items.push(item);
13 - }
14 - return items;
15 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/test-utils/generateTestsFromFixtures.ts deleted
-206
@@ -1,206 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -"use strict";
9 -
10 -/* global expect,test */
11 -
12 -import fs from "fs";
13 -import path from "path";
14 -
15 -const EXPECT_SUFFIX = ".expect.md";
16 -
17 -const PROJECT_ROOT = path.dirname(path.dirname(__dirname));
18 -
19 -expect.extend({
20 - accessSnapshotState(_anything, cb) {
21 - cb(this["snapshotState"]._updateSnapshot);
22 - return {
23 - pass: true,
24 - message: () => "",
25 - };
26 - },
27 - toHaveNoUnmatchedSnapshots(unmatchedSnapshots, fixturesPath) {
28 - return {
29 - pass: unmatchedSnapshots.length === 0,
30 - message: () => {
31 - const unmatchedSnapshotsText = unmatchedSnapshots
32 - .map((file: string) => path.join(fixturesPath, file))
33 - .join("\n * ");
34 - return (
35 - `Found ${EXPECT_SUFFIX} files without corresponding inputs:\n* ${unmatchedSnapshotsText}` +
36 - `\n\nRun 'npm test -- -u' to remove these extra ${EXPECT_SUFFIX} files`
37 - );
38 - },
39 - };
40 - },
41 -});
42 -
43 -export default function generateTestsFromFixtures(
44 - fixturesPath: string,
45 - transform: (input: string, file: any, options: { debug: boolean }) => string
46 -) {
47 - const files = fs.readdirSync(fixturesPath);
48 - const fixtures = matchInputOutputFixtures(files, fixturesPath);
49 -
50 - const relativeFixturesPath = path.relative(PROJECT_ROOT, fixturesPath);
51 - describe(relativeFixturesPath, () => {
52 - test("has input fixtures", () => {
53 - expect(fixtures.size).toBeGreaterThan(0);
54 - });
55 -
56 - test("has a consistent extension for input fixtures", () => {
57 - const extensions = Array.from(
58 - new Set(
59 - Array.from(fixtures.values())
60 - .map((entry) =>
61 - entry.input != null ? path.extname(entry.input) : null
62 - )
63 - .filter(Boolean)
64 - )
65 - );
66 - expect(extensions).toEqual(extensions.slice(0, 1));
67 - });
68 -
69 - describe("fixtures", () => {
70 - for (const {
71 - basename,
72 - input: inputFile,
73 - output: outputFile,
74 - } of Array.from(fixtures.values())) {
75 - let testCommand;
76 -
77 - switch (basename.split(".")[0]) {
78 - case "only":
79 - testCommand = test.only;
80 - break;
81 - case "skip":
82 - testCommand = test.skip;
83 - break;
84 - default:
85 - testCommand = test;
86 - break;
87 - }
88 -
89 - let input: string | null = null;
90 - let debug = false;
91 - if (inputFile != null) {
92 - input = fs.readFileSync(inputFile, "utf8");
93 - const lines = input.split("\n");
94 - if (lines[0]!.indexOf("@only") !== -1) {
95 - testCommand = test.only;
96 - debug = true;
97 - }
98 - }
99 -
100 - testCommand(basename, () => {
101 - let receivedOutput;
102 - if (input !== null) {
103 - receivedOutput = transform(input, basename, { debug });
104 - } else {
105 - receivedOutput = "<<input deleted>>";
106 - }
107 -
108 - // Use a standard snapshot for the expected output so that the snapshot fails unless the
109 - // value matches
110 - expect(receivedOutput).toMatchSnapshot();
111 -
112 - // Determine whether the snapshot is in update mode or only creating snapshots for new inputs
113 - // to update the .expect file in parallel with updating the snapshot itself.
114 - const snapshotUpdateMode = determineSnapshotMode();
115 - if (outputFile != null) {
116 - const outputExists = fs.existsSync(outputFile);
117 - if (
118 - snapshotUpdateMode === "all" ||
119 - (snapshotUpdateMode === "new" && !outputExists)
120 - ) {
121 - if (inputFile != null) {
122 - fs.writeFileSync(outputFile, receivedOutput, "utf8");
123 - } else {
124 - fs.unlinkSync(outputFile);
125 - }
126 - } else {
127 - // As a sanity check, make sure that the current output matches the .expect file
128 - const actualOutput = fs.readFileSync(outputFile, "utf8");
129 - expect(receivedOutput).toEqual(actualOutput);
130 - }
131 - }
132 - });
133 - }
134 - });
135 - });
136 -}
137 -
138 -function determineSnapshotMode() {
139 - // Determine which snapshot mode we're in: ignoring snapshots,
140 - // updating new files only, or updating all files
141 - let updateSnapshots = "none";
142 - // @ts-ignore
143 - expect(null).accessSnapshotState((_updateSnapshots) => {
144 - updateSnapshots = _updateSnapshots;
145 - });
146 - const updateSnapshotEnvVariable = process.env["UPDATE_SNAPSHOTS"];
147 - if (
148 - updateSnapshotEnvVariable === "1" ||
149 - updateSnapshotEnvVariable === "all"
150 - ) {
151 - console.log(
152 - "Updating all snapshots due to UPDATE_SNAPSHOTS environment variable being set"
153 - );
154 - updateSnapshots = "all";
155 - } else {
156 - // @ts-ignore
157 - expect(updateSnapshotEnvVariable).toEqual();
158 - }
159 - expect(updateSnapshots).toEqual(expect.stringMatching(/none|new|all/));
160 - return updateSnapshots;
161 -}
162 -
163 -function matchInputOutputFixtures(files: string[], fixturesPath: string) {
164 - const fixtures: Map<
165 - string,
166 - { basename: string; input: string | null; output: string | null }
167 - > = new Map();
168 - for (const file of files) {
169 - const isOutput = file.endsWith(EXPECT_SUFFIX);
170 - const basename = path.basename(
171 - file,
172 - isOutput ? EXPECT_SUFFIX : path.extname(file)
173 - );
174 - let entry = fixtures.get(basename);
175 - if (entry === undefined) {
176 - entry = { basename, input: null, output: null };
177 - fixtures.set(basename, entry);
178 - }
179 - const resolvedPath = path.format({
180 - dir: fixturesPath,
181 - name: file,
182 - });
183 - if (isOutput) {
184 - entry.output = resolvedPath;
185 - } else {
186 - if (entry.input !== null) {
187 - throw new Error(
188 - "Found multiple inputs with the basename '" +
189 - basename +
190 - "': " +
191 - entry.input +
192 - " and " +
193 - resolvedPath
194 - );
195 - }
196 - entry.input = resolvedPath;
197 - const outputFile = path.format({
198 - dir: fixturesPath,
199 - name: basename,
200 - ext: EXPECT_SUFFIX,
201 - });
202 - entry.output = outputFile;
203 - }
204 - }
205 - return fixtures;
206 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/test-utils/validateNoUseBeforeDefine.ts deleted
-41
@@ -1,41 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -// @ts-ignore-line
9 -import { Linter } from "eslint/lib/linter";
10 -// @ts-ignore-line
11 -import * as HermesESLint from "hermes-eslint";
12 -// @ts-ignore-line
13 -import { NoUseBeforeDefineRule } from "../..";
14 -
15 -const ESLINT_CONFIG: Linter.Config = {
16 - parser: "hermes-eslint",
17 - parserOptions: {
18 - sourceType: "module",
19 - },
20 - rules: {
21 - "custom-no-use-before-define": [
22 - "error",
23 - { variables: false, functions: false },
24 - ],
25 - },
26 -};
27 -
28 -/**
29 - * Post-codegen pass to validate that the generated code does not introduce bugs.
30 - * Note that the compiler currently incorrectly reorders code in some cases: this
31 - * step detects this using ESLint's no-use-before-define rule at its strictest
32 - * setting.
33 - */
34 -export default function validateNoUseBeforeDefine(
35 - source: string
36 -): Array<{ line: number; column: number; message: string }> | null {
37 - const linter = new Linter();
38 - linter.defineParser("hermes-eslint", HermesESLint);
39 - linter.defineRule("custom-no-use-before-define", NoUseBeforeDefineRule);
40 - return linter.verify(source, ESLINT_CONFIG);
41 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/src/__tests__/transform-test.ts deleted
-222
@@ -1,222 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -"use strict";
9 -
10 -import path from "path";
11 -import { getMostRecentCompilerContext } from "../CompilerContext";
12 -import {
13 - CompilerFlags,
14 - createCompilerFlags,
15 - parseCompilerFlags,
16 -} from "../CompilerFlags";
17 -import {
18 - isOutputKind,
19 - isSyntacticallyValidJS,
20 - OutputKind,
21 - stringifyCompilerOutputs,
22 -} from "../CompilerOutputs";
23 -import { printDiagnostic } from "../Diagnostic";
24 -import { createArrayLogger } from "../Logger";
25 -import { PassName } from "../Pass";
26 -import generateTestsFromFixtures from "./test-utils/generateTestsFromFixtures";
27 -import validateNoUseBeforeDefine from "./test-utils/validateNoUseBeforeDefine";
28 -import * as TestDriver from "./TestDriver";
29 -
30 -enum DebugPragma {
31 - Out = "Out",
32 - Transform = "Transform",
33 - Flags = "Flags",
34 - Stop = "Stop",
35 -}
36 -
37 -const DEBUG_PRAGMA_PATTERN = new RegExp(
38 - `\/\/\\s*@(${Object.keys(DebugPragma).join("|")})\\s+(.+)\\s+`,
39 - "g"
40 -);
41 -
42 -function wrapWithTripleBackticks(s: string, ext?: string) {
43 - return `\`\`\`${ext ?? ""}
44 -${s}
45 -\`\`\``;
46 -}
47 -
48 -describe("React Forget", () => {
49 - generateTestsFromFixtures(
50 - path.join(__dirname, "fixtures", "transform"),
51 - (input, file) => {
52 - const matches = input.matchAll(DEBUG_PRAGMA_PATTERN);
53 -
54 - const compileOptions = {
55 - blockScopingTransform: false,
56 - };
57 - let flags: CompilerFlags = createCompilerFlags();
58 - let outputKinds: OutputKind[] = [];
59 - let stopPass: PassName = PassName.Validator;
60 - for (const match of matches) {
61 - const [, key, value] = match;
62 - switch (key as DebugPragma) {
63 - case DebugPragma.Out:
64 - for (const outputKind of value.split(/\s*,\s*/)) {
65 - if (isOutputKind(outputKind)) {
66 - outputKinds.push(outputKind);
67 - } else {
68 - throw new Error(
69 - `Unsupported value for @${key} pragma: '${outputKind}'`
70 - );
71 - }
72 - }
73 - break;
74 - case DebugPragma.Transform:
75 - switch (value) {
76 - case "block-scoping": {
77 - compileOptions.blockScopingTransform = true;
78 - break;
79 - }
80 - default:
81 - throw new Error(
82 - `Unsupported value for @Transform pragma: '${value}'`
83 - );
84 - }
85 - break;
86 - case DebugPragma.Stop: {
87 - const keyValue = value as keyof typeof PassName;
88 - if (!PassName[keyValue]) {
89 - throw new Error(
90 - `Unsupported value for @${key} pragma: '${value}'`
91 - );
92 - }
93 - stopPass = PassName[keyValue];
94 - break;
95 - }
96 - case DebugPragma.Flags: {
97 - const jsonValue = JSON.parse(value);
98 - flags = parseCompilerFlags(jsonValue);
99 - break;
100 - }
101 - default:
102 - throw new Error(`Unsupported pragma: @${key}`);
103 - }
104 - }
105 - outputKinds.push(OutputKind.JS);
106 - // De-duplicate outputKinds.
107 - outputKinds = [...new Set(outputKinds)];
108 -
109 - // Cache real console.log
110 - let realConsoleLog = console.log;
111 -
112 - const logs: string[] = [];
113 - let compilerOutputs = null;
114 - let error = null;
115 - try {
116 - compilerOutputs = TestDriver.compile(
117 - input,
118 - {
119 - outputKinds,
120 - stopPass,
121 - flags,
122 - logger: createArrayLogger(logs),
123 - allowedCapitalizedUserFunctions: new Set([
124 - "ReactForgetSecretInternals",
125 - ]),
126 - postCodegenValidator: validateNoUseBeforeDefine,
127 - },
128 - compileOptions
129 - );
130 - } catch (_error) {
131 - error = _error;
132 - }
133 - const context = getMostRecentCompilerContext();
134 - const logOutput =
135 - logs.length === 0
136 - ? "(Empty)"
137 - : `${wrapWithTripleBackticks(logs.join("\n\n"))}`;
138 -
139 - const expectError = file.startsWith("error.");
140 - const hasError = error !== null;
141 - if (hasError !== expectError) {
142 - if (expectError) {
143 - throw new Error(
144 - `Expected Forget to error on '${file}' but it did not.\nLogs:\n${logOutput}`
145 - );
146 - } else {
147 - console.error(error);
148 - throw new Error(`Expected '${file}' to succeed but it errored`);
149 - }
150 - }
151 -
152 - const hasBailout = context.bailouts.length > 0;
153 - const expectBailout = file.startsWith("bailout.");
154 - if (!hasError && hasBailout !== expectBailout) {
155 - if (expectBailout) {
156 - throw new Error(
157 - `Expected Forget to bail out on '${file}' but it did not.\nLogs:\n${logOutput}`
158 - );
159 - } else {
160 - console.error(context.bailouts);
161 - throw new Error(`Expected '${file}' to succeed but bailed out`);
162 - }
163 - }
164 -
165 - const outputs: string[] = [];
166 - if (compilerOutputs !== null) {
167 - const prettyOutputs = stringifyCompilerOutputs(compilerOutputs);
168 -
169 - outputKinds.forEach((outputKind) => {
170 - const prettyOutput = prettyOutputs[outputKind];
171 - const isJS = isSyntacticallyValidJS(outputKind);
172 -
173 - outputs.push(
174 - `## ${outputKind}\n\n${wrapWithTripleBackticks(
175 - prettyOutput ?? "",
176 - isJS ? "js" : ""
177 - )}`
178 - );
179 - });
180 - }
181 - if (error !== null) {
182 - outputs.push(error.message);
183 - }
184 -
185 - const diagnosticsOutput =
186 - context.diagnostics.length === 0
187 - ? "(Empty)"
188 - : `${wrapWithTripleBackticks(
189 - context.diagnostics
190 - .map((diag) => printDiagnostic(diag))
191 - .join("\n\n")
192 - )}`;
193 -
194 - const bailoutsOutput =
195 - context.bailouts.length === 0
196 - ? "(Empty)"
197 - : `${wrapWithTripleBackticks(
198 - context.bailouts
199 - .map((bail) => `[${bail.code}] ${bail.reason}`)
200 - .join("\n")
201 - )}`;
202 -
203 - // Recover real console.log.
204 - console.log = realConsoleLog;
205 -
206 - return `${outputs.join("\n\n")}
207 -
208 -## Console
209 -
210 -${logOutput}
211 -
212 -## Diagnostics
213 -
214 -${diagnosticsOutput}
215 -
216 -## Bailouts
217 -
218 -${bailoutsOutput}
219 -`;
220 - }
221 - );
222 -});
compiler/forget/packages/babel-plugin-react-forget-legacy/src/index.ts deleted
-53
@@ -1,53 +0,0 @@
1 -/**
2 - * Copyright (c) Facebook, Inc. and its affiliates.
3 - *
4 - * This source code is licensed under the MIT license found in the
5 - * LICENSE file in the root directory of this source tree.
6 - */
7 -
8 -import BabelPlugin from "./BabelPlugin";
9 -
10 -declare global {
11 - var __DEV__: boolean | null | undefined;
12 -}
13 -
14 -// TODO: Replace the following exports with something like `export * as X from "./X";`
15 -// so that we can make calls like `X.stringify` for better naming and DX.
16 -export * from "./CompilerContext";
17 -export { createCompilerFlags, parseCompilerFlags } from "./CompilerFlags";
18 -export * from "./CompilerOptions";
19 -export * from "./CompilerOutputs";
20 -export * from "./Diagnostic";
21 -export * from "./Logger";
22 -export { NoUseBeforeDefineRule } from "./Validation";
23 -
24 -import { parse } from "@babel/parser";
25 -import traverse, { NodePath } from "@babel/traverse";
26 -import * as t from "@babel/types";
27 -
28 -function parseFunctions(
29 - source: string
30 -): Array<NodePath<t.FunctionDeclaration>> {
31 - try {
32 - const ast = parse(source, {
33 - plugins: ["typescript", "jsx"],
34 - });
35 - const items: Array<NodePath<t.FunctionDeclaration>> = [];
36 - traverse(ast, {
37 - FunctionDeclaration: {
38 - enter(nodePath) {
39 - items.push(nodePath);
40 - },
41 - },
42 - });
43 - return items;
44 - } catch (e) {
45 - return [];
46 - }
47 -}
48 -
49 -export const HIR = {
50 - parseFunctions,
51 -};
52 -
53 -export default BabelPlugin;
compiler/forget/packages/babel-plugin-react-forget-legacy/src/plugin-syntax-jsx.d.ts deleted
-1
@@ -1 +0,0 @@
1 -declare module "@babel/plugin-syntax-jsx";
compiler/forget/packages/babel-plugin-react-forget-legacy/tsconfig.json deleted
-19
@@ -1,19 +0,0 @@
1 -{
2 - "extends": "@tsconfig/node16-strictest/tsconfig.json",
3 - "compilerOptions": {
4 - "declaration": true,
5 - "outDir": "dist",
6 - "jsx": "react-jsxdev",
7 -
8 - // weaken strictness from preset
9 - "importsNotUsedAsValues": "remove",
10 - "noUncheckedIndexedAccess": false,
11 - "noUnusedParameters": false,
12 - "useUnknownInCatchVariables": false,
13 - "target": "ES2015",
14 - // ideally turn off only during dev, or on a per-file basis
15 - "noUnusedLocals": false
16 - },
17 - "exclude": ["node_modules"],
18 - "include": ["src/**/*.ts"]
19 -}
compiler/forget/packages/babel-plugin-react-forget-legacy/yarn.lock deleted
-4327
@@ -1,4327 +0,0 @@
1 -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 -# yarn lockfile v1
3 -
4 -
5 -"@ampproject/remapping@^2.1.0":
6 - version "2.2.0"
7 - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
8 - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
9 - dependencies:
10 - "@jridgewell/gen-mapping" "^0.1.0"
11 - "@jridgewell/trace-mapping" "^0.3.9"
12 -
13 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6":
14 - version "7.18.6"
15 - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
16 - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
17 - dependencies:
18 - "@babel/highlight" "^7.18.6"
19 -
20 -"@babel/compat-data@^7.19.1":
21 - version "7.19.1"
22 - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.1.tgz#72d647b4ff6a4f82878d184613353af1dd0290f9"
23 - integrity sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg==
24 -
25 -"@babel/core@7.2.0", "@babel/core@^7.11.6", "@babel/core@^7.12.3":
26 - version "7.2.0"
27 - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.0.tgz#a4dd3814901998e93340f0086e9867fefa163ada"
28 - integrity sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw==
29 - dependencies:
30 - "@babel/code-frame" "^7.0.0"
31 - "@babel/generator" "^7.2.0"
32 - "@babel/helpers" "^7.2.0"
33 - "@babel/parser" "^7.2.0"
34 - "@babel/template" "^7.1.2"
35 - "@babel/traverse" "^7.1.6"
36 - "@babel/types" "^7.2.0"
37 - convert-source-map "^1.1.0"
38 - debug "^4.1.0"
39 - json5 "^2.1.0"
40 - lodash "^4.17.10"
41 - resolve "^1.3.2"
42 - semver "^5.4.1"
43 - source-map "^0.5.0"
44 -
45 -"@babel/core@^7.19.1":
46 - version "7.19.1"
47 - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.1.tgz#c8fa615c5e88e272564ace3d42fbc8b17bfeb22b"
48 - integrity sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw==
49 - dependencies:
50 - "@ampproject/remapping" "^2.1.0"
51 - "@babel/code-frame" "^7.18.6"
52 - "@babel/generator" "^7.19.0"
53 - "@babel/helper-compilation-targets" "^7.19.1"
54 - "@babel/helper-module-transforms" "^7.19.0"
55 - "@babel/helpers" "^7.19.0"
56 - "@babel/parser" "^7.19.1"
57 - "@babel/template" "^7.18.10"
58 - "@babel/traverse" "^7.19.1"
59 - "@babel/types" "^7.19.0"
60 - convert-source-map "^1.7.0"
61 - debug "^4.1.0"
62 - gensync "^1.0.0-beta.2"
63 - json5 "^2.2.1"
64 - semver "^6.3.0"
65 -
66 -"@babel/generator@7.2.0", "@babel/generator@^7.1.6", "@babel/generator@^7.2.0":
67 - version "7.2.0"
68 - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c"
69 - integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg==
70 - dependencies:
71 - "@babel/types" "^7.2.0"
72 - jsesc "^2.5.1"
73 - lodash "^4.17.10"
74 - source-map "^0.5.0"
75 - trim-right "^1.0.1"
76 -
77 -"@babel/generator@^7.19.0", "@babel/generator@^7.7.2":
78 - version "7.19.5"
79 - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.5.tgz#da3f4b301c8086717eee9cab14da91b1fa5dcca7"
80 - integrity sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==
81 - dependencies:
82 - "@babel/types" "^7.19.4"
83 - "@jridgewell/gen-mapping" "^0.3.2"
84 - jsesc "^2.5.1"
85 -
86 -"@babel/generator@^7.20.5":
87 - version "7.20.5"
88 - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95"
89 - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==
90 - dependencies:
91 - "@babel/types" "^7.20.5"
92 - "@jridgewell/gen-mapping" "^0.3.2"
93 - jsesc "^2.5.1"
94 -
95 -"@babel/helper-annotate-as-pure@^7.18.6":
96 - version "7.18.6"
97 - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
98 - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
99 - dependencies:
100 - "@babel/types" "^7.18.6"
101 -
102 -"@babel/helper-compilation-targets@^7.19.1":
103 - version "7.19.1"
104 - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz#7f630911d83b408b76fe584831c98e5395d7a17c"
105 - integrity sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg==
106 - dependencies:
107 - "@babel/compat-data" "^7.19.1"
108 - "@babel/helper-validator-option" "^7.18.6"
109 - browserslist "^4.21.3"
110 - semver "^6.3.0"
111 -
112 -"@babel/helper-create-class-features-plugin@^7.19.0":
113 - version "7.19.0"
114 - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz#bfd6904620df4e46470bae4850d66be1054c404b"
115 - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==
116 - dependencies:
117 - "@babel/helper-annotate-as-pure" "^7.18.6"
118 - "@babel/helper-environment-visitor" "^7.18.9"
119 - "@babel/helper-function-name" "^7.19.0"
120 - "@babel/helper-member-expression-to-functions" "^7.18.9"
121 - "@babel/helper-optimise-call-expression" "^7.18.6"
122 - "@babel/helper-replace-supers" "^7.18.9"
123 - "@babel/helper-split-export-declaration" "^7.18.6"
124 -
125 -"@babel/helper-environment-visitor@^7.18.9":
126 - version "7.18.9"
127 - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
128 - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
129 -
130 -"@babel/helper-function-name@^7.1.0", "@babel/helper-function-name@^7.19.0":
131 - version "7.19.0"
132 - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c"
133 - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==
134 - dependencies:
135 - "@babel/template" "^7.18.10"
136 - "@babel/types" "^7.19.0"
137 -
138 -"@babel/helper-hoist-variables@^7.18.6":
139 - version "7.18.6"
140 - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
141 - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
142 - dependencies:
143 - "@babel/types" "^7.18.6"
144 -
145 -"@babel/helper-member-expression-to-functions@^7.18.9":
146 - version "7.18.9"
147 - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
148 - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
149 - dependencies:
150 - "@babel/types" "^7.18.9"
151 -
152 -"@babel/helper-module-imports@^7.18.6":
153 - version "7.18.6"
154 - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
155 - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
156 - dependencies:
157 - "@babel/types" "^7.18.6"
158 -
159 -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0":
160 - version "7.19.0"
161 - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30"
162 - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==
163 - dependencies:
164 - "@babel/helper-environment-visitor" "^7.18.9"
165 - "@babel/helper-module-imports" "^7.18.6"
166 - "@babel/helper-simple-access" "^7.18.6"
167 - "@babel/helper-split-export-declaration" "^7.18.6"
168 - "@babel/helper-validator-identifier" "^7.18.6"
169 - "@babel/template" "^7.18.10"
170 - "@babel/traverse" "^7.19.0"
171 - "@babel/types" "^7.19.0"
172 -
173 -"@babel/helper-optimise-call-expression@^7.18.6":
174 - version "7.18.6"
175 - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
176 - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
177 - dependencies:
178 - "@babel/types" "^7.18.6"
179 -
180 -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0":
181 - version "7.19.0"
182 - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf"
183 - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==
184 -
185 -"@babel/helper-replace-supers@^7.18.9":
186 - version "7.19.1"
187 - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78"
188 - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==
189 - dependencies:
190 - "@babel/helper-environment-visitor" "^7.18.9"
191 - "@babel/helper-member-expression-to-functions" "^7.18.9"
192 - "@babel/helper-optimise-call-expression" "^7.18.6"
193 - "@babel/traverse" "^7.19.1"
194 - "@babel/types" "^7.19.0"
195 -
196 -"@babel/helper-simple-access@^7.18.6":
197 - version "7.18.6"
198 - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
199 - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
200 - dependencies:
201 - "@babel/types" "^7.18.6"
202 -
203 -"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.18.6":
204 - version "7.18.6"
205 - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
206 - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
207 - dependencies:
208 - "@babel/types" "^7.18.6"
209 -
210 -"@babel/helper-string-parser@^7.18.10":
211 - version "7.18.10"
212 - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
213 - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
214 -
215 -"@babel/helper-string-parser@^7.19.4":
216 - version "7.19.4"
217 - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63"
218 - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
219 -
220 -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
221 - version "7.19.1"
222 - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
223 - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
224 -
225 -"@babel/helper-validator-option@^7.18.6":
226 - version "7.18.6"
227 - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
228 - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
229 -
230 -"@babel/helpers@^7.19.0", "@babel/helpers@^7.2.0":
231 - version "7.19.0"
232 - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18"
233 - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==
234 - dependencies:
235 - "@babel/template" "^7.18.10"
236 - "@babel/traverse" "^7.19.0"
237 - "@babel/types" "^7.19.0"
238 -
239 -"@babel/highlight@^7.18.6":
240 - version "7.18.6"
241 - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
242 - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
243 - dependencies:
244 - "@babel/helper-validator-identifier" "^7.18.6"
245 - chalk "^2.0.0"
246 - js-tokens "^4.0.0"
247 -
248 -"@babel/parser@7.7.4":
249 - version "7.7.4"
250 - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.4.tgz#75ab2d7110c2cf2fa949959afb05fa346d2231bb"
251 - integrity sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==
252 -
253 -"@babel/parser@^7.1.0", "@babel/parser@^7.1.6", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.19.1", "@babel/parser@^7.2.0":
254 - version "7.19.1"
255 - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.1.tgz#6f6d6c2e621aad19a92544cc217ed13f1aac5b4c"
256 - integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A==
257 -
258 -"@babel/parser@^7.18.6":
259 - version "7.19.3"
260 - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a"
261 - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==
262 -
263 -"@babel/parser@^7.20.5":
264 - version "7.20.5"
265 - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8"
266 - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==
267 -
268 -"@babel/plugin-syntax-async-generators@^7.8.4":
269 - version "7.8.4"
270 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
271 - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
272 - dependencies:
273 - "@babel/helper-plugin-utils" "^7.8.0"
274 -
275 -"@babel/plugin-syntax-bigint@^7.8.3":
276 - version "7.8.3"
277 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
278 - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
279 - dependencies:
280 - "@babel/helper-plugin-utils" "^7.8.0"
281 -
282 -"@babel/plugin-syntax-class-properties@^7.8.3":
283 - version "7.12.13"
284 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
285 - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
286 - dependencies:
287 - "@babel/helper-plugin-utils" "^7.12.13"
288 -
289 -"@babel/plugin-syntax-import-meta@^7.8.3":
290 - version "7.10.4"
291 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
292 - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
293 - dependencies:
294 - "@babel/helper-plugin-utils" "^7.10.4"
295 -
296 -"@babel/plugin-syntax-json-strings@^7.8.3":
297 - version "7.8.3"
298 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
299 - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
300 - dependencies:
301 - "@babel/helper-plugin-utils" "^7.8.0"
302 -
303 -"@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2":
304 - version "7.18.6"
305 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
306 - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
307 - dependencies:
308 - "@babel/helper-plugin-utils" "^7.18.6"
309 -
310 -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
311 - version "7.10.4"
312 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
313 - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
314 - dependencies:
315 - "@babel/helper-plugin-utils" "^7.10.4"
316 -
317 -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
318 - version "7.8.3"
319 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
320 - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
321 - dependencies:
322 - "@babel/helper-plugin-utils" "^7.8.0"
323 -
324 -"@babel/plugin-syntax-numeric-separator@^7.8.3":
325 - version "7.10.4"
326 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
327 - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
328 - dependencies:
329 - "@babel/helper-plugin-utils" "^7.10.4"
330 -
331 -"@babel/plugin-syntax-object-rest-spread@^7.8.3":
332 - version "7.8.3"
333 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
334 - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
335 - dependencies:
336 - "@babel/helper-plugin-utils" "^7.8.0"
337 -
338 -"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
339 - version "7.8.3"
340 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
341 - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
342 - dependencies:
343 - "@babel/helper-plugin-utils" "^7.8.0"
344 -
345 -"@babel/plugin-syntax-optional-chaining@^7.8.3":
346 - version "7.8.3"
347 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
348 - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
349 - dependencies:
350 - "@babel/helper-plugin-utils" "^7.8.0"
351 -
352 -"@babel/plugin-syntax-top-level-await@^7.8.3":
353 - version "7.14.5"
354 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
355 - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
356 - dependencies:
357 - "@babel/helper-plugin-utils" "^7.14.5"
358 -
359 -"@babel/plugin-syntax-typescript@^7.18.6", "@babel/plugin-syntax-typescript@^7.7.2":
360 - version "7.18.6"
361 - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285"
362 - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==
363 - dependencies:
364 - "@babel/helper-plugin-utils" "^7.18.6"
365 -
366 -"@babel/plugin-transform-block-scoping@^7.18.9":
367 - version "7.18.9"
368 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
369 - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
370 - dependencies:
371 - "@babel/helper-plugin-utils" "^7.18.9"
372 -
373 -"@babel/plugin-transform-modules-commonjs@^7.18.6":
374 - version "7.18.6"
375 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
376 - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
377 - dependencies:
378 - "@babel/helper-module-transforms" "^7.18.6"
379 - "@babel/helper-plugin-utils" "^7.18.6"
380 - "@babel/helper-simple-access" "^7.18.6"
381 - babel-plugin-dynamic-import-node "^2.3.3"
382 -
383 -"@babel/plugin-transform-react-display-name@^7.18.6":
384 - version "7.18.6"
385 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415"
386 - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==
387 - dependencies:
388 - "@babel/helper-plugin-utils" "^7.18.6"
389 -
390 -"@babel/plugin-transform-react-jsx-development@^7.18.6":
391 - version "7.18.6"
392 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5"
393 - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==
394 - dependencies:
395 - "@babel/plugin-transform-react-jsx" "^7.18.6"
396 -
397 -"@babel/plugin-transform-react-jsx@^7.18.6":
398 - version "7.19.0"
399 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9"
400 - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==
401 - dependencies:
402 - "@babel/helper-annotate-as-pure" "^7.18.6"
403 - "@babel/helper-module-imports" "^7.18.6"
404 - "@babel/helper-plugin-utils" "^7.19.0"
405 - "@babel/plugin-syntax-jsx" "^7.18.6"
406 - "@babel/types" "^7.19.0"
407 -
408 -"@babel/plugin-transform-react-pure-annotations@^7.18.6":
409 - version "7.18.6"
410 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844"
411 - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==
412 - dependencies:
413 - "@babel/helper-annotate-as-pure" "^7.18.6"
414 - "@babel/helper-plugin-utils" "^7.18.6"
415 -
416 -"@babel/plugin-transform-typescript@^7.18.6":
417 - version "7.19.1"
418 - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz#adcf180a041dcbd29257ad31b0c65d4de531ce8d"
419 - integrity sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ==
420 - dependencies:
421 - "@babel/helper-create-class-features-plugin" "^7.19.0"
422 - "@babel/helper-plugin-utils" "^7.19.0"
423 - "@babel/plugin-syntax-typescript" "^7.18.6"
424 -
425 -"@babel/preset-react@^7.18.6":
426 - version "7.18.6"
427 - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d"
428 - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==
429 - dependencies:
430 - "@babel/helper-plugin-utils" "^7.18.6"
431 - "@babel/helper-validator-option" "^7.18.6"
432 - "@babel/plugin-transform-react-display-name" "^7.18.6"
433 - "@babel/plugin-transform-react-jsx" "^7.18.6"
434 - "@babel/plugin-transform-react-jsx-development" "^7.18.6"
435 - "@babel/plugin-transform-react-pure-annotations" "^7.18.6"
436 -
437 -"@babel/preset-typescript@^7.18.6":
438 - version "7.18.6"
439 - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399"
440 - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==
441 - dependencies:
442 - "@babel/helper-plugin-utils" "^7.18.6"
443 - "@babel/helper-validator-option" "^7.18.6"
444 - "@babel/plugin-transform-typescript" "^7.18.6"
445 -
446 -"@babel/runtime@^7.12.5":
447 - version "7.19.0"
448 - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259"
449 - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==
450 - dependencies:
451 - regenerator-runtime "^0.13.4"
452 -
453 -"@babel/template@^7.1.2", "@babel/template@^7.18.10":
454 - version "7.18.10"
455 - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
456 - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
457 - dependencies:
458 - "@babel/code-frame" "^7.18.6"
459 - "@babel/parser" "^7.18.10"
460 - "@babel/types" "^7.18.10"
461 -
462 -"@babel/template@^7.3.3":
463 - version "7.18.6"
464 - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31"
465 - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==
466 - dependencies:
467 - "@babel/code-frame" "^7.18.6"
468 - "@babel/parser" "^7.18.6"
469 - "@babel/types" "^7.18.6"
470 -
471 -"@babel/traverse@7.1.6", "@babel/traverse@^7.1.6", "@babel/traverse@^7.19.0", "@babel/traverse@^7.7.2":
472 - version "7.1.6"
473 - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c"
474 - integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==
475 - dependencies:
476 - "@babel/code-frame" "^7.0.0"
477 - "@babel/generator" "^7.1.6"
478 - "@babel/helper-function-name" "^7.1.0"
479 - "@babel/helper-split-export-declaration" "^7.0.0"
480 - "@babel/parser" "^7.1.6"
481 - "@babel/types" "^7.1.6"
482 - debug "^4.1.0"
483 - globals "^11.1.0"
484 - lodash "^4.17.10"
485 -
486 -"@babel/traverse@^7.19.1":
487 - version "7.20.5"
488 - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133"
489 - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==
490 - dependencies:
491 - "@babel/code-frame" "^7.18.6"
492 - "@babel/generator" "^7.20.5"
493 - "@babel/helper-environment-visitor" "^7.18.9"
494 - "@babel/helper-function-name" "^7.19.0"
495 - "@babel/helper-hoist-variables" "^7.18.6"
496 - "@babel/helper-split-export-declaration" "^7.18.6"
497 - "@babel/parser" "^7.20.5"
498 - "@babel/types" "^7.20.5"
499 - debug "^4.1.0"
500 - globals "^11.1.0"
501 -
502 -"@babel/types@7.7.4":
503 - version "7.7.4"
504 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.4.tgz#516570d539e44ddf308c07569c258ff94fde9193"
505 - integrity sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==
506 - dependencies:
507 - esutils "^2.0.2"
508 - lodash "^4.17.13"
509 - to-fast-properties "^2.0.0"
510 -
511 -"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
512 - version "7.18.9"
513 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f"
514 - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==
515 - dependencies:
516 - "@babel/helper-validator-identifier" "^7.18.6"
517 - to-fast-properties "^2.0.0"
518 -
519 -"@babel/types@^7.1.6", "@babel/types@^7.18.10", "@babel/types@^7.19.0", "@babel/types@^7.2.0":
520 - version "7.19.0"
521 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.0.tgz#75f21d73d73dc0351f3368d28db73465f4814600"
522 - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==
523 - dependencies:
524 - "@babel/helper-string-parser" "^7.18.10"
525 - "@babel/helper-validator-identifier" "^7.18.6"
526 - to-fast-properties "^2.0.0"
527 -
528 -"@babel/types@^7.19.4":
529 - version "7.19.4"
530 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.4.tgz#0dd5c91c573a202d600490a35b33246fed8a41c7"
531 - integrity sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==
532 - dependencies:
533 - "@babel/helper-string-parser" "^7.19.4"
534 - "@babel/helper-validator-identifier" "^7.19.1"
535 - to-fast-properties "^2.0.0"
536 -
537 -"@babel/types@^7.20.5":
538 - version "7.20.5"
539 - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84"
540 - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==
541 - dependencies:
542 - "@babel/helper-string-parser" "^7.19.4"
543 - "@babel/helper-validator-identifier" "^7.19.1"
544 - to-fast-properties "^2.0.0"
545 -
546 -"@bcoe/v8-coverage@^0.2.3":
547 - version "0.2.3"
548 - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
549 - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
550 -
551 -"@cspotcode/source-map-support@^0.8.0":
552 - version "0.8.1"
553 - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
554 - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
555 - dependencies:
556 - "@jridgewell/trace-mapping" "0.3.9"
557 -
558 -"@eslint/eslintrc@^1.3.3":
559 - version "1.3.3"
560 - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95"
561 - integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==
562 - dependencies:
563 - ajv "^6.12.4"
564 - debug "^4.3.2"
565 - espree "^9.4.0"
566 - globals "^13.15.0"
567 - ignore "^5.2.0"
568 - import-fresh "^3.2.1"
569 - js-yaml "^4.1.0"
570 - minimatch "^3.1.2"
571 - strip-json-comments "^3.1.1"
572 -
573 -"@hpcc-js/wasm@^1.15.0":
574 - version "1.16.5"
575 - resolved "https://registry.yarnpkg.com/@hpcc-js/wasm/-/wasm-1.16.5.tgz#4dbfd517b4f92ffe17922ea02a434be60c8aef26"
576 - integrity sha512-JarqNdfddZd519/GW5zVEpCpVGoojegQPxqezbPJv45gz3qBtbODt0KS+2/+XS9b3fPbwrNna2/XyUWz5/RZhw==
577 - dependencies:
578 - yargs "17.5.1"
579 -
580 -"@humanwhocodes/config-array@^0.10.5":
581 - version "0.10.7"
582 - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc"
583 - integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==
584 - dependencies:
585 - "@humanwhocodes/object-schema" "^1.2.1"
586 - debug "^4.1.1"
587 - minimatch "^3.0.4"
588 -
589 -"@humanwhocodes/module-importer@^1.0.1":
590 - version "1.0.1"
591 - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
592 - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
593 -
594 -"@humanwhocodes/object-schema@^1.2.1":
595 - version "1.2.1"
596 - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
597 - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
598 -
599 -"@istanbuljs/load-nyc-config@^1.0.0":
600 - version "1.1.0"
601 - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
602 - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
603 - dependencies:
604 - camelcase "^5.3.1"
605 - find-up "^4.1.0"
606 - get-package-type "^0.1.0"
607 - js-yaml "^3.13.1"
608 - resolve-from "^5.0.0"
609 -
610 -"@istanbuljs/schema@^0.1.2":
611 - version "0.1.3"
612 - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
613 - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
614 -
615 -"@jest/console@^29.0.3":
616 - version "29.0.3"
617 - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.0.3.tgz#a222ab87e399317a89db88a58eaec289519e807a"
618 - integrity sha512-cGg0r+klVHSYnfE977S9wmpuQ9L+iYuYgL+5bPXiUlUynLLYunRxswEmhBzvrSKGof5AKiHuTTmUKAqRcDY9dg==
619 - dependencies:
620 - "@jest/types" "^29.0.3"
621 - "@types/node" "*"
622 - chalk "^4.0.0"
623 - jest-message-util "^29.0.3"
624 - jest-util "^29.0.3"
625 - slash "^3.0.0"
626 -
627 -"@jest/core@^29.0.3":
628 - version "29.0.3"
629 - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.0.3.tgz#ba22a9cbd0c7ba36e04292e2093c547bf53ec1fd"
630 - integrity sha512-1d0hLbOrM1qQE3eP3DtakeMbKTcXiXP3afWxqz103xPyddS2NhnNghS7MaXx1dcDt4/6p4nlhmeILo2ofgi8cQ==
631 - dependencies:
632 - "@jest/console" "^29.0.3"
633 - "@jest/reporters" "^29.0.3"
634 - "@jest/test-result" "^29.0.3"
635 - "@jest/transform" "^29.0.3"
636 - "@jest/types" "^29.0.3"
637 - "@types/node" "*"
638 - ansi-escapes "^4.2.1"
639 - chalk "^4.0.0"
640 - ci-info "^3.2.0"
641 - exit "^0.1.2"
642 - graceful-fs "^4.2.9"
643 - jest-changed-files "^29.0.0"
644 - jest-config "^29.0.3"
645 - jest-haste-map "^29.0.3"
646 - jest-message-util "^29.0.3"
647 - jest-regex-util "^29.0.0"
648 - jest-resolve "^29.0.3"
649 - jest-resolve-dependencies "^29.0.3"
650 - jest-runner "^29.0.3"
651 - jest-runtime "^29.0.3"
652 - jest-snapshot "^29.0.3"
653 - jest-util "^29.0.3"
654 - jest-validate "^29.0.3"
655 - jest-watcher "^29.0.3"
656 - micromatch "^4.0.4"
657 - pretty-format "^29.0.3"
658 - slash "^3.0.0"
659 - strip-ansi "^6.0.0"
660 -
661 -"@jest/environment@^29.0.3":
662 - version "29.0.3"
663 - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.0.3.tgz#7745ec30a954e828e8cc6df6a13280d3b51d8f35"
664 - integrity sha512-iKl272NKxYNQNqXMQandAIwjhQaGw5uJfGXduu8dS9llHi8jV2ChWrtOAVPnMbaaoDhnI3wgUGNDvZgHeEJQCA==
665 - dependencies:
666 - "@jest/fake-timers" "^29.0.3"
667 - "@jest/types" "^29.0.3"
668 - "@types/node" "*"
669 - jest-mock "^29.0.3"
670 -
671 -"@jest/expect-utils@^29.0.3":
672 - version "29.0.3"
673 - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.0.3.tgz#f5bb86f5565bf2dacfca31ccbd887684936045b2"
674 - integrity sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q==
675 - dependencies:
676 - jest-get-type "^29.0.0"
677 -
678 -"@jest/expect@^29.0.3":
679 - version "29.0.3"
680 - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.0.3.tgz#9dc7c46354eeb7a348d73881fba6402f5fdb2c30"
681 - integrity sha512-6W7K+fsI23FQ01H/BWccPyDZFrnU9QlzDcKOjrNVU5L8yUORFAJJIpmyxWPW70+X624KUNqzZwPThPMX28aXEQ==
682 - dependencies:
683 - expect "^29.0.3"
684 - jest-snapshot "^29.0.3"
685 -
686 -"@jest/fake-timers@^29.0.3":
687 - version "29.0.3"
688 - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.0.3.tgz#ad5432639b715d45a86a75c47fd75019bc36b22c"
689 - integrity sha512-tmbUIo03x0TdtcZCESQ0oQSakPCpo7+s6+9mU19dd71MptkP4zCwoeZqna23//pgbhtT1Wq02VmA9Z9cNtvtCQ==
690 - dependencies:
691 - "@jest/types" "^29.0.3"
692 - "@sinonjs/fake-timers" "^9.1.2"
693 - "@types/node" "*"
694 - jest-message-util "^29.0.3"
695 - jest-mock "^29.0.3"
696 - jest-util "^29.0.3"
697 -
698 -"@jest/globals@^29.0.3":
699 - version "29.0.3"
700 - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.0.3.tgz#681950c430fdc13ff9aa89b2d8d572ac0e4a1bf5"
701 - integrity sha512-YqGHT65rFY2siPIHHFjuCGUsbzRjdqkwbat+Of6DmYRg5shIXXrLdZoVE/+TJ9O1dsKsFmYhU58JvIbZRU1Z9w==
702 - dependencies:
703 - "@jest/environment" "^29.0.3"
704 - "@jest/expect" "^29.0.3"
705 - "@jest/types" "^29.0.3"
706 - jest-mock "^29.0.3"
707 -
708 -"@jest/reporters@^29.0.3":
709 - version "29.0.3"
710 - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.0.3.tgz#735f110e08b44b38729d8dbbb74063bdf5aba8a5"
711 - integrity sha512-3+QU3d4aiyOWfmk1obDerie4XNCaD5Xo1IlKNde2yGEi02WQD+ZQD0i5Hgqm1e73sMV7kw6pMlCnprtEwEVwxw==
712 - dependencies:
713 - "@bcoe/v8-coverage" "^0.2.3"
714 - "@jest/console" "^29.0.3"
715 - "@jest/test-result" "^29.0.3"
716 - "@jest/transform" "^29.0.3"
717 - "@jest/types" "^29.0.3"
718 - "@jridgewell/trace-mapping" "^0.3.15"
719 - "@types/node" "*"
720 - chalk "^4.0.0"
721 - collect-v8-coverage "^1.0.0"
722 - exit "^0.1.2"
723 - glob "^7.1.3"
724 - graceful-fs "^4.2.9"
725 - istanbul-lib-coverage "^3.0.0"
726 - istanbul-lib-instrument "^5.1.0"
727 - istanbul-lib-report "^3.0.0"
728 - istanbul-lib-source-maps "^4.0.0"
729 - istanbul-reports "^3.1.3"
730 - jest-message-util "^29.0.3"
731 - jest-util "^29.0.3"
732 - jest-worker "^29.0.3"
733 - slash "^3.0.0"
734 - string-length "^4.0.1"
735 - strip-ansi "^6.0.0"
736 - terminal-link "^2.0.0"
737 - v8-to-istanbul "^9.0.1"
738 -
739 -"@jest/schemas@^29.0.0":
740 - version "29.0.0"
741 - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a"
742 - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==
743 - dependencies:
744 - "@sinclair/typebox" "^0.24.1"
745 -
746 -"@jest/source-map@^29.0.0":
747 - version "29.0.0"
748 - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.0.0.tgz#f8d1518298089f8ae624e442bbb6eb870ee7783c"
749 - integrity sha512-nOr+0EM8GiHf34mq2GcJyz/gYFyLQ2INDhAylrZJ9mMWoW21mLBfZa0BUVPPMxVYrLjeiRe2Z7kWXOGnS0TFhQ==
750 - dependencies:
751 - "@jridgewell/trace-mapping" "^0.3.15"
752 - callsites "^3.0.0"
753 - graceful-fs "^4.2.9"
754 -
755 -"@jest/test-result@^29.0.3":
756 - version "29.0.3"
757 - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.0.3.tgz#b03d8ef4c58be84cd5d5d3b24d4b4c8cabbf2746"
758 - integrity sha512-vViVnQjCgTmbhDKEonKJPtcFe9G/CJO4/Np4XwYJah+lF2oI7KKeRp8t1dFvv44wN2NdbDb/qC6pi++Vpp0Dlg==
759 - dependencies:
760 - "@jest/console" "^29.0.3"
761 - "@jest/types" "^29.0.3"
762 - "@types/istanbul-lib-coverage" "^2.0.0"
763 - collect-v8-coverage "^1.0.0"
764 -
765 -"@jest/test-sequencer@^29.0.3":
766 - version "29.0.3"
767 - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.0.3.tgz#0681061ad21fb8e293b49c4fdf7e631ca79240ba"
768 - integrity sha512-Hf4+xYSWZdxTNnhDykr8JBs0yBN/nxOXyUQWfotBUqqy0LF9vzcFB0jm/EDNZCx587znLWTIgxcokW7WeZMobQ==
769 - dependencies:
770 - "@jest/test-result" "^29.0.3"
771 - graceful-fs "^4.2.9"
772 - jest-haste-map "^29.0.3"
773 - slash "^3.0.0"
774 -
775 -"@jest/transform@^29.0.3":
776 - version "29.0.3"
777 - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.0.3.tgz#9eb1fed2072a0354f190569807d1250572fb0970"
778 - integrity sha512-C5ihFTRYaGDbi/xbRQRdbo5ddGtI4VSpmL6AIcZxdhwLbXMa7PcXxxqyI91vGOFHnn5aVM3WYnYKCHEqmLVGzg==
779 - dependencies:
780 - "@babel/core" "^7.11.6"
781 - "@jest/types" "^29.0.3"
782 - "@jridgewell/trace-mapping" "^0.3.15"
783 - babel-plugin-istanbul "^6.1.1"
784 - chalk "^4.0.0"
785 - convert-source-map "^1.4.0"
786 - fast-json-stable-stringify "^2.1.0"
787 - graceful-fs "^4.2.9"
788 - jest-haste-map "^29.0.3"
789 - jest-regex-util "^29.0.0"
790 - jest-util "^29.0.3"
791 - micromatch "^4.0.4"
792 - pirates "^4.0.4"
793 - slash "^3.0.0"
794 - write-file-atomic "^4.0.1"
795 -
796 -"@jest/types@^24.9.0":
797 - version "24.9.0"
798 - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59"
799 - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==
800 - dependencies:
801 - "@types/istanbul-lib-coverage" "^2.0.0"
802 - "@types/istanbul-reports" "^1.1.1"
803 - "@types/yargs" "^13.0.0"
804 -
805 -"@jest/types@^29.0.3":
806 - version "29.0.3"
807 - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.0.3.tgz#0be78fdddb1a35aeb2041074e55b860561c8ef63"
808 - integrity sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==
809 - dependencies:
810 - "@jest/schemas" "^29.0.0"
811 - "@types/istanbul-lib-coverage" "^2.0.0"
812 - "@types/istanbul-reports" "^3.0.0"
813 - "@types/node" "*"
814 - "@types/yargs" "^17.0.8"
815 - chalk "^4.0.0"
816 -
817 -"@jridgewell/gen-mapping@^0.1.0":
818 - version "0.1.1"
819 - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
820 - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
821 - dependencies:
822 - "@jridgewell/set-array" "^1.0.0"
823 - "@jridgewell/sourcemap-codec" "^1.4.10"
824 -
825 -"@jridgewell/gen-mapping@^0.3.2":
826 - version "0.3.2"
827 - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
828 - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
829 - dependencies:
830 - "@jridgewell/set-array" "^1.0.1"
831 - "@jridgewell/sourcemap-codec" "^1.4.10"
832 - "@jridgewell/trace-mapping" "^0.3.9"
833 -
834 -"@jridgewell/resolve-uri@^3.0.3":
835 - version "3.1.0"
836 - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
837 - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
838 -
839 -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
840 - version "1.1.2"
841 - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
842 - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
843 -
844 -"@jridgewell/sourcemap-codec@^1.4.10":
845 - version "1.4.14"
846 - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
847 - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
848 -
849 -"@jridgewell/trace-mapping@0.3.9":
850 - version "0.3.9"
851 - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
852 - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
853 - dependencies:
854 - "@jridgewell/resolve-uri" "^3.0.3"
855 - "@jridgewell/sourcemap-codec" "^1.4.10"
856 -
857 -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.9":
858 - version "0.3.15"
859 - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774"
860 - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==
861 - dependencies:
862 - "@jridgewell/resolve-uri" "^3.0.3"
863 - "@jridgewell/sourcemap-codec" "^1.4.10"
864 -
865 -"@nodelib/fs.scandir@2.1.5":
866 - version "2.1.5"
867 - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
868 - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
869 - dependencies:
870 - "@nodelib/fs.stat" "2.0.5"
871 - run-parallel "^1.1.9"
872 -
873 -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
874 - version "2.0.5"
875 - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
876 - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
877 -
878 -"@nodelib/fs.walk@^1.2.3":
879 - version "1.2.8"
880 - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
881 - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
882 - dependencies:
883 - "@nodelib/fs.scandir" "2.1.5"
884 - fastq "^1.6.0"
885 -
886 -"@sinclair/typebox@^0.24.1":
887 - version "0.24.42"
888 - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.42.tgz#a74b608d494a1f4cc079738e050142a678813f52"
889 - integrity sha512-d+2AtrHGyWek2u2ITF0lHRIv6Tt7X0dEHW+0rP+5aDCEjC3fiN2RBjrLD0yU0at52BcZbRGxLbAtXiR0hFCjYw==
890 -
891 -"@sinonjs/commons@^1.7.0":
892 - version "1.8.3"
893 - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
894 - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
895 - dependencies:
896 - type-detect "4.0.8"
897 -
898 -"@sinonjs/fake-timers@^9.1.2":
899 - version "9.1.2"
900 - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c"
901 - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==
902 - dependencies:
903 - "@sinonjs/commons" "^1.7.0"
904 -
905 -"@testing-library/dom@^8.5.0":
906 - version "8.18.1"
907 - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.18.1.tgz#80f91be02bc171fe5a3a7003f88207be31ac2cf3"
908 - integrity sha512-oEvsm2B/WtcHKE+IcEeeCqNU/ltFGaVyGbpcm4g/2ytuT49jrlH9x5qRKL/H3A6yfM4YAbSbC0ceT5+9CEXnLg==
909 - dependencies:
910 - "@babel/code-frame" "^7.10.4"
911 - "@babel/runtime" "^7.12.5"
912 - "@types/aria-query" "^4.2.0"
913 - aria-query "^5.0.0"
914 - chalk "^4.1.0"
915 - dom-accessibility-api "^0.5.9"
916 - lz-string "^1.4.4"
917 - pretty-format "^27.0.2"
918 -
919 -"@testing-library/react@^13.4.0":
920 - version "13.4.0"
921 - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.4.0.tgz#6a31e3bf5951615593ad984e96b9e5e2d9380966"
922 - integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==
923 - dependencies:
924 - "@babel/runtime" "^7.12.5"
925 - "@testing-library/dom" "^8.5.0"
926 - "@types/react-dom" "^18.0.0"
927 -
928 -"@tootallnate/once@2":
929 - version "2.0.0"
930 - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
931 - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
932 -
933 -"@tsconfig/node10@^1.0.7":
934 - version "1.0.9"
935 - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
936 - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
937 -
938 -"@tsconfig/node12@^1.0.7":
939 - version "1.0.11"
940 - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
941 - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
942 -
943 -"@tsconfig/node14@^1.0.0":
944 - version "1.0.3"
945 - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
946 - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
947 -
948 -"@tsconfig/node16-strictest@^1.0.3":
949 - version "1.0.4"
950 - resolved "https://registry.yarnpkg.com/@tsconfig/node16-strictest/-/node16-strictest-1.0.4.tgz#14218b0341223d5caa692fa789fb374909690875"
951 - integrity sha512-kp6/DuAoKzHVv5U+p0uOesYbjrEvrYVNdQMl163a+yXXUv9twabvkCGEn3pmVxKXB45JU5MPGolDDWnONZL5ZQ==
952 -
953 -"@tsconfig/node16@^1.0.2":
954 - version "1.0.3"
955 - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
956 - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
957 -
958 -"@types/aria-query@^4.2.0":
959 - version "4.2.2"
960 - resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc"
961 - integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==
962 -
963 -"@types/babel__core@^7.1.14":
964 - version "7.1.19"
965 - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
966 - integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
967 - dependencies:
968 - "@babel/parser" "^7.1.0"
969 - "@babel/types" "^7.0.0"
970 - "@types/babel__generator" "*"
971 - "@types/babel__template" "*"
972 - "@types/babel__traverse" "*"
973 -
974 -"@types/babel__generator@*":
975 - version "7.6.4"
976 - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
977 - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
978 - dependencies:
979 - "@babel/types" "^7.0.0"
980 -
981 -"@types/babel__template@*":
982 - version "7.4.1"
983 - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
984 - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
985 - dependencies:
986 - "@babel/parser" "^7.1.0"
987 - "@babel/types" "^7.0.0"
988 -
989 -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
990 - version "7.18.2"
991 - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.2.tgz#235bf339d17185bdec25e024ca19cce257cc7309"
992 - integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==
993 - dependencies:
994 - "@babel/types" "^7.3.0"
995 -
996 -"@types/eslint@^8.4.6":
997 - version "8.4.6"
998 - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.6.tgz#7976f054c1bccfcf514bff0564c0c41df5c08207"
999 - integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==
1000 - dependencies:
1001 - "@types/estree" "*"
1002 - "@types/json-schema" "*"
1003 -
1004 -"@types/estree@*":
1005 - version "1.0.0"
1006 - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
1007 - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
1008 -
1009 -"@types/graceful-fs@^4.1.3":
1010 - version "4.1.5"
1011 - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
1012 - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
1013 - dependencies:
1014 - "@types/node" "*"
1015 -
1016 -"@types/invariant@^2.2.35":
1017 - version "2.2.35"
1018 - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be"
1019 - integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==
1020 -
1021 -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
1022 - version "2.0.4"
1023 - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
1024 - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
1025 -
1026 -"@types/istanbul-lib-report@*":
1027 - version "3.0.0"
1028 - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
1029 - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
1030 - dependencies:
1031 - "@types/istanbul-lib-coverage" "*"
1032 -
1033 -"@types/istanbul-reports@^1.1.1":
1034 - version "1.1.2"
1035 - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2"
1036 - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==
1037 - dependencies:
1038 - "@types/istanbul-lib-coverage" "*"
1039 - "@types/istanbul-lib-report" "*"
1040 -
1041 -"@types/istanbul-reports@^3.0.0":
1042 - version "3.0.1"
1043 - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
1044 - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
1045 - dependencies:
1046 - "@types/istanbul-lib-report" "*"
1047 -
1048 -"@types/jest@^29.0.3":
1049 - version "29.0.3"
1050 - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.0.3.tgz#b61a5ed100850686b8d3c5e28e3a1926b2001b59"
1051 - integrity sha512-F6ukyCTwbfsEX5F2YmVYmM5TcTHy1q9P5rWlRbrk56KyMh3v9xRGUO3aa8+SkvMi0SHXtASJv1283enXimC0Og==
1052 - dependencies:
1053 - expect "^29.0.0"
1054 - pretty-format "^29.0.0"
1055 -
1056 -"@types/jsdom@^20.0.0":
1057 - version "20.0.0"
1058 - resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.0.tgz#4414fb629465167f8b7b3804b9e067bdd99f1791"
1059 - integrity sha512-YfAchFs0yM1QPDrLm2VHe+WHGtqms3NXnXAMolrgrVP6fgBHHXy1ozAbo/dFtPNtZC/m66bPiCTWYmqp1F14gA==
1060 - dependencies:
1061 - "@types/node" "*"
1062 - "@types/tough-cookie" "*"
1063 - parse5 "^7.0.0"
1064 -
1065 -"@types/json-schema@*":
1066 - version "7.0.11"
1067 - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
1068 - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
1069 -
1070 -"@types/node@*", "@types/node@^18.7.18":
1071 - version "18.7.19"
1072 - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.7.19.tgz#ad83aa9b7af470fab7e0f562be87e97dc8ffe08e"
1073 - integrity sha512-Sq1itGUKUX1ap7GgZlrzdBydjbsJL/NSQt/4wkAxUJ7/OS5c2WkoN6WSpWc2Yc5wtKMZOUA0VCs/j2XJadN3HA==
1074 -
1075 -"@types/prettier@^2.1.5":
1076 - version "2.7.0"
1077 - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.0.tgz#ea03e9f0376a4446f44797ca19d9c46c36e352dc"
1078 - integrity sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==
1079 -
1080 -"@types/prop-types@*":
1081 - version "15.7.5"
1082 - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
1083 - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
1084 -
1085 -"@types/react-dom@^18.0.0":
1086 - version "18.0.6"
1087 - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.6.tgz#36652900024842b74607a17786b6662dd1e103a1"
1088 - integrity sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==
1089 - dependencies:
1090 - "@types/react" "*"
1091 -
1092 -"@types/react@*":
1093 - version "18.0.21"
1094 - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.21.tgz#b8209e9626bb00a34c76f55482697edd2b43cc67"
1095 - integrity sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==
1096 - dependencies:
1097 - "@types/prop-types" "*"
1098 - "@types/scheduler" "*"
1099 - csstype "^3.0.2"
1100 -
1101 -"@types/scheduler@*":
1102 - version "0.16.2"
1103 - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
1104 - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
1105 -
1106 -"@types/stack-utils@^2.0.0":
1107 - version "2.0.1"
1108 - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
1109 - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
1110 -
1111 -"@types/tough-cookie@*":
1112 - version "4.0.2"
1113 - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397"
1114 - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==
1115 -
1116 -"@types/yargs-parser@*":
1117 - version "21.0.0"
1118 - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
1119 - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
1120 -
1121 -"@types/yargs@^13.0.0":
1122 - version "13.0.12"
1123 - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092"
1124 - integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==
1125 - dependencies:
1126 - "@types/yargs-parser" "*"
1127 -
1128 -"@types/yargs@^17.0.8":
1129 - version "17.0.13"
1130 - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76"
1131 - integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==
1132 - dependencies:
1133 - "@types/yargs-parser" "*"
1134 -
1135 -abab@^2.0.6:
1136 - version "2.0.6"
1137 - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
1138 - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
1139 -
1140 -accepts@~1.3.4:
1141 - version "1.3.8"
1142 - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
1143 - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
1144 - dependencies:
1145 - mime-types "~2.1.34"
1146 - negotiator "0.6.3"
1147 -
1148 -acorn-globals@^6.0.0:
1149 - version "6.0.0"
1150 - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
1151 - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
1152 - dependencies:
1153 - acorn "^7.1.1"
1154 - acorn-walk "^7.1.1"
1155 -
1156 -acorn-jsx@^5.3.2:
1157 - version "5.3.2"
1158 - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
1159 - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
1160 -
1161 -acorn-walk@^7.1.1:
1162 - version "7.2.0"
1163 - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
1164 - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
1165 -
1166 -acorn-walk@^8.1.1:
1167 - version "8.2.0"
1168 - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
1169 - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
1170 -
1171 -acorn@^7.1.1:
1172 - version "7.4.1"
1173 - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
1174 - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
1175 -
1176 -acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.0:
1177 - version "8.8.0"
1178 - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
1179 - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
1180 -
1181 -after@0.8.2:
1182 - version "0.8.2"
1183 - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
1184 - integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==
1185 -
1186 -agent-base@6:
1187 - version "6.0.2"
1188 - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
1189 - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
1190 - dependencies:
1191 - debug "4"
1192 -
1193 -ajv@^6.10.0, ajv@^6.12.4:
1194 - version "6.12.6"
1195 - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
1196 - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
1197 - dependencies:
1198 - fast-deep-equal "^3.1.1"
1199 - fast-json-stable-stringify "^2.0.0"
1200 - json-schema-traverse "^0.4.1"
1201 - uri-js "^4.2.2"
1202 -
1203 -ansi-escapes@^4.2.1:
1204 - version "4.3.2"
1205 - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
1206 - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
1207 - dependencies:
1208 - type-fest "^0.21.3"
1209 -
1210 -ansi-regex@^4.0.0, ansi-regex@^4.1.0:
1211 - version "4.1.1"
1212 - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
1213 - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
1214 -
1215 -ansi-regex@^5.0.1:
1216 - version "5.0.1"
1217 - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
1218 - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
1219 -
1220 -ansi-styles@^3.2.0, ansi-styles@^3.2.1:
1221 - version "3.2.1"
1222 - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1223 - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1224 - dependencies:
1225 - color-convert "^1.9.0"
1226 -
1227 -ansi-styles@^4.0.0, ansi-styles@^4.1.0:
1228 - version "4.3.0"
1229 - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
1230 - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
1231 - dependencies:
1232 - color-convert "^2.0.1"
1233 -
1234 -ansi-styles@^5.0.0:
1235 - version "5.2.0"
1236 - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
1237 - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
1238 -
1239 -anymatch@^3.0.3:
1240 - version "3.1.2"
1241 - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
1242 - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
1243 - dependencies:
1244 - normalize-path "^3.0.0"
1245 - picomatch "^2.0.4"
1246 -
1247 -arg@^4.1.0:
1248 - version "4.1.3"
1249 - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
1250 - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
1251 -
1252 -argparse@^1.0.7:
1253 - version "1.0.10"
1254 - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
1255 - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
1256 - dependencies:
1257 - sprintf-js "~1.0.2"
1258 -
1259 -argparse@^2.0.1:
1260 - version "2.0.1"
1261 - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
1262 - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
1263 -
1264 -aria-query@^5.0.0:
1265 - version "5.0.2"
1266 - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1"
1267 - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==
1268 -
1269 -array-union@^2.1.0:
1270 - version "2.1.0"
1271 - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
1272 - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
1273 -
1274 -arraybuffer.slice@~0.0.7:
1275 - version "0.0.7"
1276 - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
1277 - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
1278 -
1279 -ast-types@0.12.4:
1280 - version "0.12.4"
1281 - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.4.tgz#71ce6383800f24efc9a1a3308f3a6e420a0974d1"
1282 - integrity sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==
1283 -
1284 -asynckit@^0.4.0:
1285 - version "0.4.0"
1286 - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
1287 - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
1288 -
1289 -babel-jest@^29.0.3:
1290 - version "29.0.3"
1291 - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.0.3.tgz#64e156a47a77588db6a669a88dedff27ed6e260f"
1292 - integrity sha512-ApPyHSOhS/sVzwUOQIWJmdvDhBsMG01HX9z7ogtkp1TToHGGUWFlnXJUIzCgKPSfiYLn3ibipCYzsKSURHEwLg==
1293 - dependencies:
1294 - "@jest/transform" "^29.0.3"
1295 - "@types/babel__core" "^7.1.14"
1296 - babel-plugin-istanbul "^6.1.1"
1297 - babel-preset-jest "^29.0.2"
1298 - chalk "^4.0.0"
1299 - graceful-fs "^4.2.9"
1300 - slash "^3.0.0"
1301 -
1302 -babel-plugin-dynamic-import-node@^2.3.3:
1303 - version "2.3.3"
1304 - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
1305 - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
1306 - dependencies:
1307 - object.assign "^4.1.0"
1308 -
1309 -babel-plugin-istanbul@^6.1.1:
1310 - version "6.1.1"
1311 - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
1312 - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
1313 - dependencies:
1314 - "@babel/helper-plugin-utils" "^7.0.0"
1315 - "@istanbuljs/load-nyc-config" "^1.0.0"
1316 - "@istanbuljs/schema" "^0.1.2"
1317 - istanbul-lib-instrument "^5.0.4"
1318 - test-exclude "^6.0.0"
1319 -
1320 -babel-plugin-jest-hoist@^29.0.2:
1321 - version "29.0.2"
1322 - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz#ae61483a829a021b146c016c6ad39b8bcc37c2c8"
1323 - integrity sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg==
1324 - dependencies:
1325 - "@babel/template" "^7.3.3"
1326 - "@babel/types" "^7.3.3"
1327 - "@types/babel__core" "^7.1.14"
1328 - "@types/babel__traverse" "^7.0.6"
1329 -
1330 -babel-preset-current-node-syntax@^1.0.0:
1331 - version "1.0.1"
1332 - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
1333 - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
1334 - dependencies:
1335 - "@babel/plugin-syntax-async-generators" "^7.8.4"
1336 - "@babel/plugin-syntax-bigint" "^7.8.3"
1337 - "@babel/plugin-syntax-class-properties" "^7.8.3"
1338 - "@babel/plugin-syntax-import-meta" "^7.8.3"
1339 - "@babel/plugin-syntax-json-strings" "^7.8.3"
1340 - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
1341 - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
1342 - "@babel/plugin-syntax-numeric-separator" "^7.8.3"
1343 - "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
1344 - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
1345 - "@babel/plugin-syntax-optional-chaining" "^7.8.3"
1346 - "@babel/plugin-syntax-top-level-await" "^7.8.3"
1347 -
1348 -babel-preset-jest@^29.0.2:
1349 - version "29.0.2"
1350 - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz#e14a7124e22b161551818d89e5bdcfb3b2b0eac7"
1351 - integrity sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA==
1352 - dependencies:
1353 - babel-plugin-jest-hoist "^29.0.2"
1354 - babel-preset-current-node-syntax "^1.0.0"
1355 -
1356 -backo2@1.0.2:
1357 - version "1.0.2"
1358 - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
1359 - integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==
1360 -
1361 -balanced-match@^1.0.0:
1362 - version "1.0.2"
1363 - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
1364 - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
1365 -
1366 -base64-arraybuffer@0.1.4:
1367 - version "0.1.4"
1368 - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812"
1369 - integrity sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==
1370 -
1371 -base64id@2.0.0:
1372 - version "2.0.0"
1373 - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6"
1374 - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==
1375 -
1376 -blob@0.0.5:
1377 - version "0.0.5"
1378 - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683"
1379 - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==
1380 -
1381 -brace-expansion@^1.1.7:
1382 - version "1.1.11"
1383 - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
1384 - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
1385 - dependencies:
1386 - balanced-match "^1.0.0"
1387 - concat-map "0.0.1"
1388 -
1389 -braces@^3.0.2:
1390 - version "3.0.2"
1391 - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
1392 - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
1393 - dependencies:
1394 - fill-range "^7.0.1"
1395 -
1396 -browser-process-hrtime@^1.0.0:
1397 - version "1.0.0"
1398 - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
1399 - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
1400 -
1401 -browserslist@^4.21.3:
1402 - version "4.21.4"
1403 - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987"
1404 - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
1405 - dependencies:
1406 - caniuse-lite "^1.0.30001400"
1407 - electron-to-chromium "^1.4.251"
1408 - node-releases "^2.0.6"
1409 - update-browserslist-db "^1.0.9"
1410 -
1411 -bs-logger@0.x:
1412 - version "0.2.6"
1413 - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
1414 - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
1415 - dependencies:
1416 - fast-json-stable-stringify "2.x"
1417 -
1418 -bser@2.1.1:
1419 - version "2.1.1"
1420 - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
1421 - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
1422 - dependencies:
1423 - node-int64 "^0.4.0"
1424 -
1425 -buffer-from@^1.0.0:
1426 - version "1.1.2"
1427 - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
1428 - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
1429 -
1430 -call-bind@^1.0.2:
1431 - version "1.0.2"
1432 - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
1433 - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
1434 - dependencies:
1435 - function-bind "^1.1.1"
1436 - get-intrinsic "^1.0.2"
1437 -
1438 -callsites@^3.0.0:
1439 - version "3.1.0"
1440 - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
1441 - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
1442 -
1443 -camelcase@^5.0.0, camelcase@^5.3.1:
1444 - version "5.3.1"
1445 - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
1446 - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
1447 -
1448 -camelcase@^6.2.0:
1449 - version "6.3.0"
1450 - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
1451 - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
1452 -
1453 -caniuse-lite@^1.0.30001400:
1454 - version "1.0.30001410"
1455 - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz#b5a86366fbbf439d75dd3db1d21137a73e829f44"
1456 - integrity sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==
1457 -
1458 -chalk@^2.0.0:
1459 - version "2.4.2"
1460 - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
1461 - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
1462 - dependencies:
1463 - ansi-styles "^3.2.1"
1464 - escape-string-regexp "^1.0.5"
1465 - supports-color "^5.3.0"
1466 -
1467 -chalk@^3.0.0:
1468 - version "3.0.0"
1469 - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
1470 - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
1471 - dependencies:
1472 - ansi-styles "^4.1.0"
1473 - supports-color "^7.1.0"
1474 -
1475 -chalk@^4.0.0, chalk@^4.1.0:
1476 - version "4.1.2"
1477 - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
1478 - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
1479 - dependencies:
1480 - ansi-styles "^4.1.0"
1481 - supports-color "^7.1.0"
1482 -
1483 -char-regex@^1.0.2:
1484 - version "1.0.2"
1485 - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
1486 - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
1487 -
1488 -ci-info@^3.2.0:
1489 - version "3.4.0"
1490 - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251"
1491 - integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==
1492 -
1493 -cjs-module-lexer@^1.0.0:
1494 - version "1.2.2"
1495 - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
1496 - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
1497 -
1498 -cliui@^5.0.0:
1499 - version "5.0.0"
1500 - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
1501 - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
1502 - dependencies:
1503 - string-width "^3.1.0"
1504 - strip-ansi "^5.2.0"
1505 - wrap-ansi "^5.1.0"
1506 -
1507 -cliui@^7.0.2:
1508 - version "7.0.4"
1509 - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
1510 - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
1511 - dependencies:
1512 - string-width "^4.2.0"
1513 - strip-ansi "^6.0.0"
1514 - wrap-ansi "^7.0.0"
1515 -
1516 -co@^4.6.0:
1517 - version "4.6.0"
1518 - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
1519 - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
1520 -
1521 -collect-v8-coverage@^1.0.0:
1522 - version "1.0.1"
1523 - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
1524 - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
1525 -
1526 -color-convert@^1.9.0:
1527 - version "1.9.3"
1528 - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
1529 - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
1530 - dependencies:
1531 - color-name "1.1.3"
1532 -
1533 -color-convert@^2.0.1:
1534 - version "2.0.1"
1535 - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
1536 - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
1537 - dependencies:
1538 - color-name "~1.1.4"
1539 -
1540 -color-name@1.1.3:
1541 - version "1.1.3"
1542 - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
1543 - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
1544 -
1545 -color-name@~1.1.4:
1546 - version "1.1.4"
1547 - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
1548 - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
1549 -
1550 -combined-stream@^1.0.8:
1551 - version "1.0.8"
1552 - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
1553 - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
1554 - dependencies:
1555 - delayed-stream "~1.0.0"
1556 -
1557 -component-bind@1.0.0:
1558 - version "1.0.0"
1559 - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
1560 - integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==
1561 -
1562 -component-emitter@1.2.1:
1563 - version "1.2.1"
1564 - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
1565 - integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==
1566 -
1567 -component-emitter@~1.3.0:
1568 - version "1.3.0"
1569 - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
1570 - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
1571 -
1572 -component-inherit@0.0.3:
1573 - version "0.0.3"
1574 - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
1575 - integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==
1576 -
1577 -concat-map@0.0.1:
1578 - version "0.0.1"
1579 - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
1580 - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
1581 -
1582 -concurrently@^7.4.0:
1583 - version "7.4.0"
1584 - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-7.4.0.tgz#bb0e344964bc172673577c420db21e963f2f7368"
1585 - integrity sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==
1586 - dependencies:
1587 - chalk "^4.1.0"
1588 - date-fns "^2.29.1"
1589 - lodash "^4.17.21"
1590 - rxjs "^7.0.0"
1591 - shell-quote "^1.7.3"
1592 - spawn-command "^0.0.2-1"
1593 - supports-color "^8.1.0"
1594 - tree-kill "^1.2.2"
1595 - yargs "^17.3.1"
1596 -
1597 -convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
1598 - version "1.8.0"
1599 - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
1600 - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
1601 - dependencies:
1602 - safe-buffer "~5.1.1"
1603 -
1604 -cookie@~0.4.1:
1605 - version "0.4.2"
1606 - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
1607 - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
1608 -
1609 -core-util-is@~1.0.0:
1610 - version "1.0.3"
1611 - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
1612 - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
1613 -
1614 -create-require@^1.1.0:
1615 - version "1.1.1"
1616 - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
1617 - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
1618 -
1619 -cross-spawn@^7.0.2, cross-spawn@^7.0.3:
1620 - version "7.0.3"
1621 - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
1622 - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
1623 - dependencies:
1624 - path-key "^3.1.0"
1625 - shebang-command "^2.0.0"
1626 - which "^2.0.1"
1627 -
1628 -cssom@^0.5.0:
1629 - version "0.5.0"
1630 - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36"
1631 - integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==
1632 -
1633 -cssom@~0.3.6:
1634 - version "0.3.8"
1635 - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
1636 - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
1637 -
1638 -cssstyle@^2.3.0:
1639 - version "2.3.0"
1640 - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
1641 - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
1642 - dependencies:
1643 - cssom "~0.3.6"
1644 -
1645 -csstype@^3.0.2:
1646 - version "3.1.1"
1647 - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
1648 - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
1649 -
1650 -data-urls@^3.0.2:
1651 - version "3.0.2"
1652 - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-3.0.2.tgz#9cf24a477ae22bcef5cd5f6f0bfbc1d2d3be9143"
1653 - integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==
1654 - dependencies:
1655 - abab "^2.0.6"
1656 - whatwg-mimetype "^3.0.0"
1657 - whatwg-url "^11.0.0"
1658 -
1659 -date-fns@^2.29.1:
1660 - version "2.29.3"
1661 - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
1662 - integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==
1663 -
1664 -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
1665 - version "4.3.4"
1666 - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
1667 - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
1668 - dependencies:
1669 - ms "2.1.2"
1670 -
1671 -debug@~3.1.0:
1672 - version "3.1.0"
1673 - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
1674 - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
1675 - dependencies:
1676 - ms "2.0.0"
1677 -
1678 -debug@~4.1.0:
1679 - version "4.1.1"
1680 - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
1681 - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
1682 - dependencies:
1683 - ms "^2.1.1"
1684 -
1685 -decamelize@^1.2.0:
1686 - version "1.2.0"
1687 - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
1688 - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
1689 -
1690 -decimal.js@^10.3.1:
1691 - version "10.4.1"
1692 - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.1.tgz#be75eeac4a2281aace80c1a8753587c27ef053e7"
1693 - integrity sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==
1694 -
1695 -dedent@^0.7.0:
1696 - version "0.7.0"
1697 - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
1698 - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
1699 -
1700 -deep-is@^0.1.3, deep-is@~0.1.3:
1701 - version "0.1.4"
1702 - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
1703 - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
1704 -
1705 -deepmerge@^4.2.2:
1706 - version "4.2.2"
1707 - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
1708 - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
1709 -
1710 -define-properties@^1.1.4:
1711 - version "1.1.4"
1712 - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
1713 - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
1714 - dependencies:
1715 - has-property-descriptors "^1.0.0"
1716 - object-keys "^1.1.1"
1717 -
1718 -delayed-stream@~1.0.0:
1719 - version "1.0.0"
1720 - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
1721 - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
1722 -
1723 -detect-newline@^3.0.0:
1724 - version "3.1.0"
1725 - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
1726 - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
1727 -
1728 -diff-sequences@^29.0.0:
1729 - version "29.0.0"
1730 - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f"
1731 - integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==
1732 -
1733 -diff@^4.0.1:
1734 - version "4.0.2"
1735 - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
1736 - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
1737 -
1738 -dir-glob@^3.0.1:
1739 - version "3.0.1"
1740 - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
1741 - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
1742 - dependencies:
1743 - path-type "^4.0.0"
1744 -
1745 -doctrine@^3.0.0:
1746 - version "3.0.0"
1747 - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
1748 - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
1749 - dependencies:
1750 - esutils "^2.0.2"
1751 -
1752 -dom-accessibility-api@^0.5.9:
1753 - version "0.5.14"
1754 - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56"
1755 - integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==
1756 -
1757 -domexception@^4.0.0:
1758 - version "4.0.0"
1759 - resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673"
1760 - integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
1761 - dependencies:
1762 - webidl-conversions "^7.0.0"
1763 -
1764 -electron-to-chromium@^1.4.251:
1765 - version "1.4.260"
1766 - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.260.tgz#9aa3348d037686b47ccc5d3b48fe417b1f20017a"
1767 - integrity sha512-1GxPM2Bdz1AjuNjho9/TqJfxM7KZ7R8s4vA5cbbIoVacQXfvZlV+d7Y1lu4BhGzEBfjjhakr3NXKqN0PxPXIsg==
1768 -
1769 -emittery@^0.10.2:
1770 - version "0.10.2"
1771 - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933"
1772 - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==
1773 -
1774 -emoji-regex@^7.0.1:
1775 - version "7.0.3"
1776 - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
1777 - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
1778 -
1779 -emoji-regex@^8.0.0:
1780 - version "8.0.0"
1781 - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
1782 - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
1783 -
1784 -engine.io-client@~3.5.0:
1785 - version "3.5.3"
1786 - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.3.tgz#3254f61fdbd53503dc9a6f9d46a52528871ca0d7"
1787 - integrity sha512-qsgyc/CEhJ6cgMUwxRRtOndGVhIu5hpL5tR4umSpmX/MvkFoIxUTM7oFMDQumHNzlNLwSVy6qhstFPoWTf7dOw==
1788 - dependencies:
1789 - component-emitter "~1.3.0"
1790 - component-inherit "0.0.3"
1791 - debug "~3.1.0"
1792 - engine.io-parser "~2.2.0"
1793 - has-cors "1.1.0"
1794 - indexof "0.0.1"
1795 - parseqs "0.0.6"
1796 - parseuri "0.0.6"
1797 - ws "~7.4.2"
1798 - xmlhttprequest-ssl "~1.6.2"
1799 - yeast "0.1.2"
1800 -
1801 -engine.io-parser@~2.2.0:
1802 - version "2.2.1"
1803 - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7"
1804 - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==
1805 - dependencies:
1806 - after "0.8.2"
1807 - arraybuffer.slice "~0.0.7"
1808 - base64-arraybuffer "0.1.4"
1809 - blob "0.0.5"
1810 - has-binary2 "~1.0.2"
1811 -
1812 -engine.io@~3.6.0:
1813 - version "3.6.0"
1814 - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.6.0.tgz#8760e8cd5b8454bd0f422b6466426ac6f598f296"
1815 - integrity sha512-Kc8fo5bbg8F4a2f3HPHTEpGyq/IRIQpyeHu3H1ThR14XDD7VrLcsGBo16HUpahgp8YkHJDaU5gNxJZbuGcuueg==
1816 - dependencies:
1817 - accepts "~1.3.4"
1818 - base64id "2.0.0"
1819 - cookie "~0.4.1"
1820 - debug "~4.1.0"
1821 - engine.io-parser "~2.2.0"
1822 - ws "~7.4.2"
1823 -
1824 -entities@^4.4.0:
1825 - version "4.4.0"
1826 - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
1827 - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
1828 -
1829 -error-ex@^1.3.1:
1830 - version "1.3.2"
1831 - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
1832 - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
1833 - dependencies:
1834 - is-arrayish "^0.2.1"
1835 -
1836 -error-stack-parser@^1.3.3:
1837 - version "1.3.6"
1838 - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-1.3.6.tgz#e0e73b93e417138d1cd7c0b746b1a4a14854c292"
1839 - integrity sha512-xhuSYd8wLgOXwNgjcPeXMPL/IiiA1Huck+OPvClpJViVNNlJVtM41o+1emp7bPvlCJwCatFX2DWc05/DgfbWzA==
1840 - dependencies:
1841 - stackframe "^0.3.1"
1842 -
1843 -escalade@^3.1.1:
1844 - version "3.1.1"
1845 - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
1846 - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
1847 -
1848 -escape-string-regexp@^1.0.5:
1849 - version "1.0.5"
1850 - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
1851 - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
1852 -
1853 -escape-string-regexp@^2.0.0:
1854 - version "2.0.0"
1855 - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
1856 - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
1857 -
1858 -escape-string-regexp@^4.0.0:
1859 - version "4.0.0"
1860 - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
1861 - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
1862 -
1863 -escodegen@^2.0.0:
1864 - version "2.0.0"
1865 - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
1866 - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
1867 - dependencies:
1868 - esprima "^4.0.1"
1869 - estraverse "^5.2.0"
1870 - esutils "^2.0.2"
1871 - optionator "^0.8.1"
1872 - optionalDependencies:
1873 - source-map "~0.6.1"
1874 -
1875 -eshost@^7.7.0:
1876 - version "7.7.0"
1877 - resolved "https://registry.yarnpkg.com/eshost/-/eshost-7.7.0.tgz#0a5dde3f70a443316c3879fbba3ce95e8a951906"
1878 - integrity sha512-T0+BI/T1xbI8iJ1LSqCbvWrJyzhCxIDUAUalY4+kMvOnqHOZwMHbNvTVQVrVR3fWzqtugnWrIFo1LCl4C9MB3Q==
1879 - dependencies:
1880 - error-stack-parser "^1.3.3"
1881 - is-symlink "^0.1.1"
1882 - recast "^0.17.5"
1883 - selenium-webdriver "^4.0.0-alpha.1"
1884 - server-destroy "^1.0.1"
1885 - socket.io "^2.3.0"
1886 - unique-temp-dir "^1.0.0"
1887 -
1888 -eslint-scope@^7.1.1:
1889 - version "7.1.1"
1890 - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
1891 - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
1892 - dependencies:
1893 - esrecurse "^4.3.0"
1894 - estraverse "^5.2.0"
1895 -
1896 -eslint-utils@^3.0.0:
1897 - version "3.0.0"
1898 - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
1899 - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
1900 - dependencies:
1901 - eslint-visitor-keys "^2.0.0"
1902 -
1903 -eslint-visitor-keys@^2.0.0:
1904 - version "2.1.0"
1905 - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
1906 - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
1907 -
1908 -eslint-visitor-keys@^3.3.0:
1909 - version "3.3.0"
1910 - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
1911 - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
1912 -
1913 -eslint@^8.25.0:
1914 - version "8.25.0"
1915 - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.25.0.tgz#00eb962f50962165d0c4ee3327708315eaa8058b"
1916 - integrity sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==
1917 - dependencies:
1918 - "@eslint/eslintrc" "^1.3.3"
1919 - "@humanwhocodes/config-array" "^0.10.5"
1920 - "@humanwhocodes/module-importer" "^1.0.1"
1921 - ajv "^6.10.0"
1922 - chalk "^4.0.0"
1923 - cross-spawn "^7.0.2"
1924 - debug "^4.3.2"
1925 - doctrine "^3.0.0"
1926 - escape-string-regexp "^4.0.0"
1927 - eslint-scope "^7.1.1"
1928 - eslint-utils "^3.0.0"
1929 - eslint-visitor-keys "^3.3.0"
1930 - espree "^9.4.0"
1931 - esquery "^1.4.0"
1932 - esutils "^2.0.2"
1933 - fast-deep-equal "^3.1.3"
1934 - file-entry-cache "^6.0.1"
1935 - find-up "^5.0.0"
1936 - glob-parent "^6.0.1"
1937 - globals "^13.15.0"
1938 - globby "^11.1.0"
1939 - grapheme-splitter "^1.0.4"
1940 - ignore "^5.2.0"
1941 - import-fresh "^3.0.0"
1942 - imurmurhash "^0.1.4"
1943 - is-glob "^4.0.0"
1944 - js-sdsl "^4.1.4"
1945 - js-yaml "^4.1.0"
1946 - json-stable-stringify-without-jsonify "^1.0.1"
1947 - levn "^0.4.1"
1948 - lodash.merge "^4.6.2"
1949 - minimatch "^3.1.2"
1950 - natural-compare "^1.4.0"
1951 - optionator "^0.9.1"
1952 - regexpp "^3.2.0"
1953 - strip-ansi "^6.0.1"
1954 - strip-json-comments "^3.1.0"
1955 - text-table "^0.2.0"
1956 -
1957 -espree@^9.4.0:
1958 - version "9.4.0"
1959 - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a"
1960 - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==
1961 - dependencies:
1962 - acorn "^8.8.0"
1963 - acorn-jsx "^5.3.2"
1964 - eslint-visitor-keys "^3.3.0"
1965 -
1966 -esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
1967 - version "4.0.1"
1968 - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
1969 - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
1970 -
1971 -esquery@^1.4.0:
1972 - version "1.4.0"
1973 - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
1974 - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
1975 - dependencies:
1976 - estraverse "^5.1.0"
1977 -
1978 -esrecurse@^4.3.0:
1979 - version "4.3.0"
1980 - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
1981 - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
1982 - dependencies:
1983 - estraverse "^5.2.0"
1984 -
1985 -estraverse@^5.1.0, estraverse@^5.2.0:
1986 - version "5.3.0"
1987 - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
1988 - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
1989 -
1990 -esutils@^2.0.2:
1991 - version "2.0.3"
1992 - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
1993 - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
1994 -
1995 -execa@^5.0.0:
1996 - version "5.1.1"
1997 - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
1998 - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
1999 - dependencies:
2000 - cross-spawn "^7.0.3"
2001 - get-stream "^6.0.0"
2002 - human-signals "^2.1.0"
2003 - is-stream "^2.0.0"
2004 - merge-stream "^2.0.0"
2005 - npm-run-path "^4.0.1"
2006 - onetime "^5.1.2"
2007 - signal-exit "^3.0.3"
2008 - strip-final-newline "^2.0.0"
2009 -
2010 -exit@^0.1.2:
2011 - version "0.1.2"
2012 - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
2013 - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
2014 -
2015 -expect@^29.0.0, expect@^29.0.3:
2016 - version "29.0.3"
2017 - resolved "https://registry.yarnpkg.com/expect/-/expect-29.0.3.tgz#6be65ddb945202f143c4e07c083f4f39f3bd326f"
2018 - integrity sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q==
2019 - dependencies:
2020 - "@jest/expect-utils" "^29.0.3"
2021 - jest-get-type "^29.0.0"
2022 - jest-matcher-utils "^29.0.3"
2023 - jest-message-util "^29.0.3"
2024 - jest-util "^29.0.3"
2025 -
2026 -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
2027 - version "3.1.3"
2028 - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
2029 - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
2030 -
2031 -fast-glob@^3.2.9:
2032 - version "3.2.12"
2033 - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
2034 - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
2035 - dependencies:
2036 - "@nodelib/fs.stat" "^2.0.2"
2037 - "@nodelib/fs.walk" "^1.2.3"
2038 - glob-parent "^5.1.2"
2039 - merge2 "^1.3.0"
2040 - micromatch "^4.0.4"
2041 -
2042 -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
2043 - version "2.1.0"
2044 - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
2045 - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
2046 -
2047 -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
2048 - version "2.0.6"
2049 - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
2050 - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
2051 -
2052 -fastq@^1.6.0:
2053 - version "1.13.0"
2054 - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
2055 - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
2056 - dependencies:
2057 - reusify "^1.0.4"
2058 -
2059 -fb-watchman@^2.0.0:
2060 - version "2.0.2"
2061 - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
2062 - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
2063 - dependencies:
2064 - bser "2.1.1"
2065 -
2066 -file-entry-cache@^6.0.1:
2067 - version "6.0.1"
2068 - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
2069 - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
2070 - dependencies:
2071 - flat-cache "^3.0.4"
2072 -
2073 -fill-range@^7.0.1:
2074 - version "7.0.1"
2075 - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
2076 - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
2077 - dependencies:
2078 - to-regex-range "^5.0.1"
2079 -
2080 -find-up@^3.0.0:
2081 - version "3.0.0"
2082 - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
2083 - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
2084 - dependencies:
2085 - locate-path "^3.0.0"
2086 -
2087 -find-up@^4.0.0, find-up@^4.1.0:
2088 - version "4.1.0"
2089 - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
2090 - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
2091 - dependencies:
2092 - locate-path "^5.0.0"
2093 - path-exists "^4.0.0"
2094 -
2095 -find-up@^5.0.0:
2096 - version "5.0.0"
2097 - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
2098 - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
2099 - dependencies:
2100 - locate-path "^6.0.0"
2101 - path-exists "^4.0.0"
2102 -
2103 -flat-cache@^3.0.4:
2104 - version "3.0.4"
2105 - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
2106 - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
2107 - dependencies:
2108 - flatted "^3.1.0"
2109 - rimraf "^3.0.2"
2110 -
2111 -flatted@^3.1.0:
2112 - version "3.2.7"
2113 - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
2114 - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
2115 -
2116 -form-data@^4.0.0:
2117 - version "4.0.0"
2118 - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
2119 - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
2120 - dependencies:
2121 - asynckit "^0.4.0"
2122 - combined-stream "^1.0.8"
2123 - mime-types "^2.1.12"
2124 -
2125 -fs.realpath@^1.0.0:
2126 - version "1.0.0"
2127 - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
2128 - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
2129 -
2130 -fsevents@^2.3.2:
2131 - version "2.3.2"
2132 - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
2133 - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
2134 -
2135 -function-bind@^1.1.1:
2136 - version "1.1.1"
2137 - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
2138 - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
2139 -
2140 -gensync@^1.0.0-beta.2:
2141 - version "1.0.0-beta.2"
2142 - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
2143 - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
2144 -
2145 -get-caller-file@^2.0.1, get-caller-file@^2.0.5:
2146 - version "2.0.5"
2147 - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
2148 - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
2149 -
2150 -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
2151 - version "1.1.3"
2152 - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385"
2153 - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
2154 - dependencies:
2155 - function-bind "^1.1.1"
2156 - has "^1.0.3"
2157 - has-symbols "^1.0.3"
2158 -
2159 -get-package-type@^0.1.0:
2160 - version "0.1.0"
2161 - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
2162 - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
2163 -
2164 -get-stream@^6.0.0:
2165 - version "6.0.1"
2166 - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
2167 - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
2168 -
2169 -glob-parent@^5.1.2:
2170 - version "5.1.2"
2171 - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
2172 - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
2173 - dependencies:
2174 - is-glob "^4.0.1"
2175 -
2176 -glob-parent@^6.0.1:
2177 - version "6.0.2"
2178 - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
2179 - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
2180 - dependencies:
2181 - is-glob "^4.0.3"
2182 -
2183 -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
2184 - version "7.2.3"
2185 - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
2186 - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
2187 - dependencies:
2188 - fs.realpath "^1.0.0"
2189 - inflight "^1.0.4"
2190 - inherits "2"
2191 - minimatch "^3.1.1"
2192 - once "^1.3.0"
2193 - path-is-absolute "^1.0.0"
2194 -
2195 -globals@^11.1.0:
2196 - version "11.12.0"
2197 - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
2198 - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
2199 -
2200 -globals@^13.15.0:
2201 - version "13.17.0"
2202 - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
2203 - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
2204 - dependencies:
2205 - type-fest "^0.20.2"
2206 -
2207 -globby@^11.1.0:
2208 - version "11.1.0"
2209 - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
2210 - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
2211 - dependencies:
2212 - array-union "^2.1.0"
2213 - dir-glob "^3.0.1"
2214 - fast-glob "^3.2.9"
2215 - ignore "^5.2.0"
2216 - merge2 "^1.4.1"
2217 - slash "^3.0.0"
2218 -
2219 -graceful-fs@^4.1.9, graceful-fs@^4.2.9:
2220 - version "4.2.10"
2221 - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
2222 - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
2223 -
2224 -grapheme-splitter@^1.0.4:
2225 - version "1.0.4"
2226 - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
2227 - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
2228 -
2229 -has-binary2@~1.0.2:
2230 - version "1.0.3"
2231 - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d"
2232 - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==
2233 - dependencies:
2234 - isarray "2.0.1"
2235 -
2236 -has-cors@1.1.0:
2237 - version "1.1.0"
2238 - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
2239 - integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==
2240 -
2241 -has-flag@^3.0.0:
2242 - version "3.0.0"
2243 - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
2244 - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
2245 -
2246 -has-flag@^4.0.0:
2247 - version "4.0.0"
2248 - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
2249 - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
2250 -
2251 -has-property-descriptors@^1.0.0:
2252 - version "1.0.0"
2253 - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
2254 - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
2255 - dependencies:
2256 - get-intrinsic "^1.1.1"
2257 -
2258 -has-symbols@^1.0.3:
2259 - version "1.0.3"
2260 - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
2261 - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
2262 -
2263 -has@^1.0.3:
2264 - version "1.0.3"
2265 - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
2266 - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
2267 - dependencies:
2268 - function-bind "^1.1.1"
2269 -
2270 -hermes-eslint@^0.9.0:
2271 - version "0.9.0"
2272 - resolved "https://registry.yarnpkg.com/hermes-eslint/-/hermes-eslint-0.9.0.tgz#f1423abe3dfd959257430d61a9bccd4700b59e09"
2273 - integrity sha512-rlkK51UpGwo0ZWg8hu8DVICth7RfGSvaEJzFflos8bDOYm/d842/J3IXi0lB9R9waOp4VGGSc8VDmh+a9p2Q2w==
2274 - dependencies:
2275 - esrecurse "^4.3.0"
2276 - hermes-estree "0.9.0"
2277 - hermes-parser "0.9.0"
2278 -
2279 -hermes-estree@0.9.0:
2280 - version "0.9.0"
2281 - resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.9.0.tgz#026e0abe6db1dcf50a81a79014b779a83db3b814"
2282 - integrity sha512-5DZ7Y0CbHVk8zPqgRCvqp8iw+P05svnQDI1aJFjdqCfXJ/1CZ+8aYpGlhJ29zCG5SE5duGTzSxogAYYI4QqXqw==
2283 -
2284 -hermes-parser@0.9.0:
2285 - version "0.9.0"
2286 - resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.9.0.tgz#ede3044d50479c61843cef5bbdcea83933d4e4ec"
2287 - integrity sha512-IcvJIlAn+9tpHkP+HTsxWKrIdQPp0gvGrrQmxlL4XnNS+Oh6R/Fpxbcoflm2kY3zgQjEvxZxLiK/2+k3/5wsrw==
2288 - dependencies:
2289 - hermes-estree "0.9.0"
2290 -
2291 -html-encoding-sniffer@^3.0.0:
2292 - version "3.0.0"
2293 - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9"
2294 - integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
2295 - dependencies:
2296 - whatwg-encoding "^2.0.0"
2297 -
2298 -html-escaper@^2.0.0:
2299 - version "2.0.2"
2300 - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
2301 - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
2302 -
2303 -http-proxy-agent@^5.0.0:
2304 - version "5.0.0"
2305 - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
2306 - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
2307 - dependencies:
2308 - "@tootallnate/once" "2"
2309 - agent-base "6"
2310 - debug "4"
2311 -
2312 -https-proxy-agent@^5.0.1:
2313 - version "5.0.1"
2314 - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
2315 - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
2316 - dependencies:
2317 - agent-base "6"
2318 - debug "4"
2319 -
2320 -human-signals@^2.1.0:
2321 - version "2.1.0"
2322 - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
2323 - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
2324 -
2325 -iconv-lite@0.6.3:
2326 - version "0.6.3"
2327 - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
2328 - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
2329 - dependencies:
2330 - safer-buffer ">= 2.1.2 < 3.0.0"
2331 -
2332 -ignore@^5.2.0:
2333 - version "5.2.0"
2334 - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
2335 - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
2336 -
2337 -immediate@~3.0.5:
2338 - version "3.0.6"
2339 - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
2340 - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
2341 -
2342 -import-fresh@^3.0.0, import-fresh@^3.2.1:
2343 - version "3.3.0"
2344 - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
2345 - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
2346 - dependencies:
2347 - parent-module "^1.0.0"
2348 - resolve-from "^4.0.0"
2349 -
2350 -import-local@^3.0.2:
2351 - version "3.1.0"
2352 - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
2353 - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
2354 - dependencies:
2355 - pkg-dir "^4.2.0"
2356 - resolve-cwd "^3.0.0"
2357 -
2358 -imurmurhash@^0.1.4:
2359 - version "0.1.4"
2360 - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
2361 - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
2362 -
2363 -indexof@0.0.1:
2364 - version "0.0.1"
2365 - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
2366 - integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==
2367 -
2368 -inflight@^1.0.4:
2369 - version "1.0.6"
2370 - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
2371 - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
2372 - dependencies:
2373 - once "^1.3.0"
2374 - wrappy "1"
2375 -
2376 -inherits@2, inherits@~2.0.3:
2377 - version "2.0.4"
2378 - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
2379 - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
2380 -
2381 -invariant@^2.2.4:
2382 - version "2.2.4"
2383 - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
2384 - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
2385 - dependencies:
2386 - loose-envify "^1.0.0"
2387 -
2388 -is-arrayish@^0.2.1:
2389 - version "0.2.1"
2390 - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
2391 - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
2392 -
2393 -is-core-module@^2.9.0:
2394 - version "2.10.0"
2395 - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
2396 - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
2397 - dependencies:
2398 - has "^1.0.3"
2399 -
2400 -is-extglob@^2.1.1:
2401 - version "2.1.1"
2402 - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
2403 - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
2404 -
2405 -is-fullwidth-code-point@^2.0.0:
2406 - version "2.0.0"
2407 - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
2408 - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
2409 -
2410 -is-fullwidth-code-point@^3.0.0:
2411 - version "3.0.0"
2412 - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
2413 - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
2414 -
2415 -is-generator-fn@^2.0.0:
2416 - version "2.1.0"
2417 - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
2418 - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
2419 -
2420 -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
2421 - version "4.0.3"
2422 - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
2423 - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
2424 - dependencies:
2425 - is-extglob "^2.1.1"
2426 -
2427 -is-number@^7.0.0:
2428 - version "7.0.0"
2429 - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
2430 - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
2431 -
2432 -is-potential-custom-element-name@^1.0.1:
2433 - version "1.0.1"
2434 - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
2435 - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
2436 -
2437 -is-stream@^2.0.0:
2438 - version "2.0.1"
2439 - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
2440 - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
2441 -
2442 -is-symlink@^0.1.1:
2443 - version "0.1.1"
2444 - resolved "https://registry.yarnpkg.com/is-symlink/-/is-symlink-0.1.1.tgz#cfcac0712aec8c0ebfd7d9b061b14c6629782f56"
2445 - integrity sha512-HAC7xFRN4t4mVutcQfWzwAFNlD8tQFUSVwOeBLbTtgUf+Lb74AfhMT54ZcsYZ1vB5T08BLJH2z8y8im5lLcCMg==
2446 -
2447 -isarray@2.0.1:
2448 - version "2.0.1"
2449 - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
2450 - integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==
2451 -
2452 -isarray@~1.0.0:
2453 - version "1.0.0"
2454 - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
2455 - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
2456 -
2457 -isexe@^2.0.0:
2458 - version "2.0.0"
2459 - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
2460 - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
2461 -
2462 -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
2463 - version "3.2.0"
2464 - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
2465 - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
2466 -
2467 -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
2468 - version "5.2.0"
2469 - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
2470 - integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
2471 - dependencies:
2472 - "@babel/core" "^7.12.3"
2473 - "@babel/parser" "^7.14.7"
2474 - "@istanbuljs/schema" "^0.1.2"
2475 - istanbul-lib-coverage "^3.2.0"
2476 - semver "^6.3.0"
2477 -
2478 -istanbul-lib-report@^3.0.0:
2479 - version "3.0.0"
2480 - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
2481 - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
2482 - dependencies:
2483 - istanbul-lib-coverage "^3.0.0"
2484 - make-dir "^3.0.0"
2485 - supports-color "^7.1.0"
2486 -
2487 -istanbul-lib-source-maps@^4.0.0:
2488 - version "4.0.1"
2489 - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
2490 - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
2491 - dependencies:
2492 - debug "^4.1.1"
2493 - istanbul-lib-coverage "^3.0.0"
2494 - source-map "^0.6.1"
2495 -
2496 -istanbul-reports@^3.1.3:
2497 - version "3.1.5"
2498 - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae"
2499 - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==
2500 - dependencies:
2501 - html-escaper "^2.0.0"
2502 - istanbul-lib-report "^3.0.0"
2503 -
2504 -jest-changed-files@^29.0.0:
2505 - version "29.0.0"
2506 - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.0.0.tgz#aa238eae42d9372a413dd9a8dadc91ca1806dce0"
2507 - integrity sha512-28/iDMDrUpGoCitTURuDqUzWQoWmOmOKOFST1mi2lwh62X4BFf6khgH3uSuo1e49X/UDjuApAj3w0wLOex4VPQ==
2508 - dependencies:
2509 - execa "^5.0.0"
2510 - p-limit "^3.1.0"
2511 -
2512 -jest-circus@^29.0.3:
2513 - version "29.0.3"
2514 - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.0.3.tgz#90faebc90295291cfc636b27dbd82e3bfb9e7a48"
2515 - integrity sha512-QeGzagC6Hw5pP+df1+aoF8+FBSgkPmraC1UdkeunWh0jmrp7wC0Hr6umdUAOELBQmxtKAOMNC3KAdjmCds92Zg==
2516 - dependencies:
2517 - "@jest/environment" "^29.0.3"
2518 - "@jest/expect" "^29.0.3"
2519 - "@jest/test-result" "^29.0.3"
2520 - "@jest/types" "^29.0.3"
2521 - "@types/node" "*"
2522 - chalk "^4.0.0"
2523 - co "^4.6.0"
2524 - dedent "^0.7.0"
2525 - is-generator-fn "^2.0.0"
2526 - jest-each "^29.0.3"
2527 - jest-matcher-utils "^29.0.3"
2528 - jest-message-util "^29.0.3"
2529 - jest-runtime "^29.0.3"
2530 - jest-snapshot "^29.0.3"
2531 - jest-util "^29.0.3"
2532 - p-limit "^3.1.0"
2533 - pretty-format "^29.0.3"
2534 - slash "^3.0.0"
2535 - stack-utils "^2.0.3"
2536 -
2537 -jest-cli@^29.0.3:
2538 - version "29.0.3"
2539 - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.0.3.tgz#fd8f0ef363a7a3d9c53ef62e0651f18eeffa77b9"
2540 - integrity sha512-aUy9Gd/Kut1z80eBzG10jAn6BgS3BoBbXyv+uXEqBJ8wnnuZ5RpNfARoskSrTIy1GY4a8f32YGuCMwibtkl9CQ==
2541 - dependencies:
2542 - "@jest/core" "^29.0.3"
2543 - "@jest/test-result" "^29.0.3"
2544 - "@jest/types" "^29.0.3"
2545 - chalk "^4.0.0"
2546 - exit "^0.1.2"
2547 - graceful-fs "^4.2.9"
2548 - import-local "^3.0.2"
2549 - jest-config "^29.0.3"
2550 - jest-util "^29.0.3"
2551 - jest-validate "^29.0.3"
2552 - prompts "^2.0.1"
2553 - yargs "^17.3.1"
2554 -
2555 -jest-config@^29.0.3:
2556 - version "29.0.3"
2557 - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.0.3.tgz#c2e52a8f5adbd18de79f99532d8332a19e232f13"
2558 - integrity sha512-U5qkc82HHVYe3fNu2CRXLN4g761Na26rWKf7CjM8LlZB3In1jadEkZdMwsE37rd9RSPV0NfYaCjHdk/gu3v+Ew==
2559 - dependencies:
2560 - "@babel/core" "^7.11.6"
2561 - "@jest/test-sequencer" "^29.0.3"
2562 - "@jest/types" "^29.0.3"
2563 - babel-jest "^29.0.3"
2564 - chalk "^4.0.0"
2565 - ci-info "^3.2.0"
2566 - deepmerge "^4.2.2"
2567 - glob "^7.1.3"
2568 - graceful-fs "^4.2.9"
2569 - jest-circus "^29.0.3"
2570 - jest-environment-node "^29.0.3"
2571 - jest-get-type "^29.0.0"
2572 - jest-regex-util "^29.0.0"
2573 - jest-resolve "^29.0.3"
2574 - jest-runner "^29.0.3"
2575 - jest-util "^29.0.3"
2576 - jest-validate "^29.0.3"
2577 - micromatch "^4.0.4"
2578 - parse-json "^5.2.0"
2579 - pretty-format "^29.0.3"
2580 - slash "^3.0.0"
2581 - strip-json-comments "^3.1.1"
2582 -
2583 -jest-diff@^29.0.3:
2584 - version "29.0.3"
2585 - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.0.3.tgz#41cc02409ad1458ae1bf7684129a3da2856341ac"
2586 - integrity sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==
2587 - dependencies:
2588 - chalk "^4.0.0"
2589 - diff-sequences "^29.0.0"
2590 - jest-get-type "^29.0.0"
2591 - pretty-format "^29.0.3"
2592 -
2593 -jest-docblock@^29.0.0:
2594 - version "29.0.0"
2595 - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.0.0.tgz#3151bcc45ed7f5a8af4884dcc049aee699b4ceae"
2596 - integrity sha512-s5Kpra/kLzbqu9dEjov30kj1n4tfu3e7Pl8v+f8jOkeWNqM6Ds8jRaJfZow3ducoQUrf2Z4rs2N5S3zXnb83gw==
2597 - dependencies:
2598 - detect-newline "^3.0.0"
2599 -
2600 -jest-each@^29.0.3:
2601 - version "29.0.3"
2602 - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.0.3.tgz#7ef3157580b15a609d7ef663dd4fc9b07f4e1299"
2603 - integrity sha512-wILhZfESURHHBNvPMJ0lZlYZrvOQJxAo3wNHi+ycr90V7M+uGR9Gh4+4a/BmaZF0XTyZsk4OiYEf3GJN7Ltqzg==
2604 - dependencies:
2605 - "@jest/types" "^29.0.3"
2606 - chalk "^4.0.0"
2607 - jest-get-type "^29.0.0"
2608 - jest-util "^29.0.3"
2609 - pretty-format "^29.0.3"
2610 -
2611 -jest-environment-jsdom@^29.0.3:
2612 - version "29.0.3"
2613 - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.0.3.tgz#0c6ee841133dd6acbe957bceaceea93b7ec60ca9"
2614 - integrity sha512-KIGvpm12c71hoYTjL4wC2c8K6KfhOHJqJtaHc1IApu5rG047YWZoEP13BlbucWfzGISBrmli8KFqdhdQEa8Wnw==
2615 - dependencies:
2616 - "@jest/environment" "^29.0.3"
2617 - "@jest/fake-timers" "^29.0.3"
2618 - "@jest/types" "^29.0.3"
2619 - "@types/jsdom" "^20.0.0"
2620 - "@types/node" "*"
2621 - jest-mock "^29.0.3"
2622 - jest-util "^29.0.3"
2623 - jsdom "^20.0.0"
2624 -
2625 -jest-environment-node@^29.0.3:
2626 - version "29.0.3"
2627 - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.0.3.tgz#293804b1e0fa5f0e354dacbe510655caa478a3b2"
2628 - integrity sha512-cdZqRCnmIlTXC+9vtvmfiY/40Cj6s2T0czXuq1whvQdmpzAnj4sbqVYuZ4zFHk766xTTJ+Ij3uUqkk8KCfXoyg==
2629 - dependencies:
2630 - "@jest/environment" "^29.0.3"
2631 - "@jest/fake-timers" "^29.0.3"
2632 - "@jest/types" "^29.0.3"
2633 - "@types/node" "*"
2634 - jest-mock "^29.0.3"
2635 - jest-util "^29.0.3"
2636 -
2637 -jest-get-type@^29.0.0:
2638 - version "29.0.0"
2639 - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80"
2640 - integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==
2641 -
2642 -jest-haste-map@^29.0.3:
2643 - version "29.0.3"
2644 - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.0.3.tgz#d7f3f7180f558d760eacc5184aac5a67f20ef939"
2645 - integrity sha512-uMqR99+GuBHo0RjRhOE4iA6LmsxEwRdgiIAQgMU/wdT2XebsLDz5obIwLZm/Psj+GwSEQhw9AfAVKGYbh2G55A==
2646 - dependencies:
2647 - "@jest/types" "^29.0.3"
2648 - "@types/graceful-fs" "^4.1.3"
2649 - "@types/node" "*"
2650 - anymatch "^3.0.3"
2651 - fb-watchman "^2.0.0"
2652 - graceful-fs "^4.2.9"
2653 - jest-regex-util "^29.0.0"
2654 - jest-util "^29.0.3"
2655 - jest-worker "^29.0.3"
2656 - micromatch "^4.0.4"
2657 - walker "^1.0.8"
2658 - optionalDependencies:
2659 - fsevents "^2.3.2"
2660 -
2661 -jest-leak-detector@^29.0.3:
2662 - version "29.0.3"
2663 - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.0.3.tgz#e85cf3391106a7a250850b6766b508bfe9c7bc6f"
2664 - integrity sha512-YfW/G63dAuiuQ3QmQlh8hnqLDe25WFY3eQhuc/Ev1AGmkw5zREblTh7TCSKLoheyggu6G9gxO2hY8p9o6xbaRQ==
2665 - dependencies:
2666 - jest-get-type "^29.0.0"
2667 - pretty-format "^29.0.3"
2668 -
2669 -jest-matcher-utils@^29.0.3:
2670 - version "29.0.3"
2671 - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.0.3.tgz#b8305fd3f9e27cdbc210b21fc7dbba92d4e54560"
2672 - integrity sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w==
2673 - dependencies:
2674 - chalk "^4.0.0"
2675 - jest-diff "^29.0.3"
2676 - jest-get-type "^29.0.0"
2677 - pretty-format "^29.0.3"
2678 -
2679 -jest-message-util@^29.0.3:
2680 - version "29.0.3"
2681 - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.0.3.tgz#f0254e1ffad21890c78355726202cc91d0a40ea8"
2682 - integrity sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg==
2683 - dependencies:
2684 - "@babel/code-frame" "^7.12.13"
2685 - "@jest/types" "^29.0.3"
2686 - "@types/stack-utils" "^2.0.0"
2687 - chalk "^4.0.0"
2688 - graceful-fs "^4.2.9"
2689 - micromatch "^4.0.4"
2690 - pretty-format "^29.0.3"
2691 - slash "^3.0.0"
2692 - stack-utils "^2.0.3"
2693 -
2694 -jest-mock@^29.0.3:
2695 - version "29.0.3"
2696 - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.0.3.tgz#4f0093f6a9cb2ffdb9c44a07a3912f0c098c8de9"
2697 - integrity sha512-ort9pYowltbcrCVR43wdlqfAiFJXBx8l4uJDsD8U72LgBcetvEp+Qxj1W9ZYgMRoeAo+ov5cnAGF2B6+Oth+ww==
2698 - dependencies:
2699 - "@jest/types" "^29.0.3"
2700 - "@types/node" "*"
2701 -
2702 -jest-pnp-resolver@^1.2.2:
2703 - version "1.2.2"
2704 - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
2705 - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
2706 -
2707 -jest-regex-util@^29.0.0:
2708 - version "29.0.0"
2709 - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de"
2710 - integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug==
2711 -
2712 -jest-resolve-dependencies@^29.0.3:
2713 - version "29.0.3"
2714 - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.0.3.tgz#f23a54295efc6374b86b198cf8efed5606d6b762"
2715 - integrity sha512-KzuBnXqNvbuCdoJpv8EanbIGObk7vUBNt/PwQPPx2aMhlv/jaXpUJsqWYRpP/0a50faMBY7WFFP8S3/CCzwfDw==
2716 - dependencies:
2717 - jest-regex-util "^29.0.0"
2718 - jest-snapshot "^29.0.3"
2719 -
2720 -jest-resolve@^29.0.3:
2721 - version "29.0.3"
2722 - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.0.3.tgz#329a3431e3b9eb6629a2cd483e9bed95b26827b9"
2723 - integrity sha512-toVkia85Y/BPAjJasTC9zIPY6MmVXQPtrCk8SmiheC4MwVFE/CMFlOtMN6jrwPMC6TtNh8+sTMllasFeu1wMPg==
2724 - dependencies:
2725 - chalk "^4.0.0"
2726 - graceful-fs "^4.2.9"
2727 - jest-haste-map "^29.0.3"
2728 - jest-pnp-resolver "^1.2.2"
2729 - jest-util "^29.0.3"
2730 - jest-validate "^29.0.3"
2731 - resolve "^1.20.0"
2732 - resolve.exports "^1.1.0"
2733 - slash "^3.0.0"
2734 -
2735 -jest-runner@^29.0.3:
2736 - version "29.0.3"
2737 - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.0.3.tgz#2e47fe1e8777aea9b8970f37e8f83630b508fb87"
2738 - integrity sha512-Usu6VlTOZlCZoNuh3b2Tv/yzDpKqtiNAetG9t3kJuHfUyVMNW7ipCCJOUojzKkjPoaN7Bl1f7Buu6PE0sGpQxw==
2739 - dependencies:
2740 - "@jest/console" "^29.0.3"
2741 - "@jest/environment" "^29.0.3"
2742 - "@jest/test-result" "^29.0.3"
2743 - "@jest/transform" "^29.0.3"
2744 - "@jest/types" "^29.0.3"
2745 - "@types/node" "*"
2746 - chalk "^4.0.0"
2747 - emittery "^0.10.2"
2748 - graceful-fs "^4.2.9"
2749 - jest-docblock "^29.0.0"
2750 - jest-environment-node "^29.0.3"
2751 - jest-haste-map "^29.0.3"
2752 - jest-leak-detector "^29.0.3"
2753 - jest-message-util "^29.0.3"
2754 - jest-resolve "^29.0.3"
2755 - jest-runtime "^29.0.3"
2756 - jest-util "^29.0.3"
2757 - jest-watcher "^29.0.3"
2758 - jest-worker "^29.0.3"
2759 - p-limit "^3.1.0"
2760 - source-map-support "0.5.13"
2761 -
2762 -jest-runtime@^29.0.3:
2763 - version "29.0.3"
2764 - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.0.3.tgz#5a823ec5902257519556a4e5a71a868e8fd788aa"
2765 - integrity sha512-12gZXRQ7ozEeEHKTY45a+YLqzNDR/x4c//X6AqwKwKJPpWM8FY4vwn4VQJOcLRS3Nd1fWwgP7LU4SoynhuUMHQ==
2766 - dependencies:
2767 - "@jest/environment" "^29.0.3"
2768 - "@jest/fake-timers" "^29.0.3"
2769 - "@jest/globals" "^29.0.3"
2770 - "@jest/source-map" "^29.0.0"
2771 - "@jest/test-result" "^29.0.3"
2772 - "@jest/transform" "^29.0.3"
2773 - "@jest/types" "^29.0.3"
2774 - "@types/node" "*"
2775 - chalk "^4.0.0"
2776 - cjs-module-lexer "^1.0.0"
2777 - collect-v8-coverage "^1.0.0"
2778 - glob "^7.1.3"
2779 - graceful-fs "^4.2.9"
2780 - jest-haste-map "^29.0.3"
2781 - jest-message-util "^29.0.3"
2782 - jest-mock "^29.0.3"
2783 - jest-regex-util "^29.0.0"
2784 - jest-resolve "^29.0.3"
2785 - jest-snapshot "^29.0.3"
2786 - jest-util "^29.0.3"
2787 - slash "^3.0.0"
2788 - strip-bom "^4.0.0"
2789 -
2790 -jest-snapshot@^29.0.3:
2791 - version "29.0.3"
2792 - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.0.3.tgz#0a024706986a915a6eefae74d7343069d2fc8eef"
2793 - integrity sha512-52q6JChm04U3deq+mkQ7R/7uy7YyfVIrebMi6ZkBoDJ85yEjm/sJwdr1P0LOIEHmpyLlXrxy3QP0Zf5J2kj0ew==
2794 - dependencies:
2795 - "@babel/core" "^7.11.6"
2796 - "@babel/generator" "^7.7.2"
2797 - "@babel/plugin-syntax-jsx" "^7.7.2"
2798 - "@babel/plugin-syntax-typescript" "^7.7.2"
2799 - "@babel/traverse" "^7.7.2"
2800 - "@babel/types" "^7.3.3"
2801 - "@jest/expect-utils" "^29.0.3"
2802 - "@jest/transform" "^29.0.3"
2803 - "@jest/types" "^29.0.3"
2804 - "@types/babel__traverse" "^7.0.6"
2805 - "@types/prettier" "^2.1.5"
2806 - babel-preset-current-node-syntax "^1.0.0"
2807 - chalk "^4.0.0"
2808 - expect "^29.0.3"
2809 - graceful-fs "^4.2.9"
2810 - jest-diff "^29.0.3"
2811 - jest-get-type "^29.0.0"
2812 - jest-haste-map "^29.0.3"
2813 - jest-matcher-utils "^29.0.3"
2814 - jest-message-util "^29.0.3"
2815 - jest-util "^29.0.3"
2816 - natural-compare "^1.4.0"
2817 - pretty-format "^29.0.3"
2818 - semver "^7.3.5"
2819 -
2820 -jest-util@^29.0.0, jest-util@^29.0.3:
2821 - version "29.0.3"
2822 - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.0.3.tgz#06d1d77f9a1bea380f121897d78695902959fbc0"
2823 - integrity sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==
2824 - dependencies:
2825 - "@jest/types" "^29.0.3"
2826 - "@types/node" "*"
2827 - chalk "^4.0.0"
2828 - ci-info "^3.2.0"
2829 - graceful-fs "^4.2.9"
2830 - picomatch "^2.2.3"
2831 -
2832 -jest-validate@^29.0.3:
2833 - version "29.0.3"
2834 - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.0.3.tgz#f9521581d7344685428afa0a4d110e9c519aeeb6"
2835 - integrity sha512-OebiqqT6lK8cbMPtrSoS3aZP4juID762lZvpf1u+smZnwTEBCBInan0GAIIhv36MxGaJvmq5uJm7dl5gVt+Zrw==
2836 - dependencies:
2837 - "@jest/types" "^29.0.3"
2838 - camelcase "^6.2.0"
2839 - chalk "^4.0.0"
2840 - jest-get-type "^29.0.0"
2841 - leven "^3.1.0"
2842 - pretty-format "^29.0.3"
2843 -
2844 -jest-watcher@^29.0.3:
2845 - version "29.0.3"
2846 - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.0.3.tgz#8e220d1cc4f8029875e82015d084cab20f33d57f"
2847 - integrity sha512-tQX9lU91A+9tyUQKUMp0Ns8xAcdhC9fo73eqA3LFxP2bSgiF49TNcc+vf3qgGYYK9qRjFpXW9+4RgF/mbxyOOw==
2848 - dependencies:
2849 - "@jest/test-result" "^29.0.3"
2850 - "@jest/types" "^29.0.3"
2851 - "@types/node" "*"
2852 - ansi-escapes "^4.2.1"
2853 - chalk "^4.0.0"
2854 - emittery "^0.10.2"
2855 - jest-util "^29.0.3"
2856 - string-length "^4.0.1"
2857 -
2858 -jest-worker@^29.0.3:
2859 - version "29.0.3"
2860 - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.0.3.tgz#c2ba0aa7e41eec9eb0be8e8a322ae6518df72647"
2861 - integrity sha512-Tl/YWUugQOjoTYwjKdfJWkSOfhufJHO5LhXTSZC3TRoQKO+fuXnZAdoXXBlpLXKGODBL3OvdUasfDD4PcMe6ng==
2862 - dependencies:
2863 - "@types/node" "*"
2864 - merge-stream "^2.0.0"
2865 - supports-color "^8.0.0"
2866 -
2867 -jest@^29.0.3:
2868 - version "29.0.3"
2869 - resolved "https://registry.yarnpkg.com/jest/-/jest-29.0.3.tgz#5227a0596d30791b2649eea347e4aa97f734944d"
2870 - integrity sha512-ElgUtJBLgXM1E8L6K1RW1T96R897YY/3lRYqq9uVcPWtP2AAl/nQ16IYDh/FzQOOQ12VEuLdcPU83mbhG2C3PQ==
2871 - dependencies:
2872 - "@jest/core" "^29.0.3"
2873 - "@jest/types" "^29.0.3"
2874 - import-local "^3.0.2"
2875 - jest-cli "^29.0.3"
2876 -
2877 -js-sdsl@^4.1.4:
2878 - version "4.1.5"
2879 - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a"
2880 - integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==
2881 -
2882 -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
2883 - version "4.0.0"
2884 - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
2885 - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
2886 -
2887 -js-yaml@^3.13.1, js-yaml@^3.2.1:
2888 - version "3.14.1"
2889 - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
2890 - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
2891 - dependencies:
2892 - argparse "^1.0.7"
2893 - esprima "^4.0.0"
2894 -
2895 -js-yaml@^4.1.0:
2896 - version "4.1.0"
2897 - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
2898 - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
2899 - dependencies:
2900 - argparse "^2.0.1"
2901 -
2902 -jsdom@^20.0.0:
2903 - version "20.0.0"
2904 - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.0.tgz#882825ac9cc5e5bbee704ba16143e1fa78361ebf"
2905 - integrity sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==
2906 - dependencies:
2907 - abab "^2.0.6"
2908 - acorn "^8.7.1"
2909 - acorn-globals "^6.0.0"
2910 - cssom "^0.5.0"
2911 - cssstyle "^2.3.0"
2912 - data-urls "^3.0.2"
2913 - decimal.js "^10.3.1"
2914 - domexception "^4.0.0"
2915 - escodegen "^2.0.0"
2916 - form-data "^4.0.0"
2917 - html-encoding-sniffer "^3.0.0"
2918 - http-proxy-agent "^5.0.0"
2919 - https-proxy-agent "^5.0.1"
2920 - is-potential-custom-element-name "^1.0.1"
2921 - nwsapi "^2.2.0"
2922 - parse5 "^7.0.0"
2923 - saxes "^6.0.0"
2924 - symbol-tree "^3.2.4"
2925 - tough-cookie "^4.0.0"
2926 - w3c-hr-time "^1.0.2"
2927 - w3c-xmlserializer "^3.0.0"
2928 - webidl-conversions "^7.0.0"
2929 - whatwg-encoding "^2.0.0"
2930 - whatwg-mimetype "^3.0.0"
2931 - whatwg-url "^11.0.0"
2932 - ws "^8.8.0"
2933 - xml-name-validator "^4.0.0"
2934 -
2935 -jsesc@^2.5.1:
2936 - version "2.5.2"
2937 - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
2938 - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
2939 -
2940 -json-parse-even-better-errors@^2.3.0:
2941 - version "2.3.1"
2942 - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
2943 - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
2944 -
2945 -json-schema-traverse@^0.4.1:
2946 - version "0.4.1"
2947 - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
2948 - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
2949 -
2950 -json-stable-stringify-without-jsonify@^1.0.1:
2951 - version "1.0.1"
2952 - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
2953 - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
2954 -
2955 -json5@^2.1.0, json5@^2.2.1:
2956 - version "2.2.1"
2957 - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
2958 - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
2959 -
2960 -jszip@^3.10.0:
2961 - version "3.10.1"
2962 - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
2963 - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
2964 - dependencies:
2965 - lie "~3.3.0"
2966 - pako "~1.0.2"
2967 - readable-stream "~2.3.6"
2968 - setimmediate "^1.0.5"
2969 -
2970 -klaw@^2.1.0:
2971 - version "2.1.1"
2972 - resolved "https://registry.yarnpkg.com/klaw/-/klaw-2.1.1.tgz#42b76894701169cc910fd0d19ce677b5fb378af1"
2973 - integrity sha512-kuInGWCNc98b1ghOqBJfqPOvAKn9HHgm+SdluR5VNfdA7rs7uNsuXGy7CCqsP6pFKPpUoCH4s9o00GEj9xONHg==
2974 - dependencies:
2975 - graceful-fs "^4.1.9"
2976 -
2977 -kleur@^3.0.3:
2978 - version "3.0.3"
2979 - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
2980 - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
2981 -
2982 -leven@^3.1.0:
2983 - version "3.1.0"
2984 - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
2985 - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
2986 -
2987 -levn@^0.4.1:
2988 - version "0.4.1"
2989 - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
2990 - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
2991 - dependencies:
2992 - prelude-ls "^1.2.1"
2993 - type-check "~0.4.0"
2994 -
2995 -levn@~0.3.0:
2996 - version "0.3.0"
2997 - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
2998 - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
2999 - dependencies:
3000 - prelude-ls "~1.1.2"
3001 - type-check "~0.3.2"
3002 -
3003 -lie@~3.3.0:
3004 - version "3.3.0"
3005 - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
3006 - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
3007 - dependencies:
3008 - immediate "~3.0.5"
3009 -
3010 -lines-and-columns@^1.1.6:
3011 - version "1.2.4"
3012 - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
3013 - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
3014 -
3015 -locate-path@^3.0.0:
3016 - version "3.0.0"
3017 - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
3018 - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
3019 - dependencies:
3020 - p-locate "^3.0.0"
3021 - path-exists "^3.0.0"
3022 -
3023 -locate-path@^5.0.0:
3024 - version "5.0.0"
3025 - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
3026 - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
3027 - dependencies:
3028 - p-locate "^4.1.0"
3029 -
3030 -locate-path@^6.0.0:
3031 - version "6.0.0"
3032 - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
3033 - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
3034 - dependencies:
3035 - p-locate "^5.0.0"
3036 -
3037 -lodash.memoize@4.x:
3038 - version "4.1.2"
3039 - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
3040 - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
3041 -
3042 -lodash.merge@^4.6.2:
3043 - version "4.6.2"
3044 - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
3045 - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
3046 -
3047 -lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.21:
3048 - version "4.17.21"
3049 - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
3050 - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
3051 -
3052 -loose-envify@^1.0.0, loose-envify@^1.1.0:
3053 - version "1.4.0"
3054 - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
3055 - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
3056 - dependencies:
3057 - js-tokens "^3.0.0 || ^4.0.0"
3058 -
3059 -lru-cache@^6.0.0:
3060 - version "6.0.0"
3061 - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
3062 - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
3063 - dependencies:
3064 - yallist "^4.0.0"
3065 -
3066 -lz-string@^1.4.4:
3067 - version "1.4.4"
3068 - resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
3069 - integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==
3070 -
3071 -make-dir@^3.0.0:
3072 - version "3.1.0"
3073 - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
3074 - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
3075 - dependencies:
3076 - semver "^6.0.0"
3077 -
3078 -make-error@1.x, make-error@^1.1.1:
3079 - version "1.3.6"
3080 - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
3081 - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
3082 -
3083 -makeerror@1.0.12:
3084 - version "1.0.12"
3085 - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
3086 - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
3087 - dependencies:
3088 - tmpl "1.0.5"
3089 -
3090 -merge-stream@^2.0.0:
3091 - version "2.0.0"
3092 - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
3093 - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
3094 -
3095 -merge2@^1.3.0, merge2@^1.4.1:
3096 - version "1.4.1"
3097 - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
3098 - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
3099 -
3100 -micromatch@^4.0.4:
3101 - version "4.0.5"
3102 - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
3103 - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
3104 - dependencies:
3105 - braces "^3.0.2"
3106 - picomatch "^2.3.1"
3107 -
3108 -mime-db@1.52.0:
3109 - version "1.52.0"
3110 - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
3111 - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
3112 -
3113 -mime-types@^2.1.12, mime-types@~2.1.34:
3114 - version "2.1.35"
3115 - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
3116 - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
3117 - dependencies:
3118 - mime-db "1.52.0"
3119 -
3120 -mimic-fn@^2.1.0:
3121 - version "2.1.0"
3122 - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
3123 - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
3124 -
3125 -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
3126 - version "3.1.2"
3127 - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
3128 - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
3129 - dependencies:
3130 - brace-expansion "^1.1.7"
3131 -
3132 -minimist@^1.2.6:
3133 - version "1.2.7"
3134 - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
3135 - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
3136 -
3137 -mkdirp@^0.5.1:
3138 - version "0.5.6"
3139 - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
3140 - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
3141 - dependencies:
3142 - minimist "^1.2.6"
3143 -
3144 -ms@2.0.0:
3145 - version "2.0.0"
3146 - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
3147 - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
3148 -
3149 -ms@2.1.2:
3150 - version "2.1.2"
3151 - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
3152 - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
3153 -
3154 -ms@^2.1.1:
3155 - version "2.1.3"
3156 - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
3157 - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
3158 -
3159 -natural-compare@^1.4.0:
3160 - version "1.4.0"
3161 - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
3162 - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
3163 -
3164 -negotiator@0.6.3:
3165 - version "0.6.3"
3166 - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
3167 - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
3168 -
3169 -node-int64@^0.4.0:
3170 - version "0.4.0"
3171 - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
3172 - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
3173 -
3174 -node-releases@^2.0.6:
3175 - version "2.0.6"
3176 - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
3177 - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
3178 -
3179 -normalize-path@^3.0.0:
3180 - version "3.0.0"
3181 - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
3182 - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
3183 -
3184 -npm-run-path@^4.0.1:
3185 - version "4.0.1"
3186 - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
3187 - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
3188 - dependencies:
3189 - path-key "^3.0.0"
3190 -
3191 -nwsapi@^2.2.0:
3192 - version "2.2.2"
3193 - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0"
3194 - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==
3195 -
3196 -object-keys@^1.1.1:
3197 - version "1.1.1"
3198 - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
3199 - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
3200 -
3201 -object.assign@^4.1.0:
3202 - version "4.1.4"
3203 - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
3204 - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
3205 - dependencies:
3206 - call-bind "^1.0.2"
3207 - define-properties "^1.1.4"
3208 - has-symbols "^1.0.3"
3209 - object-keys "^1.1.1"
3210 -
3211 -once@^1.3.0:
3212 - version "1.4.0"
3213 - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
3214 - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
3215 - dependencies:
3216 - wrappy "1"
3217 -
3218 -onetime@^5.1.2:
3219 - version "5.1.2"
3220 - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
3221 - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
3222 - dependencies:
3223 - mimic-fn "^2.1.0"
3224 -
3225 -optionator@^0.8.1:
3226 - version "0.8.3"
3227 - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
3228 - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
3229 - dependencies:
3230 - deep-is "~0.1.3"
3231 - fast-levenshtein "~2.0.6"
3232 - levn "~0.3.0"
3233 - prelude-ls "~1.1.2"
3234 - type-check "~0.3.2"
3235 - word-wrap "~1.2.3"
3236 -
3237 -optionator@^0.9.1:
3238 - version "0.9.1"
3239 - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
3240 - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
3241 - dependencies:
3242 - deep-is "^0.1.3"
3243 - fast-levenshtein "^2.0.6"
3244 - levn "^0.4.1"
3245 - prelude-ls "^1.2.1"
3246 - type-check "^0.4.0"
3247 - word-wrap "^1.2.3"
3248 -
3249 -os-tmpdir@^1.0.1:
3250 - version "1.0.2"
3251 - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
3252 - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
3253 -
3254 -p-limit@^2.0.0, p-limit@^2.2.0:
3255 - version "2.3.0"
3256 - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
3257 - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
3258 - dependencies:
3259 - p-try "^2.0.0"
3260 -
3261 -p-limit@^3.0.2, p-limit@^3.1.0:
3262 - version "3.1.0"
3263 - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
3264 - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
3265 - dependencies:
3266 - yocto-queue "^0.1.0"
3267 -
3268 -p-locate@^3.0.0:
3269 - version "3.0.0"
3270 - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
3271 - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
3272 - dependencies:
3273 - p-limit "^2.0.0"
3274 -
3275 -p-locate@^4.1.0:
3276 - version "4.1.0"
3277 - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
3278 - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
3279 - dependencies:
3280 - p-limit "^2.2.0"
3281 -
3282 -p-locate@^5.0.0:
3283 - version "5.0.0"
3284 - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
3285 - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
3286 - dependencies:
3287 - p-limit "^3.0.2"
3288 -
3289 -p-try@^2.0.0:
3290 - version "2.2.0"
3291 - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
3292 - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
3293 -
3294 -pako@~1.0.2:
3295 - version "1.0.11"
3296 - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
3297 - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
3298 -
3299 -parent-module@^1.0.0:
3300 - version "1.0.1"
3301 - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
3302 - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
3303 - dependencies:
3304 - callsites "^3.0.0"
3305 -
3306 -parse-json@^5.2.0:
3307 - version "5.2.0"
3308 - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
3309 - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
3310 - dependencies:
3311 - "@babel/code-frame" "^7.0.0"
3312 - error-ex "^1.3.1"
3313 - json-parse-even-better-errors "^2.3.0"
3314 - lines-and-columns "^1.1.6"
3315 -
3316 -parse5@^7.0.0:
3317 - version "7.1.1"
3318 - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746"
3319 - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==
3320 - dependencies:
3321 - entities "^4.4.0"
3322 -
3323 -parseqs@0.0.6:
3324 - version "0.0.6"
3325 - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5"
3326 - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==
3327 -
3328 -parseuri@0.0.6:
3329 - version "0.0.6"
3330 - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a"
3331 - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==
3332 -
3333 -path-exists@^3.0.0:
3334 - version "3.0.0"
3335 - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
3336 - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
3337 -
3338 -path-exists@^4.0.0:
3339 - version "4.0.0"
3340 - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
3341 - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
3342 -
3343 -path-is-absolute@^1.0.0:
3344 - version "1.0.1"
3345 - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
3346 - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
3347 -
3348 -path-key@^3.0.0, path-key@^3.1.0:
3349 - version "3.1.1"
3350 - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
3351 - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
3352 -
3353 -path-parse@^1.0.7:
3354 - version "1.0.7"
3355 - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
3356 - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
3357 -
3358 -path-type@^4.0.0:
3359 - version "4.0.0"
3360 - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
3361 - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
3362 -
3363 -picocolors@^1.0.0:
3364 - version "1.0.0"
3365 - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
3366 - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
3367 -
3368 -picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
3369 - version "2.3.1"
3370 - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
3371 - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
3372 -
3373 -pirates@^4.0.4:
3374 - version "4.0.5"
3375 - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
3376 - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
3377 -
3378 -pkg-dir@^4.2.0:
3379 - version "4.2.0"
3380 - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
3381 - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
3382 - dependencies:
3383 - find-up "^4.0.0"
3384 -
3385 -prelude-ls@^1.2.1:
3386 - version "1.2.1"
3387 - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
3388 - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
3389 -
3390 -prelude-ls@~1.1.2:
3391 - version "1.1.2"
3392 - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
3393 - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
3394 -
3395 -prettier@2.7.1:
3396 - version "2.7.1"
3397 - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
3398 - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
3399 -
3400 -pretty-format@^24:
3401 - version "24.9.0"
3402 - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
3403 - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
3404 - dependencies:
3405 - "@jest/types" "^24.9.0"
3406 - ansi-regex "^4.0.0"
3407 - ansi-styles "^3.2.0"
3408 - react-is "^16.8.4"
3409 -
3410 -pretty-format@^27.0.2:
3411 - version "27.5.1"
3412 - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
3413 - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
3414 - dependencies:
3415 - ansi-regex "^5.0.1"
3416 - ansi-styles "^5.0.0"
3417 - react-is "^17.0.1"
3418 -
3419 -pretty-format@^29.0.0, pretty-format@^29.0.3:
3420 - version "29.0.3"
3421 - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.0.3.tgz#23d5f8cabc9cbf209a77d49409d093d61166a811"
3422 - integrity sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==
3423 - dependencies:
3424 - "@jest/schemas" "^29.0.0"
3425 - ansi-styles "^5.0.0"
3426 - react-is "^18.0.0"
3427 -
3428 -private@^0.1.8:
3429 - version "0.1.8"
3430 - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
3431 - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
3432 -
3433 -process-nextick-args@~2.0.0:
3434 - version "2.0.1"
3435 - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
3436 - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
3437 -
3438 -prompts@^2.0.1:
3439 - version "2.4.2"
3440 - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
3441 - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
3442 - dependencies:
3443 - kleur "^3.0.3"
3444 - sisteransi "^1.0.5"
3445 -
3446 -psl@^1.1.33:
3447 - version "1.9.0"
3448 - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
3449 - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
3450 -
3451 -punycode@^2.1.0, punycode@^2.1.1:
3452 - version "2.1.1"
3453 - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
3454 - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
3455 -
3456 -querystringify@^2.1.1:
3457 - version "2.2.0"
3458 - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
3459 - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
3460 -
3461 -queue-microtask@^1.2.2:
3462 - version "1.2.3"
3463 - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
3464 - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
3465 -
3466 -react-dom@^18.2.0:
3467 - version "18.2.0"
3468 - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
3469 - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
3470 - dependencies:
3471 - loose-envify "^1.1.0"
3472 - scheduler "^0.23.0"
3473 -
3474 -react-is@^16.8.4:
3475 - version "16.13.1"
3476 - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
3477 - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
3478 -
3479 -react-is@^17.0.1:
3480 - version "17.0.2"
3481 - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
3482 - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
3483 -
3484 -react-is@^18.0.0:
3485 - version "18.2.0"
3486 - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
3487 - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
3488 -
3489 -react@^18.2.0:
3490 - version "18.2.0"
3491 - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
3492 - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
3493 - dependencies:
3494 - loose-envify "^1.1.0"
3495 -
3496 -readable-stream@~2.3.6:
3497 - version "2.3.7"
3498 - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
3499 - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
3500 - dependencies:
3501 - core-util-is "~1.0.0"
3502 - inherits "~2.0.3"
3503 - isarray "~1.0.0"
3504 - process-nextick-args "~2.0.0"
3505 - safe-buffer "~5.1.1"
3506 - string_decoder "~1.1.1"
3507 - util-deprecate "~1.0.1"
3508 -
3509 -recast@^0.17.5:
3510 - version "0.17.6"
3511 - resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.6.tgz#64ae98d0d2dfb10ff92ff5fb9ffb7371823b69fa"
3512 - integrity sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==
3513 - dependencies:
3514 - ast-types "0.12.4"
3515 - esprima "~4.0.0"
3516 - private "^0.1.8"
3517 - source-map "~0.6.1"
3518 -
3519 -regenerator-runtime@^0.13.4:
3520 - version "0.13.9"
3521 - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
3522 - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
3523 -
3524 -regexpp@^3.2.0:
3525 - version "3.2.0"
3526 - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
3527 - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
3528 -
3529 -require-directory@^2.1.1:
3530 - version "2.1.1"
3531 - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
3532 - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
3533 -
3534 -require-main-filename@^2.0.0:
3535 - version "2.0.0"
3536 - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
3537 - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
3538 -
3539 -requires-port@^1.0.0:
3540 - version "1.0.0"
3541 - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
3542 - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
3543 -
3544 -resolve-cwd@^3.0.0:
3545 - version "3.0.0"
3546 - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
3547 - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
3548 - dependencies:
3549 - resolve-from "^5.0.0"
3550 -
3551 -resolve-from@^4.0.0:
3552 - version "4.0.0"
3553 - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
3554 - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
3555 -
3556 -resolve-from@^5.0.0:
3557 - version "5.0.0"
3558 - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
3559 - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
3560 -
3561 -resolve.exports@^1.1.0:
3562 - version "1.1.0"
3563 - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9"
3564 - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==
3565 -
3566 -resolve@^1.20.0, resolve@^1.3.2:
3567 - version "1.22.1"
3568 - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
3569 - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
3570 - dependencies:
3571 - is-core-module "^2.9.0"
3572 - path-parse "^1.0.7"
3573 - supports-preserve-symlinks-flag "^1.0.0"
3574 -
3575 -reusify@^1.0.4:
3576 - version "1.0.4"
3577 - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
3578 - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
3579 -
3580 -rimraf@^3.0.0, rimraf@^3.0.2:
3581 - version "3.0.2"
3582 - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
3583 - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
3584 - dependencies:
3585 - glob "^7.1.3"
3586 -
3587 -run-parallel@^1.1.9:
3588 - version "1.2.0"
3589 - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
3590 - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
3591 - dependencies:
3592 - queue-microtask "^1.2.2"
3593 -
3594 -rxjs@^6.4.0:
3595 - version "6.6.7"
3596 - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
3597 - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
3598 - dependencies:
3599 - tslib "^1.9.0"
3600 -
3601 -rxjs@^7.0.0:
3602 - version "7.5.6"
3603 - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc"
3604 - integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==
3605 - dependencies:
3606 - tslib "^2.1.0"
3607 -
3608 -safe-buffer@~5.1.0, safe-buffer@~5.1.1:
3609 - version "5.1.2"
3610 - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
3611 - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
3612 -
3613 -"safer-buffer@>= 2.1.2 < 3.0.0":
3614 - version "2.1.2"
3615 - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
3616 - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
3617 -
3618 -saxes@^6.0.0:
3619 - version "6.0.0"
3620 - resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
3621 - integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
3622 - dependencies:
3623 - xmlchars "^2.2.0"
3624 -
3625 -scheduler@^0.23.0:
3626 - version "0.23.0"
3627 - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
3628 - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
3629 - dependencies:
3630 - loose-envify "^1.1.0"
3631 -
3632 -selenium-webdriver@^4.0.0-alpha.1:
3633 - version "4.6.1"
3634 - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.6.1.tgz#ac66867206542a40c24b5a44f4ccbae992e962dc"
3635 - integrity sha512-FT8Dw0tbzaTp8YYLuwhaCnve/nw03HKrOJrA3aUmTKmxaIFSP4kT2R5fN3K0RpV5kbR0ZnM4FGVI2vANBvekaA==
3636 - dependencies:
3637 - jszip "^3.10.0"
3638 - tmp "^0.2.1"
3639 - ws ">=8.7.0"
3640 -
3641 -semver@7.x, semver@^7.3.5:
3642 - version "7.3.7"
3643 - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
3644 - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
3645 - dependencies:
3646 - lru-cache "^6.0.0"
3647 -
3648 -semver@^5.4.1:
3649 - version "5.7.1"
3650 - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
3651 - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
3652 -
3653 -semver@^6.0.0, semver@^6.3.0:
3654 - version "6.3.0"
3655 - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
3656 - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
3657 -
3658 -server-destroy@^1.0.1:
3659 - version "1.0.1"
3660 - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
3661 - integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==
3662 -
3663 -set-blocking@^2.0.0:
3664 - version "2.0.0"
3665 - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
3666 - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
3667 -
3668 -setimmediate@^1.0.5:
3669 - version "1.0.5"
3670 - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
3671 - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
3672 -
3673 -shebang-command@^2.0.0:
3674 - version "2.0.0"
3675 - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
3676 - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
3677 - dependencies:
3678 - shebang-regex "^3.0.0"
3679 -
3680 -shebang-regex@^3.0.0:
3681 - version "3.0.0"
3682 - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
3683 - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
3684 -
3685 -shell-quote@^1.7.3:
3686 - version "1.7.3"
3687 - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
3688 - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
3689 -
3690 -signal-exit@^3.0.3, signal-exit@^3.0.7:
3691 - version "3.0.7"
3692 - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
3693 - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
3694 -
3695 -sisteransi@^1.0.5:
3696 - version "1.0.5"
3697 - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
3698 - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
3699 -
3700 -slash@^3.0.0:
3701 - version "3.0.0"
3702 - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
3703 - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
3704 -
3705 -socket.io-adapter@~1.1.0:
3706 - version "1.1.2"
3707 - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9"
3708 - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==
3709 -
3710 -socket.io-client@2.5.0:
3711 - version "2.5.0"
3712 - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.5.0.tgz#34f486f3640dde9c2211fce885ac2746f9baf5cb"
3713 - integrity sha512-lOO9clmdgssDykiOmVQQitwBAF3I6mYcQAo7hQ7AM6Ny5X7fp8hIJ3HcQs3Rjz4SoggoxA1OgrQyY8EgTbcPYw==
3714 - dependencies:
3715 - backo2 "1.0.2"
3716 - component-bind "1.0.0"
3717 - component-emitter "~1.3.0"
3718 - debug "~3.1.0"
3719 - engine.io-client "~3.5.0"
3720 - has-binary2 "~1.0.2"
3721 - indexof "0.0.1"
3722 - parseqs "0.0.6"
3723 - parseuri "0.0.6"
3724 - socket.io-parser "~3.3.0"
3725 - to-array "0.1.4"
3726 -
3727 -socket.io-parser@~3.3.0:
3728 - version "3.3.3"
3729 - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.3.tgz#3a8b84823eba87f3f7624e64a8aaab6d6318a72f"
3730 - integrity sha512-qOg87q1PMWWTeO01768Yh9ogn7chB9zkKtQnya41Y355S0UmpXgpcrFwAgjYJxu9BdKug5r5e9YtVSeWhKBUZg==
3731 - dependencies:
3732 - component-emitter "~1.3.0"
3733 - debug "~3.1.0"
3734 - isarray "2.0.1"
3735 -
3736 -socket.io-parser@~3.4.0:
3737 - version "3.4.2"
3738 - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.2.tgz#d70a69f34900d8290a511995d26f581828a49065"
3739 - integrity sha512-QFZBaZDNqZXeemwejc7D39jrq2eGK/qZuVDiMPKzZK1hLlNvjGilGt4ckfQZeVX4dGmuPzCytN9ZW1nQlEWjgA==
3740 - dependencies:
3741 - component-emitter "1.2.1"
3742 - debug "~4.1.0"
3743 - isarray "2.0.1"
3744 -
3745 -socket.io@^2.3.0:
3746 - version "2.5.0"
3747 - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.5.0.tgz#e1c7fb1823f7fa09dfebb5bb68f9d2ee03a0a2e3"
3748 - integrity sha512-gGunfS0od3VpwDBpGwVkzSZx6Aqo9uOcf1afJj2cKnKFAoyl16fvhpsUhmUFd4Ldbvl5JvRQed6eQw6oQp6n8w==
3749 - dependencies:
3750 - debug "~4.1.0"
3751 - engine.io "~3.6.0"
3752 - has-binary2 "~1.0.2"
3753 - socket.io-adapter "~1.1.0"
3754 - socket.io-client "2.5.0"
3755 - socket.io-parser "~3.4.0"
3756 -
3757 -source-map-support@0.5.13:
3758 - version "0.5.13"
3759 - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
3760 - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
3761 - dependencies:
3762 - buffer-from "^1.0.0"
3763 - source-map "^0.6.0"
3764 -
3765 -source-map@^0.5.0:
3766 - version "0.5.7"
3767 - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
3768 - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
3769 -
3770 -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
3771 - version "0.6.1"
3772 - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
3773 - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
3774 -
3775 -spawn-command@^0.0.2-1:
3776 - version "0.0.2-1"
3777 - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
3778 - integrity sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==
3779 -
3780 -sprintf-js@~1.0.2:
3781 - version "1.0.3"
3782 - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
3783 - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
3784 -
3785 -stack-utils@^2.0.3:
3786 - version "2.0.5"
3787 - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
3788 - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
3789 - dependencies:
3790 - escape-string-regexp "^2.0.0"
3791 -
3792 -stackframe@^0.3.1:
3793 - version "0.3.1"
3794 - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-0.3.1.tgz#33aa84f1177a5548c8935533cbfeb3420975f5a4"
3795 - integrity sha512-XmoiF4T5nuWEp2x2w92WdGjdHGY/cZa6LIbRsDRQR/Xlk4uW0PAUlH1zJYVffocwKpCdwyuypIp25xsSXEtZHw==
3796 -
3797 -string-length@^4.0.1:
3798 - version "4.0.2"
3799 - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
3800 - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
3801 - dependencies:
3802 - char-regex "^1.0.2"
3803 - strip-ansi "^6.0.0"
3804 -
3805 -string-width@^3.0.0, string-width@^3.1.0:
3806 - version "3.1.0"
3807 - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
3808 - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
3809 - dependencies:
3810 - emoji-regex "^7.0.1"
3811 - is-fullwidth-code-point "^2.0.0"
3812 - strip-ansi "^5.1.0"
3813 -
3814 -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
3815 - version "4.2.3"
3816 - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
3817 - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
3818 - dependencies:
3819 - emoji-regex "^8.0.0"
3820 - is-fullwidth-code-point "^3.0.0"
3821 - strip-ansi "^6.0.1"
3822 -
3823 -string_decoder@~1.1.1:
3824 - version "1.1.1"
3825 - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
3826 - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
3827 - dependencies:
3828 - safe-buffer "~5.1.0"
3829 -
3830 -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
3831 - version "5.2.0"
3832 - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
3833 - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
3834 - dependencies:
3835 - ansi-regex "^4.1.0"
3836 -
3837 -strip-ansi@^6.0.0, strip-ansi@^6.0.1:
3838 - version "6.0.1"
3839 - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
3840 - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
3841 - dependencies:
3842 - ansi-regex "^5.0.1"
3843 -
3844 -strip-bom@^4.0.0:
3845 - version "4.0.0"
3846 - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
3847 - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
3848 -
3849 -strip-final-newline@^2.0.0:
3850 - version "2.0.0"
3851 - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
3852 - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
3853 -
3854 -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
3855 - version "3.1.1"
3856 - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
3857 - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
3858 -
3859 -supports-color@^5.3.0:
3860 - version "5.5.0"
3861 - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
3862 - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
3863 - dependencies:
3864 - has-flag "^3.0.0"
3865 -
3866 -supports-color@^7.0.0, supports-color@^7.1.0:
3867 - version "7.2.0"
3868 - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
3869 - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
3870 - dependencies:
3871 - has-flag "^4.0.0"
3872 -
3873 -supports-color@^8.0.0, supports-color@^8.1.0:
3874 - version "8.1.1"
3875 - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
3876 - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
3877 - dependencies:
3878 - has-flag "^4.0.0"
3879 -
3880 -supports-hyperlinks@^2.0.0:
3881 - version "2.3.0"
3882 - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
3883 - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
3884 - dependencies:
3885 - has-flag "^4.0.0"
3886 - supports-color "^7.0.0"
3887 -
3888 -supports-preserve-symlinks-flag@^1.0.0:
3889 - version "1.0.0"
3890 - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
3891 - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
3892 -
3893 -symbol-tree@^3.2.4:
3894 - version "3.2.4"
3895 - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
3896 - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
3897 -
3898 -terminal-link@^2.0.0:
3899 - version "2.1.1"
3900 - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
3901 - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
3902 - dependencies:
3903 - ansi-escapes "^4.2.1"
3904 - supports-hyperlinks "^2.0.0"
3905 -
3906 -test-exclude@^6.0.0:
3907 - version "6.0.0"
3908 - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
3909 - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
3910 - dependencies:
3911 - "@istanbuljs/schema" "^0.1.2"
3912 - glob "^7.1.4"
3913 - minimatch "^3.0.4"
3914 -
3915 -test262-harness@^8.0.0:
3916 - version "8.0.0"
3917 - resolved "https://registry.yarnpkg.com/test262-harness/-/test262-harness-8.0.0.tgz#98079567c71ba834805e3f4094b81bebb8facf56"
3918 - integrity sha512-yrWlwOmpuLR7oZs6VWTzkY+Y/vW9RQmISz0ttWHbsjtbxsbwY3fpMrA1BKoeYCGQwgHNL3rfThSQTb8i2Eqa0g==
3919 - dependencies:
3920 - eshost "^7.7.0"
3921 - minimatch "^3.0.4"
3922 - rxjs "^6.4.0"
3923 - test262-stream "^1.3.0"
3924 - yargs "^13.2.2"
3925 -
3926 -test262-stream@^1.3.0:
3927 - version "1.4.0"
3928 - resolved "https://registry.yarnpkg.com/test262-stream/-/test262-stream-1.4.0.tgz#6e40d803464fa47480b0c43eb9c73c8071e52921"
3929 - integrity sha512-s364askxqgyWAtIwvYCG5nYT3P32g9ByEt1ML49ubFlPE52GA6fG5ZZGmf4y/YJgKtppRAZZ7YVd9NOsk1oUxA==
3930 - dependencies:
3931 - js-yaml "^3.2.1"
3932 - klaw "^2.1.0"
3933 -
3934 -text-table@^0.2.0:
3935 - version "0.2.0"
3936 - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
3937 - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
3938 -
3939 -tmp@^0.2.1:
3940 - version "0.2.1"
3941 - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
3942 - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
3943 - dependencies:
3944 - rimraf "^3.0.0"
3945 -
3946 -tmpl@1.0.5:
3947 - version "1.0.5"
3948 - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
3949 - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
3950 -
3951 -to-array@0.1.4:
3952 - version "0.1.4"
3953 - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
3954 - integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==
3955 -
3956 -to-fast-properties@^2.0.0:
3957 - version "2.0.0"
3958 - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
3959 - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
3960 -
3961 -to-regex-range@^5.0.1:
3962 - version "5.0.1"
3963 - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
3964 - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
3965 - dependencies:
3966 - is-number "^7.0.0"
3967 -
3968 -tough-cookie@^4.0.0:
3969 - version "4.1.2"
3970 - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874"
3971 - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==
3972 - dependencies:
3973 - psl "^1.1.33"
3974 - punycode "^2.1.1"
3975 - universalify "^0.2.0"
3976 - url-parse "^1.5.3"
3977 -
3978 -tr46@^3.0.0:
3979 - version "3.0.0"
3980 - resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9"
3981 - integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
3982 - dependencies:
3983 - punycode "^2.1.1"
3984 -
3985 -tree-kill@^1.2.2:
3986 - version "1.2.2"
3987 - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
3988 - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
3989 -
3990 -trim-right@^1.0.1:
3991 - version "1.0.1"
3992 - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
3993 - integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==
3994 -
3995 -ts-jest@^29.0.1:
3996 - version "29.0.1"
3997 - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.1.tgz#3296b39d069dc55825ce1d059a9510b33c718b86"
3998 - integrity sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==
3999 - dependencies:
4000 - bs-logger "0.x"
4001 - fast-json-stable-stringify "2.x"
4002 - jest-util "^29.0.0"
4003 - json5 "^2.2.1"
4004 - lodash.memoize "4.x"
4005 - make-error "1.x"
4006 - semver "7.x"
4007 - yargs-parser "^21.0.1"
4008 -
4009 -ts-node@^10.9.1:
4010 - version "10.9.1"
4011 - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
4012 - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
4013 - dependencies:
4014 - "@cspotcode/source-map-support" "^0.8.0"
4015 - "@tsconfig/node10" "^1.0.7"
4016 - "@tsconfig/node12" "^1.0.7"
4017 - "@tsconfig/node14" "^1.0.0"
4018 - "@tsconfig/node16" "^1.0.2"
4019 - acorn "^8.4.1"
4020 - acorn-walk "^8.1.1"
4021 - arg "^4.1.0"
4022 - create-require "^1.1.0"
4023 - diff "^4.0.1"
4024 - make-error "^1.1.1"
4025 - v8-compile-cache-lib "^3.0.1"
4026 - yn "3.1.1"
4027 -
4028 -tslib@^1.9.0:
4029 - version "1.14.1"
4030 - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
4031 - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
4032 -
4033 -tslib@^2.1.0:
4034 - version "2.4.0"
4035 - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
4036 - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
4037 -
4038 -type-check@^0.4.0, type-check@~0.4.0:
4039 - version "0.4.0"
4040 - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
4041 - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
4042 - dependencies:
4043 - prelude-ls "^1.2.1"
4044 -
4045 -type-check@~0.3.2:
4046 - version "0.3.2"
4047 - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
4048 - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
4049 - dependencies:
4050 - prelude-ls "~1.1.2"
4051 -
4052 -type-detect@4.0.8:
4053 - version "4.0.8"
4054 - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
4055 - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
4056 -
4057 -type-fest@^0.20.2:
4058 - version "0.20.2"
4059 - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
4060 - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
4061 -
4062 -type-fest@^0.21.3:
4063 - version "0.21.3"
4064 - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
4065 - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
4066 -
4067 -typescript@^4.8.3:
4068 - version "4.8.3"
4069 - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.3.tgz#d59344522c4bc464a65a730ac695007fdb66dd88"
4070 - integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==
4071 -
4072 -uid2@0.0.3:
4073 - version "0.0.3"
4074 - resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
4075 - integrity sha512-5gSP1liv10Gjp8cMEnFd6shzkL/D6W1uhXSFNCxDC+YI8+L8wkCYCbJ7n77Ezb4wE/xzMogecE+DtamEe9PZjg==
4076 -
4077 -unique-temp-dir@^1.0.0:
4078 - version "1.0.0"
4079 - resolved "https://registry.yarnpkg.com/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz#6dce95b2681ca003eebfb304a415f9cbabcc5385"
4080 - integrity sha512-tE68ki2FndoVdPioyiz8mYaJeX3xU/9lk4dml7KlLKEkWLtDGAYeg5LGjE2dMkzB8d6R3HbcKTn/I14nukP2dw==
4081 - dependencies:
4082 - mkdirp "^0.5.1"
4083 - os-tmpdir "^1.0.1"
4084 - uid2 "0.0.3"
4085 -
4086 -universalify@^0.2.0:
4087 - version "0.2.0"
4088 - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
4089 - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
4090 -
4091 -update-browserslist-db@^1.0.9:
4092 - version "1.0.9"
4093 - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18"
4094 - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==
4095 - dependencies:
4096 - escalade "^3.1.1"
4097 - picocolors "^1.0.0"
4098 -
4099 -uri-js@^4.2.2:
4100 - version "4.4.1"
4101 - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
4102 - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
4103 - dependencies:
4104 - punycode "^2.1.0"
4105 -
4106 -url-parse@^1.5.3:
4107 - version "1.5.10"
4108 - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
4109 - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
4110 - dependencies:
4111 - querystringify "^2.1.1"
4112 - requires-port "^1.0.0"
4113 -
4114 -util-deprecate@~1.0.1:
4115 - version "1.0.2"
4116 - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
4117 - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
4118 -
4119 -v8-compile-cache-lib@^3.0.1:
4120 - version "3.0.1"
4121 - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
4122 - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
4123 -
4124 -v8-to-istanbul@^9.0.1:
4125 - version "9.0.1"
4126 - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4"
4127 - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==
4128 - dependencies:
4129 - "@jridgewell/trace-mapping" "^0.3.12"
4130 - "@types/istanbul-lib-coverage" "^2.0.1"
4131 - convert-source-map "^1.6.0"
4132 -
4133 -w3c-hr-time@^1.0.2:
4134 - version "1.0.2"
4135 - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
4136 - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
4137 - dependencies:
4138 - browser-process-hrtime "^1.0.0"
4139 -
4140 -w3c-xmlserializer@^3.0.0:
4141 - version "3.0.0"
4142 - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz#06cdc3eefb7e4d0b20a560a5a3aeb0d2d9a65923"
4143 - integrity sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==
4144 - dependencies:
4145 - xml-name-validator "^4.0.0"
4146 -
4147 -walker@^1.0.8:
4148 - version "1.0.8"
4149 - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
4150 - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
4151 - dependencies:
4152 - makeerror "1.0.12"
4153 -
4154 -webidl-conversions@^7.0.0:
4155 - version "7.0.0"
4156 - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
4157 - integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
4158 -
4159 -whatwg-encoding@^2.0.0:
4160 - version "2.0.0"
4161 - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53"
4162 - integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
4163 - dependencies:
4164 - iconv-lite "0.6.3"
4165 -
4166 -whatwg-mimetype@^3.0.0:
4167 - version "3.0.0"
4168 - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7"
4169 - integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
4170 -
4171 -whatwg-url@^11.0.0:
4172 - version "11.0.0"
4173 - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018"
4174 - integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
4175 - dependencies:
4176 - tr46 "^3.0.0"
4177 - webidl-conversions "^7.0.0"
4178 -
4179 -which-module@^2.0.0:
4180 - version "2.0.0"
4181 - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
4182 - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
4183 -
4184 -which@^2.0.1:
4185 - version "2.0.2"
4186 - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
4187 - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
4188 - dependencies:
4189 - isexe "^2.0.0"
4190 -
4191 -word-wrap@^1.2.3, word-wrap@~1.2.3:
4192 - version "1.2.3"
4193 - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
4194 - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
4195 -
4196 -wrap-ansi@^5.1.0:
4197 - version "5.1.0"
4198 - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
4199 - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
4200 - dependencies:
4201 - ansi-styles "^3.2.0"
4202 - string-width "^3.0.0"
4203 - strip-ansi "^5.0.0"
4204 -
4205 -wrap-ansi@^7.0.0:
4206 - version "7.0.0"
4207 - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
4208 - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
4209 - dependencies:
4210 - ansi-styles "^4.0.0"
4211 - string-width "^4.1.0"
4212 - strip-ansi "^6.0.0"
4213 -
4214 -wrappy@1:
4215 - version "1.0.2"
4216 - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
4217 - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
4218 -
4219 -write-file-atomic@^4.0.1:
4220 - version "4.0.2"
4221 - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
4222 - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
4223 - dependencies:
4224 - imurmurhash "^0.1.4"
4225 - signal-exit "^3.0.7"
4226 -
4227 -ws@>=8.7.0:
4228 - version "8.11.0"
4229 - resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"
4230 - integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==
4231 -
4232 -ws@^8.8.0:
4233 - version "8.9.0"
4234 - resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e"
4235 - integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==
4236 -
4237 -ws@~7.4.2:
4238 - version "7.4.6"
4239 - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
4240 - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
4241 -
4242 -xml-name-validator@^4.0.0:
4243 - version "4.0.0"
4244 - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835"
4245 - integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
4246 -
4247 -xmlchars@^2.2.0:
4248 - version "2.2.0"
4249 - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
4250 - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
4251 -
4252 -xmlhttprequest-ssl@~1.6.2:
4253 - version "1.6.3"
4254 - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6"
4255 - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==
4256 -
4257 -y18n@^4.0.0:
4258 - version "4.0.3"
4259 - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
4260 - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
4261 -
4262 -y18n@^5.0.5:
4263 - version "5.0.8"
4264 - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
4265 - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
4266 -
4267 -yallist@^4.0.0:
4268 - version "4.0.0"
4269 - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
4270 - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
4271 -
4272 -yargs-parser@^13.1.2:
4273 - version "13.1.2"
4274 - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
4275 - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
4276 - dependencies:
4277 - camelcase "^5.0.0"
4278 - decamelize "^1.2.0"
4279 -
4280 -yargs-parser@^21.0.0, yargs-parser@^21.0.1:
4281 - version "21.1.1"
4282 - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
4283 - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
4284 -
4285 -yargs@17.5.1, yargs@^17.3.1:
4286 - version "17.5.1"
4287 - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e"
4288 - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==
4289 - dependencies:
4290 - cliui "^7.0.2"
4291 - escalade "^3.1.1"
4292 - get-caller-file "^2.0.5"
4293 - require-directory "^2.1.1"
4294 - string-width "^4.2.3"
4295 - y18n "^5.0.5"
4296 - yargs-parser "^21.0.0"
4297 -
4298 -yargs@^13.2.2:
4299 - version "13.3.2"
4300 - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
4301 - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
4302 - dependencies:
4303 - cliui "^5.0.0"
4304 - find-up "^3.0.0"
4305 - get-caller-file "^2.0.1"
4306 - require-directory "^2.1.1"
4307 - require-main-filename "^2.0.0"
4308 - set-blocking "^2.0.0"
4309 - string-width "^3.0.0"
4310 - which-module "^2.0.0"
4311 - y18n "^4.0.0"
4312 - yargs-parser "^13.1.2"
4313 -
4314 -yeast@0.1.2:
4315 - version "0.1.2"
4316 - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"
4317 - integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==
4318 -
4319 -yn@3.1.1:
4320 - version "3.1.1"
4321 - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
4322 - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
4323 -
4324 -yocto-queue@^0.1.0:
4325 - version "0.1.0"
4326 - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
4327 - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==