monkeypatchlist 0.0.0-stage → 0.1.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 (221) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +61 -0
  3. package/README.md +183 -2
  4. package/catalog/catalog.json +552211 -0
  5. package/catalog/catalog.schema.json +787 -0
  6. package/catalog/changelog.json +3 -0
  7. package/dist/bin/monkeypatchlist.d.ts +2 -0
  8. package/dist/bin/monkeypatchlist.js +3 -0
  9. package/dist/catalog.d.ts +561 -0
  10. package/dist/catalog.js +58 -0
  11. package/dist/cli.d.ts +84 -0
  12. package/dist/cli.js +470 -0
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.js +1 -0
  15. package/dist/lockfile-input.d.ts +9 -0
  16. package/dist/lockfile-input.js +91 -0
  17. package/dist/packages/analysis/binding.d.ts +2 -0
  18. package/dist/packages/analysis/binding.js +5 -0
  19. package/dist/packages/analysis/index.d.ts +10 -0
  20. package/dist/packages/analysis/index.js +13 -0
  21. package/dist/packages/analysis/job.d.ts +33 -0
  22. package/dist/packages/analysis/job.js +85 -0
  23. package/dist/packages/analysis/lib/absence-tags.d.ts +34 -0
  24. package/dist/packages/analysis/lib/absence-tags.js +340 -0
  25. package/dist/packages/analysis/lib/ast.d.ts +28 -0
  26. package/dist/packages/analysis/lib/ast.js +64 -0
  27. package/dist/packages/analysis/lib/binding.d.ts +36 -0
  28. package/dist/packages/analysis/lib/binding.js +66 -0
  29. package/dist/packages/analysis/lib/budget.d.ts +80 -0
  30. package/dist/packages/analysis/lib/budget.js +31 -0
  31. package/dist/packages/analysis/lib/catch-arms.d.ts +19 -0
  32. package/dist/packages/analysis/lib/catch-arms.js +351 -0
  33. package/dist/packages/analysis/lib/chunk-loads.d.ts +160 -0
  34. package/dist/packages/analysis/lib/chunk-loads.js +882 -0
  35. package/dist/packages/analysis/lib/chunk-registry.d.ts +45 -0
  36. package/dist/packages/analysis/lib/chunk-registry.js +334 -0
  37. package/dist/packages/analysis/lib/code-routes.d.ts +52 -0
  38. package/dist/packages/analysis/lib/code-routes.js +921 -0
  39. package/dist/packages/analysis/lib/collisions.d.ts +22 -0
  40. package/dist/packages/analysis/lib/collisions.js +103 -0
  41. package/dist/packages/analysis/lib/definitions.d.ts +76 -0
  42. package/dist/packages/analysis/lib/definitions.js +782 -0
  43. package/dist/packages/analysis/lib/early-exits.d.ts +39 -0
  44. package/dist/packages/analysis/lib/early-exits.js +161 -0
  45. package/dist/packages/analysis/lib/effect.d.ts +138 -0
  46. package/dist/packages/analysis/lib/effect.js +800 -0
  47. package/dist/packages/analysis/lib/global-object.d.ts +581 -0
  48. package/dist/packages/analysis/lib/global-object.js +8240 -0
  49. package/dist/packages/analysis/lib/keys.d.ts +33 -0
  50. package/dist/packages/analysis/lib/keys.js +82 -0
  51. package/dist/packages/analysis/lib/line-starts.d.ts +41 -0
  52. package/dist/packages/analysis/lib/line-starts.js +79 -0
  53. package/dist/packages/analysis/lib/link-group.d.ts +51 -0
  54. package/dist/packages/analysis/lib/link-group.js +487 -0
  55. package/dist/packages/analysis/lib/module-links.d.ts +117 -0
  56. package/dist/packages/analysis/lib/module-links.js +1060 -0
  57. package/dist/packages/analysis/lib/nested-code.d.ts +38 -0
  58. package/dist/packages/analysis/lib/nested-code.js +200 -0
  59. package/dist/packages/analysis/lib/numeric.d.ts +16 -0
  60. package/dist/packages/analysis/lib/numeric.js +216 -0
  61. package/dist/packages/analysis/lib/once-flags.d.ts +12 -0
  62. package/dist/packages/analysis/lib/once-flags.js +190 -0
  63. package/dist/packages/analysis/lib/parameter-arguments.d.ts +12 -0
  64. package/dist/packages/analysis/lib/parameter-arguments.js +34 -0
  65. package/dist/packages/analysis/lib/parse.d.ts +10 -0
  66. package/dist/packages/analysis/lib/parse.js +39 -0
  67. package/dist/packages/analysis/lib/partial.d.ts +60 -0
  68. package/dist/packages/analysis/lib/partial.js +518 -0
  69. package/dist/packages/analysis/lib/print.d.ts +3 -0
  70. package/dist/packages/analysis/lib/print.js +150 -0
  71. package/dist/packages/analysis/lib/reachability.d.ts +137 -0
  72. package/dist/packages/analysis/lib/reachability.js +1295 -0
  73. package/dist/packages/analysis/lib/resolver.d.ts +13 -0
  74. package/dist/packages/analysis/lib/resolver.js +2886 -0
  75. package/dist/packages/analysis/lib/restores.d.ts +42 -0
  76. package/dist/packages/analysis/lib/restores.js +482 -0
  77. package/dist/packages/analysis/lib/rewritten-deletes.d.ts +6 -0
  78. package/dist/packages/analysis/lib/rewritten-deletes.js +142 -0
  79. package/dist/packages/analysis/lib/scope.d.ts +110 -0
  80. package/dist/packages/analysis/lib/scope.js +443 -0
  81. package/dist/packages/analysis/lib/script-loads.d.ts +56 -0
  82. package/dist/packages/analysis/lib/script-loads.js +359 -0
  83. package/dist/packages/analysis/lib/summaries.d.ts +177 -0
  84. package/dist/packages/analysis/lib/summaries.js +498 -0
  85. package/dist/packages/analysis/lib/types.d.ts +632 -0
  86. package/dist/packages/analysis/lib/types.js +128 -0
  87. package/dist/packages/analysis/lib/wrap.d.ts +34 -0
  88. package/dist/packages/analysis/lib/wrap.js +407 -0
  89. package/dist/packages/analysis/lib/writes.d.ts +358 -0
  90. package/dist/packages/analysis/lib/writes.js +1612 -0
  91. package/dist/packages/analysis/visit-order.d.ts +3 -0
  92. package/dist/packages/analysis/visit-order.js +23 -0
  93. package/dist/packages/attribution/index.d.ts +233 -0
  94. package/dist/packages/attribution/index.js +444 -0
  95. package/dist/packages/attribution/lib/containing-package.d.ts +76 -0
  96. package/dist/packages/attribution/lib/containing-package.js +304 -0
  97. package/dist/packages/attribution/lib/first-party.d.ts +37 -0
  98. package/dist/packages/attribution/lib/first-party.js +153 -0
  99. package/dist/packages/attribution/lib/lockfile-graph.d.ts +99 -0
  100. package/dist/packages/attribution/lib/lockfile-graph.js +158 -0
  101. package/dist/packages/attribution/lib/lockfile.d.ts +33 -0
  102. package/dist/packages/attribution/lib/lockfile.js +330 -0
  103. package/dist/packages/attribution/lib/path-rules.d.ts +29 -0
  104. package/dist/packages/attribution/lib/path-rules.js +84 -0
  105. package/dist/packages/attribution/lib/pnpm.d.ts +4 -0
  106. package/dist/packages/attribution/lib/pnpm.js +133 -0
  107. package/dist/packages/attribution/lib/remote-url.d.ts +7 -0
  108. package/dist/packages/attribution/lib/remote-url.js +24 -0
  109. package/dist/packages/attribution/lib/source-map.d.ts +51 -0
  110. package/dist/packages/attribution/lib/source-map.js +125 -0
  111. package/dist/packages/attribution/lib/yaml.d.ts +9 -0
  112. package/dist/packages/attribution/lib/yaml.js +277 -0
  113. package/dist/packages/attribution/lib/yarn.d.ts +7 -0
  114. package/dist/packages/attribution/lib/yarn.js +227 -0
  115. package/dist/packages/baseline/index.d.ts +45 -0
  116. package/dist/packages/baseline/index.js +41 -0
  117. package/dist/packages/baseline/lib/error.d.ts +15 -0
  118. package/dist/packages/baseline/lib/error.js +25 -0
  119. package/dist/packages/baseline/lib/format.d.ts +49 -0
  120. package/dist/packages/baseline/lib/format.js +22 -0
  121. package/dist/packages/baseline/lib/migrations.d.ts +19 -0
  122. package/dist/packages/baseline/lib/migrations.js +7 -0
  123. package/dist/packages/baseline/lib/previous.d.ts +23 -0
  124. package/dist/packages/baseline/lib/previous.js +64 -0
  125. package/dist/packages/baseline/lib/read.d.ts +39 -0
  126. package/dist/packages/baseline/lib/read.js +219 -0
  127. package/dist/packages/baseline/lib/report.d.ts +25 -0
  128. package/dist/packages/baseline/lib/report.js +104 -0
  129. package/dist/packages/baseline/lib/skew.d.ts +51 -0
  130. package/dist/packages/baseline/lib/skew.js +75 -0
  131. package/dist/packages/compare/index.d.ts +120 -0
  132. package/dist/packages/compare/index.js +274 -0
  133. package/dist/packages/compare/lib/catalog-notes.d.ts +73 -0
  134. package/dist/packages/compare/lib/catalog-notes.js +224 -0
  135. package/dist/packages/completeness/index.d.ts +246 -0
  136. package/dist/packages/completeness/index.js +249 -0
  137. package/dist/packages/confidence/index.d.ts +54 -0
  138. package/dist/packages/confidence/index.js +71 -0
  139. package/dist/packages/config/index.d.ts +107 -0
  140. package/dist/packages/config/index.js +95 -0
  141. package/dist/packages/config/lib/command-line.d.ts +23 -0
  142. package/dist/packages/config/lib/command-line.js +239 -0
  143. package/dist/packages/config/lib/config-file.d.ts +11 -0
  144. package/dist/packages/config/lib/config-file.js +119 -0
  145. package/dist/packages/config/lib/scan-config-id.d.ts +28 -0
  146. package/dist/packages/config/lib/scan-config-id.js +54 -0
  147. package/dist/packages/config/lib/schema.d.ts +2 -0
  148. package/dist/packages/config/lib/schema.js +31 -0
  149. package/dist/packages/config/lib/types.d.ts +64 -0
  150. package/dist/packages/config/lib/types.js +6 -0
  151. package/dist/packages/config/lib/urls.d.ts +6 -0
  152. package/dist/packages/config/lib/urls.js +9 -0
  153. package/dist/packages/discovery/index.d.ts +277 -0
  154. package/dist/packages/discovery/index.js +1950 -0
  155. package/dist/packages/discovery/lib/import-map.d.ts +68 -0
  156. package/dist/packages/discovery/lib/import-map.js +180 -0
  157. package/dist/packages/discovery/lib/requests.d.ts +58 -0
  158. package/dist/packages/discovery/lib/requests.js +591 -0
  159. package/dist/packages/discovery/lib/scopes.d.ts +6 -0
  160. package/dist/packages/discovery/lib/scopes.js +286 -0
  161. package/dist/packages/discovery/lib/source-maps.d.ts +56 -0
  162. package/dist/packages/discovery/lib/source-maps.js +209 -0
  163. package/dist/packages/discovery/lib/swept-code.d.ts +27 -0
  164. package/dist/packages/discovery/lib/swept-code.js +107 -0
  165. package/dist/packages/discovery/lib/syntax.d.ts +17 -0
  166. package/dist/packages/discovery/lib/syntax.js +39 -0
  167. package/dist/packages/findings/index.d.ts +106 -0
  168. package/dist/packages/findings/index.js +254 -0
  169. package/dist/packages/findings/lib/scope.d.ts +38 -0
  170. package/dist/packages/findings/lib/scope.js +110 -0
  171. package/dist/packages/parallel/index.d.ts +2 -0
  172. package/dist/packages/parallel/index.js +5 -0
  173. package/dist/packages/parallel/lib/protocol.d.ts +15 -0
  174. package/dist/packages/parallel/lib/protocol.js +2 -0
  175. package/dist/packages/parallel/lib/runner.d.ts +36 -0
  176. package/dist/packages/parallel/lib/runner.js +96 -0
  177. package/dist/packages/parallel/lib/schedule.d.ts +16 -0
  178. package/dist/packages/parallel/lib/schedule.js +52 -0
  179. package/dist/packages/parallel/lib/worker.d.ts +1 -0
  180. package/dist/packages/parallel/lib/worker.js +18 -0
  181. package/dist/packages/policy/index.d.ts +36 -0
  182. package/dist/packages/policy/index.js +22 -0
  183. package/dist/packages/report/explain.d.ts +26 -0
  184. package/dist/packages/report/explain.js +99 -0
  185. package/dist/packages/report/index.d.ts +210 -0
  186. package/dist/packages/report/index.js +388 -0
  187. package/dist/packages/report/terminal.d.ts +11 -0
  188. package/dist/packages/report/terminal.js +331 -0
  189. package/dist/packages/source-store/fixture.d.ts +22 -0
  190. package/dist/packages/source-store/fixture.js +58 -0
  191. package/dist/packages/source-store/index.d.ts +278 -0
  192. package/dist/packages/source-store/index.js +322 -0
  193. package/dist/packages/source-store/lib/addresses.d.ts +6 -0
  194. package/dist/packages/source-store/lib/addresses.js +91 -0
  195. package/dist/packages/source-store/lib/connection.d.ts +15 -0
  196. package/dist/packages/source-store/lib/connection.js +135 -0
  197. package/dist/packages/source-store/lib/content-types.d.ts +16 -0
  198. package/dist/packages/source-store/lib/content-types.js +75 -0
  199. package/dist/packages/source-store/lib/data-urls.d.ts +10 -0
  200. package/dist/packages/source-store/lib/data-urls.js +85 -0
  201. package/dist/packages/source-store/lib/deadline.d.ts +18 -0
  202. package/dist/packages/source-store/lib/deadline.js +44 -0
  203. package/dist/packages/source-store/lib/exchange.d.ts +29 -0
  204. package/dist/packages/source-store/lib/exchange.js +112 -0
  205. package/dist/packages/source-store/lib/integrity.d.ts +19 -0
  206. package/dist/packages/source-store/lib/integrity.js +86 -0
  207. package/dist/packages/source-store/lib/outcomes.d.ts +12 -0
  208. package/dist/packages/source-store/lib/outcomes.js +22 -0
  209. package/dist/packages/source-store/lib/proxy.d.ts +11 -0
  210. package/dist/packages/source-store/lib/proxy.js +53 -0
  211. package/dist/packages/source-store/lib/session.d.ts +12 -0
  212. package/dist/packages/source-store/lib/session.js +139 -0
  213. package/dist/packages/source-store/lib/urls.d.ts +6 -0
  214. package/dist/packages/source-store/lib/urls.js +15 -0
  215. package/dist/packages/source-store/resolve.d.ts +59 -0
  216. package/dist/packages/source-store/resolve.js +45 -0
  217. package/dist/scan.d.ts +65 -0
  218. package/dist/scan.js +592 -0
  219. package/package.json +95 -4
  220. package/schema/config.schema.json +133 -0
  221. package/schema/report.schema.json +1905 -0
