@skyramp/mcp 0.4.1 → 0.4.2-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/build/adapters/jestAdapter.js +23 -5
  2. package/build/adapters/mochaAdapter.js +7 -1
  3. package/build/adapters/playwrightAdapter.js +3 -1
  4. package/build/adapters/pytestAdapter.js +14 -3
  5. package/build/commands/localDevTestChangesCommand.js +1 -0
  6. package/build/commands/recommendTestsAndExecuteCommand.js +5 -6
  7. package/build/commands/testThisEndpointCommand.js +16 -4
  8. package/build/index.js +34 -4
  9. package/build/playwright/blueprintDigest.js +28 -7
  10. package/build/playwright/registerPlaywrightTools.js +33 -28
  11. package/build/playwright/traceRecordingPrompt.js +9 -2
  12. package/build/prompts/code-reuse.js +95 -29
  13. package/build/prompts/fix-error-prompt.d.ts +9 -1
  14. package/build/prompts/fix-error-prompt.js +31 -28
  15. package/build/prompts/local-dev/local-dev-plan.d.ts +3 -0
  16. package/build/prompts/local-dev/local-dev-plan.js +3 -1
  17. package/build/prompts/local-dev/local-dev-prompts.d.ts +1 -1
  18. package/build/prompts/local-dev/local-dev-prompts.js +30 -3
  19. package/build/prompts/modularization/integration-test-modularization.js +13 -6
  20. package/build/prompts/modularization/ui-test-modularization.js +1 -1
  21. package/build/prompts/personas.js +1 -1
  22. package/build/prompts/pom-aware-code-reuse.js +7 -9
  23. package/build/prompts/reuse-hand-off.d.ts +64 -0
  24. package/build/prompts/reuse-hand-off.js +130 -0
  25. package/build/prompts/shared-helper-policy.d.ts +88 -2
  26. package/build/prompts/shared-helper-policy.js +145 -11
  27. package/build/prompts/sut-setup/modes/adaptWorkflowPrompt.js +1 -1
  28. package/build/prompts/sut-setup/modes/dockerComposePrompt.js +1 -1
  29. package/build/prompts/sut-setup/shared.d.ts +4 -1
  30. package/build/prompts/sut-setup/shared.js +2 -2
  31. package/build/prompts/test-maintenance/actionsInstructions.d.ts +19 -11
  32. package/build/prompts/test-maintenance/actionsInstructions.js +47 -26
  33. package/build/prompts/test-maintenance/drift-analysis-prompt.js +3 -2
  34. package/build/prompts/test-maintenance/driftAnalysisSections.js +5 -3
  35. package/build/prompts/test-maintenance/driftAnalysisShared.js +4 -2
  36. package/build/prompts/test-maintenance/uiDriftAnalysisSections.js +7 -4
  37. package/build/prompts/test-recommendation/recommendationSections.js +19 -8
  38. package/build/prompts/test-recommendation/registerRecommendTestsPrompt.js +5 -2
  39. package/build/prompts/test-recommendation/test-recommendation-prompt.js +10 -7
  40. package/build/prompts/testbot/testbot-prompts.js +123 -55
  41. package/build/recommendation/answers.js +18 -9
  42. package/build/recommendation/pullRequestText.js +1 -1
  43. package/build/recommendation/registerPlan.js +31 -17
  44. package/build/recommendation/subjectStep.d.ts +8 -10
  45. package/build/recommendation/subjectStep.js +17 -16
  46. package/build/recommendation/types.d.ts +71 -17
  47. package/build/recommendation/types.js +9 -15
  48. package/build/recommendation/verifierContracts.d.ts +7 -3
  49. package/build/recommendation/verifierContracts.js +8 -4
  50. package/build/recommendation/verifiers/changedFile.js +11 -13
  51. package/build/recommendation/verifiers/citedPath.d.ts +8 -0
  52. package/build/recommendation/verifiers/citedPath.js +16 -2
  53. package/build/recommendation/verifiers/coverage.d.ts +2 -2
  54. package/build/recommendation/verifiers/coverage.js +190 -134
  55. package/build/recommendation/verifiers/defects.js +56 -16
  56. package/build/recommendation/verifiers/deliveredMatchesPlan.d.ts +7 -1
  57. package/build/recommendation/verifiers/deliveredMatchesPlan.js +28 -14
  58. package/build/recommendation/verifiers/endpointGrounded.js +14 -8
  59. package/build/recommendation/verifiers/existingCoverage.d.ts +6 -0
  60. package/build/recommendation/verifiers/existingCoverage.js +30 -21
  61. package/build/recommendation/verifiers/expectedOutcome.js +17 -8
  62. package/build/recommendation/verifiers/expectedValueSourced.js +54 -43
  63. package/build/recommendation/verifiers/issueTraceability.d.ts +5 -0
  64. package/build/recommendation/verifiers/issueTraceability.js +64 -7
  65. package/build/recommendation/verifiers/removedElementGuarded.js +19 -11
  66. package/build/recommendation/verifiers/reportedCategory.js +9 -4
  67. package/build/recommendation/verifiers/requirementSourced.js +34 -21
  68. package/build/recommendation/verifiers/screenRoute.js +15 -10
  69. package/build/recommendation/verifiers/statedDifference.js +15 -8
  70. package/build/recommendation/verifiers/uiElementGrounded.js +50 -16
  71. package/build/resources/analysisResources.js +7 -3
  72. package/build/resources/progressResource.js +4 -2
  73. package/build/resources/sutSetupResource.js +20 -2
  74. package/build/resources/testbotResource.js +19 -1
  75. package/build/services/AnalyticsService.js +3 -1
  76. package/build/services/ScenarioGenerationService.js +5 -5
  77. package/build/services/TestDiscoveryService.js +21 -5
  78. package/build/services/TestExecutionService.js +63 -21
  79. package/build/services/TestGenerationService.d.ts +1 -1
  80. package/build/services/TestGenerationService.js +43 -24
  81. package/build/skills/enhanceAssertionsSkill.d.ts +45 -0
  82. package/build/skills/enhanceAssertionsSkill.js +103 -0
  83. package/build/skills/fixTestImportErrorsSkill.d.ts +2 -2
  84. package/build/skills/fixTestImportErrorsSkill.js +2 -2
  85. package/build/skills/skillFiles.d.ts +38 -0
  86. package/build/skills/skillFiles.js +94 -0
  87. package/build/skills/validateAssertionAlignmentSkill.d.ts +34 -0
  88. package/build/skills/validateAssertionAlignmentSkill.js +59 -0
  89. package/build/tool-phases.js +4 -0
  90. package/build/tools/auth/loginTool.js +3 -1
  91. package/build/tools/auth/logoutTool.js +3 -1
  92. package/build/tools/code-refactor/alignAssertionsTool.d.ts +2 -0
  93. package/build/tools/code-refactor/alignAssertionsTool.js +51 -0
  94. package/build/tools/code-refactor/assertion-state.d.ts +1 -1
  95. package/build/tools/code-refactor/assertion-state.js +1 -1
  96. package/build/tools/code-refactor/assertionOperations.d.ts +44 -0
  97. package/build/tools/code-refactor/assertionOperations.js +82 -0
  98. package/build/tools/code-refactor/assertionSkillTools.d.ts +3 -0
  99. package/build/tools/code-refactor/assertionSkillTools.js +86 -0
  100. package/build/tools/code-refactor/codeReuseTool.js +27 -3
  101. package/build/tools/code-refactor/enhanceAssertionsTool.js +19 -83
  102. package/build/tools/code-refactor/gate-markers.d.ts +51 -0
  103. package/build/tools/code-refactor/gate-markers.js +95 -0
  104. package/build/tools/code-refactor/retrofit-state.d.ts +3 -1
  105. package/build/tools/code-refactor/retrofit-state.js +44 -2
  106. package/build/tools/code-refactor/reuse-outcome.d.ts +23 -1
  107. package/build/tools/code-refactor/reuse-outcome.js +36 -13
  108. package/build/tools/code-refactor/reuse-state.d.ts +90 -16
  109. package/build/tools/code-refactor/reuse-state.js +191 -61
  110. package/build/tools/code-refactor/utils-verify-gates.d.ts +4 -0
  111. package/build/tools/code-refactor/utils-verify-gates.js +252 -27
  112. package/build/tools/code-refactor/verify-gates.d.ts +15 -1
  113. package/build/tools/code-refactor/verify-gates.js +36 -4
  114. package/build/tools/enrichTestWithMocksTool.d.ts +1 -1
  115. package/build/tools/enrichTestWithMocksTool.js +9 -5
  116. package/build/tools/executeSkyrampTestTool.d.ts +22 -1
  117. package/build/tools/executeSkyrampTestTool.js +571 -271
  118. package/build/tools/execution-video-state.js +1 -1
  119. package/build/tools/fixErrorTool.js +5 -6
  120. package/build/tools/generate-tests/batchMockGenerationTool.js +1 -1
  121. package/build/tools/generate-tests/generateBatchScenarioRestTool.js +114 -73
  122. package/build/tools/generate-tests/generateContractRestTool.js +34 -16
  123. package/build/tools/generate-tests/generateE2ERestTool.d.ts +1 -0
  124. package/build/tools/generate-tests/generateE2ERestTool.js +9 -1
  125. package/build/tools/generate-tests/generateIntegrationRestTool.js +22 -7
  126. package/build/tools/generate-tests/generateMockRestTool.js +3 -1
  127. package/build/tools/generate-tests/generateUIRestTool.d.ts +2 -0
  128. package/build/tools/generate-tests/generateUIRestTool.js +11 -2
  129. package/build/tools/generate-tests/loadTestSchema.js +1 -3
  130. package/build/tools/generate-tests/planGuard.js +6 -3
  131. package/build/tools/generate-tests/scenarioFileIdentity.js +4 -1
  132. package/build/tools/generate-tests/scenarioLint.js +17 -5
  133. package/build/tools/generate-tests/trace-reuse-guard.js +5 -2
  134. package/build/tools/generateEnrichedIntegrationTestTool.js +9 -3
  135. package/build/tools/one-click/oneClickTool.js +3 -1
  136. package/build/tools/preflightMockCheckTool.js +23 -7
  137. package/build/tools/runExistingTestsTool.d.ts +1 -1
  138. package/build/tools/runExistingTestsTool.js +43 -21
  139. package/build/tools/submitReportTool.d.ts +51 -12
  140. package/build/tools/submitReportTool.js +860 -161
  141. package/build/tools/test-management/actionsTool.js +210 -51
  142. package/build/tools/test-management/analyzeChangesTool.d.ts +4 -5
  143. package/build/tools/test-management/analyzeChangesTool.js +127 -68
  144. package/build/tools/test-management/analyzeTestHealthTool.js +35 -13
  145. package/build/tools/test-management/registerTestPlanTool.d.ts +44 -34
  146. package/build/tools/test-management/registerTestPlanTool.js +255 -111
  147. package/build/tools/test-management/resolveScreenTool.js +33 -9
  148. package/build/tools/trace/startTraceCollectionTool.js +3 -1
  149. package/build/tools/trace/stopTraceCollectionTool.js +41 -5
  150. package/build/tools/verifyTestDependenciesTool.d.ts +3 -0
  151. package/build/tools/verifyTestDependenciesTool.js +54 -0
  152. package/build/tools/workspace/initScanWorkspaceTool.js +9 -3
  153. package/build/tools/workspace/initializeWorkspaceTool.js +3 -1
  154. package/build/types/AssertionOutcome.d.ts +1 -1
  155. package/build/types/EnhanceType.d.ts +6 -0
  156. package/build/types/EnhanceType.js +1 -0
  157. package/build/types/ExternalTestExecution.d.ts +2 -2
  158. package/build/types/RepositoryAnalysis.d.ts +0 -40
  159. package/build/types/ReuseOutcome.d.ts +96 -4
  160. package/build/types/ReuseOutcome.js +16 -0
  161. package/build/types/StepMethod.js +20 -6
  162. package/build/types/TestAnalysis.d.ts +10 -2
  163. package/build/types/TestExecution.d.ts +45 -0
  164. package/build/types/TestRecommendation.d.ts +1 -1
  165. package/build/types/TestRecommendation.js +4 -1
  166. package/build/types/TestTypes.d.ts +13 -0
  167. package/build/types/TestTypes.js +34 -3
  168. package/build/types/TestbotPromptOptions.d.ts +9 -1
  169. package/build/types/TestbotReport.d.ts +45 -9
  170. package/build/utils/AnalysisStateManager.d.ts +137 -27
  171. package/build/utils/AnalysisStateManager.js +227 -43
  172. package/build/utils/assertion-verify/api-shared-lints.js +34 -16
  173. package/build/utils/assertion-verify/metrics.js +39 -6
  174. package/build/utils/assertion-verify/ui-lints.js +4 -2
  175. package/build/utils/branchDiff.js +47 -12
  176. package/build/utils/canonicalJson.js +3 -1
  177. package/build/utils/dartRouteExtractor.js +36 -7
  178. package/build/utils/fixAttempts.d.ts +26 -0
  179. package/build/utils/fixAttempts.js +109 -0
  180. package/build/utils/frontendSelectors.js +23 -4
  181. package/build/utils/generatedTestRecord.d.ts +19 -0
  182. package/build/utils/generatedTestRecord.js +61 -0
  183. package/build/utils/gitStaging.js +7 -2
  184. package/build/utils/initAgent.js +26 -6
  185. package/build/utils/language-helper.js +39 -45
  186. package/build/utils/pathMatching.js +2 -1
  187. package/build/utils/pathSignatures.js +6 -2
  188. package/build/utils/planMatchKeys.d.ts +2 -2
  189. package/build/utils/planMatchKeys.js +20 -14
  190. package/build/utils/pom-catalog-parse.js +7 -2
  191. package/build/utils/pom-scope/import-expansion.js +6 -1
  192. package/build/utils/pom-scope/index.js +50 -12
  193. package/build/utils/pom-scope/scoring.js +13 -3
  194. package/build/utils/pom-scope/selector-extractor.js +16 -3
  195. package/build/utils/pom-scope/strip.d.ts +8 -0
  196. package/build/utils/pom-scope/strip.js +238 -0
  197. package/build/utils/pom-scope/testIdDiscovery.js +14 -2
  198. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.d.ts +1 -1
  199. package/build/utils/pom-verify/__fixtures__/af-style/asset-list.page.js +4 -2
  200. package/build/utils/pom-verify/__fixtures__/af-style/report.iframe.page.js +3 -1
  201. package/build/utils/pom-verify/__fixtures__/af-style/workflow-footer.page.js +3 -1
  202. package/build/utils/pom-verify/bindings.js +5 -1
  203. package/build/utils/pom-verify/calls.js +9 -2
  204. package/build/utils/pom-verify/verify.js +27 -5
  205. package/build/utils/pr-comment-parser.js +20 -7
  206. package/build/utils/proxy-terminal.d.ts +19 -1
  207. package/build/utils/proxy-terminal.js +346 -21
  208. package/build/utils/removedUiElements.js +1 -1
  209. package/build/utils/reportLanguage.js +35 -7
  210. package/build/utils/reportVerification.d.ts +14 -8
  211. package/build/utils/reportVerification.js +19 -19
  212. package/build/utils/repositorySlug.d.ts +32 -0
  213. package/build/utils/repositorySlug.js +77 -0
  214. package/build/utils/reuseRouting.js +6 -2
  215. package/build/utils/runSerialized.d.ts +3 -0
  216. package/build/utils/runSerialized.js +39 -0
  217. package/build/utils/screenRoutes.js +74 -18
  218. package/build/utils/sourceRouteExtractor.js +13 -6
  219. package/build/utils/telemetry.d.ts +1 -0
  220. package/build/utils/telemetry.js +8 -5
  221. package/build/utils/testDependencyPolicy.d.ts +9 -0
  222. package/build/utils/testDependencyPolicy.js +788 -0
  223. package/build/utils/testExecutionRecord.d.ts +90 -0
  224. package/build/utils/testExecutionRecord.js +267 -0
  225. package/build/utils/testFileClassification.js +3 -1
  226. package/build/utils/trace-parser.js +62 -14
  227. package/build/utils/urlPath.js +3 -1
  228. package/build/utils/utils-verify/action-key.d.ts +4 -0
  229. package/build/utils/utils-verify/action-key.js +2 -2
  230. package/build/utils/utils-verify/allow.d.ts +122 -3
  231. package/build/utils/utils-verify/allow.js +146 -21
  232. package/build/utils/utils-verify/body-reach.d.ts +120 -0
  233. package/build/utils/utils-verify/body-reach.js +335 -0
  234. package/build/utils/utils-verify/call-sites.d.ts +6 -1
  235. package/build/utils/utils-verify/call-sites.js +72 -8
  236. package/build/utils/utils-verify/delivered-imports.d.ts +43 -0
  237. package/build/utils/utils-verify/delivered-imports.js +84 -0
  238. package/build/utils/utils-verify/fixed-sleep.d.ts +96 -0
  239. package/build/utils/utils-verify/fixed-sleep.js +461 -0
  240. package/build/utils/utils-verify/in-house.d.ts +93 -0
  241. package/build/utils/utils-verify/in-house.js +719 -0
  242. package/build/utils/utils-verify/incumbent.d.ts +3 -0
  243. package/build/utils/utils-verify/incumbent.js +75 -0
  244. package/build/utils/utils-verify/index.d.ts +1 -0
  245. package/build/utils/utils-verify/index.js +1 -0
  246. package/build/utils/utils-verify/language-spec.d.ts +26 -10
  247. package/build/utils/utils-verify/language-spec.js +217 -20
  248. package/build/utils/utils-verify/locate.d.ts +26 -0
  249. package/build/utils/utils-verify/locate.js +125 -23
  250. package/build/utils/utils-verify/module-name.d.ts +40 -0
  251. package/build/utils/utils-verify/module-name.js +98 -0
  252. package/build/utils/utils-verify/parse.d.ts +46 -6
  253. package/build/utils/utils-verify/parse.js +176 -38
  254. package/build/utils/utils-verify/retrofit-equivalence.d.ts +5 -0
  255. package/build/utils/utils-verify/retrofit-equivalence.js +4 -2
  256. package/build/utils/utils-verify/stage.d.ts +5 -0
  257. package/build/utils/utils-verify/stage.js +47 -2
  258. package/build/utils/utils-verify/status-once.d.ts +62 -0
  259. package/build/utils/utils-verify/status-once.js +207 -0
  260. package/build/utils/utils-verify/typecheck.d.ts +61 -0
  261. package/build/utils/utils-verify/typecheck.js +338 -0
  262. package/build/utils/utils-verify/verify.d.ts +76 -1
  263. package/build/utils/utils-verify/verify.js +516 -44
  264. package/build/utils/versions.d.ts +3 -3
  265. package/build/utils/versions.js +1 -1
  266. package/build/utils/workspaceAuth.js +107 -37
  267. package/build/workspace/queryParamResolution.js +11 -4
  268. package/build/workspace/workspace.js +7 -7
  269. package/node_modules/playwright/ThirdPartyNotices.txt +19 -19
  270. package/node_modules/playwright/lib/mcp/skyramp/assertTool.js +8 -2
  271. package/node_modules/playwright/lib/mcp/skyramp/common/cssValue.js +87 -0
  272. package/node_modules/playwright/lib/mcp/skyramp/loadTraceTool.js +31 -0
  273. package/node_modules/playwright/lib/mcp/skyramp/skyRampImport.js +3 -0
  274. package/node_modules/playwright/lib/mcp/skyramp/traceRecordingBackend.js +181 -15
  275. package/node_modules/playwright/lib/mcp/test/skyRampExport.js +24 -0
  276. package/node_modules/playwright/lib/transform/babelBundleImpl.js +2353 -190
  277. package/node_modules/playwright/node_modules/playwright-core/ThirdPartyNotices.txt +62 -34
  278. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/.package-lock.json +72 -41
  279. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.js +1 -1
  280. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/dist/serve-static.mjs +1 -1
  281. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/@hono/node-server/package.json +2 -2
  282. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/README.md +16 -1
  283. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/index.js +4 -20
  284. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/read.js +17 -17
  285. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/json.js +60 -32
  286. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/raw.js +3 -3
  287. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/text.js +3 -3
  288. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/types/urlencoded.js +16 -20
  289. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/lib/utils.js +18 -16
  290. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/LICENSE +22 -0
  291. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/README.md +71 -0
  292. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.d.ts +46 -0
  293. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js +176 -0
  294. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/dist/index.js.map +1 -0
  295. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/node_modules/content-type/package.json +52 -0
  296. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/body-parser/package.json +23 -10
  297. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/CHANGELOG.md +21 -14
  298. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/isObject.d.ts +1 -1
  299. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/package.json +6 -7
  300. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/es-object-atoms/tsconfig.json +1 -0
  301. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/index.js +266 -45
  302. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/schemes.js +9 -4
  303. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/lib/utils.js +396 -92
  304. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/package.json +1 -1
  305. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  306. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/equal.test.js +31 -3
  307. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  308. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  309. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  310. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  311. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  312. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/parse.test.js +7 -3
  313. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  314. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  315. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  316. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  317. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/security.test.js +301 -3
  318. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  319. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  320. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/CHANGELOG.md +7 -0
  321. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/index.d.ts +0 -1
  322. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hasown/package.json +4 -5
  323. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/client.js +30 -16
  324. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/client/utils.js +4 -1
  325. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/context.js +32 -13
  326. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  327. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/proxy/index.js +4 -0
  328. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  329. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  330. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/helper/streaming/sse.js +5 -4
  331. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/hono-base.js +10 -8
  332. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/base.js +44 -23
  333. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/components.js +25 -26
  334. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/context.js +5 -5
  335. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  336. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/dom/server.js +5 -1
  337. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/hooks/index.js +16 -13
  338. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/intrinsic-element/components.js +3 -3
  339. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/jsx/streaming.js +4 -5
  340. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cache/index.js +103 -8
  341. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/compress/index.js +5 -0
  342. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/cors/index.js +17 -14
  343. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  344. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/digest.js +47 -1
  345. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/etag/index.js +7 -4
  346. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +9 -4
  347. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +9 -4
  348. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/language/language.js +10 -6
  349. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/method-not-allowed/index.js +90 -0
  350. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  351. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/middleware/secure-headers/secure-headers.js +16 -7
  352. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/request.js +20 -13
  353. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  354. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  355. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +65 -59
  356. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +71 -128
  357. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +14 -5
  358. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/node.js +47 -70
  359. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  360. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router/utils.js +27 -0
  361. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/router.js +1 -1
  362. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/accept.js +1 -1
  363. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/body.js +21 -3
  364. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/cookie.js +4 -3
  365. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  366. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/stream.js +12 -3
  367. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/cjs/utils/url.js +19 -11
  368. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/client.js +30 -16
  369. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/client/utils.js +4 -1
  370. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/context.js +32 -13
  371. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  372. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/proxy/index.js +4 -0
  373. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  374. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  375. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/helper/streaming/sse.js +5 -4
  376. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/hono-base.js +10 -8
  377. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/base.js +41 -23
  378. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/components.js +26 -27
  379. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/context.js +6 -6
  380. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/render.js +2 -0
  381. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/dom/server.js +5 -1
  382. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/hooks/index.js +16 -13
  383. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/intrinsic-element/components.js +4 -4
  384. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/jsx/streaming.js +5 -6
  385. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cache/index.js +103 -8
  386. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/compress/index.js +5 -0
  387. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/cors/index.js +17 -14
  388. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  389. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/digest.js +47 -1
  390. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/etag/index.js +7 -4
  391. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwk/jwk.js +9 -4
  392. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/jwt/jwt.js +9 -4
  393. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/language/language.js +10 -6
  394. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/method-not-allowed/index.js +68 -0
  395. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  396. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/middleware/secure-headers/secure-headers.js +16 -7
  397. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/request.js +21 -14
  398. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/linear-router/router.js +7 -2
  399. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  400. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/node.js +61 -58
  401. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/router.js +77 -129
  402. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/reg-exp-router/trie.js +14 -5
  403. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/node.js +47 -70
  404. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/trie-router/router.js +3 -11
  405. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router/utils.js +5 -0
  406. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/router.js +1 -1
  407. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/adapter/aws-lambda/types.d.ts +9 -0
  408. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/client/types.d.ts +1 -1
  409. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/context.d.ts +6 -2
  410. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/hono-base.d.ts +4 -3
  411. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/base.d.ts +7 -2
  412. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/index.d.ts +5 -5
  413. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/intrinsic-element/components.d.ts +2 -2
  414. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/dom/server.d.ts +5 -5
  415. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/hooks/index.d.ts +8 -6
  416. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/jsx/index.d.ts +5 -5
  417. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cache/index.d.ts +6 -4
  418. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/combine/index.d.ts +1 -1
  419. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/cors/index.d.ts +1 -1
  420. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jsx-renderer/index.d.ts +2 -2
  421. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwk/jwk.d.ts +2 -0
  422. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/jwt/jwt.d.ts +2 -0
  423. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/method-not-allowed/index.d.ts +49 -0
  424. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/middleware/secure-headers/permissions-policy.d.ts +3 -3
  425. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +4 -1
  426. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +2 -1
  427. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  428. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  429. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  430. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/router.d.ts +1 -1
  431. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/headers.d.ts +2 -2
  432. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/types/utils/url.d.ts +5 -0
  433. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/accept.js +1 -1
  434. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/body.js +21 -3
  435. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/cookie.js +5 -4
  436. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/ipaddr.js +5 -3
  437. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/stream.js +12 -3
  438. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/dist/utils/url.js +17 -10
  439. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/hono/package.json +11 -4
  440. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/README.md +173 -143
  441. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.d.ts +11 -0
  442. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/address-error.js.map +1 -1
  443. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.d.ts +49 -0
  444. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js +79 -4
  445. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/common.js.map +1 -1
  446. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  447. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js +119 -24
  448. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv4.js.map +1 -1
  449. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  450. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js +316 -90
  451. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/ipv6.js.map +1 -1
  452. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  453. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js +45 -2
  454. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  455. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  456. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js +50 -3
  457. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  458. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/ip-address/package.json +6 -4
  459. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/.github/THREAT_MODEL.md +3 -3
  460. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/CHANGELOG.md +26 -0
  461. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/README.md +19 -1
  462. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/dist/qs.js +25 -25
  463. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/eslint.config.mjs +1 -1
  464. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/parse.js +16 -6
  465. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/stringify.js +23 -8
  466. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/lib/utils.js +57 -11
  467. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/package.json +8 -7
  468. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/parse.js +419 -0
  469. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/stringify.js +317 -0
  470. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/qs/test/utils.js +206 -0
  471. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/CHANGELOG.md +10 -0
  472. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/README.md +1 -1
  473. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/index.js +5 -2
  474. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/package.json +10 -10
  475. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/side-channel/test/index.js +16 -0
  476. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/index.js +8 -18
  477. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/LICENSE +22 -0
  478. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/README.md +71 -0
  479. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.d.ts +46 -0
  480. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js +176 -0
  481. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/dist/index.js.map +1 -0
  482. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/node_modules/content-type/package.json +52 -0
  483. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/node_modules/type-is/package.json +9 -5
  484. package/node_modules/playwright/node_modules/playwright-core/bundles/mcp/package-lock.json +72 -41
  485. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/.package-lock.json +6 -6
  486. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/README.md +23 -1
  487. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/index.js +265 -86
  488. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/brace-expansion/package.json +1 -1
  489. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/README.md +173 -143
  490. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.d.ts +11 -0
  491. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/address-error.js.map +1 -1
  492. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.d.ts +49 -0
  493. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js +79 -4
  494. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/common.js.map +1 -1
  495. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.d.ts +78 -5
  496. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js +119 -24
  497. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv4.js.map +1 -1
  498. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.d.ts +151 -10
  499. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js +316 -90
  500. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/ipv6.js.map +1 -1
  501. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  502. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js +45 -2
  503. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  504. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  505. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js +50 -3
  506. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  507. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/node_modules/ip-address/package.json +6 -4
  508. package/node_modules/playwright/node_modules/playwright-core/bundles/utils/package-lock.json +6 -6
  509. package/node_modules/playwright/node_modules/playwright-core/lib/cli/program.js +18 -9
  510. package/node_modules/playwright/node_modules/playwright-core/lib/mcpBundleImpl/index.js +47 -47
  511. package/node_modules/playwright/node_modules/playwright-core/lib/server/codegen/skyramp/jsonlReader.js +3 -0
  512. package/node_modules/playwright/node_modules/playwright-core/lib/server/recorder/recorderRunner.js +42 -0
  513. package/node_modules/playwright/node_modules/playwright-core/lib/utilsBundleImpl/index.js +121 -121
  514. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/{index.B7KbSQcC.js → index.BAkLd5DX.js} +1 -1
  515. package/node_modules/playwright/node_modules/playwright-core/lib/vite/traceViewer/index.html +1 -1
  516. package/node_modules/playwright/node_modules/playwright-core/package.json +1 -1
  517. package/node_modules/playwright/node_modules/playwright-core/src/cli/program.ts +31 -9
  518. package/node_modules/playwright/node_modules/playwright-core/src/server/codegen/skyramp/jsonlReader.ts +1 -0
  519. package/node_modules/playwright/node_modules/playwright-core/src/server/recorder/recorderRunner.ts +57 -1
  520. package/node_modules/playwright/package.json +2 -2
  521. package/package.json +7 -6
  522. package/plugin/prompts/code-reuse/hand-off.md +30 -0
  523. package/plugin/prompts/generate-tests/generation.md +1 -1
  524. package/plugin/prompts/plan-tests.md +14 -14
  525. package/plugin/prompts/testbot-task1.md +4 -2
  526. package/plugin/skills/enhance-assertions/SKILL.md +25 -0
  527. package/plugin/skills/enhance-assertions/reference/contract.md +51 -0
  528. package/plugin/skills/enhance-assertions/reference/integration.md +58 -0
  529. package/plugin/skills/enhance-assertions/reference/shared-rules.md +220 -0
  530. package/plugin/skills/enhance-assertions/reference/ui.md +373 -0
  531. package/plugin/skills/fix-test-import-errors/SKILL.md +44 -50
  532. package/plugin/skills/validate-assertion-alignment-post-execution/SKILL.md +32 -0
  533. package/plugin/skills/validate-assertion-alignment-post-execution/reference/checks.md +44 -0
  534. package/plugin/skills/validate-assertion-alignment-post-execution/reference/evidence.md +47 -0
  535. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.d.ts +0 -2
  536. package/build/prompts/enhance-assertions/contractProviderAssertionsPrompt.js +0 -29
  537. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.d.ts +0 -2
  538. package/build/prompts/enhance-assertions/integrationAssertionsPrompt.js +0 -36
  539. package/build/prompts/enhance-assertions/sharedAssertionRules.d.ts +0 -16
  540. package/build/prompts/enhance-assertions/sharedAssertionRules.js +0 -284
  541. package/build/prompts/enhance-assertions/uiAssertionsPrompt.d.ts +0 -2
  542. package/build/prompts/enhance-assertions/uiAssertionsPrompt.js +0 -388
  543. package/node_modules/playwright/node_modules/playwright-core/.DS_Store +0 -0
