From 02ac3215ea773a4145945a270291c751f66dcbe3 Mon Sep 17 00:00:00 2001 From: Fabian-Lars Date: Thu, 10 Feb 2022 02:11:00 +0100 Subject: [PATCH] feat(cli.js): rewrite cli.js with napi-rs, closes #2651,#3287 (#3370) Co-authored-by: Chip Reed Co-authored-by: Lucas Nogueira --- .changes/config.json | 14 +- .github/CODEOWNERS | 2 +- .github/CONTRIBUTING.md | 15 +- .github/workflows/artifacts-updater.yml | 12 +- .github/workflows/audit.yml | 2 +- .github/workflows/build-smoke-tests.yml | 12 +- .../workflows/covector-version-or-publish.yml | 10 + .github/workflows/js-lint.yml | 21 +- .github/workflows/publish-cli.yml | 416 ++++++++++++++++ .github/workflows/test-core.yml | 11 +- .github/workflows/test-cta.yml | 8 +- .gitignore | 6 - .husky/pre-commit | 7 +- .scripts/setup.ps1 | 4 +- .scripts/setup.sh | 6 +- ARCHITECTURE.md | 4 +- README.md | 2 +- core/tauri/Cargo.toml | 2 +- examples/api/package.json | 4 +- examples/commands/package.json | 4 +- examples/helloworld/package.json | 4 +- examples/isolation/package.json | 4 +- examples/multiwindow/package.json | 4 +- examples/navigation/package.json | 4 +- examples/resources/package.json | 4 +- examples/sidecar/package.json | 4 +- examples/splashscreen/package.json | 4 +- examples/state/package.json | 2 +- examples/streaming/package.json | 4 +- examples/updater/package.json | 4 +- maskfile.md | 197 -------- package.json | 5 +- renovate.json | 2 +- tooling/bundler/Cargo.toml | 1 + tooling/bundler/src/bundle/common.rs | 18 +- .../src/bundle/linux/templates/appimage | 8 +- tooling/bundler/src/lib.rs | 12 + tooling/cli.js/README.md | 46 +- tooling/cli.rs/Cargo.lock | 132 ++++- tooling/cli.rs/Cargo.toml | 9 +- tooling/cli.rs/node/.cargo/config.toml | 7 + .../node/.github-example/workflows/CI.yml | 469 ++++++++++++++++++ tooling/cli.rs/node/.gitignore | 2 + tooling/cli.rs/node/.npmignore | 10 + tooling/cli.rs/node/Cargo.toml | 16 + tooling/cli.rs/node/README.md | 45 ++ tooling/cli.rs/node/build.rs | 7 + tooling/cli.rs/node/index.d.ts | 12 + tooling/cli.rs/node/index.js | 241 +++++++++ .../cli.rs/node/npm/darwin-arm64/README.md | 3 + .../cli.rs/node/npm/darwin-arm64/package.json | 21 + tooling/cli.rs/node/npm/darwin-x64/README.md | 3 + .../cli.rs/node/npm/darwin-x64/package.json | 21 + .../node/npm/linux-arm-gnueabihf/README.md | 3 + .../node/npm/linux-arm-gnueabihf/package.json | 21 + .../cli.rs/node/npm/linux-arm64-gnu/README.md | 3 + .../node/npm/linux-arm64-gnu/package.json | 21 + .../node/npm/linux-arm64-musl/README.md | 3 + .../node/npm/linux-arm64-musl/package.json | 21 + .../cli.rs/node/npm/linux-x64-gnu/README.md | 3 + .../node/npm/linux-x64-gnu/package.json | 21 + .../cli.rs/node/npm/linux-x64-musl/README.md | 3 + .../node/npm/linux-x64-musl/package.json | 21 + .../cli.rs/node/npm/win32-x64-msvc/README.md | 3 + .../node/npm/win32-x64-msvc/package.json | 21 + tooling/cli.rs/node/package.json | 59 +++ tooling/cli.rs/node/src/lib.rs | 10 + tooling/cli.rs/node/tauri.js | 50 ++ tooling/cli.rs/node/yarn.lock | 13 + tooling/cli.rs/schema.json | 16 +- tooling/cli.rs/src/build.rs | 44 +- tooling/cli.rs/src/dev.rs | 10 +- tooling/cli.rs/src/helpers/mod.rs | 24 - tooling/cli.rs/src/interface/rust.rs | 15 +- tooling/cli.rs/src/lib.rs | 104 ++++ tooling/cli.rs/src/main.rs | 102 +--- tooling/create-tauri-app/src/index.ts | 8 +- tooling/create-tauri-app/test/spawn.test.mjs | 4 +- 78 files changed, 1971 insertions(+), 519 deletions(-) create mode 100644 .github/workflows/publish-cli.yml delete mode 100644 maskfile.md create mode 100644 tooling/cli.rs/node/.cargo/config.toml create mode 100644 tooling/cli.rs/node/.github-example/workflows/CI.yml create mode 100644 tooling/cli.rs/node/.gitignore create mode 100644 tooling/cli.rs/node/.npmignore create mode 100644 tooling/cli.rs/node/Cargo.toml create mode 100644 tooling/cli.rs/node/README.md create mode 100644 tooling/cli.rs/node/build.rs create mode 100644 tooling/cli.rs/node/index.d.ts create mode 100644 tooling/cli.rs/node/index.js create mode 100644 tooling/cli.rs/node/npm/darwin-arm64/README.md create mode 100644 tooling/cli.rs/node/npm/darwin-arm64/package.json create mode 100644 tooling/cli.rs/node/npm/darwin-x64/README.md create mode 100644 tooling/cli.rs/node/npm/darwin-x64/package.json create mode 100644 tooling/cli.rs/node/npm/linux-arm-gnueabihf/README.md create mode 100644 tooling/cli.rs/node/npm/linux-arm-gnueabihf/package.json create mode 100644 tooling/cli.rs/node/npm/linux-arm64-gnu/README.md create mode 100644 tooling/cli.rs/node/npm/linux-arm64-gnu/package.json create mode 100644 tooling/cli.rs/node/npm/linux-arm64-musl/README.md create mode 100644 tooling/cli.rs/node/npm/linux-arm64-musl/package.json create mode 100644 tooling/cli.rs/node/npm/linux-x64-gnu/README.md create mode 100644 tooling/cli.rs/node/npm/linux-x64-gnu/package.json create mode 100644 tooling/cli.rs/node/npm/linux-x64-musl/README.md create mode 100644 tooling/cli.rs/node/npm/linux-x64-musl/package.json create mode 100644 tooling/cli.rs/node/npm/win32-x64-msvc/README.md create mode 100644 tooling/cli.rs/node/npm/win32-x64-msvc/package.json create mode 100644 tooling/cli.rs/node/package.json create mode 100644 tooling/cli.rs/node/src/lib.rs create mode 100755 tooling/cli.rs/node/tauri.js create mode 100644 tooling/cli.rs/node/yarn.lock create mode 100644 tooling/cli.rs/src/lib.rs diff --git a/.changes/config.json b/.changes/config.json index 3d2f4e37d..e36973c60 100644 --- a/.changes/config.json +++ b/.changes/config.json @@ -255,22 +255,18 @@ "postversion": "node ../../.scripts/covector/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }" }, "cli.js": { - "path": "./tooling/cli.js", + "path": "./tooling/cli.rs/node", "manager": "javascript", "dependencies": ["cli.rs"], "postversion": "node ../../.scripts/covector/sync-cli-metadata.js ${ pkg.pkg } ${ release.type }", - "assets": [ - { - "path": "./tooling/cli.js/tauri-apps-cli-${ pkgFile.version }.tgz", - "name": "cli.js-${ pkgFile.version }.tgz" - } - ] + "prepublish": [], + "publish": [], + "postpublish": [] }, "cli.rs": { "path": "./tooling/cli.rs", "manager": "rust", - "dependencies": ["tauri-bundler", "tauri-utils"], - "postversion": "node ../../.scripts/covector/generate-cli-doc.js && node ../../.scripts/covector/generate-config-doc.js && cargo check" + "dependencies": ["tauri-bundler", "tauri-utils"] }, "create-tauri-app": { "path": "./tooling/create-tauri-app", diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b141445ba..66cbbae91 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -19,6 +19,6 @@ /tooling/cli.rs/ @tauri-apps/core -/tooling/cli.js/ @tauri-apps/js-cli +/tooling/cli.rs/node/ @tauri-apps/js-cli /core/** @tauri-apps/core diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 23db4dfa1..382d254e5 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -49,7 +49,7 @@ Hi! We, the maintainers, are really excited that you are interested in contribut First, [join our Discord server](https://discord.gg/SpmNs4S) and let us know that you want to contribute. This way we can point you in the right direction and help ensure your contribution will be as helpful as possible. -To set up your machine for development, follow the [Tauri setup guide](https://tauri.studio/en/docs/get-started/intro#setting-up-your-environment) to get all the tools you need to develop Tauri apps. The only additional tool you may need is [Yarn](https://yarnpkg.com/), it is only required if you are developing the Node CLI/API (`tooling/cli.js` and `api`). Next, fork and clone this repo. It is structured as a monorepo, which means that all the various Tauri packages are under the same repository. The development process varies depending on what part of Tauri you are contributing to, see the guides below for per-package instructions. +To set up your machine for development, follow the [Tauri setup guide](https://tauri.studio/en/docs/get-started/intro#setting-up-your-environment) to get all the tools you need to develop Tauri apps. The only additional tool you may need is [Yarn](https://yarnpkg.com/), it is only required if you are developing the Node CLI or API packages (`tooling/cli.rs/node` and `tooling/api`). Next, fork and clone this repo. It is structured as a monorepo, which means that all the various Tauri packages are under the same repository. The development process varies depending on what part of Tauri you are contributing to, see the guides below for per-package instructions. Some Tauri packages will be automatically built when running one of the examples. Others, however, will need to be built beforehand. To build these automatically, run the `.scripts/setup.sh` (Linux and macOS) or `.scripts/setup.ps1` (Windows) script. This will install the Rust and Node.js CLI and build the JS API. After that, you should be able to run all the examples. Note that the setup script should be executed from the root folder of the respository in order to run correctly. @@ -57,23 +57,14 @@ Some Tauri packages will be automatically built when running one of the examples - The JS API (`/tooling/api`) contains JS bindings to the builtin Rust functions in the Rust API. - The Rust CLI (`/tooling/cli.rs`) is the primary CLI for creating and developing Tauri apps. -- cli.js (`/tooling/cli.js`) is a Node.js CLI wrapper for `cli.rs`. +- cli.js (`/tooling/cli.rs/node`) is a Node.js CLI wrapper for `cli.rs`. - Tauri Bundler (`/tooling/bundler`) is used by the Rust CLI to package executables into installers. - Tauri Core (`/core/tauri`) is the heart of Tauri. It contains the code that starts the app, configures communication between Rust and the Webview, and ties all the other packages together. - The Macros (`/core/tauri-macros`) are used by Tauri Core for various functions. ### Developing The Node.js CLI (cli.js) -`cli.js` is a CLI tool that houses the `icon`, and `deps` command. The code for cli.js is located in `[Tauri repo root]/tooling/cli.js`. There are a few package scripts you should be aware of: - -- `build` builds the CLI -- `test` runs the unit and e2e test suite -- `lint` runs ESLint to catch linting errors -- `format` formats code with Prettier to match the style guide - -To test your changes, we recommend using the helloworld example app, located in `[Tauri repo root]/examples/helloworld`. Run `yarn tauri [COMMAND]` to run a command using your local cli.js copy. You will need to rebuild cli.js after every change by running `yarn build` in the cli.js directory. - -If you want to use your local copy of cli.js in another app, we recommend using [yarn link](https://classic.yarnpkg.com/en/docs/cli/link/). First, make sure you have don't have cli.js installed globally by running `npm uninstall -g tauri && yarn global remove tauri`. Then, run `yarn link` in the cli.js directory (note that the setup script will do this for you, so you can skip this step if you ran that). Now, you can just run `tauri [COMMAND]` anywhere, and your local copy will be used. +`cli.js` is a wrapper to `cli.rs` so most changes should be written on the Rust CLI. The `[Tauri repo root]/tooling/cli.rs/node` folder contains only packaging scripts to properly publish the Rust CLI binaries to NPM. ### Developing Tauri Bundler and Rust CLI diff --git a/.github/workflows/artifacts-updater.yml b/.github/workflows/artifacts-updater.yml index 7943e0c30..8508333d4 100644 --- a/.github/workflows/artifacts-updater.yml +++ b/.github/workflows/artifacts-updater.yml @@ -90,12 +90,8 @@ jobs: ${{ matrix.platform }}-stable-cargo-cli-${{ hashFiles('tooling/cli.rs/Cargo.lock') }} ${{ matrix.platform }}-stable-cargo-cli- - - name: install cli deps via yarn - working-directory: ./tooling/cli.js - run: yarn - - name: build cli - working-directory: ./tooling/cli.js - run: yarn build + - name: build and install cli.rs + run: cargo install --path tooling/cli.rs - name: Check whether code signing should be enabled id: enablecodesigning env: @@ -109,7 +105,7 @@ jobs: working-directory: ./examples/updater run: | yarn install - node ../../tooling/cli.js/bin/tauri build + cargo tauri build env: # Notarization (disabled) # FIXME: enable only on `dev` push maybe? as it take some times... @@ -129,7 +125,7 @@ jobs: working-directory: ./examples/updater run: | yarn install - node ../../tooling/cli.js/bin/tauri build + cargo tauri build env: TAURI_PRIVATE_KEY: dW50cnVzdGVkIGNvbW1lbnQ6IHJzaWduIGVuY3J5cHRlZCBzZWNyZXQga2V5ClJXUlRZMEl5YTBGV3JiTy9lRDZVd3NkL0RoQ1htZmExNDd3RmJaNmRMT1ZGVjczWTBKZ0FBQkFBQUFBQUFBQUFBQUlBQUFBQWdMekUzVkE4K0tWQ1hjeGt1Vkx2QnRUR3pzQjVuV0ZpM2czWXNkRm9hVUxrVnB6TUN3K1NheHJMREhQbUVWVFZRK3NIL1VsMDBHNW5ET1EzQno0UStSb21nRW4vZlpTaXIwZFh5ZmRlL1lSN0dKcHdyOUVPclVvdzFhVkxDVnZrbHM2T1o4Tk1NWEU9Cg== # upload assets diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 37f1a7f16..b2897c1bf 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -30,5 +30,5 @@ jobs: steps: - uses: actions/checkout@v2 - name: yarn audit - working-directory: tooling/cli.js + working-directory: tooling/cli.rs/node run: yarn audit diff --git a/.github/workflows/build-smoke-tests.yml b/.github/workflows/build-smoke-tests.yml index a3c7557ac..ea0d91692 100644 --- a/.github/workflows/build-smoke-tests.yml +++ b/.github/workflows/build-smoke-tests.yml @@ -71,15 +71,8 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf - - name: yarn install for cli - working-directory: tauri/tooling/cli.js - run: yarn - - name: build cli.js - working-directory: tauri/tooling/cli.js - run: | - yarn build-release - yarn global add $PWD - echo "::add-path::$(yarn global bin)" + - name: build and install cli.rs + run: cargo install --path tauri/tooling/cli.rs - name: install and build assets working-directory: "example/${{ github.event.inputs.dir }}" run: ${{ github.event.inputs.buildAssets }} @@ -88,6 +81,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: + tauriScript: cargo tauri includeDebug: true projectPath: "example/${{ github.event.inputs.dir }}" preferGlobal: true diff --git a/.github/workflows/covector-version-or-publish.yml b/.github/workflows/covector-version-or-publish.yml index 1372c53ec..a5fd020a1 100644 --- a/.github/workflows/covector-version-or-publish.yml +++ b/.github/workflows/covector-version-or-publish.yml @@ -80,3 +80,13 @@ jobs: token: ${{ secrets.TAURI_BOT_PAT }} repository: tauri-apps/tauri-docs event-type: update-docs + + - name: Trigger cli.js publishing workflow + if: | + steps.covector.outputs.successfulPublish == 'true' && + contains(steps.covector.outputs.packagesPublished, 'tauri-cli') + uses: peter-evans/repository-dispatch@v1 + with: + token: ${{ secrets.TAURI_BOT_PAT }} + repository: tauri-apps/tauri + event-type: publish-clijs diff --git a/.github/workflows/js-lint.yml b/.github/workflows/js-lint.yml index 74eea75bf..da3fe8381 100644 --- a/.github/workflows/js-lint.yml +++ b/.github/workflows/js-lint.yml @@ -7,10 +7,10 @@ name: eslint check on: pull_request: paths: - - ".github/workflows/js-lint.yml" - - "tooling/cli.js/**" - - "tooling/api/**" - - "tooling/create-tauri-app/**" + - '.github/workflows/js-lint.yml' + - 'tooling/cli.rs/node/**' + - 'tooling/api/**' + - 'tooling/create-tauri-app/**' jobs: eslint-check: @@ -19,17 +19,18 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: "12" + node-version: '12' cache: yarn cache-dependency-path: tooling/*/yarn.lock - name: install cli.js deps via yarn - working-directory: ./tooling/cli.js/ + working-directory: ./tooling/cli.rs/node/ run: yarn - - name: run cli.js lint - working-directory: ./tooling/cli.js/ - run: yarn lint + # nothing to lint + #- name: run cli.js lint + # working-directory: ./tooling/cli.rs/node/ + # run: yarn lint - name: run cli.js format - working-directory: ./tooling/cli.js/ + working-directory: ./tooling/cli.rs/node/ run: yarn format:check - name: install api deps via yarn diff --git a/.github/workflows/publish-cli.yml b/.github/workflows/publish-cli.yml new file mode 100644 index 000000000..d9d22b947 --- /dev/null +++ b/.github/workflows/publish-cli.yml @@ -0,0 +1,416 @@ +name: publish cli.js +env: + DEBUG: napi:* + APP_NAME: cli + MACOSX_DEPLOYMENT_TARGET: '10.13' +'on': + workflow_dispatch: + repository_dispatch: + types: [publish-clijs] + +defaults: + run: + working-directory: tooling/cli.rs/node/ + +jobs: + build: + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + architecture: x64 + build: | + yarn build + strip -x *.node + - host: windows-latest + build: yarn build + target: x86_64-pc-windows-msvc + architecture: x64 + - host: ubuntu-18.04 + target: x86_64-unknown-linux-gnu + architecture: x64 + docker: | + docker pull $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian + docker tag $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian builder + build: | + docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd)/../../../:/build -w /build builder sh -c "cd tooling/cli.rs/node && yarn build && strip *.node" + - host: ubuntu-18.04 + target: x86_64-unknown-linux-musl + architecture: x64 + docker: | + docker pull $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine + docker tag $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine builder + build: docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd)/../../../:/build -w /build builder sh -c "cd tooling/cli.rs/node && yarn build && strip *.node" + - host: macos-latest + target: aarch64-apple-darwin + build: | + yarn build --target=aarch64-apple-darwin + strip -x *.node + - host: ubuntu-18.04 + architecture: x64 + target: aarch64-unknown-linux-gnu + setup: | + sudo apt-get update + sudo apt-get install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu -y + build: | + yarn build --target=aarch64-unknown-linux-gnu + aarch64-linux-gnu-strip *.node + - host: ubuntu-18.04 + architecture: x64 + target: armv7-unknown-linux-gnueabihf + setup: | + sudo apt-get update + sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y + build: | + yarn build --target=armv7-unknown-linux-gnueabihf + arm-linux-gnueabihf-strip *.node + - host: ubuntu-18.04 + architecture: x64 + target: aarch64-unknown-linux-musl + downloadTarget: aarch64-unknown-linux-musl + docker: | + docker pull ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + docker tag ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine builder + build: | + docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd)/../../../:/build -w /build builder sh -c "cd tooling/cli.rs/node && yarn build --target=aarch64-unknown-linux-musl && /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node" + #- host: windows-latest + # architecture: x64 + # target: aarch64-pc-windows-msvc + # build: yarn build --target aarch64-pc-windows-msvc + name: stable - ${{ matrix.settings.target }} - node@16 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: 16 + check-latest: true + cache: yarn + cache-dependency-path: 'tooling/cli.rs/node/yarn.lock' + architecture: ${{ matrix.settings.architecture }} + - name: Install + uses: actions-rs/toolchain@v1 + with: + profile: minimal + override: true + toolchain: stable + target: ${{ matrix.settings.target }} + # should be committed + #- name: Generate Cargo.lock + # uses: actions-rs/cargo@v1 + # with: + # command: generate-lockfile + - uses: Swatinem/rust-cache@v1 + with: + key: ${{ matrix.settings.target }} + working-directory: 'tooling/cli.rs/' + - name: Pull latest image + run: ${{ matrix.settings.docker }} + env: + DOCKER_REGISTRY_URL: ghcr.io + if: ${{ matrix.settings.docker }} + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Build + run: ${{ matrix.settings.build }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: bindings-${{ matrix.settings.target }} + path: tooling/cli.rs/node/${{ env.APP_NAME }}.*.node + if-no-files-found: error + # build-freebsd: + # runs-on: macos-10.15 + # name: Build FreeBSD + # steps: + # - uses: actions/checkout@v2 + # - name: Build + # id: build + # uses: vmactions/freebsd-vm@v0.1.5 + # env: + # DEBUG: napi:* + # RUSTUP_HOME: /usr/local/rustup + # CARGO_HOME: /usr/local/cargo + # RUSTUP_IO_THREADS: 1 + # with: + # envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS + # usesh: true + # mem: 3000 + # prepare: | + # pkg install -y curl node14 python2 + # curl -qL https://www.npmjs.com/install.sh | sh + # npm install -g yarn + # curl https://sh.rustup.rs -sSf --output rustup.sh + # sh rustup.sh -y --profile minimal --default-toolchain stable + # export PATH="/usr/local/cargo/bin:$PATH" + # echo "~~~~ rustc --version ~~~~" + # rustc --version + # echo "~~~~ node -v ~~~~" + # node -v + # echo "~~~~ yarn --version ~~~~" + # yarn --version + # run: | + # export PATH="/usr/local/cargo/bin:$PATH" + # pwd + # ls -lah + # whoami + # env + # freebsd-version + # cd ./tooling/cli.rs/node/ + # yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + # yarn build + # strip -x *.node + # rm -rf node_modules + # rm -rf ../target + # - name: Upload artifact + # uses: actions/upload-artifact@v2 + # with: + # name: bindings-freebsd + # path: tooling/cli.rs/node/${{ env.APP_NAME }}.*.node + # if-no-files-found: error + test-macOS-windows-binding: + name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + settings: + - host: windows-latest + target: x86_64-pc-windows-msvc + node: + - '12' + - '14' + - '16' + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + cache-dependency-path: 'tooling/cli.rs/node/yarn.lock' + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-${{ matrix.settings.target }} + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: yarn test + test-linux-x64-gnu-binding: + name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + cache-dependency-path: 'tooling/cli.rs/node/yarn.lock' + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-x86_64-unknown-linux-gnu + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: yarn test + test-linux-x64-musl-binding: + name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + cache-dependency-path: 'tooling/cli.rs/node/yarn.lock' + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-x86_64-unknown-linux-musl + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine sh -c "yarn test" + test-linux-aarch64-gnu-binding: + name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + working-directory: ${{ github.workspace }} + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-aarch64-unknown-linux-gnu + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/napi-rs/napi-rs/nodejs:aarch64-${{ matrix.node }} + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + sh -c "cd tooling/cli.rs/node && yarn test" + ls -la + test-linux-aarch64-musl-binding: + name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + working-directory: ${{ github.workspace }} + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-aarch64-unknown-linux-musl + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: multiarch/alpine:aarch64-latest-stable + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + apk add nodejs npm yarn + sh -c "cd tooling/cli.rs/node && yarn test" + test-linux-arm-gnueabihf-binding: + name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + working-directory: ${{ github.workspace }} + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-armv7-unknown-linux-gnueabihf + path: 'tooling/cli.rs/node/' + - name: List packages + run: ls -R . + shell: bash + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/napi-rs/napi-rs/nodejs:armhf-${{ matrix.node }} + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + sh -c "cd tooling/cli.rs/node && yarn test" + ls -la + publish: + name: Publish + runs-on: ubuntu-latest + needs: + #- build-freebsd + - test-macOS-windows-binding + - test-linux-x64-gnu-binding + #- test-linux-x64-musl-binding + #- test-linux-aarch64-gnu-binding + #- test-linux-aarch64-musl-binding + #- test-linux-arm-gnueabihf-binding + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: 16 + check-latest: true + cache: yarn + cache-dependency-path: 'tooling/cli.rs/node/yarn.lock' + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download all artifacts + uses: actions/download-artifact@v2 + with: + path: tooling/cli.rs/node/artifacts + - name: Move artifacts + run: yarn artifacts + - name: List packages + run: ls -R ./npm + shell: bash + - name: Publish + run: | + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test-core.yml b/.github/workflows/test-core.yml index 26d09e3fa..da5a5b90c 100644 --- a/.github/workflows/test-core.yml +++ b/.github/workflows/test-core.yml @@ -170,7 +170,7 @@ jobs: with: node-version: 14 cache: yarn - cache-dependency-path: tooling/cli.js/yarn.lock + cache-dependency-path: tooling/cli.rs/node/yarn.lock - name: install webkit2gtk (ubuntu only) if: matrix.platform == 'ubuntu-latest' run: | @@ -221,7 +221,7 @@ jobs: - name: Cache template cargo target uses: actions/cache@v2 with: - path: tooling/cli.js/test/jest/fixtures/empty/src-tauri/target + path: tooling/cli.rs/node/test/jest/fixtures/empty/src-tauri/target # Add date to the cache to keep it up to date key: ${{ matrix.platform }}-stable-template-${{ hashFiles('tooling/cli.rs/templates/app/**') }}-${{ env.CURRENT_DATE }} # Restore from outdated cache for speed @@ -232,10 +232,7 @@ jobs: - name: test timeout-minutes: 30 run: | - cd ./tooling/cli.js + cd ./tooling/cli.rs/node yarn + yarn build yarn test - - name: run release build - timeout-minutes: 15 - working-directory: tooling/cli.js - run: yarn build-release diff --git a/.github/workflows/test-cta.yml b/.github/workflows/test-cta.yml index 9e8a90d50..41cc5e1c9 100644 --- a/.github/workflows/test-cta.yml +++ b/.github/workflows/test-cta.yml @@ -46,10 +46,10 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf - - run: yarn - working-directory: tooling/cli.js - - run: yarn build - working-directory: tooling/cli.js + #- run: yarn + # working-directory: tooling/cli.rs/node + #- run: yarn build + # working-directory: tooling/cli.rs/node - run: yarn working-directory: tooling/api - run: yarn build diff --git a/.gitignore b/.gitignore index bb5f76f11..cc1a831a3 100644 --- a/.gitignore +++ b/.gitignore @@ -77,12 +77,6 @@ target /tooling/bench/tests/Cargo.lock /yarn.lock -/tooling/cli.js/test/jest/tmp - -# doing this because of how our tests currently (naively) drop the tauri.conf.js in that folder -# todo: needs a proper fic -/tooling/cli.js/tauri.conf.js - # ignore frida handlers __handlers__/ diff --git a/.husky/pre-commit b/.husky/pre-commit index 1f5cbfeee..64a08ff1d 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -15,13 +15,12 @@ else cd ../.. fi -if [ -z "$(git diff --name-only tooling/cli.js)" ]; then +if [ -z "$(git diff --name-only tooling/cli.rs/node)" ]; then echo "skipping cli.js - no changes detected" else - cd tooling/cli.js + cd tooling/cli.rs/node yarn format - yarn lint-fix - cd ../.. + cd ../../.. fi if [ -z "$(git diff --name-only tooling/create-tauri-app)" ]; then diff --git a/.scripts/setup.ps1 b/.scripts/setup.ps1 index 29b9525da..445c64da0 100644 --- a/.scripts/setup.ps1 +++ b/.scripts/setup.ps1 @@ -21,9 +21,9 @@ $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) $result = $host.ui.PromptForChoice("Node.js CLI", "Do you want to install the Node.js CLI?", $options, 1) switch ($result) { 0{ - cd tooling\cli.js + cd tooling\cli.rs/node yarn; yarn build; yarn link cd ..\.. - echo "Tauri Node.js CLI installed. Run it with '$ tauri [COMMAND]'" + echo "Tauri Node.js CLI installed. use `yarn link @tauri-apps/cli` and run it with '$ yarn tauri [COMMAND]'." } } diff --git a/.scripts/setup.sh b/.scripts/setup.sh index cb8f2879a..fbabfde62 100755 --- a/.scripts/setup.sh +++ b/.scripts/setup.sh @@ -18,10 +18,10 @@ echo "Do you want to install the Node.js CLI?" select yn in "Yes" "No"; do case $yn in Yes ) - cd tooling/cli.js + cd tooling/cli.rs/node yarn && yarn build && yarn link - cd ../.. - echo "Tauri Node.js CLI installed. Run it with '$ tauri [COMMAND]'." + cd ../../.. + echo "Tauri Node.js CLI installed. use `yarn link @tauri-apps/cli` and run it with '$ yarn tauri [COMMAND]'." break;; No ) break;; esac diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 8cfc962d8..4af347927 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -44,8 +44,8 @@ A typescript library that creates `cjs` and `esm` Javascript endpoints for you t #### [bundler](https://github.com/tauri-apps/tauri/tree/dev/tooling/bundler) [RUST / SHELL] The bundler is a library that builds a Tauri App for the platform triple it detects / is told. At the moment it currently supports macOS, Windows and Linux - but in the near future will support mobile platforms as well. May be used outside of Tauri projects. -#### [cli.js](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.js) [JS] -Written in Typescript and packaged such that it can be used with `npm`, `pnpm`, and `yarn`, this library provides a node.js runner for common tasks when using Tauri, like `yarn tauri dev`. For the most part it is a wrapper around [cli.rs](https://github.com/tauri-apps/tauri/blob/dev/tooling/cli.rs). +#### [cli.js](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.rs/node) [JS] +It is a wrapper around [cli.rs](https://github.com/tauri-apps/tauri/blob/dev/tooling/cli.rs) using [napi-rs](https://github.com/napi-rs/napi-rs) to produce NPM packages for each platform. #### [cli.rs](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.rs) [RUST] This rust executable provides the full interface to all of the required activities for which the CLI is required. It will run on macOS, Windows, and Linux. diff --git a/README.md b/README.md index 0ecea7ad1..5d3d748f3 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ | Component | Description | Version | Lin | Win | Mac | | --------------------------------------------------------------------------------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --- | --- | --- | | [**cli.rs**](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.rs) | create, develop and build apps | [![](https://img.shields.io/crates/v/tauri-cli.svg)](https://crates.io/crates/tauri-cli) | ✅ | ✅ | ✅ | -| [**cli.js**](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.js) | Node.js CLI wrapper for cli.rs | [![](https://img.shields.io/npm/v/@tauri-apps/cli.svg)](https://www.npmjs.com/package/@tauri-apps/cli) | ✅ | ✅ | ✅ | +| [**cli.js**](https://github.com/tauri-apps/tauri/tree/dev/tooling/cli.rs/node) | Node.js CLI wrapper for cli.rs | [![](https://img.shields.io/npm/v/@tauri-apps/cli.svg)](https://www.npmjs.com/package/@tauri-apps/cli) | ✅ | ✅ | ✅ | | [**api.js**](https://github.com/tauri-apps/tauri/tree/dev/tooling/api) | JS API for interaction with Rust backend | [![](https://img.shields.io/npm/v/@tauri-apps/api.svg)](https://www.npmjs.com/package/@tauri-apps/api) | ✅ | ✅ | ✅ | | [**create-tauri-app**](https://github.com/tauri-apps/tauri/tree/dev/tooling/create-tauri-app) | Get started with your first Tauri app | [![](https://img.shields.io/npm/v/create-tauri-app.svg)](https://www.npmjs.com/package/create-tauri-app) | ✅ | ✅ | ✅ | | [**vue-cli-plugin-tauri**](https://github.com/tauri-apps/vue-cli-plugin-tauri/) | Vue CLI plugin for Tauri | [![](https://img.shields.io/npm/v/vue-cli-plugin-tauri.svg)](https://www.npmjs.com/package/vue-cli-plugin-tauri) | ✅ | ✅ | ✅ | diff --git a/core/tauri/Cargo.toml b/core/tauri/Cargo.toml index 03d3bbdbd..02f1188e9 100644 --- a/core/tauri/Cargo.toml +++ b/core/tauri/Cargo.toml @@ -100,7 +100,7 @@ tokio-test = "0.4.2" tokio = { version = "1.16", features = [ "full" ] } [target."cfg(windows)".dev-dependencies.windows] -version = "0.32.0" +version = "0.30.0" features = [ "Win32_Foundation", ] diff --git a/examples/api/package.json b/examples/api/package.json index 8032a0742..51b706c4c 100644 --- a/examples/api/package.json +++ b/examples/api/package.json @@ -6,7 +6,7 @@ "dev": "vite --clearScreen false --port 5000", "build": "vite build", "serve": "vite preview", - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" }, "dependencies": { "@tauri-apps/api": "../../tooling/api/dist", @@ -17,4 +17,4 @@ "@sveltejs/vite-plugin-svelte": "^1.0.0-next.11", "vite": "^2.6.4" } -} +} \ No newline at end of file diff --git a/examples/commands/package.json b/examples/commands/package.json index 5c7a0e038..6d5a249e0 100644 --- a/examples/commands/package.json +++ b/examples/commands/package.json @@ -2,6 +2,6 @@ "name": "state", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/examples/helloworld/package.json b/examples/helloworld/package.json index 03c879d0e..21a0feccb 100644 --- a/examples/helloworld/package.json +++ b/examples/helloworld/package.json @@ -2,6 +2,6 @@ "name": "hello-world", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/examples/isolation/package.json b/examples/isolation/package.json index 022f42425..4dfcd42a0 100644 --- a/examples/isolation/package.json +++ b/examples/isolation/package.json @@ -2,9 +2,9 @@ "name": "isolation", "license": "Apache-2.0 OR MIT", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" }, "dependencies": { "@tauri-apps/api": "../../tooling/api/dist" } -} +} \ No newline at end of file diff --git a/examples/multiwindow/package.json b/examples/multiwindow/package.json index 67de63845..d82cadfa5 100644 --- a/examples/multiwindow/package.json +++ b/examples/multiwindow/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" }, "private": true -} +} \ No newline at end of file diff --git a/examples/navigation/package.json b/examples/navigation/package.json index baab4dca6..359fc20c4 100644 --- a/examples/navigation/package.json +++ b/examples/navigation/package.json @@ -2,6 +2,6 @@ "name": "navigation", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/examples/resources/package.json b/examples/resources/package.json index 47da863d4..90eb5c4c2 100644 --- a/examples/resources/package.json +++ b/examples/resources/package.json @@ -2,6 +2,6 @@ "name": "resources", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/examples/sidecar/package.json b/examples/sidecar/package.json index e74398ca6..eee63d6a4 100644 --- a/examples/sidecar/package.json +++ b/examples/sidecar/package.json @@ -8,11 +8,11 @@ ] }, "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri", + "tauri": "node ../../tooling/cli.rs/node/tauri.js", "package": "pkg package.json --output src-tauri/binaries/app && node scripts/move-binary.js" }, "devDependencies": { "execa": "5.1.1", "pkg": "5.2.1" } -} +} \ No newline at end of file diff --git a/examples/splashscreen/package.json b/examples/splashscreen/package.json index 625742787..6c636d443 100644 --- a/examples/splashscreen/package.json +++ b/examples/splashscreen/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" }, "private": true -} +} \ No newline at end of file diff --git a/examples/state/package.json b/examples/state/package.json index 03c879d0e..f4e2f37e0 100644 --- a/examples/state/package.json +++ b/examples/state/package.json @@ -2,6 +2,6 @@ "name": "hello-world", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "ncargo tauri" } } diff --git a/examples/streaming/package.json b/examples/streaming/package.json index 390bf1567..687b246bc 100644 --- a/examples/streaming/package.json +++ b/examples/streaming/package.json @@ -2,6 +2,6 @@ "name": "streaming", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/examples/updater/package.json b/examples/updater/package.json index b8f24273d..14963d706 100644 --- a/examples/updater/package.json +++ b/examples/updater/package.json @@ -2,6 +2,6 @@ "name": "updater", "version": "1.0.0", "scripts": { - "tauri": "node ../../tooling/cli.js/bin/tauri" + "tauri": "node ../../tooling/cli.rs/node/tauri.js" } -} +} \ No newline at end of file diff --git a/maskfile.md b/maskfile.md deleted file mode 100644 index 774505fd7..000000000 --- a/maskfile.md +++ /dev/null @@ -1,197 +0,0 @@ -# Shorthand Commands - - - -## prepare - -> Setup all stuff needed for running the smoke tests - -```sh -git clone --recursive git@github.com:tauri-apps/smoke-tests.git \ -|| (cd smoke-tests && git pull origin dev; cd ..) # always prepare up-to-date smoke tests in case it's already available - -cargo build --lib -cargo install --locked trunk --force # used by rust/yew - -. .scripts/setup.sh -``` - -```powershell -# Setup Environment to execute in the tauri directory. -$CWD = [Environment]::CurrentDirectory -Push-Location $MyInvocation.MyCommand.Path -[Environment]::CurrentDirectory = $PWD -# send git stderr to powershell stdout -$env:GIT_REDIRECT_STDERR = '2>&1' - -# if the smoke-tests path doesn't exist. -if (-Not (Test-Path $CWD\smoke-tests -PathType Any)) { - Start-Job -ScriptBlock { - # Setup Environment to execute in the tauri directory. - $CWD = [Environment]::CurrentDirectory - Push-Location $MyInvocation.MyCommand.Path - [Environment]::CurrentDirectory = $PWD - - #clone the smoke-tests repo into the smoke-tests folder - git clone --recursive https://github.com/tauri-apps/smoke-tests.git $CWD\smoke-tests - } | Receive-Job -AutoRemoveJob -Wait -} - -# Enter the smoke-tests folder and pull the latest data from origin/dev -cd smoke-tests; git pull origin dev; cd .. - -# build and install everything Rust related. -cargo build --lib -cargo install --locked trunk --force - -. .scripts/setup.ps1 -``` - -## run - -![tauri-mask-run-smoke-test](https://user-images.githubusercontent.com/4953069/75866011-00ed8600-5e37-11ea-9106-3cb104a05f80.gif) - -### run smoke-test (name) - -> Run specific smoketest in dev mode - -```sh -shopt -s globstar - -cd smoke-tests/**/$name 2>/dev/null \ -|| cd smoke-tests/**/$name/$name # workaround for rust/yew/todomvc/todomvc - -case "$PWD" in -*/node/*) - yarn && yarn tauri:dev -;; -*/rust/*) - cargo web deploy - [ $name = `basename $(dirname $PWD)` ] && cd .. - - yarn add tauri@link:../../../tooling/cli.js - yarn && yarn tauri dev -;; -*) - echo unknown project $(dirname $name)/$name -;; -esac -``` - -```powershell -param( - [string] $smoke_test_name -) - -# Setup Environment to execute in the tauri directory. -$CWD = [Environment]::CurrentDirectory -Push-Location $MyInvocation.MyCommand.Path -[Environment]::CurrentDirectory = $PWD - -# get the example paths. -$smoke_test_path = Get-ChildItem smoke-tests\*\*\$env:name - -# if the example path is null get the todomvc path. -if ($smoke_test_path -eq $null) { - $smoke_test_path = Get-ChildItem smoke-tests\*\*\*\$env:name\$env:name -} - -# if the example path is still null get the helloworld example path. -if ($smoke_test_path -eq $null) { - $smoke_test_path = Get-ChildItem smoke-tests\tauri\*\$env:name -} - -# switch on the parent folder name. -switch ($smoke_test_path.parent) { - # if node, run yarn. - {"vanillajs" -Or "react" -Or "svelte" -Or "vue"} { - cd $smoke_test_path.FullName; yarn; yarn tauri:dev - } - # if rust, run cargo web deploy - "yew" { - cd $smoke_test_path.FullName; cargo web deploy - } - # if tauri run the helloworld example from the tauri folder. - "tauri" { - cd $CWD/tauri; cargo run --example helloworld - } - # transpiled are not supported yet. - "transpiled" { - Write-Output("Example not supported yet") - } -} -``` - -## list - -### list smoke-tests - -> List all available smoke tests - -```sh -find smoke-tests/*/*/* -maxdepth 0 -type d -not -path '*.git*' \ --exec sh -c 'echo $(basename $(dirname {}))/$(basename {})' \; -``` - -```powershell -# Setup Environment to execute in the tauri directory. -$CWD = [Environment]::CurrentDirectory -Push-Location $MyInvocation.MyCommand.Path -[Environment]::CurrentDirectory = $PWD - -# initialize the smoke-tests list. -$smoke_tests = @() - -# get the helloworld smoke tests -$smoke_tests += Get-ChildItem smoke-tests/*/* -Filter helloworld -# get the rest of the smoke-tests. -$smoke_tests += Get-ChildItem smoke-tests/*/* -Directory -Exclude ('src*', 'public', 'test*', 'source', 'lib', 'web', 'dist', 'node_*') - -# print out the smoke tests. -foreach($e in $smoke_tests) { - Write-Output("$($e.Name): $($e.Parent)/$($e.Name)") -} -``` - -## clean - -> Remove installed dependencies and reset smoke tests in case something gone wrong - -```sh -cargo clean - -shopt -s globstar -rm -r **/node_modules - -cd smoke-tests -git checkout -- . # discard all unstaged changes -git clean -dfX # remove all untracked files & directories -``` - -```powershell -# Setup Environment to execute in the tauri directory. -$CWD = [Environment]::CurrentDirectory -Push-Location $MyInvocation.MyCommand.Path -[Environment]::CurrentDirectory = $PWD - -# clean up any artifacts. -cargo clean - -# find any node_module folders. -$node_paths = Get-ChildItem -Path smoke-tests\ -Filter node_modules -Recurse -ErrorAction SilentlyContinue -Force - -if (-Not $node_paths -eq $null) { -# delete all of the node_module folders. - foreach ($path in $node_paths) { - $path.Delete() - } - # enter the smoke-tests folder and remove any changes. - cd $CWD/smoke-tests; git checkout -- .; git clean -dfX -} - - -``` diff --git a/package.json b/package.json index 9dd91bb71..d38234c31 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/tauri-apps/tauri.git", - "directory": "tooling/cli.js" + "url": "https://github.com/tauri-apps/tauri.git" }, "scripts": { "format": "prettier --write --end-of-line=auto \"./**/*.{cjs,js,jsx,ts,tsx,html,css,json}\" --ignore-path .gitignore", @@ -18,7 +17,7 @@ "devDependencies": { "covector": "^0.5.3", "husky": "^6.0.0", - "prettier": "^2.2.1" + "prettier": "^2.5.1" }, "dependencies": { "typescript": "^4.5.4" diff --git a/renovate.json b/renovate.json index d8de87609..525773969 100644 --- a/renovate.json +++ b/renovate.json @@ -91,7 +91,7 @@ }, { "enabled": true, - "paths": ["tooling/cli.js/**"], + "paths": ["tooling/cli.rs/node"], "groupName": "Tauri JS CLI", "groupSlug": "allTauriJSCLI", "commitMessagePrefix": "chore(deps)", diff --git a/tooling/bundler/Cargo.toml b/tooling/bundler/Cargo.toml index 6895568e9..6ef4df3d1 100644 --- a/tooling/bundler/Cargo.toml +++ b/tooling/bundler/Cargo.toml @@ -40,6 +40,7 @@ walkdir = "2" handlebars = { version = "4.2" } zip = { version = "0.5" } tempfile = "3.3.0" +os_pipe = "1" [target."cfg(target_os = \"windows\")".dependencies] attohttpc = "0.18" diff --git a/tooling/bundler/src/bundle/common.rs b/tooling/bundler/src/bundle/common.rs index c75bad590..11bc5d15d 100644 --- a/tooling/bundler/src/bundle/common.rs +++ b/tooling/bundler/src/bundle/common.rs @@ -2,13 +2,13 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -use crate::Settings; +use crate::{CommandExt, Settings}; use std::{ ffi::OsStr, fs::{self, File}, io::{self, BufWriter, Write}, path::Path, - process::{Command, Stdio}, + process::Command, }; use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; @@ -196,16 +196,10 @@ pub fn print_info(message: &str) -> crate::Result<()> { } pub fn execute_with_verbosity(cmd: &mut Command, settings: &Settings) -> crate::Result<()> { - let stdio_config = if settings.is_verbose() { - Stdio::inherit - } else { - Stdio::null - }; - let status = cmd - .stdout(stdio_config()) - .stderr(stdio_config()) - .status() - .expect("failed to spawn command"); + if settings.is_verbose() { + cmd.pipe()?; + } + let status = cmd.status().expect("failed to spawn command"); if status.success() { Ok(()) diff --git a/tooling/bundler/src/bundle/linux/templates/appimage b/tooling/bundler/src/bundle/linux/templates/appimage index 3ee895aa7..d5cd734ca 100644 --- a/tooling/bundler/src/bundle/linux/templates/appimage +++ b/tooling/bundler/src/bundle/linux/templates/appimage @@ -33,10 +33,4 @@ wget -q -4 -O linuxdeploy-x86_64.AppImage https://github.com/linuxdeploy/linuxde chmod +x linuxdeploy-plugin-gtk.sh chmod +x linuxdeploy-x86_64.AppImage -args=() -if ! lsmod | grep -q 'fuse' -then - args+=( '--appimage-extract-and-run' ) -fi - -OUTPUT="{{appimage_filename}}" ./linuxdeploy-x86_64.AppImage "${args[@]}" --appdir "{{app_name}}.AppDir" --plugin gtk --output appimage +OUTPUT="{{appimage_filename}}" ./linuxdeploy-x86_64.AppImage --appimage-extract-and-run --appdir "{{app_name}}.AppDir" --plugin gtk --output appimage diff --git a/tooling/bundler/src/lib.rs b/tooling/bundler/src/lib.rs index 238db717f..424b1ba63 100644 --- a/tooling/bundler/src/lib.rs +++ b/tooling/bundler/src/lib.rs @@ -15,6 +15,18 @@ //! - Windows //! - MSI using WiX +pub(crate) trait CommandExt { + fn pipe(&mut self) -> Result<&mut Self>; +} + +impl CommandExt for std::process::Command { + fn pipe(&mut self) -> Result<&mut Self> { + self.stdout(os_pipe::dup_stdout()?); + self.stderr(os_pipe::dup_stderr()?); + Ok(self) + } +} + /// The bundle API. pub mod bundle; mod error; diff --git a/tooling/cli.js/README.md b/tooling/cli.js/README.md index efe0db0e0..eb43ce9f1 100644 --- a/tooling/cli.js/README.md +++ b/tooling/cli.js/README.md @@ -1,45 +1,3 @@ # @tauri-apps/cli - - -[![status](https://img.shields.io/badge/Status-Beta-green.svg)](https://github.com/tauri-apps/tauri) -[![Chat Server](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/SpmNs4S) -[![devto](https://img.shields.io/badge/blog-dev.to-black.svg)](https://dev.to/tauri) - -![](https://img.shields.io/github/workflow/status/tauri-apps/tauri/test%20library?label=test%20library -) -[![devto](https://img.shields.io/badge/documentation-site-purple.svg)](https://tauri.studio) - -[![https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg](https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg)](https://good-labs.github.io/greater-good-affirmation) -[![support](https://img.shields.io/badge/sponsor-Opencollective-blue.svg)](https://opencollective.com/tauri) - -| Component | Version | -| --------- | ------------------------------------------- | -| @tauri-apps/cli | ![](https://img.shields.io/npm/v/@tauri-apps/cli.svg) | - -## About Tauri -Tauri is a polyglot and generic system that is very composable and allows engineers to make a wide variety of applications. It is used for building applications for Desktop Computers using a combination of Rust tools and HTML rendered in a Webview. Apps built with Tauri can ship with any number of pieces of an optional JS API / Rust API so that webviews can control the system via message passing. In fact, developers can extend the default API with their own functionality and bridge the Webview and Rust-based backend easily. - -Tauri apps can have custom menus and have tray-type interfaces. They can be updated, and are managed by the user's operating system as expected. They are very small, because they use the system's webview. They do not ship a runtime, since the final binary is compiled from rust. This makes the reversing of Tauri apps not a trivial task. -## This module -Written in Typescript and packaged such that it can be used with `npm`, `pnpm`, and `yarn`, this library provides a node.js runner for common tasks when using Tauri, like `yarn tauri dev`. For the most part it is a wrapper around [cli.rs](https://github.com/tauri-apps/tauri/blob/dev/tooling/cli.rs). - -To learn more about the details of how all of these pieces fit together, please consult this [ARCHITECTURE.md](https://github.com/tauri-apps/tauri/blob/dev/ARCHITECTURE.md) document. - - -## Installation - -The preferred method is to install this module locally as a development dependency: -``` -$ npm install --save-dev @tauri-apps/cli -$ yarn add --dev @tauri-apps/cli -``` - -## Semver -**tauri** is following [Semantic Versioning 2.0](https://semver.org/). -## Licenses -Code: (c) 2019 - 2021 - The Tauri Programme within The Commons Conservancy. - -MIT or MIT/Apache 2.0 where applicable. - -Logo: CC-BY-NC-ND -- Original Tauri Logo Designs by [Daniel Thompson-Yvetot](https://github.com/nothingismagick) and [Guillaume Chau](https://github.com/akryum) +# Deprecated +See https://github.com/tauri-apps/tauri/tooling/cli.rs/node/ for the new version based on napi-rs. \ No newline at end of file diff --git a/tooling/cli.rs/Cargo.lock b/tooling/cli.rs/Cargo.lock index 785ced7f4..5e1e2a5e0 100644 --- a/tooling/cli.rs/Cargo.lock +++ b/tooling/cli.rs/Cargo.lock @@ -337,6 +337,12 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "convert_case" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8" + [[package]] name = "core-foundation" version = "0.9.3" @@ -539,7 +545,7 @@ version = "0.99.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ - "convert_case", + "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", @@ -1455,6 +1461,57 @@ dependencies = [ "getrandom 0.2.4", ] +[[package]] +name = "napi" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ec66e60f000c78dd7c6215b6fa260e0591e09805024332bc5b3f55acc12244" +dependencies = [ + "ctor", + "lazy_static", + "napi-sys", + "windows", +] + +[[package]] +name = "napi-build" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd4419172727423cf30351406c54f6cc1b354a2cfb4f1dba3e6cd07f6d5522b" + +[[package]] +name = "napi-derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74ac5287a5e94a8728fc82d16c5127acc5eb5b8ad6404ef5f82d6a4ce8d5bdd2" +dependencies = [ + "convert_case 0.5.0", + "napi-derive-backend", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "napi-derive-backend" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427f4f04525635cdf22005d1be62d6d671bcb5550d694a1efb480a315422b4af" +dependencies = [ + "convert_case 0.5.0", + "once_cell", + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "napi-sys" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a385494dac3c52cbcacb393bb3b42669e7db8ab240c7ad5115f549eb061f2cc" + [[package]] name = "native-tls" version = "0.2.8" @@ -1636,6 +1693,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "os_pipe" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e3492ebca331b895fe23ed427dce2013d9b2e00c45964f12040b0db38b8ab27" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "os_str_bytes" version = "6.0.0" @@ -2393,9 +2460,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9186a81e763ca2a5e13ba76d843534620bffe0cf1e76e1a2f2d231ba1db79b82" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" dependencies = [ "serde", "serde_json", @@ -2404,9 +2471,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3ff83d7962f690dbe675ca0fd516c097194723b6bda8c7c500d35f0b02902e" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" dependencies = [ "proc-macro2", "quote", @@ -2600,6 +2667,7 @@ dependencies = [ "image", "libflate", "md5", + "os_pipe", "regex", "serde", "serde_json", @@ -2640,6 +2708,7 @@ dependencies = [ "notify", "once_cell", "os_info", + "os_pipe", "regex", "schemars", "semver", @@ -2660,6 +2729,16 @@ dependencies = [ "zeroize", ] +[[package]] +name = "tauri-cli-node" +version = "0.0.0" +dependencies = [ + "napi", + "napi-build", + "napi-derive", + "tauri-cli", +] + [[package]] name = "tauri-utils" version = "1.0.0-beta.3" @@ -3161,6 +3240,49 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b749ebd2304aa012c5992d11a25d07b406bdbe5f79d371cb7a918ce501a19eb0" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" + +[[package]] +name = "windows_i686_gnu" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" + +[[package]] +name = "windows_i686_msvc" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" + [[package]] name = "winreg" version = "0.10.1" diff --git a/tooling/cli.rs/Cargo.toml b/tooling/cli.rs/Cargo.toml index 33bf4ff0d..7e8ca9d64 100644 --- a/tooling/cli.rs/Cargo.toml +++ b/tooling/cli.rs/Cargo.toml @@ -1,4 +1,7 @@ -workspace = { } +[workspace] +members = [ + "node" +] [package] name = "tauri-cli" @@ -51,6 +54,7 @@ glob = "0.3" heck = "0.4" dialoguer = "0.9" url = { version = "2.2", features = [ "serde" ] } +os_pipe = "1" [target."cfg(windows)".dependencies] encode_unicode = "0.3" @@ -68,3 +72,6 @@ serde = { version = "1.0", features = [ "derive" ] } serde_json = "1.0" serde_with = "1.12" url = { version = "2.2", features = [ "serde" ] } + +[profile.release] +lto = true diff --git a/tooling/cli.rs/node/.cargo/config.toml b/tooling/cli.rs/node/.cargo/config.toml new file mode 100644 index 000000000..6890aa910 --- /dev/null +++ b/tooling/cli.rs/node/.cargo/config.toml @@ -0,0 +1,7 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" +[target.aarch64-unknown-linux-musl] +linker = "aarch64-linux-musl-gcc" +rustflags = ["-C", "target-feature=-crt-static"] +[target.armv7-unknown-linux-gnueabihf] +linker = "arm-linux-gnueabihf-gcc" \ No newline at end of file diff --git a/tooling/cli.rs/node/.github-example/workflows/CI.yml b/tooling/cli.rs/node/.github-example/workflows/CI.yml new file mode 100644 index 000000000..a9fb57f0b --- /dev/null +++ b/tooling/cli.rs/node/.github-example/workflows/CI.yml @@ -0,0 +1,469 @@ +name: CI +env: + DEBUG: napi:* + APP_NAME: cli + MACOSX_DEPLOYMENT_TARGET: '10.13' +'on': + push: + branches: + - main + tags-ignore: + - '**' + paths-ignore: + - '**/*.md' + - LICENSE + - '**/*.gitignore' + - .editorconfig + - docs/** + pull_request: null +jobs: + build: + if: "!contains(github.event.head_commit.message, 'skip ci')" + strategy: + fail-fast: false + matrix: + settings: + - host: macos-latest + target: x86_64-apple-darwin + architecture: x64 + build: | + yarn build + strip -x *.node + - host: windows-latest + build: yarn build + target: x86_64-pc-windows-msvc + architecture: x64 + - host: ubuntu-18.04 + target: x86_64-unknown-linux-gnu + architecture: x64 + docker: | + docker pull $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian + docker tag $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-debian builder + build: | + docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd):/build -w /build builder yarn build && strip *.node + - host: ubuntu-18.04 + target: x86_64-unknown-linux-musl + architecture: x64 + docker: | + docker pull $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine + docker tag $DOCKER_REGISTRY_URL/napi-rs/napi-rs/nodejs-rust:lts-alpine builder + build: docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd):/build -w /build builder yarn build && strip *.node + - host: macos-latest + target: aarch64-apple-darwin + build: | + yarn build --target=aarch64-apple-darwin + strip -x *.node + - host: ubuntu-18.04 + architecture: x64 + target: aarch64-unknown-linux-gnu + setup: | + sudo apt-get update + sudo apt-get install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu -y + build: | + yarn build --target=aarch64-unknown-linux-gnu + aarch64-linux-gnu-strip *.node + - host: ubuntu-18.04 + architecture: x64 + target: armv7-unknown-linux-gnueabihf + setup: | + sudo apt-get update + sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf -y + build: | + yarn build --target=armv7-unknown-linux-gnueabihf + arm-linux-gnueabihf-strip *.node + - host: ubuntu-18.04 + architecture: x64 + target: aarch64-unknown-linux-musl + downloadTarget: aarch64-unknown-linux-musl + docker: | + docker pull ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine + docker tag ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine builder + build: | + docker run --rm -v ~/.cargo/git:/root/.cargo/git -v ~/.cargo/registry:/root/.cargo/registry -v $(pwd):/build -w /build builder sh -c "yarn build --target=aarch64-unknown-linux-musl && /aarch64-linux-musl-cross/bin/aarch64-linux-musl-strip *.node" + - host: windows-latest + architecture: x64 + target: aarch64-pc-windows-msvc + build: yarn build --target aarch64-pc-windows-msvc + name: stable - ${{ matrix.settings.target }} - node@16 + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: 16 + check-latest: true + cache: yarn + architecture: ${{ matrix.settings.architecture }} + - name: Install + uses: actions-rs/toolchain@v1 + with: + profile: minimal + override: true + toolchain: stable + target: ${{ matrix.settings.target }} + - name: Generate Cargo.lock + uses: actions-rs/cargo@v1 + with: + command: generate-lockfile + - name: Cache cargo registry + uses: actions/cache@v2 + with: + path: ~/.cargo/registry + key: ${{ matrix.settings.target }}-node@16-cargo-registry-trimmed-${{ hashFiles('**/Cargo.lock') }} + - name: Cache cargo index + uses: actions/cache@v2 + with: + path: ~/.cargo/git + key: ${{ matrix.settings.target }}-node@16-cargo-index-trimmed-${{ hashFiles('**/Cargo.lock') }} + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-${{ matrix.settings.target }}-node@16-${{ hashFiles('yarn.lock') }} + - name: Pull latest image + run: ${{ matrix.settings.docker }} + env: + DOCKER_REGISTRY_URL: ghcr.io + if: ${{ matrix.settings.docker }} + - name: Setup toolchain + run: ${{ matrix.settings.setup }} + if: ${{ matrix.settings.setup }} + shell: bash + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Build + run: ${{ matrix.settings.build }} + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: bindings-${{ matrix.settings.target }} + path: ${{ env.APP_NAME }}.*.node + if-no-files-found: error + build-freebsd: + runs-on: macos-10.15 + name: Build FreeBSD + steps: + - uses: actions/checkout@v2 + - name: Build + id: build + uses: vmactions/freebsd-vm@v0.1.5 + env: + DEBUG: napi:* + RUSTUP_HOME: /usr/local/rustup + CARGO_HOME: /usr/local/cargo + RUSTUP_IO_THREADS: 1 + with: + envs: DEBUG RUSTUP_HOME CARGO_HOME RUSTUP_IO_THREADS + usesh: true + mem: 3000 + prepare: | + pkg install -y curl node14 python2 + curl -qL https://www.npmjs.com/install.sh | sh + npm install -g yarn + curl https://sh.rustup.rs -sSf --output rustup.sh + sh rustup.sh -y --profile minimal --default-toolchain stable + export PATH="/usr/local/cargo/bin:$PATH" + echo "~~~~ rustc --version ~~~~" + rustc --version + echo "~~~~ node -v ~~~~" + node -v + echo "~~~~ yarn --version ~~~~" + yarn --version + run: | + export PATH="/usr/local/cargo/bin:$PATH" + pwd + ls -lah + whoami + env + freebsd-version + yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + yarn build + strip -x *.node + yarn test + rm -rf node_modules + rm -rf target + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: bindings-freebsd + path: ${{ env.APP_NAME }}.*.node + if-no-files-found: error + test-macOS-windows-binding: + name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + settings: + - host: windows-latest + target: x86_64-pc-windows-msvc + node: + - '12' + - '14' + - '16' + runs-on: ${{ matrix.settings.host }} + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-${{ matrix.settings.target }}-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-${{ matrix.settings.target }} + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: yarn test + test-linux-x64-gnu-binding: + name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-linux-x64-gnu-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-x86_64-unknown-linux-gnu + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim yarn test + test-linux-x64-musl-binding: + name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + check-latest: true + cache: yarn + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-x86_64-unknown-linux-musl-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-x86_64-unknown-linux-musl + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Test bindings + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine yarn test + test-linux-aarch64-gnu-binding: + name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-aarch64-unknown-linux-gnu + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-linux-aarch64-gnu-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/napi-rs/napi-rs/nodejs:aarch64-${{ matrix.node }} + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + yarn test + ls -la + test-linux-aarch64-musl-binding: + name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} + needs: + - build + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-aarch64-unknown-linux-musl + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-linux-aarch64-musl-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: multiarch/alpine:aarch64-latest-stable + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + apk add nodejs npm yarn + yarn test + test-linux-arm-gnueabihf-binding: + name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} + needs: + - build + strategy: + fail-fast: false + matrix: + node: + - '12' + - '14' + - '16' + runs-on: ubuntu-latest + steps: + - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset + - uses: actions/checkout@v2 + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: bindings-armv7-unknown-linux-gnueabihf + path: . + - name: List packages + run: ls -R . + shell: bash + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-test-linux-arm-gnueabihf-${{ matrix.node }}-${{ hashFiles('yarn.lock') }} + - name: Install dependencies + run: yarn install --ignore-scripts --ignore-platform --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Setup and run tests + uses: addnab/docker-run-action@v3 + with: + image: ghcr.io/napi-rs/napi-rs/nodejs:armhf-${{ matrix.node }} + options: '-v ${{ github.workspace }}:/build -w /build' + run: | + set -e + yarn test + ls -la + publish: + name: Publish + runs-on: ubuntu-latest + needs: + - build-freebsd + - test-macOS-windows-binding + - test-linux-x64-gnu-binding + - test-linux-x64-musl-binding + - test-linux-aarch64-gnu-binding + - test-linux-aarch64-musl-binding + - test-linux-arm-gnueabihf-binding + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: 16 + check-latest: true + cache: yarn + - name: Cache NPM dependencies + uses: actions/cache@v2 + with: + path: node_modules + key: npm-cache-ubuntu-latest-${{ hashFiles('yarn.lock') }} + restore-keys: | + npm-cache- + - name: Install dependencies + run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 + - name: Download all artifacts + uses: actions/download-artifact@v2 + with: + path: artifacts + - name: Move artifacts + run: yarn artifacts + - name: List packages + run: ls -R ./npm + shell: bash + - name: Publish + run: | + if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --access public + elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; + then + echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + npm publish --tag next --access public + else + echo "Not a release, skipping publish" + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/tooling/cli.rs/node/.gitignore b/tooling/cli.rs/node/.gitignore new file mode 100644 index 000000000..a56b09701 --- /dev/null +++ b/tooling/cli.rs/node/.gitignore @@ -0,0 +1,2 @@ +# Automatically generated +/*.node \ No newline at end of file diff --git a/tooling/cli.rs/node/.npmignore b/tooling/cli.rs/node/.npmignore new file mode 100644 index 000000000..f96abe0b8 --- /dev/null +++ b/tooling/cli.rs/node/.npmignore @@ -0,0 +1,10 @@ +target +Cargo.lock +.cargo +.github +npm +.eslintrc +.prettierignore +rustfmt.toml +yarn.lock +*.node diff --git a/tooling/cli.rs/node/Cargo.toml b/tooling/cli.rs/node/Cargo.toml new file mode 100644 index 000000000..4f8383c45 --- /dev/null +++ b/tooling/cli.rs/node/Cargo.toml @@ -0,0 +1,16 @@ +[package] +edition = "2021" +name = "tauri-cli-node" +version = "0.0.0" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix +napi = { version = "2.0", default-features = false, features = ["napi4"] } +napi-derive = "2.0" +tauri-cli = { path = ".." } + +[build-dependencies] +napi-build = "1.2" diff --git a/tooling/cli.rs/node/README.md b/tooling/cli.rs/node/README.md new file mode 100644 index 000000000..efe0db0e0 --- /dev/null +++ b/tooling/cli.rs/node/README.md @@ -0,0 +1,45 @@ +# @tauri-apps/cli + + +[![status](https://img.shields.io/badge/Status-Beta-green.svg)](https://github.com/tauri-apps/tauri) +[![Chat Server](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/SpmNs4S) +[![devto](https://img.shields.io/badge/blog-dev.to-black.svg)](https://dev.to/tauri) + +![](https://img.shields.io/github/workflow/status/tauri-apps/tauri/test%20library?label=test%20library +) +[![devto](https://img.shields.io/badge/documentation-site-purple.svg)](https://tauri.studio) + +[![https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg](https://good-labs.github.io/greater-good-affirmation/assets/images/badge.svg)](https://good-labs.github.io/greater-good-affirmation) +[![support](https://img.shields.io/badge/sponsor-Opencollective-blue.svg)](https://opencollective.com/tauri) + +| Component | Version | +| --------- | ------------------------------------------- | +| @tauri-apps/cli | ![](https://img.shields.io/npm/v/@tauri-apps/cli.svg) | + +## About Tauri +Tauri is a polyglot and generic system that is very composable and allows engineers to make a wide variety of applications. It is used for building applications for Desktop Computers using a combination of Rust tools and HTML rendered in a Webview. Apps built with Tauri can ship with any number of pieces of an optional JS API / Rust API so that webviews can control the system via message passing. In fact, developers can extend the default API with their own functionality and bridge the Webview and Rust-based backend easily. + +Tauri apps can have custom menus and have tray-type interfaces. They can be updated, and are managed by the user's operating system as expected. They are very small, because they use the system's webview. They do not ship a runtime, since the final binary is compiled from rust. This makes the reversing of Tauri apps not a trivial task. +## This module +Written in Typescript and packaged such that it can be used with `npm`, `pnpm`, and `yarn`, this library provides a node.js runner for common tasks when using Tauri, like `yarn tauri dev`. For the most part it is a wrapper around [cli.rs](https://github.com/tauri-apps/tauri/blob/dev/tooling/cli.rs). + +To learn more about the details of how all of these pieces fit together, please consult this [ARCHITECTURE.md](https://github.com/tauri-apps/tauri/blob/dev/ARCHITECTURE.md) document. + + +## Installation + +The preferred method is to install this module locally as a development dependency: +``` +$ npm install --save-dev @tauri-apps/cli +$ yarn add --dev @tauri-apps/cli +``` + +## Semver +**tauri** is following [Semantic Versioning 2.0](https://semver.org/). +## Licenses +Code: (c) 2019 - 2021 - The Tauri Programme within The Commons Conservancy. + +MIT or MIT/Apache 2.0 where applicable. + +Logo: CC-BY-NC-ND +- Original Tauri Logo Designs by [Daniel Thompson-Yvetot](https://github.com/nothingismagick) and [Guillaume Chau](https://github.com/akryum) diff --git a/tooling/cli.rs/node/build.rs b/tooling/cli.rs/node/build.rs new file mode 100644 index 000000000..ff05c1667 --- /dev/null +++ b/tooling/cli.rs/node/build.rs @@ -0,0 +1,7 @@ +// Copyright 2019-2021 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +fn main() { + ::napi_build::setup(); +} diff --git a/tooling/cli.rs/node/index.d.ts b/tooling/cli.rs/node/index.d.ts new file mode 100644 index 000000000..82c933de7 --- /dev/null +++ b/tooling/cli.rs/node/index.d.ts @@ -0,0 +1,12 @@ +/* tslint:disable */ +/* eslint-disable */ + +/* auto-generated by NAPI-RS */ + +export class ExternalObject { + readonly '': { + readonly '': unique symbol + [K: symbol]: T + } +} +export function run(args: Array, binName?: string | undefined | null): void diff --git a/tooling/cli.rs/node/index.js b/tooling/cli.rs/node/index.js new file mode 100644 index 000000000..7ca66a61d --- /dev/null +++ b/tooling/cli.rs/node/index.js @@ -0,0 +1,241 @@ +const { existsSync, readFileSync } = require('fs') +const { join } = require('path') + +const { platform, arch } = process + +let nativeBinding = null +let localFileExisted = false +let loadError = null + +function isMusl() { + // For Node 10 + if (!process.report || typeof process.report.getReport !== 'function') { + try { + return readFileSync('/usr/bin/ldd', 'utf8').includes('musl') + } catch (e) { + return true + } + } else { + const { glibcVersionRuntime } = process.report.getReport().header + return !glibcVersionRuntime + } +} + +switch (platform) { + case 'android': + switch (arch) { + case 'arm64': + localFileExisted = existsSync(join(__dirname, 'cli.android-arm64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./cli.android-arm64.node') + } else { + nativeBinding = require('@tauri-apps/cli-android-arm64') + } + } catch (e) { + loadError = e + } + break + case 'arm': + localFileExisted = existsSync(join(__dirname, 'cli.android-arm-eabi.node')) + try { + if (localFileExisted) { + nativeBinding = require('./cli.android-arm-eabi.node') + } else { + nativeBinding = require('@tauri-apps/cli-android-arm-eabi') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Android ${arch}`) + } + break + case 'win32': + switch (arch) { + case 'x64': + localFileExisted = existsSync( + join(__dirname, 'cli.win32-x64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.win32-x64-msvc.node') + } else { + nativeBinding = require('@tauri-apps/cli-win32-x64-msvc') + } + } catch (e) { + loadError = e + } + break + case 'ia32': + localFileExisted = existsSync( + join(__dirname, 'cli.win32-ia32-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.win32-ia32-msvc.node') + } else { + nativeBinding = require('@tauri-apps/cli-win32-ia32-msvc') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'cli.win32-arm64-msvc.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.win32-arm64-msvc.node') + } else { + nativeBinding = require('@tauri-apps/cli-win32-arm64-msvc') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + switch (arch) { + case 'x64': + localFileExisted = existsSync(join(__dirname, 'cli.darwin-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./cli.darwin-x64.node') + } else { + nativeBinding = require('@tauri-apps/cli-darwin-x64') + } + } catch (e) { + loadError = e + } + break + case 'arm64': + localFileExisted = existsSync( + join(__dirname, 'cli.darwin-arm64.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.darwin-arm64.node') + } else { + nativeBinding = require('@tauri-apps/cli-darwin-arm64') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'freebsd': + if (arch !== 'x64') { + throw new Error(`Unsupported architecture on FreeBSD: ${arch}`) + } + localFileExisted = existsSync(join(__dirname, 'cli.freebsd-x64.node')) + try { + if (localFileExisted) { + nativeBinding = require('./cli.freebsd-x64.node') + } else { + nativeBinding = require('@tauri-apps/cli-freebsd-x64') + } + } catch (e) { + loadError = e + } + break + case 'linux': + switch (arch) { + case 'x64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'cli.linux-x64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.linux-x64-musl.node') + } else { + nativeBinding = require('@tauri-apps/cli-linux-x64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'cli.linux-x64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.linux-x64-gnu.node') + } else { + nativeBinding = require('@tauri-apps/cli-linux-x64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm64': + if (isMusl()) { + localFileExisted = existsSync( + join(__dirname, 'cli.linux-arm64-musl.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.linux-arm64-musl.node') + } else { + nativeBinding = require('@tauri-apps/cli-linux-arm64-musl') + } + } catch (e) { + loadError = e + } + } else { + localFileExisted = existsSync( + join(__dirname, 'cli.linux-arm64-gnu.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.linux-arm64-gnu.node') + } else { + nativeBinding = require('@tauri-apps/cli-linux-arm64-gnu') + } + } catch (e) { + loadError = e + } + } + break + case 'arm': + localFileExisted = existsSync( + join(__dirname, 'cli.linux-arm-gnueabihf.node') + ) + try { + if (localFileExisted) { + nativeBinding = require('./cli.linux-arm-gnueabihf.node') + } else { + nativeBinding = require('@tauri-apps/cli-linux-arm-gnueabihf') + } + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +const { run } = nativeBinding + +module.exports.run = run diff --git a/tooling/cli.rs/node/npm/darwin-arm64/README.md b/tooling/cli.rs/node/npm/darwin-arm64/README.md new file mode 100644 index 000000000..3af0749d6 --- /dev/null +++ b/tooling/cli.rs/node/npm/darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/darwin-arm64/package.json b/tooling/cli.rs/node/npm/darwin-arm64/package.json new file mode 100644 index 000000000..bd0eb651f --- /dev/null +++ b/tooling/cli.rs/node/npm/darwin-arm64/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-darwin-arm64", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "main": "cli.darwin-arm64.node", + "files": [ + "cli.darwin-arm64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/darwin-x64/README.md b/tooling/cli.rs/node/npm/darwin-x64/README.md new file mode 100644 index 000000000..294528783 --- /dev/null +++ b/tooling/cli.rs/node/npm/darwin-x64/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-darwin-x64` + +This is the **x86_64-apple-darwin** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/darwin-x64/package.json b/tooling/cli.rs/node/npm/darwin-x64/package.json new file mode 100644 index 000000000..1e38685a4 --- /dev/null +++ b/tooling/cli.rs/node/npm/darwin-x64/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-darwin-x64", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "main": "cli.darwin-x64.node", + "files": [ + "cli.darwin-x64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/linux-arm-gnueabihf/README.md b/tooling/cli.rs/node/npm/linux-arm-gnueabihf/README.md new file mode 100644 index 000000000..28eabad07 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm-gnueabihf/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-linux-arm-gnueabihf` + +This is the **armv7-unknown-linux-gnueabihf** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/linux-arm-gnueabihf/package.json b/tooling/cli.rs/node/npm/linux-arm-gnueabihf/package.json new file mode 100644 index 000000000..0e3482552 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm-gnueabihf/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-linux-arm-gnueabihf", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm" + ], + "main": "cli.linux-arm-gnueabihf.node", + "files": [ + "cli.linux-arm-gnueabihf.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/linux-arm64-gnu/README.md b/tooling/cli.rs/node/npm/linux-arm64-gnu/README.md new file mode 100644 index 000000000..7cb17b836 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm64-gnu/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-linux-arm64-gnu` + +This is the **aarch64-unknown-linux-gnu** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/linux-arm64-gnu/package.json b/tooling/cli.rs/node/npm/linux-arm64-gnu/package.json new file mode 100644 index 000000000..28790ab76 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm64-gnu/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-linux-arm64-gnu", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "main": "cli.linux-arm64-gnu.node", + "files": [ + "cli.linux-arm64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/linux-arm64-musl/README.md b/tooling/cli.rs/node/npm/linux-arm64-musl/README.md new file mode 100644 index 000000000..fc83b51ce --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm64-musl/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-linux-arm64-musl` + +This is the **aarch64-unknown-linux-musl** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/linux-arm64-musl/package.json b/tooling/cli.rs/node/npm/linux-arm64-musl/package.json new file mode 100644 index 000000000..4ff96ff8e --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-arm64-musl/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-linux-arm64-musl", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "main": "cli.linux-arm64-musl.node", + "files": [ + "cli.linux-arm64-musl.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/linux-x64-gnu/README.md b/tooling/cli.rs/node/npm/linux-x64-gnu/README.md new file mode 100644 index 000000000..38e990a52 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-x64-gnu/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-linux-x64-gnu` + +This is the **x86_64-unknown-linux-gnu** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/linux-x64-gnu/package.json b/tooling/cli.rs/node/npm/linux-x64-gnu/package.json new file mode 100644 index 000000000..18ed37403 --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-x64-gnu/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-linux-x64-gnu", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "main": "cli.linux-x64-gnu.node", + "files": [ + "cli.linux-x64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/linux-x64-musl/README.md b/tooling/cli.rs/node/npm/linux-x64-musl/README.md new file mode 100644 index 000000000..a987fb53c --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-x64-musl/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-linux-x64-musl` + +This is the **x86_64-unknown-linux-musl** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/linux-x64-musl/package.json b/tooling/cli.rs/node/npm/linux-x64-musl/package.json new file mode 100644 index 000000000..74d55d0fe --- /dev/null +++ b/tooling/cli.rs/node/npm/linux-x64-musl/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-linux-x64-musl", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "main": "cli.linux-x64-musl.node", + "files": [ + "cli.linux-x64-musl.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/npm/win32-x64-msvc/README.md b/tooling/cli.rs/node/npm/win32-x64-msvc/README.md new file mode 100644 index 000000000..c22490ba7 --- /dev/null +++ b/tooling/cli.rs/node/npm/win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `@tauri-apps/cli-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `@tauri-apps/cli` diff --git a/tooling/cli.rs/node/npm/win32-x64-msvc/package.json b/tooling/cli.rs/node/npm/win32-x64-msvc/package.json new file mode 100644 index 000000000..b1e5d30c1 --- /dev/null +++ b/tooling/cli.rs/node/npm/win32-x64-msvc/package.json @@ -0,0 +1,21 @@ +{ + "name": "@tauri-apps/cli-win32-x64-msvc", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "main": "cli.win32-x64-msvc.node", + "files": [ + "cli.win32-x64-msvc.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/tooling/cli.rs/node/package.json b/tooling/cli.rs/node/package.json new file mode 100644 index 000000000..21e179cfc --- /dev/null +++ b/tooling/cli.rs/node/package.json @@ -0,0 +1,59 @@ +{ + "name": "@tauri-apps/cli", + "version": "1.0.0-beta.10", + "description": "Command line interface for building Tauri apps", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tauri-apps/tauri.git" + }, + "contributors": [ + "Tauri Team (https://tauri.studio)" + ], + "license": "Apache-2.0 OR MIT", + "bugs": { + "url": "https://github.com/tauri-apps/tauri/issues" + }, + "homepage": "https://github.com/tauri-apps/tauri#readme", + "publishConfig": { + "access": "public" + }, + "main": "index.js", + "types": "index.d.ts", + "napi": { + "name": "cli", + "triples": { + "additional": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "aarch64-unknown-linux-musl", + "armv7-unknown-linux-gnueabihf", + "x86_64-unknown-linux-musl" + ] + } + }, + "devDependencies": { + "@napi-rs/cli": "^2.4.2", + "prettier": "^2.5.1" + }, + "engines": { + "node": ">= 10" + }, + "bin": { + "tauri": "./tauri.js" + }, + "scripts": { + "artifacts": "napi artifacts", + "build": "napi build --platform --release", + "build:debug": "napi build --platform", + "prepublishOnly": "napi prepublish -t npm", + "test": "node ./tauri.js help", + "version": "napi version", + "tauri": "tauri", + "format": "prettier --write ./package.json ./tauri.js", + "format:check": "prettier --check ./package.json ./tauri.js" + } +} diff --git a/tooling/cli.rs/node/src/lib.rs b/tooling/cli.rs/node/src/lib.rs new file mode 100644 index 000000000..d328061ec --- /dev/null +++ b/tooling/cli.rs/node/src/lib.rs @@ -0,0 +1,10 @@ +// Copyright 2019-2021 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +use napi::{Error, Result, Status}; + +#[napi_derive::napi] +pub fn run(args: Vec, bin_name: Option) -> Result<()> { + tauri_cli::run(args, bin_name).map_err(|e| Error::new(Status::GenericFailure, e.to_string())) +} diff --git a/tooling/cli.rs/node/tauri.js b/tooling/cli.rs/node/tauri.js new file mode 100755 index 000000000..30d59a4d9 --- /dev/null +++ b/tooling/cli.rs/node/tauri.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +const cli = require('./index') +const path = require('path') + +const [bin, script, ...arguments] = process.argv +const binStem = path.parse(bin).name.toLowerCase() + +// We want to make a helpful binary name for the underlying CLI helper, if we +// can successfully detect what command likely started the execution. +let binName + +// Even if started by a package manager, the binary will be NodeJS. +// Some distribution still use "nodejs" as the binary name. +if (binStem === 'node' || binStem === 'nodejs') { + const managerStem = process.env.npm_execpath + ? path.parse(process.env.npm_execpath).name.toLowerCase() + : null + if (managerStem) { + let manager + switch (managerStem) { + // Only supported package manager that has a different filename is npm. + case 'npm-cli': + manager = 'npm' + break + + // Yarn and pnpm have the same stem name as their bin. + // We assume all unknown package managers do as well. + default: + manager = managerStem + break + } + + binName = `${manager} run ${process.env.npm_lifecycle_event}` + } else { + // Assume running NodeJS if we didn't detect a manager from the env. + // We normalize the path to prevent the script's absolute path being used. + const scriptNormal = path.normalize(path.relative(process.cwd(), script)) + binName = `${binStem} ${scriptNormal}` + } +} else { + // We don't know what started it, assume it's already stripped. + arguments.unshift(bin) +} + +try { + cli.run(arguments, binName) +} catch (e) { + console.log(`Eror running CLI: ${e.message}`) +} diff --git a/tooling/cli.rs/node/yarn.lock b/tooling/cli.rs/node/yarn.lock new file mode 100644 index 000000000..46b9d330c --- /dev/null +++ b/tooling/cli.rs/node/yarn.lock @@ -0,0 +1,13 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@napi-rs/cli@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-2.4.2.tgz#89b32c7d8776004bc9617915605aea769339cf6f" + integrity sha512-+yCOuPqernvD8BMphbadF87ElaJ0rjanOZrbnauaEdR07YyoalGw3FTk15HHyflIwQKlYd69gkG5EM4WFkICKw== + +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== diff --git a/tooling/cli.rs/schema.json b/tooling/cli.rs/schema.json index d7dc959e8..5ad8acac5 100644 --- a/tooling/cli.rs/schema.json +++ b/tooling/cli.rs/schema.json @@ -1329,21 +1329,11 @@ { "description": "A variable that is set while calling the command from the webview API.", "type": "object", - "required": [ - "name" - ], "properties": { - "name": { - "description": "The name of the variable to be passed in.\n\nThis will try to match the key of the passed arguments object from the webview API.", + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\n[regex]: https://docs.rs/regex/latest/regex/#syntax", + "default": "", "type": "string" - }, - "validate": { - "description": "Optional [regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validate` regex before it will be executed.\n\n[regex]: https://docs.rs/regex/latest/regex/#syntax", - "default": null, - "type": [ - "string", - "null" - ] } }, "additionalProperties": false diff --git a/tooling/cli.rs/src/build.rs b/tooling/cli.rs/src/build.rs index 1fb902225..db74ffbe7 100644 --- a/tooling/cli.rs/src/build.rs +++ b/tooling/cli.rs/src/build.rs @@ -6,12 +6,11 @@ use crate::helpers::{ app_paths::{app_dir, tauri_dir}, command_env, config::{get as get_config, AppUrl, WindowUrl}, - execute_with_output, manifest::rewrite_manifest, updater_signature::sign_file_from_env_variables, Logger, }; -use crate::Result; +use crate::{CommandExt, Result}; use anyhow::Context; use clap::Parser; #[cfg(target_os = "linux")] @@ -73,24 +72,31 @@ pub fn command(options: Options) -> Result<()> { if !before_build.is_empty() { logger.log(format!("Running `{}`", before_build)); #[cfg(target_os = "windows")] - execute_with_output( - Command::new("cmd") - .arg("/S") - .arg("/C") - .arg(before_build) - .current_dir(app_dir()) - .envs(command_env(options.debug)), - ) - .with_context(|| format!("failed to run `{}` with `cmd /C`", before_build))?; + let status = Command::new("cmd") + .arg("/S") + .arg("/C") + .arg(before_build) + .current_dir(app_dir()) + .envs(command_env(options.debug)) + .pipe()? + .status() + .with_context(|| format!("failed to run `{}` with `cmd /C`", before_build))?; #[cfg(not(target_os = "windows"))] - execute_with_output( - Command::new("sh") - .arg("-c") - .arg(before_build) - .current_dir(app_dir()) - .envs(command_env(options.debug)), - ) - .with_context(|| format!("failed to run `{}` with `sh -c`", before_build))?; + let status = Command::new("sh") + .arg("-c") + .arg(before_build) + .current_dir(app_dir()) + .envs(command_env(options.debug)) + .pipe()? + .status() + .with_context(|| format!("failed to run `{}` with `sh -c`", before_build))?; + if !status.success() { + return Err(anyhow::anyhow!( + "beforeDevCommand `{}` failed with exit code {}", + before_build, + status.code().unwrap_or_default() + )); + } } } diff --git a/tooling/cli.rs/src/dev.rs b/tooling/cli.rs/src/dev.rs index 057517556..fff6cbc80 100644 --- a/tooling/cli.rs/src/dev.rs +++ b/tooling/cli.rs/src/dev.rs @@ -10,7 +10,7 @@ use crate::{ manifest::{get_workspace_members, rewrite_manifest}, Logger, }, - Result, + CommandExt, Result, }; use clap::{AppSettings, Parser}; @@ -92,7 +92,8 @@ pub fn command(options: Options) -> Result<()> { .arg("/C") .arg(before_dev) .current_dir(app_dir()) - .envs(command_env(true)); // development build always includes debug information + .envs(command_env(true)) + .pipe()?; // development build always includes debug information command }; #[cfg(not(target_os = "windows"))] @@ -102,7 +103,8 @@ pub fn command(options: Options) -> Result<()> { .arg("-c") .arg(before_dev) .current_dir(app_dir()) - .envs(command_env(true)); // development build always includes debug information + .envs(command_env(true)) + .pipe()?; // development build always includes debug information command }; @@ -316,6 +318,8 @@ fn start_app( command.arg("--").args(&options.args); } + command.pipe().unwrap(); + let child = SharedChild::spawn(&mut command).unwrap_or_else(|_| panic!("failed to run {}", runner)); let child_arc = Arc::new(child); diff --git a/tooling/cli.rs/src/helpers/mod.rs b/tooling/cli.rs/src/helpers/mod.rs index f0fb52380..1d2adabe7 100644 --- a/tooling/cli.rs/src/helpers/mod.rs +++ b/tooling/cli.rs/src/helpers/mod.rs @@ -14,33 +14,9 @@ pub use logger::Logger; use std::{ collections::HashMap, - io::{BufRead, BufReader}, path::{Path, PathBuf}, - process::{Command, Stdio}, }; -pub fn execute_with_output(cmd: &mut Command) -> crate::Result<()> { - let mut child = cmd - .stdout(Stdio::piped()) - .spawn() - .expect("failed to spawn command"); - { - let stdout = child.stdout.as_mut().expect("Failed to get stdout handle"); - let reader = BufReader::new(stdout); - - for line in reader.lines() { - println!("{}", line.expect("Failed to get line")); - } - } - - let status = child.wait()?; - if status.success() { - Ok(()) - } else { - Err(anyhow::anyhow!("command failed")) - } -} - pub fn command_env(debug: bool) -> HashMap { let mut map = HashMap::new(); diff --git a/tooling/cli.rs/src/interface/rust.rs b/tooling/cli.rs/src/interface/rust.rs index 6dfd2b220..64ca0659b 100644 --- a/tooling/cli.rs/src/interface/rust.rs +++ b/tooling/cli.rs/src/interface/rust.rs @@ -15,11 +15,14 @@ use anyhow::Context; use heck::ToKebabCase; use serde::Deserialize; -use crate::helpers::{ - app_paths::tauri_dir, - config::{wix_settings, Config}, - manifest::Manifest, - Logger, +use crate::{ + helpers::{ + app_paths::tauri_dir, + config::{wix_settings, Config}, + manifest::Manifest, + Logger, + }, + CommandExt, }; use tauri_bundler::{ AppCategory, BundleBinary, BundleSettings, DebianSettings, MacOsSettings, PackageSettings, @@ -120,6 +123,8 @@ pub fn build_project( command.arg("--release"); } + command.pipe()?; + let status = command .status() .with_context(|| format!("failed to run {}", runner))?; diff --git a/tooling/cli.rs/src/lib.rs b/tooling/cli.rs/src/lib.rs new file mode 100644 index 000000000..c64af10d1 --- /dev/null +++ b/tooling/cli.rs/src/lib.rs @@ -0,0 +1,104 @@ +// Copyright 2019-2021 Tauri Programme within The Commons Conservancy +// SPDX-License-Identifier: Apache-2.0 +// SPDX-License-Identifier: MIT + +pub use anyhow::Result; + +mod build; +mod dev; +mod helpers; +mod info; +mod init; +mod interface; +mod plugin; +mod signer; + +use clap::{AppSettings, FromArgMatches, IntoApp, Parser, Subcommand}; + +use std::ffi::OsString; + +pub(crate) trait CommandExt { + fn pipe(&mut self) -> Result<&mut Self>; +} + +impl CommandExt for std::process::Command { + fn pipe(&mut self) -> Result<&mut Self> { + self.stdout(os_pipe::dup_stdout()?); + self.stderr(os_pipe::dup_stderr()?); + Ok(self) + } +} + +#[derive(serde::Deserialize)] +pub struct VersionMetadata { + tauri: String, + #[serde(rename = "tauri-build")] + tauri_build: String, +} + +#[derive(Parser)] +#[clap(author, version, about, bin_name("cargo-tauri"))] +#[clap(global_setting(AppSettings::PropagateVersion))] +#[clap(global_setting(AppSettings::UseLongFormatForHelpSubcommand))] +#[clap(global_setting(AppSettings::NoBinaryName))] +#[clap(setting(AppSettings::SubcommandRequiredElseHelp))] +struct Cli { + #[clap(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Build(build::Options), + Dev(dev::Options), + Info(info::Options), + Init(init::Options), + Plugin(plugin::Cli), + Signer(signer::Cli), +} + +fn format_error(err: clap::Error) -> clap::Error { + let mut app = I::into_app(); + err.format(&mut app) +} + +/// Run the Tauri CLI with the passed arguments. +/// +/// The passed arguments should have the binary argument(s) stripped out before being passed. +/// +/// e.g. +/// 1. `tauri-cli 1 2 3` -> `1 2 3` +/// 2. `cargo tauri 1 2 3` -> `1 2 3` +/// 3. `node tauri.js 1 2 3` -> `1 2 3` +/// +/// The passed `bin_name` parameter should be how you want the help messages to display the command. +/// This defaults to `cargo-tauri`, but should be set to how the program was called, such as +/// `cargo tauri`. +pub fn run(args: I, bin_name: Option) -> Result<()> +where + I: IntoIterator, + A: Into + Clone, +{ + let matches = match bin_name { + Some(bin_name) => Cli::into_app().bin_name(bin_name), + None => Cli::into_app(), + } + .get_matches_from(args); + + let res = Cli::from_arg_matches(&matches).map_err(format_error::); + let cli = match res { + Ok(s) => s, + Err(e) => e.exit(), + }; + + match cli.command { + Commands::Build(options) => build::command(options)?, + Commands::Dev(options) => dev::command(options)?, + Commands::Info(options) => info::command(options)?, + Commands::Init(options) => init::command(options)?, + Commands::Plugin(cli) => plugin::command(cli)?, + Commands::Signer(cli) => signer::command(cli)?, + } + + Ok(()) +} diff --git a/tooling/cli.rs/src/main.rs b/tooling/cli.rs/src/main.rs index 127a01efd..0f088c4a6 100644 --- a/tooling/cli.rs/src/main.rs +++ b/tooling/cli.rs/src/main.rs @@ -2,83 +2,33 @@ // SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: MIT -pub use anyhow::Result; +use std::env::args_os; +use std::ffi::OsStr; +use std::path::Path; +use std::process::exit; -mod build; -mod dev; -mod helpers; -mod info; -mod init; -mod interface; -mod plugin; -mod signer; - -use clap::{AppSettings, FromArgMatches, IntoApp, Parser, Subcommand}; - -#[derive(serde::Deserialize)] -pub struct VersionMetadata { - tauri: String, - #[serde(rename = "tauri-build")] - tauri_build: String, -} - -#[derive(Parser)] -#[clap(author, version, about, bin_name("cargo tauri"))] -#[clap(global_setting(AppSettings::PropagateVersion))] -#[clap(global_setting(AppSettings::UseLongFormatForHelpSubcommand))] -#[clap(setting(AppSettings::SubcommandRequiredElseHelp))] -struct Cli { - #[clap(subcommand)] - command: Commands, -} - -#[derive(Subcommand)] -enum Commands { - Build(build::Options), - Dev(dev::Options), - Info(info::Options), - Init(init::Options), - Plugin(plugin::Cli), - Signer(signer::Cli), -} - -fn format_error(err: clap::Error) -> clap::Error { - let mut app = I::into_app(); - err.format(&mut app) -} - -fn main() -> Result<()> { - let matches = ::into_app() - .arg(clap::Arg::new("cargo").hide(true).possible_value("tauri")) - .get_matches(); - let res = ::from_arg_matches(&matches).map_err(format_error::); - let cli = match res { - Ok(s) => s, - Err(e) => e.exit(), +fn main() -> tauri_cli::Result<()> { + let mut args = args_os(); + let bin_name = match args + .next() + .as_deref() + .map(Path::new) + .and_then(Path::file_stem) + .and_then(OsStr::to_str) + { + Some("cargo-tauri") => { + if args.by_ref().peekable().peek().and_then(|s| s.to_str()) == Some("tauri") { + Some("cargo tauri".into()) + } else { + Some("cargo-tauri".into()) + } + } + Some(stem) => Some(stem.to_string()), + None => { + eprintln!("cargo-tauri wrapper unable to read first argument"); + exit(1); + } }; - match cli.command { - Commands::Build(options) => build::command(options)?, - Commands::Dev(options) => dev::command(options)?, - Commands::Info(options) => info::command(options)?, - Commands::Init(options) => init::command(options)?, - Commands::Plugin(cli) => plugin::command(cli)?, - Commands::Signer(cli) => signer::command(cli)?, - } - - /*if let Some(matches) = matches.subcommand_matches("dev") { - dev::command(matches)?; - } else if let Some(matches) = matches.subcommand_matches("build") { - build::command(matches)?; - } else if let Some(matches) = matches.subcommand_matches("signer") { - signer::command(matches)?; - } else if let Some(_) = matches.subcommand_matches("info") { - info::command()?; - } else if let Some(matches) = matches.subcommand_matches("init") { - init::command(matches)?; - } else if let Some(matches) = matches.subcommand_matches("plugin") { - plugin::command(matches)?; - }*/ - - Ok(()) + tauri_cli::run(args, bin_name) } diff --git a/tooling/create-tauri-app/src/index.ts b/tooling/create-tauri-app/src/index.ts index 06e16cc01..7b6d5744d 100644 --- a/tooling/create-tauri-app/src/index.ts +++ b/tooling/create-tauri-app/src/index.ts @@ -324,10 +324,10 @@ You may find the requirements here: ${cyan(setupLink)} return final } }, []) - - const tauriCLIVersion = !argv.dev - ? 'latest' - : `file:${relative(appDirectory, join(__dirname, '../../cli.js'))}` + // TODO: const tauriCLIVersion = !argv.dev ? + // 'latest' + // :`file:${relative(appDirectory, join(__dirname, '../../cli.js'))}` + const tauriCLIVersion = 'latest' const apiVersion = !argv.dev ? 'latest' : `file:${relative(appDirectory, join(__dirname, '../../api/dist'))}` diff --git a/tooling/create-tauri-app/test/spawn.test.mjs b/tooling/create-tauri-app/test/spawn.test.mjs index 866a2862a..082a18916 100644 --- a/tooling/create-tauri-app/test/spawn.test.mjs +++ b/tooling/create-tauri-app/test/spawn.test.mjs @@ -18,8 +18,8 @@ if (nodeVersion === '14') { } const ctaBinary = path.resolve('./bin/create-tauri-app.js') -const clijs = path.resolve('../cli.js/') -const api = path.resolve('../api/') +//const clijs = path.resolve('../cli.js/') +//const api = path.resolve('../api/') const manager = process.env.TAURI_RUN_MANAGER || 'yarn' const recipes = process.env.TAURI_RECIPE