@saptools/service-flow 0.1.67 → 0.1.69

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 (101) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +27 -9
  3. package/TECHNICAL-NOTE.md +36 -0
  4. package/dist/chunk-3N3B5KHV.js +19596 -0
  5. package/dist/chunk-3N3B5KHV.js.map +1 -0
  6. package/dist/cli.js +2645 -521
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.d.ts +67 -2
  9. package/dist/index.js +1 -1
  10. package/package.json +1 -1
  11. package/src/cli/001-index-summary.ts +22 -0
  12. package/src/cli/003-doctor-package-resolution.ts +68 -0
  13. package/src/cli/doctor.ts +25 -14
  14. package/src/cli.ts +151 -87
  15. package/src/db/000-call-fact-repository.ts +499 -340
  16. package/src/db/001-fact-lifecycle.ts +60 -30
  17. package/src/db/002-fact-json-inventory.ts +169 -0
  18. package/src/db/003-current-fact-semantics.ts +699 -0
  19. package/src/db/004-package-target-invalidation.ts +183 -0
  20. package/src/db/005-schema-structure.ts +201 -0
  21. package/src/db/006-relative-symbol-resolution.ts +464 -0
  22. package/src/db/007-package-fact-semantics.ts +573 -0
  23. package/src/db/008-relative-fact-semantics.ts +210 -0
  24. package/src/db/009-binding-fact-semantics.ts +352 -0
  25. package/src/db/010-package-symbol-surface-semantics.ts +320 -0
  26. package/src/db/011-symbol-call-semantics.ts +144 -0
  27. package/src/db/012-binding-reference-proof.ts +268 -0
  28. package/src/db/013-index-publication-failure.ts +91 -0
  29. package/src/db/014-binding-helper-provenance.ts +17 -0
  30. package/src/db/migrations.ts +16 -3
  31. package/src/db/repositories.ts +130 -6
  32. package/src/db/schema.ts +4 -2
  33. package/src/index.ts +12 -0
  34. package/src/indexer/cds-extension-resolver.ts +27 -3
  35. package/src/indexer/repository-indexer.ts +135 -13
  36. package/src/indexer/workspace-indexer.ts +237 -34
  37. package/src/linker/003-package-import-symbol-resolver.ts +363 -131
  38. package/src/linker/004-event-subscription-handler-linker.ts +34 -11
  39. package/src/linker/005-odata-path-structure.ts +371 -0
  40. package/src/linker/006-event-template-link.ts +72 -0
  41. package/src/linker/007-call-edge-insertion.ts +568 -0
  42. package/src/linker/cross-repo-linker.ts +4 -166
  43. package/src/linker/odata-path-normalizer.ts +273 -180
  44. package/src/linker/service-resolver.ts +197 -77
  45. package/src/parsers/000-direct-query-execution.ts +11 -0
  46. package/src/parsers/002-symbol-import-bindings.ts +516 -0
  47. package/src/parsers/003-package-public-surface.ts +661 -0
  48. package/src/parsers/004-fact-identity.ts +108 -0
  49. package/src/parsers/005-event-subscription-facts.ts +281 -0
  50. package/src/parsers/006-binding-identity.ts +348 -0
  51. package/src/parsers/007-source-fact-reconciliation.ts +105 -0
  52. package/src/parsers/008-package-surface-publication.ts +82 -0
  53. package/src/parsers/009-symbol-call-facts.ts +528 -0
  54. package/src/parsers/010-package-public-surface-analysis.ts +352 -0
  55. package/src/parsers/011-binding-lexical-scope.ts +583 -0
  56. package/src/parsers/012-package-fact-contract.ts +306 -0
  57. package/src/parsers/013-executable-body-eligibility.ts +35 -0
  58. package/src/parsers/014-service-binding-helper-flow.ts +306 -0
  59. package/src/parsers/015-service-binding-collector.ts +693 -0
  60. package/src/parsers/016-local-symbol-reference.ts +261 -0
  61. package/src/parsers/017-symbol-derived-contexts.ts +268 -0
  62. package/src/parsers/018-package-commonjs-syntax.ts +142 -0
  63. package/src/parsers/019-binding-assignment-targets.ts +76 -0
  64. package/src/parsers/020-stable-local-value.ts +217 -0
  65. package/src/parsers/021-binding-visibility.ts +168 -0
  66. package/src/parsers/022-outbound-expression-analysis.ts +700 -0
  67. package/src/parsers/023-outbound-call-classifier.ts +692 -0
  68. package/src/parsers/operation-path-analysis.ts +6 -1
  69. package/src/parsers/outbound-call-parser.ts +162 -512
  70. package/src/parsers/package-json-parser.ts +45 -3
  71. package/src/parsers/service-binding-parser-helpers.ts +86 -15
  72. package/src/parsers/service-binding-parser.ts +147 -597
  73. package/src/parsers/symbol-parser.ts +513 -352
  74. package/src/trace/002-trace-diagnostics.ts +36 -1
  75. package/src/trace/007-implementation-start-diagnostic.ts +1 -0
  76. package/src/trace/011-event-subscriber-traversal.ts +100 -8
  77. package/src/trace/013-trace-root-scopes.ts +2 -3
  78. package/src/trace/014-compact-contract.ts +6 -0
  79. package/src/trace/015-trace-edge-recorder.ts +61 -4
  80. package/src/trace/016-compact-projector.ts +15 -17
  81. package/src/trace/019-trace-edge-semantics.ts +6 -10
  82. package/src/trace/020-compact-field-projection.ts +122 -38
  83. package/src/trace/021-compact-decision-normalization.ts +171 -0
  84. package/src/trace/022-trace-fact-preflight.ts +21 -0
  85. package/src/trace/023-nested-event-scopes.ts +23 -0
  86. package/src/trace/024-compact-observation-decision.ts +81 -0
  87. package/src/trace/025-trace-implementation-scope.ts +123 -0
  88. package/src/trace/026-trace-start-scope.ts +336 -0
  89. package/src/trace/027-trace-scope-execution.ts +566 -0
  90. package/src/trace/028-trace-operation-execution.ts +336 -0
  91. package/src/trace/029-trace-start-implementation.ts +172 -0
  92. package/src/trace/030-event-runtime-resolution.ts +151 -0
  93. package/src/trace/031-local-call-expansion.ts +37 -0
  94. package/src/trace/implementation-hints.ts +9 -6
  95. package/src/trace/selectors.ts +1 -0
  96. package/src/trace/trace-engine.ts +122 -624
  97. package/src/types.ts +57 -0
  98. package/src/utils/001-placeholders.ts +188 -10
  99. package/src/version.ts +1 -1
  100. package/dist/chunk-ZQABU7MR.js +0 -12151
  101. package/dist/chunk-ZQABU7MR.js.map +0 -1
