diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..f14a1a5 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,26 @@ +{ + "root": true, + "extends": [ + "plugin:vue/vue3-recommended", + "eslint:recommended", + "@vue/eslint-config-typescript", + "@vue/eslint-config-prettier" + ], + "parserOptions": { + "ecmaVersion": "latest" + }, + "rules": { + "vue/multi-word-component-names": "off", + "vue/no-v-html": "off", + "vue/max-attributes-per-line": ["error", { + "singleline": 10, + "multiline": 1 + }], + // todo 临时屏蔽 + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": ["warn", { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + }] + } +} \ No newline at end of file diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml new file mode 100644 index 0000000..1a7d411 --- /dev/null +++ b/.github/workflows/dev.yml @@ -0,0 +1,142 @@ +name: Dev Build + +on: + workflow_dispatch: + push: + branches: + - main + - master + - dev + paths-ignore: + - '**.md' + - '.github/workflows/release.yml' + - '.github/workflows/updater.yml' + +jobs: + check-version: + runs-on: ubuntu-latest + outputs: + should_build: ${{ steps.check.outputs.should_build }} + version: ${{ steps.check.outputs.version }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Check if package.json version changed + id: check + run: | + git diff HEAD^ HEAD --name-only | grep package.json || echo "No package.json changes" + + # 获取当前版本 + CURRENT_VERSION=$(node -p "require('./package.json').version") + echo "Current version: $CURRENT_VERSION" + echo "version=v$CURRENT_VERSION" >> $GITHUB_OUTPUT + + # 手动触发 + if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then + echo "Workflow manually triggered, building..." + echo "should_build=true" >> $GITHUB_OUTPUT + exit 0 + fi + + # 检查package.json中version是否改变 + if git diff HEAD^ HEAD --name-only | grep -q package.json; then + PREV_VERSION=$(git show HEAD^:package.json | node -p "JSON.parse(require('fs').readFileSync(0)).version") + echo "Previous version: $PREV_VERSION" + + if [[ "$CURRENT_VERSION" != "$PREV_VERSION" ]]; then + echo "Version changed, building..." + echo "should_build=true" >> $GITHUB_OUTPUT + else + echo "Version not changed, skipping build." + echo "should_build=false" >> $GITHUB_OUTPUT + fi + else + echo "Should build anyway..." + echo "should_build=true" >> $GITHUB_OUTPUT + fi + + build-tauri: + needs: check-version + if: needs.check-version.outputs.should_build == 'true' + strategy: + fail-fast: false + matrix: + include: + - platform: 'macos-14' + args: '--target aarch64-apple-darwin' + display_name: 'macOS-ARM64' + - platform: 'macos-latest' + args: '--target x86_64-apple-darwin' + display_name: 'macOS-Intel' + - platform: 'windows-latest' + args: '--target x86_64-pc-windows-msvc' + display_name: 'Windows-x64' + - platform: 'windows-latest' + args: '--target aarch64-pc-windows-msvc' + display_name: 'Windows-ARM64' + + runs-on: ${{ matrix.platform }} + name: Dev Build - ${{ matrix.display_name }} + steps: + - uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v3 + with: + version: latest + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'pnpm' + + - name: install Rust stable + uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.platform == 'macos-latest' && 'x86_64-apple-darwin' || matrix.platform == 'macos-14' && 'aarch64-apple-darwin' || contains(matrix.args, 'aarch64-pc-windows-msvc') && 'aarch64-pc-windows-msvc' || '' }} + + - name: Install dependencies (macOS) + if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-14' + run: | + brew install openssl@3 + + - name: Rust cache + uses: swatinem/rust-cache@v2 + with: + workspaces: './src-tauri -> target' + + - name: Install dependencies + run: pnpm install + + - name: Build Tauri App (macOS) + if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-14' + env: + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} + run: | + pnpm tauri build ${{ matrix.args }} + + - name: Build Tauri App (Windows) + if: matrix.platform == 'windows-latest' + env: + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} + run: | + pnpm tauri build ${{ matrix.args }} + + - name: Upload Dev Build Artifacts + uses: actions/upload-artifact@v4 + with: + name: dev-${{ needs.check-version.outputs.version }}-${{ matrix.display_name }} + path: | + src-tauri/target/*/release/bundle/msi/*.msi + src-tauri/target/*/release/bundle/nsis/*.exe + src-tauri/target/*/release/bundle/dmg/*.dmg + src-tauri/target/*/release/bundle/deb/*.deb + src-tauri/target/*/release/bundle/appimage/*.AppImage + src-tauri/target/*/release/bundle/macos/*.app + retention-days: 7 \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3d01b3a..eccb4dc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,39 +6,46 @@ on: push: tags: - 'v*' - branches: - - main - - master - - dev permissions: contents: write jobs: publish-tauri: - if: startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/dev' + if: startsWith(github.ref, 'refs/tags/v') strategy: fail-fast: false matrix: include: - platform: 'macos-14' args: '--target aarch64-apple-darwin' + display_name: 'macOS-ARM64' - platform: 'macos-latest' args: '--target x86_64-apple-darwin' + display_name: 'macOS-Intel' - platform: 'windows-latest' args: '--target x86_64-pc-windows-msvc' + display_name: 'Windows-x64-Standard' - platform: 'windows-latest' args: '--target aarch64-pc-windows-msvc' + display_name: 'Windows-ARM64-Standard' runs-on: ${{ matrix.platform }} + name: Build ${{ matrix.display_name }} steps: - uses: actions/checkout@v4 + - name: Setup pnpm + uses: pnpm/action-setup@v3 + with: + version: latest + run_install: false + - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - cache: 'npm' + cache: 'pnpm' - name: Get Version (Windows) if: matrix.platform == 'windows-latest' @@ -59,7 +66,7 @@ jobs: - name: install Rust stable uses: dtolnay/rust-toolchain@stable with: - targets: ${{ matrix.platform == 'macos-latest' && 'x86_64-apple-darwin' || matrix.platform == 'macos-14' && 'aarch64-apple-darwin' || matrix.args == '--target aarch64-pc-windows-msvc' && 'aarch64-pc-windows-msvc' || '' }} + targets: ${{ matrix.platform == 'macos-latest' && 'x86_64-apple-darwin' || matrix.platform == 'macos-14' && 'aarch64-apple-darwin' || contains(matrix.args, 'aarch64-pc-windows-msvc') && 'aarch64-pc-windows-msvc' || '' }} - name: Install dependencies (macOS) if: matrix.platform == 'macos-latest' || matrix.platform == 'macos-14' @@ -72,7 +79,7 @@ jobs: workspaces: './src-tauri -> target' - name: Install dependencies - run: npm install + run: pnpm install - name: Create Release if: startsWith(github.ref, 'refs/tags/v') && matrix.platform == 'macos-14' @@ -98,18 +105,150 @@ jobs: prerelease: false args: ${{ matrix.args }} includeUpdaterJson: true - - # 为dev分支上传构建产物 - - name: Upload Dev Build Artifacts - if: github.ref == 'refs/heads/dev' - uses: actions/upload-artifact@v4 + + publish-webview2-fixed: + if: startsWith(github.ref, 'refs/tags/v') + strategy: + fail-fast: false + matrix: + include: + - platform: 'windows-latest' + target: 'x86_64-pc-windows-msvc' + arch: 'x64' + display_name: 'Windows-x64-FixedWebView2' + - platform: 'windows-latest' + target: 'aarch64-pc-windows-msvc' + arch: 'arm64' + display_name: 'Windows-ARM64-FixedWebView2' + + runs-on: ${{ matrix.platform }} + name: Build ${{ matrix.display_name }} + steps: + - uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v3 + with: + version: latest + run_install: false + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'pnpm' + + - name: Get Version + id: get_version + shell: pwsh + run: | + $VERSION = (node -p "require('./package.json').version") + echo "version=v$VERSION" >> $env:GITHUB_OUTPUT + + - name: install Rust stable + uses: dtolnay/rust-toolchain@stable with: - name: ${{ matrix.platform }}-${{ matrix.args }}-build - path: | - src-tauri/target/*/release/bundle/msi/*.msi - src-tauri/target/*/release/bundle/nsis/*.exe - src-tauri/target/*/release/bundle/dmg/*.dmg - src-tauri/target/*/release/bundle/deb/*.deb - src-tauri/target/*/release/bundle/appimage/*.AppImage - src-tauri/target/*/release/bundle/macos/*.app - retention-days: 7 \ No newline at end of file + targets: ${{ matrix.target }} + + - name: Rust cache + uses: swatinem/rust-cache@v2 + with: + workspaces: './src-tauri -> target' + + - name: Install dependencies + run: pnpm install + + - name: Prepare WebView2 Fixed Runtime + shell: pwsh + run: | + # 创建WebView2配置文件 + $webviewConfigContent = @" + { + "bundle": { + "windows": { + "webviewInstallMode": { + "type": "fixedRuntime", + "path": "./webview2-runtime/${{ matrix.arch }}/" + } + } + } + } + "@ + + # 保存配置文件 + New-Item -Path "src-tauri" -Name "tauri.windows.conf.json" -ItemType "file" -Value $webviewConfigContent -Force + + # 下载WebView2运行时 + mkdir -p src-tauri/webview2-runtime/${{ matrix.arch }} + + # 根据架构选择不同的下载链接 + if ("${{ matrix.arch }}" -eq "x64") { + Invoke-WebRequest -Uri "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/949b4951-7f54-4504-8a73-ccad659afdb1/Microsoft.WebView2.FixedVersionRuntime.134.0.3124.72.x64.cab" -OutFile "webview2-runtime.cab" + } else { + Invoke-WebRequest -Uri "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/abc49133-bb96-41e6-a555-8ea087ff4564/Microsoft.WebView2.FixedVersionRuntime.134.0.3124.72.arm64.cab" -OutFile "webview2-runtime.cab" + } + + cmd /c "expand webview2-runtime.cab -F:* .\src-tauri\webview2-runtime\${{ matrix.arch }}\" + + # 验证文件是否存在 + if (Test-Path -Path "src-tauri/webview2-runtime/${{ matrix.arch }}") { + Write-Host "WebView2 运行时目录已创建" + Get-ChildItem -Path "src-tauri/webview2-runtime/${{ matrix.arch }}" | Select-Object -First 5 + } + + if (Test-Path -Path "src-tauri/tauri.windows.conf.json") { + Write-Host "Windows配置文件已创建:" + Get-Content -Path "src-tauri/tauri.windows.conf.json" + } + + - name: Build Tauri App + uses: tauri-apps/tauri-action@v0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} + with: + tagName: ${{ steps.get_version.outputs.version }} + releaseName: ${{ steps.get_version.outputs.version }} + releaseDraft: false + prerelease: false + args: --target ${{ matrix.target }} --config src-tauri/tauri.windows.conf.json + includeUpdaterJson: true + + - name: Rename Artifacts + shell: pwsh + run: | + # 重命名MSI文件 + $msiFiles = Get-ChildItem -Path ".\src-tauri\target\${{ matrix.target }}\release\bundle\msi\*.msi" + foreach ($file in $msiFiles) { + $newName = $file.Name -replace ".msi$", "_fixed-webview2.msi" + $newPath = Join-Path -Path $file.Directory.FullName -ChildPath $newName + Move-Item -Path $file.FullName -Destination $newPath + Write-Host "Renamed: $($file.Name) -> $newName" + } + + # 重命名NSIS安装程序 + $exeFiles = Get-ChildItem -Path ".\src-tauri\target\${{ matrix.target }}\release\bundle\nsis\*-setup.exe" + foreach ($file in $exeFiles) { + $newName = $file.Name -replace "-setup\.exe$", "_fixed-webview2-setup.exe" + $newPath = Join-Path -Path $file.Directory.FullName -ChildPath $newName + Move-Item -Path $file.FullName -Destination $newPath + Write-Host "Renamed: $($file.Name) -> $newName" + } + + # 重命名签名文件 + $sigFiles = Get-ChildItem -Path ".\src-tauri\target\${{ matrix.target }}\release\bundle\*\*.sig" + foreach ($file in $sigFiles) { + if ($file.Name -match "-setup\.exe\.sig$") { + $newName = $file.Name -replace "-setup\.exe\.sig$", "_fixed-webview2-setup.exe.sig" + $newPath = Join-Path -Path $file.Directory.FullName -ChildPath $newName + Move-Item -Path $file.FullName -Destination $newPath + Write-Host "Renamed: $($file.Name) -> $newName" + } + elseif ($file.Name -match "\.msi\.sig$") { + $newName = $file.Name -replace "\.msi\.sig$", "_fixed-webview2.msi.sig" + $newPath = Join-Path -Path $file.Directory.FullName -ChildPath $newName + Move-Item -Path $file.FullName -Destination $newPath + Write-Host "Renamed: $($file.Name) -> $newName" + } + } \ No newline at end of file diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml new file mode 100644 index 0000000..eb3e0cb --- /dev/null +++ b/.github/workflows/updater.yml @@ -0,0 +1,299 @@ +name: Generate Updater Files + +on: + workflow_dispatch: + inputs: + version: + description: '版本号 (不含v前缀)' + required: true + type: string + workflow_run: + workflows: [Release] + types: + - completed + +permissions: + contents: write + +jobs: + check-release: + runs-on: ubuntu-latest + if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' + outputs: + version: ${{ steps.get-version.outputs.version }} + release_id: ${{ steps.get-release.outputs.release_id }} + steps: + - name: Get version from input + id: get-version-input + if: github.event_name == 'workflow_dispatch' + run: | + echo "version=v${{ github.event.inputs.version }}" >> $GITHUB_OUTPUT + + - uses: actions/checkout@v4 + if: github.event_name == 'workflow_run' + + - name: Get version from package.json + id: get-version-package + if: github.event_name == 'workflow_run' + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=v$VERSION" >> $GITHUB_OUTPUT + + - name: Set final version + id: get-version + run: | + if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then + echo "version=${{ steps.get-version-input.outputs.version }}" >> $GITHUB_OUTPUT + else + echo "version=${{ steps.get-version-package.outputs.version }}" >> $GITHUB_OUTPUT + fi + echo "Using version: ${{ steps.get-version.outputs.version }}" + + - name: Get GitHub Release + id: get-release + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const version = '${{ steps.get-version.outputs.version }}'; + + try { + const release = await github.rest.repos.getReleaseByTag({ + owner, + repo, + tag: version + }); + + console.log(`Found release: ${release.data.id} for tag ${version}`); + return { release_id: release.data.id.toString() }; + } catch (error) { + console.log(`No release found for tag ${version}`); + return { release_id: '' }; + } + + generate-standard-updater: + needs: check-release + if: needs.check-release.outputs.release_id != '' + runs-on: ubuntu-latest + name: Generate Standard Updater Files + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install tauri-cli + run: cargo install tauri-cli --version "^1.5" + + - name: Download release assets metadata + id: download-assets + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const release_id = ${{ needs.check-release.outputs.release_id }}; + + const assets = await github.rest.repos.listReleaseAssets({ + owner, + repo, + release_id + }); + + // 创建资产列表,排除fixed-webview2版本和sig文件 + const standardAssets = assets.data + .filter(asset => + !asset.name.includes('_fixed-webview2') && + !asset.name.endsWith('.sig') && + !asset.name.includes('darwin-universal') + ) + .map(asset => ({ + name: asset.name, + url: asset.browser_download_url, + id: asset.id + })); + + console.log(`Found ${standardAssets.length} standard release assets`); + return { assets: JSON.stringify(standardAssets) }; + + - name: Generate updater JSON + run: | + assets='${{ fromJson(steps.download-assets.outputs.assets) }}' + version='${{ needs.check-release.outputs.version }}' + + echo "Assets: $assets" + echo "Version: $version" + + # 创建临时目录 + mkdir -p updater-tmp + cd updater-tmp + + # 创建资产清单JSON + echo "$assets" > assets.json + + # 生成更新文件 + cargo tauri migrate + + # 使用版本号而不是'latest'以区分不同版本的更新文件 + cargo tauri updater --version $version + + - name: Upload updater files to release + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const { owner, repo } = context.repo; + const release_id = ${{ needs.check-release.outputs.release_id }}; + + // 查找生成的更新文件 + const updaterDir = 'updater-tmp'; + const files = fs.readdirSync(updaterDir).filter(f => f.endsWith('.json')); + + // 读取基础更新文件内容 + let content = {}; + if (files.length > 0) { + const mainUpdaterFile = files.find(f => f !== 'latest.json') || files[0]; + const updaterContent = fs.readFileSync(`${updaterDir}/${mainUpdaterFile}`, 'utf8'); + content = JSON.parse(updaterContent); + } + + // 创建最终的更新文件 - 标准版本 + const finalContent = { + version: '${{ needs.check-release.outputs.version }}'.replace('v', ''), + notes: '', + pub_date: new Date().toISOString(), + platforms: content.platforms || {} + }; + + // 保存到最终JSON文件 + const updaterJson = JSON.stringify(finalContent, null, 2); + fs.writeFileSync('standard-updater.json', updaterJson); + + // 上传到GitHub Release + await github.rest.repos.uploadReleaseAsset({ + owner, + repo, + release_id, + name: 'standard-updater.json', + data: fs.readFileSync('standard-updater.json') + }); + + console.log('Standard updater file uploaded to release'); + + generate-webview2-updater: + needs: check-release + if: needs.check-release.outputs.release_id != '' + runs-on: ubuntu-latest + name: Generate Fixed WebView2 Updater Files + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup Rust + uses: dtolnay/rust-toolchain@stable + + - name: Install tauri-cli + run: cargo install tauri-cli --version "^1.5" + + - name: Download release assets metadata + id: download-assets + uses: actions/github-script@v7 + with: + script: | + const { owner, repo } = context.repo; + const release_id = ${{ needs.check-release.outputs.release_id }}; + + const assets = await github.rest.repos.listReleaseAssets({ + owner, + repo, + release_id + }); + + // 创建资产列表,仅包含fixed-webview2版本并排除sig文件 + const webview2Assets = assets.data + .filter(asset => + asset.name.includes('_fixed-webview2') && + !asset.name.endsWith('.sig') + ) + .map(asset => ({ + name: asset.name, + url: asset.browser_download_url, + id: asset.id + })); + + console.log(`Found ${webview2Assets.length} WebView2 fixed release assets`); + return { assets: JSON.stringify(webview2Assets) }; + + - name: Generate updater JSON for WebView2 fixed version + run: | + assets='${{ fromJson(steps.download-assets.outputs.assets) }}' + version='${{ needs.check-release.outputs.version }}' + + echo "WebView2 Assets: $assets" + echo "Version: $version" + + # 创建临时目录 + mkdir -p updater-webview2-tmp + cd updater-webview2-tmp + + # 创建资产清单JSON + echo "$assets" > assets.json + + # 生成更新文件 + cargo tauri migrate + + # 使用版本号而不是'latest'以区分不同版本的更新文件 + cargo tauri updater --version $version + + - name: Upload WebView2 updater files to release + uses: actions/github-script@v7 + with: + script: | + const fs = require('fs'); + const { owner, repo } = context.repo; + const release_id = ${{ needs.check-release.outputs.release_id }}; + + // 查找生成的更新文件 + const updaterDir = 'updater-webview2-tmp'; + const files = fs.readdirSync(updaterDir).filter(f => f.endsWith('.json')); + + // 读取基础更新文件内容 + let content = {}; + if (files.length > 0) { + const mainUpdaterFile = files.find(f => f !== 'latest.json') || files[0]; + const updaterContent = fs.readFileSync(`${updaterDir}/${mainUpdaterFile}`, 'utf8'); + content = JSON.parse(updaterContent); + } + + // 创建最终的更新文件 - WebView2固定版本 + const finalContent = { + version: '${{ needs.check-release.outputs.version }}'.replace('v', ''), + notes: '', + pub_date: new Date().toISOString(), + platforms: content.platforms || {} + }; + + // 保存到最终JSON文件 + const updaterJson = JSON.stringify(finalContent, null, 2); + fs.writeFileSync('webview2-fixed-updater.json', updaterJson); + + // 上传到GitHub Release + await github.rest.repos.uploadReleaseAsset({ + owner, + repo, + release_id, + name: 'webview2-fixed-updater.json', + data: fs.readFileSync('webview2-fixed-updater.json') + }); + + console.log('WebView2 fixed updater file uploaded to release'); \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9b7242f..1c4bf9c 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,15 @@ docs .tauri/ icon.png todo.txt -scripts/ \ No newline at end of file +scripts/ + +# pnpm +.pnpm-store/ +node_modules/.pnpm + +# debug md +DEBUG.md + +# ESLint and Prettier cache files +.eslintcache +.prettierrc.cache \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..91b60d5 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +npx --no -- commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..5fcfc75 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +pnpm lint-staged \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..104524d --- /dev/null +++ b/.npmrc @@ -0,0 +1,5 @@ +{} +shamefully-hoist=true +strict-peer-dependencies=false +auto-install-peers=true +engine-strict=true diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..df5598a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,18 @@ +{ + "endOfLine": "auto", + "overrides": [ + { + "files": ["*.json5"], + "options": { + "quoteProps": "preserve", + "singleQuote": false + } + } + ], + "printWidth": 100, + "proseWrap": "never", + "semi": false, + "singleQuote": true, + "vueIndentScriptAndStyle": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/COMMIT_CONVENTION.md b/COMMIT_CONVENTION.md new file mode 100644 index 0000000..a112b66 --- /dev/null +++ b/COMMIT_CONVENTION.md @@ -0,0 +1,49 @@ +# Commit Convention + +This project follows [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/). + +## Format + +``` +(): + + + +