Compare commits

...
Author SHA1 Message Date
Jonathan Lipps d0ebbaa0c6 chore: publish
- appium@2.0.0-rc.1
 - @appium/base-driver@9.3.11
 - @appium/base-plugin@2.2.11
 - @appium/doctor@2.0.17
 - @appium/docutils@0.4.0
 - @appium/driver-test-support@0.4.7
 - @appium/execute-driver-plugin@3.0.14
 - @appium/fake-driver@5.2.4
 - @appium/fake-plugin@3.1.15
 - @appium/images-plugin@2.1.2
 - @appium/opencv@2.1.1
 - @appium/plugin-test-support@0.3.15
 - @appium/schema@0.3.0
 - @appium/strongbox@0.3.1
 - @appium/support@4.0.2
 - @appium/test-support@3.0.16
 - @appium/typedoc-plugin-appium@0.6.5
 - @appium/types@0.12.0
 - @appium/universal-xml-plugin@1.0.9
2023-06-14 10:34:52 -07:00
Jonathan Lipps 1629f858f8 chore(appium): bump appium version to rc 2023-06-14 10:32:01 -07:00
Jonathan Lipps 2d124323c5 test(appium): attempt to make windows CI pass 2023-06-13 14:32:28 -07:00
Jonathan Lipps 901ac711c4 fix: ensure logServerAddress gets an actual URL (#18754) 2023-06-12 16:40:42 -07:00
Mykola Mokhnach 7982747677 chore(appium): Make sharp to an optional dependency (#18733) 2023-06-06 08:43:26 +02:00
Christopher Hiller 26bb0f95b9 chore(support): punt some windows fs tests 2023-06-05 15:34:01 -07:00
Christopher Hiller c161ec2bad chore(fake-driver): bump timeout of tests 2023-06-05 15:34:01 -07:00
Christopher Hiller 1c4737c8b4 chore(appium): fix test for win 2023-06-05 15:34:01 -07:00
Christopher Hiller 6b2f5668e9 chore(doctor): fix tests for win 2023-06-05 15:34:01 -07:00
Christopher Hiller d904477b4c chore(ci): remove mac from build matrix
I have a feeling we are bumping up against memory limitations.
2023-06-05 15:34:01 -07:00
Christopher Hiller da1da3fe13 chore(doctor): attempt to fix tests for win 2023-06-05 15:34:01 -07:00
Christopher Hiller 307c81a24b chore(ci): fix invalid workflow 2023-06-05 15:34:01 -07:00
renovate[bot] f4c37985eb chore(deps): update dependency eslint to v8.42.0 2023-06-03 09:01:42 +00:00
renovate[bot] 78c6794253 fix(doctor): update dependency appium-adb to v9.11.5 2023-06-02 13:33:41 +00:00
Christopher Hiller c416a86120 chore(appium): fix arg parser test (temp fix) (#18718) 2023-06-01 11:17:13 -07:00
Mykola Mokhnach 38f86900da fix: Do not use additional checks on opencv objects (#18714) 2023-06-01 06:31:30 +02:00
Christopher Hiller 40fc097eda chore(ci): avoid build on macos 14.x due to unexplained failures 2023-05-31 14:17:09 -07:00
Christopher Hiller 0097c8e52e chore(support): fix fs.walkdir test for win compat 2023-05-31 14:17:09 -07:00
Christopher Hiller 1ccf857a4b fix(strongbox): do not force-lowercase slugged containers 2023-05-31 14:17:09 -07:00
Christopher Hiller c34f2eb897 chore: use glob mode w/ rimraf 2023-05-31 14:17:09 -07:00
Christopher Hiller 1d7c58ff26 chore: fix/skip tests on windows 2023-05-31 14:17:09 -07:00
Christopher Hiller d78ca63e60 chore(strongbox): tests do not assume posix paths 2023-05-31 14:17:09 -07:00
Jonathan Lipps 4f171ee92f ci: add windows and macos to ci matrix 2023-05-31 14:17:09 -07:00
Christopher Hiller fd2c72fd88 fix(types): fix broken appium config schema types, temporarily
This appears to be a bug in `json-schema-to-typescript`, where the `ipv6` type converts to `{[key: string]: unknown}` instead of `string`.

For now, we need to drop all formatting requirements from the `address` prop until this is fixed.

This did not break CI because the `build` script of `@appium/types` was run either _after_ building the rest of the project, or not at all, and the resulting change to `appium-config.ts` was not committed.
2023-05-31 14:02:28 -07:00
renovate[bot] 3bf406015e fix(universal-xml-plugin): update dependency @xmldom/xmldom to v0.8.8 2023-05-31 12:15:12 +00:00
renovate[bot] 56499eb997 fix(types): update dependency type-fest to v3.11.1 2023-05-31 09:01:09 +00:00
renovate[bot] bd10bffec4 chore(docutils): update dependency mkdocs-material to v9.1.15 2023-05-30 13:02:24 +00:00
renovate[bot] b1ee41cfc7 chore(deps): update commitlint monorepo to v17.6.5 2023-05-30 10:54:49 +00:00
renovate[bot] cc7f5f4a52 chore(deps): update eslint-related packages to v5.59.8 2023-05-30 09:05:58 +00:00
renovate[bot] a98d9c33c7 fix(appium): update dependency winston to v3.9.0 2023-05-27 16:32:08 +00:00
renovate[bot] 1a2260bb15 fix(docutils): update dependency yaml to v2.3.1 2023-05-27 12:35:19 +00:00
renovate[bot] 4c52fdf1d0 chore(deps): update dependency @types/node to v18.16.16 2023-05-27 09:34:42 +00:00
Christian Bromann a959eec9cf docs(appium): Add contributing documentation (#18691) 2023-05-26 22:57:01 -07:00
renovate[bot] e96724077e fix(schema): update definitelytyped 2023-05-26 10:39:52 +00:00
Mykola Mokhnach dfae94e7f3 ci: Remove v14 from the test matrix and add v20 (#18679) 2023-05-25 22:46:03 +02:00
Mykola Mokhnach 0497090a90 fix(images-plugin): Make sure the template is always a buffer (#18696) 2023-05-25 19:16:03 +02:00
renovate[bot] 19277f6e14 fix(types): update dependency type-fest to v3.11.0 2023-05-25 09:05:01 +00:00
renovate[bot] 39a59c8bb3 chore(deps): update dependency json-schema-to-typescript to v13 2023-05-24 14:27:42 -07:00
Christopher Hiller 2766dcca4c feat(docutils): init: scafffold package.json
This makes `appium-docs init` add a needed prop (`typedoc.entryPoint`) to `package.json` of an extension. It will write to `package.json` _by default_, even if it exists--which is different than the default behavior of other scaffolding tasks.

Note that `appium-docs init` will now _fail_ if `--entry-point <some-file>` (or `-e`) is not provided; there's no way for us to guess what it is (this is the _source_ entry point; not necessarily the `main` file). I guess that's technically breaking, but `appium-docs init` should not be part of anyone's workflow.
2023-05-24 14:26:07 -07:00
Christopher Hiller f5b112bcca docs(appium): fix weird sentence 2023-05-24 13:15:56 -07:00
Christopher HillerandJonathan Lipps 5d6458b611 Update packages/appium/docs/en/ecosystem/build-docs.md
Co-authored-by: Jonathan Lipps <jlipps@gmail.com>
2023-05-24 13:15:56 -07:00
Christopher Hiller d47c805468 docs(appium): update build-docs.md 2023-05-24 13:15:56 -07:00
renovate[bot] 4c61d533b8 fix(test-support): update dependency sinon to v15.1.0 2023-05-24 13:51:21 +00:00
renovate[bot] 325d237207 fix(docutils): update dependency yaml to v2.3.0 2023-05-24 10:47:01 +00:00
Mykola Mokhnach 8f63dabb5d feat(appium): Allow to provide ipv6 addresses and handle broadcast addresses in logs (#18674) 2023-05-24 08:26:10 +02:00
renovate[bot] 5a555090c5 fix(support): update dependency semver to v7.5.1 2023-05-23 14:20:57 +00:00
renovate[bot] 81ed72f19d chore(deps): update eslint-related packages to v5.59.7 2023-05-23 11:07:31 +00:00
renovate[bot] f34c75c650 fix(doctor): update dependency appium-adb to v9.11.4 2023-05-22 13:47:30 +00:00
renovate[bot] 39d68f17a2 chore(deps): update dependency @types/node to v18.16.14 2023-05-22 08:11:22 +00:00
renovate[bot] 528dcfe324 fix(support): update dependency @types/semver to v7.5.0 2023-05-21 13:12:03 +00:00
renovate[bot] 4d7f39b5f8 chore(deps): update dependency eslint to v8.41.0 2023-05-21 10:36:29 +00:00
renovate[bot] 8594d13bf6 fix(execute-driver-plugin): update dependency vm2 to v3.9.19 2023-05-21 08:10:32 +00:00
renovate[bot] a0b434dff7 fix(doctor): update dependency appium-adb to v9.11.3 2023-05-20 13:03:53 +00:00
renovate[bot] 19a5ae4537 chore(docutils): update dependency mkdocs-material to v9.1.14 2023-05-20 11:23:01 +00:00
renovate[bot] fc831d2475 chore(deps): update eslint-related packages to v5.59.6 2023-05-20 11:19:08 +00:00
renovate[bot] cb1a97fc8e chore(deps): update dependency midnight-smoker to v2.0.4 2023-05-20 08:02:34 +00:00
Christopher Hiller a506a0a357 chore: publish
- appium@2.0.0-beta.71
 - @appium/base-driver@9.3.10
 - @appium/base-plugin@2.2.10
 - @appium/fake-plugin@3.1.14
2023-05-19 16:47:14 -07:00
Christopher Hiller 63a429c53b fix(base-driver): add missing @types/lodash
- the lack of this module was causing base-driver to fail to compile when installed as a production module.  generally, nobody is going to do such a thing--consumers will use the generated `.d.ts` files--UNLESS they happen to be running typedoc against their extension.

will need to figure out a way to test this to make sure it doesnt happen again.
2023-05-19 16:45:54 -07:00
Christopher Hiller 922725b4f1 chore: publish
- appium@2.0.0-beta.70
 - @appium/docutils@0.3.13
2023-05-19 15:24:13 -07:00
Christopher Hiller f0ebe2e02f fix(docutils): fix broken executable 2023-05-19 15:22:46 -07:00
79 changed files with 1525 additions and 2616 deletions
+16 -4
View File
@@ -44,11 +44,15 @@ permissions:
jobs:
test:
name: Tests
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x, 16.x, 18.x]
node-version: [16.x, 18.x, 20.x]
os:
- ubuntu-latest
- windows-latest
# TODO: Enable below envs after all tests have been verified green
# - macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3
- name: Use Node.js ${{ matrix.node-version }}
@@ -56,7 +60,15 @@ jobs:
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install latest npm
- name: Install latest npm (win)
if: ${{ matrix.os == 'windows-latest' }}
# for some reason there's a bug in upgrading npm on win, have to install a specific version first
# https://github.com/actions/setup-node/issues/623
run: |
npm install -g npm@8.3.1
npm install -g npm@latest
- name: Install latest npm (non-win)
if: ${{ matrix.os != 'windows-latest' }}
run: npm install -g npm
- name: Install dependencies
uses: bahmutov/npm-install@1a235c31658a322a3b024444759650ee6345c26d # tag=v1
+1 -2
View File
@@ -14,8 +14,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
# node-version: [14.x, 16.x, 18.x]
node-version: [16.x, 18.x]
node-version: [16.x, 18.x, 20.x]
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- name: Use Node.js ${{ matrix.node-version }}
+5
View File
@@ -0,0 +1,5 @@
{
"recommendations": [
"stateful.runme"
]
}
+514 -2380
View File
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -34,7 +34,7 @@
"clean": "run-s clean:distfiles clean:workspaces",
"clean:dangerously": "run-s clean:workspaces clean:force",
"clean:deps": "lerna clean --yes",
"clean:distfiles": "npx rimraf \"./packages/*/build\" \"./packages/*/**/.tsconfig.tsbuildinfo\"; npx nx reset",
"clean:distfiles": "npx rimraf --glob \"./packages/*/build\" \"./packages/*/**/.tsconfig.tsbuildinfo\"; npx nx reset",
"clean:interactive": "git clean -d -x -i",
"clean:force": "git clean -d -x -f",
"clean:workspaces": "lerna run clean || true",
@@ -85,29 +85,29 @@
},
"devDependencies": {
"@colors/colors": "1.5.0",
"@commitlint/cli": "17.6.3",
"@commitlint/config-conventional": "17.6.3",
"@commitlint/cli": "17.6.5",
"@commitlint/config-conventional": "17.6.5",
"@tsconfig/node14": "1.0.3",
"@types/chai": "4.3.5",
"@types/chai-as-promised": "7.1.5",
"@types/diff": "5.0.3",
"@types/mocha": "10.0.1",
"@types/node": "18.16.13",
"@types/semver": "7.3.13",
"@types/node": "18.16.16",
"@types/semver": "7.5.0",
"@types/sinon": "10.0.15",
"@types/sinon-chai": "3.2.9",
"@types/teen_process": "2.0.0",
"@types/ws": "8.5.4",
"@types/yargs": "17.0.24",
"@typescript-eslint/eslint-plugin": "5.59.2",
"@typescript-eslint/parser": "5.59.2",
"@typescript-eslint/eslint-plugin": "5.59.8",
"@typescript-eslint/parser": "5.59.8",
"asyncbox": "2.9.4",
"chai": "4.3.7",
"chai-as-promised": "7.1.1",
"chai-webdriverio-async": "2.7.0",
"conventional-changelog-conventionalcommits": "5.0.0",
"cpy-cli": "4.2.0",
"eslint": "8.40.0",
"eslint": "8.42.0",
"eslint-config-prettier": "8.8.0",
"eslint-find-rules": "4.1.0",
"eslint-import-resolver-typescript": "3.5.5",
@@ -119,11 +119,11 @@
"get-port": "5.1.1",
"handlebars": "4.7.7",
"husky": "8.0.3",
"json-schema-to-typescript": "12.0.0",
"json-schema-to-typescript": "13.0.1",
"lerna": "6.6.2",
"lint-staged": "13.2.2",
"log-symbols": "4.1.0",
"midnight-smoker": "2.0.3",
"midnight-smoker": "2.0.4",
"mjpeg-consumer": "2.0.0",
"mjpeg-server": "0.3.1",
"mocha": "10.2.0",
@@ -133,7 +133,7 @@
"rewiremock": "3.14.5",
"rimraf": "5.0.1",
"serve-static": "1.15.0",
"sinon": "15.0.4",
"sinon": "15.1.0",
"sinon-chai": "3.7.0",
"sync-monorepo-packages": "1.0.2",
"through2": "4.0.2",
+38
View File
@@ -3,6 +3,44 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.0.0-rc.1](https://github.com/appium/appium/compare/appium@2.0.0-beta.71...appium@2.0.0-rc.1) (2023-06-14)
### Features
* **appium:** Allow to provide ipv6 addresses and handle broadcast addresses in logs ([#18674](https://github.com/appium/appium/issues/18674)) ([8f63dab](https://github.com/appium/appium/commit/8f63dabb5dca882e522026f243e3445f5418874b))
### Bug Fixes
* **appium:** update dependency winston to v3.9.0 ([a98d9c3](https://github.com/appium/appium/commit/a98d9c33c761af6870411721cc0d6c4491b43940))
* **docutils:** update dependency yaml to v2.3.0 ([325d237](https://github.com/appium/appium/commit/325d2372078ee01e8fb58613ffd13417f2527151))
* **docutils:** update dependency yaml to v2.3.1 ([1a2260b](https://github.com/appium/appium/commit/1a2260bb15d75e4f4c23551dc61529108a7b0d88))
* ensure logServerAddress gets an actual URL ([#18754](https://github.com/appium/appium/issues/18754)) ([901ac71](https://github.com/appium/appium/commit/901ac711c4e2207f30d93ad177a332b7d6f23c38))
* **support:** update dependency @types/semver to v7.5.0 ([528dcfe](https://github.com/appium/appium/commit/528dcfe324e75e48471cdb694448c2a09ec2d828))
* **support:** update dependency semver to v7.5.1 ([5a55509](https://github.com/appium/appium/commit/5a555090c5322318f845415d743ee5c645fb94a0))
* **types:** fix broken appium config schema types, temporarily ([fd2c72f](https://github.com/appium/appium/commit/fd2c72fd886ecaaf0f6588a328ff8a268a54fb55))
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [2.0.0-beta.71](https://github.com/appium/appium/compare/appium@2.0.0-beta.70...appium@2.0.0-beta.71) (2023-05-19)
**Note:** Version bump only for package appium
## [2.0.0-beta.70](https://github.com/appium/appium/compare/appium@2.0.0-beta.69...appium@2.0.0-beta.70) (2023-05-19)
**Note:** Version bump only for package appium
## [2.0.0-beta.69](https://github.com/appium/appium/compare/appium@2.0.0-beta.68...appium@2.0.0-beta.69) (2023-05-19)
**Note:** Version bump only for package appium
+100 -2
View File
@@ -1,5 +1,6 @@
---
title: Contributing to Appium
cwd: ../../../../../
---
This section of Appium's documentation is for those who are interested in contributing to Appium's
@@ -16,8 +17,105 @@ already.
## Ways to Contribute
TODO
The project offers a variety of ways to contribute, e.g.:
- contributing code
- improving documentation
- creating educational content (blog posts, tutorials, videos, etc.)
- spreading the good word about the project (e.g. via Twitter)
- filing bugs if you discover them while using Appium
- making feature requests if you are missing something in the project or help triaging bugs
- supporting users in the [Appium forum](https://discuss.appium.io/)
## The Appium Development Process
TODO
To contribute to the Appium code base make sure to check out the Git repository.
!!! info
If you are VS Code user you can easily check out the project using [Runme](https://runme.dev/api/runme?repository=https%3A%2F%2Fgithub.com%2Fappium%2Fappium.git&fileToOpen=packages%2Fappium%2Fdocs%2Fen%2Fcontributing%2Findex.md).
It is advised to [fork](https://github.com/appium/appium/fork) before cloning it to your system.
```sh { name=clone }
export GITHUB_USERNAME=<your-username>
git clone git@github.com:$GITHUB_USERNAME/appium.git
```
After cloning you can go ahead and install the project dependencies:
```sh { name=install }
npm install
```
From here on there are several things you can do.
### Watch Files
When developing Appium code we have to watch all JavaScript and TypeScript files to re-compile them after every change. You can run this watch process via:
```sh { name=watch, background=true }
npm run dev
```
### Start Appium in Dev-Mode
To test your changes you can run Appium in dev mode via:
```sh { name=start }
npm start
```
### Run Tests
The project maintains a set of different test variations you can run to verify the quality of the code.
#### Linting
Appium uses EsLint for static code analysis and linting. You can run these checks via:
```sh { name=test-linting }
npm run lint
```
#### Unit
Run via:
```sh { name=test-unit }
npm run test:unit
```
You can also run tests for specific workspaces, e.g.:
```sh { name=test-workspace }
export APPIUM_WORKSPACE=@appium/doctor
npm run test:unit -w $APPIUM_WORKSPACE
```
#### Smoke and e2e Tests
Run via:
```sh { name=test-slow }
npm run test:slow
```
### Deploy Docs Locally
Our documentation system uses [MKDocs](https://www.mkdocs.org/) and therefor requires [Python](https://www.python.org/) to be installed on your system. You can run the docs by:
```sh
# installing needed Python dependencies
pip install -r packages/docutils/requirements.txt
# build the project
npm run build
# run dev server
npm run dev:docs
```
You should be able to view the page at `http://127.0.0.1:8000/docs/en`:
```sh
open http://127.0.0.1:8000/docs/en
```
+184 -36
View File
@@ -2,11 +2,11 @@
title: Building Docs for Appium Extensions
---
Once you've [built a driver](./build-drivers.md) or [built a plugin](./build-plugins.md) for
Appium, you will hopefully want to document how that extension works for your users. The most basic
way of doing this is to write up a quick README and keep it in the root of your project's
repository. However, this can involve a lot of duplication of effort, especially when documenting
things like Appium commands.
Once you've [built a driver](./build-drivers.md) or [built a plugin](./build-plugins.md) for Appium,
you will hopefully want to document how that extension works for your users. The most basic way of
doing this is to write up a quick `README.md` and keep it in the root of your project's repository.
However, this can involve a lot of duplication of effort, especially when documenting things like
Appium commands.
Let's say your driver implements ~25 of the standard WebDriver protocol commands. You could write
up a description of these commands, how they map to the protocol, what parameters they take, and
@@ -16,16 +16,16 @@ this information in two places creates an opportunity for the docs to get out of
reality of the code. Wouldn't it be nice to generate command reference documentation straight from
the code?
Another problem with the basic single file README approach is that many extensions might want
a whole set of documents including longer prose guides (like this one). It might be nice to have
code examples where you can toggle between different programming languages. It might be nice to be
able to add a project-specific logo. And so on.
Another problem with the basic single file `README.md` approach is that many extensions might want a
whole set of documents including longer prose guides (like this one). It might be nice to have code
examples where you can toggle between different programming languages. It might be nice to be able
to add a project-specific logo. And so on.
Luckily, the Appium project has built tools to do all these things, and we've packaged up these
tools so our ecosystem developers building drivers and plugins can _also_ use them. The best way to
get going with these tools is probably to look at an existing Appium driver repo to see how it's
done, for example the [XCUITest driver repo](https://github.com/appium/appium-xcuitest-driver). But
this guide will outline the basic approach.
The Appium project has built tools to do all these things, and we've packaged up these tools so our
ecosystem developers building drivers and plugins can _also_ use them. The best way to get going
with these tools is probably to look at an existing Appium driver repo to see how it's done, for
example the [XCUITest driver repo](https://github.com/appium/appium-xcuitest-driver). But this guide
will outline the basic approach.
### Conceptual architecture
@@ -42,32 +42,180 @@ The other main piece is automatic documentation generation from your code files.
a plugin for [TypeDoc](https://typedoc.org/). This plugin is incorporated into our doc utility.
When you give it an entrypoint for you driver or plugin, it will scan and parse all your code files
looking for Appium command implementations. A set of Markdown reference files will be generated for these
commands, which can then be included in your docs site.
commands, which will then be included in your docs site.
> Note: Implementing an extension in TypeScript is _not_ a requirement for generating documentation,
> but for automated doc generation to work, you will need to apply TypeScript-supported JSDoc-style
> docstrings to your JS codebase. See ["JS Projects Utilizing TypeScript"](https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html) for more information.
In order to make different versions of your docs available (one for each minor release of your
extension, typically), we also bundle [Mike](https://github.com/jimporter/mike).
### Setup
### Prerequisites
To take advantage of Appium's documentation utilities, you'll need to make sure of the following:
To take advantage of Appium's documentation utilities, you'll need to install:
- Python 3 is available
- The appropriate Python dependencies are available (the versions used by Appium itself are listed
- in the doc utility's
[requirements.txt](https://github.com/appium/appium/blob/master/packages/docutils/requirements.txt)).
It's recommended you use the same versions.
- Include the `@appium/docutils` NPM package as a dev dependency of your project
- Annotate your commands using TypeDoc (this works for JS projects and not just TypeScript
projects).
- Put your markdown docs files in a directory
- Create a [`mkdocs.yml`](https://www.mkdocs.org/user-guide/configuration/) file that extends
Appium's base MkDocs configuration. (If your `mkdocs.yml` file is in the root of your repo, then
the line at the top of it should look like:
```yml
INHERIT: ./node_modules/@appium/docutils/base-mkdocs.yml
```
Basically, make sure you're inheriting the path to `@appium/docutils`'s `base-mkdocs.yml`.
- [Python v3+](https://www.python.org/downloads/)
- [pip](https://pip.pypa.io/en/stable/installation/) (this may be installed automatically with Python)
- The `@appium/docutils` package:
```bash
npm install --save-dev @appium/docutils
```
### Initializing an Extension for Building Docs
To prepare your extension for generating documentation, run the following command:
```bash
npx appium-docs init --entry-point <my-entry-point.js>
```
...where `<my-entry-point.js>` is the **source entry point** to your extension. If you _are not_ transpiling your code via TypeScript, Babel, etc., this is typically the same as the value of the `main` property in `package.json`. If you _are_ transpiling, this is typically different. For example, your `main` property may be `dist/index.js`, but your **source entry point** is `src/index.ts`.
This will:
1. Create a `tsconfig.json` if one does not already exist. This is necessary even if your extension is not written in TypeScript.
2. Create a `typedoc.json` with the necessary configuration for TypeDoc.
3. Create a `mkdocs.yml` with the necessary configuration for MkDocs.
4. Modify your `package.json` to add a `typedoc.entryPoint` property with a value of your entry point (as specified above).
### Documenting Your Extension
At this point, you can begin documenting your extension. You don't need to do this all at once, but you should make the following changes, at minimum.
#### `newMethodMap` and `executeMethodMap`
The static properties `newMethodMap` and `executeMethodMap` may be present on your extension's main class. If they are not, then you can skip to the next section. If they are, you will need to make the following changes, depending on your extension's language.
##### JavaScript
```js
// note: this is equivalent to the TypeScript example below
class MyExtension {
static newMethodMap = /** @type {const} */({
// ...
});
static executeMethodMap = /** @type {const} */({
// ...
});
}
```
##### TypeScript
```ts
class MyExtension {
static newMethodMap = {
// ...
} as const;
static executeMethodMap = {
// ...
} as const;
}
```
#### Driver Constraints
> Note: Plugin authors can skip this section.
Your driver may have a property `desiredCapConstraints`. It should also follow the same pattern as `newMethodMap` and `executeMethodMap` above. For example:
```js
class MyExtension {
desiredCapConstraints = /** @type {const} */({
myCapability: {
presence: true,
isString: true
},
myOtherCap: {
isBoolean: true
}
});
}
```
(For extensions written in TypeScript, use `as const` as before.)
#### Commands
The documentation for a command, as defined in your extension, comes from multiple places. These sources are then combined as needed into the final output.
In Appium, new commands are defined in `newMethodMap` and execute methods are defined in `executeMethodMap`. **The value of these properties are used to build your documentation.** In particular, parameter names and optional/required status _override_ whatever method implementation does. So for example, if your `newMethodMap` contains:
```js
class MyExtension {
static newMethodMap = /** @type {const} */({
'/session/:sessionId/myThing': {
/**
* Does my thing
*/
GET: {command: 'doMyThing', payloadParams: {required: ['a', 'b']}},
}
})
}
```
...and your `doMyThing` method implementation looks like this:
```js
class MyExtension {
/**
* Doesn't do my thing
* @param {any} a - Whatever
* @param {number} d - Some number
* @param {boolean} c - Some boolean
* @returns {Promise<boolean>} Some other boolean
*/
async doMyThing(a, d = 1, c = false) {
// ...
return true;
}
}
```
The documentation will show that the `doMyThing` method accepts required parameters `a` and `b`. Even though `b` is named `d` in the implementation--and it's optional--it will be ignored. Likewise, since the definition in `newMethodMap` knows nothing about `c`, it too is ignored.
In addition, the _description_ from the docstring in `newMethodMap` overrides the description in the method implementation; it will describe the command `doMyThing` as "Does my thing".
The `@param` tags and `@returns` tag from the method's docstring provide information about the expected and returned types, as well as a description of each. This is not expressible via `newMethodMap` and `executeMethodMap` alone; it provides more information for your extension's users.
> Note for TypeScript users: while the _types_ will already be present, providing `@param` and `@returns` tags is still useful for providing descriptions.
All commands must be `async`, so they will return `Promise<T>` where type `T` is the type of whatever the `Promise` fulfills with. In the generated documentation, the `Promise` is ignored, and only `T` is reported. So for `doMyThing`, the return type of the command, as output in the documentation, will be `boolean`.
This is because while extensions must be written in JavaScript, we're documenting an API which can be called from any language; that language likely won't have a concept of a `Promise`. Likewise, `undefined` or `void` types will be output as `null` (since that is a concept that translates well to multiple languages).
#### Optional: `README.md`
If you have a `README.md`, it will be pulled in to the generated docs site automatically. This behavior can be disabled by adding the following to `typedoc.json`:
```json
{
"readme": "none"
}
```
#### Next Steps
Appium provides type definitions for extension authors; these are available via Appium itself and the [`@appium/types`](https://npm.im/@appium/types) package.
Of note, drivers should both extend `BaseDriver` _and_ implement the `ExternalDriver` interface exported by `@appium/types`. This will help ensure that your driver's implementation is correct and usable by different clients.
You're encouraged to look at the official test/example extensions, [`@appium/fake-driver`](https://npm.im/@appium/fake-driver) and [`@appium/fake-plugin`](https://npm.im/@appium/fake-plugin) for canonical examples of how to use these types.
#### Resources
How to type more complex return values or parameters is beyond the scope of this document. For more information, see:
- For extensions written in JS, the [TypeScript documentation](https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html)
- For tags in addition to what TS natively recognizes, see the [TypeDoc documentation](https://typedoc.org/guides/doccomments/)
Likewise, refer to the [MkDocs documentation](https://www.mkdocs.org/user-guide/writing-your-docs/) for further information on how to customize your MkDocs output.
### Usage
@@ -77,16 +225,16 @@ examples:
```bash
# Generate reference and build the mkdocs site into the site dir
appium-docs build
npx appium-docs build
# Same as build, but host the docs on a local dev server
# and watch for changes and rebuild when files change
appium-docs build --serve
npx appium-docs build --serve
# Build the docs and deploy them with mike versioning to the docs-site branch
# using the included commit message and rebase strategy on the branch.
# This is particularly useful for pushing content to a GitHub pages branch!
appium-docs build \
npx appium-docs build \
--deploy \
-b docs-site \
-m 'docs: auto-build docs for appium-xcuitest-driver@%s' \
+30 -7
View File
@@ -32,6 +32,9 @@ import {
isExtensionCommandArgs,
isPluginCommandArgs,
isServerCommandArgs,
fetchIpAddresses,
V4_BROADCAST_IP,
V6_BROADCAST_IP,
} from './utils';
import os from 'node:os';
@@ -164,8 +167,8 @@ async function prepareAppiumHome(name, appiumHome) {
}
throw new Error(
`The path '${appiumHome}' provided in the ${name} must point ` +
`to a valid folder writeable for the current user account '${os.userInfo().username}'. ` +
`Original error: ${err.message}`
`to a valid folder writeable for the current user account '${os.userInfo().username}'. ` +
`Original error: ${err.message}`
);
}
if (!stat.isDirectory()) {
@@ -178,8 +181,8 @@ async function prepareAppiumHome(name, appiumHome) {
} catch (e) {
throw new Error(
`The folder path '${appiumHome}' provided in the ${name} must be ` +
`writeable for the current user account '${os.userInfo().username}. ` +
`Original error: ${e.message}`
`writeable for the current user account '${os.userInfo().username}. ` +
`Original error: ${e.message}`
);
}
return appiumHome;
@@ -317,6 +320,28 @@ async function init(args) {
}
}
/**
* Prints the actual server address and the list of URLs that
* could be used to connect to the current server.
* Properly replaces broadcast addresses in client URLs.
*
* @param {string} url The URL the server is listening on
*/
function logServerAddress(url) {
logger.info(`Appium REST http interface listener started on ${url}`);
const urlObj = new URL(url);
if (![V4_BROADCAST_IP, V6_BROADCAST_IP].includes(urlObj.hostname)) {
return;
}
const ips = fetchIpAddresses(urlObj.hostname === V4_BROADCAST_IP ? 4 : 6);
logger.info(
`You can provide the following ${util.pluralize('URL', ips.length, false)} ` +
`in your client code to connect to this server:\n` +
ips.map((x) => `\t${urlObj.href.replace(urlObj.hostname, x)}`).join('\n')
);
}
/**
* Initializes Appium's config. Starts server if appropriate and resolves the
* server instance if so; otherwise resolves w/ `undefined`.
@@ -417,9 +442,7 @@ async function main(args) {
});
}
logger.info(
`Appium REST http interface listener started on ${parsedArgs.address}:${parsedArgs.port}${parsedArgs.basePath}`
);
logServerAddress(`http://${parsedArgs.address}:${parsedArgs.port}${parsedArgs.basePath}`);
driverConfig.print();
pluginConfig.print([...pluginClasses.values()]);
+26
View File
@@ -5,9 +5,13 @@ import {inspect as dump} from 'util';
import {node} from '@appium/support';
import path from 'path';
import {SERVER_SUBCOMMAND, DRIVER_TYPE, PLUGIN_TYPE} from './constants';
import os from 'node:os';
const W3C_APPIUM_PREFIX = 'appium';
const STANDARD_CAPS_LOWERCASE = new Set([...STANDARD_CAPS].map((cap) => cap.toLowerCase()));
export const V4_BROADCAST_IP = '0.0.0.0';
export const V6_BROADCAST_IP = '::';
/**
*
@@ -331,6 +335,28 @@ export function isPluginCommandArgs(args) {
return args.subcommand === PLUGIN_TYPE;
}
/**
* Fetches the list of IP addresses of the current host.
*
* @param {4|6|null} family Either 4 to include ipv4 addresses only,
* 6 to include ipv6 addresses only, or null to include all of them
* @returns {string[]} The list of matched IP addresses
*/
export function fetchIpAddresses (family = null) {
let familyValue = null;
// 'IPv4' is in Node <= 17, from 18 it's a number 4 or 6
if (family === 4) {
familyValue = [4, 'IPv4'];
} else if (family === 6) {
familyValue = [6, 'IPv6'];
}
return _.flatMap(_.values(os.networkInterfaces()).filter(Boolean))
// @ts-ignore The linter does not understand the above filter
.filter(({family}) => !familyValue || familyValue && familyValue.includes(family))
// @ts-ignore The linter does not understand the above filter
.map(({address}) => address);
}
export {
inspect,
parseCapsForInnerDriver,
+12 -12
View File
@@ -1,6 +1,6 @@
{
"name": "appium",
"version": "2.0.0-beta.69",
"version": "2.0.0-rc.1",
"description": "Automation for Apps.",
"keywords": [
"automation",
@@ -60,17 +60,17 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^9.3.9",
"@appium/base-plugin": "^2.2.9",
"@appium/docutils": "^0.3.12",
"@appium/schema": "^0.2.6",
"@appium/support": "^4.0.1",
"@appium/types": "^0.11.1",
"@appium/base-driver": "^9.3.11",
"@appium/base-plugin": "^2.2.11",
"@appium/docutils": "^0.4.0",
"@appium/schema": "^0.3.0",
"@appium/support": "^4.0.2",
"@appium/types": "^0.12.0",
"@sidvind/better-ajv-errors": "2.1.0",
"@types/argparse": "2.0.10",
"@types/bluebird": "3.5.38",
"@types/fancy-log": "2.0.0",
"@types/semver": "7.3.13",
"@types/semver": "7.5.0",
"@types/teen_process": "2.0.0",
"@types/wrap-ansi": "3.0.0",
"ajv": "8.12.0",
@@ -89,13 +89,13 @@
"ora": "5.4.1",
"package-changed": "3.0.0",
"resolve-from": "5.0.0",
"semver": "7.5.0",
"semver": "7.5.1",
"source-map-support": "0.5.21",
"teen_process": "2.0.2",
"type-fest": "3.10.0",
"winston": "3.8.2",
"type-fest": "3.11.1",
"winston": "3.9.0",
"wrap-ansi": "7.0.0",
"yaml": "2.2.2"
"yaml": "2.3.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
@@ -1,7 +1,7 @@
// @ts-check
import {exec} from 'teen_process';
import {fs, tempDir, util} from '@appium/support';
import {fs, system, tempDir, util} from '@appium/support';
import path from 'path';
import resolveFrom from 'resolve-from';
import {
@@ -24,6 +24,8 @@ const TEST_DRIVER_INVALID_PEERS_DIR = path.dirname(
);
describe('Driver CLI', function () {
this.timeout(90000); // some of these tests involve network and can be very slow
/**
* @type {string}
*/
@@ -96,6 +98,10 @@ describe('Driver CLI', function () {
});
it('should show updates for installed drivers with --updates', async function () {
if (system.isWindows()) {
// TODO figure out why this isn't working on windows
return this.skip();
}
const versions = /** @type {string[]} */ (
JSON.parse(
(
@@ -6,6 +6,7 @@ import {finalizeSchema, registerSchema, resetSchema} from '../../lib/schema/sche
import extSchema from '../fixtures/driver-schema';
import {resolveFixture} from '../helpers';
import _ from 'lodash';
import {system} from '@appium/support';
const resolveConfigFixture = _.partial(resolveFixture, 'config');
@@ -314,6 +315,10 @@ describe('config file behavior', function () {
describe('when the config file is invalid JSON', function () {
it('should reject with a user-friendly error message', async function () {
if (system.isWindows()) {
// TODO figure out why this isn't working on windows
return this.skip();
}
await readConfigFile(INVALID_JSON_FILEPATH).should.be.rejectedWith(
new RegExp(`${INVALID_JSON_FILEPATH} is invalid`)
);
+1 -3
View File
@@ -11,11 +11,9 @@ export default [
ref: 'appium.json#/properties/server/properties/address',
},
schema: {
$comment: 'I think hostname covers both DNS and IPv4...could be wrong',
appiumCliAliases: ['a'],
default: '0.0.0.0',
description: 'IP address to listen on',
format: 'hostname',
description: 'IPv4/IPv6 address or a hostname to listen on',
title: 'address config',
type: 'string',
},
@@ -303,7 +303,7 @@ describe('ExtensionConfig', function () {
it('should throw', function () {
expect(() => config.require('fake')).to.throw(
ReferenceError,
/^could not find a driver installed at \/some\/path\/node_modules\/flotsam/i
/^could not find a driver installed at .+flotsam/i
);
});
});
+15 -1
View File
@@ -59,7 +59,9 @@ describe('parser', function () {
}).should.throw(/unrecognized arguments: --apple/i);
});
it('should throw an error for an invalid value ("hostname")', function () {
// FIXME: this test will not work until we restore the formatting restriction to the address validation
// see #18716
it.skip('should throw an error for an invalid value ("hostname")', function () {
(() => {
p.parseArgs(['--address', '-42']);
}).should.throw(/must match format "hostname"/i);
@@ -119,6 +121,18 @@ describe('parser', function () {
p.parseArgs(['--allow-insecure', 'foo ,bar']).allowInsecure.should.eql(['foo', 'bar']);
});
it('should parse --address correctly', function () {
p.parseArgs(['--address', 'localhost']).address.should.eql('localhost');
p.parseArgs(['--address', 'appium.net']).address.should.eql('appium.net');
p.parseArgs(['--address', '127.0.0.1']).address.should.eql('127.0.0.1');
p.parseArgs(['--address', '10.0.0.1']).address.should.eql('10.0.0.1');
p.parseArgs(['--address', '::']).address.should.eql('::');
p.parseArgs(['--address', '::1']).address.should.eql('::1');
p.parseArgs(['--address', '2a02:8888:9a80:158:2418:a474:43c6:1b78']).address.should.eql(
'2a02:8888:9a80:158:2418:a474:43c6:1b78'
);
});
it('should parse --deny-insecure correctly', function () {
p.parseArgs([]).should.not.have.property('denyInsecure');
p.parseArgs(['--deny-insecure', '']).denyInsecure.should.eql([]);
+16
View File
@@ -5,6 +5,7 @@ import {
removeAppiumPrefixes,
inspect,
adjustNodePath,
fetchIpAddresses,
} from '../../lib/utils';
import {BASE_CAPS, W3C_CAPS} from '../helpers';
import _ from 'lodash';
@@ -275,4 +276,19 @@ describe('utils', function () {
(await fs.exists(process.env.NODE_PATH)).should.be.true;
});
});
describe('fetchIpAddresses()', function () {
it('should fetch addresses for ipv4 only', async function () {
fetchIpAddresses(4).length.should.be.greaterThan(0);
});
it('should fetch addresses for ipv6 only', async function () {
fetchIpAddresses(6).length.should.be.greaterThan(0);
});
it('should fetch addresses for ipv4 and ipv6', async function () {
fetchIpAddresses().length.should.be.greaterThan(0);
});
});
});
+20
View File
@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [9.3.11](https://github.com/appium/appium/compare/@appium/base-driver@9.3.10...@appium/base-driver@9.3.11) (2023-06-14)
### Bug Fixes
* **schema:** update definitelytyped ([e967240](https://github.com/appium/appium/commit/e96724077ef2b5b8aae203856195f3bb8de56116))
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [9.3.10](https://github.com/appium/appium/compare/@appium/base-driver@9.3.9...@appium/base-driver@9.3.10) (2023-05-19)
### Bug Fixes
* **base-driver:** add missing @types/lodash ([63a429c](https://github.com/appium/appium/commit/63a429c53bf3da353e018ed86ec24e32bf238d18))
## [9.3.9](https://github.com/appium/appium/compare/@appium/base-driver@9.3.8...@appium/base-driver@9.3.9) (2023-05-19)
**Note:** Version bump only for package @appium/base-driver
+5 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-driver",
"version": "9.3.9",
"version": "9.3.11",
"description": "Base driver class for Appium drivers",
"keywords": [
"automation",
@@ -44,12 +44,13 @@
"test:types": "tsd"
},
"dependencies": {
"@appium/support": "^4.0.1",
"@appium/types": "^0.11.1",
"@appium/support": "^4.0.2",
"@appium/types": "^0.12.0",
"@colors/colors": "1.5.0",
"@types/async-lock": "1.4.0",
"@types/bluebird": "3.5.38",
"@types/express": "4.17.17",
"@types/lodash": "4.14.195",
"@types/method-override": "0.0.32",
"@types/serve-favicon": "2.5.4",
"async-lock": "1.4.0",
@@ -66,7 +67,7 @@
"morgan": "1.10.0",
"serve-favicon": "2.5.0",
"source-map-support": "0.5.21",
"type-fest": "3.10.0",
"type-fest": "3.11.1",
"validate.js": "0.13.1"
},
"engines": {
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.2.11](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.10...@appium/base-plugin@2.2.11) (2023-06-14)
**Note:** Version bump only for package @appium/base-plugin
## [2.2.10](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.9...@appium/base-plugin@2.2.10) (2023-05-19)
**Note:** Version bump only for package @appium/base-plugin
## [2.2.9](https://github.com/appium/appium/compare/@appium/base-plugin@2.2.8...@appium/base-plugin@2.2.9) (2023-05-19)
**Note:** Version bump only for package @appium/base-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/base-plugin",
"version": "2.2.9",
"version": "2.2.11",
"description": "The base plugin used to create Appium 2.0 plugins",
"keywords": [
"automation",
@@ -40,8 +40,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-driver": "^9.3.9",
"@appium/support": "^4.0.1"
"@appium/base-driver": "^9.3.11",
"@appium/support": "^4.0.2"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
+11
View File
@@ -3,6 +3,17 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.0.17](https://github.com/appium/appium/compare/@appium/doctor@2.0.16...@appium/doctor@2.0.17) (2023-06-14)
### Bug Fixes
* **doctor:** update dependency appium-adb to v9.11.3 ([a0b434d](https://github.com/appium/appium/commit/a0b434dff7a4e425f66915e12266a6e943d10372))
* **doctor:** update dependency appium-adb to v9.11.4 ([f34c75c](https://github.com/appium/appium/commit/f34c75c65068a299ab4d3427233e771e796fc43a))
* **doctor:** update dependency appium-adb to v9.11.5 ([78c6794](https://github.com/appium/appium/commit/78c67942534705133093aa9fa54d84efb9fe2f69))
## [2.0.16](https://github.com/appium/appium/compare/@appium/doctor@2.0.15...@appium/doctor@2.0.16) (2023-05-19)
**Note:** Version bump only for package @appium/doctor
+1 -1
View File
@@ -75,7 +75,7 @@ class OptionalFfmpegCommandCheck extends DoctorCheck {
return ffmpegPath
? okOptional(
`ffmpeg is installed at: ${ffmpegPath}. ${
(await exec('ffmpeg', ['-version'])).stdout.split(EOL)[0]
(await exec('ffmpeg', ['-version'])).stdout.split('\n')[0]
}`
)
: nokOptional('ffmpeg cannot be found');
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/doctor",
"version": "2.0.16",
"version": "2.0.17",
"description": "Test environment for fitness to run Appium",
"keywords": [
"automation",
@@ -44,11 +44,11 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/support": "^4.0.1",
"@appium/support": "^4.0.2",
"@colors/colors": "1.5.0",
"@types/bluebird": "3.5.38",
"@types/teen_process": "2.0.0",
"appium-adb": "9.11.2",
"appium-adb": "9.11.5",
"bluebird": "3.7.2",
"inquirer": "8.2.5",
"lodash": "4.17.21",
+21 -19
View File
@@ -1,10 +1,11 @@
import path from 'node:path';
import {
EnvVarAndPathCheck,
AndroidToolCheck,
OptionalAppBundleCheck,
OptionalGstreamerCheck,
} from '../../lib/android';
import {fs} from '@appium/support';
import {fs, system} from '@appium/support';
import * as adb from 'appium-adb';
import * as utils from '../../lib/utils';
import * as tp from 'teen_process';
@@ -13,6 +14,9 @@ import B from 'bluebird';
import {removeColors} from './helper';
describe('android', function () {
const apkAnalyzerFilename = system.isWindows() ? 'apkanalyzer.bat' : 'apkanalyzer';
const gstLaunchFilename = system.isWindows() ? 'gst-launch-1.0.exe' : 'gst-launch-1.0';
const gstInspectFilename = system.isWindows() ? 'gst-inspect-1.0.exe' : 'gst-inspect-1.0';
describe(
'EnvVarAndPathCheck',
withMocks({fs}, (mocks) => {
@@ -64,12 +68,14 @@ describe('android', function () {
});
it('diagnose - success', async function () {
process.env.ANDROID_HOME = '/a/b/c/d';
mocks.adb.expects('getAndroidBinaryPath').exactly(check.tools.length)
mocks.adb
.expects('getAndroidBinaryPath')
.exactly(check.tools.length)
.returns(B.resolve('/path/to/binary'));
(await check.diagnose()).should.deep.equal({
ok: true,
optional: false,
message: 'adb, emulator, apkanalyzer exist: /a/b/c/d',
message: `adb, emulator, ${apkAnalyzerFilename} exist: /a/b/c/d`,
});
mocks.verify();
});
@@ -79,19 +85,17 @@ describe('android', function () {
(await check.diagnose()).should.deep.equal({
ok: false,
optional: false,
message: 'adb, emulator, apkanalyzer could not be found because ' +
'ANDROID_HOME or ANDROID_SDK_ROOT is NOT set!',
message: `adb, emulator, ${apkAnalyzerFilename} could not be found because ANDROID_HOME or ANDROID_SDK_ROOT is NOT set!`,
});
mocks.verify();
});
it('diagnose - failure - path not valid', async function () {
process.env.ANDROID_HOME = '/a/b/c/d';
mocks.adb.expects('getAndroidBinaryPath').exactly(check.tools.length)
.throws();
mocks.adb.expects('getAndroidBinaryPath').exactly(check.tools.length).throws();
(await check.diagnose()).should.deep.equal({
ok: false,
optional: false,
message: 'adb, emulator, apkanalyzer could NOT be found in /a/b/c/d!',
message: `adb, emulator, ${apkAnalyzerFilename} could NOT be found in /a/b/c/d!`,
});
mocks.verify();
});
@@ -102,11 +106,9 @@ describe('android', function () {
);
});
it('fix - install', async function () {
process.env.ANDROID_HOME = '/a/b/c/d';
process.env.ANDROID_HOME = path.resolve('/', 'a', 'b', 'c', 'd');
removeColors(await check.fix()).should.equal(
'Manually install adb, emulator, apkanalyzer and add it to PATH. ' +
'https://developer.android.com/studio#cmdline-tools and ' +
'https://developer.android.com/studio/intro/update#sdk-manager may help to setup.'
`Manually install adb, emulator, ${apkAnalyzerFilename} and add it to PATH. https://developer.android.com/studio#cmdline-tools and https://developer.android.com/studio/intro/update#sdk-manager may help to setup.`
);
});
})
@@ -138,8 +140,10 @@ describe('android', function () {
mocks.verify();
});
it('fix', async function () {
removeColors(await check.fix()).should.equal(
'bundletool.jar is used to handle Android App Bundle. Please read http://appium.io/docs/en/writing-running-appium/android/android-appbundle/ to install it'
removeColors(await check.fix()).should.match(
new RegExp(
'bundletool.jar is used to handle Android App Bundle. Please read http://appium.io/docs/en/writing-running-appium/android/android-appbundle/ to install it'
)
);
});
})
@@ -158,8 +162,7 @@ describe('android', function () {
(await check.diagnose()).should.deep.equal({
ok: true,
optional: true,
message:
'gst-launch-1.0 and gst-inspect-1.0 are installed at: path/to/gst-launch and path/to/gst-inspect',
message: `${gstLaunchFilename} and ${gstInspectFilename} are installed at: path/to/gst-launch and path/to/gst-inspect`,
});
mocks.verify();
});
@@ -168,14 +171,13 @@ describe('android', function () {
(await check.diagnose()).should.deep.equal({
ok: false,
optional: true,
message: 'gst-launch-1.0 and/or gst-inspect-1.0 cannot be found',
message: `${gstLaunchFilename} and/or ${gstInspectFilename} cannot be found`,
});
mocks.verify();
});
it('fix', async function () {
removeColors(await check.fix()).should.equal(
'gst-launch-1.0 and gst-inspect-1.0 are used to stream the screen of the device under test. ' +
'Please read https://appium.io/docs/en/writing-running-appium/android/android-screen-streaming/ to install them and for more details'
`${gstLaunchFilename} and ${gstInspectFilename} are used to stream the screen of the device under test. Please read https://appium.io/docs/en/writing-running-appium/android/android-screen-streaming/ to install them and for more details`
);
});
})
+5 -4
View File
@@ -1,3 +1,4 @@
import path from 'node:path';
import {BinaryIsInPathCheck, AndroidSdkExists} from '../../lib/dev';
import {fs} from '@appium/support';
import * as tp from 'teen_process';
@@ -65,12 +66,12 @@ describe('dev', function () {
check.autofix.should.not.be.ok;
});
it('diagnose - success', async function () {
process.env.ANDROID_HOME = '/a/b/c/d';
process.env.ANDROID_HOME = path.resolve('/', 'a', 'b', 'c', 'd');
mocks.fs.expects('exists').once().returns(B.resolve(true));
(await check.diagnose()).should.deep.equal({
ok: true,
optional: false,
message: 'android-16 was found at: /a/b/c/d/platforms/android-16',
message: `android-16 was found at: ${process.env.ANDROID_HOME}${path.sep}platforms${path.sep}android-16`,
});
mocks.verify();
});
@@ -84,12 +85,12 @@ describe('dev', function () {
mocks.verify();
});
it('diagnose - failure - invalid path', async function () {
process.env.ANDROID_HOME = '/a/b/c/d';
process.env.ANDROID_HOME = path.resolve('/', 'a', 'b', 'c', 'd');
mocks.fs.expects('exists').once().returns(B.resolve(false));
(await check.diagnose()).should.deep.equal({
ok: false,
optional: false,
message: "android-16 could NOT be found at '/a/b/c/d/platforms/android-16'!",
message: `android-16 could NOT be found at '${process.env.ANDROID_HOME}${path.sep}platforms${path.sep}android-16'!`,
});
mocks.verify();
});
+28
View File
@@ -3,6 +3,34 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.4.0](https://github.com/appium/appium/compare/@appium/docutils@0.3.13...@appium/docutils@0.4.0) (2023-06-14)
### Features
* **appium:** Allow to provide ipv6 addresses and handle broadcast addresses in logs ([#18674](https://github.com/appium/appium/issues/18674)) ([8f63dab](https://github.com/appium/appium/commit/8f63dabb5dca882e522026f243e3445f5418874b))
* **docutils:** init: scafffold package.json ([2766dcc](https://github.com/appium/appium/commit/2766dcca4cfdc74904cc21f4881d748ed8ffd198))
### Bug Fixes
* **docutils:** update dependency yaml to v2.3.0 ([325d237](https://github.com/appium/appium/commit/325d2372078ee01e8fb58613ffd13417f2527151))
* **docutils:** update dependency yaml to v2.3.1 ([1a2260b](https://github.com/appium/appium/commit/1a2260bb15d75e4f4c23551dc61529108a7b0d88))
* **support:** update dependency semver to v7.5.1 ([5a55509](https://github.com/appium/appium/commit/5a555090c5322318f845415d743ee5c645fb94a0))
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [0.3.13](https://github.com/appium/appium/compare/@appium/docutils@0.3.12...@appium/docutils@0.3.13) (2023-05-19)
### Bug Fixes
* **docutils:** fix broken executable ([f0ebe2e](https://github.com/appium/appium/commit/f0ebe2e02f3e4164f07fd10ca36f460ff7a61682))
## [0.3.12](https://github.com/appium/appium/compare/@appium/docutils@0.3.11...@appium/docutils@0.3.12) (2023-05-19)
+9 -1
View File
@@ -2,4 +2,12 @@
'use strict';
module.exports = require('../build/lib/cli');
const {main} = require('../build/lib/cli');
const {getLogger} = require('../build/lib/logger');
const log = getLogger('cli');
// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-await-to-callbacks
main().catch((err) => {
log.error('Caught otherwise-unhandled rejection (this is probably a bug):', err);
});
+4 -1
View File
@@ -79,7 +79,10 @@ export async function checkMissingPaths<T extends Record<string, Options>>(
if (missingPaths.length) {
return missingPaths
.map(({id, path}) => `Path specified using --${_.kebabCase(id)} (${path}) does not exist`)
.map(
({id, path}) =>
`Default or specified path via --${_.kebabCase(id)} (${path}) does not exist`
)
.join('\n');
}
+22
View File
@@ -30,6 +30,7 @@ const opts = {
nargs: 1,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
dir: {
default: '.',
@@ -59,6 +60,7 @@ const opts = {
group: InitCommandGroup.MkDocs,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
mkdocs: {
default: true,
@@ -74,6 +76,7 @@ const opts = {
normalize: true,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
'package-json': {
defaultDescription: './package.json',
@@ -98,6 +101,7 @@ const opts = {
normalize: true,
requiresArg: true,
type: 'string',
implies: 'python',
},
'repo-name': {
defaultDescription: '(derived from --repo-url)',
@@ -106,6 +110,7 @@ const opts = {
nargs: 1,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
'repo-url': {
defaultDescription: '(from package.json)',
@@ -114,6 +119,7 @@ const opts = {
nargs: 1,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
'site-description': {
defaultDescription: '(from package.json)',
@@ -122,6 +128,7 @@ const opts = {
nargs: 1,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
'site-name': {
defaultDescription: '(extension package name)',
@@ -130,6 +137,7 @@ const opts = {
nargs: 1,
requiresArg: true,
type: 'string',
implies: 'mkdocs',
},
'tsconfig-json': {
defaultDescription: './tsconfig.json',
@@ -139,12 +147,14 @@ const opts = {
normalize: true,
requiresArg: true,
type: 'string',
implies: 'typescript',
},
typedoc: {
default: true,
description: 'Create typedoc.json if needed',
group: InitCommandGroup.Behavior,
type: 'boolean',
implies: 'entry-point',
},
'typedoc-json': {
defaultDescription: './typedoc.json',
@@ -154,6 +164,17 @@ const opts = {
normalize: true,
requiresArg: true,
type: 'string',
implies: 'typedoc',
},
'entry-point': {
alias: 'e',
describe: 'Source entry point of extension',
group: InitCommandGroup.Paths,
nargs: 1,
normalize: false,
requiresArg: true,
type: 'string',
implies: 'typedoc',
},
typescript: {
default: true,
@@ -167,6 +188,7 @@ const opts = {
group: InitCommandGroup.Behavior,
type: 'boolean',
conflicts: 'force',
implies: 'python',
},
} as const satisfies Record<string, Options>;
+27 -4
View File
@@ -8,19 +8,20 @@
import {getLogger} from '../logger';
import {fs} from '@appium/support';
import _ from 'lodash';
import {sync as readPkg} from 'read-pkg';
import {hideBin} from 'yargs/helpers';
import yargs from 'yargs/yargs';
import {DEFAULT_LOG_LEVEL, LogLevelMap, NAME_BIN} from '../constants';
import {DocutilsError} from '../error';
import {build, init, validate} from './command';
import {findConfig} from './config';
import {fs} from '@appium/support';
import {sync as readPkg} from 'read-pkg';
const pkg = readPkg({cwd: fs.findRoot(__dirname)});
const log = getLogger('cli');
const IMPLICATIONS_FAILED_REGEX = /implications\s+failed:\n\s*(.+)\s->\s(.+)$/i;
export async function main(argv = hideBin(process.argv)) {
const config = await findConfig(argv);
@@ -70,12 +71,34 @@ export async function main(argv = hideBin(process.argv)) {
* Custom failure handler so we can log nicely.
*/
(msg: string | null, error) => {
/**
* yargs' default output if an "implication" fails (e.g., arg _A_ requires arg _B_) leaves much to be desired.
*
* @remarks Unfortunately, we do not have access to the parsed arguments object, since it may have failed parsing.
* @param msg Implication failure message
* @returns Whether the message was an implication failure
*/
const handleImplicationFailure = (msg: string | null): boolean => {
let match: RegExpMatchArray | null | undefined;
if (!(match = msg?.match(IMPLICATIONS_FAILED_REGEX))) {
return false;
}
const [, arg, missingArg] = match;
log.error(
`Argument "--${arg}" requires "--${missingArg}"; note that "--${arg}" may be enabled by default`
);
return true;
};
// if it is a DocutilsError, it has nothing to do with the CLI
if (error instanceof DocutilsError) {
log.error(error.message);
} else {
y.showHelp();
log.error(`\n\n${msg ?? error.message}`);
if (!handleImplicationFailure(msg)) {
log.error(`\n\n${msg ?? error.message}`);
}
}
y.exit(1, error);
}
+49 -2
View File
@@ -11,10 +11,11 @@ import {
NAME_PYTHON,
REQUIREMENTS_TXT_PATH,
NAME_TYPEDOC_JSON,
NAME_PACKAGE_JSON,
} from './constants';
import YAML from 'yaml';
import {exec} from 'teen_process';
import {Simplify} from 'type-fest';
import {PackageJson, Simplify} from 'type-fest';
import {DocutilsError} from './error';
import {createScaffoldTask, ScaffoldTaskOptions} from './scaffold';
import {getLogger} from './logger';
@@ -54,9 +55,19 @@ const BASE_TSCONFIG_JSON: Readonly<TsConfigJson> = Object.freeze({
},
});
/**
* Data for the base `package.json` file.
* We expect `package.json` to exist, and we are not in the business of creating it.
* However, we will need to add a `typedoc.entryPoint` prop to it.
*/
const BASE_PACKAGE_JSON: Readonly<PackageJson> = Object.freeze({});
const log = getLogger('init');
const dryRunLog = getLogger('dry-run', log);
/**
* Files included, by default, in `tsconfig.json`
*/
const DEFAULT_INCLUDE = ['lib', 'test', 'index.js'];
/**
* Function which scaffolds a `tsconfig.json` file
@@ -97,6 +108,26 @@ export const initTypeDocJson = createScaffoldTask<InitTypeDocOptions, TypeDocJso
'TypeDoc configuration'
);
/**
* Function which scaffolds a `package.json` file
*
* This only amends prop `typedoc.entryPoint` to the `package.json` file.
*
* If, strangely, `package.json` did not exist, then it will now contain _only_ that prop.
*/
export const initTypeDocPkgJson = createScaffoldTask<InitTypeDocOptions, PackageJson>(
NAME_PACKAGE_JSON,
BASE_PACKAGE_JSON,
'Package configuration for TypeDoc',
{
transform: (content, opts) =>
({
...content,
typedoc: {entryPoint: opts.typeDocEntryPoint},
} as PackageJson),
}
);
/**
* Function which scaffolds an `mkdocs.yml` file
*/
@@ -224,6 +255,7 @@ export async function init({
pythonPath,
upgrade,
typedocJson: typeDocJsonPath,
entryPoint: typeDocEntryPoint,
}: InitOptions = {}): Promise<void> {
if (!typescript && typedoc) {
log.warn(
@@ -250,6 +282,13 @@ export async function init({
dryRun,
cwd,
});
await initTypeDocPkgJson({
packageJson: packageJsonPath,
overwrite: true, // <-- always overwrite
dryRun,
cwd,
typeDocEntryPoint,
});
}
if (python) {
@@ -271,7 +310,10 @@ export async function init({
}
}
export type InitTypeDocOptions = ScaffoldTaskOptions;
export interface InitTypeDocOptions extends ScaffoldTaskOptions {
typeDocEntryPoint?: string;
}
export interface InitTsConfigOptions extends ScaffoldTaskOptions {
/**
* List of source files (globs supported); typically `src` or `lib`
@@ -334,5 +376,10 @@ export type InitOptions = Simplify<
* If `true`, upgrade only
*/
upgrade?: boolean;
/**
* Path to entry point of extension (source; not "main" field)
*/
entryPoint?: string;
}
>;
+11 -4
View File
@@ -92,6 +92,7 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
const relativeDest = relativePath(dest);
log.debug('Initializing %s', relativeDest);
let shouldWriteDest = false;
let isNew = false;
let destContent: T;
let result: ScaffoldTaskResult<T>;
try {
@@ -105,6 +106,7 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
shouldWriteDest = true;
log.debug('Creating new file %s', relativeDest);
destContent = {} as T;
isNew = true;
}
const defaults: T = transform(defaultContent, opts, pkg);
@@ -113,7 +115,7 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
shouldWriteDest = shouldWriteDest || !_.isEqual(destContent, finalDestContent);
if (shouldWriteDest) {
log.info('Changes needed to %s', relativeDest);
log.info('Changes needed in %s', relativeDest);
log.debug('Original %s: %O', relativeDest, destContent);
log.debug('Final %s: %O', relativeDest, finalDestContent);
const patch = makePatch(dest, destContent, finalDestContent, serialize);
@@ -126,6 +128,11 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
try {
await safeWriteFile(dest, finalDestContent, overwrite);
if (isNew) {
log.success('Initialized %s', description);
} else {
log.success('Updated %s', description);
}
} catch (e) {
const err = e as NodeJS.ErrnoException;
// this should only be thrown if `force` is false
@@ -139,9 +146,9 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
}
}
} else {
log.info('No changes to %s', relativeDest);
log.info('No changes necessary for %s', relativeDest);
}
log.success('Initialized %s', description);
log.success(`${description}: done`);
return {path: dest, content: finalDestContent};
};
}
@@ -153,7 +160,7 @@ export function createScaffoldTask<Opts extends ScaffoldTaskOptions, T extends J
export type ScaffoldTaskTransformer<Opts extends ScaffoldTaskOptions, T extends JsonValue> = (
content: Readonly<T>,
opts: TaskSpecificOpts<Opts>,
pkg: NormalizedPackageJson
pkg: Readonly<NormalizedPackageJson>
) => T;
/**
+6 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/docutils",
"version": "0.3.12",
"version": "0.4.0",
"description": "Documentation generation utilities for Appium and related projects",
"keywords": [
"automation",
@@ -49,9 +49,9 @@
"start": "node ./build/lib/cli/index.js"
},
"dependencies": {
"@appium/support": "^4.0.1",
"@appium/support": "^4.0.2",
"@appium/tsconfig": "^0.3.0",
"@appium/typedoc-plugin-appium": "^0.6.4",
"@appium/typedoc-plugin-appium": "^0.6.5",
"@sliphua/lilconfig-ts-loader": "3.2.2",
"@types/which": "3.0.0",
"chalk": "4.1.2",
@@ -65,15 +65,15 @@
"log-symbols": "4.1.0",
"pkg-dir": "5.0.0",
"read-pkg": "5.2.0",
"semver": "7.5.0",
"semver": "7.5.1",
"source-map-support": "0.5.21",
"teen_process": "2.0.2",
"type-fest": "3.10.0",
"type-fest": "3.11.1",
"typedoc": "0.23.28",
"typedoc-plugin-markdown": "3.14.0",
"typedoc-plugin-resolve-crossmodule-references": "0.3.3",
"typescript": "4.9.5",
"yaml": "2.2.2",
"yaml": "2.3.1",
"yargs": "17.7.2",
"yargs-parser": "21.1.1"
},
+1 -1
View File
@@ -1,4 +1,4 @@
mkdocs==1.4.3
mkdocs-material==9.1.9
mkdocs-material==9.1.15
mkdocs-material-extensions==1.1.1
mike==1.1.2
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.4.7](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.6...@appium/driver-test-support@0.4.7) (2023-06-14)
### Bug Fixes
* **schema:** update definitelytyped ([e967240](https://github.com/appium/appium/commit/e96724077ef2b5b8aae203856195f3bb8de56116))
* **test-support:** update dependency sinon to v15.1.0 ([4c61d53](https://github.com/appium/appium/commit/4c61d533b8f52131a637f5cd0b019375f85f075f))
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [0.4.6](https://github.com/appium/appium/compare/@appium/driver-test-support@0.4.5...@appium/driver-test-support@0.4.6) (2023-05-17)
@@ -5,6 +5,7 @@ import B from 'bluebird';
import {TEST_HOST, getTestPort, createAppiumURL} from './helpers';
import chai from 'chai';
import sinon from 'sinon';
import { Agent } from 'node:http';
const should = chai.should();
@@ -148,6 +149,9 @@ export function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
describe('session handling', function () {
it('should handle idempotency while creating sessions', async function () {
// workaround for https://github.com/node-fetch/node-fetch/issues/1735
const httpAgent = new Agent({ keepAlive: true });
const sessionIds = [];
let times = 0;
do {
@@ -159,11 +163,7 @@ export function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
headers: {
'X-Idempotency-Key': '123456',
},
// XXX: I'm not sure what these are, as they are not documented axios options,
// nor are they mentioned in our source
// @ts-expect-error
simple: false,
resolveWithFullResponse: true,
httpAgent,
}
);
@@ -178,6 +178,9 @@ export function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
});
it('should handle idempotency while creating parallel sessions', async function () {
// workaround for https://github.com/node-fetch/node-fetch/issues/1735
const httpAgent = new Agent({ keepAlive: true });
const reqs = [];
let times = 0;
do {
@@ -192,6 +195,7 @@ export function driverE2ETestSuite(DriverClass, defaultCaps = {}) {
headers: {
'X-Idempotency-Key': '12345',
},
httpAgent,
}
)
);
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/driver-test-support",
"version": "0.4.6",
"version": "0.4.7",
"description": "Test utilities for Appium drivers",
"keywords": [
"automation",
@@ -41,18 +41,18 @@
},
"types": "./build/lib/index.d.ts",
"dependencies": {
"@appium/types": "^0.11.1",
"@types/lodash": "4.14.194",
"@appium/types": "^0.12.0",
"@types/lodash": "4.14.195",
"@types/stoppable": "1.1.1",
"axios": "1.4.0",
"bluebird": "3.7.2",
"chai": "4.3.7",
"get-port": "5.1.1",
"lodash": "4.17.21",
"sinon": "15.0.4",
"sinon": "15.1.0",
"source-map-support": "0.5.21",
"stoppable": "1.1.0",
"type-fest": "3.10.0"
"type-fest": "3.11.1"
},
"peerDependencies": {
"appium": "^2.0.0-beta.43",
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.0.14](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.13...@appium/execute-driver-plugin@3.0.14) (2023-06-14)
### Bug Fixes
* **execute-driver-plugin:** update dependency vm2 to v3.9.19 ([8594d13](https://github.com/appium/appium/commit/8594d13bf6a1cb59bc76cbe2d39976ae86cdb3b2))
## [3.0.13](https://github.com/appium/appium/compare/@appium/execute-driver-plugin@3.0.12...@appium/execute-driver-plugin@3.0.13) (2023-05-17)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/execute-driver-plugin",
"version": "3.0.13",
"version": "3.0.14",
"description": "Plugin for batching and executing driver commands with Appiums",
"keywords": [
"automation",
@@ -42,7 +42,7 @@
"bluebird": "3.7.2",
"lodash": "4.17.21",
"source-map-support": "0.5.21",
"vm2": "3.9.17",
"vm2": "3.9.19",
"webdriverio": "7.31.1"
},
"peerDependencies": {
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [5.2.4](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.3...@appium/fake-driver@5.2.4) (2023-06-14)
### Bug Fixes
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.8.8 ([3bf4060](https://github.com/appium/appium/commit/3bf406015eb9854abbf6cf024e3bd724468c924d))
## [5.2.3](https://github.com/appium/appium/compare/@appium/fake-driver@5.2.2...@appium/fake-driver@5.2.3) (2023-04-03)
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-driver",
"version": "5.2.3",
"version": "5.2.4",
"description": "Mock driver used internally by Appium for testing. Ignore",
"keywords": [
"automation",
@@ -43,11 +43,11 @@
"test": "npm run test:unit",
"test:e2e": "mocha --timeout 20s --slow 10s \"./test/e2e/**/*.spec.js\"",
"test:smoke": "node ./build/lib/index.js",
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
"test:unit": "mocha --timeout 10s --slow 5s \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@types/bluebird": "3.5.38",
"@xmldom/xmldom": "0.8.7",
"@xmldom/xmldom": "0.8.8",
"asyncbox": "2.9.4",
"bluebird": "3.7.2",
"lodash": "4.17.21",
+16
View File
@@ -3,6 +3,22 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.1.15](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.14...@appium/fake-plugin@3.1.15) (2023-06-14)
**Note:** Version bump only for package @appium/fake-plugin
## [3.1.14](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.13...@appium/fake-plugin@3.1.14) (2023-05-19)
**Note:** Version bump only for package @appium/fake-plugin
## [3.1.13](https://github.com/appium/appium/compare/@appium/fake-plugin@3.1.12...@appium/fake-plugin@3.1.13) (2023-05-19)
**Note:** Version bump only for package @appium/fake-plugin
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/fake-plugin",
"version": "3.1.13",
"version": "3.1.15",
"description": "A fake Appium 2.0 plugin",
"keywords": [
"automation",
@@ -39,8 +39,8 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/base-plugin": "^2.2.9",
"@appium/support": "^4.0.1",
"@appium/base-plugin": "^2.2.11",
"@appium/support": "^4.0.2",
"@types/bluebird": "3.5.38",
"bluebird": "3.7.2",
"lodash": "4.17.21",
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.1.2](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.1...@appium/images-plugin@2.1.2) (2023-06-14)
### Bug Fixes
* **images-plugin:** Make sure the template is always a buffer ([#18696](https://github.com/appium/appium/issues/18696)) ([0497090](https://github.com/appium/appium/commit/0497090a90e6219a383125543780cd71269a4604))
## [2.1.1](https://github.com/appium/appium/compare/@appium/images-plugin@2.1.0...@appium/images-plugin@2.1.1) (2023-05-19)
+5 -1
View File
@@ -239,7 +239,11 @@ export default class ImageElement {
if (strategy !== IMAGE_STRATEGY) {
throw new errors.InvalidSelectorError(`Lookup strategies other than '${IMAGE_STRATEGY}' are not supported`);
}
return await this.finder.findByImage(selector, driver, {multiple, containerRect: this.rect});
return await this.finder.findByImage(
Buffer.from(selector, 'base64'),
driver,
{multiple, containerRect: this.rect}
);
}
/**
+1 -1
View File
@@ -52,7 +52,7 @@ export default class ImageElementPlugin extends BasePlugin {
return await next();
}
return await this.finder.findByImage(selector, driver, {multiple});
return await this.finder.findByImage(Buffer.from(selector, 'base64'), driver, {multiple});
}
async handle(next, driver, cmdName, ...args) {
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/images-plugin",
"version": "2.1.1",
"version": "2.1.2",
"description": "Plugin for working with images and image elements in Appium",
"keywords": [
"automation",
@@ -39,7 +39,7 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/opencv": "^2.1.0",
"@appium/opencv": "^2.1.1",
"lodash": "4.17.21",
"lru-cache": "7.18.3",
"sharp": "0.32.1",
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.1.1](https://github.com/appium/appium/compare/@appium/opencv@2.1.0...@appium/opencv@2.1.1) (2023-06-14)
### Bug Fixes
* Do not use additional checks on opencv objects ([#18714](https://github.com/appium/appium/issues/18714)) ([38f8690](https://github.com/appium/appium/commit/38f86900da462a444ae5a9c92794f64a297f79bd))
## [2.1.0](https://github.com/appium/appium/compare/@appium/opencv@2.0.10...@appium/opencv@2.1.0) (2023-05-17)
+2 -6
View File
@@ -1,5 +1,3 @@
import _ from 'lodash';
export class OpenCvAutoreleasePool {
/**
* @type {Set}
@@ -17,9 +15,7 @@ export class OpenCvAutoreleasePool {
*/
add(...items) {
for (const item of items) {
if (_.has(item, 'delete') && _.isFunction(item.delete)) {
this._items.add(item);
}
this._items.add(item);
}
return items.length === 1 ? items[0] : items;
}
@@ -32,4 +28,4 @@ export class OpenCvAutoreleasePool {
}
this._items.clear();
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/opencv",
"version": "2.1.0",
"version": "2.1.1",
"description": "OpenCV-related helper library",
"keywords": [
"automation",
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.3.15](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.14...@appium/plugin-test-support@0.3.15) (2023-06-14)
**Note:** Version bump only for package @appium/plugin-test-support
## [0.3.14](https://github.com/appium/appium/compare/@appium/plugin-test-support@0.3.13...@appium/plugin-test-support@0.3.14) (2023-05-17)
**Note:** Version bump only for package @appium/plugin-test-support
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/plugin-test-support",
"version": "0.3.14",
"version": "0.3.15",
"description": "Testing utilities for Appium plugins",
"keywords": [
"automation",
@@ -41,7 +41,7 @@
"test:unit": "exit 0"
},
"dependencies": {
"@appium/types": "^0.11.1",
"@appium/types": "^0.12.0",
"get-port": "5.1.1",
"log-symbols": "4.1.0",
"source-map-support": "0.5.21",
+15
View File
@@ -3,6 +3,21 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.3.0](https://github.com/appium/appium/compare/@appium/schema@0.2.6...@appium/schema@0.3.0) (2023-06-14)
### Features
* **appium:** Allow to provide ipv6 addresses and handle broadcast addresses in logs ([#18674](https://github.com/appium/appium/issues/18674)) ([8f63dab](https://github.com/appium/appium/commit/8f63dabb5dca882e522026f243e3445f5418874b))
### Bug Fixes
* **schema:** update definitelytyped ([e967240](https://github.com/appium/appium/commit/e96724077ef2b5b8aae203856195f3bb8de56116))
* **types:** fix broken appium config schema types, temporarily ([fd2c72f](https://github.com/appium/appium/commit/fd2c72fd886ecaaf0f6588a328ff8a268a54fb55))
## [0.2.6](https://github.com/appium/appium/compare/@appium/schema@0.2.5...@appium/schema@0.2.6) (2023-03-08)
**Note:** Version bump only for package @appium/schema
+3 -4
View File
@@ -21,13 +21,12 @@ export const AppiumConfigJsonSchema = /** @type {const} */ ({
description: 'Configuration when running Appium as a server',
properties: {
address: {
$comment: 'I think hostname covers both DNS and IPv4...could be wrong',
appiumCliAliases: ['a'],
default: '0.0.0.0',
description: 'IP address to listen on',
format: 'hostname',
description: 'IPv4/IPv6 address or a hostname to listen on',
title: 'address config',
type: 'string',
// this should be anyOf [format: "hostname" or format: "ipv6"], but there seems to be a bug in json-schema-to-typescript preventing "ipv6" from converting to type "string"'
},
'allow-cors': {
description:
@@ -338,7 +337,7 @@ export const AppiumConfigJsonSchema = /** @type {const} */ ({
},
},
{
oneOf: [{$ref: '#/$defs/logFilterText'}, {$ref: '#/$defs/logFilterRegex'}],
anyOf: [{$ref: '#/$defs/logFilterText'}, {$ref: '#/$defs/logFilterRegex'}],
},
],
},
@@ -14,13 +14,11 @@
"description": "Configuration when running Appium as a server",
"properties": {
"address": {
"$comment": "I think hostname covers both DNS and IPv4...could be wrong",
"appiumCliAliases": [
"a"
],
"default": "0.0.0.0",
"description": "IP address to listen on",
"format": "hostname",
"description": "IPv4/IPv6 address or a hostname to listen on",
"title": "address config",
"type": "string"
},
@@ -339,7 +337,7 @@
}
},
{
"oneOf": [
"anyOf": [
{
"$ref": "#/$defs/logFilterText"
},
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/schema",
"version": "0.2.6",
"version": "0.3.0",
"description": "Appium Configuration Schema",
"keywords": [
"automation",
@@ -38,7 +38,7 @@
"test": "exit 0"
},
"dependencies": {
"@types/json-schema": "7.0.11",
"@types/json-schema": "7.0.12",
"json-schema": "0.4.0",
"source-map-support": "0.5.21"
},
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.3.1](https://github.com/appium/appium/compare/@appium/strongbox@0.3.0...@appium/strongbox@0.3.1) (2023-06-14)
### Bug Fixes
* **strongbox:** do not force-lowercase slugged containers ([1ccf857](https://github.com/appium/appium/commit/1ccf857a4bdd77af3ccf2ad268e3410855509af8))
## [0.3.0](https://github.com/appium/appium/compare/@appium/strongbox@0.2.0...@appium/strongbox@0.3.0) (2023-04-20)
+1 -2
View File
@@ -1,6 +1,5 @@
import path from 'node:path';
import slug from 'slugify';
export function slugify(value: string) {
return slug(value, {lower: true});
return slug(value);
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/strongbox",
"version": "0.3.0",
"version": "0.3.1",
"description": "Persistent storage for Appium extensions",
"keywords": [
"automation",
@@ -12,7 +12,7 @@ type MockFs = {
describe('Strongbox', function () {
let sandbox: SinonSandbox;
let MockFs: MockFs = {} as any;
const DATA_DIR = '/some/dir';
const DATA_DIR = path.resolve(path.sep, 'some', 'dir');
// note to self: looks like this is safe to do before the rewiremock.proxy call
let BaseItem: typeof import('../../lib/base-item').BaseItem;
+14 -17
View File
@@ -16,7 +16,7 @@ describe('Strongbox', function () {
let DEFAULT_SUFFIX: string;
let MockFs: MockFs = {} as any;
const DATA_DIR = '/some/dir';
const DATA_DIR = path.resolve('some', 'dir', 'strongbox');
beforeEach(function () {
sandbox = createSandbox();
@@ -44,17 +44,18 @@ describe('Strongbox', function () {
describe('when provided an absolute container path', function () {
it('should use the provided container path', function () {
expect(strongbox('test', {container: '/somewhere/else'}).container).to.equal(
'/somewhere/else'
);
const container = path.resolve(path.sep, 'somewhere');
expect(strongbox('test', {container}).container).to.equal(container);
});
});
describe('when provided a relative container path', function () {
it('should throw an error', function () {
expect(() => strongbox('test', {container: 'somewhere/else'})).to.throw(
const container = path.join('somewhere', 'else');
expect(() => strongbox('test', {container})).to.throw(
TypeError,
'container slug somewhere/else must be an absolute path'
`container slug ${container} must be an absolute path`
);
});
});
@@ -85,17 +86,13 @@ describe('Strongbox', function () {
it('should create an empty Item', async function () {
expect(item).to.eql({
id: '/some/dir/strongbox/slug-test',
id: path.resolve(DATA_DIR, 'strongbox', 'SLUG-test'),
name: 'SLUG test',
encoding: 'utf8',
value: undefined,
container: '/some/dir/strongbox',
container: path.resolve(DATA_DIR, 'strongbox'),
});
});
it('should slugify the id', function () {
expect(item.id).to.equal('/some/dir/strongbox/slug-test');
});
});
describe('when the file exists', function () {
@@ -105,11 +102,11 @@ describe('Strongbox', function () {
it('should read its value', async function () {
const item = await box.createItem('SLUG test');
expect(item).to.eql({
id: '/some/dir/strongbox/slug-test',
id: path.resolve(DATA_DIR, 'strongbox', 'SLUG-test'),
name: 'SLUG test',
encoding: 'utf8',
value: 'foo bar',
container: '/some/dir/strongbox',
container: path.resolve(DATA_DIR, 'strongbox'),
});
});
});
@@ -129,7 +126,7 @@ describe('Strongbox', function () {
await item.write('boo bah');
expect(MockFs.writeFile).to.have.been.calledWith(
path.join(DATA_DIR, DEFAULT_SUFFIX, 'test'),
path.resolve(DATA_DIR, DEFAULT_SUFFIX, 'test'),
'boo bah',
'utf8'
);
@@ -148,7 +145,7 @@ describe('Strongbox', function () {
await box.createItem('test');
await expect(box.createItem('test')).to.be.rejectedWith(
Error,
'Item with id "/some/dir/strongbox/test" already exists'
`Item with id "${path.resolve(DATA_DIR, 'strongbox', 'test')}" already exists`
);
});
});
@@ -194,7 +191,7 @@ describe('Strongbox', function () {
it('should write the value to disk', async function () {
await box.createItemWithValue('test', 'value');
expect(MockFs.writeFile).to.have.been.calledWith(
path.join(DATA_DIR, DEFAULT_SUFFIX, 'test'),
path.resolve(DATA_DIR, DEFAULT_SUFFIX, 'test'),
'value'
);
});
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [4.0.2](https://github.com/appium/appium/compare/@appium/support@4.0.1...@appium/support@4.0.2) (2023-06-14)
### Bug Fixes
* **support:** update dependency @types/semver to v7.5.0 ([528dcfe](https://github.com/appium/appium/commit/528dcfe324e75e48471cdb694448c2a09ec2d828))
* **support:** update dependency semver to v7.5.1 ([5a55509](https://github.com/appium/appium/commit/5a555090c5322318f845415d743ee5c645fb94a0))
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [4.0.1](https://github.com/appium/appium/compare/@appium/support@4.0.0...@appium/support@4.0.1) (2023-05-19)
+21 -3
View File
@@ -1,14 +1,32 @@
import sharp from 'sharp';
let _sharp;
/**
* @returns {import('sharp')}
*/
function requireSharp() {
if (!_sharp) {
try {
_sharp = require('sharp');
} catch (err) {
throw new Error(
`Cannot load the 'sharp' module needed for images processing. ` +
`Consider visiting https://sharp.pixelplumbing.com/install ` +
`for troubleshooting. Original error: ${err.message}`
);
}
}
return _sharp;
}
/**
* Crop the image by given rectangle (use base64 string as input and output)
*
* @param {string} base64Image The string with base64 encoded image.
* Supports all image formats natively supported by Sharp library.
* @param {sharp.Region} rect The selected region of image
* @param {import('sharp').Region} rect The selected region of image
* @return {Promise<string>} base64 encoded string of cropped image
*/
export async function cropBase64Image(base64Image, rect) {
const buf = await sharp(Buffer.from(base64Image, 'base64')).extract(rect).toBuffer();
const buf = await requireSharp()(Buffer.from(base64Image, 'base64')).extract(rect).toBuffer();
return buf.toString('base64');
}
+8 -6
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/support",
"version": "4.0.1",
"version": "4.0.2",
"description": "Support libs used across appium packages",
"keywords": [
"automation",
@@ -42,7 +42,7 @@
},
"dependencies": {
"@appium/tsconfig": "^0.3.0",
"@appium/types": "^0.11.1",
"@appium/types": "^0.12.0",
"@colors/colors": "1.5.0",
"@types/archiver": "5.3.2",
"@types/base64-stream": "1.0.2",
@@ -55,7 +55,7 @@
"@types/ncp": "2.0.5",
"@types/npmlog": "4.1.4",
"@types/pluralize": "0.0.29",
"@types/semver": "7.3.13",
"@types/semver": "7.5.0",
"@types/shell-quote": "1.7.1",
"@types/supports-color": "8.1.1",
"@types/teen_process": "2.0.0",
@@ -86,17 +86,19 @@
"read-pkg": "5.2.0",
"resolve-from": "5.0.0",
"sanitize-filename": "1.6.3",
"semver": "7.5.0",
"sharp": "0.32.1",
"semver": "7.5.1",
"shell-quote": "1.8.1",
"source-map-support": "0.5.21",
"supports-color": "8.1.1",
"teen_process": "2.0.2",
"type-fest": "3.10.0",
"type-fest": "3.11.1",
"uuid": "9.0.0",
"which": "3.0.1",
"yauzl": "2.10.0"
},
"optionalDependencies": {
"sharp": "0.32.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
"npm": ">=8"
+6 -5
View File
@@ -9,6 +9,12 @@ describe('isExecutable()', function () {
});
describe('when the path exists', function () {
beforeEach(function () {
if (isWindows()) {
return this.skip();
}
});
describe('when the path is not executable', function () {
it('should return `false`', async function () {
await fs.isExecutable(__filename).should.eventually.be.false;
@@ -16,11 +22,6 @@ describe('isExecutable()', function () {
});
describe('when the path is executable', function () {
beforeEach(function () {
if (isWindows()) {
return this.skip();
}
});
it('should return `true`', async function () {
await fs.isExecutable('/bin/bash').should.eventually.be.true;
});
+10 -1
View File
@@ -2,6 +2,7 @@ import path from 'path';
import * as zip from '../../lib/zip';
import {tempDir, fs} from '../../lib/index';
import {MockReadWriteStream} from '../helpers';
import {isWindows} from '../../lib/system';
describe('#zip', function () {
const optionMap = new Map([
@@ -30,7 +31,11 @@ describe('#zip', function () {
if (!(await fs.exists(tmpPath))) {
continue;
}
await fs.rimraf(tmpPath);
try {
await fs.rimraf(tmpPath);
} catch {
// on windows, this can break due to file handles being open on files within the directory.
}
}
});
@@ -239,6 +244,10 @@ describe('#zip', function () {
let zippedFilePath, assetsPath, tmpRoot;
beforeEach(async function () {
// XXX: I don't know enough about unicode handling in the windows FS to attempt a fix here
if (isWindows()) {
return this.skip();
}
assetsPath = await tempDir.openDir();
tmpRoot = await tempDir.openDir();
+14 -10
View File
@@ -76,7 +76,7 @@ describe('env', function () {
describe('when APPIUM_HOME is set in env', function () {
describe('when APPIUM_HOME is absolute', function () {
beforeEach(function () {
process.env.APPIUM_HOME = '/some/path/to/appium-home';
process.env.APPIUM_HOME = path.resolve(path.sep, 'some', 'appium-home');
});
it('should resolve APPIUM_HOME from env', async function () {
@@ -86,11 +86,11 @@ describe('env', function () {
describe('when APPIUM_HOME is relative', function () {
beforeEach(function () {
process.env.APPIUM_HOME = 'some/path/to/appium-home';
process.env.APPIUM_HOME = path.join('some', 'appium-home');
});
it('should resolve to an absolute path', async function () {
await expect(env.resolveAppiumHome()).to.eventually.equal(
path.join(process.cwd(), process.env.APPIUM_HOME)
path.join(process.cwd(), /** @type {string} */ (process.env.APPIUM_HOME))
);
});
});
@@ -114,13 +114,15 @@ describe('env', function () {
});
describe('when `appium` is a dependency of the package in the cwd', function () {
const appiumHome = path.resolve(path.sep, 'somewhere');
describe('when the `appium` dependency spec begins with `file:`', function () {
beforeEach(function () {
MockReadPkg.resolves({devDependencies: {appium: 'file:../appium'}});
});
it('should resolve with the identity', async function () {
await expect(env.resolveAppiumHome('/somewhere')).to.eventually.equal('/somewhere');
await expect(env.resolveAppiumHome(appiumHome)).to.eventually.equal(appiumHome);
});
});
@@ -130,7 +132,7 @@ describe('env', function () {
});
it('should resolve with the identity', async function () {
await expect(env.resolveAppiumHome('/somewhere')).to.eventually.equal('/somewhere');
await expect(env.resolveAppiumHome(appiumHome)).to.eventually.equal(appiumHome);
});
});
@@ -139,7 +141,7 @@ describe('env', function () {
MockReadPkg.resolves({devDependencies: {appium: '0.9.0'}});
});
it('should resolve with DEFAULT_APPIUM_HOME', async function () {
await expect(env.resolveAppiumHome('/somewhere')).to.eventually.equal(
await expect(env.resolveAppiumHome(appiumHome)).to.eventually.equal(
env.DEFAULT_APPIUM_HOME
);
});
@@ -151,7 +153,7 @@ describe('env', function () {
});
it('should resolve with DEFAULT_APPIUM_HOME', async function () {
await expect(env.resolveAppiumHome('/somewhere')).to.eventually.equal(
await expect(env.resolveAppiumHome(appiumHome)).to.eventually.equal(
env.DEFAULT_APPIUM_HOME
);
});
@@ -159,18 +161,20 @@ describe('env', function () {
});
describe('when `appium` is a dependency of the workspace root of cwd', function () {
const appiumHome = path.resolve(path.sep, 'somewhere');
beforeEach(function () {
MockTeenProcess.exec.resolves({
stdout: JSON.stringify({
path: '/somewhere',
path: appiumHome,
}),
});
MockReadPkg.resolves({devDependencies: {appium: '2.x'}});
});
it('should resolve with the workspace root', async function () {
await expect(env.resolveAppiumHome('/somewhere/else')).to.eventually.equal(
'/somewhere'
await expect(env.resolveAppiumHome(path.join(appiumHome, 'else'))).to.eventually.equal(
appiumHome
);
});
});
+9 -3
View File
@@ -1,4 +1,4 @@
import {fs, tempDir} from '../../lib/index.js';
import {fs, system, tempDir} from '../../lib';
import path from 'path';
import {createSandbox} from 'sinon';
import {exec} from 'teen_process';
@@ -140,6 +140,11 @@ describe('fs', function () {
stat.should.have.property('atime');
});
describe('which()', function () {
before(function () {
if (system.isWindows()) {
return this.skip();
}
});
it('should find correct executable', async function () {
let systemNpmPath = (await exec('which', ['npm'])).stdout.trim();
let npmPath = await fs.which('npm');
@@ -158,8 +163,9 @@ describe('fs', function () {
describe('walkDir()', function () {
it('walkDir recursive', async function () {
await chai.expect(fs.walkDir(__dirname, true, (item) => item.endsWith('logger/helpers.js')))
.to.eventually.not.be.null;
await chai.expect(
fs.walkDir(__dirname, true, (item) => item.endsWith(`logger${path.sep}helpers.js`))
).to.eventually.not.be.null;
});
it('should walk all elements recursive', async function () {
await chai.expect(fs.walkDir(path.join(__dirname, '..', 'e2e', 'fixture'), true, _.noop)).to
+12 -2
View File
@@ -1,6 +1,6 @@
import * as teenProcess from 'teen_process';
import {createSandbox} from 'sinon';
import {process} from '../../lib/index.js';
import {process, system} from '../../lib';
import {retryInterval} from 'asyncbox';
const SubProcess = teenProcess.SubProcess;
@@ -19,11 +19,16 @@ describe('process', function () {
describe('getProcessIds', function () {
let proc;
before(async function () {
if (system.isWindows()) {
return this.skip();
}
proc = new SubProcess('tail', ['-f', __filename]);
await proc.start();
});
after(async function () {
await proc.stop();
if (proc) {
await proc.stop();
}
});
it('should get return an array for existing process', async function () {
let pids = await process.getProcessIds('tail');
@@ -49,6 +54,11 @@ describe('process', function () {
describe('killProcess', function () {
let proc;
before(function () {
if (system.isWindows()) {
return this.skip();
}
});
beforeEach(async function () {
proc = new SubProcess('tail', ['-f', __filename]);
await proc.start();
+9
View File
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.0.16](https://github.com/appium/appium/compare/@appium/test-support@3.0.15...@appium/test-support@3.0.16) (2023-06-14)
### Bug Fixes
* **test-support:** update dependency sinon to v15.1.0 ([4c61d53](https://github.com/appium/appium/commit/4c61d533b8f52131a637f5cd0b019375f85f075f))
## [3.0.15](https://github.com/appium/appium/compare/@appium/test-support@3.0.14...@appium/test-support@3.0.15) (2023-05-19)
**Note:** Version bump only for package @appium/test-support
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/test-support",
"version": "3.0.15",
"version": "3.0.16",
"description": "A collection of test utilities used across Appium packages",
"keywords": [
"automation",
@@ -45,12 +45,12 @@
"test:unit": "mocha \"./test/unit/**/*.spec.js\""
},
"dependencies": {
"@appium/support": "^4.0.1",
"@appium/support": "^4.0.2",
"@colors/colors": "1.5.0",
"bluebird": "3.7.2",
"lodash": "4.17.21",
"loud-rejection": "2.2.0",
"sinon": "15.0.4",
"sinon": "15.1.0",
"source-map-support": "0.5.21"
},
"engines": {
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.6.5](https://github.com/appium/appium/compare/@appium/typedoc-plugin-appium@0.6.4...@appium/typedoc-plugin-appium@0.6.5) (2023-06-14)
### Bug Fixes
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [0.6.4](https://github.com/appium/appium/compare/@appium/typedoc-plugin-appium@0.6.3...@appium/typedoc-plugin-appium@0.6.4) (2023-05-17)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/typedoc-plugin-appium",
"version": "0.6.4",
"version": "0.6.5",
"description": "TypeDoc plugin for Appium & its extensions",
"homepage": "https://appium.io",
"license": "Apache-2.0",
@@ -63,7 +63,7 @@
"handlebars": "4.7.7",
"lodash": "4.17.21",
"pluralize": "8.0.0",
"type-fest": "3.10.0"
"type-fest": "3.11.1"
},
"gitHead": "8480a85ce2fa466360e0fb1a7f66628331907f02"
}
+15
View File
@@ -3,6 +3,21 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [0.12.0](https://github.com/appium/appium/compare/@appium/types@0.11.1...@appium/types@0.12.0) (2023-06-14)
### Features
* **appium:** Allow to provide ipv6 addresses and handle broadcast addresses in logs ([#18674](https://github.com/appium/appium/issues/18674)) ([8f63dab](https://github.com/appium/appium/commit/8f63dabb5dca882e522026f243e3445f5418874b))
### Bug Fixes
* **types:** update dependency type-fest to v3.11.0 ([19277f6](https://github.com/appium/appium/commit/19277f6e14a56e52b4669d633e148ad4a3da2c7a))
* **types:** update dependency type-fest to v3.11.1 ([56499eb](https://github.com/appium/appium/commit/56499eb997b551739bed628f057de7987674ea7f))
## [0.11.1](https://github.com/appium/appium/compare/@appium/types@0.11.0...@appium/types@0.11.1) (2023-05-17)
+1 -1
View File
@@ -6,7 +6,7 @@
*/
/**
* IP address to listen on
* IPv4/IPv6 address or a hostname to listen on
*/
export type AddressConfig = string;
/**
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/types",
"version": "0.11.1",
"version": "0.12.0",
"description": "Various type declarations used across Appium",
"keywords": [
"automation",
@@ -38,12 +38,12 @@
"test:types": "tsd"
},
"dependencies": {
"@appium/schema": "^0.2.6",
"@appium/schema": "^0.3.0",
"@appium/tsconfig": "^0.3.0",
"@types/express": "4.17.17",
"@types/npmlog": "4.1.4",
"@types/ws": "8.5.4",
"type-fest": "3.10.0"
"type-fest": "3.11.1"
},
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0",
@@ -3,6 +3,15 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.0.9](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.8...@appium/universal-xml-plugin@1.0.9) (2023-06-14)
### Bug Fixes
* **universal-xml-plugin:** update dependency @xmldom/xmldom to v0.8.8 ([3bf4060](https://github.com/appium/appium-plugins/commit/3bf406015eb9854abbf6cf024e3bd724468c924d))
## [1.0.8](https://github.com/appium/appium-plugins/compare/@appium/universal-xml-plugin@1.0.7...@appium/universal-xml-plugin@1.0.8) (2023-04-03)
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@appium/universal-xml-plugin",
"version": "1.0.8",
"version": "1.0.9",
"description": "Appium plugin for making XML source and XPath queries the same across iOS and Android",
"keywords": [
"automation",
@@ -37,7 +37,7 @@
},
"dependencies": {
"@types/xmldom": "0.1.31",
"@xmldom/xmldom": "0.8.7",
"@xmldom/xmldom": "0.8.8",
"fast-xml-parser": "3.21.1",
"lodash": "4.17.21",
"source-map-support": "0.5.21",