swipium 1.5.0 → 2.0.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.
- package/CHANGELOG.md +183 -0
- package/README.md +173 -280
- package/THREAT_MODEL.md +223 -47
- package/dist/appMap/automationLink.js +30 -27
- package/dist/appMap/automationLink.js.map +1 -1
- package/dist/appMap/build.js +47 -21
- package/dist/appMap/build.js.map +1 -1
- package/dist/appMap/codeIndex.js +2 -2
- package/dist/appMap/codeIndex.js.map +1 -1
- package/dist/appMap/featureIndex.js +3 -3
- package/dist/appMap/featureIndex.js.map +1 -1
- package/dist/appMap/featureModel.js +2 -2
- package/dist/appMap/featureModel.js.map +1 -1
- package/dist/appMap/firstRunApply.js +2 -2
- package/dist/appMap/firstRunApply.js.map +1 -1
- package/dist/appMap/issues.js +10 -10
- package/dist/appMap/issues.js.map +1 -1
- package/dist/appMap/migrations.js +5 -5
- 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 +77 -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 +2 -2
- package/dist/appMap/query.js.map +1 -1
- package/dist/appMap/runtimeMerge.js +3 -3
- 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 +1 -1
- package/dist/appMap/screenMatch.js.map +1 -1
- package/dist/appMap/staticScan.js +17 -17
- package/dist/appMap/staticScan.js.map +1 -1
- package/dist/appMap/store.js +55 -7
- package/dist/appMap/store.js.map +1 -1
- package/dist/appMap/tsAstScan.js +3 -3
- package/dist/appMap/tsAstScan.js.map +1 -1
- package/dist/artifacts/bundletool.js +5 -5
- package/dist/artifacts/bundletool.js.map +1 -1
- package/dist/artifacts/resolve.js +10 -10
- package/dist/artifacts/resolve.js.map +1 -1
- package/dist/automation/capabilities.js +3 -3
- package/dist/automation/capabilities.js.map +1 -1
- package/dist/automation/gestures.js +1 -1
- package/dist/automation/gestures.js.map +1 -1
- package/dist/automation/plan.js +7 -7
- package/dist/automation/plan.js.map +1 -1
- package/dist/automation/report.js +3 -3
- package/dist/automation/report.js.map +1 -1
- package/dist/automation/selectors.js +14 -25
- 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 +5 -5
- package/dist/automation/waits.js.map +1 -1
- package/dist/automation/webview.js +2 -2
- package/dist/automation/webview.js.map +1 -1
- package/dist/automationGen/appiumModel.js +13 -7
- package/dist/automationGen/appiumModel.js.map +1 -1
- package/dist/automationGen/ciEmitter.js +5 -5
- 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 +265 -106
- 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 +71 -26
- package/dist/automationGen/projectProfile.js.map +1 -1
- package/dist/automationGen/pythonEmitter.js +276 -105
- 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/{tools/automationGenerate.js → automationGen/run.js} +72 -113
- package/dist/automationGen/run.js.map +1 -0
- package/dist/automationGen/suitePlan.js +6 -4
- package/dist/automationGen/suitePlan.js.map +1 -1
- package/dist/automationGen/validation.js +20 -8
- package/dist/automationGen/validation.js.map +1 -1
- package/dist/build/parseBuildLog.js +2 -2
- package/dist/build/parseBuildLog.js.map +1 -1
- package/dist/build/plan.js +7 -7
- 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 +35 -14
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/suite.js +6 -6
- 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 +45 -14
- package/dist/context/detect.js.map +1 -1
- package/dist/context/findApps.js +6 -6
- 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 +3 -3
- package/dist/core/target.js.map +1 -1
- package/dist/core/targetPlan.js +65 -62
- package/dist/core/targetPlan.js.map +1 -1
- package/dist/drivers/DirectDriver.js +300 -36
- package/dist/drivers/DirectDriver.js.map +1 -1
- package/dist/drivers/SimctlDriver.js +120 -7
- package/dist/drivers/SimctlDriver.js.map +1 -1
- package/dist/drivers/WdaDriver.js +350 -50
- package/dist/drivers/WdaDriver.js.map +1 -1
- package/dist/explore/candidates.js +2 -2
- package/dist/explore/candidates.js.map +1 -1
- package/dist/explore/graph.js +5 -5
- package/dist/explore/graph.js.map +1 -1
- package/dist/explore/policy.js +5 -5
- package/dist/explore/policy.js.map +1 -1
- package/dist/explore/runner.js +301 -284
- package/dist/explore/runner.js.map +1 -1
- package/dist/explore/signatures.js +1 -1
- package/dist/featureTesting/executionBootstrap.js +29 -30
- package/dist/featureTesting/executionBootstrap.js.map +1 -1
- package/dist/featureTesting/featureMap.js +2 -2
- package/dist/featureTesting/featureMap.js.map +1 -1
- package/dist/featureTesting/featureScope.js +12 -12
- package/dist/featureTesting/featureScope.js.map +1 -1
- package/dist/featureTesting/mapFeatureScope.js +7 -7
- package/dist/featureTesting/mapFeatureScope.js.map +1 -1
- package/dist/featureTesting/objectiveModel.js +10 -10
- package/dist/featureTesting/objectiveModel.js.map +1 -1
- package/dist/featureTesting/resultMerge.js +6 -6
- package/dist/featureTesting/resultMerge.js.map +1 -1
- package/dist/featureTesting/sources.js +4 -4
- package/dist/featureTesting/sources.js.map +1 -1
- package/dist/featureTesting/suiteBridge.js +1 -1
- package/dist/featureTesting/suiteBridge.js.map +1 -1
- package/dist/featureTesting/synonyms.js +1 -1
- package/dist/featureTesting/synonyms.js.map +1 -1
- package/dist/featureTesting/testCaseFactory.js +11 -11
- package/dist/featureTesting/testCaseFactory.js.map +1 -1
- package/dist/featureTesting/testPlan.js +3 -3
- 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 +5 -5
- package/dist/firstRun/classifyScreen.js.map +1 -1
- package/dist/firstRun/firstRunPlanner.js +11 -11
- package/dist/firstRun/firstRunPlanner.js.map +1 -1
- package/dist/firstRun/firstRunRunner.js +8 -8
- package/dist/firstRun/firstRunRunner.js.map +1 -1
- package/dist/firstRun/generatedDataPolicy.js +9 -9
- package/dist/firstRun/generatedDataPolicy.js.map +1 -1
- package/dist/firstRun/inputPlanner.js +5 -5
- 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 +33 -3
- 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 +20 -10
- package/dist/flows/generate.js.map +1 -1
- package/dist/flows/pack.js +3 -3
- 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 +111 -23
- package/dist/flows/repair.js.map +1 -1
- package/dist/flows/run.js +153 -57
- package/dist/flows/run.js.map +1 -1
- package/dist/flows/schema.js +50 -5
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/seedExec.js +4 -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/issues/classify.js +16 -16
- package/dist/issues/classify.js.map +1 -1
- package/dist/issues/fingerprint.js +24 -4
- package/dist/issues/fingerprint.js.map +1 -1
- package/dist/issues/index.js +94 -31
- package/dist/issues/index.js.map +1 -1
- package/dist/issues/metrics.js +4 -4
- 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 +4 -4
- package/dist/issues/report.js.map +1 -1
- package/dist/issues/reportBridge.js +4 -4
- 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 +75 -7
- 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 +32 -7
- 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 +1 -1
- package/dist/lib/image.js.map +1 -1
- package/dist/lib/lockfile.js +370 -31
- package/dist/lib/lockfile.js.map +1 -1
- package/dist/lib/needsInput.js +3 -3
- package/dist/lib/needsInput.js.map +1 -1
- package/dist/lib/png.js +2 -2
- 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 +79 -10
- package/dist/lib/result.js.map +1 -1
- package/dist/lib/schemaHash.js +3 -3
- package/dist/lib/schemaHash.js.map +1 -1
- package/dist/lib/sensitive.js +3 -2
- 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 +52 -10
- 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 +294 -15
- package/dist/lib/wda.js.map +1 -1
- package/dist/mobileAudit/checks.js +12 -12
- 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 +1 -1
- package/dist/mobileAudit/profiles.js.map +1 -1
- package/dist/mobileAudit/results.js +3 -3
- package/dist/mobileAudit/results.js.map +1 -1
- package/dist/mobileAudit/runner.js +72 -18
- 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 +219 -36
- package/dist/oracle/failures.js.map +1 -1
- package/dist/oracle/health.js +63 -17
- package/dist/oracle/health.js.map +1 -1
- package/dist/oracle/locator.js +13 -13
- 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 +4 -4
- package/dist/orchestration/goal.js.map +1 -1
- package/dist/orchestration/testThis/execute.js +62 -21
- package/dist/orchestration/testThis/execute.js.map +1 -1
- package/dist/orchestration/testThis/pipeline.js +119 -30
- package/dist/orchestration/testThis/pipeline.js.map +1 -1
- package/dist/orchestration/testThis/plan.js +162 -73
- package/dist/orchestration/testThis/plan.js.map +1 -1
- package/dist/orchestration/testThis/sessionIntent.js +72 -0
- package/dist/orchestration/testThis/sessionIntent.js.map +1 -0
- package/dist/orchestration/testThis/terminal.js +34 -16
- package/dist/orchestration/testThis/terminal.js.map +1 -1
- package/dist/orchestration/testThis/types.js +1 -1
- package/dist/orchestration/testThis/types.js.map +1 -1
- package/dist/plan/plan.js +9 -9
- package/dist/plan/plan.js.map +1 -1
- package/dist/prompts/index.js +22 -22
- package/dist/prompts/index.js.map +1 -1
- package/dist/report/export.js +392 -37
- 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/policy.js +7 -4
- package/dist/report/policy.js.map +1 -1
- package/dist/report/qaLevel.js +8 -8
- package/dist/report/qaLevel.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/toolHealth.js +124 -0
- package/dist/report/toolHealth.js.map +1 -0
- package/dist/server.js +472 -45
- 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 +2 -2
- package/dist/services/build.js.map +1 -1
- package/dist/{tools → services}/flowGenerate.js +29 -13
- package/dist/services/flowGenerate.js.map +1 -0
- package/dist/services/preflight.js +4 -4
- package/dist/services/preflight.js.map +1 -1
- package/dist/services/prepareAndroid.js +46 -8
- package/dist/services/prepareAndroid.js.map +1 -1
- package/dist/services/prepareIos.js +24 -9
- package/dist/services/prepareIos.js.map +1 -1
- package/dist/services/report.js +100 -45
- package/dist/services/report.js.map +1 -1
- package/dist/services/smoke.js +32 -16
- package/dist/services/smoke.js.map +1 -1
- package/dist/services/suiteGenerate.js +28 -3
- package/dist/services/suiteGenerate.js.map +1 -1
- package/dist/services/testSuiteKnowledge.js +40 -27
- package/dist/services/testSuiteKnowledge.js.map +1 -1
- package/dist/session/attach.js +270 -6
- package/dist/session/attach.js.map +1 -1
- package/dist/session/processRegistry.js +317 -48
- package/dist/session/processRegistry.js.map +1 -1
- package/dist/session/progress.js +1 -1
- package/dist/session/retention.js +201 -0
- package/dist/session/retention.js.map +1 -0
- package/dist/session/store.js +275 -48
- package/dist/session/store.js.map +1 -1
- package/dist/snapshot/overlays.js +53 -8
- package/dist/snapshot/overlays.js.map +1 -1
- package/dist/snapshot/parse.js +28 -4
- package/dist/snapshot/parse.js.map +1 -1
- package/dist/snapshot/present.js +11 -5
- 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 +46 -2
- package/dist/state/profile.js.map +1 -1
- package/dist/suite/compile.js +9 -5
- package/dist/suite/compile.js.map +1 -1
- package/dist/suite/lint.js +4 -4
- package/dist/suite/lint.js.map +1 -1
- package/dist/suite/pom.js +50 -41
- 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 +9 -7
- package/dist/suite/testcase.js.map +1 -1
- package/dist/testSuite/exporter.js +4 -4
- package/dist/testSuite/exporter.js.map +1 -1
- package/dist/testSuite/generator.js +13 -9
- 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 +5 -5
- package/dist/testSuite/merge.js.map +1 -1
- package/dist/testSuite/schema.js +5 -5
- package/dist/testSuite/schema.js.map +1 -1
- package/dist/testSuite/store.js +3 -3
- 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 +794 -164
- package/dist/tools/act.js.map +1 -1
- package/dist/tools/agent.js +451 -128
- package/dist/tools/agent.js.map +1 -1
- package/dist/tools/appControl.js +69 -19
- package/dist/tools/appControl.js.map +1 -1
- package/dist/tools/appMap.js +188 -130
- package/dist/tools/appMap.js.map +1 -1
- package/dist/tools/build.js +32 -42
- package/dist/tools/build.js.map +1 -1
- package/dist/tools/bundletool.js +21 -31
- package/dist/tools/bundletool.js.map +1 -1
- package/dist/tools/clearOverlay.js +55 -12
- package/dist/tools/clearOverlay.js.map +1 -1
- package/dist/tools/device.js +76 -24
- package/dist/tools/device.js.map +1 -1
- package/dist/tools/doctor.js +68 -28
- package/dist/tools/doctor.js.map +1 -1
- package/dist/tools/explore.js +41 -47
- package/dist/tools/explore.js.map +1 -1
- package/dist/tools/featureTesting.js +31 -48
- package/dist/tools/featureTesting.js.map +1 -1
- package/dist/tools/firstRun.js +34 -41
- package/dist/tools/firstRun.js.map +1 -1
- package/dist/tools/flow.js +183 -103
- package/dist/tools/flow.js.map +1 -1
- package/dist/tools/flowRepair.js +25 -13
- package/dist/tools/flowRepair.js.map +1 -1
- package/dist/tools/generate.js +52 -89
- package/dist/tools/generate.js.map +1 -1
- package/dist/tools/getArtifact.js +16 -5
- package/dist/tools/getArtifact.js.map +1 -1
- package/dist/tools/health.js +15 -12
- package/dist/tools/health.js.map +1 -1
- package/dist/tools/ios.js +45 -223
- package/dist/tools/ios.js.map +1 -1
- package/dist/tools/issues.js +251 -35
- package/dist/tools/issues.js.map +1 -1
- package/dist/tools/jobs.js +41 -16
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/metro.js +36 -35
- package/dist/tools/metro.js.map +1 -1
- package/dist/tools/mobileAudit.js +50 -45
- package/dist/tools/mobileAudit.js.map +1 -1
- package/dist/tools/network.js +31 -14
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/note.js +26 -26
- package/dist/tools/note.js.map +1 -1
- package/dist/tools/prepareIosTarget.js +10 -16
- package/dist/tools/prepareIosTarget.js.map +1 -1
- package/dist/tools/prepareTarget.js +117 -50
- package/dist/tools/prepareTarget.js.map +1 -1
- package/dist/tools/report.js +11 -22
- package/dist/tools/report.js.map +1 -1
- package/dist/tools/resolveArtifact.js +11 -15
- package/dist/tools/resolveArtifact.js.map +1 -1
- package/dist/tools/resolveTarget.js +78 -24
- package/dist/tools/resolveTarget.js.map +1 -1
- package/dist/tools/screenRecord.js +23 -21
- package/dist/tools/screenRecord.js.map +1 -1
- package/dist/tools/screenshot.js +23 -16
- package/dist/tools/screenshot.js.map +1 -1
- package/dist/tools/smoke.js +20 -16
- package/dist/tools/smoke.js.map +1 -1
- package/dist/tools/snapshot.js +155 -118
- package/dist/tools/snapshot.js.map +1 -1
- package/dist/tools/startSession.js +104 -116
- package/dist/tools/startSession.js.map +1 -1
- package/dist/tools/suite.js +72 -43
- package/dist/tools/suite.js.map +1 -1
- package/dist/tools/testSuite.js +30 -20
- package/dist/tools/testSuite.js.map +1 -1
- package/dist/tools/testThis.js +24 -28
- package/dist/tools/testThis.js.map +1 -1
- package/dist/tools/visual.js +686 -210
- package/dist/tools/visual.js.map +1 -1
- package/dist/tools/wait.js +9 -38
- package/dist/tools/wait.js.map +1 -1
- package/dist/tools/wda.js +187 -57
- package/dist/tools/wda.js.map +1 -1
- package/dist/version.js +31 -22
- package/dist/version.js.map +1 -1
- package/dist/visual/ocr.js +53 -6
- package/dist/visual/ocr.js.map +1 -1
- package/dist/visual/provider.js +80 -12
- 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 +194 -128
- package/docs/physical-devices.md +84 -0
- package/docs/tools.md +812 -152
- package/package.json +3 -2
- package/dist/tools/assertVisual.js +0 -84
- package/dist/tools/assertVisual.js.map +0 -1
- package/dist/tools/automationGenerate.js.map +0 -1
- package/dist/tools/capabilities.js +0 -179
- 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.map +0 -1
- package/dist/tools/history.js +0 -86
- package/dist/tools/history.js.map +0 -1
- package/dist/tools/locator.js +0 -85
- package/dist/tools/locator.js.map +0 -1
- package/dist/tools/permissions.js +0 -174
- package/dist/tools/permissions.js.map +0 -1
- package/dist/tools/plan.js +0 -52
- package/dist/tools/plan.js.map +0 -1
- package/dist/tools/screenInfo.js +0 -76
- package/dist/tools/screenInfo.js.map +0 -1
- package/dist/tools/seed.js +0 -133
- package/dist/tools/seed.js.map +0 -1
- package/dist/tools/state.js +0 -217
- package/dist/tools/state.js.map +0 -1
- package/dist/tools/visualText.js +0 -106
- package/dist/tools/visualText.js.map +0 -1
package/dist/automation/waits.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Automation Kernel V2
|
|
1
|
+
// Automation Kernel V2, Workstream 4: Wait and Stability Engine. Explicit wait contracts that
|
|
2
2
|
// replace scattered sleeps. Assertions act as efficient condition waits (Maestro parity); idle waits
|
|
3
3
|
// label their source as app_declared | backend | heuristic (Espresso parity); tap retry is explicit
|
|
4
4
|
// and recorded, never a hidden loop. All executors take an injectable clock so they are deterministic
|
|
@@ -33,7 +33,7 @@ export async function waitForVisible(isVisible, opts) {
|
|
|
33
33
|
const r = await waitForCondition(isVisible, opts);
|
|
34
34
|
return { ...r, visible: r.ok };
|
|
35
35
|
}
|
|
36
|
-
/** Wait until an element is NOT visible
|
|
36
|
+
/** Wait until an element is NOT visible, e.g. a spinner / modal disappears. */
|
|
37
37
|
export async function waitForNotVisible(isVisible, opts) {
|
|
38
38
|
const r = await waitForCondition(async () => !(await isVisible()), opts);
|
|
39
39
|
return { ...r, visible: !r.ok };
|
|
@@ -42,7 +42,7 @@ export async function waitForNotVisible(isVisible, opts) {
|
|
|
42
42
|
* Wait for the UI to settle. The caller declares which idle source is in play:
|
|
43
43
|
* - app_declared: an Espresso/RN idling resource the app exposes (the only true proof)
|
|
44
44
|
* - backend: WDA/XCTest waitForIdle or driver-level idle
|
|
45
|
-
* - heuristic: best-effort settling (screenshot stability etc.)
|
|
45
|
+
* - heuristic: best-effort settling (screenshot stability etc.), labeled as NOT app proof
|
|
46
46
|
*/
|
|
47
47
|
export async function waitForIdle(isIdle, opts) {
|
|
48
48
|
const r = await waitForCondition(isIdle, opts);
|
|
@@ -60,7 +60,7 @@ export async function waitForIdle(isIdle, opts) {
|
|
|
60
60
|
: 'heuristic settling did not stabilize within timeout';
|
|
61
61
|
return { ok: r.ok, source: opts.source, elapsedMs: r.elapsedMs, polls: r.polls, timedOut: r.timedOut, appProof, detail };
|
|
62
62
|
}
|
|
63
|
-
/** waitForAnimationToEnd
|
|
63
|
+
/** waitForAnimationToEnd: on timeout, pass with a warning rather than fail. */
|
|
64
64
|
export async function waitForAnimationToEnd(isAnimating, opts) {
|
|
65
65
|
const r = await waitForCondition(async () => !(await isAnimating()), opts);
|
|
66
66
|
if (r.ok)
|
|
@@ -75,7 +75,7 @@ export async function waitForAnimationToEnd(isAnimating, opts) {
|
|
|
75
75
|
/**
|
|
76
76
|
* Tap with explicit `retryTapIfNoChange` semantics. Taps once; if the UI did not change AND retry is
|
|
77
77
|
* enabled, taps exactly one more time. Every attempt (with before/after signatures) is recorded so
|
|
78
|
-
* the retry is visible in the plan and evidence
|
|
78
|
+
* the retry is visible in the plan and evidence. Never a hidden loop.
|
|
79
79
|
*/
|
|
80
80
|
export async function retryTapIfNoChange(doTap, screenSignature, opts) {
|
|
81
81
|
const attempts = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/automation/waits.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"waits.js","sourceRoot":"","sources":["../../src/automation/waits.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,qGAAqG;AACrG,oGAAoG;AACpG,sGAAsG;AACtG,gEAAgE;AAShE,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;IACrB,KAAK,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;CACzE,CAAC;AASF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAA2C,EAC3C,IAAmE;IAEnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,0BAA0B;IAC1B,KAAK,IAAI,CAAC,CAAC;IACX,IAAI,MAAM,SAAS,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnG,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC5C,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC;QACX,IAAI,MAAM,SAAS,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC9E,CAAC;AAMD,4DAA4D;AAC5D,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAA2C,EAC3C,IAAmE;IAEnE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;AACjC,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAA2C,EAC3C,IAAmE;IAEnE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzE,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAClC,CAAC;AAaD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAwC,EACxC,IAAuF;IAEvF,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,CAAC,EAAE,CAAC;IACxD,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,cAAc;QAC5B,CAAC,CAAC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,4CAA4C;YAC9C,CAAC,CAAC,4DAA4D;QAChE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;YACzB,CAAC,CAAC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,4CAA4C;YAChD,CAAC,CAAC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,qDAAqD;gBACvD,CAAC,CAAC,qDAAqD,CAAC;IAChE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC3H,CAAC;AAUD,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAA6C,EAC7C,IAAmE;IAEnE,MAAM,CAAC,GAAG,MAAM,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;IACvE,OAAO;QACL,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,OAAO,EAAE,gCAAgC,IAAI,CAAC,SAAS,qCAAqC;KAC7F,CAAC;AACJ,CAAC;AAgBD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAiC,EACjC,eAAuE,EACvE,IAA0B;IAE1B,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,MAAM,KAAK,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjG,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,MAAM,KAAK,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,eAAe,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,OAAO,KAAK,MAAM,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;IACjG,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Automation Kernel V2
|
|
1
|
+
// Automation Kernel V2, Workstream 7 (Stage 1): Hybrid / WebView awareness. Pure detection of
|
|
2
2
|
// probable WebView / canvas / map surfaces from UI-tree element classes, plus the diagnostics that
|
|
3
3
|
// tell a developer whether structured automation is possible or whether Appium context support (or a
|
|
4
4
|
// native accessibility id) is required. Stage 1 is detection + read-only Appium context inventory; it
|
|
@@ -71,7 +71,7 @@ export function detectHybridSurface(elements, opts = {}) {
|
|
|
71
71
|
agentMessage: 'This screen looks like a WebView. I need Appium context support or a native accessibility id to automate it structurally; otherwise I can only produce visual candidate evidence.',
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
-
/** Read-only Appium context inventory (Stage 2 deliverable
|
|
74
|
+
/** Read-only Appium context inventory (Stage 2 deliverable, no arbitrary JS execution). */
|
|
75
75
|
export function summarizeAppiumContexts(contexts, current) {
|
|
76
76
|
const webviewContexts = contexts.filter((c) => !/^native_app$/i.test(c));
|
|
77
77
|
return { current: current ?? null, available: [...contexts], webviewContexts };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webview.js","sourceRoot":"","sources":["../../src/automation/webview.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"webview.js","sourceRoot":"","sources":["../../src/automation/webview.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
//
|
|
1
|
+
// Cross-platform Appium POM model. Pure transform of the canonical Swipium POM
|
|
2
2
|
// (src/suite/pom.ts) into an Appium-ready, language-agnostic screen model that the JS and Python
|
|
3
3
|
// emitters share. This is the "shared intermediate model" the requirement asks for so generated
|
|
4
4
|
// JS/Python cannot drift from Swipium YAML semantics.
|
|
5
5
|
//
|
|
6
|
-
// Locator policy (
|
|
6
|
+
// Locator policy (follows Appium locator-strategy guidance):
|
|
7
7
|
// accessibility id > resource-id/id > iOS predicate/class-chain/name > text > coordinate.
|
|
8
8
|
// XPath is NEVER emitted; coordinate is the explicit non-release-grade fallback.
|
|
9
|
-
|
|
9
|
+
import { asciiFold } from './identifiers.js';
|
|
10
|
+
/** PomPage name (LoginPage) > screen class name (LoginScreen). */
|
|
10
11
|
export function screenClassName(pageName) {
|
|
11
12
|
return /Page$/.test(pageName) ? pageName.replace(/Page$/, 'Screen') : `${pageName}Screen`;
|
|
12
13
|
}
|
|
@@ -21,7 +22,7 @@ function locator(strategy, value) {
|
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Compute the platform-specific Appium locators for one POM element selectorKind.
|
|
24
|
-
* Returns { android, ios, fallback }
|
|
25
|
+
* Returns { android, ios, fallback }, any of which may be undefined.
|
|
25
26
|
*/
|
|
26
27
|
function locatorsFor(selectorKind, selector, coords, platforms) {
|
|
27
28
|
const value = selector ?? '';
|
|
@@ -40,7 +41,7 @@ function locatorsFor(selectorKind, selector, coords, platforms) {
|
|
|
40
41
|
case 'class_chain':
|
|
41
42
|
return { ios: platforms.ios ? locator('iosClassChain', value) : undefined };
|
|
42
43
|
case 'text': {
|
|
43
|
-
// text
|
|
44
|
+
// text > Android UiAutomator text match (semi), iOS name match (semi). Both fragile.
|
|
44
45
|
const android = platforms.android ? locator('androidUiautomator', value) : undefined;
|
|
45
46
|
const ios = platforms.ios ? locator('name', value) : undefined;
|
|
46
47
|
return { android, ios, fallback: locator('androidUiautomator', value) };
|
|
@@ -104,7 +105,7 @@ function toStep(s, secrets, variables) {
|
|
|
104
105
|
variables.add(m[1]);
|
|
105
106
|
return { ...base, action: 'inputText', text: s.text, secret: s.secret, varName: m[1] };
|
|
106
107
|
}
|
|
107
|
-
// literal non-secret text
|
|
108
|
+
// literal non-secret text; also scan for embedded ${VARS}
|
|
108
109
|
for (const mm of (s.text ?? '').matchAll(/\$\{([^}]+)\}/g))
|
|
109
110
|
variables.add(mm[1]);
|
|
110
111
|
return { ...base, action: 'inputText', text: s.text ?? '', secret: s.secret };
|
|
@@ -115,14 +116,19 @@ function toStep(s, secrets, variables) {
|
|
|
115
116
|
return { ...base, action: 'press', key: s.key };
|
|
116
117
|
if (s.action === 'swipe')
|
|
117
118
|
return { ...base, action: 'swipe', direction: s.direction };
|
|
119
|
+
// scrollTo carries the CONTENT direction the recording scrolled in ('down' reveals content below).
|
|
120
|
+
if (s.action === 'scrollTo')
|
|
121
|
+
return { ...base, action: 'scrollTo', direction: s.direction, text: s.element ? undefined : s.text };
|
|
118
122
|
if (s.action === 'openUrl')
|
|
119
123
|
return { ...base, action: 'openUrl', url: s.url };
|
|
120
124
|
if (s.action === 'assertVisible')
|
|
121
125
|
return { ...base, action: 'assertVisible', text: s.text };
|
|
126
|
+
if (s.action === 'visualCheck')
|
|
127
|
+
return { ...base, element: undefined, action: 'visualCheck', text: s.text };
|
|
122
128
|
return base;
|
|
123
129
|
}
|
|
124
130
|
function kebab(s) {
|
|
125
|
-
return s
|
|
131
|
+
return asciiFold(s)
|
|
126
132
|
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
127
133
|
.replace(/[^A-Za-z0-9]+/g, '-')
|
|
128
134
|
.replace(/^-+|-+$/g, '')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appiumModel.js","sourceRoot":"","sources":["../../src/automationGen/appiumModel.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"appiumModel.js","sourceRoot":"","sources":["../../src/automationGen/appiumModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
//
|
|
1
|
+
// CI example emitter. Pure: produces a LOCAL-Appium CI template (GitHub Actions)
|
|
2
2
|
// for the generated JS or Python suite. Per the non-goals, this is a starting example only (no cloud
|
|
3
|
-
// device-farm config), and the tool writes it as `ci.example.yml
|
|
3
|
+
// device-farm config), and the tool writes it as `ci.example.yml`, never as an active workflow.
|
|
4
4
|
export function emitCiExample(language, _opts = {}) {
|
|
5
5
|
if (language === 'python')
|
|
6
6
|
return pythonCi();
|
|
@@ -8,7 +8,7 @@ export function emitCiExample(language, _opts = {}) {
|
|
|
8
8
|
}
|
|
9
9
|
function jsCi(language) {
|
|
10
10
|
const installTs = language === 'typescript' ? '' : '';
|
|
11
|
-
return `# Generated by Swipium
|
|
11
|
+
return `# Generated by Swipium. EXAMPLE local-Appium CI (rename to .github/workflows/*.yml to enable).
|
|
12
12
|
# Local Appium + Android emulator only. No cloud device farm (out of scope for v1).
|
|
13
13
|
name: appium-e2e (example)
|
|
14
14
|
on:
|
|
@@ -37,12 +37,12 @@ jobs:
|
|
|
37
37
|
sleep 8
|
|
38
38
|
ANDROID_APP_PACKAGE=\${{ env.ANDROID_APP_PACKAGE }} npm test
|
|
39
39
|
env:
|
|
40
|
-
# Provide secrets via repo/Org secrets
|
|
40
|
+
# Provide secrets via repo/Org secrets. Never commit them.
|
|
41
41
|
SWIPIUM_TEST_PASSWORD: \${{ secrets.SWIPIUM_TEST_PASSWORD }}
|
|
42
42
|
`;
|
|
43
43
|
}
|
|
44
44
|
function pythonCi() {
|
|
45
|
-
return `# Generated by Swipium
|
|
45
|
+
return `# Generated by Swipium. EXAMPLE local-Appium CI (rename to .github/workflows/*.yml to enable).
|
|
46
46
|
# Local Appium + Android emulator only. No cloud device farm (out of scope for v1).
|
|
47
47
|
name: appium-e2e (example)
|
|
48
48
|
on:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ciEmitter.js","sourceRoot":"","sources":["../../src/automationGen/ciEmitter.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"ciEmitter.js","sourceRoot":"","sources":["../../src/automationGen/ciEmitter.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,qGAAqG;AACrG,gGAAgG;AAIhG,MAAM,UAAU,aAAa,CAAC,QAA4B,EAAE,QAA4B,EAAE;IACxF,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,EAAE,CAAC;IAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,IAAI,CAAC,QAA4B;IACxC,MAAM,SAAS,GAAG,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,OAAO;;;;;;;;;;;;;;0BAciB,SAAS;;;;;;;;;;;;;;;;;CAiBlC,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// Identifier safety for the generated JS/TS and Python suites (H4). Recorded element/page names
|
|
2
|
+
// come from arbitrary app copy ("Continue", "Return", "2FA code", "class", "登录"), so every name
|
|
3
|
+
// that becomes a class, field, attribute or method in generated source is sanitized here:
|
|
4
|
+
// - Latin diacritics transliterated first (asciiFold: "Configuración" > "Configuracion"), then
|
|
5
|
+
// remaining non-ASCII / punctuation stripped; empty > a stable fallback (element, element2, …);
|
|
6
|
+
// - a leading digit gets a prefix (2FACode > el2FACode / el_2fa_code);
|
|
7
|
+
// - language keywords / reserved words get a trailing underscore (continue > continue_);
|
|
8
|
+
// - names that would shadow a BaseScreen member (tap, find, driver, …) are suffixed too;
|
|
9
|
+
// - collisions are deduped deterministically in declaration order (name, name2, name3, …).
|
|
10
|
+
// Pure, no I/O.
|
|
11
|
+
/** Thrown when a recorded step cannot be expressed as real generated code. Generation fails with
|
|
12
|
+
* this message instead of emitting a silent no-op (driver.swipe(0,0,0,0) / pass / a comment). */
|
|
13
|
+
export class UnemittableStepError extends Error {
|
|
14
|
+
code = 'UNEMITTABLE_STEP';
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'UnemittableStepError';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** ECMAScript reserved words + strict-mode / TypeScript-sensitive words. */
|
|
21
|
+
export const JS_RESERVED = new Set([
|
|
22
|
+
'break',
|
|
23
|
+
'case',
|
|
24
|
+
'catch',
|
|
25
|
+
'class',
|
|
26
|
+
'const',
|
|
27
|
+
'continue',
|
|
28
|
+
'debugger',
|
|
29
|
+
'default',
|
|
30
|
+
'delete',
|
|
31
|
+
'do',
|
|
32
|
+
'else',
|
|
33
|
+
'enum',
|
|
34
|
+
'export',
|
|
35
|
+
'extends',
|
|
36
|
+
'false',
|
|
37
|
+
'finally',
|
|
38
|
+
'for',
|
|
39
|
+
'function',
|
|
40
|
+
'if',
|
|
41
|
+
'import',
|
|
42
|
+
'in',
|
|
43
|
+
'instanceof',
|
|
44
|
+
'new',
|
|
45
|
+
'null',
|
|
46
|
+
'return',
|
|
47
|
+
'super',
|
|
48
|
+
'switch',
|
|
49
|
+
'this',
|
|
50
|
+
'throw',
|
|
51
|
+
'true',
|
|
52
|
+
'try',
|
|
53
|
+
'typeof',
|
|
54
|
+
'var',
|
|
55
|
+
'void',
|
|
56
|
+
'while',
|
|
57
|
+
'with',
|
|
58
|
+
'yield',
|
|
59
|
+
'let',
|
|
60
|
+
'static',
|
|
61
|
+
'implements',
|
|
62
|
+
'interface',
|
|
63
|
+
'package',
|
|
64
|
+
'private',
|
|
65
|
+
'protected',
|
|
66
|
+
'public',
|
|
67
|
+
'await',
|
|
68
|
+
'arguments',
|
|
69
|
+
'eval',
|
|
70
|
+
'undefined',
|
|
71
|
+
'NaN',
|
|
72
|
+
'Infinity',
|
|
73
|
+
]);
|
|
74
|
+
/** Python hard keywords (keyword.kwlist). Soft keywords (match/case/type/_) are valid identifiers. */
|
|
75
|
+
export const PY_KEYWORDS = new Set([
|
|
76
|
+
'False',
|
|
77
|
+
'None',
|
|
78
|
+
'True',
|
|
79
|
+
'and',
|
|
80
|
+
'as',
|
|
81
|
+
'assert',
|
|
82
|
+
'async',
|
|
83
|
+
'await',
|
|
84
|
+
'break',
|
|
85
|
+
'class',
|
|
86
|
+
'continue',
|
|
87
|
+
'def',
|
|
88
|
+
'del',
|
|
89
|
+
'elif',
|
|
90
|
+
'else',
|
|
91
|
+
'except',
|
|
92
|
+
'finally',
|
|
93
|
+
'for',
|
|
94
|
+
'from',
|
|
95
|
+
'global',
|
|
96
|
+
'if',
|
|
97
|
+
'import',
|
|
98
|
+
'in',
|
|
99
|
+
'is',
|
|
100
|
+
'lambda',
|
|
101
|
+
'nonlocal',
|
|
102
|
+
'not',
|
|
103
|
+
'or',
|
|
104
|
+
'pass',
|
|
105
|
+
'raise',
|
|
106
|
+
'return',
|
|
107
|
+
'try',
|
|
108
|
+
'while',
|
|
109
|
+
'with',
|
|
110
|
+
'yield',
|
|
111
|
+
]);
|
|
112
|
+
/** Transliterate to ASCII where Unicode allows it: NFKD, then drop combining marks
|
|
113
|
+
* ("Configuración" > "Configuracion", "Überblick" > "Uberblick", "file" > "file"). Scripts with no
|
|
114
|
+
* ASCII decomposition ("登录") pass through unchanged and are stripped by the sanitizers. Applied
|
|
115
|
+
* before EVERY class / module / file / member name derivation so they stay consistent
|
|
116
|
+
* (without it "ó" became a word break: configuraci_nscreen.py next to configuraci_n2_screen.py). */
|
|
117
|
+
export function asciiFold(s) {
|
|
118
|
+
return s.normalize('NFKD').replace(/\p{M}+/gu, '');
|
|
119
|
+
}
|
|
120
|
+
function words(s) {
|
|
121
|
+
return asciiFold(s)
|
|
122
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
123
|
+
.replace(/[^A-Za-z0-9]+/g, ' ')
|
|
124
|
+
.trim()
|
|
125
|
+
.split(/\s+/)
|
|
126
|
+
.filter(Boolean);
|
|
127
|
+
}
|
|
128
|
+
/** PascalCase from arbitrary text (ASCII letters/digits only); '' when nothing survives. */
|
|
129
|
+
export function pascalWords(s) {
|
|
130
|
+
return asciiFold(s)
|
|
131
|
+
.replace(/[^A-Za-z0-9]+/g, ' ')
|
|
132
|
+
.trim()
|
|
133
|
+
.split(/\s+/)
|
|
134
|
+
.filter(Boolean)
|
|
135
|
+
.map((p) => p[0].toUpperCase() + p.slice(1))
|
|
136
|
+
.join('');
|
|
137
|
+
}
|
|
138
|
+
/** snake_case from arbitrary text (ASCII letters/digits only); '' when nothing survives. */
|
|
139
|
+
export function snakeWords(s) {
|
|
140
|
+
return words(s).join('_').toLowerCase();
|
|
141
|
+
}
|
|
142
|
+
/** Deterministic de-duplicating allocator: first come keeps the base, later ones get 2, 3, …
|
|
143
|
+
* A name that clashes with a RESERVED member (e.g. BaseScreen.tap) is suffixed with `_` first
|
|
144
|
+
* (tap > tap_), matching the keyword convention; only then numbered. */
|
|
145
|
+
export class NameAllocator {
|
|
146
|
+
normalize;
|
|
147
|
+
used;
|
|
148
|
+
reserved;
|
|
149
|
+
constructor(reserved = [], normalize = (s) => s) {
|
|
150
|
+
this.normalize = normalize;
|
|
151
|
+
this.reserved = new Set([...reserved].map(normalize));
|
|
152
|
+
this.used = new Set(this.reserved);
|
|
153
|
+
}
|
|
154
|
+
alloc(base, sep = '') {
|
|
155
|
+
const root = this.reserved.has(this.normalize(base)) ? `${base}_` : base;
|
|
156
|
+
let name = root;
|
|
157
|
+
let n = 2;
|
|
158
|
+
while (this.used.has(this.normalize(name)))
|
|
159
|
+
name = `${root}${sep}${n++}`;
|
|
160
|
+
this.used.add(this.normalize(name));
|
|
161
|
+
return name;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** A camelCase JS identifier (field / variable). */
|
|
165
|
+
export function jsMemberName(raw, fallback = 'element') {
|
|
166
|
+
const p = pascalWords(raw);
|
|
167
|
+
let id = p ? p[0].toLowerCase() + p.slice(1) : fallback;
|
|
168
|
+
if (/^[0-9]/.test(id))
|
|
169
|
+
id = `el${id}`;
|
|
170
|
+
if (JS_RESERVED.has(id))
|
|
171
|
+
id = `${id}_`;
|
|
172
|
+
return id;
|
|
173
|
+
}
|
|
174
|
+
/** A PascalCase JS/Python class name. */
|
|
175
|
+
export function className(raw, fallback = 'Screen') {
|
|
176
|
+
let id = pascalWords(raw) || fallback;
|
|
177
|
+
if (/^[0-9]/.test(id))
|
|
178
|
+
id = `Screen${id}`;
|
|
179
|
+
if (JS_RESERVED.has(id) || PY_KEYWORDS.has(id))
|
|
180
|
+
id = `${id}_`;
|
|
181
|
+
return id;
|
|
182
|
+
}
|
|
183
|
+
/** A snake_case Python identifier (attribute / module / variable). */
|
|
184
|
+
export function pyName(raw, fallback = 'element') {
|
|
185
|
+
let id = snakeWords(raw) || fallback;
|
|
186
|
+
if (/^[0-9]/.test(id))
|
|
187
|
+
id = `el_${id}`;
|
|
188
|
+
if (PY_KEYWORDS.has(id))
|
|
189
|
+
id = `${id}_`;
|
|
190
|
+
return id;
|
|
191
|
+
}
|
|
192
|
+
/** True for a plain JS identifier usable after a dot / as a bare object key. */
|
|
193
|
+
export function isJsIdentifier(s) {
|
|
194
|
+
return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(s);
|
|
195
|
+
}
|
|
196
|
+
/** Collapse text onto one line so it is safe inside a `//` or `#` line comment. */
|
|
197
|
+
export function commentSafe(s) {
|
|
198
|
+
return (s ?? '').replace(/[\r\n\u2028\u2029]+/g, ' ');
|
|
199
|
+
}
|
|
200
|
+
export const DIRECTIONS = ['up', 'down', 'left', 'right'];
|
|
201
|
+
export function checkDirection(dir, what) {
|
|
202
|
+
const d = (dir ?? '').toLowerCase();
|
|
203
|
+
if (DIRECTIONS.includes(d))
|
|
204
|
+
return d;
|
|
205
|
+
throw new UnemittableStepError(`cannot emit ${what}: direction ${JSON.stringify(dir)} is not one of up/down/left/right. Fix the recorded step and regenerate`);
|
|
206
|
+
}
|
|
207
|
+
export const SUPPORTED_KEYS = ['back', 'home', 'enter'];
|
|
208
|
+
export function checkKey(key) {
|
|
209
|
+
const k = (key ?? 'back').toLowerCase();
|
|
210
|
+
if (SUPPORTED_KEYS.includes(k))
|
|
211
|
+
return k;
|
|
212
|
+
throw new UnemittableStepError(`cannot emit press step: key ${JSON.stringify(key)} is not supported by the generated suite (supported: ${SUPPORTED_KEYS.join(', ')})`);
|
|
213
|
+
}
|
|
214
|
+
/** Screens referenced by steps but absent from model.screens still need (empty) classes, or the
|
|
215
|
+
* generated test would import a module that does not exist. */
|
|
216
|
+
export function screensOf(model) {
|
|
217
|
+
const out = [...model.screens];
|
|
218
|
+
for (const s of model.steps) {
|
|
219
|
+
if (!out.some((sc) => sc.className === s.screen))
|
|
220
|
+
out.push({ className: s.screen, pageName: s.screen, elements: [] });
|
|
221
|
+
}
|
|
222
|
+
return out;
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=identifiers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/automationGen/identifiers.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,gGAAgG;AAChG,0FAA0F;AAC1F,iGAAiG;AACjG,oGAAoG;AACpG,yEAAyE;AACzE,2FAA2F;AAC3F,2FAA2F;AAC3F,6FAA6F;AAC7F,gBAAgB;AAIhB;kGACkG;AAClG,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAG,kBAAkB,CAAC;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,UAAU;IACV,SAAS;IACT,QAAQ;IACR,IAAI;IACJ,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,OAAO;IACP,SAAS;IACT,KAAK;IACL,UAAU;IACV,IAAI;IACJ,QAAQ;IACR,IAAI;IACJ,YAAY;IACZ,KAAK;IACL,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,QAAQ;IACR,KAAK;IACL,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,WAAW;IACX,QAAQ;IACR,OAAO;IACP,WAAW;IACX,MAAM;IACN,WAAW;IACX,KAAK;IACL,UAAU;CACX,CAAC,CAAC;AAEH,sGAAsG;AACtG,MAAM,CAAC,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IACtD,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,UAAU;IACV,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,KAAK;IACL,MAAM;IACN,QAAQ;IACR,IAAI;IACJ,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,QAAQ;IACR,UAAU;IACV,KAAK;IACL,IAAI;IACJ,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH;;;;qGAIqG;AACrG,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,OAAO,SAAS,CAAC,CAAC,CAAC;SAChB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,SAAS,CAAC,CAAC,CAAC;SAChB,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1C,CAAC;AAED;;yEAEyE;AACzE,MAAM,OAAO,aAAa;IAKL;IAJF,IAAI,CAAc;IAClB,QAAQ,CAAc;IACvC,YACE,WAA6B,EAAE,EACd,YAAmC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAA3C,cAAS,GAAT,SAAS,CAAkC;QAE5D,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,IAAY,EAAE,GAAG,GAAG,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACzE,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAAE,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,CAAC;QACzE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,QAAQ,GAAG,SAAS;IAC5D,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxD,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CAAC;IACtC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;IACvC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,QAAQ,GAAG,QAAQ;IACxD,IAAI,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;IACtC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,SAAS,EAAE,EAAE,CAAC;IAC1C,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;IAC9D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,QAAQ,GAAG,SAAS;IACtD,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC;IACrC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IACvC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAAE,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;IACvC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,cAAc,CAAC,CAAS;IACtC,OAAO,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,WAAW,CAAC,CAAqB;IAC/C,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAGnE,MAAM,UAAU,cAAc,CAAC,GAAuB,EAAE,IAAY;IAClE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,IAAK,UAAgC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAc,CAAC;IACzE,MAAM,IAAI,oBAAoB,CAC5B,eAAe,IAAI,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,yEAAyE,CAC/H,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAEjE,MAAM,UAAU,QAAQ,CAAC,GAAuB;IAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,IAAK,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAChE,MAAM,IAAI,oBAAoB,CAC5B,+BAA+B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wDAAwD,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACvI,CAAC;AACJ,CAAC;AAED;gEACgE;AAChE,MAAM,UAAU,SAAS,CAAC,KAAuB;IAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|