@skyramp/mcp 0.4.1 → 0.4.2-rc.2
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/build/commands/localDevTestChangesCommand.js +2 -1
- package/build/commands/recommendTestsAndExecuteCommand.js +15 -7
- package/build/commands/testThisEndpointCommand.js +35 -6
- package/build/execution/wrapperConfig.d.ts +56 -0
- package/build/execution/wrapperConfig.js +155 -0
- package/build/index.js +40 -10
- package/build/playwright/blueprintDigest.js +28 -7
- package/build/playwright/registerPlaywrightTools.js +47 -28
- package/build/playwright/traceExportStore.d.ts +22 -0
- package/build/playwright/traceExportStore.js +81 -0
- package/build/playwright/traceRecordingPrompt.js +11 -3
- package/build/prompts/code-reuse.js +118 -49
- package/build/prompts/fix-error-prompt.d.ts +9 -1
- package/build/prompts/fix-error-prompt.js +31 -28
- package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
- package/build/prompts/local-dev/local-dev-plan.js +8 -23
- package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
- package/build/prompts/local-dev/local-dev-prompts.js +31 -4
- package/build/prompts/modularization/integration-test-modularization.js +13 -6
- package/build/prompts/modularization/ui-test-modularization.js +1 -1
- package/build/prompts/personas.js +1 -1
- package/build/prompts/pom-aware-code-reuse.js +7 -9
- package/build/prompts/reuse-hand-off.d.ts +64 -0
- package/build/prompts/reuse-hand-off.js +130 -0
- package/build/prompts/shared-helper-policy.d.ts +124 -2
- package/build/prompts/shared-helper-policy.js +178 -12
- package/build/prompts/startTraceCollectionPrompts.js +1 -1
- package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +7 -8
- package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
- package/build/prompts/sut-setup/shared.d.ts +4 -1
- package/build/prompts/sut-setup/shared.js +6 -4
- package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
- package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
- package/build/prompts/test-maintenance/drift-analysis-prompt.d.ts +16 -8
- package/build/prompts/test-maintenance/drift-analysis-prompt.js +93 -38
- package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
- package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
- package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +8 -5
- package/build/prompts/test-recommendation/recommendationSections.js +19 -8
- package/build/prompts/test-recommendation/recommendationShared.d.ts +1 -1
- package/build/prompts/test-recommendation/recommendationShared.js +0 -1
- package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
- package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
- package/build/prompts/testbot/testbot-prompts.js +133 -63
- package/build/recommendation/answers.js +18 -9
- package/build/recommendation/pullRequestText.js +1 -1
- package/build/recommendation/registerPlan.js +31 -17
- package/build/recommendation/subjectStep.d.ts +8 -10
- package/build/recommendation/subjectStep.js +17 -16
- package/build/recommendation/types.d.ts +71 -17
- package/build/recommendation/types.js +9 -15
- package/build/recommendation/verifierContracts.d.ts +7 -3
- package/build/recommendation/verifierContracts.js +8 -4
- package/build/recommendation/verifiers/changedFile.js +11 -13
- package/build/recommendation/verifiers/citedPath.d.ts +8 -0
- package/build/recommendation/verifiers/citedPath.js +16 -2
- package/build/recommendation/verifiers/coverage.d.ts +2 -2
- package/build/recommendation/verifiers/coverage.js +190 -134
- package/build/recommendation/verifiers/defects.js +56 -16
- package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
- package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
- package/build/recommendation/verifiers/endpointGrounded.js +14 -8
- package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
- package/build/recommendation/verifiers/existingCoverage.js +30 -21
- package/build/recommendation/verifiers/expectedOutcome.js +17 -8
- package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
- package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
- package/build/recommendation/verifiers/issueTraceability.js +64 -7
- package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
- package/build/recommendation/verifiers/reportedCategory.js +9 -4
- package/build/recommendation/verifiers/requirementSourced.js +34 -21
- package/build/recommendation/verifiers/screenRoute.js +15 -10
- package/build/recommendation/verifiers/statedDifference.js +15 -8
- package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
- package/build/resources/analysisResources.js +7 -3
- package/build/resources/progressResource.js +4 -2
- package/build/resources/sutSetupResource.js +20 -2
- package/build/resources/testbotResource.js +19 -1
- package/build/services/AnalyticsService.js +3 -1
- package/build/services/ScenarioGenerationService.js +5 -5
- package/build/services/TestDiscoveryService.js +53 -9
- package/build/services/TestExecutionService.js +63 -21
- package/build/services/TestGenerationService.d.ts +1 -1
- package/build/services/TestGenerationService.js +43 -24
- package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
- package/build/skills/enhanceAssertionsSkill.js +103 -0
- package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
- package/build/skills/fixTestImportErrorsSkill.js +2 -2
- package/build/skills/runTestSkill.d.ts +6 -0
- package/build/skills/runTestSkill.js +17 -0
- package/build/skills/skillFiles.d.ts +38 -0
- package/build/skills/skillFiles.js +94 -0
- package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
- package/build/skills/validateAssertionAlignmentSkill.js +59 -0
- package/build/tool-phases.js +4 -1
- package/build/tools/auth/loginTool.js +3 -1
- package/build/tools/auth/logoutTool.js +3 -1
- package/build/tools/budgetExcuse.d.ts +15 -0
- package/build/tools/budgetExcuse.js +113 -0
- package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
- package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
- package/build/tools/code-refactor/assertion-state.d.ts +1 -1
- package/build/tools/code-refactor/assertion-state.js +1 -1
- package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
- package/build/tools/code-refactor/assertionOperations.js +82 -0
- package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
- package/build/tools/code-refactor/assertionSkillTools.js +86 -0
- package/build/tools/code-refactor/codeReuseTool.js +27 -3
- package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
- package/build/tools/code-refactor/gate-markers.d.ts +51 -0
- package/build/tools/code-refactor/gate-markers.js +95 -0
- package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
- package/build/tools/code-refactor/retrofit-state.js +44 -2
- package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
- package/build/tools/code-refactor/reuse-outcome.js +36 -13
- package/build/tools/code-refactor/reuse-state.d.ts +90 -16
- package/build/tools/code-refactor/reuse-state.js +191 -61
- package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
- package/build/tools/code-refactor/utils-verify-gates.js +269 -30
- package/build/tools/code-refactor/verify-gates.d.ts +15 -1
- package/build/tools/code-refactor/verify-gates.js +36 -4
- package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
- package/build/tools/enrichTestWithMocksTool.js +9 -5
- package/build/tools/executeSkyrampTestTool.d.ts +118 -48
- package/build/tools/executeSkyrampTestTool.js +998 -372
- package/build/tools/execution-video-state.js +1 -1
- package/build/tools/fixErrorTool.js +5 -6
- package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
- package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
- package/build/tools/generate-tests/generateContractRestTool.js +34 -16
- package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
- package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
- package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
- package/build/tools/generate-tests/generateMockRestTool.js +3 -1
- package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
- package/build/tools/generate-tests/generateUIRestTool.js +11 -2
- package/build/tools/generate-tests/loadTestSchema.js +1 -3
- package/build/tools/generate-tests/planGuard.js +6 -3
- package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
- package/build/tools/generate-tests/scenarioLint.js +17 -5
- package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
- package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
- package/build/tools/one-click/oneClickTool.js +3 -1
- package/build/tools/preflightMockCheckTool.js +23 -7
- package/build/tools/submitReportTool.d.ts +51 -12
- package/build/tools/submitReportTool.js +988 -161
- package/build/tools/test-management/actionsTool.js +241 -51
- package/build/tools/test-management/analyzeChangesTool.d.ts +8 -9
- package/build/tools/test-management/analyzeChangesTool.js +127 -68
- package/build/tools/test-management/analyzeTestHealthTool.d.ts +0 -11
- package/build/tools/test-management/analyzeTestHealthTool.js +42 -76
- package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
- package/build/tools/test-management/registerTestPlanTool.js +255 -111
- package/build/tools/test-management/resolveScreenTool.js +33 -9
- package/build/tools/test-management/testsOwedBeforeRun.d.ts +28 -0
- package/build/tools/test-management/testsOwedBeforeRun.js +53 -0
- package/build/tools/trace/startTraceCollectionTool.js +3 -1
- package/build/tools/trace/stopTraceCollectionTool.js +42 -6
- package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
- package/build/tools/verifyTestDependenciesTool.js +54 -0
- package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
- package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
- package/build/types/AssertionOutcome.d.ts +1 -1
- package/build/types/EnhanceType.d.ts +6 -0
- package/build/types/EnhanceType.js +1 -0
- package/build/types/RepositoryAnalysis.d.ts +32 -72
- package/build/types/ReuseOutcome.d.ts +100 -7
- package/build/types/ReuseOutcome.js +16 -0
- package/build/types/StepMethod.js +20 -6
- package/build/types/TestAnalysis.d.ts +10 -2
- package/build/types/TestExecution.d.ts +45 -0
- package/build/types/TestRecommendation.d.ts +1 -1
- package/build/types/TestRecommendation.js +4 -1
- package/build/types/TestTypes.d.ts +16 -0
- package/build/types/TestTypes.js +40 -3
- package/build/types/TestbotPromptOptions.d.ts +9 -1
- package/build/types/TestbotReport.d.ts +45 -9
- package/build/utils/AnalysisStateManager.d.ts +137 -34
- package/build/utils/AnalysisStateManager.js +228 -44
- package/build/utils/assertion-verify/api-shared-lints.js +34 -16
- package/build/utils/assertion-verify/metrics.js +39 -6
- package/build/utils/assertion-verify/ui-lints.js +4 -2
- package/build/utils/branchDiff.js +47 -12
- package/build/utils/canonicalJson.js +3 -1
- package/build/utils/connectionErrors.d.ts +10 -0
- package/build/utils/connectionErrors.js +10 -0
- package/build/utils/dartRouteExtractor.js +36 -7
- package/build/utils/fixAttempts.d.ts +26 -0
- package/build/utils/fixAttempts.js +109 -0
- package/build/utils/frontendSelectors.js +23 -4
- package/build/utils/generatedTestRecord.d.ts +19 -0
- package/build/utils/generatedTestRecord.js +61 -0
- package/build/utils/gitStaging.js +7 -2
- package/build/utils/initAgent.js +26 -6
- package/build/utils/language-helper.js +60 -45
- package/build/utils/pathMatching.js +2 -1
- package/build/utils/pathSignatures.js +6 -2
- package/build/utils/planMatchKeys.d.ts +2 -2
- package/build/utils/planMatchKeys.js +20 -14
- package/build/utils/pom-catalog-parse.js +7 -2
- package/build/utils/pom-scope/import-expansion.js +6 -1
- package/build/utils/pom-scope/index.js +50 -12
- package/build/utils/pom-scope/scoring.js +13 -3
- package/build/utils/pom-scope/selector-extractor.js +16 -3
- package/build/utils/pom-scope/strip.d.ts +8 -0
- package/build/utils/pom-scope/strip.js +238 -0
- package/build/utils/pom-scope/testIdDiscovery.js +14 -2
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
- package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
- package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
- package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
- package/build/utils/pom-verify/bindings.js +5 -1
- package/build/utils/pom-verify/calls.js +9 -2
- package/build/utils/pom-verify/verify.js +27 -5
- package/build/utils/pr-comment-parser.js +20 -7
- package/build/utils/progress.d.ts +1 -1
- package/build/utils/progress.js +1 -1
- package/build/utils/proxy-terminal.d.ts +19 -1
- package/build/utils/proxy-terminal.js +346 -21
- package/build/utils/rebaselineSnapshots.d.ts +1 -1
- package/build/utils/rebaselineSnapshots.js +6 -16
- package/build/utils/removedUiElements.js +1 -1
- package/build/utils/reportLanguage.js +35 -7
- package/build/utils/reportVerification.d.ts +14 -8
- package/build/utils/reportVerification.js +19 -19
- package/build/utils/repositorySlug.d.ts +32 -0
- package/build/utils/repositorySlug.js +77 -0
- package/build/utils/reuseRouting.d.ts +10 -0
- package/build/utils/reuseRouting.js +21 -2
- package/build/utils/runContextGauge.d.ts +27 -0
- package/build/utils/runContextGauge.js +181 -0
- package/build/utils/runSerialized.d.ts +3 -0
- package/build/utils/runSerialized.js +39 -0
- package/build/utils/screenRoutes.js +74 -18
- package/build/utils/skyrampMdContent.d.ts +1 -1
- package/build/utils/skyrampMdContent.js +1 -1
- package/build/utils/skyrampSdkVersion.d.ts +9 -0
- package/build/utils/skyrampSdkVersion.js +16 -0
- package/build/utils/sourceRouteExtractor.js +13 -6
- package/build/utils/telemetry.d.ts +1 -0
- package/build/utils/telemetry.js +8 -5
- package/build/utils/testDependencyPolicy.d.ts +9 -0
- package/build/utils/testDependencyPolicy.js +809 -0
- package/build/utils/testExecutionRecord.d.ts +94 -0
- package/build/utils/testExecutionRecord.js +269 -0
- package/build/utils/testFileClassification.d.ts +8 -0
- package/build/utils/testFileClassification.js +39 -4
- package/build/utils/trace-parser.js +62 -14
- package/build/utils/urlPath.js +3 -1
- package/build/utils/utils-verify/action-key.d.ts +46 -0
- package/build/utils/utils-verify/action-key.js +120 -38
- package/build/utils/utils-verify/action-sites.d.ts +32 -0
- package/build/utils/utils-verify/action-sites.js +202 -0
- package/build/utils/utils-verify/allow.d.ts +122 -3
- package/build/utils/utils-verify/allow.js +146 -21
- package/build/utils/utils-verify/body-reach.d.ts +120 -0
- package/build/utils/utils-verify/body-reach.js +333 -0
- package/build/utils/utils-verify/call-sites.d.ts +31 -7
- package/build/utils/utils-verify/call-sites.js +80 -13
- package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
- package/build/utils/utils-verify/delivered-imports.js +84 -0
- package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
- package/build/utils/utils-verify/fixed-sleep.js +461 -0
- package/build/utils/utils-verify/in-house.d.ts +93 -0
- package/build/utils/utils-verify/in-house.js +719 -0
- package/build/utils/utils-verify/incumbent.d.ts +3 -0
- package/build/utils/utils-verify/incumbent.js +75 -0
- package/build/utils/utils-verify/index.d.ts +2 -0
- package/build/utils/utils-verify/index.js +2 -0
- package/build/utils/utils-verify/language-spec.d.ts +51 -10
- package/build/utils/utils-verify/language-spec.js +232 -21
- package/build/utils/utils-verify/locate.d.ts +26 -0
- package/build/utils/utils-verify/locate.js +125 -23
- package/build/utils/utils-verify/module-name.d.ts +40 -0
- package/build/utils/utils-verify/module-name.js +98 -0
- package/build/utils/utils-verify/parse.d.ts +56 -7
- package/build/utils/utils-verify/parse.js +195 -40
- package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
- package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
- package/build/utils/utils-verify/stage.d.ts +5 -0
- package/build/utils/utils-verify/stage.js +47 -2
- package/build/utils/utils-verify/status-once.d.ts +62 -0
- package/build/utils/utils-verify/status-once.js +207 -0
- package/build/utils/utils-verify/typecheck.d.ts +61 -0
- package/build/utils/utils-verify/typecheck.js +338 -0
- package/build/utils/utils-verify/verify.d.ts +79 -3
- package/build/utils/utils-verify/verify.js +531 -61
- package/build/utils/versions.d.ts +3 -3
- package/build/utils/versions.js +1 -1
- package/build/utils/workspaceAuth.js +107 -37
- package/build/workspace/queryParamResolution.js +11 -4
- package/build/workspace/workspace.d.ts +72 -52
- package/build/workspace/workspace.js +19 -15
- package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
- package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
- package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
- package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
- package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
- package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
- package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
- package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
- package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
- package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
- package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
- package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
- package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
- package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
- package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
- package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
- package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
- package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
- package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
- package/node_modules/playwright/package.json +2 -2
- package/package.json +7 -6
- package/plugin/prompts/code-reuse/hand-off.md +30 -0
- package/plugin/prompts/generate-tests/generation.md +1 -1
- package/plugin/prompts/plan-tests.md +14 -14
- package/plugin/prompts/testbot-task1.md +2 -2
- package/plugin/skills/enhance-assertions/SKILL.md +25 -0
- package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
- package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
- package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
- package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
- package/plugin/skills/fix-test-import-errors/SKILL.md +45 -50
- package/plugin/skills/run-test/SKILL.md +16 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
- package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
- package/build/adapters/jestAdapter.d.ts +0 -14
- package/build/adapters/jestAdapter.js +0 -113
- package/build/adapters/mochaAdapter.d.ts +0 -13
- package/build/adapters/mochaAdapter.js +0 -87
- package/build/adapters/playwrightAdapter.d.ts +0 -17
- package/build/adapters/playwrightAdapter.js +0 -182
- package/build/adapters/pytestAdapter.d.ts +0 -15
- package/build/adapters/pytestAdapter.js +0 -108
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
- package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
- package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
- package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
- package/build/tools/runExistingTestsTool.d.ts +0 -138
- package/build/tools/runExistingTestsTool.js +0 -644
- package/build/types/ExternalTestExecution.d.ts +0 -67
- package/build/types/ExternalTestExecution.js +0 -8
- package/build/workspace/testSuites.d.ts +0 -20
- package/build/workspace/testSuites.js +0 -17
- package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
|
@@ -1,20 +1,69 @@
|
|
|
1
1
|
import { blankStrings } from "./parse.js";
|
|
2
|
+
import { commentSpans } from "../pom-scope/strip.js";
|
|
2
3
|
/** Kinds that only ever advise. Kept OUT of UtilsViolationKind so that type keeps
|
|
3
4
|
* meaning "a kind the allow grammar and the gate know about" — an advisory can
|
|
4
5
|
* never fail a verify and never needs (or accepts) an allow marker. */
|
|
5
6
|
export const UTILS_ADVISORY_KINDS = [
|
|
6
|
-
"
|
|
7
|
+
"unusable-parameter-type",
|
|
8
|
+
/** A shared helper waits for a DURATION rather than for a condition: a
|
|
9
|
+
* `waitForTimeout`, a `time.sleep`, a promise-wrapped `setTimeout` — or one of
|
|
10
|
+
* those as the backoff of a retry loop, where an iteration count hides the real
|
|
11
|
+
* cost. Every test that imports the helper inherits the wait, and the call site
|
|
12
|
+
* cannot see it. ADVISORY for its first cohort: the case for blocking rested on
|
|
13
|
+
* the predicate being narrow enough that a false hit was unlikely, and review
|
|
14
|
+
* falsified that three times — a helper NAMED `sleep`, a parameter shadowing the
|
|
15
|
+
* name, and a bare call no import binds. The convergence lever is the prompt,
|
|
16
|
+
* which states this rule in BROWSER_HELPERS' structuralNoise; the gate measures
|
|
17
|
+
* what the prompt leaves. Promote once a cohort has counted the false-hit rate
|
|
18
|
+
* instead of estimating it. See fixed-sleep.ts. */
|
|
19
|
+
"fixed-sleep",
|
|
20
|
+
/** A shared module this run CREATED under a name other than the one the reuse
|
|
21
|
+
* prompt prescribes for its language, while that name was free. Two runs on one
|
|
22
|
+
* repository then write two modules for one role and never meet. ADVISORY for its
|
|
23
|
+
* first cohort: the convergence lever is the prompt, which states the rule, and
|
|
24
|
+
* four of the six findings this rule's review produced were false BLOCKS — so the
|
|
25
|
+
* false-hit rate is measured here before it is argued. Promote once a cohort has
|
|
26
|
+
* counted it, on the same advisory-first policy as `fixed-sleep`. A module HEAD
|
|
27
|
+
* already holds is never judged either way: renaming it breaks callers this run
|
|
28
|
+
* cannot see. See module-name.ts. */
|
|
29
|
+
"module-name",
|
|
30
|
+
/** A shared API helper that reaches its own request body through TWO parameters at
|
|
31
|
+
* once: a whole-body parameter, and an override parameter passed straight through.
|
|
32
|
+
* The override can change nothing the body parameter cannot, so the second is a
|
|
33
|
+
* choice no rule makes — which is how two runs wrote the same helper with
|
|
34
|
+
* different arities. Advisory for the same reason as `module-name` and `fixed-sleep`,
|
|
35
|
+
* and it carried three of that review's four false blocks. See bodyReachedTwice. */
|
|
36
|
+
"duplicate-body-reach",
|
|
7
37
|
/** Two browser helpers perform one action sequence (see actionKeyOf) — the
|
|
8
38
|
* browser analogue of `duplicate-helper`. Advisory, not blocking: the key is a
|
|
9
39
|
* heuristic over selector literals, and a false positive on a customer's first
|
|
10
40
|
* run is the worse outcome. */
|
|
11
41
|
"duplicate-action",
|
|
42
|
+
/** A compiler error present only under the repository's own tsconfig settings
|
|
43
|
+
* (`noImplicitAny`, `strictNullChecks`, …). Whether that tsconfig is the one the
|
|
44
|
+
* customer's build runs is their call, so this advises where `type-error` blocks. */
|
|
45
|
+
"tsconfig-type-error",
|
|
46
|
+
/** A name the compiler could not find (`process`, `describe`, `Promise`). Its
|
|
47
|
+
* declarations come from a package the repository installs or from its `lib`
|
|
48
|
+
* setting, neither of which the run can see — the testbot never installs the
|
|
49
|
+
* repository's dependencies — so the customer's own `tsc` may accept it. Advised,
|
|
50
|
+
* never blocked: a block here made an agent rewrite `process.env` into a
|
|
51
|
+
* `globalThis` cast to get past the gate. */
|
|
52
|
+
"ambient-type-error",
|
|
53
|
+
/** A helper this run added to one of the repository's own modules performs an
|
|
54
|
+
* action sequence a helper already in that module performs — the duplicate the
|
|
55
|
+
* extension exists to avoid, now inside the customer's file. Advisory for the
|
|
56
|
+
* same reason as `duplicate-action`: the key is read from selector literals. */
|
|
57
|
+
"in-house-duplicate",
|
|
12
58
|
];
|
|
13
59
|
export const MARKERABLE_UTILS_KINDS = [
|
|
60
|
+
"frozen-body",
|
|
14
61
|
"duplicate-helper",
|
|
15
62
|
"body-assertion",
|
|
16
63
|
"scenario-name",
|
|
17
64
|
"assertion-loss",
|
|
65
|
+
"status-default",
|
|
66
|
+
"status-restated",
|
|
18
67
|
];
|
|
19
68
|
/**
|
|
20
69
|
* The documented-decline marker for a utils-file invariant, written in the utils file:
|
|
@@ -33,40 +82,115 @@ export const MARKERABLE_UTILS_KINDS = [
|
|
|
33
82
|
* paste-ready line from the failure text when it was pasted unedited: publishing the
|
|
34
83
|
* placeholder as the stated reason is worse than no marker.
|
|
35
84
|
*/
|
|
36
|
-
const ALLOW_RE = new RegExp(`reuse-verify:\\s*allow\\s+(${MARKERABLE_UTILS_KINDS.join("|")})\\s+([A-Za-z_$][\\w$]*)\\s*(?:[—–]+|\\s+-+\\s+)\\s*(?!<reason)(\\S.*?)\\s*$`);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
85
|
+
export const ALLOW_RE = new RegExp(`reuse-verify:\\s*allow\\s+(${MARKERABLE_UTILS_KINDS.join("|")})\\s+([A-Za-z_$][\\w$]*)\\s*(?:[—–]+|\\s+-+\\s+)\\s*(?!<reason)(\\S.*?)\\s*$`);
|
|
86
|
+
/** Anything that announces a decline in this grammar, well-formed or not. Exported
|
|
87
|
+
* so the delivery-time strip recognises the grammar from its one declaration here
|
|
88
|
+
* rather than re-spelling it. */
|
|
89
|
+
export const ALLOW_LOOSE_RE = /reuse-verify:\s*allow\b/;
|
|
90
|
+
/** A marker at the START of what a comment says — either grammar. Anchored, because
|
|
91
|
+
* the own-line rule is about what the comment opens with, not what it contains. */
|
|
92
|
+
const MARKER_START_RE = /^(?:reuse-verify:\s*allow\b|kept inline:)/;
|
|
93
|
+
/** THIS grammar at the start of what a comment says. `reuse-verify: allow` is not a
|
|
94
|
+
* phrase a customer writes, so an own-line comment opening with it is gate-addressed
|
|
95
|
+
* whatever follows — the delivery strip removes it without being able to READ it.
|
|
96
|
+
* `kept inline:` cannot claim that: it opens ordinary English too. */
|
|
97
|
+
export const ALLOW_START_RE = /^reuse-verify:\s*allow\b/;
|
|
98
|
+
/** A marker's SHAPE, whatever kind it names: the announcement, then a subject, then
|
|
99
|
+
* the separator and a reason. Ordinary prose that merely opens with the phrase — `//
|
|
100
|
+
* kept inline: this loop is kept inline for performance` — carries no separator and
|
|
101
|
+
* is not matched. Used where a line must be recognised as gate-addressed without the
|
|
102
|
+
* grammar being able to READ it: an advisory kind is inert by design, so the verify
|
|
103
|
+
* pass passes it and the comment would otherwise ship. */
|
|
104
|
+
export const MARKER_SHAPE_RE = /^(?:reuse-verify:\s*allow\s+\S+\s+\S+|kept inline:\s*\S+)\s*(?:[—–]+|\s+-+\s+)\s*\S/;
|
|
105
|
+
/** Former spellings of an advisory kind. Nothing emits them, but a utils file
|
|
106
|
+
* delivered before the kind was renamed — and before the delivery strip of
|
|
107
|
+
* 2026-09-15 removed such lines — can still carry one, and a second run on that
|
|
108
|
+
* repository must not refuse over a line that was inert when it shipped. */
|
|
109
|
+
const LEGACY_ADVISORY_MARKER_KINDS = ["untyped-parameter"];
|
|
110
|
+
/** A marker naming an advisory kind, current or former — inert, never malformed
|
|
111
|
+
* (see parseUtilsAllows). */
|
|
112
|
+
const ADVISORY_MARKER_RE = new RegExp(`allow\\s+(?:${[...UTILS_ADVISORY_KINDS, ...LEGACY_ADVISORY_MARKER_KINDS].join("|")})\\b`);
|
|
40
113
|
/** The exact line to paste for a violation — what the failure text hands the agent. */
|
|
41
114
|
export function allowMarkerLine(spec, kind, helper) {
|
|
42
115
|
return `${spec.commentPrefix} reuse-verify: allow ${kind} ${helper} — <reason this helper must stay as it is>`;
|
|
43
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The marker text, when the marker's comment OWNS its line: whitespace, the comment
|
|
119
|
+
* prefix, then the marker and nothing else.
|
|
120
|
+
*
|
|
121
|
+
* One placement, because it is the one both gates instruct and the only one that can
|
|
122
|
+
* be removed from a delivered file by deleting a line. A marker after code, inside a
|
|
123
|
+
* block comment or on a JSDoc continuation is reported as malformed instead — the
|
|
124
|
+
* decline is never dropped in silence, and the failure text gives back the line to
|
|
125
|
+
* paste in its place.
|
|
126
|
+
*
|
|
127
|
+
* A line whose first characters are the comment prefix cannot be a regex literal or a
|
|
128
|
+
* trailing comment, so this needs no lexer beyond the blanked strings. It cannot tell
|
|
129
|
+
* whether the prefix OPENS anything, though — inside `/* … *\/` a `//` opens nothing,
|
|
130
|
+
* the block does — so the caller settles that with `lineCommentOpeners` first. The
|
|
131
|
+
* parser asked the text while the strip asked the lexer, and a marker in a block
|
|
132
|
+
* comment was then read as a decline that the strip could not remove: the fault was
|
|
133
|
+
* authorised and the note shipped.
|
|
134
|
+
*/
|
|
135
|
+
export function markerOnOwnLine(raw, code, prefix) {
|
|
136
|
+
// Judged on the RAW line, not on the blanked copy. A blanked string leaves its
|
|
137
|
+
// quotes but loses its contents, so `"use strict" // kept inline: …` read as a line
|
|
138
|
+
// that opens with a comment — and the strip deleted the directive with it.
|
|
139
|
+
const trimmed = raw.trimStart();
|
|
140
|
+
if (!trimmed.startsWith(prefix))
|
|
141
|
+
return undefined;
|
|
142
|
+
// The comment must open the line AND the marker must open the comment. Otherwise
|
|
143
|
+
// `// Customer note; // kept inline: …` is one comment whose line the strip would
|
|
144
|
+
// delete, prose and all.
|
|
145
|
+
const body = trimmed.slice(prefix.length).trimStart();
|
|
146
|
+
return MARKER_START_RE.test(body) ? trimmed : undefined;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Line indices whose first non-space characters OPEN a line comment.
|
|
150
|
+
*
|
|
151
|
+
* `undefined` where the language has no block comment: every line with the prefix at
|
|
152
|
+
* its head opens one, and the caller needs no check. Stated ONCE, because the parser
|
|
153
|
+
* and the delivery strip must not disagree about which lines are comments — when they
|
|
154
|
+
* did, one authorised a decline the other refused to remove.
|
|
155
|
+
*/
|
|
156
|
+
export function lineCommentOpeners(content, prefix) {
|
|
157
|
+
if (prefix !== "//")
|
|
158
|
+
return undefined;
|
|
159
|
+
const starts = new Set(commentSpans(content).map((c) => c.start));
|
|
160
|
+
const opens = new Set();
|
|
161
|
+
let offset = 0;
|
|
162
|
+
content.split("\n").forEach((raw, n) => {
|
|
163
|
+
const indent = raw.length - raw.trimStart().length;
|
|
164
|
+
if (starts.has(offset + indent))
|
|
165
|
+
opens.add(n);
|
|
166
|
+
offset += raw.length + 1;
|
|
167
|
+
});
|
|
168
|
+
return opens;
|
|
169
|
+
}
|
|
44
170
|
export function parseUtilsAllows(content, spec) {
|
|
45
171
|
const allows = [];
|
|
46
172
|
const malformed = [];
|
|
47
|
-
// String contents are blanked first, so a marker
|
|
48
|
-
//
|
|
173
|
+
// String contents are blanked first, so a marker quoted in code — or inside a Python
|
|
174
|
+
// docstring — can neither be read as a decline nor look like a comment.
|
|
49
175
|
const rawLines = content.split("\n");
|
|
50
176
|
const codeLines = blankStrings(content, spec).split("\n");
|
|
177
|
+
const opens = lineCommentOpeners(content, spec.commentPrefix);
|
|
51
178
|
for (let n = 0; n < rawLines.length; n++) {
|
|
52
179
|
const raw = rawLines[n];
|
|
53
180
|
const code = codeLines[n] ?? "";
|
|
54
|
-
|
|
55
|
-
// comment form. Match from the marker itself, so the comment syntax around it does
|
|
56
|
-
// not decide whether a decline is read.
|
|
57
|
-
const at = code.search(ALLOW_LOOSE_RE);
|
|
58
|
-
if (at === -1)
|
|
181
|
+
if (!ALLOW_LOOSE_RE.test(code))
|
|
59
182
|
continue;
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
183
|
+
const line = opens && !opens.has(n)
|
|
184
|
+
? undefined
|
|
185
|
+
: markerOnOwnLine(raw, code, spec.commentPrefix);
|
|
186
|
+
if (line === undefined) {
|
|
187
|
+
// PLACEMENT is reported for every kind, the advisory kinds included. The
|
|
188
|
+
// advisory exemption says a kind never blocks; it does not say a marker may sit
|
|
189
|
+
// anywhere. Exempting placement too left a trailing advisory that the verify
|
|
190
|
+
// passed and the delivery strip could not remove — so the comment shipped.
|
|
191
|
+
malformed.push(raw.trim());
|
|
65
192
|
continue;
|
|
66
|
-
|
|
67
|
-
.slice(at)
|
|
68
|
-
.replace(/\s*\*\/\s*$/, "")
|
|
69
|
-
.trim();
|
|
193
|
+
}
|
|
70
194
|
const m = ALLOW_RE.exec(line);
|
|
71
195
|
if (!m) {
|
|
72
196
|
// A marker naming an advisory kind is inert, not malformed: advisories never
|
|
@@ -81,6 +205,7 @@ export function parseUtilsAllows(content, spec) {
|
|
|
81
205
|
kind: m[1],
|
|
82
206
|
helper: m[2],
|
|
83
207
|
reason: m[3],
|
|
208
|
+
line: n + 1,
|
|
84
209
|
});
|
|
85
210
|
}
|
|
86
211
|
return { allows, malformed };
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { UtilsLanguageSpec } from "./language-spec.js";
|
|
2
|
+
import { type SiblingFile } from "./call-sites.js";
|
|
3
|
+
/**
|
|
4
|
+
* A shared helper whose request body no parameter of its signature reaches, beside a
|
|
5
|
+
* spec that defines its OWN helper for the same route.
|
|
6
|
+
*
|
|
7
|
+
* The two halves together are the fault. A body the helper holds is not wrong on its
|
|
8
|
+
* own — on a first run there is one caller and its body is the right default. It
|
|
9
|
+
* becomes wrong the moment a second caller needs a different body, and the visible
|
|
10
|
+
* sign of that is a spec writing its own helper for a route the shared module already
|
|
11
|
+
* wraps. The advisory that names inline call sites cannot see this pair: it refuses a
|
|
12
|
+
* site whose payload the helper cannot send, which is exactly the site this looks for.
|
|
13
|
+
*/
|
|
14
|
+
export interface UnreachableBody {
|
|
15
|
+
/** The shared helper whose body is out of reach. */
|
|
16
|
+
helper: string;
|
|
17
|
+
/** Absolute path of the utils file that defines `helper`. */
|
|
18
|
+
utilsFile: string;
|
|
19
|
+
method: string;
|
|
20
|
+
/** The path as the helper writes it. */
|
|
21
|
+
path: string;
|
|
22
|
+
/** Absolute path of the spec that defines its own helper for the same route. */
|
|
23
|
+
rivalFile: string;
|
|
24
|
+
/** That spec's own helper — the caller the shared helper could not carry. */
|
|
25
|
+
rivalHelper: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The TOP-LEVEL options of a request call, as `name -> value text`.
|
|
29
|
+
*
|
|
30
|
+
* Both SDK spellings: the keyword arguments of `send_request(url=…, body=…)`, and the
|
|
31
|
+
* properties of the single object `sendRequest({ url: …, body })` takes. A shorthand
|
|
32
|
+
* property's value is its own name, which is what makes it a shorthand.
|
|
33
|
+
*
|
|
34
|
+
* Top-level is the whole point, and a regex could not hold it. Reading `body` or
|
|
35
|
+
* `data_override` anywhere in the call text made an option's value run to the first
|
|
36
|
+
* `)` — so an argument written AFTER the override joined its value — and made a name
|
|
37
|
+
* of the same spelling nested inside ANOTHER option read as the SDK's own, which
|
|
38
|
+
* blocks a delivery over something that is not there.
|
|
39
|
+
*
|
|
40
|
+
* Not `signatureParams`: that reads a parameter list, does not unwrap the object the
|
|
41
|
+
* TypeScript SDK takes, and expects text whose strings its caller already blanked.
|
|
42
|
+
* Here the call is raw — a path literal can carry a comma or a brace — so the
|
|
43
|
+
* structure is walked on a blanked copy and each value is cut from the original.
|
|
44
|
+
*/
|
|
45
|
+
export declare function requestOptions(call: string): Map<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* The request's `body` option, as the text of its value, or `undefined` when the call
|
|
48
|
+
* sends no body.
|
|
49
|
+
*
|
|
50
|
+
* `shared-helper-policy` prescribes the object SHORTHAND as the canonical TypeScript
|
|
51
|
+
* form of body-form 2 — `updateOrder(client, orderId, body = DEFAULT_ORDER_BODY)`
|
|
52
|
+
* calling `sendRequest({ ..., body })` — so a reader that saw only `body:` judged the
|
|
53
|
+
* helper the prompt TEACHES as sending no body at all.
|
|
54
|
+
*/
|
|
55
|
+
export declare function bodyArgument(call: string): string | undefined;
|
|
56
|
+
/** The request's override option, as the text of its value. Either spelling. */
|
|
57
|
+
export declare function overrideArgument(call: string): string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Whether a caller can change what this request sends, through the helper's signature.
|
|
60
|
+
*
|
|
61
|
+
* The question is whether the body DERIVES from a parameter, not which mechanism
|
|
62
|
+
* carried it there. Naming the mechanisms would answer the shapes already seen and
|
|
63
|
+
* mis-judge the next one: the body as the parameter, an override map, and a local
|
|
64
|
+
* template with the parameters interpolated into it are three ways to reach the same
|
|
65
|
+
* property, and there is no reason to think they are the last three.
|
|
66
|
+
*
|
|
67
|
+
* FAILS OPEN — this feeds a blocking gate, so every answer it cannot establish is
|
|
68
|
+
* `true`. A request with no body has nothing to reach; a signature it cannot read is
|
|
69
|
+
* not judged. Only a body it can see, built from no parameter at all, is false.
|
|
70
|
+
*
|
|
71
|
+
* `before` is the helper text that precedes the request call. A body passed by name
|
|
72
|
+
* is resolved there: generated code assigns the template immediately above the call,
|
|
73
|
+
* so a parameter that reaches the body appears between that assignment and the call.
|
|
74
|
+
*/
|
|
75
|
+
export declare function bodyReachable(call: string, params: string[] | undefined, before?: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* The override parameter of a helper that reaches its own request body TWICE: once
|
|
78
|
+
* through a body parameter, and again through an override argument passed straight
|
|
79
|
+
* from the signature. `undefined` when the helper reaches its body through at most
|
|
80
|
+
* one of them.
|
|
81
|
+
*
|
|
82
|
+
* The prompt already states the rule — two body forms are offered and the helper
|
|
83
|
+
* takes "the FIRST one that reaches everything the callers need" — and nothing
|
|
84
|
+
* checked it. A body parameter reaches every property of the request body, so an
|
|
85
|
+
* override beside it can change nothing it cannot; carrying both is the hedge a run
|
|
86
|
+
* writes when no rule decides, and it is what made demoshop's `create_order` arity 5
|
|
87
|
+
* in one run and 4 in the other (testplan-run-9).
|
|
88
|
+
*
|
|
89
|
+
* The body must BE a parameter — form 2 as the policy states it. A body built at the
|
|
90
|
+
* call out of a parameter reaches only the properties it names, so an override beside
|
|
91
|
+
* it carries what the parameter cannot and the two are not one mechanism twice.
|
|
92
|
+
*
|
|
93
|
+
* The override must be a BARE PASS-THROUGH — the parameter and nothing else, a
|
|
94
|
+
* `or {}` / `?? {}` fallback aside. An override that BUILDS a map carries values the
|
|
95
|
+
* body parameter's default does not, which is the prompt's form 1 working; that is
|
|
96
|
+
* the shape a unique-suffix helper delivers, and it is not this fault.
|
|
97
|
+
*
|
|
98
|
+
* Reads the request call alone, never a body resolved from an assignment above it:
|
|
99
|
+
* this feeds a blocking gate, and the direct form is the one that cannot be read two
|
|
100
|
+
* ways.
|
|
101
|
+
*/
|
|
102
|
+
export declare function bodyReachedTwice(call: string, params: string[] | undefined): string | undefined;
|
|
103
|
+
/** A helper reaching its request body through two parameters. */
|
|
104
|
+
export interface DuplicateBodyReach {
|
|
105
|
+
helper: string;
|
|
106
|
+
/** Absolute path of the utils file that defines it. */
|
|
107
|
+
utilsFile: string;
|
|
108
|
+
/** 1-based line of the definition. */
|
|
109
|
+
line: number;
|
|
110
|
+
/** The override parameter the body parameter makes redundant. */
|
|
111
|
+
override: string;
|
|
112
|
+
}
|
|
113
|
+
/** Every helper in the located modules that reaches its request body twice. Never
|
|
114
|
+
* throws; a file it cannot read contributes nothing. */
|
|
115
|
+
export declare function findDuplicateBodyReach(utilsFiles: string[], spec: UtilsLanguageSpec): Promise<DuplicateBodyReach[]>;
|
|
116
|
+
/**
|
|
117
|
+
* Shared helpers whose body no parameter reaches, each paired with a sibling spec
|
|
118
|
+
* that defines its own helper for the same route. Never throws; fails open to [].
|
|
119
|
+
*/
|
|
120
|
+
export declare function findUnreachableBodies(testFile: string, utilsFiles: string[], spec: UtilsLanguageSpec, preReadSiblings?: SiblingFile[]): Promise<UnreachableBody[]>;
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import { localHelpersOf, paramName, parseUtilsFile, signatureParams, } from "./parse.js";
|
|
3
|
+
import { callText, generatedSiblings, REQUEST_CALL_RE, } from "./call-sites.js";
|
|
4
|
+
/** Words a fallback idiom spells that name no value: `x or {}`, `x ?? {}`,
|
|
5
|
+
* `x if x else None`. What remains after them is what the override actually sends. */
|
|
6
|
+
const OVERRIDE_FILLER = new Set([
|
|
7
|
+
"or",
|
|
8
|
+
"and",
|
|
9
|
+
"if",
|
|
10
|
+
"else",
|
|
11
|
+
"None",
|
|
12
|
+
"null",
|
|
13
|
+
"undefined",
|
|
14
|
+
"True",
|
|
15
|
+
"False",
|
|
16
|
+
"true",
|
|
17
|
+
"false",
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* The TOP-LEVEL options of a request call, as `name -> value text`.
|
|
21
|
+
*
|
|
22
|
+
* Both SDK spellings: the keyword arguments of `send_request(url=…, body=…)`, and the
|
|
23
|
+
* properties of the single object `sendRequest({ url: …, body })` takes. A shorthand
|
|
24
|
+
* property's value is its own name, which is what makes it a shorthand.
|
|
25
|
+
*
|
|
26
|
+
* Top-level is the whole point, and a regex could not hold it. Reading `body` or
|
|
27
|
+
* `data_override` anywhere in the call text made an option's value run to the first
|
|
28
|
+
* `)` — so an argument written AFTER the override joined its value — and made a name
|
|
29
|
+
* of the same spelling nested inside ANOTHER option read as the SDK's own, which
|
|
30
|
+
* blocks a delivery over something that is not there.
|
|
31
|
+
*
|
|
32
|
+
* Not `signatureParams`: that reads a parameter list, does not unwrap the object the
|
|
33
|
+
* TypeScript SDK takes, and expects text whose strings its caller already blanked.
|
|
34
|
+
* Here the call is raw — a path literal can carry a comma or a brace — so the
|
|
35
|
+
* structure is walked on a blanked copy and each value is cut from the original.
|
|
36
|
+
*/
|
|
37
|
+
export function requestOptions(call) {
|
|
38
|
+
const out = new Map();
|
|
39
|
+
const inert = blankStringContents(call);
|
|
40
|
+
let from = inert.indexOf("(");
|
|
41
|
+
if (from === -1)
|
|
42
|
+
return out;
|
|
43
|
+
let to = matching(inert, from);
|
|
44
|
+
if (to === -1)
|
|
45
|
+
return out;
|
|
46
|
+
from += 1;
|
|
47
|
+
// `sendRequest({ … })` — one object argument, whose PROPERTIES are the options.
|
|
48
|
+
const inner = inert.slice(from, to);
|
|
49
|
+
const open = inner.indexOf("{");
|
|
50
|
+
if (open !== -1 && inner.slice(0, open).trim() === "") {
|
|
51
|
+
const close = matching(inert, from + open);
|
|
52
|
+
if (close !== -1 && inert.slice(close + 1, to).trim() === "") {
|
|
53
|
+
from += open + 1;
|
|
54
|
+
to = close;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
let depth = 0;
|
|
58
|
+
let cut = from;
|
|
59
|
+
const take = (stop) => {
|
|
60
|
+
const part = call.slice(cut, stop);
|
|
61
|
+
const named = /^\s*([A-Za-z_$][\w$]*)\s*[=:]\s*([\s\S]+)$/.exec(part);
|
|
62
|
+
if (named) {
|
|
63
|
+
if (!out.has(named[1]))
|
|
64
|
+
out.set(named[1], named[2].trim());
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const shorthand = /^\s*([A-Za-z_$][\w$]*)\s*$/.exec(part);
|
|
68
|
+
// First wins: a later option of one name does not replace the one in force.
|
|
69
|
+
if (shorthand && !out.has(shorthand[1]))
|
|
70
|
+
out.set(shorthand[1], shorthand[1]);
|
|
71
|
+
};
|
|
72
|
+
for (let i = from; i < to; i++) {
|
|
73
|
+
const ch = inert[i];
|
|
74
|
+
if ("([{".includes(ch))
|
|
75
|
+
depth++;
|
|
76
|
+
else if (")]}".includes(ch))
|
|
77
|
+
depth--;
|
|
78
|
+
else if (ch === "," && depth === 0) {
|
|
79
|
+
take(i);
|
|
80
|
+
cut = i + 1;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
take(to);
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** Index of the bracket closing the one at `open`, or -1 when it is unbalanced. */
|
|
87
|
+
function matching(text, open) {
|
|
88
|
+
let depth = 0;
|
|
89
|
+
for (let i = open; i < text.length; i++) {
|
|
90
|
+
if ("([{".includes(text[i]))
|
|
91
|
+
depth++;
|
|
92
|
+
else if (")]}".includes(text[i]) && --depth === 0)
|
|
93
|
+
return i;
|
|
94
|
+
}
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
/** Offset-preserving blanking of string contents, so a comma or a bracket inside a
|
|
98
|
+
* path or a body literal is never read as structure. */
|
|
99
|
+
function blankStringContents(src) {
|
|
100
|
+
const out = src.split("");
|
|
101
|
+
let quote = "";
|
|
102
|
+
for (let i = 0; i < src.length; i++) {
|
|
103
|
+
const c = src[i];
|
|
104
|
+
if (quote) {
|
|
105
|
+
if (c === "\\") {
|
|
106
|
+
i++;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (c === quote)
|
|
110
|
+
quote = "";
|
|
111
|
+
else
|
|
112
|
+
out[i] = " ";
|
|
113
|
+
}
|
|
114
|
+
else if (c === '"' || c === "'" || c === "`")
|
|
115
|
+
quote = c;
|
|
116
|
+
}
|
|
117
|
+
return out.join("");
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The request's `body` option, as the text of its value, or `undefined` when the call
|
|
121
|
+
* sends no body.
|
|
122
|
+
*
|
|
123
|
+
* `shared-helper-policy` prescribes the object SHORTHAND as the canonical TypeScript
|
|
124
|
+
* form of body-form 2 — `updateOrder(client, orderId, body = DEFAULT_ORDER_BODY)`
|
|
125
|
+
* calling `sendRequest({ ..., body })` — so a reader that saw only `body:` judged the
|
|
126
|
+
* helper the prompt TEACHES as sending no body at all.
|
|
127
|
+
*/
|
|
128
|
+
export function bodyArgument(call) {
|
|
129
|
+
return requestOptions(call).get("body");
|
|
130
|
+
}
|
|
131
|
+
/** The request's override option, as the text of its value. Either spelling. */
|
|
132
|
+
export function overrideArgument(call) {
|
|
133
|
+
const options = requestOptions(call);
|
|
134
|
+
return options.get("data_override") ?? options.get("dataOverride");
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Whether a caller can change what this request sends, through the helper's signature.
|
|
138
|
+
*
|
|
139
|
+
* The question is whether the body DERIVES from a parameter, not which mechanism
|
|
140
|
+
* carried it there. Naming the mechanisms would answer the shapes already seen and
|
|
141
|
+
* mis-judge the next one: the body as the parameter, an override map, and a local
|
|
142
|
+
* template with the parameters interpolated into it are three ways to reach the same
|
|
143
|
+
* property, and there is no reason to think they are the last three.
|
|
144
|
+
*
|
|
145
|
+
* FAILS OPEN — this feeds a blocking gate, so every answer it cannot establish is
|
|
146
|
+
* `true`. A request with no body has nothing to reach; a signature it cannot read is
|
|
147
|
+
* not judged. Only a body it can see, built from no parameter at all, is false.
|
|
148
|
+
*
|
|
149
|
+
* `before` is the helper text that precedes the request call. A body passed by name
|
|
150
|
+
* is resolved there: generated code assigns the template immediately above the call,
|
|
151
|
+
* so a parameter that reaches the body appears between that assignment and the call.
|
|
152
|
+
*/
|
|
153
|
+
export function bodyReachable(call, params, before = "") {
|
|
154
|
+
if (params === undefined)
|
|
155
|
+
return true;
|
|
156
|
+
const value = bodyArgument(call);
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
return true;
|
|
159
|
+
const names = new Set(params.map(paramName).filter(Boolean));
|
|
160
|
+
const mentionsParam = (text) => {
|
|
161
|
+
for (const m of text.matchAll(/[A-Za-z_$][\w$]*/g))
|
|
162
|
+
if (names.has(m[0]))
|
|
163
|
+
return true;
|
|
164
|
+
return false;
|
|
165
|
+
};
|
|
166
|
+
// The body IS a parameter.
|
|
167
|
+
if (names.has(value))
|
|
168
|
+
return true;
|
|
169
|
+
// The body is written at the call and names a parameter inside it.
|
|
170
|
+
if (mentionsParam(value))
|
|
171
|
+
return true;
|
|
172
|
+
// An override argument carries a parameter into the body.
|
|
173
|
+
const override = overrideArgument(call);
|
|
174
|
+
if (override !== undefined && mentionsParam(override))
|
|
175
|
+
return true;
|
|
176
|
+
// The body is passed by name: resolve it to its assignment in the helper and read
|
|
177
|
+
// from there to the call.
|
|
178
|
+
const assign = new RegExp(`\\b${value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b\\s*(?::[^=\\n]*)?=`).exec(before);
|
|
179
|
+
if (assign)
|
|
180
|
+
return mentionsParam(before.slice(assign.index + assign[0].length));
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* The override parameter of a helper that reaches its own request body TWICE: once
|
|
185
|
+
* through a body parameter, and again through an override argument passed straight
|
|
186
|
+
* from the signature. `undefined` when the helper reaches its body through at most
|
|
187
|
+
* one of them.
|
|
188
|
+
*
|
|
189
|
+
* The prompt already states the rule — two body forms are offered and the helper
|
|
190
|
+
* takes "the FIRST one that reaches everything the callers need" — and nothing
|
|
191
|
+
* checked it. A body parameter reaches every property of the request body, so an
|
|
192
|
+
* override beside it can change nothing it cannot; carrying both is the hedge a run
|
|
193
|
+
* writes when no rule decides, and it is what made demoshop's `create_order` arity 5
|
|
194
|
+
* in one run and 4 in the other (testplan-run-9).
|
|
195
|
+
*
|
|
196
|
+
* The body must BE a parameter — form 2 as the policy states it. A body built at the
|
|
197
|
+
* call out of a parameter reaches only the properties it names, so an override beside
|
|
198
|
+
* it carries what the parameter cannot and the two are not one mechanism twice.
|
|
199
|
+
*
|
|
200
|
+
* The override must be a BARE PASS-THROUGH — the parameter and nothing else, a
|
|
201
|
+
* `or {}` / `?? {}` fallback aside. An override that BUILDS a map carries values the
|
|
202
|
+
* body parameter's default does not, which is the prompt's form 1 working; that is
|
|
203
|
+
* the shape a unique-suffix helper delivers, and it is not this fault.
|
|
204
|
+
*
|
|
205
|
+
* Reads the request call alone, never a body resolved from an assignment above it:
|
|
206
|
+
* this feeds a blocking gate, and the direct form is the one that cannot be read two
|
|
207
|
+
* ways.
|
|
208
|
+
*/
|
|
209
|
+
export function bodyReachedTwice(call, params) {
|
|
210
|
+
if (params === undefined)
|
|
211
|
+
return undefined;
|
|
212
|
+
const bodyValue = bodyArgument(call);
|
|
213
|
+
const expr = overrideArgument(call);
|
|
214
|
+
if (bodyValue === undefined || expr === undefined)
|
|
215
|
+
return undefined;
|
|
216
|
+
const names = new Set(params.map(paramName).filter(Boolean));
|
|
217
|
+
const identifiers = (text) => [...text.matchAll(/[A-Za-z_$][\w$]*/g)].map((m) => m[0]);
|
|
218
|
+
// The body option must BE a parameter, not merely mention one. The rule's whole
|
|
219
|
+
// claim is that a whole-body parameter reaches every property the override could;
|
|
220
|
+
// a body BUILT from a parameter (`body: { title }`) reaches one property and
|
|
221
|
+
// leaves every other to the override, which is then not redundant at all — and
|
|
222
|
+
// the remediation this finding carries, delete the override, would break the
|
|
223
|
+
// helper. Anything else fails open.
|
|
224
|
+
const body = bodyValue.trim();
|
|
225
|
+
if (!names.has(body))
|
|
226
|
+
return undefined;
|
|
227
|
+
// A brace holding anything at all builds a map of its own — an object literal, a
|
|
228
|
+
// dict, or the TypeScript shorthand `{ name }`. `{}` is the empty fallback.
|
|
229
|
+
if (/\{\s*[^}\s]/.test(expr))
|
|
230
|
+
return undefined;
|
|
231
|
+
const carried = identifiers(expr).filter((id) => !OVERRIDE_FILLER.has(id));
|
|
232
|
+
if (carried.length !== 1 || !names.has(carried[0]))
|
|
233
|
+
return undefined;
|
|
234
|
+
const name = carried[0];
|
|
235
|
+
// One parameter named twice is one mechanism, not two.
|
|
236
|
+
return name === body ? undefined : name;
|
|
237
|
+
}
|
|
238
|
+
/** Every helper in the located modules that reaches its request body twice. Never
|
|
239
|
+
* throws; a file it cannot read contributes nothing. */
|
|
240
|
+
export async function findDuplicateBodyReach(utilsFiles, spec) {
|
|
241
|
+
const out = [];
|
|
242
|
+
for (const utilsFile of utilsFiles) {
|
|
243
|
+
let content;
|
|
244
|
+
try {
|
|
245
|
+
content = await fs.promises.readFile(utilsFile, "utf8");
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
for (const h of parseUtilsFile(content, spec)) {
|
|
251
|
+
const call = helperRequest(content, h);
|
|
252
|
+
if (!call)
|
|
253
|
+
continue;
|
|
254
|
+
const override = bodyReachedTwice(call, signatureParams(helperSignature(content, h)));
|
|
255
|
+
if (override)
|
|
256
|
+
out.push({ helper: h.name, utilsFile, line: h.line, override });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
/** The helper's own request call, or undefined when it issues none. */
|
|
262
|
+
function helperRequest(content, helper) {
|
|
263
|
+
for (const m of content.matchAll(new RegExp(REQUEST_CALL_RE))) {
|
|
264
|
+
const start = m.index ?? 0;
|
|
265
|
+
const line = content.slice(0, start).split("\n").length;
|
|
266
|
+
if (line < helper.line || line > helper.endLine)
|
|
267
|
+
continue;
|
|
268
|
+
return callText(content, start + m[0].length - 1);
|
|
269
|
+
}
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
/** The helper's text from its definition to its request call — where a body passed
|
|
273
|
+
* by name is assigned. */
|
|
274
|
+
function helperTextBefore(content, helper, call) {
|
|
275
|
+
const body = content
|
|
276
|
+
.split("\n")
|
|
277
|
+
.slice(helper.line - 1, helper.endLine)
|
|
278
|
+
.join("\n");
|
|
279
|
+
const at = body.indexOf(call);
|
|
280
|
+
return at === -1 ? body : body.slice(0, at);
|
|
281
|
+
}
|
|
282
|
+
/** The signature text of a helper, as signatureParams reads it. */
|
|
283
|
+
function helperSignature(content, helper) {
|
|
284
|
+
return content.split("\n").slice(helper.line - 1, helper.endLine);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Shared helpers whose body no parameter reaches, each paired with a sibling spec
|
|
288
|
+
* that defines its own helper for the same route. Never throws; fails open to [].
|
|
289
|
+
*/
|
|
290
|
+
export async function findUnreachableBodies(testFile, utilsFiles, spec, preReadSiblings) {
|
|
291
|
+
const frozen = new Map();
|
|
292
|
+
for (const utilsFile of utilsFiles) {
|
|
293
|
+
let content;
|
|
294
|
+
try {
|
|
295
|
+
content = await fs.promises.readFile(utilsFile, "utf8");
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
continue;
|
|
299
|
+
}
|
|
300
|
+
for (const h of parseUtilsFile(content, spec)) {
|
|
301
|
+
if (!h.method || !h.normalizedPath)
|
|
302
|
+
continue;
|
|
303
|
+
const call = helperRequest(content, h);
|
|
304
|
+
if (!call)
|
|
305
|
+
continue;
|
|
306
|
+
if (bodyReachable(call, signatureParams(helperSignature(content, h)), helperTextBefore(content, h, call)))
|
|
307
|
+
continue;
|
|
308
|
+
frozen.set(`${h.method} ${h.normalizedPath}`, {
|
|
309
|
+
helper: h.name,
|
|
310
|
+
utilsFile,
|
|
311
|
+
method: h.method,
|
|
312
|
+
path: h.path ?? h.normalizedPath,
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (frozen.size === 0)
|
|
317
|
+
return [];
|
|
318
|
+
// The delivered spec is one of the callers, so the walk includes it.
|
|
319
|
+
const siblings = preReadSiblings ??
|
|
320
|
+
(await generatedSiblings(testFile, spec, { includeSelf: true }));
|
|
321
|
+
const out = [];
|
|
322
|
+
for (const { file, content } of siblings) {
|
|
323
|
+
for (const h of localHelpersOf(content, spec)) {
|
|
324
|
+
if (!h.method || !h.normalizedPath)
|
|
325
|
+
continue;
|
|
326
|
+
const held = frozen.get(`${h.method} ${h.normalizedPath}`);
|
|
327
|
+
if (!held)
|
|
328
|
+
continue;
|
|
329
|
+
out.push({ ...held, rivalFile: file, rivalHelper: h.name });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return out;
|
|
333
|
+
}
|