From 8753402974b0f1c7a25c1ac1926a0f5be1e1b947 Mon Sep 17 00:00:00 2001 From: alMukaafih Date: Sat, 27 Jul 2024 08:01:00 +0100 Subject: [PATCH] Added: Add core and modules/mgr --- .editorconfig | 7 +- .gitattributes | 1 + .../workflows/{build-module-ci.yml => CI.yml} | 263 +-- .gitignore | 6 +- .vscode/settings.json | 3 +- README.md | 22 +- core/.npmignore | 4 + core/config.toml | 30 + core/dist/bin/vsa.js | 5 + core/dist/index.js | 90 + core/eslint.config.mjs | 31 + core/icons.vsix | Bin 0 -> 641878 bytes core/package.json | 41 + core/src/bin/vsa.ts | 4 + core/src/index.ts | 98 + core/tsconfig.json | 18 + core/typings/acode.d.ts | 1024 ++++++++++ core/typings/config.d.ts | 41 + core/typings/index.d.ts | 10 + core/typings/vsacode.d.ts | 20 + modules/build/Cargo.lock | 293 +++ modules/build/Cargo.toml | 6 + modules/build/index.d.ts | 15 +- modules/build/index.js | 5 +- .../build/npm/android-arm-eabi/package.json | 10 +- modules/build/npm/android-arm64/package.json | 10 +- modules/build/npm/darwin-arm64/package.json | 10 +- .../build/npm/darwin-universal/package.json | 10 +- modules/build/npm/darwin-x64/package.json | 10 +- modules/build/npm/freebsd-x64/package.json | 10 +- .../npm/linux-arm-gnueabihf/package.json | 10 +- .../npm/linux-arm-musleabihf/package.json | 10 +- .../build/npm/linux-arm64-gnu/package.json | 12 +- .../build/npm/linux-arm64-musl/package.json | 12 +- .../build/npm/linux-riscv64-gnu/package.json | 12 +- modules/build/npm/linux-x64-gnu/package.json | 12 +- modules/build/npm/linux-x64-musl/package.json | 12 +- .../build/npm/win32-arm64-msvc/package.json | 10 +- .../build/npm/win32-ia32-msvc/package.json | 10 +- modules/build/npm/win32-x64-msvc/package.json | 10 +- modules/build/package.json | 15 +- modules/build/src/contribs/icon_theme.rs | 49 + modules/build/src/contribs/mod.rs | 7 + modules/build/src/lib.rs | 57 +- modules/build/src/{util => types}/config.rs | 3 - modules/build/src/types/env.rs | 12 + modules/build/src/types/icon_theme.rs | 50 + modules/build/src/types/mod.rs | 4 + modules/build/src/types/package_json.rs | 35 + modules/build/src/util/env.rs | 9 - modules/build/src/util/extract.rs | 46 + modules/build/src/util/mod.rs | 5 +- modules/mgr/package.json | 23 + modules/mgr/src/index.js | 375 ++++ package.json | 26 +- vsa | 1 + yarn.lock | 1760 ++++++++++++++++- 57 files changed, 4473 insertions(+), 211 deletions(-) rename .github/workflows/{build-module-ci.yml => CI.yml} (75%) create mode 100644 core/.npmignore create mode 100644 core/config.toml create mode 100755 core/dist/bin/vsa.js create mode 100644 core/dist/index.js create mode 100644 core/eslint.config.mjs create mode 100755 core/icons.vsix create mode 100644 core/package.json create mode 100644 core/src/bin/vsa.ts create mode 100644 core/src/index.ts create mode 100644 core/tsconfig.json create mode 100644 core/typings/acode.d.ts create mode 100644 core/typings/config.d.ts create mode 100644 core/typings/index.d.ts create mode 100644 core/typings/vsacode.d.ts create mode 100644 modules/build/src/contribs/icon_theme.rs create mode 100644 modules/build/src/contribs/mod.rs rename modules/build/src/{util => types}/config.rs (58%) create mode 100644 modules/build/src/types/env.rs create mode 100644 modules/build/src/types/icon_theme.rs create mode 100644 modules/build/src/types/mod.rs create mode 100644 modules/build/src/types/package_json.rs delete mode 100644 modules/build/src/util/env.rs create mode 100644 modules/build/src/util/extract.rs create mode 100644 modules/mgr/package.json create mode 100644 modules/mgr/src/index.js create mode 120000 vsa diff --git a/.editorconfig b/.editorconfig index 1ed453a..854ce42 100644 --- a/.editorconfig +++ b/.editorconfig @@ -4,7 +4,12 @@ root = true end_of_line = lf insert_final_newline = true -[*.{js,json,yml}] +[*.{js,ts}] +charset = utf-8 +indent_style = space +indent_size = 4 + +[*.{json,yml}] charset = utf-8 indent_style = space indent_size = 2 diff --git a/.gitattributes b/.gitattributes index af3ad12..59dc012 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2,3 +2,4 @@ /.yarn/releases/* binary /.yarn/plugins/**/* binary /.pnp.* binary linguist-generated +/core/dist/** binary diff --git a/.github/workflows/build-module-ci.yml b/.github/workflows/CI.yml similarity index 75% rename from .github/workflows/build-module-ci.yml rename to .github/workflows/CI.yml index 92c2c60..12baaa9 100644 --- a/.github/workflows/build-module-ci.yml +++ b/.github/workflows/CI.yml @@ -1,9 +1,9 @@ -name: Build Module CI +name: CI env: DEBUG: napi:* - APP_NAME: build MACOSX_DEPLOYMENT_TARGET: '10.13' - APP_PATH: modules/build + MODULES: modules/* + VSA__PRIVATE: 1 permissions: contents: write id-token: write @@ -15,12 +15,10 @@ permissions: tags-ignore: - '**' paths: - - modules/build - - .github/workflows/build-module-ci.yml + - core + - modules + - .github/workflows/CI.yml pull_request: null -defaults: - run: - working-directory: modules/build jobs: build: @@ -30,68 +28,64 @@ jobs: settings: - host: macos-latest target: x86_64-apple-darwin - build: yarn build --target x86_64-apple-darwin + build: ./vsa mgr build --hoist --target x86_64-apple-darwin - host: windows-latest - build: yarn build --target x86_64-pc-windows-msvc + build: ./vsa mgr build --hoist --target x86_64-pc-windows-msvc target: x86_64-pc-windows-msvc - host: windows-latest build: | - yarn build --target i686-pc-windows-msvc - yarn test + ./vsa mgr build --hoist --target i686-pc-windows-msvc + ./vsa mgr test target: i686-pc-windows-msvc - host: ubuntu-latest target: x86_64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian build: | - cd modules/build - yarn build --target x86_64-unknown-linux-gnu + ./vsa mgr build --hoist --target x86_64-unknown-linux-gnu - host: ubuntu-latest target: x86_64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: | - cd modules/build - yarn build --target x86_64-unknown-linux-musl + ./vsa mgr build --hoist --target x86_64-unknown-linux-musl - host: macos-latest target: aarch64-apple-darwin - build: yarn build --target aarch64-apple-darwin + build: ./vsa mgr build --hoist --target aarch64-apple-darwin - host: ubuntu-latest target: aarch64-unknown-linux-gnu docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64 build: | - cd modules/build - yarn build --target aarch64-unknown-linux-gnu + ./vsa mgr build --hoist --target aarch64-unknown-linux-gnu - host: ubuntu-latest target: armv7-unknown-linux-gnueabihf setup: | sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabihf -y - build: yarn build --target armv7-unknown-linux-gnueabihf + build: ./vsa mgr build --hoist --target armv7-unknown-linux-gnueabihf - host: ubuntu-latest target: armv7-unknown-linux-musleabihf - build: yarn build --target armv7-unknown-linux-musleabihf + build: ./vsa mgr build --hoist --target armv7-unknown-linux-musleabihf - host: ubuntu-latest target: aarch64-linux-android - build: yarn build --target aarch64-linux-android + build: ./vsa mgr build --hoist --target aarch64-linux-android - host: ubuntu-latest target: armv7-linux-androideabi - build: yarn build --target armv7-linux-androideabi + build: ./vsa mgr build --hoist --target armv7-linux-androideabi - host: ubuntu-latest target: aarch64-unknown-linux-musl docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine build: |- set -e && rustup target add aarch64-unknown-linux-musl && - cd modules/build && - yarn build --target aarch64-unknown-linux-musl + ./vsa mgr build --hoist --target aarch64-unknown-linux-musl - host: windows-latest target: aarch64-pc-windows-msvc - build: yarn build --target aarch64-pc-windows-msvc + build: ./vsa mgr build --hoist --target aarch64-pc-windows-msvc - host: ubuntu-latest target: riscv64gc-unknown-linux-gnu setup: | sudo apt-get update sudo apt-get install gcc-riscv64-linux-gnu -y - build: yarn build --target riscv64gc-unknown-linux-gnu + build: ./vsa mgr build --hoist --target riscv64gc-unknown-linux-gnu name: stable - ${{ matrix.settings.target }} - node@20 runs-on: ${{ matrix.settings.host }} steps: @@ -152,7 +146,28 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: ${{ env.APP_PATH }}/${{ env.APP_NAME }}.*.node + path: "*.*.node" + if-no-files-found: error + build-core: + name: Build Core + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: yarn + - name: Install dependencies + run: yarn install + - name: Build + run: ./vsa mgr build --core + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: dists-core + path: | + core/dist if-no-files-found: error build-freebsd: runs-on: ubuntu-latest @@ -167,12 +182,13 @@ jobs: RUSTUP_HOME: /usr/local/rustup CARGO_HOME: /usr/local/cargo RUSTUP_IO_THREADS: 1 + VSA__PRIVATE: 1 with: operating_system: freebsd version: '14.0' memory: 8G cpu_count: 3 - environment_variables: DEBUG RUSTUP_IO_THREADS + environment_variables: DEBUG RUSTUP_IO_THREADS VSA__PRIVATE shell: bash run: | sudo pkg install -y -f curl node libnghttp2 npm yarn @@ -186,14 +202,13 @@ jobs: node -v echo "~~~~ yarn --version ~~~~" yarn --version - cd ${{ env.APP_PATH }} pwd ls -lah whoami env freebsd-version yarn install - yarn build + ./vsa mgr build --hoist --target x86_64-unknown-freebsd rm -rf node_modules rm -rf target rm -rf .yarn/cache @@ -201,7 +216,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: bindings-freebsd - path: ${{ env.APP_PATH }}/${{ env.APP_NAME }}.*.node + path: "*.*.node" if-no-files-found: error test-macOS-windows-binding: name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} @@ -227,17 +242,20 @@ jobs: node-version: ${{ matrix.node }} architecture: x64 - name: Install dependencies - run: yarn install + run: | + yarn install - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-${{ matrix.settings.target }} - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - name: List packages run: ls -R . shell: bash - name: Test bindings - run: yarn test + run: ./vsa mgr test test-linux-x64-gnu-binding: name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }} needs: @@ -257,19 +275,19 @@ jobs: node-version: ${{ matrix.node }} cache: yarn - name: Install dependencies - run: | - yarn install - mv ../node_modules . + run: yarn install - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-gnu - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - 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 + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim ./vsa mgr test test-linux-x64-musl-binding: name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }} needs: @@ -292,17 +310,18 @@ jobs: run: | yarn config set supportedArchitectures.libc "musl" yarn install - mv ../node_modules . - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-x86_64-unknown-linux-musl - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - 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 + run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine ./vsa mgr test test-linux-aarch64-gnu-binding: name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }} needs: @@ -315,21 +334,22 @@ jobs: - '20' runs-on: ubuntu-latest steps: + - name: Install dependencies + run: | + yarn config set supportedArchitectures.cpu "arm64" + yarn config set supportedArchitectures.libc "glibc" + yarn install - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-gnu - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm64" - yarn config set supportedArchitectures.libc "glibc" - yarn install - cp -a ../node_modules . - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -342,8 +362,7 @@ jobs: options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' run: | set -e - cd core - yarn test + ./vsa mgr test ls -la test-linux-aarch64-musl-binding: name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }} @@ -351,21 +370,22 @@ jobs: - build runs-on: ubuntu-latest steps: + - name: Install dependencies + run: | + yarn config set supportedArchitectures.cpu "arm64" + yarn config set supportedArchitectures.libc "musl" + yarn install - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-aarch64-unknown-linux-musl - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm64" - yarn config set supportedArchitectures.libc "musl" - yarn install - cp -a ../node_modules . - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -378,8 +398,7 @@ jobs: options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build' run: | set -e - cd core - yarn test + ./vsa mgr test test-linux-arm-gnueabihf-binding: name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }} needs: @@ -392,20 +411,21 @@ jobs: - '20' runs-on: ubuntu-latest steps: + - name: Install dependencies + run: | + yarn config set supportedArchitectures.cpu "arm" + yarn install - uses: actions/checkout@v4 - name: Download artifacts uses: actions/download-artifact@v4 with: name: bindings-armv7-unknown-linux-gnueabihf - path: ${{ env.APP_PATH }}/. + path: . + - name: Resolve bindings + run: ./vsa mgr resolve - name: List packages run: ls -R . shell: bash - - name: Install dependencies - run: | - yarn config set supportedArchitectures.cpu "arm" - yarn install - cp -a ../node_modules . - name: Set up QEMU uses: docker/setup-qemu-action@v3 with: @@ -418,8 +438,7 @@ jobs: options: '--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build' run: | set -e - cd core - yarn test + ./vsa mgr test ls -la universal-macOS: name: Build universal macOS binary @@ -439,64 +458,68 @@ jobs: uses: actions/download-artifact@v4 with: name: bindings-x86_64-apple-darwin - path: ${{ env.APP_PATH }}/artifacts + path: artifacts + - name: Resolve bindings + run: ./vsa mgr resolve artifacts - name: Download macOS arm64 artifact uses: actions/download-artifact@v4 with: name: bindings-aarch64-apple-darwin - path: ${{ env.APP_PATH }}/artifacts + path: artifacts + - name: Resolve bindings + run: ./vsa mgr resolve artifacts - name: Combine binaries - run: yarn universal + run: ./vsa mgr universal - name: Upload artifact uses: actions/upload-artifact@v4 with: name: bindings-universal-apple-darwin - path: ${{ env.APP_PATH }}/${{ env.APP_NAME }}.*.node + path: "*.*.node" if-no-files-found: error - 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 - - universal-macOS - steps: - - uses: actions/checkout@v4 - - name: Setup node - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: yarn - - name: Install dependencies - run: yarn install - - name: Download all artifacts - uses: actions/download-artifact@v4 - with: - path: core/artifacts - - name: Move artifacts - run: yarn artifacts - - name: List packages - run: ls -R ./npm - shell: bash - - name: Publish - run: | - npm config set provenance true - 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 }} + # 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 + # - universal-macOS + # steps: + # - uses: actions/checkout@v4 + # - name: Setup node + # uses: actions/setup-node@v4 + # with: + # node-version: 20 + # cache: yarn + # - name: Install dependencies + # run: yarn install + # - name: Download all artifacts + # uses: actions/download-artifact@v4 + # with: + # path: artifacts + # - name: Move artifacts + # run: yarn artifacts + # - name: List packages + # run: ls -R ./npm + # shell: bash + # - name: Publish + # run: | + # npm config set provenance true + # 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/.gitignore b/.gitignore index d028fba..61b7311 100644 --- a/.gitignore +++ b/.gitignore @@ -45,9 +45,6 @@ build/Release node_modules/ jspm_packages/ -# TypeScript v1 declaration files -typings/ - # TypeScript cache *.tsbuildinfo @@ -190,3 +187,6 @@ $RECYCLE.BIN/ !.yarn/versions *.node +vsacode-main +!core/dist +core/dist/**/*.d.ts \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ca5abd..591fb22 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "rust-analyzer.linkedProjects": [ "modules/build/Cargo.toml" - ] + ], + "rust-analyzer.procMacro.ignored": { "napi-derive": ["napi"] } } \ No newline at end of file diff --git a/README.md b/README.md index 5e164f4..b273abb 100644 --- a/README.md +++ b/README.md @@ -1 +1,21 @@ -# vsacode +# VS -> Acode - Extending the Acode Editor +![vsacode](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2FalMukaafih%2Fvsacode%2Fraw%2Fdevel%2Fpackage.json&query=%24.version&logo=github&label=vsacode) + +## Overview +This is a Package for installing [VS Code](https://code.visualstudio.com/) Extensions in [Acode](https://acode.app/) Editor. + +## Cli Tool +It includes a command line converter. +You can install using +```sh +npm install -g vsacode +``` + +### Commands +- `build:` Build Acode plugin from VS Extension. + +## Authors +- [@alMukaafih](https://github.com/alMukaafih) - Creator + +## Bugs +To report a bug, visit our [GitHub Issues](https://github.com/alMukaafih/vsacode/issues) page and create a new issue. diff --git a/core/.npmignore b/core/.npmignore new file mode 100644 index 0000000..d3619bc --- /dev/null +++ b/core/.npmignore @@ -0,0 +1,4 @@ +src +*.vsix +eslint.config.mjs +tsconfig.json \ No newline at end of file diff --git a/core/config.toml b/core/config.toml new file mode 100644 index 0000000..8a27ee2 --- /dev/null +++ b/core/config.toml @@ -0,0 +1,30 @@ +version = "0.6.0" + +[flags] +# Print help +--help = { arg = false } +# Print version info and exit +--version = { arg = false } + +# Build plugin from vsix +[modules.build] +import = "@vsacode/build" +[modules.build.attributes] +tmpDir = true +vsix = true + +# Manage vsacode +[modules.mgr] +import = "@vsacode/mgr" +[modules.mgr.attributes] +args = true +private = true +subCmd = true + +[aliases.flags] +-h = "--help" +-V = "--version" + +[aliases.modules] +b = "build" +m = "mgr" diff --git a/core/dist/bin/vsa.js b/core/dist/bin/vsa.js new file mode 100755 index 0000000..d571bc7 --- /dev/null +++ b/core/dist/bin/vsa.js @@ -0,0 +1,5 @@ +#!/usr/bin/env node +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const __1 = require(".."); +(0, __1.init)(process.argv.slice(2)); diff --git a/core/dist/index.js b/core/dist/index.js new file mode 100644 index 0000000..55d1b2e --- /dev/null +++ b/core/dist/index.js @@ -0,0 +1,90 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.init = void 0; +const node_path_1 = __importDefault(require("node:path")); +const node_os_1 = __importDefault(require("node:os")); +const node_fs_1 = __importDefault(require("node:fs")); +const toml = require("smol-toml"); +function init(args0) { + if (args0.length < 1) + process.exit(); + if (args0[0].startsWith("-")) { + process.exit(); + } + let env = { + currentDir: process.cwd(), + home: node_path_1.default.dirname(__dirname), + }; + let _toml = node_fs_1.default + .readFileSync(node_path_1.default.join(__dirname, "../config.toml")) + .toString(); + let config = toml.parse(_toml); + let cmd = args0[0]; + let _module; + if (cmd in config.modules) { + _module = config.modules[cmd]; + } + else if (cmd in config.aliases.modules) { + let c = config.aliases.modules[cmd]; + _module = config.modules[c]; + } + else { + console.log(`Unknown Command: ${cmd}`); + process.exit(1); + } + if (_module.attributes.private && !process.env.VSA__PRIVATE) { + console.log("VSA__PRIVATE not set"); + //process.exit(1) + } + let args = []; + let flags = []; + if (!_module.attributes.subCmd) { + for (let i = 1; i < args0.length; i++) { + let arg = args0[i]; + if (arg.startsWith("-")) { + flags.push(arg); + continue; + } + args.push(arg); + } + env.flags = flags; + } + else { + args = args0.slice(1); + } + if (_module.attributes.vsix) { + if (args.length) + env.vsixPath = node_path_1.default.resolve(args[0]); + } + if (_module.attributes.args) + env.args = args; + let tmpDir; + if (_module.attributes.tmpDir) { + tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), "vsa-")); + env.tmpDir = tmpDir; + } + // cleanup task + if (_module.attributes.tmpDir && !args0.includes("--debug")) { + process.on("exit", () => { + node_fs_1.default.rmSync(tmpDir, { recursive: true }); + }); + } + if (args0.includes("--debug")) { + console.log(env); + } + let module = require(_module.import); + let main = new module.Main(env); + try { + main.init(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + catch (e) { + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + console.log(`Error: ${e.message}`); + process.exit(1); + } +} +exports.init = init; diff --git a/core/eslint.config.mjs b/core/eslint.config.mjs new file mode 100644 index 0000000..a7fef16 --- /dev/null +++ b/core/eslint.config.mjs @@ -0,0 +1,31 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default [ + { + languageOptions: { + parserOptions: { + project: true, + }, + globals: globals.node, + }, + }, + pluginJs.configs.recommended, + ...tseslint.configs.strictTypeChecked, + ...tseslint.configs.stylisticTypeChecked, + { + rules: { + "@typescript-eslint/prefer-for-of": "off", + "@typescript-eslint/no-unsafe-assignment": "off", + "@typescript-eslint/no-unsafe-member-access": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/no-unsafe-argument": "off", + "@typescript-eslint/no-unsafe-call": "off", + "prefer-const": "off" + } + }, + { + ignores: ["*", "!src/"], + }, +]; diff --git a/core/icons.vsix b/core/icons.vsix new file mode 100755 index 0000000000000000000000000000000000000000..278cb8fa9762038e2626148ee094a42c793cce7d GIT binary patch literal 641878 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