miniread 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/bin/miniread-snapshot +17 -0
  2. package/dist/core/normalize-code.d.ts +17 -0
  3. package/dist/core/normalize-code.js +35 -0
  4. package/dist/core/stable-naming.d.ts +61 -0
  5. package/dist/core/stable-naming.js +121 -0
  6. package/dist/scripts/evaluate/check-expected-evaluations.js +2 -0
  7. package/dist/scripts/evaluate/check-recommended-snapshot.d.ts +11 -0
  8. package/dist/scripts/evaluate/check-recommended-snapshot.js +53 -0
  9. package/dist/scripts/evaluate/check-snapshots.d.ts +1 -0
  10. package/dist/scripts/evaluate/check-snapshots.js +21 -2
  11. package/dist/scripts/evaluate/transform-content.d.ts +5 -0
  12. package/dist/scripts/evaluate/transform-content.js +23 -13
  13. package/dist/scripts/snapshot/create-snapshot-command.d.ts +9 -0
  14. package/dist/scripts/snapshot/create-snapshot-command.js +32 -0
  15. package/dist/scripts/snapshot/run-snapshot-cli.d.ts +1 -0
  16. package/dist/scripts/snapshot/run-snapshot-cli.js +162 -0
  17. package/dist/scripts/snapshot.d.ts +2 -0
  18. package/dist/scripts/snapshot.js +13 -0
  19. package/dist/transforms/rename-catch-parameters/rename-catch-parameters-transform.js +15 -38
  20. package/dist/transforms/rename-destructured-aliases/rename-destructured-aliases-transform.js +13 -12
  21. package/dist/transforms/rename-event-parameters/process-event-handler-function.d.ts +2 -3
  22. package/dist/transforms/rename-event-parameters/process-event-handler-function.js +13 -9
  23. package/dist/transforms/rename-event-parameters/rename-event-parameters-transform.d.ts +1 -1
  24. package/dist/transforms/rename-event-parameters/rename-event-parameters-transform.js +10 -7
  25. package/dist/transforms/rename-loop-index-variables/rename-loop-index-variables-transform.js +19 -13
  26. package/dist/transforms/rename-promise-executor-parameters/rename-promise-executor-parameters-transform.js +12 -5
  27. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.d.ts +1 -1
  28. package/dist/transforms/rename-timeout-ids/rename-timeout-ids-transform.js +10 -11
  29. package/dist/transforms/rename-use-reference-guards/rename-use-reference-guards-transform.js +10 -11
  30. package/dist/transforms/rename-use-reference-guards-v2/rename-use-reference-guards-v2-transform.d.ts +1 -1
  31. package/dist/transforms/rename-use-reference-guards-v2/rename-use-reference-guards-v2-transform.js +14 -12
  32. package/dist/transforms/transform-registry.js +0 -10
  33. package/package.json +4 -2
  34. package/transform-manifest.json +3 -53
  35. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.d.ts +0 -2
  36. package/dist/transforms/expand-return-sequence/expand-return-sequence-transform.js +0 -91
  37. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.d.ts +0 -3
  38. package/dist/transforms/expand-sequence-expressions/expand-expression-statement-sequence.js +0 -57
  39. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.d.ts +0 -2
  40. package/dist/transforms/expand-sequence-expressions/expand-sequence-expressions-transform.js +0 -34
  41. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.d.ts +0 -3
  42. package/dist/transforms/expand-sequence-expressions/expand-variable-declaration-sequence.js +0 -93
  43. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.d.ts +0 -3
  44. package/dist/transforms/expand-sequence-expressions-v2/expand-expression-statement-sequence.js +0 -55
  45. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.d.ts +0 -3
  46. package/dist/transforms/expand-sequence-expressions-v2/expand-return-sequence.js +0 -86
  47. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.d.ts +0 -2
  48. package/dist/transforms/expand-sequence-expressions-v2/expand-sequence-expressions-v2-transform.js +0 -41
  49. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.d.ts +0 -3
  50. package/dist/transforms/expand-sequence-expressions-v2/expand-variable-declaration-sequence.js +0 -93
  51. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.d.ts +0 -3
  52. package/dist/transforms/expand-sequence-expressions-v3/expand-expression-statement-sequence.js +0 -64
  53. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.d.ts +0 -3
  54. package/dist/transforms/expand-sequence-expressions-v3/expand-return-sequence.js +0 -91
  55. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.d.ts +0 -2
  56. package/dist/transforms/expand-sequence-expressions-v3/expand-sequence-expressions-v3-transform.js +0 -48
  57. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.d.ts +0 -3
  58. package/dist/transforms/expand-sequence-expressions-v3/expand-throw-sequence.js +0 -101
  59. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.d.ts +0 -3
  60. package/dist/transforms/expand-sequence-expressions-v3/expand-variable-declaration-sequence.js +0 -99
  61. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.d.ts +0 -2
  62. package/dist/transforms/expand-throw-sequence/expand-throw-sequence-transform.js +0 -117
  63. package/dist/transforms/rename-binding/get-target-name.d.ts +0 -4
  64. package/dist/transforms/rename-binding/get-target-name.js +0 -25
  65. package/dist/transforms/rename-binding/is-valid-binding-identifier.d.ts +0 -1
  66. package/dist/transforms/rename-binding/is-valid-binding-identifier.js +0 -10
  67. package/dist/transforms/rename-use-reference-guards/get-target-name.d.ts +0 -2
  68. package/dist/transforms/rename-use-reference-guards/get-target-name.js +0 -23
  69. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.d.ts +0 -1
  70. package/dist/transforms/rename-use-reference-guards/is-valid-binding-identifier.js +0 -10
  71. package/dist/transforms/rename-use-reference-guards-v2/get-target-name.d.ts +0 -2
  72. package/dist/transforms/rename-use-reference-guards-v2/get-target-name.js +0 -23
  73. package/dist/transforms/rename-use-reference-guards-v2/is-valid-binding-identifier.d.ts +0 -1
  74. package/dist/transforms/rename-use-reference-guards-v2/is-valid-binding-identifier.js +0 -10
