swipium 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +313 -0
- package/README.md +175 -219
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +39 -26
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +68 -20
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +31 -5
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +23 -5
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +44 -8
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +24 -6
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/fsWalk.js +19 -2
- package/dist/appMap/fsWalk.js.map +1 -1
- package/dist/appMap/issues.js +10 -30
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +6 -6
- package/dist/appMap/migrations.js.map +1 -1
- package/dist/appMap/prelaunch.js +2 -2
- package/dist/appMap/prelaunch.js.map +1 -1
- package/dist/appMap/projectRegistry.js +83 -11
- package/dist/appMap/projectRegistry.js.map +1 -1
- package/dist/appMap/provenance.js +2 -2
- package/dist/appMap/provenance.js.map +1 -1
- package/dist/appMap/query.js +21 -5
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +12 -5
- package/dist/appMap/runtimeMerge.js.map +1 -1
- package/dist/appMap/schema.js +1 -1
- package/dist/appMap/schema.js.map +1 -1
- package/dist/appMap/screenMatch.js +6 -2
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +151 -39
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +58 -85
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +34 -12
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +49 -12
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +41 -14
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +112 -30
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +6 -2
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +71 -23
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +15 -5
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +22 -28
- package/dist/automation/selectors.js.map +1 -1
- package/dist/automation/types.js +1 -1
- package/dist/automation/types.js.map +1 -1
- package/dist/automation/waits.js +14 -8
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +9 -3
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +16 -8
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +6 -6
- package/dist/automationGen/ciEmitter.js.map +1 -1
- package/dist/automationGen/identifiers.js +224 -0
- package/dist/automationGen/identifiers.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +288 -121
- package/dist/automationGen/jsEmitter.js.map +1 -1
- package/dist/automationGen/packagePatch.js +2 -2
- package/dist/automationGen/packagePatch.js.map +1 -1
- package/dist/automationGen/platformResolve.js +36 -0
- package/dist/automationGen/platformResolve.js.map +1 -0
- package/dist/automationGen/projectProfile.js +76 -27
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +278 -107
- package/dist/automationGen/pythonEmitter.js.map +1 -1
- package/dist/automationGen/readmeEmitter.js +7 -6
- package/dist/automationGen/readmeEmitter.js.map +1 -1
- package/dist/automationGen/run.js +388 -0
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +17 -10
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +52 -12
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +235 -31
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +39 -18
- package/dist/build/plan.js.map +1 -1
- package/dist/ci/preflight.js +13 -4
- package/dist/ci/preflight.js.map +1 -1
- package/dist/cli/gc.js +74 -0
- package/dist/cli/gc.js.map +1 -0
- package/dist/cli/init.js +217 -26
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +50 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/report.js +218 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/scan.js +36 -15
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +7 -7
- package/dist/cli/suite.js.map +1 -1
- package/dist/cli/verify.js +7 -7
- package/dist/cli/verify.js.map +1 -1
- package/dist/consent/consent.js +162 -5
- package/dist/consent/consent.js.map +1 -1
- package/dist/context/detect.js +55 -18
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +22 -8
- package/dist/context/findApps.js.map +1 -1
- package/dist/context/projectRoot.js +174 -19
- package/dist/context/projectRoot.js.map +1 -1
- package/dist/context/scan.js +1 -1
- package/dist/context/scan.js.map +1 -1
- package/dist/core/capabilityGroups.js +90 -0
- package/dist/core/capabilityGroups.js.map +1 -0
- package/dist/core/target.js +10 -8
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +160 -39
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +317 -43
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +124 -8
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +365 -55
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +7 -3
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +15 -6
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/memory.js +4 -1
- package/dist/explore/memory.js.map +1 -1
- package/dist/explore/planner.js +54 -9
- package/dist/explore/planner.js.map +1 -1
- package/dist/explore/policy.js +11 -6
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +363 -190
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +4 -2
- package/dist/explore/signatures.js.map +1 -1
- package/dist/explore/suite.js +3 -1
- package/dist/explore/suite.js.map +1 -1
- package/dist/featureTesting/executionBootstrap.js +137 -29
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +6 -3
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +101 -20
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +44 -15
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +15 -11
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +16 -8
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +8 -5
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +8 -2
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +32 -4
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +27 -15
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +34 -12
- package/dist/featureTesting/testPlan.js.map +1 -1
- package/dist/firstRun/authStateMachine.js +1 -1
- package/dist/firstRun/authStateMachine.js.map +1 -1
- package/dist/firstRun/classifyScreen.js +9 -6
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +16 -13
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +92 -31
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +25 -15
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +45 -11
- package/dist/firstRun/inputPlanner.js.map +1 -1
- package/dist/firstRun/onboardingStateMachine.js +1 -1
- package/dist/firstRun/onboardingStateMachine.js.map +1 -1
- package/dist/firstRun/paywallPolicy.js +3 -3
- package/dist/firstRun/paywallPolicy.js.map +1 -1
- package/dist/firstRun/types.js +1 -1
- package/dist/firstRun/types.js.map +1 -1
- package/dist/fixtures/catalog.js +72 -9
- package/dist/fixtures/catalog.js.map +1 -1
- package/dist/fixtures/load.js +50 -0
- package/dist/fixtures/load.js.map +1 -0
- package/dist/flows/discover.js +2 -2
- package/dist/flows/discover.js.map +1 -1
- package/dist/flows/generate.js +68 -17
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/lint.js +88 -14
- package/dist/flows/lint.js.map +1 -1
- package/dist/flows/pack.js +21 -5
- package/dist/flows/pack.js.map +1 -1
- package/dist/flows/paths.js +57 -0
- package/dist/flows/paths.js.map +1 -0
- package/dist/flows/repair.js +176 -37
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +308 -99
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +107 -25
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +8 -4
- package/dist/flows/seedExec.js.map +1 -1
- package/dist/flows/templates.js +5 -5
- package/dist/index.js +50 -8
- package/dist/index.js.map +1 -1
- package/dist/ios/signing.js +32 -3
- package/dist/ios/signing.js.map +1 -1
- package/dist/issues/classify.js +28 -20
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +35 -9
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +93 -46
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +6 -5
- package/dist/issues/metrics.js.map +1 -1
- package/dist/issues/recurrence.js +35 -8
- package/dist/issues/recurrence.js.map +1 -1
- package/dist/issues/report.js +12 -8
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +40 -9
- package/dist/issues/reportBridge.js.map +1 -1
- package/dist/issues/schema.js +2 -2
- package/dist/issues/schema.js.map +1 -1
- package/dist/issues/sourceRevision.js +2 -2
- package/dist/issues/sourceRevision.js.map +1 -1
- package/dist/issues/store.js +110 -32
- package/dist/issues/store.js.map +1 -1
- package/dist/lib/abortScope.js +48 -0
- package/dist/lib/abortScope.js.map +1 -0
- package/dist/lib/android.js +84 -8
- package/dist/lib/android.js.map +1 -1
- package/dist/lib/coordSpace.js +1 -1
- package/dist/lib/coordSpace.js.map +1 -1
- package/dist/lib/device.js +53 -12
- package/dist/lib/device.js.map +1 -1
- package/dist/lib/gestures.js +141 -0
- package/dist/lib/gestures.js.map +1 -0
- package/dist/lib/gitignore.js +4 -3
- package/dist/lib/gitignore.js.map +1 -1
- package/dist/lib/image.js +12 -3
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +399 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/needsInput.js +9 -6
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +4 -3
- package/dist/lib/png.js.map +1 -1
- package/dist/lib/redact.js +170 -9
- package/dist/lib/redact.js.map +1 -1
- package/dist/lib/result.js +94 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +7 -5
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +6 -3
- package/dist/lib/sensitive.js.map +1 -1
- package/dist/lib/simctl.js +3 -3
- package/dist/lib/simctl.js.map +1 -1
- package/dist/lib/spawn.js +78 -17
- package/dist/lib/spawn.js.map +1 -1
- package/dist/lib/toolAnnotations.js +114 -0
- package/dist/lib/toolAnnotations.js.map +1 -0
- package/dist/lib/wda.js +321 -25
- package/dist/lib/wda.js.map +1 -1
- package/dist/lib/wdaConfig.js +12 -5
- package/dist/lib/wdaConfig.js.map +1 -1
- package/dist/lib/wdaTune.js +52 -23
- package/dist/lib/wdaTune.js.map +1 -1
- package/dist/mobileAudit/checks.js +150 -28
- package/dist/mobileAudit/checks.js.map +1 -1
- package/dist/mobileAudit/evidence.js +4 -4
- package/dist/mobileAudit/evidence.js.map +1 -1
- package/dist/mobileAudit/profiles.js +121 -20
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +9 -4
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +214 -35
- package/dist/mobileAudit/runner.js.map +1 -1
- package/dist/oracle/auth.js +1 -1
- package/dist/oracle/auth.js.map +1 -1
- package/dist/oracle/failures.js +1085 -145
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +148 -26
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +148 -19
- package/dist/oracle/locator.js.map +1 -1
- package/dist/oracle/record.js +3 -3
- package/dist/oracle/record.js.map +1 -1
- package/dist/orchestration/envelope.js +2 -2
- package/dist/orchestration/envelope.js.map +1 -1
- package/dist/orchestration/goal.js +7 -13
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +167 -0
- package/dist/orchestration/testThis/execute.js.map +1 -0
- package/dist/orchestration/testThis/pipeline.js +413 -0
- package/dist/orchestration/testThis/pipeline.js.map +1 -0
- package/dist/orchestration/testThis/plan.js +519 -0
- package/dist/orchestration/testThis/plan.js.map +1 -0
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +136 -0
- package/dist/orchestration/testThis/terminal.js.map +1 -0
- package/dist/orchestration/testThis/types.js +12 -0
- package/dist/orchestration/testThis/types.js.map +1 -0
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +24 -24
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/coverage.js +0 -1
- package/dist/report/coverage.js.map +1 -1
- package/dist/report/evidence.js.map +1 -1
- package/dist/report/export.js +449 -72
- package/dist/report/export.js.map +1 -1
- package/dist/report/findingsDedupe.js +41 -0
- package/dist/report/findingsDedupe.js.map +1 -0
- package/dist/report/flake.js +13 -14
- package/dist/report/flake.js.map +1 -1
- package/dist/report/history.js +72 -38
- package/dist/report/history.js.map +1 -1
- package/dist/report/policy.js +18 -7
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +10 -16
- package/dist/report/qaLevel.js.map +1 -1
- package/dist/report/readiness.js +42 -12
- package/dist/report/readiness.js.map +1 -1
- package/dist/report/sarifSources.js +160 -0
- package/dist/report/sarifSources.js.map +1 -0
- package/dist/report/summary.js +2 -2
- package/dist/report/summary.js.map +1 -1
- package/dist/report/testCatalog.js +4 -4
- package/dist/report/testCatalog.js.map +1 -1
- package/dist/report/timing.js +23 -23
- package/dist/report/timing.js.map +1 -1
- package/dist/report/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +501 -69
- package/dist/server.js.map +1 -1
- package/dist/services/automationGenerate.js +8 -2
- package/dist/services/automationGenerate.js.map +1 -1
- package/dist/services/build.js +10 -4
- package/dist/services/build.js.map +1 -1
- package/dist/services/flowGenerate.js +75 -0
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +40 -8
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +92 -18
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +94 -17
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +271 -80
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +68 -22
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +43 -6
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +78 -33
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +284 -4
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +433 -0
- package/dist/session/processRegistry.js.map +1 -0
- package/dist/session/progress.js +1 -1
- package/dist/session/progress.js.map +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +459 -59
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +60 -10
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +30 -12
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +36 -6
- package/dist/snapshot/present.js.map +1 -1
- package/dist/snapshot/settle.js +39 -9
- package/dist/snapshot/settle.js.map +1 -1
- package/dist/state/consent.js +99 -0
- package/dist/state/consent.js.map +1 -0
- package/dist/state/profile.js +82 -11
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +15 -6
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +22 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +75 -44
- package/dist/suite/pom.js.map +1 -1
- package/dist/suite/secretGuard.js +266 -0
- package/dist/suite/secretGuard.js.map +1 -0
- package/dist/suite/testcase.js +15 -11
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +7 -3
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +43 -14
- package/dist/testSuite/generator.js.map +1 -1
- package/dist/testSuite/history.js +1 -1
- package/dist/testSuite/history.js.map +1 -1
- package/dist/testSuite/issueLinks.js +3 -3
- package/dist/testSuite/issueLinks.js.map +1 -1
- package/dist/testSuite/lint.js +4 -4
- package/dist/testSuite/lint.js.map +1 -1
- package/dist/testSuite/merge.js +13 -7
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +21 -16
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +12 -4
- package/dist/testSuite/store.js.map +1 -1
- package/dist/testSuite/traceability.js +2 -2
- package/dist/testSuite/traceability.js.map +1 -1
- package/dist/tools/act.js +868 -174
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +521 -112
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +82 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +393 -189
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +92 -51
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +141 -40
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +98 -18
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +108 -19
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +98 -35
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +110 -42
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +152 -130
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +94 -66
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +347 -132
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +42 -10
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +199 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/getArtifact.js +37 -8
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +17 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +148 -194
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +256 -171
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +55 -11
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +84 -38
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +83 -26
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +36 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +31 -17
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +31 -14
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +193 -47
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +16 -8
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +12 -12
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +81 -18
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +85 -20
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +42 -18
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +29 -12
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +157 -107
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +117 -84
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +391 -310
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +112 -36
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +35 -802
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +698 -116
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -23
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +312 -54
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +37 -64
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +65 -8
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +87 -15
- package/dist/visual/provider.js.map +1 -1
- package/docs/README.md +24 -10
- package/docs/ci-reports.md +328 -0
- package/docs/concepts.md +227 -0
- package/docs/flows.md +153 -0
- package/docs/mcp-server.md +210 -104
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +808 -217
- package/package.json +16 -6
- package/dist/appMap/diff.js +0 -60
- package/dist/appMap/diff.js.map +0 -1
- package/dist/automation/maestroIr.js +0 -282
- package/dist/automation/maestroIr.js.map +0 -1
- package/dist/interop/maestro.js +0 -151
- package/dist/interop/maestro.js.map +0 -1
- package/dist/tools/assertVisual.js +0 -74
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js +0 -394
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -209
- package/dist/tools/capabilities.js.map +0 -1
- package/dist/tools/detectContext.js +0 -41
- package/dist/tools/detectContext.js.map +0 -1
- package/dist/tools/flowGenerate.js +0 -55
- package/dist/tools/flowGenerate.js.map +0 -1
- package/dist/tools/history.js +0 -56
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/idling.js +0 -104
- package/dist/tools/idling.js.map +0 -1
- package/dist/tools/inputCapabilities.js +0 -30
- package/dist/tools/inputCapabilities.js.map +0 -1
- package/dist/tools/locator.js +0 -57
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/maestro.js +0 -78
- package/dist/tools/maestro.js.map +0 -1
- package/dist/tools/permissions.js +0 -149
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -49
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -70
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -101
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -170
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -61
- package/dist/tools/visualText.js.map +0 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
//
|
|
1
|
+
// planInputForField(): decide what (if anything) to type into a field, with a
|
|
2
2
|
// strict priority order so Swipium never invents data unless policy + environment allow it.
|
|
3
3
|
//
|
|
4
4
|
// Priority:
|
|
5
5
|
// 1. Existing secure user input for the matching field (from a NeedsInput resume).
|
|
6
6
|
// 2. Declared fixture value or generator.
|
|
7
|
-
// 3. Built-in safe generator
|
|
7
|
+
// 3. Built-in safe generator, ONLY when generated accounts are allowed for this environment.
|
|
8
8
|
// 4. NeedsInput when the value is unsafe/unknown but required.
|
|
9
9
|
// 5. Skip (blocked) when the field is optional.
|
|
10
10
|
//
|
|
@@ -35,33 +35,67 @@ export function planInputForField(session, req, ctx) {
|
|
|
35
35
|
return { decision: 'secure_input', value: existing, varName: canonical, secret, source: 'secure_input', field };
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
// 2. Declared fixture value or generator (existing fixture catalog
|
|
38
|
+
// 2. Declared fixture value or generator (existing fixture catalog; may itself mutate session
|
|
39
39
|
// for fixture-declared generators, which is the intended behavior).
|
|
40
40
|
const fixture = resolveFixtureValue(session, req.label, req.locator?.value, { role: req.field });
|
|
41
41
|
if (fixture) {
|
|
42
|
-
return {
|
|
42
|
+
return {
|
|
43
|
+
decision: 'fixture',
|
|
44
|
+
value: fixture.value,
|
|
45
|
+
varName: fixture.varName,
|
|
46
|
+
secret: fixture.secret,
|
|
47
|
+
source: 'fixture',
|
|
48
|
+
generator: fixture.generator,
|
|
49
|
+
field,
|
|
50
|
+
};
|
|
43
51
|
}
|
|
44
|
-
// OTP is never invented
|
|
52
|
+
// OTP is never invented. Only a real provider or a secure input may supply it.
|
|
45
53
|
if (field === 'otp') {
|
|
46
|
-
return {
|
|
54
|
+
return {
|
|
55
|
+
decision: 'needs_input',
|
|
56
|
+
kind: 'otp_or_manual_verification',
|
|
57
|
+
reason: 'a one-time code is required and cannot be generated',
|
|
58
|
+
field,
|
|
59
|
+
};
|
|
47
60
|
}
|
|
48
61
|
// 3. Built-in safe generator, gated on the generated-account decision + policy field opt-ins.
|
|
49
62
|
if (ctx.generationAllowed) {
|
|
50
63
|
const gen = generateFieldValue(field, ctx.policy, { timestamp: ctx.timestamp, index: ctx.index });
|
|
51
64
|
if (gen) {
|
|
52
|
-
return {
|
|
65
|
+
return {
|
|
66
|
+
decision: 'generator',
|
|
67
|
+
value: gen.value,
|
|
68
|
+
varName: generatorVarName(field),
|
|
69
|
+
secret: gen.secret,
|
|
70
|
+
source: 'generator',
|
|
71
|
+
generator: gen.generator,
|
|
72
|
+
record: true,
|
|
73
|
+
field,
|
|
74
|
+
};
|
|
53
75
|
}
|
|
54
76
|
// generation allowed but this field is not safely generatable (phone/dob without opt-in).
|
|
55
77
|
if (req.required) {
|
|
56
|
-
return {
|
|
78
|
+
return {
|
|
79
|
+
decision: 'needs_input',
|
|
80
|
+
kind: 'create_test_data',
|
|
81
|
+
reason: `field "${req.label ?? field}" cannot be safely generated under the current policy`,
|
|
82
|
+
field,
|
|
83
|
+
};
|
|
57
84
|
}
|
|
58
85
|
return { decision: 'skip', reason: `optional field "${req.label ?? field}" left blank (not safely generatable)`, field };
|
|
59
86
|
}
|
|
60
87
|
// 4 / 5. No safe value available.
|
|
61
88
|
if (req.required) {
|
|
62
|
-
const kind = field === 'email' || field === 'username' || field === 'password' || field === 'confirm_password'
|
|
63
|
-
|
|
89
|
+
const kind = field === 'email' || field === 'username' || field === 'password' || field === 'confirm_password'
|
|
90
|
+
? 'credentials'
|
|
91
|
+
: 'create_test_data';
|
|
92
|
+
return {
|
|
93
|
+
decision: 'needs_input',
|
|
94
|
+
kind,
|
|
95
|
+
reason: `required field "${req.label ?? field}" has no safe value and generation is not allowed here`,
|
|
96
|
+
field,
|
|
97
|
+
};
|
|
64
98
|
}
|
|
65
|
-
return { decision: 'skip', reason: `optional field "${req.label ?? field}" skipped
|
|
99
|
+
return { decision: 'skip', reason: `optional field "${req.label ?? field}" skipped: no value source and generation not allowed`, field };
|
|
66
100
|
}
|
|
67
101
|
//# sourceMappingURL=inputPlanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputPlanner.js","sourceRoot":"","sources":["../../src/firstRun/inputPlanner.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"inputPlanner.js","sourceRoot":"","sources":["../../src/firstRun/inputPlanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Onboarding progression. Prefer non-destructive forward/skip controls
|
|
2
2
|
// (Next / Continue / Skip / Get started / Done) and never tap a destructive or unknown control.
|
|
3
3
|
// PURE: returns the single best forward action (or none) for a classified onboarding screen.
|
|
4
4
|
import { classifyRisk } from '../explore/policy.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboardingStateMachine.js","sourceRoot":"","sources":["../../src/firstRun/onboardingStateMachine.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"onboardingStateMachine.js","sourceRoot":"","sources":["../../src/firstRun/onboardingStateMachine.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,gGAAgG;AAChG,6FAA6F;AAG7F,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,+FAA+F;AAC/F,MAAM,cAAc,GAAqD;IACvE,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE;IACtD,EAAE,EAAE,EAAE,wCAAwC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,qBAAqB,EAAE;IACrF,EAAE,EAAE,EAAE,6BAA6B,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE;IACxE,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,qBAAqB,EAAE;IAC9D,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,qCAAqC,EAAE;IAC1E,EAAE,EAAE,EAAE,4CAA4C,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,uCAAuC,EAAE;CAC5G,CAAC;AAOF,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB,CAAC,QAA2B;IAC5D,IAAI,IAAoE,CAAC;IACzE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,SAAS;YAAE,SAAS;QAC5B,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,wEAAwE;QACxE,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,aAAa;YAAE,SAAS;QAC5G,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;YAAE,IAAI,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACvF,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,aAAa,EAAE,6DAA6D,EAAE,CAAC;IAC1F,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACnB,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,EAAE,CAAC,GAAG;YACjB,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI;YAC1B,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE;YAC9G,MAAM,EAAE,EAAE,CAAC,MAAM;YACjB,MAAM,EAAE,IAAI,CAAC,GAAG;YAChB,IAAI,EAAE,MAAM;SACb;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Paywall policy. Swipium NEVER purchases. It records paywall coverage and only
|
|
2
2
|
// closes/skips when there is a clearly safe visible dismiss/restore/skip path. PURE.
|
|
3
|
-
// Controls that buy / subscribe
|
|
3
|
+
// Controls that buy / subscribe. These must never be auto-tapped.
|
|
4
4
|
const PURCHASE = /\b(subscribe|buy|purchase|start\s+(free\s+)?trial|upgrade|continue\s+to\s+payment|pay|unlock\s+premium|get\s+premium|choose\s+plan|select\s+plan)\b/i;
|
|
5
5
|
// Safe ways off a paywall.
|
|
6
6
|
const SAFE_DISMISS = [
|
|
@@ -32,7 +32,7 @@ export function planPaywall(elements) {
|
|
|
32
32
|
if (!best || match.rank > best.rank)
|
|
33
33
|
best = { el, rank: match.rank, why: match.why };
|
|
34
34
|
}
|
|
35
|
-
const coverage = 'paywall encountered
|
|
35
|
+
const coverage = 'paywall encountered: recorded coverage, no purchase attempted';
|
|
36
36
|
if (!best) {
|
|
37
37
|
return { coverage, stop: true };
|
|
38
38
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paywallPolicy.js","sourceRoot":"","sources":["../../src/firstRun/paywallPolicy.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"paywallPolicy.js","sourceRoot":"","sources":["../../src/firstRun/paywallPolicy.ts"],"names":[],"mappings":"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"}
|
package/dist/firstRun/types.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Shared types for the first-run smoke / auth / onboarding / safe-test-data lane.
|
|
2
2
|
// These describe the data exchanged between the screen classifier, the input planner, the auth /
|
|
3
3
|
// onboarding / paywall state machines, and the firstRunPlanner. They are intentionally
|
|
4
4
|
// backend-neutral (no Driver references) so the planning layer stays pure + unit-testable; the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/firstRun/types.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/firstRun/types.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,iGAAiG;AACjG,uFAAuF;AACvF,+FAA+F;AAC/F,gFAAgF"}
|
package/dist/fixtures/catalog.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { FLOW_ENV_PREFIX, flowEnvAllowed, lookupFlowVar } from '../flows/schema.js';
|
|
2
|
+
import { log } from '../lib/logger.js';
|
|
1
3
|
const GENERATORS = {
|
|
2
4
|
email: () => `swipium.qa.${Date.now()}@example.test`,
|
|
3
5
|
person_name: () => 'Swipium QA User',
|
|
@@ -46,18 +48,47 @@ const FIELD_HINTS = [
|
|
|
46
48
|
function variableName(fixture, field) {
|
|
47
49
|
return `SWIPIUM_${fixture}_${field}`.toUpperCase().replace(/[^A-Z0-9]+/g, '_');
|
|
48
50
|
}
|
|
51
|
+
/** Why a fixture field's declared `var` was not read from the server environment. Fixtures come
|
|
52
|
+
* from the repo's .swipium/fixtures.json (untrusted per THREAT_MODEL), so, like flows, only
|
|
53
|
+
* SWIPIUM_* names are ever read from process.env; any other name is treated as missing. */
|
|
54
|
+
export function fixtureVarBlockedMessage(fixture, field, varName) {
|
|
55
|
+
return (`fixture "${fixture}" field "${field}" declares var ${varName}, which was not read from the environment: ` +
|
|
56
|
+
`fixtures read process.env only for ${FLOW_ENV_PREFIX}* names. Rename it (e.g. ${variableName(fixture, field)}) ` +
|
|
57
|
+
`or provide the value via secure input`);
|
|
58
|
+
}
|
|
59
|
+
const warnedBlockedVars = new Set();
|
|
60
|
+
/** process.env value for a fixture's declared var. SWIPIUM_* names only (else undefined + a warning). */
|
|
61
|
+
function envFixtureVar(fixture, field, varName) {
|
|
62
|
+
if (!flowEnvAllowed(varName)) {
|
|
63
|
+
const key = `${fixture}\0${field}\0${varName}`;
|
|
64
|
+
if (!warnedBlockedVars.has(key)) {
|
|
65
|
+
warnedBlockedVars.add(key);
|
|
66
|
+
log('warn', fixtureVarBlockedMessage(fixture, field, varName));
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return lookupFlowVar(varName, {});
|
|
71
|
+
}
|
|
49
72
|
function fixtureFields(f) {
|
|
50
73
|
if (!f.fields || typeof f.fields !== 'object')
|
|
51
74
|
return {};
|
|
52
75
|
return f.fields;
|
|
53
76
|
}
|
|
54
77
|
function normalizeText(value) {
|
|
55
|
-
return (value ?? '')
|
|
78
|
+
return (value ?? '')
|
|
79
|
+
.toLowerCase()
|
|
80
|
+
.replace(/[_-]+/g, ' ')
|
|
81
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
82
|
+
.replace(/\s+/g, ' ')
|
|
83
|
+
.trim();
|
|
56
84
|
}
|
|
57
85
|
function normalizeGenerator(value) {
|
|
58
86
|
if (!value)
|
|
59
87
|
return undefined;
|
|
60
|
-
return GENERATOR_ALIASES[value
|
|
88
|
+
return GENERATOR_ALIASES[value
|
|
89
|
+
.trim()
|
|
90
|
+
.toLowerCase()
|
|
91
|
+
.replace(/[-\s]+/g, '_')];
|
|
61
92
|
}
|
|
62
93
|
function fieldScore(fieldName, spec, key, context = {}) {
|
|
63
94
|
const normalizedField = normalizeText(fieldName);
|
|
@@ -105,24 +136,56 @@ export function resolveFixtureValue(session, label, locatorValue, context = {})
|
|
|
105
136
|
const generated = session.generatedValues.find((g) => g.varName === varName && g.fixture === best.fixture.name && g.field === best.field);
|
|
106
137
|
if (generated) {
|
|
107
138
|
session.inputValues.set(varName, generated.value);
|
|
108
|
-
return {
|
|
139
|
+
return {
|
|
140
|
+
value: generated.value,
|
|
141
|
+
varName,
|
|
142
|
+
secret: generated.secret,
|
|
143
|
+
fixture: best.fixture.name,
|
|
144
|
+
field: best.field,
|
|
145
|
+
source: 'generator',
|
|
146
|
+
generator: generated.generator,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const fromInput = session.inputValues.get(varName);
|
|
150
|
+
if (fromInput != null)
|
|
151
|
+
return { value: fromInput, varName, secret, fixture: best.fixture.name, field: best.field, source: 'variable' };
|
|
152
|
+
const fromEnv = spec.var ? envFixtureVar(best.fixture.name, best.field, spec.var) : undefined;
|
|
153
|
+
if (fromEnv != null) {
|
|
154
|
+
// Anything read from the server environment is treated as a secret: registered for
|
|
155
|
+
// redaction so it never lands in recorded actions, notes, artifacts or state.json.
|
|
156
|
+
session.secrets.add(fromEnv);
|
|
157
|
+
return { value: fromEnv, varName, secret: true, fixture: best.fixture.name, field: best.field, source: 'variable' };
|
|
109
158
|
}
|
|
110
|
-
const fromVar = session.inputValues.get(varName) ?? (spec.var ? process.env[spec.var] : undefined);
|
|
111
|
-
if (fromVar != null)
|
|
112
|
-
return { value: fromVar, varName, secret, fixture: best.fixture.name, field: best.field, source: 'variable' };
|
|
113
159
|
if (spec.value != null)
|
|
114
160
|
return { value: spec.value, varName, secret, fixture: best.fixture.name, field: best.field, source: 'value' };
|
|
115
161
|
const generator = normalizeGenerator(spec.generator);
|
|
116
162
|
if (generator && GENERATORS[generator]) {
|
|
117
163
|
const value = GENERATORS[generator]();
|
|
118
164
|
session.inputValues.set(varName, value);
|
|
119
|
-
session.generatedValues.push({
|
|
165
|
+
session.generatedValues.push({
|
|
166
|
+
at: Date.now(),
|
|
167
|
+
fixture: best.fixture.name,
|
|
168
|
+
field: best.field,
|
|
169
|
+
varName,
|
|
170
|
+
generator,
|
|
171
|
+
value,
|
|
172
|
+
secret: false,
|
|
173
|
+
});
|
|
120
174
|
return { value, varName, secret: false, fixture: best.fixture.name, field: best.field, source: 'generator', generator };
|
|
121
175
|
}
|
|
122
176
|
}
|
|
123
|
-
const legacy = key
|
|
177
|
+
const legacy = key
|
|
178
|
+
? session.fixtures.find((f) => f.value && (key.includes(normalizeText(f.name)) || normalizeText(f.name).includes(key)))
|
|
179
|
+
: undefined;
|
|
124
180
|
if (legacy?.value)
|
|
125
|
-
return {
|
|
181
|
+
return {
|
|
182
|
+
value: legacy.value,
|
|
183
|
+
varName: variableName(legacy.name, 'value'),
|
|
184
|
+
secret: false,
|
|
185
|
+
fixture: legacy.name,
|
|
186
|
+
field: 'value',
|
|
187
|
+
source: 'legacy_value',
|
|
188
|
+
};
|
|
126
189
|
return undefined;
|
|
127
190
|
}
|
|
128
191
|
export function hasDisposableState(session) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/fixtures/catalog.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/fixtures/catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Fixture loading + persistence shape. Fixture VALUES (field values, legacy `value`) and seed
|
|
2
|
+
// specs (argv / URLs / headers / bodies, often tokens) are live configuration that must never be
|
|
3
|
+
// written to state.json: a redacted copy reloaded as config would type «redacted» into a password
|
|
4
|
+
// field or run a seed with a broken token. state.json keeps only non-secret metadata (for reports);
|
|
5
|
+
// a rehydrated session re-reads the real fixtures from <root>/.swipium/fixtures.json.
|
|
6
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
/** Load declared fixtures from <root>/.swipium/fixtures.json (best-effort, array or {fixtures:[]}). */
|
|
9
|
+
export function loadProjectFixtures(root) {
|
|
10
|
+
const p = join(root, '.swipium', 'fixtures.json');
|
|
11
|
+
if (!existsSync(p))
|
|
12
|
+
return [];
|
|
13
|
+
try {
|
|
14
|
+
const raw = JSON.parse(readFileSync(p, 'utf8'));
|
|
15
|
+
const arr = Array.isArray(raw) ? raw : Array.isArray(raw?.fixtures) ? raw.fixtures : [];
|
|
16
|
+
return arr.filter((f) => f && typeof f.name === 'string');
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** state.json form of a fixture: names/labels/field specs kept, every value and the seed dropped. */
|
|
23
|
+
export function fixtureMetadata(fixtures) {
|
|
24
|
+
return fixtures.map((f) => {
|
|
25
|
+
const { value: _value, seed: _seed, fields, ...rest } = f;
|
|
26
|
+
const out = { ...rest };
|
|
27
|
+
if (fields && typeof fields === 'object') {
|
|
28
|
+
out.fields = Object.fromEntries(Object.entries(fields).map(([k, spec]) => {
|
|
29
|
+
const { value: _v, ...meta } = spec ?? {};
|
|
30
|
+
return [k, meta];
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** Fixtures for a session reloaded from state.json: the project's fixtures.json is the source of
|
|
37
|
+
* truth for live values; persisted metadata only fills in fixtures no longer in the file (e.g.
|
|
38
|
+
* ones passed to qa_start_session). They are value-less, so they never supply redacted text as input. */
|
|
39
|
+
export function rehydrateFixtures(root, persisted) {
|
|
40
|
+
const fromFile = typeof root === 'string' ? loadProjectFixtures(root) : [];
|
|
41
|
+
const byName = new Map();
|
|
42
|
+
for (const f of fromFile)
|
|
43
|
+
byName.set(f.name, f);
|
|
44
|
+
const meta = Array.isArray(persisted) ? fixtureMetadata(persisted.filter((f) => f && typeof f.name === 'string')) : [];
|
|
45
|
+
for (const f of meta)
|
|
46
|
+
if (!byName.has(f.name))
|
|
47
|
+
byName.set(f.name, f);
|
|
48
|
+
return [...byName.values()];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/fixtures/load.ts"],"names":[],"mappings":"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"}
|
package/dist/flows/discover.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// Shared flow discovery: list .swipium/flows/*.yaml|*.yml. Used by
|
|
2
|
-
// workflows) and qa_smoke (paths
|
|
1
|
+
// Shared flow discovery: list .swipium/flows/*.yaml|*.yml. Used by the workflow plan (qa_resolve_target include:["plan"]) (names > candidate
|
|
2
|
+
// workflows) and qa_smoke (paths > run the pack). One source so the two never disagree.
|
|
3
3
|
import { existsSync, readdirSync } from 'node:fs';
|
|
4
4
|
import { join, basename } from 'node:path';
|
|
5
5
|
export function listFlowFiles(root) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/flows/discover.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/flows/discover.ts"],"names":[],"mappings":"AAAA,6IAA6I;AAC7I,wFAAwF;AAExF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAO3C,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,GAAG,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/dist/flows/generate.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
//
|
|
1
|
+
// qa_generate target:"flow" core. Two pure pieces:
|
|
2
2
|
// - recordableTap: at qa_act time, turn a resolved tap target into a replayable descriptor +
|
|
3
|
-
// exportability tag (translating an @ref into its visible text/label where possible
|
|
3
|
+
// exportability tag (translating an @ref into its visible text/label where possible; the
|
|
4
4
|
// key durability insight: a ref is run-time-only, but its label survives).
|
|
5
5
|
// - generateFlow: serialize the recorded action IR into a durable flow YAML + a durability
|
|
6
6
|
// grade and the brittle steps that need a testID/accessibilityLabel.
|
|
7
7
|
import { createHash } from 'node:crypto';
|
|
8
8
|
import { stringify } from 'yaml';
|
|
9
9
|
import { waitForVisibleGuard } from './waitGuards.js';
|
|
10
|
+
import { secretSafeActions, secretVarName } from '../suite/secretGuard.js';
|
|
10
11
|
function currentScreenSignature(session) {
|
|
11
12
|
const sigs = session.lastSnapshot?.signatures;
|
|
12
13
|
if (!sigs?.size)
|
|
13
14
|
return undefined;
|
|
14
|
-
return createHash('sha1')
|
|
15
|
+
return createHash('sha1')
|
|
16
|
+
.update([...sigs].sort().join('\n'))
|
|
17
|
+
.digest('hex')
|
|
18
|
+
.slice(0, 16);
|
|
15
19
|
}
|
|
16
20
|
function bucketBounds(bounds, point) {
|
|
17
21
|
const b = bounds ?? (point ? [point.x, point.y, point.x, point.y] : undefined);
|
|
@@ -40,14 +44,34 @@ function provenance(session, opts) {
|
|
|
40
44
|
* falls back to coordinates (brittle) when the element exposes no human-readable handle. */
|
|
41
45
|
export function recordableTap(session, target, point) {
|
|
42
46
|
if (target?.x != null)
|
|
43
|
-
return {
|
|
47
|
+
return {
|
|
48
|
+
x: point.x,
|
|
49
|
+
y: point.y,
|
|
50
|
+
selectorKind: 'coords',
|
|
51
|
+
exportability: 'coordinate',
|
|
52
|
+
provenance: provenance(session, { selectorKind: 'coords', point }),
|
|
53
|
+
};
|
|
44
54
|
if (target?.id) {
|
|
45
55
|
const selectorKind = session.driver?.kind === 'wda' ? 'accessibility_id' : 'resource_id';
|
|
46
|
-
return {
|
|
56
|
+
return {
|
|
57
|
+
selector: target.id,
|
|
58
|
+
selectorKind,
|
|
59
|
+
exportability: 'semantic',
|
|
60
|
+
provenance: provenance(session, { selectorKind, selectorValue: target.id, point }),
|
|
61
|
+
};
|
|
47
62
|
}
|
|
48
|
-
const node = point.ref
|
|
63
|
+
const node = point.ref
|
|
64
|
+
? session.lastSnapshot?.fullByRef.get(point.ref)
|
|
65
|
+
: target?.ref
|
|
66
|
+
? session.lastSnapshot?.fullByRef.get(target.ref)
|
|
67
|
+
: undefined;
|
|
49
68
|
if (session.driver?.kind === 'wda' && node?.id)
|
|
50
|
-
return {
|
|
69
|
+
return {
|
|
70
|
+
selector: node.id,
|
|
71
|
+
selectorKind: 'accessibility_id',
|
|
72
|
+
exportability: 'semantic',
|
|
73
|
+
provenance: provenance(session, { selectorKind: 'accessibility_id', selectorValue: node.id, point }),
|
|
74
|
+
};
|
|
51
75
|
let label;
|
|
52
76
|
if (target?.text)
|
|
53
77
|
label = target.text;
|
|
@@ -57,9 +81,21 @@ export function recordableTap(session, target, point) {
|
|
|
57
81
|
const warning = session.driver?.kind === 'wda'
|
|
58
82
|
? `iOS label/name selector "${label}" is usable, but add an accessibilityIdentifier for CI-stable replay`
|
|
59
83
|
: undefined;
|
|
60
|
-
return {
|
|
84
|
+
return {
|
|
85
|
+
selector: label,
|
|
86
|
+
selectorKind: 'text',
|
|
87
|
+
exportability: 'semantic',
|
|
88
|
+
warning,
|
|
89
|
+
provenance: provenance(session, { selectorKind: 'text', selectorValue: label, point }),
|
|
90
|
+
};
|
|
61
91
|
}
|
|
62
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
x: point.x,
|
|
94
|
+
y: point.y,
|
|
95
|
+
selectorKind: 'coords',
|
|
96
|
+
exportability: 'coordinate',
|
|
97
|
+
provenance: provenance(session, { selectorKind: 'coords', point }),
|
|
98
|
+
};
|
|
63
99
|
}
|
|
64
100
|
export function recordableNativeSelector(session, selectorKind, selectorValue) {
|
|
65
101
|
return { provenance: provenance(session, { selectorKind, selectorValue }) };
|
|
@@ -92,6 +128,10 @@ function pushSelectorAction(steps, provenanceEntries, a, actionIndex, selector,
|
|
|
92
128
|
addProvenance(provenanceEntries, a, actionIndex, actionStepIndex, generatedKind, selector);
|
|
93
129
|
}
|
|
94
130
|
export function generateFlow(actions, opts) {
|
|
131
|
+
// Defense in depth: a registered secret recorded as a literal (non-secure field) becomes a ${VAR}
|
|
132
|
+
// (same naming as the POM/suite generator: secretVarName), and typed text equal to a stored
|
|
133
|
+
// session input becomes that input's ${SWIPIUM_TEST_*} placeholder.
|
|
134
|
+
actions = secretSafeActions(actions, opts.secrets, opts.inputs).actions;
|
|
95
135
|
const steps = ['prepareTarget'];
|
|
96
136
|
const brittleSteps = [];
|
|
97
137
|
const variables = [];
|
|
@@ -116,7 +156,10 @@ export function generateFlow(actions, opts) {
|
|
|
116
156
|
addProvenance(provenanceEntries, a, actionIndex, steps.length + 1, 'tapAt');
|
|
117
157
|
steps.push({ tapAt: [a.x ?? 0, a.y ?? 0] });
|
|
118
158
|
coordinate++;
|
|
119
|
-
brittleSteps.push({
|
|
159
|
+
brittleSteps.push({
|
|
160
|
+
index: i,
|
|
161
|
+
reason: `tapped by coordinates (${a.x},${a.y})${a.screen ? ` on ${a.screen}` : ''}. Add a testID/accessibilityLabel for a durable selector`,
|
|
162
|
+
});
|
|
120
163
|
}
|
|
121
164
|
}
|
|
122
165
|
break;
|
|
@@ -130,19 +173,26 @@ export function generateFlow(actions, opts) {
|
|
|
130
173
|
addProvenance(provenanceEntries, a, actionIndex, steps.length + 1, 'tapAt');
|
|
131
174
|
steps.push({ tapAt: [a.x ?? 0, a.y ?? 0] }, { inputText: '' });
|
|
132
175
|
coordinate++;
|
|
133
|
-
brittleSteps.push({
|
|
176
|
+
brittleSteps.push({
|
|
177
|
+
index: i,
|
|
178
|
+
reason: `cleared by coordinates (${a.x},${a.y})${a.screen ? ` on ${a.screen}` : ''}. Add a testID/accessibilityLabel for a durable selector`,
|
|
179
|
+
});
|
|
134
180
|
}
|
|
135
181
|
break;
|
|
136
182
|
}
|
|
137
183
|
case 'type':
|
|
138
184
|
{
|
|
139
185
|
const selector = actionSelector(a);
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
186
|
+
const varName = a.secret ? secretVarName(a, ++secretCount) : undefined;
|
|
187
|
+
const text = varName ? `\${${varName}}` : (a.text ?? '');
|
|
188
|
+
if (varName) {
|
|
189
|
+
variables.push(varName);
|
|
143
190
|
needsHumanData++;
|
|
144
191
|
}
|
|
145
192
|
else {
|
|
193
|
+
// A non-secret templated value (e.g. ${SWIPIUM_TEST_EMAIL}) is a variable too.
|
|
194
|
+
for (const m of text.matchAll(/\$\{([^}]+)\}/g))
|
|
195
|
+
variables.push(m[1]);
|
|
146
196
|
semantic++;
|
|
147
197
|
}
|
|
148
198
|
if (selector)
|
|
@@ -183,6 +233,7 @@ export function generateFlow(actions, opts) {
|
|
|
183
233
|
break;
|
|
184
234
|
}
|
|
185
235
|
});
|
|
236
|
+
const uniqueVars = [...new Set(variables)];
|
|
186
237
|
const total = semantic + coordinate + needsHumanData;
|
|
187
238
|
const semanticPct = total ? Math.round((semantic / total) * 100) : 100;
|
|
188
239
|
const grade = semanticPct >= 90 ? 'A' : semanticPct >= 70 ? 'B' : 'C';
|
|
@@ -195,9 +246,9 @@ export function generateFlow(actions, opts) {
|
|
|
195
246
|
flowObj.provenance = provenanceEntries;
|
|
196
247
|
flowObj.steps = steps;
|
|
197
248
|
const header = [
|
|
198
|
-
`# Generated by Swipium
|
|
249
|
+
`# Generated by Swipium qa_generate target:"flow". Review before committing.`,
|
|
199
250
|
`# durability: ${grade} (${semanticPct}% semantic; ${coordinate} coordinate, ${needsHumanData} needs-human-data)`,
|
|
200
|
-
...(
|
|
251
|
+
...(uniqueVars.length ? [`# variables: provide via qa_flow_run { variables }: ${uniqueVars.join(', ')}`] : []),
|
|
201
252
|
...brittleSteps.map((b) => `# WARNING step ${b.index}: ${b.reason}`),
|
|
202
253
|
].join('\n');
|
|
203
254
|
return {
|
|
@@ -205,7 +256,7 @@ export function generateFlow(actions, opts) {
|
|
|
205
256
|
stepCount: steps.length,
|
|
206
257
|
durability: { grade, semanticPct, semantic, coordinate, needsHumanData },
|
|
207
258
|
brittleSteps,
|
|
208
|
-
variables,
|
|
259
|
+
variables: uniqueVars,
|
|
209
260
|
};
|
|
210
261
|
}
|
|
211
262
|
//# sourceMappingURL=generate.js.map
|