@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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { hasDefault, paramName } from "./parse.js";
|
|
2
|
+
/**
|
|
3
|
+
* A helper defined at HEAD keeps the signature it has. Callers this run cannot see
|
|
4
|
+
* depend on it — the earlier run's tests, and anything the customer wrote against
|
|
5
|
+
* the module since — so the reuse step may ADD a parameter that carries a default
|
|
6
|
+
* and nothing else. Stated for Skyramp's own module because the status rule gave a
|
|
7
|
+
* run a reason to break it: told the expected status takes no default, one run
|
|
8
|
+
* stripped the defaults from three incumbents and rewrote their parameter lists to
|
|
9
|
+
* satisfy the rule, while two others left the incumbents alone. The status rule
|
|
10
|
+
* governs helpers this run writes; this is the gate that makes the other answer
|
|
11
|
+
* impossible.
|
|
12
|
+
*
|
|
13
|
+
* The same policy — a signature at HEAD is frozen, and widening by an appended
|
|
14
|
+
* defaulted parameter is the one permitted change — is enforced for the CUSTOMER's
|
|
15
|
+
* own module by `additiveChanges` in in-house.ts, under the `in-house-modified`
|
|
16
|
+
* kind. Two mechanisms encode one rule today: that one compares helper BODIES as
|
|
17
|
+
* well, and reads its own HEAD copy. They should converge.
|
|
18
|
+
*
|
|
19
|
+
* Read from the two parameter lists, by position: an incumbent parameter keeps its
|
|
20
|
+
* name and, when it had a default (or was optional), keeps one; a parameter beyond
|
|
21
|
+
* the count at HEAD carries a default. A helper HEAD does not hold is this run's and
|
|
22
|
+
* is not judged here. The body is not compared — that is the retrofit-equivalence
|
|
23
|
+
* gate's question, asked from the caller's side.
|
|
24
|
+
*/
|
|
25
|
+
const OPTIONAL_RE = /^[A-Za-z_$][\w$]*\s*\?(?:\s*:|$)/;
|
|
26
|
+
const omittable = (p) => hasDefault(p) || OPTIONAL_RE.test(p) || /^(?:\.\.\.|\*)/.test(p);
|
|
27
|
+
/** A parameter list as the agent should READ it: each name, and whether it carries a
|
|
28
|
+
* default. The default's VALUE is deliberately left out, not unavailable: `params`
|
|
29
|
+
* keeps string contents (see signatureParams), so `fields = "id,email"` is there to
|
|
30
|
+
* quote. Eliding it keeps the finding short and sends the agent to the file at HEAD,
|
|
31
|
+
* which is where the signature is restored from either way. Quoting the value would
|
|
32
|
+
* need a length cap — a default can be a whole request body. */
|
|
33
|
+
function describe(params) {
|
|
34
|
+
return params
|
|
35
|
+
.map((p) => (omittable(p) ? `${paramName(p)} = …` : paramName(p)))
|
|
36
|
+
.join(", ");
|
|
37
|
+
}
|
|
38
|
+
export function incumbentSignatureViolations(headHelpers, workHelpers, file) {
|
|
39
|
+
const out = [];
|
|
40
|
+
const workByName = new Map(workHelpers.map((h) => [h.name, h]));
|
|
41
|
+
for (const head of headHelpers) {
|
|
42
|
+
const work = workByName.get(head.name);
|
|
43
|
+
if (!work || !head.params || !work.params)
|
|
44
|
+
continue;
|
|
45
|
+
const faults = [];
|
|
46
|
+
head.params.forEach((was, i) => {
|
|
47
|
+
const now = work.params[i];
|
|
48
|
+
const wasName = paramName(was);
|
|
49
|
+
if (now === undefined) {
|
|
50
|
+
faults.push(`parameter ${i + 1} (\`${wasName}\`) was removed`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const nowName = paramName(now);
|
|
54
|
+
if (nowName !== wasName) {
|
|
55
|
+
faults.push(`parameter ${i + 1} is \`${nowName}\` and was \`${wasName}\``);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (omittable(was) && !omittable(now))
|
|
59
|
+
faults.push(`\`${wasName}\` lost its default`);
|
|
60
|
+
});
|
|
61
|
+
for (const added of work.params.slice(head.params.length))
|
|
62
|
+
if (!omittable(added))
|
|
63
|
+
faults.push(`\`${paramName(added)}\` was added without a default`);
|
|
64
|
+
if (faults.length === 0)
|
|
65
|
+
continue;
|
|
66
|
+
out.push({
|
|
67
|
+
kind: "incumbent-signature",
|
|
68
|
+
file,
|
|
69
|
+
helper: head.name,
|
|
70
|
+
line: work.line,
|
|
71
|
+
detail: `\`${head.name}\` is defined at HEAD as \`(${describe(head.params)})\` and now as \`(${describe(work.params)})\` — ${faults.join("; ")}. Callers this run cannot see depend on the signature at HEAD: restore it as it was. Add what you need as a new parameter with a default, or as a new helper. The expected-status rule governs helpers this run writes, never an incumbent's default`,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
@@ -1,20 +1,27 @@
|
|
|
1
|
+
export type UtilsLanguage = "python" | "typescript" | "javascript";
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* A Playwright name as the language SPELLS it: camelCase unchanged, Python
|
|
4
|
+
* snake_case. `toBeVisible` → `to_be_visible`, `waitForLoadState` →
|
|
5
|
+
* `wait_for_load_state`. Stated ONCE, so a caller that shows a name to the agent and
|
|
6
|
+
* a caller that matches one in source cannot disagree about how Python spells it.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
8
|
+
* SPELLING ONLY — this is not a JavaScript-to-Python API map, and a name whose
|
|
9
|
+
* Python form differs in SHAPE is not its business. `waitForResponse` is the one to
|
|
10
|
+
* remember: Playwright Python has no `wait_for_response`, only the
|
|
11
|
+
* `expect_response(...)` context manager, so converting that name yields a call that
|
|
12
|
+
* does not exist. It did, and the agent was told to make it. Where the two APIs
|
|
13
|
+
* differ by more than case, the caller names each language's form itself.
|
|
12
14
|
*/
|
|
13
|
-
export
|
|
15
|
+
export declare function playwrightSpelling(name: string, language: UtilsLanguage): string;
|
|
14
16
|
export interface UtilsLanguageSpec {
|
|
15
17
|
language: UtilsLanguage;
|
|
16
18
|
/** File extensions (with dot) a utils file in this language can carry. */
|
|
17
19
|
extensions: string[];
|
|
20
|
+
/** The basename the reuse prompt prescribes for a shared module in this language.
|
|
21
|
+
* ONE declaration: the prompts render it into the instructions and the gate checks
|
|
22
|
+
* the delivered file against it, so the name the agent is told and the name the
|
|
23
|
+
* pass demands cannot drift apart. */
|
|
24
|
+
fileName: string;
|
|
18
25
|
commentPrefix: "#" | "//";
|
|
19
26
|
/** Matches the FIRST line of a module-level helper definition; group 1 is the name. */
|
|
20
27
|
helperStart: RegExp;
|
|
@@ -36,10 +43,19 @@ export interface UtilsLanguageSpec {
|
|
|
36
43
|
allowedBrowserAssertion: RegExp;
|
|
37
44
|
/** Names `specContent` imports from the utils module whose basename stem is `stem`. */
|
|
38
45
|
importedNames(specContent: string, stem: string): string[];
|
|
46
|
+
/** The local names `specContent` binds the utils MODULE itself to — `import * as
|
|
47
|
+
* utils`, `const utils = require(…)`, `import SkyrampUtils as utils` — under
|
|
48
|
+
* which a helper is called as `<qualifier>.<name>(`. Empty for named imports.
|
|
49
|
+
* A call qualified by anything else (`client.getOrder(`) is another object's
|
|
50
|
+
* method, whatever the helper's name. */
|
|
51
|
+
moduleQualifiers(specContent: string, stem: string): string[];
|
|
39
52
|
}
|
|
40
53
|
/** Path parameters spelled `{id}`, `${id}`, `:id` all normalise to `{}` so two helpers
|
|
41
54
|
* for `/orders/{order_id}` and `/orders/{id}` compare equal. */
|
|
42
55
|
export declare function normalizePath(p: string): string;
|
|
56
|
+
/** The status of a response as the assertion's RECEIVER — `r.status`, `r.statusCode`,
|
|
57
|
+
* `res.status_code`, `res.status()` — and never a body/json/data field of it. */
|
|
58
|
+
export declare const STATUS_RECEIVER = "(?![\\w.]*\\.(?:body|json|data|payload)\\b)[\\w.]+\\.status(?:_?[cC]ode)?(?:\\(\\))?";
|
|
43
59
|
export declare const UTILS_LANGUAGE_SPECS: Record<UtilsLanguage, UtilsLanguageSpec>;
|
|
44
60
|
/**
|
|
45
61
|
* The two kinds of shared helper, keyed by the test type's substrate — the same
|
|
@@ -62,7 +78,32 @@ export interface HelperFamilySpec {
|
|
|
62
78
|
/** One clause for the fix-instruction sentence — composed by the gate, never
|
|
63
79
|
* restated there (the browser clause reads as a continuation of the api one). */
|
|
64
80
|
fixRule: string;
|
|
81
|
+
/** The sibling inline call-site advisory's family-specific half: what a site is
|
|
82
|
+
* called, what the helper already does with it, and how to replace it. The gate
|
|
83
|
+
* appends the tail both families share. */
|
|
84
|
+
inlineSite: {
|
|
85
|
+
/** The prompt's noun for a site — `HelperPolicy.inlineSite.noun`. */
|
|
86
|
+
noun: string;
|
|
87
|
+
/** `… that a shared helper already <verb>:` */
|
|
88
|
+
already: string;
|
|
89
|
+
/** What makes a site a candidate, and what the replacement keeps. */
|
|
90
|
+
instruction: string;
|
|
91
|
+
/** The copy as the shared tail names it inside a local helper: `that request`
|
|
92
|
+
* / `the sequence`. */
|
|
93
|
+
localCopy: string;
|
|
94
|
+
};
|
|
65
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* The RECEIVED value inside `expect(...)` — its first argument, up to the matcher.
|
|
98
|
+
*
|
|
99
|
+
* Only the first, because Playwright takes a message as the second: `expect(locator,
|
|
100
|
+
* "why this matters")`. Reading every argument let that message decide, so a
|
|
101
|
+
* structural wait whose message merely NAMED a text-selecting form was refused — and
|
|
102
|
+
* a refusal blocks a delivery that is right, which is worse than missing one that is
|
|
103
|
+
* wrong. The split walks bracket depth on a copy whose strings are blanked, so a comma
|
|
104
|
+
* inside a selector or a message does not end the argument.
|
|
105
|
+
*/
|
|
106
|
+
export declare function expectArgs(expr: string): string;
|
|
66
107
|
export declare const HELPER_FAMILIES: Record<HelperFamily, HelperFamilySpec>;
|
|
67
108
|
/** The helper family a test type's shared helpers follow. Unlike `isBrowserTestType`,
|
|
68
109
|
* an ABSENT test type resolves to `api`: this runs against a utils file that already
|
|
@@ -1,3 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language-parametric description of a shared SkyrampUtils file, and the invariants
|
|
3
|
+
* every helper in it must hold. Encoded as DATA rather than as per-language checks so
|
|
4
|
+
* that adding a language (or a helper family with a different assertion rule, e.g.
|
|
5
|
+
* browser helpers) is a table entry, not a second verifier.
|
|
6
|
+
*
|
|
7
|
+
* The invariants come from the prompts that author these files — the HELPER SHAPE
|
|
8
|
+
* block in the integration modularization prompt and the API near-duplicate rules in
|
|
9
|
+
* the reuse prompt — and exist here because prompt rules are LLM-enforced only:
|
|
10
|
+
* SKYR-4196 Part B runs 5 and 11 leaked a scenario-literal body assertion into a shared
|
|
11
|
+
* helper despite both rules being in the prompt.
|
|
12
|
+
*/
|
|
13
|
+
import { API_HELPERS, BROWSER_HELPERS, HELPER_ASSERTION_POLICIES, CONTENT_ROLES, } from "../../prompts/shared-helper-policy.js";
|
|
14
|
+
import { escapeRegExp } from "../regex.js";
|
|
15
|
+
/**
|
|
16
|
+
* A Playwright name as the language SPELLS it: camelCase unchanged, Python
|
|
17
|
+
* snake_case. `toBeVisible` → `to_be_visible`, `waitForLoadState` →
|
|
18
|
+
* `wait_for_load_state`. Stated ONCE, so a caller that shows a name to the agent and
|
|
19
|
+
* a caller that matches one in source cannot disagree about how Python spells it.
|
|
20
|
+
*
|
|
21
|
+
* SPELLING ONLY — this is not a JavaScript-to-Python API map, and a name whose
|
|
22
|
+
* Python form differs in SHAPE is not its business. `waitForResponse` is the one to
|
|
23
|
+
* remember: Playwright Python has no `wait_for_response`, only the
|
|
24
|
+
* `expect_response(...)` context manager, so converting that name yields a call that
|
|
25
|
+
* does not exist. It did, and the agent was told to make it. Where the two APIs
|
|
26
|
+
* differ by more than case, the caller names each language's form itself.
|
|
27
|
+
*/
|
|
28
|
+
export function playwrightSpelling(name, language) {
|
|
29
|
+
return language === "python"
|
|
30
|
+
? name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase()
|
|
31
|
+
: name;
|
|
32
|
+
}
|
|
33
|
+
function matcherAlternation(names, language) {
|
|
34
|
+
return names.map((n) => playwrightSpelling(n, language)).join("|");
|
|
35
|
+
}
|
|
36
|
+
/** `expect(<anything, one level of nesting>).<negation?><one permitted matcher>(`
|
|
37
|
+
*
|
|
38
|
+
* The negation is spelled per language, like the matcher itself: TypeScript chains
|
|
39
|
+
* it (`expect(x).not.toBeVisible()`), Python folds it into the method name
|
|
40
|
+
* (`expect(x).not_to_be_visible()` — there is no `.not` object to chain through).
|
|
41
|
+
* Reading `.not.` for Python rejected every negated Python assertion the policy
|
|
42
|
+
* permits, and accepted a form Python cannot run. */
|
|
43
|
+
function browserAssertionRe(language) {
|
|
44
|
+
const python = language === "python";
|
|
45
|
+
const expectCall = python ? "\\bexpect\\s*" : "\\bexpect(?:\\.soft)?\\s*";
|
|
46
|
+
const negation = python ? "(?:not_)?" : "(?:not\\.)?";
|
|
47
|
+
return new RegExp(`${expectCall}\\((?:[^()]|\\((?:[^()]|\\([^()]*\\))*\\))*\\)\\s*\\.\\s*${negation}(?:${matcherAlternation(HELPER_ASSERTION_POLICIES.browser.permittedMatchers, language)})\\s*\\(`);
|
|
48
|
+
}
|
|
1
49
|
/** Path parameters spelled `{id}`, `${id}`, `:id` all normalise to `{}` so two helpers
|
|
2
50
|
* for `/orders/{order_id}` and `/orders/{id}` compare equal. */
|
|
3
51
|
export function normalizePath(p) {
|
|
@@ -15,6 +63,7 @@ export function normalizePath(p) {
|
|
|
15
63
|
const PYTHON = {
|
|
16
64
|
language: "python",
|
|
17
65
|
extensions: [".py"],
|
|
66
|
+
fileName: "SkyrampUtils.py",
|
|
18
67
|
commentPrefix: "#",
|
|
19
68
|
helperStart: /^(?:async\s+)?def\s+([A-Za-z_]\w*)\s*\(/,
|
|
20
69
|
methodRe: /\bmethod\s*=\s*["']([A-Za-z]+)["']/,
|
|
@@ -25,8 +74,7 @@ const PYTHON = {
|
|
|
25
74
|
// reads the body (`json()`, `get_response_value`, `.text`, subscripts) is a body
|
|
26
75
|
// assertion whatever else the line says.
|
|
27
76
|
allowedAssertion: /^\s*assert\b(?=.*\bstatus_code\b)(?!.*(?:\.json\(|get_response_value|\.text\b|\.content\b|\[["']))/,
|
|
28
|
-
|
|
29
|
-
allowedBrowserAssertion: /\bexpect\s*\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)\s*\.\s*(?:not\.)?to_be_(?:visible|hidden|attached|enabled|disabled|editable|focused|in_viewport)\s*\(/,
|
|
77
|
+
allowedBrowserAssertion: browserAssertionRe("python"),
|
|
30
78
|
importedNames(spec, stem) {
|
|
31
79
|
const names = new Set();
|
|
32
80
|
const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -54,7 +102,25 @@ const PYTHON = {
|
|
|
54
102
|
}
|
|
55
103
|
return [...names];
|
|
56
104
|
},
|
|
105
|
+
moduleQualifiers(spec, stem) {
|
|
106
|
+
const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
107
|
+
const mod = new RegExp(`^\\s*import\\s+(?:[\\w.]*\\.)?${stemRe}(?:\\s+as\\s+([A-Za-z_]\\w*))?\\s*$`, "m").exec(spec);
|
|
108
|
+
return mod ? [mod[1] ?? stem] : [];
|
|
109
|
+
},
|
|
57
110
|
};
|
|
111
|
+
/** The status of a response as the assertion's RECEIVER — `r.status`, `r.statusCode`,
|
|
112
|
+
* `res.status_code`, `res.status()` — and never a body/json/data field of it. */
|
|
113
|
+
export const STATUS_RECEIVER = "(?![\\w.]*\\.(?:body|json|data|payload)\\b)[\\w.]+\\.status(?:_?[cC]ode)?(?:\\(\\))?";
|
|
114
|
+
function tsModuleQualifiers(spec, stem) {
|
|
115
|
+
const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
116
|
+
const from = `["'][^"']*\\/${stemRe}(?:\\.[cm]?[jt]s)?["']`;
|
|
117
|
+
const out = new Set();
|
|
118
|
+
for (const m of spec.matchAll(new RegExp(`import\\s*\\*\\s*as\\s+([A-Za-z_$][\\w$]*)\\s*from\\s*${from}`, "g")))
|
|
119
|
+
out.add(m[1]);
|
|
120
|
+
for (const m of spec.matchAll(new RegExp(`(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*require\\(\\s*${from}\\s*\\)`, "g")))
|
|
121
|
+
out.add(m[1]);
|
|
122
|
+
return [...out];
|
|
123
|
+
}
|
|
58
124
|
function tsImportedNames(spec, stem) {
|
|
59
125
|
const names = new Set();
|
|
60
126
|
const stemRe = stem.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -71,8 +137,13 @@ function tsImportedNames(spec, stem) {
|
|
|
71
137
|
names.add(name);
|
|
72
138
|
}
|
|
73
139
|
}
|
|
74
|
-
|
|
75
|
-
|
|
140
|
+
// Every name the spec binds the MODULE to — `import * as utils`, `const utils =
|
|
141
|
+
// require(…)` — and each `<qualifier>.<name>` use under it. Read from the one
|
|
142
|
+
// declaration of those forms: the two lists disagreed, so a helper called through
|
|
143
|
+
// a module-object require counted as a qualifier and never as an import, and its
|
|
144
|
+
// contract was never read.
|
|
145
|
+
for (const qualifier of tsModuleQualifiers(spec, stem)) {
|
|
146
|
+
for (const use of spec.matchAll(new RegExp(`\\b${escapeRegExp(qualifier)}\\.([A-Za-z_$][\\w$]*)`, "g")))
|
|
76
147
|
names.add(use[1]);
|
|
77
148
|
}
|
|
78
149
|
for (const m of spec.matchAll(new RegExp(`(?:const|let|var)\\s*\\{([^}]*)\\}\\s*=\\s*require\\(\\s*${from}\\s*\\)`, "g"))) {
|
|
@@ -87,27 +158,41 @@ function tsImportedNames(spec, stem) {
|
|
|
87
158
|
}
|
|
88
159
|
const TYPESCRIPT = {
|
|
89
160
|
language: "typescript",
|
|
90
|
-
|
|
161
|
+
fileName: "skyrampUtils.ts",
|
|
162
|
+
// `.tsx` too: a Playwright spec in a React repository carries that extension, and a
|
|
163
|
+
// file this cannot name is a file the delivery-time strip skips.
|
|
164
|
+
extensions: [".ts", ".mts", ".cts", ".tsx"],
|
|
91
165
|
commentPrefix: "//",
|
|
92
166
|
// `function f(`, `const f = (…) =>`, `const f = async function (`, `const f = <T,>(…) =>`
|
|
93
167
|
// — and a signature Prettier wrapped, whose `(` still opens on the definition line.
|
|
94
168
|
helperStart: /^(?:export\s+)?(?:(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\s*[<(]|(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*(?::[^=]*)?=\s*(?:async\s*)?(?:function\b|<[^>]*>\s*\(|\(|[A-Za-z_$][\w$]*\s*=>))/,
|
|
95
169
|
methodRe: /\bmethod\s*:\s*["'`]([A-Za-z]+)["'`]/,
|
|
96
170
|
pathRe: /\bpath\s*:\s*["'`]([^"'`]+)["'`]/,
|
|
97
|
-
|
|
171
|
+
// `expect(…)` and the `node:assert` idiom a JavaScript suite may use instead
|
|
172
|
+
// (`assert.strictEqual(…)`, `assert(…)`). A helper written in the second was
|
|
173
|
+
// invisible — no assertion recorded, so neither the body rule nor the status
|
|
174
|
+
// rules could see it — while the spec beside it was read. Neither name may
|
|
175
|
+
// follow an identifier or a dot: `console.assert(…)` logs on failure and
|
|
176
|
+
// asserts nothing, and `\b` alone matches after the dot.
|
|
177
|
+
assertionRe: /(?<![\w$.])(?:expect(?:\.soft)?|assert(?:\.\w+)?)\s*\(/,
|
|
98
178
|
allowedAssertion:
|
|
99
179
|
// The receiver is the response itself, never a body/json/data field of it:
|
|
100
180
|
// `expect(res.body.status).toBe("paid")` is a body assertion. An optional
|
|
101
181
|
// string message argument (`expect(r.statusCode, 'status code')`) is the
|
|
102
|
-
// form codegen emits and still a status-only assertion.
|
|
103
|
-
|
|
104
|
-
|
|
182
|
+
// form codegen emits and still a status-only assertion. The assert form takes
|
|
183
|
+
// the same receiver as its first argument (`assert.strictEqual(r.statusCode,
|
|
184
|
+
// 200)`) or inside a comparison (`assert(r.status === 200)`).
|
|
185
|
+
new RegExp(`(?<![\\w$.])expect(?:\\.soft)?\\s*\\(\\s*${STATUS_RECEIVER}\\s*(?:,\\s*(?:"[^"]*"|'[^']*'|\`[^\`]*\`)\\s*)?\\)\\s*\\.\\s*(?:not\\.)?(?:toBe|toEqual|toStrictEqual|toBeGreaterThan|toBeLessThan|toBeOneOf)\\s*\\(` +
|
|
186
|
+
`|(?<![\\w$.])assert(?:\\.(?:strictEqual|equal|deepStrictEqual|deepEqual|notStrictEqual|notEqual|ok))?\\s*\\(\\s*${STATUS_RECEIVER}\\s*(?:,|[=!]==?|[<>]=?|\\))`),
|
|
187
|
+
allowedBrowserAssertion: browserAssertionRe("typescript"),
|
|
105
188
|
importedNames: tsImportedNames,
|
|
189
|
+
moduleQualifiers: tsModuleQualifiers,
|
|
106
190
|
};
|
|
107
191
|
const JAVASCRIPT = {
|
|
108
192
|
...TYPESCRIPT,
|
|
109
193
|
language: "javascript",
|
|
110
|
-
|
|
194
|
+
fileName: "skyrampUtils.js",
|
|
195
|
+
extensions: [".js", ".mjs", ".cjs", ".jsx"],
|
|
111
196
|
};
|
|
112
197
|
export const UTILS_LANGUAGE_SPECS = {
|
|
113
198
|
python: PYTHON,
|
|
@@ -115,30 +200,156 @@ export const UTILS_LANGUAGE_SPECS = {
|
|
|
115
200
|
javascript: JAVASCRIPT,
|
|
116
201
|
};
|
|
117
202
|
const SCENARIO_LITERAL_RE = /["'`][^"'`]*[\d$%€£][^"'`]*["'`]/;
|
|
118
|
-
/** The text
|
|
119
|
-
|
|
203
|
+
/** The literal a text-matching locator is given: `getByText("…")`, `hasText: "…"`. */
|
|
204
|
+
const TEXT_ARGUMENT_RE = /\b(?:getByText|get_by_text|getByAltText|get_by_alt_text|hasText|has_text)\s*[(:=]\s*["'`]([^"'`]*)["'`]/g;
|
|
205
|
+
/** The literal a test id is given. */
|
|
206
|
+
const TEST_ID_ARGUMENT_RE = /\b(?:getByTestId|get_by_test_id)\s*\(\s*["'`]([^"'`]*)["'`]/g;
|
|
207
|
+
/** A test id an author WROTE, rather than one a scenario's data was interpolated into.
|
|
208
|
+
* An identifier has no spaces and no address in it: `step-2-panel` and `otp-1` are
|
|
209
|
+
* names, `order-def@mail.com - 2 items` is the row it points at. */
|
|
210
|
+
const IDENTIFIER_RE = /^[^\s@]+$/;
|
|
211
|
+
/** A locator built from the page's rendered TEXT rather than from an element's
|
|
212
|
+
* identity. One pattern covers both languages: a TypeScript file does not contain
|
|
213
|
+
* `get_by_text` and a Python one does not contain `getByText`. Playwright's own text
|
|
214
|
+
* engines count too — `text=` and `:has-text()` select by content as surely as
|
|
215
|
+
* `getByText` does. */
|
|
216
|
+
const TEXT_LOCATOR_RE = /\b(?:getByText|get_by_text|getByAltText|get_by_alt_text)\s*\(|\b(?:hasText|has_text)\s*[:=]|\blocator\s*\(\s*["'`]\s*text=|>>\s*text=|:has-text\s*\(/;
|
|
217
|
+
/** Every `getByRole("<role>"` in the locator chain, with the accessible name that
|
|
218
|
+
* follows it when there is one. A chain holds more than one: a control role can be
|
|
219
|
+
* filtered by a content role, and reading only the first compared the wrong one. */
|
|
220
|
+
const ROLE_WITH_NAME_RE = /\b(?:getByRole|get_by_role)\s*\(\s*["'`]([A-Za-z]+)["'`]\s*(?:,\s*(?:\{[^{}]*?["'`]?\bname["'`]?\s*(?::\s*(?:["'`]([^"'`]*)["'`]|\/([^/]*)\/|([A-Za-z_$][\w$.]*))|(?=\s*[,}]))|[^()]*?\bname\s*=\s*(?:["'`]([^"'`]*)["'`]|\/([^/]*)\/|([A-Za-z_$][\w$.]*))))?/g;
|
|
221
|
+
/**
|
|
222
|
+
* The RECEIVED value inside `expect(...)` — its first argument, up to the matcher.
|
|
223
|
+
*
|
|
224
|
+
* Only the first, because Playwright takes a message as the second: `expect(locator,
|
|
225
|
+
* "why this matters")`. Reading every argument let that message decide, so a
|
|
226
|
+
* structural wait whose message merely NAMED a text-selecting form was refused — and
|
|
227
|
+
* a refusal blocks a delivery that is right, which is worse than missing one that is
|
|
228
|
+
* wrong. The split walks bracket depth on a copy whose strings are blanked, so a comma
|
|
229
|
+
* inside a selector or a message does not end the argument.
|
|
230
|
+
*/
|
|
231
|
+
export function expectArgs(expr) {
|
|
120
232
|
const open = expr.indexOf("(", expr.indexOf("expect"));
|
|
121
|
-
|
|
122
|
-
|
|
233
|
+
// `.not.to…` in TypeScript, `.not_to_…` in Python. Reading only the first left a
|
|
234
|
+
// negated Python assertion with no end, so the whole source line — a trailing
|
|
235
|
+
// comment included — was scanned as the locator's arguments.
|
|
236
|
+
const close = expr.search(/\)\s*\.\s*(?:not[._])?to/);
|
|
237
|
+
if (open === -1 || close === -1)
|
|
238
|
+
return expr;
|
|
239
|
+
const args = expr.slice(open + 1, close);
|
|
240
|
+
const inert = blankStringContents(args);
|
|
241
|
+
let depth = 0;
|
|
242
|
+
for (let i = 0; i < inert.length; i++) {
|
|
243
|
+
const c = inert[i];
|
|
244
|
+
if (c === "(" || c === "[" || c === "{")
|
|
245
|
+
depth++;
|
|
246
|
+
else if (c === ")" || c === "]" || c === "}")
|
|
247
|
+
depth--;
|
|
248
|
+
else if (c === "," && depth === 0)
|
|
249
|
+
return args.slice(0, i);
|
|
250
|
+
}
|
|
251
|
+
return args;
|
|
252
|
+
}
|
|
253
|
+
/** Offset-preserving blanking of string contents, so a comma or a bracket inside a
|
|
254
|
+
* literal is not read as structure. Local and deliberately small: this walks ONE
|
|
255
|
+
* expression already cut from its line, not a source file. */
|
|
256
|
+
function blankStringContents(src) {
|
|
257
|
+
const out = src.split("");
|
|
258
|
+
let quote = "";
|
|
259
|
+
for (let i = 0; i < src.length; i++) {
|
|
260
|
+
const c = src[i];
|
|
261
|
+
if (quote) {
|
|
262
|
+
if (c === "\\") {
|
|
263
|
+
i++;
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
if (c === quote)
|
|
267
|
+
quote = "";
|
|
268
|
+
else
|
|
269
|
+
out[i] = " ";
|
|
270
|
+
}
|
|
271
|
+
else if (c === '"' || c === "'" || c === "`")
|
|
272
|
+
quote = c;
|
|
273
|
+
}
|
|
274
|
+
return out.join("");
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Whether the locator inside `expect(...)` selects by what the page SAYS rather than
|
|
278
|
+
* by what an element IS. A permitted matcher on such a locator is a value assertion
|
|
279
|
+
* in disguise: `expect(page.getByText("Order deleted")).toBeVisible()` asserts the
|
|
280
|
+
* scenario's outcome, and the helper that holds it fails the next scenario.
|
|
281
|
+
*
|
|
282
|
+
* Positively recognised forms only — a locator shape this does not know is ALLOWED.
|
|
283
|
+
* This predicate blocks a customer's run, so an unfamiliar locator must pass rather
|
|
284
|
+
* than fail: the cost of a miss is an assertion in the wrong place, the cost of a
|
|
285
|
+
* false hit is a run that cannot finish.
|
|
286
|
+
*/
|
|
287
|
+
function selectsByRenderedText(args) {
|
|
288
|
+
// A CSS attribute selector can quote anything, Playwright's own engine names
|
|
289
|
+
// included: `locator('[data-note=":has-text(foo)"]')` selects by an attribute, not
|
|
290
|
+
// by text. The bracketed part is blanked before the engines are looked for, the same
|
|
291
|
+
// reason `text=` is anchored to where a selector begins.
|
|
292
|
+
if (TEXT_LOCATOR_RE.test(args.replace(/\[[^\]]*\]/g, "[]")))
|
|
293
|
+
return true;
|
|
294
|
+
// A role is NAMED whether or not the name is a literal. A parameterised name
|
|
295
|
+
// (`{ name: headingText }`) selects by the page's text just as surely; the value is
|
|
296
|
+
// simply not one this pass can read.
|
|
297
|
+
// A role is NAMED whether or not the name is a literal, and whether it is written
|
|
298
|
+
// `name: x`, `"name": x`, the shorthand `{ name }`, or Python's `name=x`. A
|
|
299
|
+
// parameterised or shorthand name selects by the page's text just as surely; the
|
|
300
|
+
// value is simply not one this pass can read.
|
|
301
|
+
const named = [...args.matchAll(ROLE_WITH_NAME_RE)].filter((m) => m.slice(2).some((g) => g !== undefined) || /\bname\b/.test(m[0]));
|
|
302
|
+
// A role with no accessible name selects a kind of element, not a string. A role
|
|
303
|
+
// whose name IS the page's content is a value assertion whatever the name says, and
|
|
304
|
+
// ANY such role in the chain decides: an inner one names the element just as much.
|
|
305
|
+
if (named.some((m) => CONTENT_ROLES.includes(m[1].toLowerCase())))
|
|
306
|
+
return true;
|
|
307
|
+
// Digits and currency, applied to the TEXT a locator matches rather than to every
|
|
308
|
+
// string in it. A step number in a test id, a heading level and a street-address
|
|
309
|
+
// label are not scenario data, and blocking them stops a customer's run over a
|
|
310
|
+
// selector that names nothing.
|
|
311
|
+
const matched = [
|
|
312
|
+
...named.map((m) => m[2] ?? m[3] ?? m[5] ?? m[6]),
|
|
313
|
+
...[...args.matchAll(TEXT_ARGUMENT_RE)].map((m) => m[1]),
|
|
314
|
+
// A test id counts only when it reads as content rather than as a name.
|
|
315
|
+
...[...args.matchAll(TEST_ID_ARGUMENT_RE)]
|
|
316
|
+
.map((m) => m[1])
|
|
317
|
+
.filter((t) => !IDENTIFIER_RE.test(t)),
|
|
318
|
+
].filter((t) => t !== undefined);
|
|
319
|
+
return matched.some((t) => SCENARIO_LITERAL_RE.test(`"${t}"`));
|
|
123
320
|
}
|
|
124
321
|
export const HELPER_FAMILIES = {
|
|
125
322
|
api: {
|
|
126
323
|
family: "api",
|
|
127
324
|
routeDuplicates: true,
|
|
128
325
|
isAllowed: (spec, expr) => spec.allowedAssertion.test(expr),
|
|
129
|
-
assertionRule:
|
|
130
|
-
fixRule: "a helper that wraps an SDK request asserts only the status code — one helper per method+path, extended with defaulted parameters, named method + resource",
|
|
326
|
+
assertionRule: HELPER_ASSERTION_POLICIES.api.boundary,
|
|
327
|
+
fixRule: "a helper that wraps an SDK request asserts only the status code — one helper per method+path, extended with defaulted parameters (the expected status excepted: it has no default and every call passes it), named method + resource",
|
|
328
|
+
inlineSite: {
|
|
329
|
+
// The prompt's word for the same thing, read from the policy so the advisory
|
|
330
|
+
// and the rule the agent followed name the site alike.
|
|
331
|
+
noun: API_HELPERS.inlineSite.noun,
|
|
332
|
+
already: "wraps",
|
|
333
|
+
instruction: "Each is a candidate: the request's method, path and call shape match the helper's. Replace the block with a call to the helper only if the remaining differences are literals (they become the arguments; keep the block's response variable; import the helper into that file; change nothing else there).",
|
|
334
|
+
localCopy: "that request",
|
|
335
|
+
},
|
|
131
336
|
},
|
|
132
337
|
browser: {
|
|
133
338
|
family: "browser",
|
|
134
339
|
routeDuplicates: false,
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
//
|
|
340
|
+
// Two halves of one boundary, both declared in shared-helper-policy: the MATCHER
|
|
341
|
+
// must be one that asks whether the element rendered, and the LOCATOR must select
|
|
342
|
+
// the element by its identity rather than by the text the page shows.
|
|
138
343
|
isAllowed: (spec, expr) => spec.allowedBrowserAssertion.test(expr) &&
|
|
139
|
-
!
|
|
140
|
-
assertionRule:
|
|
344
|
+
!selectsByRenderedText(expectArgs(expr)),
|
|
345
|
+
assertionRule: `${HELPER_ASSERTION_POLICIES.browser.boundary}. Move this value assertion to the test body immediately after the helper call, selector verbatim`,
|
|
141
346
|
fixRule: "every other helper holds actions and structural waits only, named for the user intent",
|
|
347
|
+
inlineSite: {
|
|
348
|
+
noun: BROWSER_HELPERS.inlineSite.noun,
|
|
349
|
+
already: "performs",
|
|
350
|
+
instruction: "Each is a candidate: the sequence's actions and locators equal the helper's, in order. Replace the sequence with a call to the helper only if the remaining differences are literals — fill values, option labels, literal arguments — which become the arguments (import the helper into that file; every assertion and the page-error guard stay in the test body where they are; change nothing else there).",
|
|
351
|
+
localCopy: "the sequence",
|
|
352
|
+
},
|
|
142
353
|
},
|
|
143
354
|
};
|
|
144
355
|
/** The helper family a test type's shared helpers follow. Unlike `isBrowserTestType`,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type UtilsLanguageSpec } from "./language-spec.js";
|
|
1
2
|
/** The header `generateSkyrampHeader` writes into a utils file: `Generated by Skyramp on
|
|
2
3
|
* <timestamp>`. Deliberately NOT the bare `SKYRAMP_UTILS_HEADER`, which every generated
|
|
3
4
|
* TEST also carries as its codegen marker (`Generated by Skyramp v<version>`). */
|
|
@@ -34,6 +35,31 @@ export interface LocateUtilsParams {
|
|
|
34
35
|
export declare function locateUtilsFiles(params: LocateUtilsParams): Promise<string[]>;
|
|
35
36
|
/** Canonical path, or the input unchanged when it does not exist (yet). */
|
|
36
37
|
export declare function realpath(p: string): Promise<string>;
|
|
38
|
+
export declare function isInside(file: string, dir: string): boolean;
|
|
37
39
|
/** True when the first lines of `file` carry the utils header. Reads only the head of
|
|
38
40
|
* the file — a utils file is small, but nothing here should depend on that. */
|
|
39
41
|
export declare function hasUtilsHeader(file: string): Promise<boolean>;
|
|
42
|
+
/** Absolute paths of sibling modules `testFile` imports, for the module forms the reuse
|
|
43
|
+
* prompt produces. Only paths that exist are returned. Shared with the in-house
|
|
44
|
+
* module locator: the customer's helper module is found through the same import. */
|
|
45
|
+
export declare function importedModules(testFile: string, spec: UtilsLanguageSpec,
|
|
46
|
+
/** `existing` (default) returns only files on disk; `all` returns every candidate
|
|
47
|
+
* path the imports could resolve to, so a caller can ask HEAD about a module the
|
|
48
|
+
* working tree no longer holds. */
|
|
49
|
+
which?: "existing" | "all"): Promise<string[]>;
|
|
50
|
+
/** One relative import a TypeScript/JavaScript spec makes, and where it could
|
|
51
|
+
* resolve. Package imports are not here: a package the sandbox lacks is a
|
|
52
|
+
* missing-node_modules trap the gate must fail OPEN on, and the spec's own
|
|
53
|
+
* relative imports are the evidence it can check. */
|
|
54
|
+
export interface SpecImport {
|
|
55
|
+
/** As written: `./skyrampUtils`, `../helpers/auth.js`. */
|
|
56
|
+
specifier: string;
|
|
57
|
+
/** Every file the specifier could resolve to, in resolution order. */
|
|
58
|
+
candidates: string[];
|
|
59
|
+
/** The first candidate that exists, canonical, or `undefined`. */
|
|
60
|
+
resolved?: string;
|
|
61
|
+
}
|
|
62
|
+
/** The relative imports of a TypeScript/JavaScript spec, each resolved against the
|
|
63
|
+
* files beside it. Empty for Python, where a relative import and a package import
|
|
64
|
+
* are spelled the same and cannot be told apart. Never throws. */
|
|
65
|
+
export declare function resolveSpecImports(testFile: string, spec: UtilsLanguageSpec): Promise<SpecImport[]>;
|