@@ -0,0 +1,464 @@
1
+ import { posix } from 'node:path';
2
+ import type { SymbolCallFact } from '../types.js';
3
+ import { packageModuleRequest } from
4
+ '../parsers/002-symbol-import-bindings.js';
5
+ import type { Db } from './connection.js';
6
+
7
+ export interface RelativeSymbolCallResolution {
8
+ id: number | null;
9
+ status: 'resolved' | 'ambiguous' | 'unresolved';
10
+ reason: string | null;
11
+ strategy: string;
12
+ candidateCount: number;
13
+ eligibleCandidateCount: number;
14
+ candidateSetComplete: boolean;
15
+ resolvedModulePath?: string;
16
+ }
17
+
18
+ interface TargetRow {
19
+ id: number;
20
+ kind: string;
21
+ sourceFile: string;
22
+ exported: boolean;
23
+ evidenceJson: string | null;
24
+ }
25
+
26
+ interface RelativeModuleScope {
27
+ paths: Set<string>;
28
+ ambiguous: boolean;
29
+ }
30
+
31
+ interface MappingTarget {
32
+ specifier?: string;
33
+ }
34
+
35
+ interface MappedExecutableRows {
36
+ rows: TargetRow[];
37
+ ambiguous: boolean;
38
+ packageTargetUnsupported: boolean;
39
+ }
40
+
41
+ const stripExtension = (value: string): string =>
42
+ value.replace(/\.(?:ts|tsx|js|jsx|cds)$/, '');
43
+
44
+ function record(value: unknown): Record<string, unknown> | undefined {
45
+ return value && typeof value === 'object' && !Array.isArray(value)
46
+ ? value as Record<string, unknown>
47
+ : undefined;
48
+ }
49
+
50
+ function parsedRecord(value: string | null): Record<string, unknown> | undefined {
51
+ if (value === null) return undefined;
52
+ try {
53
+ return record(JSON.parse(value) as unknown);
54
+ } catch {
55
+ return undefined;
56
+ }
57
+ }
58
+
59
+ function targetRows(rows: Array<Record<string, unknown>>): TargetRow[] {
60
+ return rows.flatMap((row) =>
61
+ typeof row.id === 'number' && typeof row.kind === 'string'
62
+ && typeof row.sourceFile === 'string'
63
+ && typeof row.exported === 'number'
64
+ ? [{
65
+ id: row.id,
66
+ kind: row.kind,
67
+ sourceFile: row.sourceFile,
68
+ exported: row.exported === 1,
69
+ evidenceJson: typeof row.evidenceJson === 'string'
70
+ ? row.evidenceJson
71
+ : null,
72
+ }]
73
+ : []);
74
+ }
75
+
76
+ function relativeTargets(sourceFile: string, specifier: string): Set<string> {
77
+ const joined = stripExtension(posix.normalize(
78
+ posix.join(posix.dirname(sourceFile), specifier),
79
+ ));
80
+ return new Set([joined, `${joined}/index`]);
81
+ }
82
+
83
+ function relativeModuleScope(
84
+ db: Db,
85
+ repoId: number,
86
+ sourceFile: string,
87
+ specifier: string,
88
+ ): RelativeModuleScope {
89
+ const requested = relativeTargets(sourceFile, specifier);
90
+ const rows = db.prepare(`SELECT relative_path relativePath FROM files
91
+ WHERE repo_id=? ORDER BY relative_path COLLATE BINARY`).all(repoId);
92
+ const matched = rows.flatMap((row) =>
93
+ typeof row.relativePath === 'string'
94
+ && requested.has(stripExtension(row.relativePath))
95
+ ? [stripExtension(row.relativePath)] : []);
96
+ return {
97
+ paths: new Set(matched),
98
+ ambiguous: matched.length > 1,
99
+ };
100
+ }
101
+
102
+ function scopedRows(
103
+ rows: readonly TargetRow[],
104
+ paths: ReadonlySet<string>,
105
+ ): TargetRow[] {
106
+ return rows.filter((row) => paths.has(stripExtension(row.sourceFile)));
107
+ }
108
+
109
+ function bodyEligible(row: TargetRow): boolean {
110
+ const evidence = parsedRecord(row.evidenceJson);
111
+ const direct = record(evidence?.executableBodyEligibility);
112
+ const surface = record(evidence?.packagePublicSurface);
113
+ const packageBody = record(surface?.bodyEligibility);
114
+ const body = direct ?? packageBody;
115
+ return body?.eligible === true && body.reason === 'body_present';
116
+ }
117
+
118
+ function relativeBinding(
119
+ call: SymbolCallFact,
120
+ ): Record<string, unknown> | undefined {
121
+ const binding = record(call.evidence.importBinding);
122
+ return binding?.moduleKind === 'relative'
123
+ && binding.rawModuleSpecifier === call.importSource
124
+ ? binding
125
+ : undefined;
126
+ }
127
+
128
+ function importedHandlerMember(
129
+ call: SymbolCallFact,
130
+ binding = relativeBinding(call),
131
+ ): boolean {
132
+ return call.callRole === 'event_subscribe_handler'
133
+ && binding?.referenceShape === 'static_member'
134
+ && typeof binding.importedName === 'string'
135
+ && binding.requestedPublicName === call.calleeLocalName;
136
+ }
137
+
138
+ function handlerMemberPubliclyCarried(
139
+ row: TargetRow,
140
+ binding: Record<string, unknown>,
141
+ ): boolean {
142
+ if (row.exported) return true;
143
+ const evidence = parsedRecord(row.evidenceJson);
144
+ if (evidence?.source !== 'exported_class_instance_member') return false;
145
+ const exportKind = evidence.exportedClassExportKind;
146
+ if (exportKind !== 'default' && exportKind !== 'named') return false;
147
+ return binding.bindingKind === 'esm_default'
148
+ ? exportKind === 'default'
149
+ : evidence.exportedClass === binding.importedName;
150
+ }
151
+
152
+ function requiresPublicClassMember(
153
+ relation: unknown,
154
+ call: SymbolCallFact,
155
+ binding: Record<string, unknown>,
156
+ ): boolean {
157
+ return relation === 'class_instance_method'
158
+ || importedHandlerMember(call, binding);
159
+ }
160
+
161
+ function resolved(
162
+ row: TargetRow,
163
+ strategy: string,
164
+ candidateCount: number,
165
+ resolvedModulePath: string,
166
+ ): RelativeSymbolCallResolution {
167
+ return {
168
+ id: row.id,
169
+ status: 'resolved',
170
+ reason: null,
171
+ strategy,
172
+ candidateCount,
173
+ eligibleCandidateCount: 1,
174
+ candidateSetComplete: true,
175
+ resolvedModulePath,
176
+ };
177
+ }
178
+
179
+ function unresolved(
180
+ strategy: string,
181
+ reason: string,
182
+ candidateCount: number,
183
+ eligibleCandidateCount = 0,
184
+ candidateSetComplete = true,
185
+ ): RelativeSymbolCallResolution {
186
+ return {
187
+ id: null,
188
+ status: 'unresolved',
189
+ reason,
190
+ strategy,
191
+ candidateCount,
192
+ eligibleCandidateCount,
193
+ candidateSetComplete,
194
+ };
195
+ }
196
+
197
+ function ambiguous(
198
+ strategy: string,
199
+ reason: string,
200
+ candidateCount: number,
201
+ eligibleCandidateCount: number,
202
+ ): RelativeSymbolCallResolution {
203
+ return {
204
+ id: null,
205
+ status: 'ambiguous',
206
+ reason,
207
+ strategy,
208
+ candidateCount,
209
+ eligibleCandidateCount,
210
+ candidateSetComplete: true,
211
+ };
212
+ }
213
+
214
+ function uniqueRows(rows: readonly TargetRow[]): TargetRow[] {
215
+ return [...new Map(rows.map((row) => [row.id, row])).values()]
216
+ .sort((left, right) => left.id - right.id);
217
+ }
218
+
219
+ function executableResolution(
220
+ rows: readonly TargetRow[],
221
+ scoped: readonly TargetRow[],
222
+ modulePath: string | undefined,
223
+ strategy: string,
224
+ ambiguousReason: string,
225
+ ): RelativeSymbolCallResolution {
226
+ const eligible = uniqueRows(scoped.filter(bodyEligible));
227
+ if (eligible.length === 1 && eligible[0] && modulePath)
228
+ return resolved(eligible[0], strategy, rows.length, modulePath);
229
+ if (eligible.length > 1) return ambiguous(
230
+ strategy, ambiguousReason, rows.length, eligible.length,
231
+ );
232
+ return unresolved(
233
+ strategy,
234
+ scoped.length > 0
235
+ ? 'relative_import_requested_module_has_no_executable_body'
236
+ : 'relative_import_requested_module_has_no_target',
237
+ rows.length,
238
+ );
239
+ }
240
+
241
+ function qualifiedRows(
242
+ db: Db,
243
+ repoId: number,
244
+ call: SymbolCallFact,
245
+ ): TargetRow[] {
246
+ return targetRows(db.prepare(`SELECT id,kind,source_file sourceFile,
247
+ exported,evidence_json evidenceJson FROM symbols
248
+ WHERE repo_id=? AND source_file<>? AND qualified_name=?
249
+ ORDER BY id`).all(repoId, call.sourceFile, call.calleeLocalName));
250
+ }
251
+
252
+ function exportedRows(
253
+ db: Db,
254
+ repoId: number,
255
+ call: SymbolCallFact,
256
+ ): TargetRow[] {
257
+ return targetRows(db.prepare(`SELECT id,kind,source_file sourceFile,
258
+ exported,evidence_json evidenceJson FROM symbols
259
+ WHERE repo_id=? AND source_file<>? AND exported=1
260
+ AND (exported_name=? OR name=? OR qualified_name=?)
261
+ ORDER BY id`).all(
262
+ repoId, call.sourceFile,
263
+ call.calleeLocalName, call.calleeLocalName, call.calleeLocalName,
264
+ ));
265
+ }
266
+
267
+ function proxyRows(
268
+ db: Db,
269
+ repoId: number,
270
+ call: SymbolCallFact,
271
+ ): TargetRow[] {
272
+ return targetRows(db.prepare(`SELECT id,kind,source_file sourceFile,
273
+ exported,evidence_json evidenceJson FROM symbols
274
+ WHERE repo_id=? AND source_file<>?
275
+ AND (exported_name=? OR name=? OR qualified_name=?)
276
+ ORDER BY id`).all(
277
+ repoId, call.sourceFile,
278
+ call.calleeLocalName, call.calleeLocalName, call.calleeLocalName,
279
+ ));
280
+ }
281
+
282
+ function mappingTarget(row: TargetRow): MappingTarget | undefined {
283
+ const evidence = parsedRecord(row.evidenceJson);
284
+ if (row.kind !== 'object_alias'
285
+ || evidence?.source !== 'exported_object_shorthand') return undefined;
286
+ const specifier = evidence.targetImportSource;
287
+ return typeof specifier === 'string' ? { specifier } : {};
288
+ }
289
+
290
+ function mappingTargetScope(
291
+ db: Db,
292
+ repoId: number,
293
+ row: TargetRow,
294
+ ): RelativeModuleScope | undefined {
295
+ const target = mappingTarget(row);
296
+ if (!target) return undefined;
297
+ if (!target.specifier)
298
+ return {
299
+ paths: new Set([stripExtension(row.sourceFile)]), ambiguous: false,
300
+ };
301
+ if (packageModuleRequest(target.specifier)) return undefined;
302
+ return relativeModuleScope(db, repoId, row.sourceFile, target.specifier);
303
+ }
304
+
305
+ function mappedExecutableRows(
306
+ db: Db,
307
+ repoId: number,
308
+ rows: readonly TargetRow[],
309
+ aliases: readonly TargetRow[],
310
+ ): MappedExecutableRows {
311
+ const packageTargetUnsupported = aliases.some((alias) => {
312
+ const target = mappingTarget(alias);
313
+ return Boolean(target?.specifier && packageModuleRequest(target.specifier));
314
+ });
315
+ const scopes = aliases.flatMap((alias) => {
316
+ const scope = mappingTargetScope(db, repoId, alias);
317
+ return scope ? [scope] : [];
318
+ });
319
+ if (scopes.some((scope) => scope.ambiguous))
320
+ return { rows: [], ambiguous: true, packageTargetUnsupported };
321
+ const mapped = scopes.flatMap((scope) => {
322
+ return rows.filter((row) =>
323
+ row.kind !== 'object_alias' && bodyEligible(row)
324
+ && scope.paths.has(stripExtension(row.sourceFile)));
325
+ });
326
+ return {
327
+ rows: uniqueRows(mapped), ambiguous: false, packageTargetUnsupported,
328
+ };
329
+ }
330
+
331
+ function proxyResolution(
332
+ db: Db,
333
+ repoId: number,
334
+ rows: readonly TargetRow[],
335
+ scope: RelativeModuleScope,
336
+ ): RelativeSymbolCallResolution {
337
+ const scoped = scopedRows(rows, scope.paths);
338
+ const aliases = scoped.filter((row) => mappingTarget(row));
339
+ const mapped = mappedExecutableRows(db, repoId, rows, aliases);
340
+ if (mapped.ambiguous) return unresolved(
341
+ 'proxy_member_exported_object_map',
342
+ 'relative_import_module_resolution_ambiguous',
343
+ rows.length, 0, false,
344
+ );
345
+ if (mapped.packageTargetUnsupported) return unresolved(
346
+ 'proxy_member_exported_object_map',
347
+ 'relative_import_proxy_alias_targets_package_unsupported',
348
+ rows.length,
349
+ );
350
+ const direct = scoped.filter((row) =>
351
+ row.kind !== 'object_alias' && row.exported && bodyEligible(row));
352
+ const eligible = uniqueRows([
353
+ ...direct,
354
+ ...mapped.rows,
355
+ ]);
356
+ const modulePath = [...scope.paths][0];
357
+ const strategy = aliases.length > 0
358
+ ? 'proxy_member_exported_object_map'
359
+ : 'relative_import_path_disambiguated';
360
+ if (eligible.length === 1 && eligible[0] && modulePath)
361
+ return resolved(eligible[0], strategy, rows.length, modulePath);
362
+ if (eligible.length > 1) return ambiguous(
363
+ 'proxy_member_no_global_name_fallback',
364
+ 'multiple_proxy_targets_in_requested_module',
365
+ rows.length,
366
+ eligible.length,
367
+ );
368
+ return unresolved(
369
+ 'proxy_member_no_global_name_fallback',
370
+ scoped.length > 0
371
+ ? 'relative_import_requested_module_has_no_executable_body'
372
+ : 'relative_import_requested_module_has_no_target',
373
+ rows.length,
374
+ );
375
+ }
376
+
377
+ function resolutionRows(
378
+ db: Db,
379
+ repoId: number,
380
+ call: SymbolCallFact,
381
+ relation: unknown,
382
+ ): TargetRow[] {
383
+ if (relation === 'class_instance_method' || isAccessorCall(relation, call)
384
+ || importedHandlerMember(call))
385
+ return qualifiedRows(
386
+ db, repoId, call,
387
+ );
388
+ if (relation === 'relative_import_proxy_member') return proxyRows(
389
+ db, repoId, call,
390
+ );
391
+ return exportedRows(db, repoId, call);
392
+ }
393
+
394
+ function isAccessorCall(relation: unknown, call: SymbolCallFact): boolean {
395
+ return relation === 'relative_import'
396
+ && call.calleeExpression.includes('().')
397
+ && String(call.calleeLocalName).includes('.');
398
+ }
399
+
400
+ function strategyFor(
401
+ relation: unknown,
402
+ call: SymbolCallFact,
403
+ candidateCount: number,
404
+ ): string {
405
+ if (relation === 'class_instance_method')
406
+ return 'relative_import_class_instance_method';
407
+ if (relation === 'relative_import_namespace_member')
408
+ return 'relative_import_namespace_member';
409
+ if (isAccessorCall(relation, call))
410
+ return 'relative_import_static_accessor_instance_method';
411
+ return candidateCount > 1
412
+ ? 'relative_import_path_disambiguated'
413
+ : 'relative_import_exported_exact';
414
+ }
415
+
416
+ function ambiguousReasonFor(
417
+ relation: unknown,
418
+ call: SymbolCallFact,
419
+ ): string {
420
+ if (relation === 'class_instance_method')
421
+ return 'multiple_relative_class_targets_in_requested_module';
422
+ if (relation === 'relative_import_namespace_member')
423
+ return 'multiple_namespace_targets_in_requested_module';
424
+ return isAccessorCall(relation, call)
425
+ ? 'multiple_accessor_targets_in_requested_module'
426
+ : 'multiple_exported_targets_in_requested_module';
427
+ }
428
+
429
+ export function resolveRelativeSymbolCall(
430
+ db: Db,
431
+ repoId: number,
432
+ call: SymbolCallFact,
433
+ relation: unknown,
434
+ ): RelativeSymbolCallResolution | undefined {
435
+ if (!call.importSource?.startsWith('.')) return undefined;
436
+ const rows = resolutionRows(db, repoId, call, relation);
437
+ const binding = relativeBinding(call);
438
+ const strategy = strategyFor(relation, call, rows.length);
439
+ if (!binding) return unresolved(
440
+ strategy, 'relative_import_provenance_missing', rows.length,
441
+ );
442
+ if (binding.typeOnly === true) return unresolved(
443
+ strategy, 'relative_import_type_only', rows.length,
444
+ );
445
+ const moduleScope = relativeModuleScope(
446
+ db, repoId, call.sourceFile, call.importSource,
447
+ );
448
+ if (moduleScope.ambiguous) return unresolved(
449
+ strategy, 'relative_import_module_resolution_ambiguous',
450
+ rows.length, 0, false,
451
+ );
452
+ if (relation === 'relative_import_proxy_member')
453
+ return proxyResolution(db, repoId, rows, moduleScope);
454
+ const moduleRows = scopedRows(rows, moduleScope.paths);
455
+ const scoped = binding && requiresPublicClassMember(
456
+ relation, call, binding,
457
+ )
458
+ ? moduleRows.filter((row) => handlerMemberPubliclyCarried(row, binding))
459
+ : moduleRows;
460
+ return executableResolution(
461
+ rows, scoped, [...moduleScope.paths][0],
462
+ strategy, ambiguousReasonFor(relation, call),
463
+ );
464
+ }