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==