@@ -0,0 +1,22 @@
1
+ import type { Realm, SerializedCatalog } from '../../../catalog.ts';
2
+ import type { LexicalDeclaration, RawOccurrence } from './types.ts';
3
+ /** An occurrence, with the realm of the group that found it. */
4
+ export interface RealmOccurrence {
5
+ realm: Realm;
6
+ occurrence: RawOccurrence;
7
+ }
8
+ /**
9
+ * A classic script's top-level lexical declaration, with its realm, and `id`: the name its artifact's occurrences give
10
+ * it, so that a script's own writes are never checked against its own declarations.
11
+ */
12
+ export interface RealmDeclaration {
13
+ realm: Realm;
14
+ id: string;
15
+ declaration: LexicalDeclaration;
16
+ }
17
+ /**
18
+ * Each occurrence, in the order given, with the scan-wide lexical-name check applied. The result depends only on the
19
+ * set of declarations, never on the order artifacts are listed in: each occurrence's notes are sorted by the declaring
20
+ * artifact and the declaration's place in it.
21
+ */
22
+ export declare function lexicalCollisions(occurrences: readonly RealmOccurrence[], declarations: readonly RealmDeclaration[], catalog: SerializedCatalog): RawOccurrence[];
@@ -0,0 +1,103 @@
1
+ // The scan-wide lexical-name check (§3 Declarations in classic scripts, §9 Mutation confidence). There is no
2
+ // evaluation-order modelling between scripts. Instead, per realm, the top-level `let`, `const` and `class` names of
3
+ // every classic script are collected, and a write in another script that reads one of those names bare keeps its
4
+ // finding with a `note` naming the declaring artifact:
5
+ // - a bare-identifier write of the name (`fetch = w`, `delete fetch`)
6
+ // - a write whose holder chain starts at the name (`Node.prototype.foo = f`, `var P = Promise; P.prototype.x = g`)
7
+ // An assignment to a name another script declares with `const` throws, so it also gets the mutation-confidence reason
8
+ // `const-collision`. Reading a `const` doesn't throw, so a holder chain through one doesn't. A redeclaration across
9
+ // scripts (a `declare` write of the name) is ignored.
10
+ import { mutationConfidence, mutationReasons } from "../../confidence/index.js";
11
+ import { globalHolder } from "./global-object.js";
12
+ /**
13
+ * Each occurrence, in the order given, with the scan-wide lexical-name check applied. The result depends only on the
14
+ * set of declarations, never on the order artifacts are listed in: each occurrence's notes are sorted by the declaring
15
+ * artifact and the declaration's place in it.
16
+ */
17
+ export function lexicalCollisions(occurrences, declarations, catalog) {
18
+ const byName = new Map();
19
+ for (const declared of declarations) {
20
+ const key = JSON.stringify([declared.realm, declared.declaration.name]);
21
+ const found = byName.get(key);
22
+ if (found === undefined)
23
+ byName.set(key, [declared]);
24
+ else
25
+ found.push(declared);
26
+ }
27
+ for (const found of byName.values())
28
+ found.sort(inDeclarationOrder);
29
+ if (byName.size === 0)
30
+ return occurrences.map(({ occurrence }) => occurrence);
31
+ return occurrences.map(({ realm, occurrence }) => {
32
+ // A redeclaration across scripts is ignored.
33
+ if (occurrence.mechanism === 'declare')
34
+ return occurrence;
35
+ const global = globalHolder(catalog, realm);
36
+ let throws;
37
+ let noted = false;
38
+ const trace = [];
39
+ for (const step of occurrence.trace) {
40
+ trace.push(step);
41
+ if (!isBareGlobalRead(step, realm))
42
+ continue;
43
+ const colliding = (byName.get(JSON.stringify([realm, step.name])) ?? []).filter(({ id }) => id !== occurrence.artifact);
44
+ if (colliding.length === 0)
45
+ continue;
46
+ noted = true;
47
+ trace.push(...colliding.map(({ declaration }) => noteStep(declaration)));
48
+ const bareWrite = occurrence.target.name === `${global}.${step.name}`;
49
+ if (bareWrite && occurrence.mechanism === 'assign' && colliding.some(({ declaration }) => declaration.kind === 'const')) {
50
+ throws ??= step.name;
51
+ }
52
+ }
53
+ if (!noted)
54
+ return occurrence;
55
+ if (throws === undefined)
56
+ return { ...occurrence, trace };
57
+ const { target, mutation } = occurrence.confidence;
58
+ return {
59
+ ...occurrence,
60
+ confidence: { target, mutation: mutationConfidence([...mutation.reasons, 'const-collision']) },
61
+ trace: [...trace, constCollisionStep(throws)],
62
+ };
63
+ });
64
+ }
65
+ /** A free name that resolved to no declaration, as the global object's property: a bare name read in global code. */
66
+ function isBareGlobalRead(step, realm) {
67
+ return (step.kind === 'binding' &&
68
+ step.resolution === 'global' &&
69
+ step.form === 'global-property' &&
70
+ step.realm === realm &&
71
+ step.realmInstance === 'current');
72
+ }
73
+ function inDeclarationOrder(a, b) {
74
+ const x = a.declaration;
75
+ const y = b.declaration;
76
+ if (x.artifact !== y.artifact)
77
+ return x.artifact < y.artifact ? -1 : 1;
78
+ if (a.id !== b.id)
79
+ return a.id < b.id ? -1 : 1;
80
+ return x.generated.start - y.generated.start;
81
+ }
82
+ function noteStep({ name, kind, artifact, generated }) {
83
+ return {
84
+ kind: 'note',
85
+ about: 'lexical-collision',
86
+ name,
87
+ declaration: kind,
88
+ artifact,
89
+ generated,
90
+ text: `${artifact} declares \`${name}\` with a top-level \`${kind}\` at ${generated.line}:${generated.column}, so when ` +
91
+ `both scripts load, \`${name}\` here reaches that binding and not the global object's property`,
92
+ };
93
+ }
94
+ function constCollisionStep(name) {
95
+ return {
96
+ kind: 'confidence-reason',
97
+ dimension: 'mutation',
98
+ reason: 'const-collision',
99
+ level: mutationReasons['const-collision'],
100
+ name,
101
+ text: `another classic script in the realm declares \`${name}\` with \`const\`, so assigning it most likely throws`,
102
+ };
103
+ }
@@ -0,0 +1,76 @@
1
+ import { type AstNode } from './ast.ts';
2
+ import { type ScopeRules } from './scope.ts';
3
+ /** A variable: a local declaration's name, or a name bound on the global object (`global`). */
4
+ export interface VariableKey {
5
+ scope: AstNode | 'global';
6
+ name: string;
7
+ }
8
+ /**
9
+ * A definition of a variable: a declarator with an initializer, an assignment, an update, or a `for…in`/`for…of`
10
+ * head. `pattern` destructures `source` to give the variable its value. A definition with no `source` gives a value the
11
+ * syntax doesn't show (`x += 1`, `x++`, a loop head). A logical assignment (`x ||= e`) may keep the value before it.
12
+ */
13
+ export interface Definition {
14
+ /** The declarator, assignment, update or loop head that defines the variable. */
15
+ site: AstNode;
16
+ name: string;
17
+ pattern: AstNode;
18
+ source?: AstNode;
19
+ logical: boolean;
20
+ /**
21
+ * For a compound assignment of an identifier (`x += e`, `x **= e`, but not `||=`, `&&=` or `??=`), the binary
22
+ * expression ECMA-262 evaluates it as: `x op e`, with the assignment's own `x` and `e` as operands.
23
+ */
24
+ compound?: AstNode;
25
+ /**
26
+ * The function, program or instance field initializer whose own code the definition is in, where the walk orders it:
27
+ * a class's static blocks and static field initializers are the code of the function the class is evaluated in.
28
+ */
29
+ owner: AstNode;
30
+ /** Whether `this` at the definition is the script's top-level `this`: no non-arrow function or class code around it. */
31
+ topLevel: boolean;
32
+ }
33
+ /**
34
+ * The definitions that reach a read: `start` when the variable's start value does, and the definitions whose values it
35
+ * may have. `ordered` says whether the walk ordered the read.
36
+ */
37
+ export interface Reaching {
38
+ start: boolean;
39
+ definitions: readonly Definition[];
40
+ ordered: boolean;
41
+ /**
42
+ * The start value and definitions that reach the read only past a lazy init that didn't assign (§5 Resolver
43
+ * capabilities 6), each with the tests their values passed there: only its values that pass every one remain.
44
+ */
45
+ narrowed?: ReadonlyMap<Definition | 'start', readonly Narrowing[]>;
46
+ }
47
+ /**
48
+ * What a lazy init's test lets past without assigning (§5 Resolver capabilities 6): after `if (!k) k = …` only the
49
+ * truthy entry values remain, after `if (k == null) k = …` only the non-nullish ones.
50
+ */
51
+ export type Narrowing = 'truthy' | 'falsy' | 'nullish' | 'notNullish' | 'null' | 'notNull' | 'undefined' | 'notUndefined';
52
+ /** Whether a primitive passes a narrowing's test. */
53
+ export declare function passes(narrowing: Narrowing, value: unknown): boolean;
54
+ export interface Definitions {
55
+ /** The variable an identifier reads or writes, or none when the seam has no declaration for a local name. */
56
+ keyOf(id: AstNode): VariableKey | undefined;
57
+ /** Every definition of a variable in the program, in document order. */
58
+ of(key: VariableKey): readonly Definition[];
59
+ /** The definitions of `key` that reach the read `id`. */
60
+ reaching(id: AstNode, key: VariableKey): Reaching;
61
+ }
62
+ /** Whether an assignment operator is a compound one that reads its target and folds (`+=`, `**=`), not `=` or a logical one. */
63
+ export declare const compoundOperator: (operator: string) => boolean;
64
+ /**
65
+ * The binary expression a compound assignment of an identifier, `x op= e`, evaluates (ECMA-262 13.15.2): `x op e`,
66
+ * spanning the assignment, with its own operand nodes. One per assignment, so it is a stable node to memoize and trace
67
+ * by. Undefined for any other node.
68
+ */
69
+ export declare function compoundOf(site: AstNode): AstNode | undefined;
70
+ /** The function declaration a variable is the name of, when its key is the `id` of one a parameter shadows. */
71
+ export declare const shadowedNameOf: (scope: AstNode | "global") => AstNode | undefined;
72
+ /** Whether a function binds `name` in itself, as a parameter or `arguments`. */
73
+ export declare const bindsOwn: (fn: AstNode, name: string) => boolean;
74
+ export declare function definitionsOf(program: AstNode, scope: ScopeRules): Definitions;
75
+ /** The identifiers a binding or assignment pattern binds, in source order. */
76
+ export declare function identifiersOf(pattern: AstNode): AstNode[];