@@ -49,7 +49,8 @@ export const isBareIdPath = (path) => {
49
49
  return (segs.length > 0 &&
50
50
  segs.every((seg) => {
51
51
  const canonical = canonicalSegment(seg);
52
- return canonical.startsWith("{") && canonical.slice(1, -1).toLowerCase() === "id";
52
+ return (canonical.startsWith("{") &&
53
+ canonical.slice(1, -1).toLowerCase() === "id");
53
54
  }));
54
55
  };
55
56
  // Segment-boundary suffix match: avoids "/orders" matching "/preorders".
@@ -27,7 +27,9 @@ export function buildPathSignatures(file) {
27
27
  // import of "./Foo" — special-case the compound extension.
28
28
  const isDts = /\.d\.ts$/i.test(file);
29
29
  const ext = isDts ? ".d.ts" : path.extname(file);
30
- const basename = isDts ? path.basename(file, ".d.ts") : path.basename(file, ext);
30
+ const basename = isDts
31
+ ? path.basename(file, ".d.ts")
32
+ : path.basename(file, ext);
31
33
  const quotes = [`'`, `"`, "`"];
32
34
  const stems = [`/${basename}`, `/${basename}${ext}`];
33
35
  // An index module is normally imported by its directory (`from './_constants'`,
@@ -43,7 +45,9 @@ export function buildPathSignatures(file) {
43
45
  /** True for `index.<ext>` modules, including `index.d.ts` (the same test buildPathSignatures uses). */
44
46
  export function isIndexModule(file) {
45
47
  const isDts = /\.d\.ts$/i.test(file);
46
- return (isDts ? path.basename(file, ".d.ts") : path.basename(file, path.extname(file))) === "index";
48
+ return ((isDts
49
+ ? path.basename(file, ".d.ts")
50
+ : path.basename(file, path.extname(file))) === "index");
47
51
  }
48
52
  /**
49
53
  * True when `importerContent` (the source of `importerFile`) contains an import
@@ -11,7 +11,7 @@
11
11
  * matching (contract tests, or a fallback when names drift between
12
12
  * register and generate).
13
13
  */
14
- import { PlanScenario } from "../types/RepositoryAnalysis.js";
14
+ import { PlannedScenario } from "../recommendation/types.js";
15
15
  import type { PlannedTest } from "../recommendation/types.js";
16
16
  /** Query shape built from a generation-tool call or a reported test entry. */
17
17
  export interface PlanMatchQuery {
@@ -34,7 +34,7 @@ export declare function normalizeMatchPath(rawPath: string | undefined): string;
34
34
  /** Name key (if a name exists) plus one endpoint key per step. BOTH kinds carry
35
35
  * the planned test's test type, or a contract call matches an integration-only
36
36
  * planned test sharing its name. A slug holds no `:`. */
37
- export declare function computeMatchKeys(scenario: PlanScenario): string[];
37
+ export declare function computeMatchKeys(scenario: PlannedScenario): string[];
38
38
  /**
39
39
  * True when `query` matches `keys`:
40
40
  * - by testType + scenarioName slug (`name:<testType>:<slug>`), or
@@ -51,7 +51,9 @@ export function isOpaqueIdSegment(segment) {
51
51
  // The sign belongs to the value: an edge-case step writes `/orders/-1` to
52
52
  // probe a negative id, and without the sign that segment became the resource
53
53
  // name, so the key could never match real order coverage.
54
- return UUID_RE.test(segment) || /^-?\d+$/.test(segment) || /^[0-9a-f]{16,}$/i.test(segment);
54
+ return (UUID_RE.test(segment) ||
55
+ /^-?\d+$/.test(segment) ||
56
+ /^[0-9a-f]{16,}$/i.test(segment));
55
57
  }
56
58
  /**
57
59
  * Normalize a path so param and id segments collapse to `:p`.
@@ -76,22 +78,20 @@ export function normalizeMatchPath(rawPath) {
76
78
  })
77
79
  .join("/");
78
80
  }
79
- /** The scenario is read back from the stored plan, so `steps` is an array only on
80
- * the validated path. `?? []` keeps a malformed plan from costing the call. */
81
- function inferTestType(scenario) {
82
- const steps = Array.isArray(scenario?.steps) ? scenario.steps : [];
83
- return (scenario?.testType ?? (steps.length === 1 ? "contract" : "integration")).toLowerCase();
84
- }
85
81
  /** Name key (if a name exists) plus one endpoint key per step. BOTH kinds carry
86
82
  * the planned test's test type, or a contract call matches an integration-only
87
83
  * planned test sharing its name. A slug holds no `:`. */
88
84
  export function computeMatchKeys(scenario) {
89
85
  const keys = [];
90
- const testType = inferTestType(scenario);
91
- const slug = slugifyName(scenario?.scenarioName);
86
+ const testType = scenario.testType.toLowerCase();
87
+ const slug = slugifyName(scenario.scenarioName);
92
88
  if (slug)
93
89
  keys.push(`name:${testType}:${slug}`);
94
- for (const step of Array.isArray(scenario?.steps) ? scenario.steps : []) {
90
+ // The steps come back off the run state file too, so the array the type declares
91
+ // holds only on the validated path. A corrupted one is no evidence about the
92
+ // scenario, and a throw here failed generation instead of allowing the call.
93
+ const steps = Array.isArray(scenario.steps) ? scenario.steps : [];
94
+ for (const step of steps) {
95
95
  if (!step?.method || !step?.path)
96
96
  continue;
97
97
  keys.push(`ep:${testType}:${step.method.toUpperCase()}:${normalizeMatchPath(step.path)}`);
@@ -127,8 +127,12 @@ function nameAgrees(keys, query) {
127
127
  const nameSlug = query.scenarioName ? slugifyName(query.scenarioName) : "";
128
128
  if (!nameSlug)
129
129
  return false;
130
- const wanted = query.testType ? `name:${query.testType.toLowerCase()}:${nameSlug}` : undefined;
131
- return keys.some((key) => wanted !== undefined ? key === wanted : key.startsWith("name:") && key.endsWith(`:${nameSlug}`));
130
+ const wanted = query.testType
131
+ ? `name:${query.testType.toLowerCase()}:${nameSlug}`
132
+ : undefined;
133
+ return keys.some((key) => wanted !== undefined
134
+ ? key === wanted
135
+ : key.startsWith("name:") && key.endsWith(`:${nameSlug}`));
132
136
  }
133
137
  /** Whether the plan holds this query's endpoint, ignoring the name. Shared by
134
138
  * the name channel — which may no longer answer alone on an endpoint query —
@@ -222,12 +226,14 @@ export function nameMatchedTypeMismatches(plannedTests, query) {
222
226
  // The name channel, minus the type: a key ending in this slug means the plan
223
227
  // holds the scenario, and the segment before it is the type it holds it as.
224
228
  const named = keys.filter((key) => key.startsWith("name:") && key.endsWith(`:${nameSlug}`));
225
- return named.length > 0 && !named.some((key) => key === `name:${calledType}:${nameSlug}`);
229
+ return (named.length > 0 &&
230
+ !named.some((key) => key === `name:${calledType}:${nameSlug}`));
226
231
  });
227
232
  }
228
233
  /** True when `query` matches at least one planned test of the registered plan.
229
234
  * The keys are computed per call rather than stored with the plan, so there is
230
235
  * one description of a planned test and no second shape to drift from it. */
231
236
  export function matchesPlanCandidates(plannedTests, query) {
232
- return plannedTests.some((plannedTest) => !!plannedTest?.scenario && matchesMatchKeys(computeMatchKeys(plannedTest.scenario), query));
237
+ return plannedTests.some((plannedTest) => !!plannedTest?.scenario &&
238
+ matchesMatchKeys(computeMatchKeys(plannedTest.scenario), query));
233
239
  }
@@ -36,7 +36,9 @@ function selectorsFrom(description) {
36
36
  }
37
37
  // A bare token is only a selector if the whole backticked run is one — otherwise
38
38
  // it is prose, or an attribute selector already harvested above.
39
- if (!sawAttr && BARE_TOKEN_RE.test(token) && token.length >= MIN_BARE_TOKEN_LENGTH) {
39
+ if (!sawAttr &&
40
+ BARE_TOKEN_RE.test(token) &&
41
+ token.length >= MIN_BARE_TOKEN_LENGTH) {
40
42
  out.add(token);
41
43
  }
42
44
  }
@@ -125,7 +127,10 @@ function bareMemberName(member) {
125
127
  */
126
128
  export function findMissedReuse(specContent, members) {
127
129
  const locators = extractRawLocatorTokens(specContent);
128
- const compiled = members.map((m) => ({ m, matchers: m.selectors.map(toMatcher) }));
130
+ const compiled = members.map((m) => ({
131
+ m,
132
+ matchers: m.selectors.map(toMatcher),
133
+ }));
129
134
  const missed = [];
130
135
  for (const locator of locators) {
131
136
  const hit = compiled.find(({ matchers }) => matchers.some((re) => re.test(locator)));
@@ -19,7 +19,12 @@ export async function expandImports(selected, allPoms) {
19
19
  if (!ref || !ref.startsWith("."))
20
20
  continue;
21
21
  const base = path.resolve(path.dirname(file), ref);
22
- for (const cand of [base, `${base}.js`, `${base}.ts`, base.replace(/\.js$/, ".ts")]) {
22
+ for (const cand of [
23
+ base,
24
+ `${base}.js`,
25
+ `${base}.ts`,
26
+ base.replace(/\.js$/, ".ts"),
27
+ ]) {
23
28
  if (pomSet.has(cand) && !seen.has(cand)) {
24
29
  seen.add(cand);
25
30
  out.push({ file: cand, referrer: file });
@@ -1,6 +1,6 @@
1
1
  import { readFile, stat } from "fs/promises";
2
2
  import * as path from "path";
3
- import { extractSelectors, DEFAULT_TESTID_ATTRS } from "./selector-extractor.js";
3
+ import { extractSelectors, DEFAULT_TESTID_ATTRS, } from "./selector-extractor.js";
4
4
  import { globPomFiles, globAllSourceFiles } from "./pom-files.js";
5
5
  import { scorePoms } from "./scoring.js";
6
6
  import { expandImports } from "./import-expansion.js";
@@ -9,17 +9,29 @@ import { stripComments } from "./strip.js";
9
9
  const DISCOVERY_FILE_CAP = 3000;
10
10
  export const SELECTION_CAP = 10;
11
11
  export const FINAL_CAP = 25;
12
- const PLAYWRIGHT_CONFIG_NAMES = ["playwright.config.ts", "playwright.config.js", "playwright.config.mjs", "playwright.config.cjs"];
12
+ const PLAYWRIGHT_CONFIG_NAMES = [
13
+ "playwright.config.ts",
14
+ "playwright.config.js",
15
+ "playwright.config.mjs",
16
+ "playwright.config.cjs",
17
+ ];
13
18
  const TESTID_ATTRIBUTE_RE = /testIdAttribute\s*:\s*["']([^"']+)["']/;
14
19
  export async function findRoot(startDir) {
15
20
  let dir = startDir;
16
21
  for (let i = 0; i < 8; i++) {
17
- for (const marker of ["package.json", "tsconfig.json", "jsconfig.json", ".git"]) {
22
+ for (const marker of [
23
+ "package.json",
24
+ "tsconfig.json",
25
+ "jsconfig.json",
26
+ ".git",
27
+ ]) {
18
28
  try {
19
29
  await stat(path.join(dir, marker));
20
30
  return dir;
21
31
  }
22
- catch { /* keep walking */ }
32
+ catch {
33
+ /* keep walking */
34
+ }
23
35
  }
24
36
  const parent = path.dirname(dir);
25
37
  if (parent === dir)
@@ -39,7 +51,9 @@ export async function readTestIdAttribute(root) {
39
51
  if (m)
40
52
  return m[1];
41
53
  }
42
- catch { /* try next filename */ }
54
+ catch {
55
+ /* try next filename */
56
+ }
43
57
  }
44
58
  return undefined;
45
59
  }
@@ -49,7 +63,9 @@ export async function readTestIdAttribute(root) {
49
63
  * the exact-tie case in index.test.ts.
50
64
  */
51
65
  export function tierAndCap(candidates, maxScore) {
52
- const kept = [...candidates].sort((a, b) => b.score - a.score).slice(0, FINAL_CAP);
66
+ const kept = [...candidates]
67
+ .sort((a, b) => b.score - a.score)
68
+ .slice(0, FINAL_CAP);
53
69
  const isTier1 = (c) => c.score > maxScore / 4 || c.rareHits >= 2;
54
70
  const tier1 = kept.filter(isTier1);
55
71
  const tier2 = kept.filter((c) => !isTier1(c));
@@ -57,16 +73,24 @@ export function tierAndCap(candidates, maxScore) {
57
73
  }
58
74
  /** Deterministic POM pre-scoping. tier1/tier2 both [] ⇒ caller must fall back to the unscoped prompt. */
59
75
  export async function selectScopedPoms(opts) {
60
- const empty = (selectors = 0, pomFiles = 0, discovery = "none") => ({ tier1: [], tier2: [], diagnostics: { selectors, pomFiles, scoped: 0, discovery } });
76
+ const empty = (selectors = 0, pomFiles = 0, discovery = "none") => ({
77
+ tier1: [],
78
+ tier2: [],
79
+ diagnostics: { selectors, pomFiles, scoped: 0, discovery },
80
+ });
61
81
  let spec = opts.specContent ?? "";
62
82
  // Prefer the on-disk file (the agent may have rewritten it); fall back to the passed prompt content.
63
83
  try {
64
84
  spec = await readFile(opts.testFile, "utf8");
65
85
  }
66
- catch { /* use provided specContent */ }
86
+ catch {
87
+ /* use provided specContent */
88
+ }
67
89
  const root = await findRoot(path.dirname(opts.testFile));
68
90
  const testIdAttribute = await readTestIdAttribute(root);
69
- const extraTestIdAttrs = testIdAttribute && !DEFAULT_TESTID_ATTRS.includes(testIdAttribute) ? [testIdAttribute] : [];
91
+ const extraTestIdAttrs = testIdAttribute && !DEFAULT_TESTID_ATTRS.includes(testIdAttribute)
92
+ ? [testIdAttribute]
93
+ : [];
70
94
  const selectors = extractSelectors(spec, extraTestIdAttrs);
71
95
  if (selectors.length === 0)
72
96
  return empty();
@@ -111,19 +135,33 @@ export async function selectScopedPoms(opts) {
111
135
  const candidates = expanded.flatMap(({ file, referrer }) => {
112
136
  const own = rankedByFile.get(file);
113
137
  if (own)
114
- return [{ file: own.file, score: own.score, rareHits: own.rareHits, matchedTokens: own.matchedTokens }];
138
+ return [
139
+ {
140
+ file: own.file,
141
+ score: own.score,
142
+ rareHits: own.rareHits,
143
+ matchedTokens: own.matchedTokens,
144
+ },
145
+ ];
115
146
  // Invariant: every expansion addition without an own rank carries the referrer that
116
147
  // pulled it in (expandImports always tags non-selected files this way). Skip
117
148
  // defensively rather than assert, in case that invariant is ever violated.
118
149
  const referrerEntry = referrer ? rankedByFile.get(referrer) : undefined;
119
150
  if (!referrerEntry)
120
151
  return [];
121
- return [{ file, score: referrerEntry.score, rareHits: 0, matchedTokens: [] }];
152
+ return [
153
+ { file, score: referrerEntry.score, rareHits: 0, matchedTokens: [] },
154
+ ];
122
155
  });
123
156
  const { tier1, tier2 } = tierAndCap(candidates, maxScore);
124
157
  return {
125
158
  tier1,
126
159
  tier2,
127
- diagnostics: { selectors: selectors.length, pomFiles: pomFiles.length, scoped: tier1.length + tier2.length, discovery },
160
+ diagnostics: {
161
+ selectors: selectors.length,
162
+ pomFiles: pomFiles.length,
163
+ scoped: tier1.length + tier2.length,
164
+ discovery,
165
+ },
128
166
  };
129
167
  }
@@ -20,12 +20,16 @@ export async function scorePoms(selectors, files) {
20
20
  try {
21
21
  contents.set(f, (await readFile(f, "utf8")).replace(/\\/g, ""));
22
22
  }
23
- catch { /* unreadable file: skip */ }
23
+ catch {
24
+ /* unreadable file: skip */
25
+ }
24
26
  }));
25
27
  // Selectors arrive pre-normalized from extractSelectors — only file contents need stripping.
26
28
  const fileMatches = new Map(); // selector -> files containing it
27
29
  for (const sel of selectors) {
28
- const matched = [...contents.entries()].filter(([, c]) => c.includes(sel)).map(([f]) => f);
30
+ const matched = [...contents.entries()]
31
+ .filter(([, c]) => c.includes(sel))
32
+ .map(([f]) => f);
29
33
  if (matched.length > 0)
30
34
  fileMatches.set(sel, matched);
31
35
  }
@@ -33,7 +37,13 @@ export async function scorePoms(selectors, files) {
33
37
  for (const [sel, matched] of fileMatches) {
34
38
  const df = matched.length;
35
39
  for (const f of matched) {
36
- const s = scores.get(f) ?? { file: f, score: 0, hits: 0, rareHits: 0, matchedTokens: [] };
40
+ const s = scores.get(f) ?? {
41
+ file: f,
42
+ score: 0,
43
+ hits: 0,
44
+ rareHits: 0,
45
+ matchedTokens: [],
46
+ };
37
47
  s.score += 1 / df;
38
48
  s.hits += 1;
39
49
  if (df <= RARE_DF)
@@ -5,7 +5,12 @@
5
5
  */
6
6
  // Default test-id attribute family. Playwright's own default is data-testid, but
7
7
  // data-test/data-qa/data-cy are common conventions in the wild — match them all.
8
- export const DEFAULT_TESTID_ATTRS = ["data-test", "data-testid", "data-qa", "data-cy"];
8
+ export const DEFAULT_TESTID_ATTRS = [
9
+ "data-test",
10
+ "data-testid",
11
+ "data-qa",
12
+ "data-cy",
13
+ ];
9
14
  // Full regex-escape for attr names — a config-supplied testIdAttribute could contain
10
15
  // a stray metachar, which must not be allowed to distort the pattern.
11
16
  import { escapeRegExp as esc } from "../regex.js";
@@ -20,7 +25,10 @@ const attrAnchor = (attrs) => new RegExp(`\\[(?:${attrs.map(esc).join("|")})[$^*
20
25
  // locator values, shared by both extractSelectors and extractRawLocatorTokens.
21
26
  const GET_BY_TEST_ID = /getByTestId\(\s*["']([^"']+)["']/g;
22
27
  const GET_BY_TEXT_LABEL_PLACEHOLDER = /getBy(?:Text|Label|Placeholder)\(\s*["']([^"']+)["']/g;
23
- const LOCATOR_PATTERNS = [GET_BY_TEST_ID, GET_BY_TEXT_LABEL_PLACEHOLDER];
28
+ const LOCATOR_PATTERNS = [
29
+ GET_BY_TEST_ID,
30
+ GET_BY_TEXT_LABEL_PLACEHOLDER,
31
+ ];
24
32
  // getByRole("role", ...) and bare `name: "..."` object keys are useful evidence for
25
33
  // POM *detection* (scoring which page objects a test's actions touch), but they are
26
34
  // NOT raw locator values: a role name isn't a selector, and `name:` matches ANY bare
@@ -28,7 +36,12 @@ const LOCATOR_PATTERNS = [GET_BY_TEST_ID, GET_BY_TEXT_LABEL_PLACEHOLDER];
28
36
  // finding 1). Only extractSelectors (the detection path) includes these.
29
37
  const GET_BY_ROLE = /getByRole\(\s*["']([^"']+)["']/g;
30
38
  const BARE_NAME_FIELD = /name:\s*["']([^"']+)["']/g;
31
- const OTHER_PATTERNS = [GET_BY_TEST_ID, GET_BY_ROLE, BARE_NAME_FIELD, GET_BY_TEXT_LABEL_PLACEHOLDER];
39
+ const OTHER_PATTERNS = [
40
+ GET_BY_TEST_ID,
41
+ GET_BY_ROLE,
42
+ BARE_NAME_FIELD,
43
+ GET_BY_TEXT_LABEL_PLACEHOLDER,
44
+ ];
32
45
  // Raw .locator("...")/.frameLocator("...") strings that are NOT test-id-attribute based
33
46
  // (e.g. ".step-deduplication", "iframe#asset-list").
34
47
  // Quote-type-aware alternates: a double-quoted arg may contain unescaped single quotes
@@ -1,3 +1,11 @@
1
+ /** Every line- and block-comment span in `src`, in source order. Exported for callers
2
+ * that must decide whether a `//` OPENS a comment rather than sits inside one: a `//`
3
+ * on its own line inside `/* … *\/` opens nothing, and deleting that line can take the
4
+ * block's terminator with it. */
5
+ export declare function commentSpans(src: string): {
6
+ start: number;
7
+ end: number;
8
+ }[];
1
9
  /** Blanks line/block comments only, preserving string/template literal contents (e.g. so an
2
10
  * import specifier's quoted path stays readable). Each blanked character becomes a space
3
11
  * (newlines preserved) so remaining code characters keep their original offset. */
@@ -1,3 +1,195 @@
1
+ /**
2
+ * Whether a `/` at `i` opens a regex literal rather than a division.
3
+ *
4
+ * The standard heuristic: a regex may only start where a VALUE may start, so the last
5
+ * significant character before it decides. `a / b` is division; `= /x/`, `( /x/`,
6
+ * `return /x/` are regex literals. A regex is not an edge case for these scanners —
7
+ * `/https:\/\//` holds `//`, and a lexer that does not know the literal reads that as
8
+ * the start of a comment and blanks the rest of the line.
9
+ */
10
+ /** Whether position `k` falls inside a span the lexer already classified — a string, a
11
+ * comment or a regex. Every span before the current position is complete, so this is
12
+ * the state every backward look must consult. A quoted `)`, a `*\/` and a comment
13
+ * between a keyword and its value each defeated one of the three looks below. */
14
+ /** Every keyword a value may follow, so a `/` after one opens a regex and a `{` after
15
+ * one opens an object literal. `throw /[/*]/` is the form that reads naturally in a
16
+ * test file; without it the `/*` inside the character class opened a block comment
17
+ * and blanked the rest of the file. */
18
+ const VALUE_KEYWORDS = [
19
+ "return",
20
+ "throw",
21
+ "typeof",
22
+ "void",
23
+ "delete",
24
+ "instanceof",
25
+ "new",
26
+ "case",
27
+ "default",
28
+ "in",
29
+ "of",
30
+ "do",
31
+ "else",
32
+ "yield",
33
+ "await",
34
+ ];
35
+ /** A `{` after one of these opens a BLOCK, never an object literal. They are in the
36
+ * list above because a `/` after them opens a regex — `else /re/.test(v)` is valid —
37
+ * and one list answering both questions read `else {}` as a value. */
38
+ const BLOCK_KEYWORDS = ["else", "do"];
39
+ /** The keyword token ending at `j`, or "" when the word there is not one.
40
+ *
41
+ * A word after a `.` — or a `?.` — is a PROPERTY NAME, not a keyword: `obj.return`
42
+ * and `it.return()` are ordinary member accesses, and reading them as the keyword
43
+ * opened a regex at the division that follows, which then swallowed the first slash
44
+ * of a trailing comment. Asked once, so the two keyword lookups below cannot drift.
45
+ */
46
+ function keywordAt(src, j, done) {
47
+ const word = (src.slice(0, j + 1).match(/[A-Za-z_$][\w$]*$/) ?? [""])[0];
48
+ if (!word)
49
+ return "";
50
+ let k = j - word.length;
51
+ while (k >= 0 && (/\s/.test(src[k]) || triviaAt(done, k)))
52
+ k--;
53
+ return k >= 0 && src[k] === "." ? "" : word;
54
+ }
55
+ function spanAt(done, k) {
56
+ return done.find((s) => k >= s.start && k < s.end);
57
+ }
58
+ /** A comment is TRIVIA: the token before a `/` is whatever precedes the comment. A
59
+ * string or a regex is a VALUE, so a `/` after one is a division — `"4" / 2` and
60
+ * `/re/ / 2` both divide. Skipping every classified span read `= "4" /` as a regex
61
+ * opener and swallowed the comment that followed. */
62
+ function triviaAt(done, k) {
63
+ return spanAt(done, k)?.kind === "comment";
64
+ }
65
+ /** Structure only. A parenthesis inside a string, a comment or a regex is not part of
66
+ * the balance: a quoted `)` in `if (check(")"))` hid the `if`. */
67
+ function inertAt(done, k) {
68
+ return spanAt(done, k) !== undefined;
69
+ }
70
+ /** Whether the `)` at `close` ends the head of a control statement rather than a
71
+ * call or a grouping. Matched back to its opening paren, then judged by the keyword
72
+ * before it. */
73
+ function closesControlHead(src, close, done) {
74
+ // Parentheses inside a string, a comment or a regex are not structure. They are
75
+ // already classified, because every span before this point is complete — a quoted
76
+ // `)` in `if (check(")"))` hid the `if` when the count read raw characters.
77
+ const inert = (k) => inertAt(done, k);
78
+ let depth = 0;
79
+ let k = close;
80
+ for (; k >= 0; k--) {
81
+ if (inert(k))
82
+ continue;
83
+ if (src[k] === ")")
84
+ depth++;
85
+ else if (src[k] === "(") {
86
+ depth--;
87
+ if (depth === 0)
88
+ break;
89
+ }
90
+ }
91
+ if (k < 0)
92
+ return false;
93
+ // A comment sits between the keyword and its head as legally as whitespace does:
94
+ // `if /* note */ (ready)`. Both are skipped, or the `*\/` reads as the keyword.
95
+ let j = k - 1;
96
+ while (j >= 0 && (/\s/.test(src[j]) || triviaAt(done, j)))
97
+ j--;
98
+ // Through the same question: `obj.if(ready)` is a call on a property, not a head.
99
+ const word = keywordAt(src, j, done);
100
+ return ["if", "while", "for", "with", "switch", "catch"].includes(word);
101
+ }
102
+ /** Whether the `}` at `close` ends an object literal rather than a block. Matched back
103
+ * to its `{`, then judged by whether a VALUE could have started there. */
104
+ function closesObjectLiteral(src, close, done) {
105
+ let depth = 0;
106
+ let k = close;
107
+ for (; k >= 0; k--) {
108
+ if (inertAt(done, k))
109
+ continue;
110
+ if (src[k] === "}")
111
+ depth++;
112
+ else if (src[k] === "{") {
113
+ depth--;
114
+ if (depth === 0)
115
+ break;
116
+ }
117
+ }
118
+ if (k < 0)
119
+ return false;
120
+ let j = k - 1;
121
+ while (j >= 0 && (/\s/.test(src[j]) || triviaAt(done, j)))
122
+ j--;
123
+ if (j < 0)
124
+ return false;
125
+ // `:` is DELIBERATELY absent, though `{ a: {} }` is an object literal. This
126
+ // function decides one thing — whether a `/` after the closing `}` divides — and
127
+ // the two wrong answers do not cost the same. Reading a regex where a division
128
+ // stands is bounded: a regex literal cannot cross a line, and an unterminated one
129
+ // is rejected. Reading a division where a regex stands lets a `/*` inside that
130
+ // regex open a block comment that runs to the end of the file. A colon introduces
131
+ // a statement label, a `case` clause and a `default` clause — all blocks, all of
132
+ // which a `/` may follow — so the safe answer is also the common one here. A
133
+ // division straight after a nested object literal is what it costs.
134
+ if ("=(,[!&|?+-*%~^<>".includes(src[j]))
135
+ return true;
136
+ // A keyword can introduce the value too: `return {}`, `yield {}`, `typeof {}`.
137
+ // Judging the matching `{` by the preceding CHARACTER alone missed every one of
138
+ // them, so `return {} / 2` read as a block and the slash opened a regex.
139
+ const word = keywordAt(src, j, done);
140
+ if (BLOCK_KEYWORDS.includes(word))
141
+ return false;
142
+ return VALUE_KEYWORDS.includes(word);
143
+ }
144
+ function opensRegex(src, i, done) {
145
+ let j = i - 1;
146
+ while (j >= 0 && (/\s/.test(src[j]) || triviaAt(done, j)))
147
+ j--;
148
+ if (j < 0)
149
+ return true;
150
+ // A string or a regex ENDS here, so the slash divides its value.
151
+ if (spanAt(done, j)?.kind === "string")
152
+ return false;
153
+ const prev = src[j];
154
+ // `++` and `--` are POSTFIX here: `count++ / 2` is a division. Reading the `/` as a
155
+ // regex opener swallowed the rest of the line, so the line comment after it was
156
+ // never recognised — and a gate marker in that comment shipped unstripped.
157
+ if ((prev === "+" || prev === "-") && src[j - 1] === prev)
158
+ return false;
159
+ // JSX closes a tag with a slash, and a page object in a React repository is a `.tsx`
160
+ // file, so this is ordinary input. Both closing forms put the slash exactly where a
161
+ // value may start, so the heuristic opened a regex, terminated it on the first slash
162
+ // of the following comment, and left that comment unclassified — a marker in it
163
+ // shipped, and its text stayed readable to every scanner built on this file.
164
+ //
165
+ // ADJACENCY is what separates the two readings, so neither rule costs a real literal:
166
+ // JSX writes `</`, while a regex after a comparison is written `a < /re/`. `/>` is
167
+ // only re-read where the preceding `}` closes a JSX expression container — after `(`
168
+ // or `=` it stays the literal it is, so `s.split(/>/)` is untouched.
169
+ // Only a TAG NAME can follow the `</` of a closing tag — a letter, `_`, `$`, or the
170
+ // `>` of a fragment. A character that cannot start one means this is a regex written
171
+ // tight against a comparison: `a</[/*]/.test(v)` is valid, if unusual, JavaScript.
172
+ if (prev === "<" && j === i - 1 && /[A-Za-z_$>]/.test(src[i + 1] ?? ""))
173
+ return false;
174
+ if (prev === "}" && src[i + 1] === ">")
175
+ return false;
176
+ // A `}` closes a BLOCK, after which a statement — and so a regex — may start; or it
177
+ // closes an OBJECT LITERAL, which is a value, after which `/` divides. Decided by
178
+ // what precedes the matching `{`, the same way the control head is.
179
+ if (prev === "}")
180
+ return !closesObjectLiteral(src, j, done);
181
+ if ("=(,:[!&|?{;+-*%~^<>".includes(prev))
182
+ return true;
183
+ // A `)` usually ends a call, and `total(a) / 2` is a division. But the `)` that
184
+ // closes an `if (…)` head is followed by a STATEMENT, so a `/` after it opens a
185
+ // regex: `if (ready) /re/.test(v)`. Reading that as division let the `/*` inside a
186
+ // character class open a block comment and hide every later comment.
187
+ if (prev === ")" && closesControlHead(src, j, done))
188
+ return true;
189
+ // A keyword that takes a value next. `)` and an identifier character mean division.
190
+ const word = /[A-Za-z_$]/.test(prev) ? keywordAt(src, j, done) : "";
191
+ return VALUE_KEYWORDS.includes(word);
192
+ }
1
193
  /**
2
194
  * Single lexer-lite pass over the source classifying every line comment, block comment, and
3
195
  * string/template literal span (escaped quotes handled; a template literal's `${...}`
@@ -27,6 +219,43 @@ function classifySpans(src) {
27
219
  spans.push({ kind: "comment", start, end: i });
28
220
  continue;
29
221
  }
222
+ // Classified as a string: the callers that blank strings want a regex's contents
223
+ // inert for the same reason, and the ones that blank comments must not touch it.
224
+ if (c === "/" && opensRegex(src, i, spans)) {
225
+ const start = i;
226
+ i++;
227
+ let inClass = false;
228
+ let closed = false;
229
+ while (i < n) {
230
+ const ch = src[i];
231
+ if (ch === "\\") {
232
+ i += 2;
233
+ continue;
234
+ }
235
+ // A regex literal cannot span a line. An unterminated one is not a literal.
236
+ if (ch === "\n")
237
+ break;
238
+ if (ch === "[")
239
+ inClass = true;
240
+ else if (ch === "]")
241
+ inClass = false;
242
+ else if (ch === "/" && !inClass) {
243
+ i++;
244
+ closed = true;
245
+ break;
246
+ }
247
+ i++;
248
+ }
249
+ if (!closed) {
250
+ i = start + 1;
251
+ continue;
252
+ }
253
+ // Trailing flags belong to the literal.
254
+ while (i < n && /[a-z]/.test(src[i]))
255
+ i++;
256
+ spans.push({ kind: "string", start, end: i });
257
+ continue;
258
+ }
30
259
  if (c === "'" || c === '"' || c === "`") {
31
260
  const quote = c;
32
261
  const start = i;
@@ -72,6 +301,15 @@ function blankSpans(src, spans) {
72
301
  }
73
302
  return out.join("");
74
303
  }
304
+ /** Every line- and block-comment span in `src`, in source order. Exported for callers
305
+ * that must decide whether a `//` OPENS a comment rather than sits inside one: a `//`
306
+ * on its own line inside `/* … *\/` opens nothing, and deleting that line can take the
307
+ * block's terminator with it. */
308
+ export function commentSpans(src) {
309
+ return classifySpans(src)
310
+ .filter((s) => s.kind === "comment")
311
+ .map(({ start, end }) => ({ start, end }));
312
+ }
75
313
  /** Blanks line/block comments only, preserving string/template literal contents (e.g. so an
76
314
  * import specifier's quoted path stays readable). Each blanked character becomes a space
77
315
  * (newlines preserved) so remaining code characters keep their original offset. */
@@ -32,7 +32,16 @@ const ATTR_SELECTOR_RE = /\[\s*([A-Za-z][A-Za-z0-9_:-]*)\s*[~^$*|]?=\s*["']/g;
32
32
  * it admitted `data-auto-play` and `data-auto-height`, and `automation` already
33
33
  * covers the convention it was there for (`data-automation-id`).
34
34
  */
35
- const TEST_TOKENS = new Set(["test", "testid", "tests", "qa", "cy", "cypress", "e2e", "automation"]);
35
+ const TEST_TOKENS = new Set([
36
+ "test",
37
+ "testid",
38
+ "tests",
39
+ "qa",
40
+ "cy",
41
+ "cypress",
42
+ "e2e",
43
+ "automation",
44
+ ]);
36
45
  /**
37
46
  * Whether a name plausibly denotes a test id.
38
47
  *
@@ -70,7 +79,10 @@ const OBSERVED_REPORT_LIMIT = 5;
70
79
  export async function discoverTestIdAttribute(root) {
71
80
  let files;
72
81
  try {
73
- const [poms, specs] = await Promise.all([globPomFiles(root), globSpecFiles(root)]);
82
+ const [poms, specs] = await Promise.all([
83
+ globPomFiles(root),
84
+ globSpecFiles(root),
85
+ ]);
74
86
  files = [...new Set([...poms, ...specs])].slice(0, MAX_FILES);
75
87
  }
76
88
  catch {