diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5859bb2c..714f60d3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,13 @@ name: Release on: workflow_dispatch: + inputs: + package: + description: Package to release + default: wxt + type: choice + options: + - wxt jobs: validate: @@ -22,18 +29,18 @@ jobs: run: | git config user.email "github-actions@users.noreply.github.com" git config user.name "GitHub Actions" - pnpx changelogen@latest --release + pnpm tsx scripts/bump-package-version.ts ${{ inputs.package }} git push git push --tags - working-directory: packages/wxt - name: NPM run: | echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc pnpm build pnpm publish - working-directory: packages/wxt + working-directory: packages/${{ inputs.package }} - name: GitHub Release - run: pnpx changelogen@latest gh release --token ${{ secrets.GITHUB_TOKEN }} - working-directory: packages/wxt + run: pnpm tsx scripts/create-github-release.ts ${{ inputs.package }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/sync-releases.yml b/.github/workflows/sync-releases.yml index 48068cdd..47bcf4d6 100644 --- a/.github/workflows/sync-releases.yml +++ b/.github/workflows/sync-releases.yml @@ -1,11 +1,13 @@ name: Sync Releases on: workflow_dispatch: - push: - branches: - - main - paths: - - packages/wxt/CHANGELOG.md + inputs: + package: + description: Package to sync + default: wxt + type: choice + options: + - wxt jobs: sync: @@ -17,5 +19,6 @@ jobs: with: node-version: 18 cache: pnpm - - run: pnpm sync-releases all --token ${{ secrets.GITHUB_TOKEN }} - working-directory: packages/wxt + - run: pnpm tsx scripts/sync-releases.ts ${{ inputs.package }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/package.json b/package.json index b01b86b3..1e5a6695 100644 --- a/package.json +++ b/package.json @@ -19,13 +19,17 @@ }, "devDependencies": { "@aklinker1/check": "^1.1.1", + "@types/fs-extra": "^11.0.4", "@vitest/coverage-v8": "^1.0.1", + "changelogen": "^0.5.5", "consola": "^3.2.3", "execa": "^9.1.0", + "fs-extra": "^11.1.1", "lint-staged": "^15.2.0", "npm-run-all": "^4.1.5", "prettier": "^3.3.0", "simple-git-hooks": "^2.9.0", + "tsx": "^4.11.2", "typedoc": "^0.25.4", "typedoc-plugin-markdown": "4.0.0-next.23", "typedoc-vitepress-theme": "1.0.0-next.3", @@ -50,5 +54,10 @@ "search-insights" ] } + }, + "changelog": { + "excludeAuthors": [ + "aaronklinker1@gmail.com" + ] } } diff --git a/packages/wxt/package.json b/packages/wxt/package.json index 0713fe81..72f165ef 100644 --- a/packages/wxt/package.json +++ b/packages/wxt/package.json @@ -158,10 +158,5 @@ "tsup": "^8.0.1", "tsx": "^4.11.2", "typescript": "^5.3.2" - }, - "changelog": { - "excludeAuthors": [ - "aaronklinker1@gmail.com" - ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db3619e6..9afdda53 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,15 +11,24 @@ importers: '@aklinker1/check': specifier: ^1.1.1 version: 1.2.0(typescript@5.3.3) + '@types/fs-extra': + specifier: ^11.0.4 + version: 11.0.4 '@vitest/coverage-v8': specifier: ^1.0.1 version: 1.2.2(vitest@1.5.3) + changelogen: + specifier: ^0.5.5 + version: 0.5.5 consola: specifier: ^3.2.3 version: 3.2.3 execa: specifier: ^9.1.0 version: 9.1.0 + fs-extra: + specifier: ^11.1.1 + version: 11.2.0 lint-staged: specifier: ^15.2.0 version: 15.2.2 @@ -32,6 +41,9 @@ importers: simple-git-hooks: specifier: ^2.9.0 version: 2.11.1 + tsx: + specifier: ^4.11.2 + version: 4.11.2 typedoc: specifier: ^0.25.4 version: 0.25.4(typescript@5.3.3) @@ -1999,7 +2011,6 @@ packages: /big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - dev: false /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -2040,7 +2051,6 @@ packages: engines: {node: '>= 5.10.0'} dependencies: big-integer: 1.6.52 - dev: false /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2078,7 +2088,6 @@ packages: engines: {node: '>=12'} dependencies: run-applescript: 5.0.0 - dev: false /bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -2123,7 +2132,6 @@ packages: perfect-debounce: 1.0.0 pkg-types: 1.0.3 rc9: 2.1.1 - dev: false /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -2192,6 +2200,27 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + /changelogen@0.5.5: + resolution: {integrity: sha512-IzgToIJ/R9NhVKmL+PW33ozYkv53bXvufDNUSH3GTKXq1iCHGgkbgbtqEWbo8tnWNnt7nPDpjL8PwSG2iS8RVw==} + hasBin: true + dependencies: + c12: 1.10.0 + colorette: 2.0.20 + consola: 3.2.3 + convert-gitmoji: 0.1.5 + execa: 8.0.1 + mri: 1.2.0 + node-fetch-native: 1.6.4 + ofetch: 1.3.3 + open: 9.1.0 + pathe: 1.1.2 + pkg-types: 1.0.3 + scule: 1.3.0 + semver: 7.5.4 + std-env: 3.6.0 + yaml: 2.3.4 + dev: true + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: @@ -2215,7 +2244,6 @@ packages: /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: false /chrome-launcher@1.1.0: resolution: {integrity: sha512-rJYWeEAERwWIr3c3mEVXwNiODPEdMRlRxHc47B1qHPOolHZnkj7rMv1QSUfPoG6MgatWj5AxSpnKKR4QEwEQIQ==} @@ -2361,7 +2389,6 @@ packages: /confbox@0.1.3: resolution: {integrity: sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==} - dev: false /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -2385,6 +2412,10 @@ packages: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} + /convert-gitmoji@0.1.5: + resolution: {integrity: sha512-4wqOafJdk2tqZC++cjcbGcaJ13BZ3kwldf06PTiAQRAB76Z1KJwZNL1SaRZMi2w1FM9RYTgZ6QErS8NUl/GBmQ==} + dev: true + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true @@ -2493,7 +2524,6 @@ packages: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: false /default-browser-id@5.0.0: resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} @@ -2508,7 +2538,6 @@ packages: default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - dev: false /default-browser@5.2.1: resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} @@ -2537,7 +2566,6 @@ packages: /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - dev: false /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} @@ -2549,7 +2577,6 @@ packages: /defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - dev: false /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -2558,7 +2585,6 @@ packages: /destr@2.0.2: resolution: {integrity: sha512-65AlobnZMiCET00KaFFjUefxDX0khFA/E4myqZ7a6Sq1yZtR8+FVIvilVX66vF2uobSumxooYZChiRPCKNqhmg==} - dev: false /diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} @@ -2609,7 +2635,6 @@ packages: /dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} - dev: false /dtrace-provider@0.8.8: resolution: {integrity: sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==} @@ -2865,7 +2890,6 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: false /execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} @@ -2964,7 +2988,6 @@ packages: /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - dev: false /focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} @@ -3004,7 +3027,6 @@ packages: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs-extra@9.0.1: resolution: {integrity: sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==} @@ -3021,7 +3043,6 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: false /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -3153,7 +3174,6 @@ packages: ohash: 1.1.3 pathe: 1.1.2 tar: 6.2.1 - dev: false /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -3375,7 +3395,6 @@ packages: /human-signals@4.3.1: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} - dev: false /human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -3514,13 +3533,11 @@ packages: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - dev: false /is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - dev: false /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -3553,7 +3570,6 @@ packages: hasBin: true dependencies: is-docker: 3.0.0 - dev: false /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} @@ -3702,7 +3718,6 @@ packages: engines: {node: '>=8'} dependencies: is-docker: 2.2.1 - dev: false /is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} @@ -3768,7 +3783,6 @@ packages: /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true - dev: false /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -3811,7 +3825,6 @@ packages: universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 - dev: false /jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -4127,12 +4140,10 @@ packages: engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: false /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - dev: false /minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} @@ -4144,7 +4155,6 @@ packages: dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: false /mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -4163,7 +4173,6 @@ packages: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true - dev: false /mlly@1.6.1: resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} @@ -4246,7 +4255,6 @@ packages: /node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - dev: false /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -4349,7 +4357,6 @@ packages: execa: 8.0.1 pathe: 1.1.2 ufo: 1.4.0 - dev: false /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -4380,11 +4387,9 @@ packages: destr: 2.0.2 node-fetch-native: 1.6.4 ufo: 1.4.0 - dev: false /ohash@1.1.3: resolution: {integrity: sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==} - dev: false /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -4430,7 +4435,6 @@ packages: define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - dev: false /ora@6.3.1: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} @@ -4757,7 +4761,6 @@ packages: defu: 6.1.4 destr: 2.0.2 flat: 5.0.2 - dev: false /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} @@ -4946,7 +4949,6 @@ packages: engines: {node: '>=12'} dependencies: execa: 5.1.1 - dev: false /run-applescript@7.0.0: resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} @@ -5005,7 +5007,6 @@ packages: /scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} - dev: false /semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} @@ -5401,7 +5402,6 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: false /test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} @@ -5444,7 +5444,6 @@ packages: /titleize@3.0.0: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} - dev: false /tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} @@ -5665,7 +5664,6 @@ packages: /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} - dev: false /unplugin@1.5.0: resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} @@ -5679,7 +5677,6 @@ packages: /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - dev: false /update-notifier@6.0.2: resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} diff --git a/scripts/bump-package-version.ts b/scripts/bump-package-version.ts new file mode 100644 index 00000000..6091438a --- /dev/null +++ b/scripts/bump-package-version.ts @@ -0,0 +1,84 @@ +import { + determineSemverChange, + loadChangelogConfig, + parseCommits, + generateMarkDown, + parseChangelogMarkdown, +} from 'changelogen'; +import { execa } from 'execa'; +import { getPkgTag, grabPackageDetails, listCommitsInDir } from './git'; +import { consola } from 'consola'; +import fs from 'fs-extra'; + +const pkg = process.argv[2]; +if (pkg == null) { + throw Error( + 'Package name missing. Usage: tsx bump-package-version.ts ', + ); +} +const { pkgDir, pkgName, currentVersion, prevTag, changelogPath, pkgJsonPath } = + await grabPackageDetails(pkg); +consola.info('Bumping:', { pkg, pkgDir, pkgName, currentVersion }); + +// Get commits +const config = await loadChangelogConfig(process.cwd()); +consola.info('Config:', config); +const rawCommits = await listCommitsInDir(pkgDir, prevTag); +const commits = parseCommits(rawCommits, config); + +// Bump version +let bumpType = determineSemverChange(commits, config) ?? 'patch'; +if (currentVersion.startsWith('0.')) { + if (bumpType === 'major') { + bumpType = 'minor'; + } else if (bumpType === 'minor') { + bumpType = 'patch'; + } +} +await execa('pnpm', ['version', bumpType], { + cwd: pkgDir, +}); +const updatedPkgJson = await fs.readJson(pkgJsonPath); +const newVersion: string = updatedPkgJson.version; +consola.info('Bump:', { currentVersion, bumpType, newVersion }); + +// Generate changelog +const versionChangelog = await generateMarkDown(commits, { + ...config, + from: currentVersion, + to: newVersion, +}); +const versionChangelogBody = versionChangelog + .split('\n') + .slice(1) + .join('\n') + .trim(); +const { releases: prevReleases } = await fs + .readFile(changelogPath, 'utf8') + .then(parseChangelogMarkdown) + .catch(() => ({ releases: [] })); +const allReleases = [ + { + version: newVersion, + body: versionChangelogBody, + }, + ...prevReleases, +]; + +const newChangelog = + '# Changelog\n\n' + + allReleases + .map((release) => [`## v${release.version}`, release.body].join('\n\n')) + .join('\n\n'); +await fs.writeFile(changelogPath, newChangelog, 'utf8'); +consola.success('Updated changelog'); + +// Commit changes +await execa('git', ['add', pkgJsonPath, changelogPath]); +await execa('git', [ + 'commit', + '-m', + `chore(release): ${pkgName} v${newVersion}`, +]); +await execa('git', ['tag', getPkgTag(pkg, newVersion)]); +consola.success('Committed version and changelog'); diff --git a/scripts/create-github-release.ts b/scripts/create-github-release.ts new file mode 100644 index 00000000..4d37e6e7 --- /dev/null +++ b/scripts/create-github-release.ts @@ -0,0 +1,33 @@ +import { + createGithubRelease, + loadChangelogConfig, + parseChangelogMarkdown, +} from 'changelogen'; +import fs from 'fs-extra'; +import { grabPackageDetails } from './git'; +import consola from 'consola'; + +const pkg = process.argv[2]; +if (pkg == null) { + throw Error( + 'Package name missing. Usage: tsx create-github-release.ts ', + ); +} + +const { pkgName, prevTag, currentVersion, changelogPath } = + await grabPackageDetails(pkg); +consola.info('Creating release for:', { pkg, pkgName, prevTag }); + +const { releases } = await fs + .readFile(changelogPath, 'utf8') + .then(parseChangelogMarkdown) + .catch(() => ({ releases: [] })); + +const config = await loadChangelogConfig(process.cwd()); +config.tokens.github = process.env.GITHUB_TOKEN; +await createGithubRelease(config, { + tag_name: prevTag, + name: `${pkgName} v${currentVersion}`, + body: releases[0].body, +}); +consola.success('Created release'); diff --git a/scripts/git.ts b/scripts/git.ts new file mode 100644 index 00000000..d71f5be0 --- /dev/null +++ b/scripts/git.ts @@ -0,0 +1,41 @@ +import { RawGitCommit, getGitDiff } from 'changelogen'; +import { consola } from 'consola'; +import fs from 'fs-extra'; + +export async function grabPackageDetails(pkg: string) { + const pkgDir = `packages/${pkg}`; + const pkgJsonPath = `${pkgDir}/package.json`; + const pkgJson = await fs.readJson(pkgJsonPath); + const currentVersion: string = pkgJson.version; + return { + pkgDir, + pkgJsonPath, + changelogPath: `${pkgDir}/CHANGELOG.md`, + pkgJson, + pkgName: pkgJson.name, + currentVersion, + prevTag: getPkgTag(pkg, currentVersion), + }; +} + +export function getPkgTag(pkg: string, version: string | undefined) { + return `${pkg}-v${version}`; +} + +export async function listCommitsInDir( + dir: string, + lastTag: string, +): Promise { + consola.info('Listing commits:', { lastTag, dir }); + const commits = await getGitDiff(lastTag); + consola.info('All commits:', commits.length); + consola.debug(commits); + // commit.body contains all the files that were modified/added. So just check to make sure "\t" + "packages/storage" + "/" is in the body to include + // '"\n\nM\tpackages/wxt/vitest.config.ts\n"' + const filtered = commits.filter((commit) => + commit.body.includes(`\t${dir}/`), + ); + consola.info('Filtered:', filtered.length); + consola.debug(filtered); + return filtered; +} diff --git a/scripts/stub.ts b/scripts/stub.ts deleted file mode 100644 index ee575f0b..00000000 --- a/scripts/stub.ts +++ /dev/null @@ -1,7 +0,0 @@ -// This file is a stub just so netlify doesn't throw an error when building -// docs. Once another TS file apart of the root project is added, this can be -// removed. -// If the website deploys on a PR branch with this file removed, you can safely -// delete it. - -export {}; diff --git a/scripts/sync-releases.ts b/scripts/sync-releases.ts new file mode 100644 index 00000000..afb3a190 --- /dev/null +++ b/scripts/sync-releases.ts @@ -0,0 +1,40 @@ +import { + getGithubReleaseByTag, + loadChangelogConfig, + parseChangelogMarkdown, + updateGithubRelease, +} from 'changelogen'; +import { getPkgTag, grabPackageDetails } from './git'; +import fs from 'fs-extra'; +import consola from 'consola'; + +const pkg = process.argv[2]; +if (pkg == null) { + throw Error( + 'Package name missing. Usage: tsx sync-releases.ts ', + ); +} + +// Update +const { changelogPath, pkgName } = await grabPackageDetails(pkg); +const { releases } = await fs + .readFile(changelogPath, 'utf8') + .then(parseChangelogMarkdown) + .catch(() => ({ releases: [] })); +const config = await loadChangelogConfig(process.cwd()); +config.tokens.github = process.env.GITHUB_TOKEN; + +// Update releases +for (const release of releases) { + const tag = getPkgTag(pkg, release.version); + const existing = await getGithubReleaseByTag(config, tag); + if (existing.body !== release.body) { + await updateGithubRelease(config, existing.id!, { + tag_name: tag, + name: `${pkgName} v${release.version}`, + body: release.body, + }); + } + consola.success(`Synced \`${tag}\``); +} +consola.success('Done');