@suss/extractor 0.35.0 → 0.36.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.
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Effect, MessageBusSemantics, DeployableUnit, CodeUnitKind, RequestSpellingMetadata, BehavioralSummary, TypeShape, Predicate, ValueRef, RenderNode, ProvenanceSlot, BoundaryBinding, WrapperReference, TestMetadata, GraphqlDeclaredContract, ConfidenceInfo, Transition, Gap, Input, Output } from '@suss/behavioral-ir';
1
+ import { BehavioralSummary, Effect, MessageBusSemantics, DeployableUnit, CodeUnitKind, RequestSpellingMetadata, TypeShape, Predicate, ValueRef, BoundaryBinding, RenderNode, ProvenanceSlot, WrapperReference, TestMetadata, GraphqlDeclaredContract, GraphqlMetadata, ConfidenceInfo, Transition, Gap, Input, Output } from '@suss/behavioral-ir';
2
2
  import { z } from 'zod';
3
3
 
4
4
  /**
@@ -22,6 +22,26 @@ interface InputRead {
22
22
  path: string[];
23
23
  }
24
24
 
25
+ /**
26
+ * Environment variables a library reads from its own installed code,
27
+ * where no walk over the project goes. Without them the checker would
28
+ * call a variable in a template unused when the library reads it on
29
+ * every invocation. An adapter writes one marker summary per declared
30
+ * library that some project file imports, and runtime-config pairing
31
+ * checks the markers before it reports a variable as unused.
32
+ */
33
+
34
+ interface LibraryEnvVars {
35
+ /** What the library's import starts with: `@aws-lambda-powertools/`, `aws_lambda_powertools`. */
36
+ module: string;
37
+ /** Prefixes of the variables the library reads, such as `POWERTOOLS_`. */
38
+ prefixes?: string[];
39
+ /** Exact names of the variables the library reads. */
40
+ names?: string[];
41
+ }
42
+ /** The marker for one library, placed at the first project file found importing it. */
43
+ declare function libraryEnvReadMarker(recognition: string, declared: LibraryEnvVars, importer: string): BehavioralSummary;
44
+
25
45
  /**
26
46
  * Reading a function the project wrote in front of a library, before
27
47
  * anything is extracted.
@@ -240,6 +260,11 @@ type DiscoveryMatch = {
240
260
  hookName: string;
241
261
  operationType: "query" | "mutation" | "subscription";
242
262
  }>;
263
+ /** Where a call passes a client of its own instead of the app's: the options argument and the option. */
264
+ clientOption?: {
265
+ argument: number;
266
+ property: string;
267
+ };
243
268
  } | {
244
269
  /**
245
270
  * An imperative Apollo Client call: `client.query({ query })`,
@@ -1422,14 +1447,7 @@ interface PatternPack {
1422
1447
  * before reporting. `module` matches as a prefix, so one entry covers a
1423
1448
  * family like `@aws-lambda-powertools/`.
1424
1449
  */
1425
- libraryEnvVars?: Array<{
1426
- /** Module-specifier prefix the library's imports start with. */
1427
- module: string;
1428
- /** Env-var name prefixes the library reads, e.g. "POWERTOOLS_". */
1429
- prefixes?: string[];
1430
- /** Exact env-var names the library reads. */
1431
- names?: string[];
1432
- }>;
1450
+ libraryEnvVars?: LibraryEnvVars[];
1433
1451
  /**
1434
1452
  * Library wrappers that return the function they were handed. A call to
1435
1453
  * the `name` that `module` exports resolves to its `argument`-th
@@ -1479,13 +1497,14 @@ interface PatternPack {
1479
1497
  * `uriProperty` the option key whose value is the endpoint. The
1480
1498
  * adapter reads every construction in the project and stamps the
1481
1499
  * client on each operation summary when exactly one distinct client
1482
- * exists; two or more distinct clients abstain, since a hook call
1483
- * does not say which one it goes through.
1500
+ * exists; two or more abstain, unless a call passes its own client.
1484
1501
  */
1485
1502
  graphqlClients?: Array<{
1486
1503
  importModule: string;
1487
1504
  importName: string;
1488
1505
  uriProperty: string;
1506
+ /** On a client a call can pass, the option its transport goes in. */
1507
+ linkProperty?: string;
1489
1508
  /**
1490
1509
  * How this constructor's cache option installs a fragment
1491
1510
  * registry, for the library whose client can supply fragment
@@ -1510,8 +1529,9 @@ interface PatternPack {
1510
1529
  * Which service a client talks to, keyed by the endpoint the
1511
1530
  * construction was read with: the uri literal, or the written
1512
1531
  * expression when the value is computed. The value is the provider
1513
- * workspace name. This is deployment knowledge, so it comes from the
1514
- * pack's own per-project config rather than from the library.
1532
+ * workspace name, or the schema file the provider was read from.
1533
+ * This is deployment knowledge, so it comes from the pack's own
1534
+ * per-project config rather than from the library.
1515
1535
  */
1516
1536
  graphqlClientBindings?: Record<string, string>;
1517
1537
  /**
@@ -1525,6 +1545,14 @@ interface PatternPack {
1525
1545
  files: string[];
1526
1546
  workspace: string;
1527
1547
  }>;
1548
+ /**
1549
+ * What happens to an operation whose client no binding or scope ties
1550
+ * to a service, in a project with clients for more than one endpoint.
1551
+ * `unchecked`, the default, lists it as not checked. `pairWithAll`
1552
+ * pairs it with every resolver that serves its fields, and warns that
1553
+ * the match is ambiguous.
1554
+ */
1555
+ graphqlUnboundClients?: "unchecked" | "pairWithAll";
1528
1556
  /**
1529
1557
  * Per-access recognizers, the counterpart to `invocationRecognizers` for
1530
1558
  * values read without a call, such as `process.env.X`. A recognizer is
@@ -1759,6 +1787,8 @@ interface CaseGroup<Cond> {
1759
1787
  *
1760
1788
  * The lowering works `exitKind` out by scanning the statement's own
1761
1789
  * subtree for a return or a throw, skipping every nested function body.
1790
+ * The engine reads `lines` only to say which loop or try each terminal
1791
+ * is written in.
1762
1792
  *
1763
1793
  * `callbacks` is the bodies of the functions this statement passes to
1764
1794
  * calls it makes, when the language treats those as running for the
@@ -1771,6 +1801,15 @@ interface CaseGroup<Cond> {
1771
1801
  interface LoweredStatementParts<Cond> {
1772
1802
  readonly exitKind: ExitKind;
1773
1803
  readonly callbacks?: readonly StatementBlock<Cond>[];
1804
+ /**
1805
+ * The lines a loop or a try is written on, from its first line to the
1806
+ * end of its body. Without them, a branch cannot say which calls in a
1807
+ * loop may have run before its terminal.
1808
+ */
1809
+ readonly lines?: {
1810
+ readonly start: number;
1811
+ readonly end: number;
1812
+ };
1774
1813
  }
1775
1814
  /**
1776
1815
  * One statement in the unit's control flow, already lowered out of the
@@ -1950,6 +1989,31 @@ declare function firstWrittenReading<T>(readings: readonly Reading<T>[]): Chosen
1950
1989
  */
1951
1990
  declare function valueToReadFurtherFrom<T>(reading: Reading<T>): T | null;
1952
1991
 
1992
+ /**
1993
+ * The `groupId` an effect has, which says which call site in its unit
1994
+ * produced it.
1995
+ *
1996
+ * The id says what the effect is and never where its call is written:
1997
+ * the callee, then a hash of everything else the effect records, such as
1998
+ * its class and the shape of what the call passed. Code that moves or is
1999
+ * reformatted keeps its ids, so `inspect --diff` and `check --base` do
2000
+ * not report it as changed. Two call sites in one unit with the same
2001
+ * effect get the same key, so the ones after the first, in source order,
2002
+ * take `#2`, `#3` and so on. The lines stay in the effect's `location`,
2003
+ * which the key leaves out.
2004
+ */
2005
+
2006
+ /** The key for an effect, which has no `groupId` yet. */
2007
+ declare function callSiteKey(effect: Effect): string;
2008
+ /**
2009
+ * The effects of one unit's call sites, given in source order with one
2010
+ * list per site, with each `groupId` a later site repeats numbered. An
2011
+ * entry keeps whatever else an adapter records beside its effect.
2012
+ */
2013
+ declare function numberRepeatedCallSites<T extends {
2014
+ effect: Effect;
2015
+ }>(sites: readonly (readonly T[])[]): T[][];
2016
+
1953
2017
  /**
1954
2018
  * Folds the code registered around a unit, such as middleware, into what
1955
2019
  * the unit does.
@@ -2033,16 +2097,46 @@ declare function stampModules(summaries: readonly BehavioralSummary[], modules:
2033
2097
  * Which branch an effect belongs to.
2034
2098
  *
2035
2099
  * An adapter finds the calls a body makes once, then has to say which
2036
- * of the branches it also found each call runs on. Two facts settle it,
2037
- * and both are already extracted: the guards the call is written under,
2038
- * and where the branch's terminal is in the file. Every adapter that
2039
- * attributes effects to branches reads from here, so they all decide
2040
- * it the same way.
2100
+ * of the branches it also found each call runs on. `firesOn` settles it
2101
+ * from what is already extracted: the guards the call is written under,
2102
+ * the line it is written on, and where the branch's terminal is. Every
2103
+ * adapter attributes effects to branches through it, so they all decide
2104
+ * it the same way, for a plain call and for one a pack recognized.
2041
2105
  *
2042
- * Neither test is enough alone. This package's DESIGN.md shows the two
2043
- * cases where one test on its own gets the branch wrong.
2106
+ * This package's DESIGN.md shows why each test is there, with the cases
2107
+ * where leaving one out puts an effect on the wrong branch.
2044
2108
  */
2045
2109
 
2110
+ /** Where the call or read behind an effect is written. */
2111
+ interface EffectSite {
2112
+ /** The line the statement the call is written in starts on. */
2113
+ line: number;
2114
+ /** The guards the call is written under, spelled the way a branch records its conditions. */
2115
+ preconditions?: readonly RawCondition[] | undefined;
2116
+ /**
2117
+ * For a call in a `finally` or `ensure` body, the first line of the
2118
+ * try it cleans up after. The call runs on every path that entered
2119
+ * that try, including one that returned or threw before reaching it.
2120
+ */
2121
+ cleansUpFrom?: number | undefined;
2122
+ }
2123
+ /** An effect, and where it was written. */
2124
+ interface PlacedEffect<E> {
2125
+ effect: E;
2126
+ site: EffectSite;
2127
+ }
2128
+ /** What the branch test reads off a branch. */
2129
+ type BranchEnding = Pick<RawBranch, "conditions" | "terminal" | "loopAround">;
2130
+ /**
2131
+ * Whether the effect written at `site` can run before `branch` reaches its
2132
+ * terminal. A call in the loop around the terminal may have run on an
2133
+ * earlier pass, whatever its guards say about the last one, so it stays.
2134
+ * Anything else needs a branch that does not contradict its guards, and
2135
+ * has to be written no later than the terminal ends.
2136
+ */
2137
+ declare function firesOn(site: EffectSite, branch: BranchEnding): boolean;
2138
+ /** The effects that can run before the branch reaches its terminal, in the order given. */
2139
+ declare function effectsFiringOn<E>(placed: readonly PlacedEffect<E>[], branch: BranchEnding): E[];
2046
2140
  /**
2047
2141
  * Whether the branch leaves room for every guard on the effect. A guard
2048
2142
  * the branch wrote down the other way around rules the effect out. A
@@ -2111,20 +2205,19 @@ declare function throughHelper(branch: RawBranch, at: {
2111
2205
  * records of field names a branch's `expectedInput` lists.
2112
2206
  */
2113
2207
  declare function mergeReadShapes(a: TypeShape | null, b: TypeShape | null): TypeShape | null;
2114
- /** One call in a caller's body that hands a helper the response, in source order. */
2115
- interface HandOffSite {
2208
+ /**
2209
+ * One call in a caller's body that hands a helper the response, in
2210
+ * source order. A branch reaches it when an effect written there would
2211
+ * fire on the branch.
2212
+ */
2213
+ interface HandOffSite extends EffectSite {
2116
2214
  /** The helper's paths, in the caller's terms. */
2117
2215
  helper: readonly RawBranch[];
2118
- preconditions?: readonly RawCondition[] | undefined;
2119
- /** The line the statement holding the call starts on, which decides whether a branch reaches it. */
2120
- line: number;
2121
2216
  /** The lines the call is written on. */
2122
2217
  at: {
2123
2218
  start: number;
2124
2219
  end: number;
2125
2220
  };
2126
- /** A call in a `finally` runs on every path, even one that left before it. */
2127
- alwaysRuns?: boolean;
2128
2221
  }
2129
2222
  /**
2130
2223
  * The branch split at each hand-off on it, in source order. A path that
@@ -2392,7 +2485,32 @@ interface StructuredPathConditionsResult<Cond, Terminal> {
2392
2485
  byTerminal: Map<Terminal, ConditionInfo<Cond>[][]>;
2393
2486
  /** Condition lists for paths that fall through the end of the body. */
2394
2487
  fallthrough: ConditionInfo<Cond>[][];
2488
+ /** Where each terminal is written, for the terminals inside a loop or a cleanup body. */
2489
+ placement: Map<Terminal, TerminalPlacement>;
2395
2490
  }
2491
+ /** Which loop and which try a terminal is written in, as effect placement reads them. */
2492
+ interface TerminalPlacement {
2493
+ /**
2494
+ * The lines of the outermost loop the terminal is in. Anything else
2495
+ * written in those lines may have run on an earlier pass.
2496
+ */
2497
+ loopAround?: {
2498
+ start: number;
2499
+ end: number;
2500
+ };
2501
+ /**
2502
+ * For a terminal in a `finally` or `ensure` body, the first line of the
2503
+ * outermost try it cleans up after. It runs on every path that got
2504
+ * that far, including one that left the try early.
2505
+ */
2506
+ cleansUpFrom?: number;
2507
+ }
2508
+ type ParentMap<Cond> = ReadonlyMap<StructuredStatement<Cond>, StructuredStatement<Cond> | null>;
2509
+ /**
2510
+ * Which loop and which try each terminal is written in. A lowering that
2511
+ * gave its loops and tries no `lines` gets no placement for them.
2512
+ */
2513
+ declare function placeTerminals<Cond, Terminal>(input: Pick<StructuredPathConditionsInput<Cond, Terminal>, "statements" | "terminalsByStmt">, parentOf?: ParentMap<Cond>): Map<Terminal, TerminalPlacement>;
2396
2514
  /**
2397
2515
  * Work out the conditions on each path, for every StructuredStatement
2398
2516
  * reachable from `input.statements`. Throws `PathBudgetExceeded` when the
@@ -2518,6 +2636,36 @@ type ChildrenOf<T> = (node: T) => readonly T[];
2518
2636
  */
2519
2637
  declare function walkDescendants<T, C>(root: T, carried: C, childrenOf: ChildrenOf<T>, visitor: NodeVisitor<T, C>): void;
2520
2638
 
2639
+ /**
2640
+ * Where each of a body's calls is written, in the terms the branch test
2641
+ * reads: the paths to the statement the call is in, the line that
2642
+ * statement starts on, and the try whose cleanup body it is in.
2643
+ *
2644
+ * The Python and the Ruby adapter ask here once per body. The statements
2645
+ * stand in as the engine's terminals, so one enumeration covers every
2646
+ * call in the body. tree-sitter hands back a new wrapper for a node each
2647
+ * time one is read, so statements are matched by id.
2648
+ */
2649
+
2650
+ /** What an adapter says about its own language for `statementSites`. */
2651
+ interface StatementReading<N extends Identified, Cond> {
2652
+ /** The statement a node is written in, which is what the lowering keys a path on. */
2653
+ statementOf: (node: N) => N | null;
2654
+ /** The body lowered with these statements as its terminals. */
2655
+ lower: (statements: readonly N[]) => Pick<StructuredPathConditionsInput<Cond, N>, "statements" | "terminalsByStmt">;
2656
+ /** The one-based line a node starts on. */
2657
+ firstLine: (node: N) => number;
2658
+ }
2659
+ /** The paths to each node's statement, and the site an effect at the node has. */
2660
+ interface StatementSites<N, Cond> {
2661
+ pathsTo: (node: N) => readonly ConditionInfo<Cond>[][] | undefined;
2662
+ /** The site for an effect at the node, with the guards the caller read for it. */
2663
+ siteOf: (node: N, preconditions: readonly RawCondition[]) => EffectSite;
2664
+ /** The site for an effect at the node, with the guards every path to its statement passes. */
2665
+ plainSiteOf: (node: N) => EffectSite;
2666
+ }
2667
+ declare function statementSites<N extends Identified, Cond>(nodes: readonly N[], reading: StatementReading<N, Cond>): StatementSites<N, Cond>;
2668
+
2521
2669
  /**
2522
2670
  * The project root when nothing declares one.
2523
2671
  *
@@ -2591,6 +2739,39 @@ interface SourceSpelling<L extends WalkEnd> {
2591
2739
  /** Every place a value's walk ended, as distinct value references. */
2592
2740
  declare function sourceRefsOf<L extends WalkEnd>(leaves: readonly L[], spelling: SourceSpelling<L>): ValueRef[];
2593
2741
 
2742
+ /**
2743
+ * Functions a deploy manifest says the platform calls, as a pack finds
2744
+ * them for one source file. A Lambda's `Handler` is one: the template
2745
+ * says which file and which function, and nothing in the code calls it.
2746
+ *
2747
+ * The pack reads the manifest, which is the library's business, and
2748
+ * decides which units the function gets. The adapter finds the
2749
+ * definition by `name`, which is a language rule, and builds each unit
2750
+ * on it, so the call walk starts there. Python and Ruby take packs as
2751
+ * data and use this shape; a TypeScript pack has `discoverUnits` and
2752
+ * finds the function itself.
2753
+ */
2754
+
2755
+ interface DeclaredEntryPoint {
2756
+ /**
2757
+ * The function as the manifest writes it, in the language's own
2758
+ * spelling: `handler` for a function at the top of the file, or
2759
+ * `Billing::Handler.process` for a Ruby class method.
2760
+ */
2761
+ name: string;
2762
+ /** The units to build on that function. One function can be several deployed units. */
2763
+ units: DeclaredEntryUnit[];
2764
+ }
2765
+ interface DeclaredEntryUnit {
2766
+ kind: CodeUnitKind;
2767
+ /** The summary's name. */
2768
+ name: string;
2769
+ binding: BoundaryBinding;
2770
+ deployableUnit: DeployableUnit;
2771
+ /** Merged onto the summary's `metadata`. */
2772
+ metadata?: Record<string, unknown>;
2773
+ }
2774
+
2594
2775
  /**
2595
2776
  * The small surface every language adapter implements, whatever that
2596
2777
  * language's own tooling looks like underneath.
@@ -2951,6 +3132,11 @@ declare const CACHE_DIR_ENV = "SUSS_CACHE_DIR";
2951
3132
  declare function chosenCacheRoot(): string | null;
2952
3133
  /** The extraction cache for the files read under `projectDir`. */
2953
3134
  declare function extractionCacheDirFor(projectDir: string): string;
3135
+ /**
3136
+ * The folder `suss map` writes its page and the summaries behind it to:
3137
+ * `.suss` in the project, or a folder of its own under the chosen root.
3138
+ */
3139
+ declare function mapFolderFor(projectDir: string): string;
2954
3140
  /** The file where the server for `projectDir` says how to reach it. */
2955
3141
  declare function liveRecordFor(projectDir: string): string;
2956
3142
 
@@ -3297,6 +3483,35 @@ interface PackConfigNeed {
3297
3483
  * since it never ran, so the caller passes these in.
3298
3484
  */
3299
3485
  declare function packConfigCheck(needs: ReadonlyArray<PackConfigNeed>): HealthCheck;
3486
+ /**
3487
+ * A path in a pack's config file where nothing exists. `resolved` is the
3488
+ * path the pack was given. `inProject` is the same value read against the
3489
+ * project instead, set only when something exists there, since that is
3490
+ * the path the user most likely meant.
3491
+ */
3492
+ interface PackPathMissing {
3493
+ pack: string;
3494
+ option: string;
3495
+ /** The value as the config file wrote it, or one entry of a list. */
3496
+ value: string;
3497
+ configFile: string;
3498
+ resolved: string;
3499
+ inProject?: string;
3500
+ }
3501
+ /**
3502
+ * What went wrong with a path option and what to do about it, worded
3503
+ * once for the health block and for the run finding `check` reports.
3504
+ */
3505
+ declare function describeMissingPath(missing: PackPathMissing): {
3506
+ problem: string;
3507
+ fix: string;
3508
+ };
3509
+ /**
3510
+ * Path options in a config file that point at nothing. The pack still
3511
+ * runs, and every lookup under such a path comes back empty, so the
3512
+ * summaries look like a project with less in it.
3513
+ */
3514
+ declare function packPathCheck(missing: ReadonlyArray<PackPathMissing>): HealthCheck;
3300
3515
  /**
3301
3516
  * Run every health check over one extraction report and return what
3302
3517
  * fired, grouped by which check caught it.
@@ -3708,6 +3923,8 @@ interface RawTerminal {
3708
3923
  * An invocation argument as the adapter read it. An argument that fits none of
3709
3924
  * these variants, arithmetic for instance, comes through as null instead of
3710
3925
  * being dropped, so a reader still knows how many arguments the call had.
3926
+ * JSON null therefore means the adapter could not read the argument, and a
3927
+ * caller that wrote `null` gets `{ kind: "null" }` instead.
3711
3928
  */
3712
3929
  type EffectArg = {
3713
3930
  kind: "string";
@@ -3718,6 +3935,14 @@ type EffectArg = {
3718
3935
  } | {
3719
3936
  kind: "boolean";
3720
3937
  value: boolean;
3938
+ }
3939
+ /** A literal `null`, Python's `None` or Ruby's `nil`, which a caller passed on purpose. */
3940
+ | {
3941
+ kind: "null";
3942
+ }
3943
+ /** JavaScript's `undefined`, kept apart from `null` because a parameter default replaces only this one. */
3944
+ | {
3945
+ kind: "undefined";
3721
3946
  } | {
3722
3947
  kind: "object";
3723
3948
  fields: Record<string, EffectArg>;
@@ -3749,6 +3974,11 @@ type EffectArg = {
3749
3974
  args: EffectArg[];
3750
3975
  } | null;
3751
3976
  type RawEffect = {
3977
+ location?: {
3978
+ start: number;
3979
+ end: number;
3980
+ };
3981
+ } & ({
3752
3982
  type: "mutation";
3753
3983
  target: string;
3754
3984
  operation: "create" | "update" | "delete";
@@ -3765,7 +3995,7 @@ type RawEffect = {
3765
3995
  } | {
3766
3996
  type: "stateChange";
3767
3997
  variable: string;
3768
- };
3998
+ });
3769
3999
  interface RawBranch {
3770
4000
  conditions: RawCondition[];
3771
4001
  terminal: RawTerminal;
@@ -3781,6 +4011,15 @@ interface RawBranch {
3781
4011
  start: number;
3782
4012
  end: number;
3783
4013
  };
4014
+ /**
4015
+ * The lines of the outermost loop the terminal is written in, when it
4016
+ * is in one. A call anywhere in those lines may have run on an earlier
4017
+ * pass before this path reached the terminal.
4018
+ */
4019
+ loopAround?: {
4020
+ start: number;
4021
+ end: number;
4022
+ };
3784
4023
  isDefault: boolean;
3785
4024
  /** The fields a consumer reads off a response inside this branch. */
3786
4025
  expectedInput?: TypeShape | null;
@@ -3925,6 +4164,8 @@ interface RawCodeStructure {
3925
4164
  requestSpelling?: RequestSpellingMetadata;
3926
4165
  /** What a test pack found about a `test` unit: whether it is skipped, and what it replaces with a mock. */
3927
4166
  test?: TestMetadata;
4167
+ /** A pack's own metadata namespaces, merged onto the summary's `metadata` as given. */
4168
+ packMetadata?: Record<string, unknown>;
3928
4169
  /** The extractor cannot derive this. An adapter that has the SDL and knows
3929
4170
  * which field the resolver serves fills it in. */
3930
4171
  graphqlDeclaredContract?: GraphqlDeclaredContract;
@@ -3940,6 +4181,13 @@ interface RawCodeStructure {
3940
4181
  reference: string;
3941
4182
  reason: string;
3942
4183
  };
4184
+ /** The client the operation's own call passes, when one settled. */
4185
+ graphqlClient?: GraphqlMetadata["client"];
4186
+ /** Why the client the operation's call passes could not be settled. */
4187
+ graphqlUnresolvedClient?: {
4188
+ reference: string;
4189
+ reason: string;
4190
+ };
3943
4191
  /**
3944
4192
  * Which part of the boundary the source does not state, and why. The binding
3945
4193
  * still goes out with that part empty, so the unit pairs with nothing rather
@@ -3989,4 +4237,4 @@ declare function rawConditionToPredicate(c: RawCondition): Predicate;
3989
4237
  declare function effectToIR(effect: RawEffect): Effect;
3990
4238
  declare function paramToInput(param: RawParameter): Input;
3991
4239
 
3992
- export { type AccessRecognizer, type AdapterCodeStamp, type AdapterStamp, type ArgumentParser, type AstCapableOps, type BindingExtraction, type BodyContent, CACHE_DIR_ENV, type CacheAttribution, type CacheDiagnostic, type CacheInput, type CacheLayer, type CacheLookup, type CallOps, type CaseGroup, type ChannelSource, type ChildrenOf, type ChosenReading, type ClassOps, type CodeHasher, type ConditionHandle, type ConditionInfo, type ConditionSource, type ConstructedFrom, type ContractPattern, type DeclaredBinding, type DeclaredBy, type DeclaredMatch, type DeclaredModule, type DeclaredStatusDecorators, type DefaultedReading, type DiscoveredCustomUnit, type DiscoveredSubUnit, type DiscoveredSubUnitParent, type DiscoveryMatch, type DiscoveryPattern, type EffectArg, type EmptyStage, EnclosingNodes, type ExitKind, type ExtractionConfig, type ExtractionReport, type ExtractorOptions, type FailureDelivery, type GlobalPrefixCall, type HandOffSite, type HealthCheck, type HealthViolation, type HelperDeclarations, type HelperSearch, type HelperSink, type HelperValue, IdMap, IdSet, type Identified, type InputMappingPattern, type InputRead, type InvocationRecognizer, type KeepsArms, KeptParses, type LanguageAdapter, type LoweredStatementParts, MAX_ENTRIES, MAX_HELPER_PATHS, MAX_PATHS, MODULE_SURFACE_RECOGNITION, type ModuleInitOptions, type NodeVisitor, type OpsCarrier, type PackConfigNeed, type PackDeclarations, type PackFailure, type PackFunnel, type PackGradient, type PackTally, type ParameterSupplier, type ParsedNode, type PartialPlan, PathBudgetExceeded, type PatternPack, type ProjectHelper, type ProjectHelpers, type RawBranch, type RawCodeStructure, type RawCondition, type RawDeclaredContract, type RawDependencyCall, type RawEffect, type RawParameter, type RawProvenance, type RawTerminal, type Reading, type ReceiverOrigin, type RedirectDelivery, type RedirectOption, type RegistrationHelper, type ResponsePropertyMapping, type ResponsePropertyMeaning, type RootRecord, type RouteVersioning, SKIP_CHILDREN, type SettledModule, type SourceRange, type SourceSpelling, type StatedSlot, type StatementBlock, type StructuredPathConditionsInput, type StructuredPathConditionsResult, type StructuredStatement, type TerminalExtraction, type TerminalMatch, type TerminalPattern, type TestCaseMatch, type Timer, type TimingReport, type TransparentWrapper, type UnitRecord, UnmodeledFlow, type UnsettledName, type ValueEntry, type ValueOps, type VersionPlacement, type WalkEnd, type WrapperMethodRegistration, type WrapperOptionRegistration, type WrapperRegistration, absentReading, ambiguousReading, andThenReading, assembleSummary, assessConfidence, buildUngatedExtractionReport, chosenCacheRoot, commonDirectoryOf, composeWrappers, computeContentHash, computeDistHashFrom, configuredCallOption, createAdapterStamp, createCacheLayer, createCodeHasher, createPackTallies, createTimer, detectGaps, effectToIR, emptyTally, enumerateOrDegrade, enumerateStructuredPaths, evaluatePackHealth, extractionCacheDirFor, extractionConfigStamp, firstWrittenReading, formatPackHealth, guardsHoldOn, helperPathsOnVariables, httpRouteDiscovery, isListedTestFile, liveRecordFor, makeIgnoredDirectory, makeTransitionId, mapReading, markReturnsAsExitCode, matchesTestFileName, mergeReadShapes, moduleInitStructure, moduleOfFile, noopTimer, ownersWhereWritten, packConfigCheck, packGradients, paramToInput, processCodeHasher, projectFileStamp, rawConditionToPredicate, recordPackFailure, redirectDeliveryWhenSet, registrationHelperDiscovery, routeHelperIndex, runDigest, runsBefore, scopeOption, settleModules, sharedGatingConditions, sourceRefsOf, splitAtHandOffs, stampMayMissAWrite, stampModuleImports, stampModules, storageSystemOption, summaryCountsByPack, tallyUnit, terminalToOutput, throughHelper, unreadableReading, unwrapJsonStringify, valueToReadFurtherFrom, walkDescendants, wrapperDiscovery, writtenReading };
4240
+ export { type AccessRecognizer, type AdapterCodeStamp, type AdapterStamp, type ArgumentParser, type AstCapableOps, type BindingExtraction, type BodyContent, type BranchEnding, CACHE_DIR_ENV, type CacheAttribution, type CacheDiagnostic, type CacheInput, type CacheLayer, type CacheLookup, type CallOps, type CaseGroup, type ChannelSource, type ChildrenOf, type ChosenReading, type ClassOps, type CodeHasher, type ConditionHandle, type ConditionInfo, type ConditionSource, type ConstructedFrom, type ContractPattern, type DeclaredBinding, type DeclaredBy, type DeclaredEntryPoint, type DeclaredEntryUnit, type DeclaredMatch, type DeclaredModule, type DeclaredStatusDecorators, type DefaultedReading, type DiscoveredCustomUnit, type DiscoveredSubUnit, type DiscoveredSubUnitParent, type DiscoveryMatch, type DiscoveryPattern, type EffectArg, type EffectSite, type EmptyStage, EnclosingNodes, type ExitKind, type ExtractionConfig, type ExtractionReport, type ExtractorOptions, type FailureDelivery, type GlobalPrefixCall, type HandOffSite, type HealthCheck, type HealthViolation, type HelperDeclarations, type HelperSearch, type HelperSink, type HelperValue, IdMap, IdSet, type Identified, type InputMappingPattern, type InputRead, type InvocationRecognizer, type KeepsArms, KeptParses, type LanguageAdapter, type LibraryEnvVars, type LoweredStatementParts, MAX_ENTRIES, MAX_HELPER_PATHS, MAX_PATHS, MODULE_SURFACE_RECOGNITION, type ModuleInitOptions, type NodeVisitor, type OpsCarrier, type PackConfigNeed, type PackDeclarations, type PackFailure, type PackFunnel, type PackGradient, type PackPathMissing, type PackTally, type ParameterSupplier, type ParsedNode, type PartialPlan, PathBudgetExceeded, type PatternPack, type PlacedEffect, type ProjectHelper, type ProjectHelpers, type RawBranch, type RawCodeStructure, type RawCondition, type RawDeclaredContract, type RawDependencyCall, type RawEffect, type RawParameter, type RawProvenance, type RawTerminal, type Reading, type ReceiverOrigin, type RedirectDelivery, type RedirectOption, type RegistrationHelper, type ResponsePropertyMapping, type ResponsePropertyMeaning, type RootRecord, type RouteVersioning, SKIP_CHILDREN, type SettledModule, type SourceRange, type SourceSpelling, type StatedSlot, type StatementBlock, type StatementReading, type StatementSites, type StructuredPathConditionsInput, type StructuredPathConditionsResult, type StructuredStatement, type TerminalExtraction, type TerminalMatch, type TerminalPattern, type TerminalPlacement, type TestCaseMatch, type Timer, type TimingReport, type TransparentWrapper, type UnitRecord, UnmodeledFlow, type UnsettledName, type ValueEntry, type ValueOps, type VersionPlacement, type WalkEnd, type WrapperMethodRegistration, type WrapperOptionRegistration, type WrapperRegistration, absentReading, ambiguousReading, andThenReading, assembleSummary, assessConfidence, buildUngatedExtractionReport, callSiteKey, chosenCacheRoot, commonDirectoryOf, composeWrappers, computeContentHash, computeDistHashFrom, configuredCallOption, createAdapterStamp, createCacheLayer, createCodeHasher, createPackTallies, createTimer, describeMissingPath, detectGaps, effectToIR, effectsFiringOn, emptyTally, enumerateOrDegrade, enumerateStructuredPaths, evaluatePackHealth, extractionCacheDirFor, extractionConfigStamp, firesOn, firstWrittenReading, formatPackHealth, guardsHoldOn, helperPathsOnVariables, httpRouteDiscovery, isListedTestFile, libraryEnvReadMarker, liveRecordFor, makeIgnoredDirectory, makeTransitionId, mapFolderFor, mapReading, markReturnsAsExitCode, matchesTestFileName, mergeReadShapes, moduleInitStructure, moduleOfFile, noopTimer, numberRepeatedCallSites, ownersWhereWritten, packConfigCheck, packGradients, packPathCheck, paramToInput, placeTerminals, processCodeHasher, projectFileStamp, rawConditionToPredicate, recordPackFailure, redirectDeliveryWhenSet, registrationHelperDiscovery, routeHelperIndex, runDigest, runsBefore, scopeOption, settleModules, sharedGatingConditions, sourceRefsOf, splitAtHandOffs, stampMayMissAWrite, stampModuleImports, stampModules, statementSites, storageSystemOption, summaryCountsByPack, tallyUnit, terminalToOutput, throughHelper, unreadableReading, unwrapJsonStringify, valueToReadFurtherFrom, walkDescendants, wrapperDiscovery, writtenReading };