@@ -1,93 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const createExpressionStatement = (expression) => {
6
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
7
- return t.expressionStatement(
8
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
9
- t.cloneNode(expression, true));
10
- };
11
- const createVariableDeclarationStatement = (kind, declarator) => {
12
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
13
- return t.variableDeclaration(kind, [declarator]);
14
- };
15
- const createVariableDeclarator = (id, init) => {
16
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
17
- return t.variableDeclarator(
18
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
19
- t.cloneNode(id, true), init
20
- ? // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
21
- t.cloneNode(init, true)
22
- : undefined);
23
- };
24
- const isSupportedStatementContainer = (path) => {
25
- const parentPath = path.parentPath;
26
- if (!parentPath)
27
- return false;
28
- return (parentPath.isProgram() ||
29
- parentPath.isBlockStatement() ||
30
- parentPath.isSwitchCase());
31
- };
32
- const isDirectiveProloguePosition = (path) => {
33
- const parentPath = path.parentPath;
34
- if (!parentPath)
35
- return false;
36
- if (!parentPath.isProgram() && !parentPath.isBlockStatement())
37
- return false;
38
- const siblings = parentPath.get("body");
39
- if (!Array.isArray(siblings))
40
- return false;
41
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
42
- if (index === -1)
43
- return false;
44
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
45
- const sibling = siblings[bodyIndex];
46
- if (!sibling)
47
- return false;
48
- if (!sibling.isExpressionStatement())
49
- return false;
50
- if (sibling.node.expression.type !== "StringLiteral")
51
- return false;
52
- }
53
- return true;
54
- };
55
- export const tryExpandVariableDeclarationSequenceInitializers = (path) => {
56
- if (!isSupportedStatementContainer(path))
57
- return false;
58
- if (path.node.kind !== "var" && path.node.declarations.length > 1) {
59
- return false;
60
- }
61
- if (isDirectiveProloguePosition(path)) {
62
- const wouldInsertStringLiteral = path.node.declarations.some((declarator) => declarator.init?.type === "SequenceExpression" &&
63
- declarator.init.expressions[0]?.type === "StringLiteral");
64
- if (wouldInsertStringLiteral)
65
- return false;
66
- }
67
- const hasAnySequence = path.node.declarations.some((declarator) => declarator.init?.type === "SequenceExpression" &&
68
- declarator.init.expressions.length >= 2);
69
- if (!hasAnySequence)
70
- return false;
71
- const kind = path.node.kind;
72
- const statements = [];
73
- for (const declarator of path.node.declarations) {
74
- const init = declarator.init;
75
- if (init?.type !== "SequenceExpression") {
76
- statements.push(createVariableDeclarationStatement(kind, declarator));
77
- continue;
78
- }
79
- const leadingExpressions = init.expressions.slice(0, -1);
80
- const lastExpression = init.expressions.at(-1);
81
- if (!lastExpression) {
82
- statements.push(createVariableDeclarationStatement(kind, declarator));
83
- continue;
84
- }
85
- for (const expression of leadingExpressions) {
86
- statements.push(createExpressionStatement(expression));
87
- }
88
- const newDeclarator = createVariableDeclarator(declarator.id, lastExpression);
89
- statements.push(createVariableDeclarationStatement(kind, newDeclarator));
90
- }
91
- path.replaceWithMultiple(statements);
92
- return true;
93
- };
@@ -1,3 +0,0 @@
1
- import type { NodePath } from "@babel/traverse";
2
- import type { ExpressionStatement } from "@babel/types";
3
- export declare const tryExpandExpressionStatementSequence: (path: NodePath<ExpressionStatement>) => boolean;
@@ -1,64 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const isSupportedStatementContainer = (path) => {
6
- const parentPath = path.parentPath;
7
- if (!parentPath)
8
- return false;
9
- return (parentPath.isProgram() ||
10
- parentPath.isBlockStatement() ||
11
- parentPath.isStaticBlock() ||
12
- parentPath.isSwitchCase());
13
- };
14
- const isDirectiveProloguePosition = (path) => {
15
- const parentPath = path.parentPath;
16
- if (parentPath.isBlockStatement()) {
17
- const grandParent = parentPath.parentPath;
18
- if (parentPath.key !== "body")
19
- return false;
20
- if (!grandParent.isFunction())
21
- return false;
22
- }
23
- else if (!parentPath.isProgram()) {
24
- return false;
25
- }
26
- const siblings = parentPath.get("body");
27
- if (!Array.isArray(siblings))
28
- return false;
29
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
30
- if (index === -1)
31
- return false;
32
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
33
- const sibling = siblings[bodyIndex];
34
- if (!sibling)
35
- return false;
36
- if (!sibling.isExpressionStatement())
37
- return false;
38
- if (sibling.node.expression.type !== "StringLiteral")
39
- return false;
40
- }
41
- return true;
42
- };
43
- export const tryExpandExpressionStatementSequence = (path) => {
44
- if (!isSupportedStatementContainer(path))
45
- return false;
46
- const expression = path.node.expression;
47
- if (expression.type !== "SequenceExpression")
48
- return false;
49
- if (expression.expressions.length < 2)
50
- return false;
51
- const firstExpression = expression.expressions[0];
52
- if (firstExpression?.type === "StringLiteral" &&
53
- isDirectiveProloguePosition(path)) {
54
- return false;
55
- }
56
- const statements = expression.expressions.map((expr) => {
57
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
58
- return t.expressionStatement(
59
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
60
- t.cloneNode(expr, true));
61
- });
62
- path.replaceWithMultiple(statements);
63
- return true;
64
- };
@@ -1,3 +0,0 @@
1
- import type { NodePath } from "@babel/traverse";
2
- import type { ReturnStatement } from "@babel/types";
3
- export declare const tryExpandReturnSequence: (path: NodePath<ReturnStatement>) => boolean;
@@ -1,91 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const canReplaceWithMultiple = (path) => {
6
- return path.parentPath.isBlockStatement() || path.parentPath.isSwitchCase();
7
- };
8
- const canWrapInBlock = (path) => {
9
- const parentPath = path.parentPath;
10
- if (parentPath.isIfStatement() &&
11
- (path.key === "consequent" || path.key === "alternate")) {
12
- return true;
13
- }
14
- if ((parentPath.isForStatement() ||
15
- parentPath.isForInStatement() ||
16
- parentPath.isForOfStatement() ||
17
- parentPath.isWhileStatement() ||
18
- parentPath.isDoWhileStatement() ||
19
- parentPath.isWithStatement() ||
20
- parentPath.isLabeledStatement()) &&
21
- path.key === "body") {
22
- return true;
23
- }
24
- return false;
25
- };
26
- const replaceReturnWithStatements = (path, statements) => {
27
- if (canReplaceWithMultiple(path)) {
28
- path.replaceWithMultiple(statements);
29
- return true;
30
- }
31
- if (canWrapInBlock(path)) {
32
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
33
- path.replaceWith(t.blockStatement(statements));
34
- return true;
35
- }
36
- return false;
37
- };
38
- const isDirectiveProloguePosition = (path) => {
39
- if (!path.parentPath.isBlockStatement())
40
- return false;
41
- if (path.parentPath.key !== "body")
42
- return false;
43
- if (!path.parentPath.parentPath.isFunction())
44
- return false;
45
- const siblings = path.parentPath.get("body");
46
- if (!Array.isArray(siblings))
47
- return false;
48
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
49
- if (index === -1)
50
- return false;
51
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
52
- const sibling = siblings[bodyIndex];
53
- if (!sibling)
54
- return false;
55
- if (!sibling.isExpressionStatement())
56
- return false;
57
- if (sibling.node.expression.type !== "StringLiteral")
58
- return false;
59
- }
60
- return true;
61
- };
62
- export const tryExpandReturnSequence = (path) => {
63
- if (!canReplaceWithMultiple(path) && !canWrapInBlock(path))
64
- return false;
65
- const argument = path.node.argument;
66
- if (!argument)
67
- return false;
68
- if (argument.type !== "SequenceExpression")
69
- return false;
70
- if (argument.expressions.length < 2)
71
- return false;
72
- const leadingExpressions = argument.expressions.slice(0, -1);
73
- const lastExpression = argument.expressions.at(-1);
74
- if (!lastExpression)
75
- return false;
76
- const firstExpression = leadingExpressions[0];
77
- if (firstExpression?.type === "StringLiteral" &&
78
- isDirectiveProloguePosition(path)) {
79
- return false;
80
- }
81
- const statements = leadingExpressions.map((expression) => {
82
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
83
- return t.expressionStatement(
84
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
85
- t.cloneNode(expression, true));
86
- });
87
- statements.push(
88
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
89
- t.returnStatement(t.cloneNode(lastExpression, true)));
90
- return replaceReturnWithStatements(path, statements);
91
- };
@@ -1,2 +0,0 @@
1
- import { type Transform } from "../../core/types.js";
2
- export declare const expandSequenceExpressionsV3Transform: Transform;
@@ -1,48 +0,0 @@
1
- import { createRequire } from "node:module";
2
- import { getFilesToProcess, } from "../../core/types.js";
3
- import { tryExpandExpressionStatementSequence } from "./expand-expression-statement-sequence.js";
4
- import { tryExpandReturnSequence } from "./expand-return-sequence.js";
5
- import { tryExpandThrowSequence } from "./expand-throw-sequence.js";
6
- import { tryExpandVariableDeclarationSequenceInitializers } from "./expand-variable-declaration-sequence.js";
7
- const require = createRequire(import.meta.url);
8
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
9
- const traverse = require("@babel/traverse").default;
10
- export const expandSequenceExpressionsV3Transform = {
11
- id: "expand-sequence-expressions-v3",
12
- description: "Expands comma operator sequences in returns, throws, statements, and variable initializers",
13
- scope: "file",
14
- parallelizable: true,
15
- transform(context) {
16
- let nodesVisited = 0;
17
- let transformationsApplied = 0;
18
- for (const fileInfo of getFilesToProcess(context)) {
19
- traverse(fileInfo.ast, {
20
- ReturnStatement(path) {
21
- nodesVisited++;
22
- if (!tryExpandReturnSequence(path))
23
- return;
24
- transformationsApplied += 1;
25
- },
26
- ThrowStatement(path) {
27
- nodesVisited++;
28
- if (!tryExpandThrowSequence(path))
29
- return;
30
- transformationsApplied += 1;
31
- },
32
- ExpressionStatement(path) {
33
- nodesVisited++;
34
- if (!tryExpandExpressionStatementSequence(path))
35
- return;
36
- transformationsApplied += 1;
37
- },
38
- VariableDeclaration(path) {
39
- nodesVisited++;
40
- if (!tryExpandVariableDeclarationSequenceInitializers(path))
41
- return;
42
- transformationsApplied += 1;
43
- },
44
- });
45
- }
46
- return Promise.resolve({ nodesVisited, transformationsApplied });
47
- },
48
- };
@@ -1,3 +0,0 @@
1
- import type { NodePath } from "@babel/traverse";
2
- import type { ThrowStatement } from "@babel/types";
3
- export declare const tryExpandThrowSequence: (path: NodePath<ThrowStatement>) => boolean;
@@ -1,101 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const canReplaceWithMultiple = (path) => {
6
- return (path.parentPath.isProgram() ||
7
- path.parentPath.isBlockStatement() ||
8
- path.parentPath.isStaticBlock() ||
9
- path.parentPath.isSwitchCase());
10
- };
11
- const canWrapInBlock = (path) => {
12
- const parentPath = path.parentPath;
13
- if (parentPath.isIfStatement() &&
14
- (path.key === "consequent" || path.key === "alternate")) {
15
- return true;
16
- }
17
- if ((parentPath.isForStatement() ||
18
- parentPath.isForInStatement() ||
19
- parentPath.isForOfStatement() ||
20
- parentPath.isWhileStatement() ||
21
- parentPath.isDoWhileStatement() ||
22
- parentPath.isWithStatement() ||
23
- parentPath.isLabeledStatement()) &&
24
- path.key === "body") {
25
- return true;
26
- }
27
- return false;
28
- };
29
- const replaceThrowWithStatements = (path, statements) => {
30
- if (canReplaceWithMultiple(path)) {
31
- path.replaceWithMultiple(statements);
32
- return true;
33
- }
34
- if (canWrapInBlock(path)) {
35
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
36
- path.replaceWith(t.blockStatement(statements));
37
- return true;
38
- }
39
- return false;
40
- };
41
- const isDirectiveProloguePosition = (path) => {
42
- const parentPath = path.parentPath;
43
- if (parentPath.isBlockStatement()) {
44
- const grandParent = parentPath.parentPath;
45
- if (parentPath.key !== "body")
46
- return false;
47
- if (!grandParent.isFunction())
48
- return false;
49
- }
50
- else if (!parentPath.isProgram()) {
51
- return false;
52
- }
53
- const siblings = parentPath.get("body");
54
- if (!Array.isArray(siblings))
55
- return false;
56
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
57
- if (index === -1)
58
- return false;
59
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
60
- const sibling = siblings[bodyIndex];
61
- if (!sibling)
62
- return false;
63
- if (!sibling.isExpressionStatement())
64
- return false;
65
- if (sibling.node.expression.type !== "StringLiteral")
66
- return false;
67
- }
68
- return true;
69
- };
70
- export const tryExpandThrowSequence = (path) => {
71
- if (!canReplaceWithMultiple(path) && !canWrapInBlock(path))
72
- return false;
73
- const argument = path.node.argument;
74
- if (argument.type !== "SequenceExpression")
75
- return false;
76
- if (argument.expressions.length < 2)
77
- return false;
78
- const leadingExpressions = argument.expressions.slice(0, -1);
79
- const lastExpression = argument.expressions.at(-1);
80
- if (!lastExpression)
81
- return false;
82
- const firstExpression = leadingExpressions[0];
83
- const shouldWrapFirstStringLiteral = firstExpression?.type === "StringLiteral" &&
84
- isDirectiveProloguePosition(path);
85
- const statements = leadingExpressions.map((expression) => {
86
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
87
- let clonedExpression = t.cloneNode(expression, true);
88
- if (shouldWrapFirstStringLiteral && expression === firstExpression) {
89
- // Prevent inserting a directive prologue statement like `"use strict";`.
90
- // `("use strict");` is not treated as a directive.
91
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
92
- clonedExpression = t.parenthesizedExpression(clonedExpression);
93
- }
94
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
95
- return t.expressionStatement(clonedExpression);
96
- });
97
- statements.push(
98
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
99
- t.throwStatement(t.cloneNode(lastExpression, true)));
100
- return replaceThrowWithStatements(path, statements);
101
- };
@@ -1,3 +0,0 @@
1
- import type { NodePath } from "@babel/traverse";
2
- import type { VariableDeclaration } from "@babel/types";
3
- export declare const tryExpandVariableDeclarationSequenceInitializers: (path: NodePath<VariableDeclaration>) => boolean;
@@ -1,99 +0,0 @@
1
- import { createRequire } from "node:module";
2
- const require = createRequire(import.meta.url);
3
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4
- const t = require("@babel/types");
5
- const createExpressionStatement = (expression) => {
6
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
7
- return t.expressionStatement(
8
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
9
- t.cloneNode(expression, true));
10
- };
11
- const createVariableDeclarationStatement = (kind, declarator) => {
12
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
13
- return t.variableDeclaration(kind, [declarator]);
14
- };
15
- const createVariableDeclarator = (id, init) => {
16
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
17
- return t.variableDeclarator(
18
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
19
- t.cloneNode(id, true), init
20
- ? // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
21
- t.cloneNode(init, true)
22
- : undefined);
23
- };
24
- const isSupportedStatementContainer = (path) => {
25
- const parentPath = path.parentPath;
26
- if (!parentPath)
27
- return false;
28
- return (parentPath.isProgram() ||
29
- parentPath.isBlockStatement() ||
30
- parentPath.isStaticBlock() ||
31
- parentPath.isSwitchCase());
32
- };
33
- const isDirectiveProloguePosition = (path) => {
34
- const parentPath = path.parentPath;
35
- if (!parentPath)
36
- return false;
37
- if (parentPath.isBlockStatement()) {
38
- const grandParent = parentPath.parentPath;
39
- if (parentPath.key !== "body")
40
- return false;
41
- if (!grandParent.isFunction())
42
- return false;
43
- }
44
- else if (!parentPath.isProgram()) {
45
- return false;
46
- }
47
- const siblings = parentPath.get("body");
48
- if (!Array.isArray(siblings))
49
- return false;
50
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
51
- if (index === -1)
52
- return false;
53
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
54
- const sibling = siblings[bodyIndex];
55
- if (!sibling)
56
- return false;
57
- if (!sibling.isExpressionStatement())
58
- return false;
59
- if (sibling.node.expression.type !== "StringLiteral")
60
- return false;
61
- }
62
- return true;
63
- };
64
- export const tryExpandVariableDeclarationSequenceInitializers = (path) => {
65
- if (!isSupportedStatementContainer(path))
66
- return false;
67
- if (isDirectiveProloguePosition(path)) {
68
- const wouldInsertStringLiteral = path.node.declarations.some((declarator) => declarator.init?.type === "SequenceExpression" &&
69
- declarator.init.expressions[0]?.type === "StringLiteral");
70
- if (wouldInsertStringLiteral)
71
- return false;
72
- }
73
- const hasAnySequence = path.node.declarations.some((declarator) => declarator.init?.type === "SequenceExpression" &&
74
- declarator.init.expressions.length >= 2);
75
- if (!hasAnySequence)
76
- return false;
77
- const kind = path.node.kind;
78
- const statements = [];
79
- for (const declarator of path.node.declarations) {
80
- const init = declarator.init;
81
- if (init?.type !== "SequenceExpression") {
82
- statements.push(createVariableDeclarationStatement(kind, declarator));
83
- continue;
84
- }
85
- const leadingExpressions = init.expressions.slice(0, -1);
86
- const lastExpression = init.expressions.at(-1);
87
- if (!lastExpression) {
88
- statements.push(createVariableDeclarationStatement(kind, declarator));
89
- continue;
90
- }
91
- for (const expression of leadingExpressions) {
92
- statements.push(createExpressionStatement(expression));
93
- }
94
- const newDeclarator = createVariableDeclarator(declarator.id, lastExpression);
95
- statements.push(createVariableDeclarationStatement(kind, newDeclarator));
96
- }
97
- path.replaceWithMultiple(statements);
98
- return true;
99
- };
@@ -1,2 +0,0 @@
1
- import { type Transform } from "../../core/types.js";
2
- export declare const expandThrowSequenceTransform: Transform;
@@ -1,117 +0,0 @@
1
- import { createRequire } from "node:module";
2
- import { getFilesToProcess, } from "../../core/types.js";
3
- const require = createRequire(import.meta.url);
4
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
5
- const traverse = require("@babel/traverse").default;
6
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
7
- const t = require("@babel/types");
8
- const canReplaceWithMultiple = (path) => {
9
- return (path.parentPath.isProgram() ||
10
- path.parentPath.isBlockStatement() ||
11
- path.parentPath.isStaticBlock() ||
12
- path.parentPath.isSwitchCase());
13
- };
14
- const canWrapInBlock = (path) => {
15
- const parentPath = path.parentPath;
16
- if (parentPath.isIfStatement() &&
17
- (path.key === "consequent" || path.key === "alternate")) {
18
- return true;
19
- }
20
- if ((parentPath.isForStatement() ||
21
- parentPath.isForInStatement() ||
22
- parentPath.isForOfStatement() ||
23
- parentPath.isWhileStatement() ||
24
- parentPath.isDoWhileStatement() ||
25
- parentPath.isWithStatement() ||
26
- parentPath.isLabeledStatement()) &&
27
- path.key === "body") {
28
- return true;
29
- }
30
- return false;
31
- };
32
- const replaceThrowWithStatements = (path, statements) => {
33
- if (canReplaceWithMultiple(path)) {
34
- path.replaceWithMultiple(statements);
35
- return true;
36
- }
37
- if (canWrapInBlock(path)) {
38
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
39
- path.replaceWith(t.blockStatement(statements));
40
- return true;
41
- }
42
- return false;
43
- };
44
- const isDirectiveProloguePosition = (path) => {
45
- const parentPath = path.parentPath;
46
- if (!parentPath.isProgram() && !parentPath.isBlockStatement())
47
- return false;
48
- const siblings = parentPath.get("body");
49
- if (!Array.isArray(siblings))
50
- return false;
51
- const index = siblings.findIndex((sibling) => sibling.node === path.node);
52
- if (index === -1)
53
- return false;
54
- for (let bodyIndex = 0; bodyIndex < index; bodyIndex++) {
55
- const sibling = siblings[bodyIndex];
56
- if (!sibling)
57
- return false;
58
- if (!sibling.isExpressionStatement())
59
- return false;
60
- if (sibling.node.expression.type !== "StringLiteral")
61
- return false;
62
- }
63
- return true;
64
- };
65
- const tryExpandThrowSequence = (path) => {
66
- if (!canReplaceWithMultiple(path) && !canWrapInBlock(path))
67
- return false;
68
- const argument = path.node.argument;
69
- if (argument.type !== "SequenceExpression")
70
- return false;
71
- if (argument.expressions.length < 2)
72
- return false;
73
- const leadingExpressions = argument.expressions.slice(0, -1);
74
- const lastExpression = argument.expressions.at(-1);
75
- if (!lastExpression)
76
- return false;
77
- const firstExpression = leadingExpressions[0];
78
- const shouldWrapFirstStringLiteral = firstExpression?.type === "StringLiteral" &&
79
- isDirectiveProloguePosition(path);
80
- const statements = leadingExpressions.map((expression) => {
81
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
82
- let clonedExpression = t.cloneNode(expression, true);
83
- if (shouldWrapFirstStringLiteral && expression === firstExpression) {
84
- // Prevent inserting a directive prologue statement like `"use strict";`.
85
- // `("use strict");` is not treated as a directive.
86
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
87
- clonedExpression = t.parenthesizedExpression(clonedExpression);
88
- }
89
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
90
- return t.expressionStatement(clonedExpression);
91
- });
92
- statements.push(
93
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
94
- t.throwStatement(t.cloneNode(lastExpression, true)));
95
- return replaceThrowWithStatements(path, statements);
96
- };
97
- export const expandThrowSequenceTransform = {
98
- id: "expand-throw-sequence",
99
- description: "Expands throw sequences like `throw (a(), b)`",
100
- scope: "file",
101
- parallelizable: true,
102
- transform(context) {
103
- let nodesVisited = 0;
104
- let transformationsApplied = 0;
105
- for (const fileInfo of getFilesToProcess(context)) {
106
- traverse(fileInfo.ast, {
107
- ThrowStatement(path) {
108
- nodesVisited++;
109
- if (!tryExpandThrowSequence(path))
110
- return;
111
- transformationsApplied += 1;
112
- },
113
- });
114
- }
115
- return Promise.resolve({ nodesVisited, transformationsApplied });
116
- },
117
- };
@@ -1,4 +0,0 @@
1
- import type { Binding, Scope } from "@babel/traverse";
2
- export declare const getTargetName: (bindingScope: Scope, binding: Binding, options: {
3
- baseName: string;
4
- }) => string | undefined;