From aabe91da512dc21ec4d3638587aa2c1027e3315d Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 10:52:35 +0000 Subject: [PATCH 01/18] Add autorelease --- .github/workflows/release-sdks.yml | 28 ++++ packages/autorelease/babel.config.js | 7 + packages/autorelease/jest.config.ts | 199 +++++++++++++++++++++++++++ packages/autorelease/package.json | 33 +++++ packages/autorelease/src/index.ts | 99 +++++++++++++ pnpm-lock.yaml | 181 ++++++++++++++++++++++++ 6 files changed, 547 insertions(+) create mode 100644 .github/workflows/release-sdks.yml create mode 100644 packages/autorelease/babel.config.js create mode 100644 packages/autorelease/jest.config.ts create mode 100644 packages/autorelease/package.json create mode 100644 packages/autorelease/src/index.ts diff --git a/.github/workflows/release-sdks.yml b/.github/workflows/release-sdks.yml new file mode 100644 index 000000000..bf87e8190 --- /dev/null +++ b/.github/workflows/release-sdks.yml @@ -0,0 +1,28 @@ +name: release-sdks + +on: + workflow_dispatch: {} + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Install Dependencies + shell: bash + run: pnpm install + + - name: Run snippet tests + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_OWNER: ${{ github.repository_owner }} + GITHUB_REPO: ${{ github.event.repository.name }} + run: pnpm run --filter autorelease release \ No newline at end of file diff --git a/packages/autorelease/babel.config.js b/packages/autorelease/babel.config.js new file mode 100644 index 000000000..1c005e99b --- /dev/null +++ b/packages/autorelease/babel.config.js @@ -0,0 +1,7 @@ +module.exports = { + presets: [ + ['@babel/preset-env', { targets: { node: 'current' } }], + '@babel/preset-typescript', + ], +}; + diff --git a/packages/autorelease/jest.config.ts b/packages/autorelease/jest.config.ts new file mode 100644 index 000000000..81f1ec12e --- /dev/null +++ b/packages/autorelease/jest.config.ts @@ -0,0 +1,199 @@ +/** + * For a detailed explanation regarding each configuration property, visit: + * https://jestjs.io/docs/configuration + */ + +import type {Config} from 'jest'; + +const config: Config = { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/private/var/folders/7y/pd12xsnj72x0t4drmr3tt23c0000gp/T/jest_dy", + + // Automatically clear mock calls, instances, contexts and results before every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + // coverageDirectory: undefined, + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "/node_modules/" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: "v8", + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // The default configuration for fake timers + // fakeTimers: { + // "enableGlobally": false + // }, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "mjs", + // "cjs", + // "jsx", + // "ts", + // "tsx", + // "json", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state before every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state and implementation before every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + // testEnvironment: "jest-environment-node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + // testMatch: [ + // "**/__tests__/**/*.[jt]s?(x)", + // "**/?(*.)+(spec|test).[tj]s?(x)" + // ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jest-circus/runner", + + // A map from regular expressions to paths to transformers + // transform: undefined, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; + +export default config; diff --git a/packages/autorelease/package.json b/packages/autorelease/package.json new file mode 100644 index 000000000..871a7309e --- /dev/null +++ b/packages/autorelease/package.json @@ -0,0 +1,33 @@ +{ + "name": "autorelease", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "jest", + "release": "ts-node src/index.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@jest/globals": "^29.7.0", + "@octokit/rest": "^21.1.0", + "@pnpm/find-workspace-dir": "^7.0.2", + "cohere": "^1.1.1", + "cohere-ai": "^7.14.0", + "convict": "^6.2.4", + "glob": "^11.0.0", + "jest": "^29.7.0", + "nodemon": "^3.1.7", + "ts-node": "^10.9.2" + }, + "devDependencies": { + "@babel/core": "^7.25.8", + "@babel/preset-env": "^7.25.8", + "@babel/preset-typescript": "^7.25.7", + "@types/convict": "^6.1.6", + "@types/jest": "^29.5.13", + "babel-jest": "^29.7.0" + } +} diff --git a/packages/autorelease/src/index.ts b/packages/autorelease/src/index.ts new file mode 100644 index 000000000..122242a43 --- /dev/null +++ b/packages/autorelease/src/index.ts @@ -0,0 +1,99 @@ +import { Octokit } from "@octokit/rest" + +const versionMatchRegex = /v?(\d+\.\d+\.\d+)/g + +const languages = ["python", "npm", "go"] as const + +const sortVersions = (versions: string[]) => { + return versions.sort((a, b) => { + const [aMajor, aMinor, aPatch] = a.split(".").map(Number) + const [bMajor, bMinor, bPatch] = b.split(".").map(Number) + + if (aMajor !== bMajor) { + return aMajor - bMajor + } else if (aMinor !== bMinor) { + return aMinor - bMinor + } + + return aPatch - bPatch + }) +} + +const getPythonVersions = async () => { + const response = await fetch("https://pypi.org/simple/cohere/") + const text = await response.text() + const matches = text.matchAll(versionMatchRegex) + return [...matches].map(m => m[1]) +} + +const getNpmVersions = async () => { + const response = await fetch("https://registry.npmjs.org/-/package/cohere-ai/dist-tags") + const json = await response.json() as { latest: string } + return [json.latest] +} + +const getGoVersions = async () => { + const response = await fetch("https://proxy.golang.org/github.com/cohere-ai/cohere-go/v2/@latest") + const json = await response.json() as { Version: string } + return [json.Version.replace("v", "")] +} + +const updateVersion = async (version: string, update: "major" | "minor" | "patch") => { + const [major, minor, patch] = version.split(".").map(Number) + + return ({ + major: `${major + 1}.0.0`, + minor: `${major}.${minor + 1}.0`, + patch: `${major}.${minor + 1}.${patch + 1}`, + })[update] +} + +const getLatestVersions = async () => { + const [pythonVersions, npmVersions, goVersions] = await Promise.all([ + getPythonVersions(), + getNpmVersions(), + getGoVersions(), + ]) + return { + python: sortVersions(pythonVersions).pop()!, + npm: sortVersions(npmVersions).pop()!, + go: sortVersions(goVersions).pop()!, + } +} + +const getNextVersions = async (update: "major" | "minor" | "patch") => { + const latest = await getLatestVersions() + + return { + python: { + previous: latest.python, + next: await updateVersion(latest.python, update), + }, + npm: { + previous: latest.npm, + next: await updateVersion(latest.npm, update), + }, + go: { + previous: latest.go, + next: await updateVersion(latest.go, update), + }, + } +} + +const createRelease = (language: typeof languages[number], version: string) => { + const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }) + + octokit.repos.createRelease({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + tag_name: `${language}/${version}`, + name: `${language}/${version}`, + body: `This release updates the ${language} package to ${version}.`, + }) +} + +(async () => { + const nextVersions = await getNextVersions("patch") + + await Promise.all(languages.map(async language => createRelease(language, nextVersions[language].next))) +})() \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52ae30552..73fb18329 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,6 +34,58 @@ importers: specifier: ^3.4.4 version: 3.4.4(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.6.3)) + packages/autorelease: + dependencies: + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@octokit/rest': + specifier: ^21.1.0 + version: 21.1.0 + '@pnpm/find-workspace-dir': + specifier: ^7.0.2 + version: 7.0.2 + cohere: + specifier: ^1.1.1 + version: 1.1.1 + cohere-ai: + specifier: ^7.14.0 + version: 7.14.0(@aws-sdk/client-sso-oidc@3.679.0(@aws-sdk/client-sts@3.679.0)) + convict: + specifier: ^6.2.4 + version: 6.2.4 + glob: + specifier: ^11.0.0 + version: 11.0.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.6.3)) + nodemon: + specifier: ^3.1.7 + version: 3.1.7 + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.14.10)(typescript@5.6.3) + devDependencies: + '@babel/core': + specifier: ^7.25.8 + version: 7.26.0 + '@babel/preset-env': + specifier: ^7.25.8 + version: 7.26.0(@babel/core@7.26.0) + '@babel/preset-typescript': + specifier: ^7.25.7 + version: 7.26.0(@babel/core@7.26.0) + '@types/convict': + specifier: ^6.1.6 + version: 6.1.6 + '@types/jest': + specifier: ^29.5.13 + version: 29.5.14 + babel-jest: + specifier: ^29.7.0 + version: 29.7.0(@babel/core@7.26.0) + packages/snippet-tester: dependencies: '@jest/globals': @@ -949,6 +1001,58 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@octokit/auth-token@5.1.1': + resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.1.2': + resolution: {integrity: sha512-bdlj/CJVjpaz06NBpfHhp4kGJaRZfz7AzC+6EwUImRtrwIw8dIgJ63Xg0OzV9pRn3rIzrt5c2sa++BL0JJ8GLw==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@23.0.1': + resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} + + '@octokit/plugin-paginate-rest@11.4.0': + resolution: {integrity: sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-request-log@5.3.1': + resolution: {integrity: sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-rest-endpoint-methods@13.3.0': + resolution: {integrity: sha512-LUm44shlmkp/6VC+qQgHl3W5vzUP99ZM54zH6BuqkJK4DqfFLhegANd+fM4YRLapTvPm4049iG7F3haANKMYvQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + engines: {node: '>= 18'} + + '@octokit/request@9.1.4': + resolution: {integrity: sha512-tMbOwGm6wDII6vygP3wUVqFTw3Aoo0FnVQyhihh8vVq12uO3P+vQZeo2CKMpWtPSogpACD0yyZAlVlQnjW71DA==} + engines: {node: '>= 18'} + + '@octokit/rest@21.1.0': + resolution: {integrity: sha512-93iLxcKDJboUpmnUyeJ6cRIi7z7cqTZT1K7kRK4LobGxwTwpsa+2tQQbRQNGy7IFDEAmrtkf4F4wBj3D5rVlJQ==} + engines: {node: '>= 18'} + + '@octokit/types@13.7.0': + resolution: {integrity: sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1349,6 +1453,9 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -1602,6 +1709,9 @@ packages: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2588,6 +2698,9 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -4162,6 +4275,68 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@octokit/auth-token@5.1.1': {} + + '@octokit/core@6.1.3': + dependencies: + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.2 + '@octokit/request': 9.1.4 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.2': + dependencies: + '@octokit/types': 13.7.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.1.2': + dependencies: + '@octokit/request': 9.1.4 + '@octokit/types': 13.7.0 + universal-user-agent: 7.0.2 + + '@octokit/openapi-types@23.0.1': {} + + '@octokit/plugin-paginate-rest@11.4.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.7.0 + + '@octokit/plugin-request-log@5.3.1(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + + '@octokit/plugin-rest-endpoint-methods@13.3.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.7.0 + + '@octokit/request-error@6.1.6': + dependencies: + '@octokit/types': 13.7.0 + + '@octokit/request@9.1.4': + dependencies: + '@octokit/endpoint': 10.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.7.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + + '@octokit/rest@21.1.0': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) + '@octokit/plugin-request-log': 5.3.1(@octokit/core@6.1.3) + '@octokit/plugin-rest-endpoint-methods': 13.3.0(@octokit/core@6.1.3) + + '@octokit/types@13.7.0': + dependencies: + '@octokit/openapi-types': 23.0.1 + '@pkgjs/parseargs@0.11.0': optional: true @@ -4719,6 +4894,8 @@ snapshots: base64-js@1.5.1: {} + before-after-hook@3.0.2: {} + binary-extensions@2.3.0: {} bowser@2.11.0: {} @@ -4964,6 +5141,8 @@ snapshots: dependencies: is-extendable: 0.1.1 + fast-content-type-parse@2.0.1: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6077,6 +6256,8 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + universal-user-agent@7.0.2: {} + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: browserslist: 4.24.2 From 413ff7b57a1df3fdc4a4f517f92ec91b2c504d4f Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:08:35 +0000 Subject: [PATCH 02/18] push --- .github/workflows/release-sdks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-sdks.yml b/.github/workflows/release-sdks.yml index bf87e8190..677eeb4cb 100644 --- a/.github/workflows/release-sdks.yml +++ b/.github/workflows/release-sdks.yml @@ -1,6 +1,7 @@ name: release-sdks on: + push: {} workflow_dispatch: {} jobs: From cde34a18a03fadc84981e349982b91fff5da1231 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:10:27 +0000 Subject: [PATCH 03/18] Module --- packages/autorelease/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/autorelease/package.json b/packages/autorelease/package.json index 871a7309e..1a279295a 100644 --- a/packages/autorelease/package.json +++ b/packages/autorelease/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "description": "", "main": "index.js", + "type": "module", "scripts": { "test": "jest", "release": "ts-node src/index.ts" From ef824b8bd7df483a91297e991270e40be6fa1f3d Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:12:21 +0000 Subject: [PATCH 04/18] --esm --- packages/autorelease/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/autorelease/package.json b/packages/autorelease/package.json index 1a279295a..b05704b91 100644 --- a/packages/autorelease/package.json +++ b/packages/autorelease/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "test": "jest", - "release": "ts-node src/index.ts" + "release": "ts-node --esm src/index.ts" }, "keywords": [], "author": "", From 0a81531db896210c6a5dc4ffa7c91ae6dcba8266 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:14:44 +0000 Subject: [PATCH 05/18] tsx --- packages/autorelease/package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/autorelease/package.json b/packages/autorelease/package.json index b05704b91..0a8b03933 100644 --- a/packages/autorelease/package.json +++ b/packages/autorelease/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "test": "jest", - "release": "ts-node --esm src/index.ts" + "release": "tsx src/index.ts" }, "keywords": [], "author": "", @@ -21,7 +21,8 @@ "glob": "^11.0.0", "jest": "^29.7.0", "nodemon": "^3.1.7", - "ts-node": "^10.9.2" + "ts-node": "^10.9.2", + "tsx": "^4.19.2" }, "devDependencies": { "@babel/core": "^7.25.8", From 0ec8c3f820189d0a54ee21bcb0375de5d2cf9a44 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:18:06 +0000 Subject: [PATCH 06/18] Remove continue-on-error from snippet tests in release workflow --- .github/workflows/release-sdks.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release-sdks.yml b/.github/workflows/release-sdks.yml index 677eeb4cb..00c7097f5 100644 --- a/.github/workflows/release-sdks.yml +++ b/.github/workflows/release-sdks.yml @@ -21,7 +21,6 @@ jobs: run: pnpm install - name: Run snippet tests - continue-on-error: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_OWNER: ${{ github.repository_owner }} From 776becb40329a3419327214ac95e0adf761963ce Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:18:28 +0000 Subject: [PATCH 07/18] Update release tag and name format to include '@' separator --- packages/autorelease/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/autorelease/src/index.ts b/packages/autorelease/src/index.ts index 122242a43..aa1f3c7c1 100644 --- a/packages/autorelease/src/index.ts +++ b/packages/autorelease/src/index.ts @@ -86,8 +86,8 @@ const createRelease = (language: typeof languages[number], version: string) => { octokit.repos.createRelease({ owner: process.env.GITHUB_OWNER!, repo: process.env.GITHUB_REPO!, - tag_name: `${language}/${version}`, - name: `${language}/${version}`, + tag_name: `${language}@${version}`, + name: `${language}@${version}`, body: `This release updates the ${language} package to ${version}.`, }) } From 1eca9a2226a5be8347a8662f462965e984e39a4b Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:20:14 +0000 Subject: [PATCH 08/18] Rename release-sdks workflow to create-sdks-release-tags --- .../{release-sdks.yml => create-sdks-release-tags.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{release-sdks.yml => create-sdks-release-tags.yml} (95%) diff --git a/.github/workflows/release-sdks.yml b/.github/workflows/create-sdks-release-tags.yml similarity index 95% rename from .github/workflows/release-sdks.yml rename to .github/workflows/create-sdks-release-tags.yml index 00c7097f5..133988b29 100644 --- a/.github/workflows/release-sdks.yml +++ b/.github/workflows/create-sdks-release-tags.yml @@ -1,4 +1,4 @@ -name: release-sdks +name: create-sdks-release-tags on: push: {} From cda495b7cd8a95d3364d38e682b4081dbcc9a2cf Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:29:20 +0000 Subject: [PATCH 09/18] Add SDK generator configurations for Node.js, Go, Java, and Python --- fern/apis/sdks/generators.yml | 142 ++++++++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 fern/apis/sdks/generators.yml diff --git a/fern/apis/sdks/generators.yml b/fern/apis/sdks/generators.yml new file mode 100644 index 000000000..61481a217 --- /dev/null +++ b/fern/apis/sdks/generators.yml @@ -0,0 +1,142 @@ +api: + path: ../../../cohere-openapi.yaml +groups: + node-sdk: + audiences: + - public + - v2-beta + generators: + - name: fernapi/fern-typescript-node-sdk + version: 0.44.1 + output: + location: npm + package-name: cohere-ai + token: ${NPM_TOKEN} + github: + repository: cohere-ai/cohere-typescript + mode: pull-request + config: + allowCustomFetcher: true + defaultTimeoutInSeconds: 300 + namespaceExport: Cohere + skipResponseValidation: true + allowExtraFields: true + extraDevDependencies: + jest: "^29.7.0" + ts-jest: "^29.1.2" + "@types/readable-stream": ^4.0.14 + "ts-loader": "^9.5.1" + "webpack": "^5.91.0" + "@types/convict": "^6.1.6" + extraDependencies: + readable-stream: ^4.5.2 + "@aws-sdk/client-sagemaker": "^3.583.0" + "@aws-sdk/credential-providers": "^3.583.0" + "@aws-sdk/protocol-http": "^3.374.0" + "@aws-sdk/signature-v4": "^3.374.0" + "convict": "^6.2.4" + + go-sdk: + audiences: + - public + - v2-beta + generators: + - name: fernapi/fern-go-sdk + version: 0.35.1 + github: + repository: cohere-ai/cohere-go + mode: pull-request + config: + union: v1 + includeLegacyClientOptions: true + java-sdk: + audiences: + - public + - v2-beta + generators: + - name: fernapi/fern-java-sdk + version: 2.7.0 + publish-metadata: + author: "cohere" + email: "platform@cohere.com" + package-description: "The official Java library for Cohere\\'s API." + reference-url: "https://docs.cohere.com" + output: + location: maven + url: https://s01.oss.sonatype.org/content/repositories/releases/ + coordinate: com.cohere:cohere-java + username: ${MAVEN_USERNAME} + password: ${MAVEN_PASSWORD} + signature: + keyId: ${MAVEN_CENTRAL_SECRET_KEY_KEY_ID} + password: ${MAVEN_CENTRAL_SECRET_KEY_PASSWORD} + secretKey: ${MAVEN_CENTRAL_SECRET_KEY} + github: + repository: cohere-ai/cohere-java + mode: pull-request + license: MIT + config: + client-class-name: Cohere + python-sdk: + audiences: + - public + - v2-beta + generators: + - name: fernapi/fern-python-sdk + version: 4.3.11 + smart-casing: true + config: + pyproject_python_version: "^3.9" + inline_request_params: false + extra_dev_dependencies: + parameterized: "^0.9.0" + extra_dependencies: + fastavro: "^1.9.4" + requests: "^2.0.0" + types-requests: "^2.0.0" + tokenizers: ">=0.15,<1" + httpx-sse: ^0.4.0 + parameterized: "^0.9.0" + improved_imports: true + pydantic_config: + frozen: false + union_naming: v1 + require_optional_fields: false + extra_fields: "allow" + use_str_enums: true + skip_validation: true + timeout_in_seconds: 300 + client: + class_name: BaseCohere + filename: base_client.py + exported_class_name: Client + exported_filename: client.py + additional_init_exports: + - from: client + imports: + - Client + - AsyncClient + - from: bedrock_client + imports: + - BedrockClient + - BedrockClientV2 + - from: sagemaker_client + imports: + - SagemakerClient + - SagemakerClientV2 + - from: aws_client + imports: + - AwsClient + - from: client_v2 + imports: + - AsyncClientV2 + - ClientV2 + output: + location: pypi + package-name: cohere + token: ${PYPI_TOKEN} + github: + license: MIT + repository: cohere-ai/cohere-python + branch: main + mode: pull-request \ No newline at end of file From 887aaa34ca29d6d0fa1f13b4b1c4fc9b3ec3a924 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:37:46 +0000 Subject: [PATCH 10/18] Add release workflow for generating SDKs for Node.js, Go, Java, and Python --- .github/workflows/release-sdks.yaml | 115 ++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 .github/workflows/release-sdks.yaml diff --git a/.github/workflows/release-sdks.yaml b/.github/workflows/release-sdks.yaml new file mode 100644 index 000000000..2d7944a4a --- /dev/null +++ b/.github/workflows/release-sdks.yaml @@ -0,0 +1,115 @@ +name: release-sdks + +on: [push] + +jobs: + fern-check: + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Install Fern + run: npm install -g fern-api + + - name: Check Fern API is valid + run: fern check + + fern-generate-node: + needs: fern-check + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/node@') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + + - name: Download Fern + run: npm install -g fern-api + + - name: Release TypeScript SDK + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + run: | + tag=${{ github.ref_name }} + prefix="node@" + SDK_VERSION="${tag#$prefix}" + fern generate --group node-sdk --version "$SDK_VERSION" --log-level debug + + fern-generate-go: + needs: fern-check + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/go@') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + + - name: Download Fern + run: npm install -g fern-api + + - name: Release Go SDK + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: | + tag=${{ github.ref_name }} + prefix="go@" + SDK_VERSION="${tag#$prefix}" + fern generate --group go-sdk --version "$SDK_VERSION" --log-level debug + + fern-generate-java: + needs: fern-check + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/java@') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + + - name: Download Fern + run: npm install -g fern-api + + - name: Release Java SDK + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + MAVEN_CENTRAL_SECRET_KEY_KEY_ID: ${{ secrets.MAVEN_CENTRAL_SECRET_KEY_KEY_ID }} + MAVEN_CENTRAL_SECRET_KEY_PASSWORD: ${{ secrets.MAVEN_CENTRAL_SECRET_KEY_PASSWORD }} + MAVEN_CENTRAL_SECRET_KEY: ${{ secrets.MAVEN_CENTRAL_SECRET_KEY }} + run: | + tag=${{ github.ref_name }} + prefix="java@" + SDK_VERSION="${tag#$prefix}" + fern generate --group java-sdk --version "$SDK_VERSION" --log-level debug + + fern-generate-python: + needs: fern-check + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/python@') + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Setup node + uses: actions/setup-node@v3 + + - name: Download Fern + run: npm install -g fern-api + + - name: Release Python SDK + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + tag=${{ github.ref_name }} + prefix="python@" + SDK_VERSION="${tag#$prefix}" + fern generate --group python-sdk --version "$SDK_VERSION" --log-level debug \ No newline at end of file From add90b086ba5383f7d9c30b058f9db7aa02ce2f6 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 11:55:45 +0000 Subject: [PATCH 11/18] Rename create-sdks-release-tags workflow to create-sdk-releases and add delete-n-releases workflow for managing releases --- ...lease-tags.yml => create-sdk-releases.yml} | 3 +- .github/workflows/delete-n-releases.yml | 33 ++++++++++++++ packages/autorelease/package.json | 3 +- .../src/{index.ts => create-releases.ts} | 0 packages/autorelease/src/delete-n-releases.ts | 45 +++++++++++++++++++ 5 files changed, 81 insertions(+), 3 deletions(-) rename .github/workflows/{create-sdks-release-tags.yml => create-sdk-releases.yml} (93%) create mode 100644 .github/workflows/delete-n-releases.yml rename packages/autorelease/src/{index.ts => create-releases.ts} (100%) create mode 100644 packages/autorelease/src/delete-n-releases.ts diff --git a/.github/workflows/create-sdks-release-tags.yml b/.github/workflows/create-sdk-releases.yml similarity index 93% rename from .github/workflows/create-sdks-release-tags.yml rename to .github/workflows/create-sdk-releases.yml index 133988b29..9d383c3a4 100644 --- a/.github/workflows/create-sdks-release-tags.yml +++ b/.github/workflows/create-sdk-releases.yml @@ -1,7 +1,6 @@ -name: create-sdks-release-tags +name: create-sdk-releases on: - push: {} workflow_dispatch: {} jobs: diff --git a/.github/workflows/delete-n-releases.yml b/.github/workflows/delete-n-releases.yml new file mode 100644 index 000000000..722f66658 --- /dev/null +++ b/.github/workflows/delete-n-releases.yml @@ -0,0 +1,33 @@ +name: delete-n-releases + +on: + workflow_dispatch: + inputs: + n: + description: 'Number of releases to delete' + required: true + default: "1" + +jobs: + run: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Install Dependencies + shell: bash + run: pnpm install + + - name: Run snippet tests + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_OWNER: ${{ github.repository_owner }} + GITHUB_REPO: ${{ github.event.repository.name }} + N_VERSIONS: ${{ github.event.inputs.n }} + run: pnpm run --filter autorelease delete \ No newline at end of file diff --git a/packages/autorelease/package.json b/packages/autorelease/package.json index 0a8b03933..ca9cd23d0 100644 --- a/packages/autorelease/package.json +++ b/packages/autorelease/package.json @@ -6,7 +6,8 @@ "type": "module", "scripts": { "test": "jest", - "release": "tsx src/index.ts" + "release": "tsx src/create-releases.ts", + "delete": "tsx src/delete-n-releases.ts" }, "keywords": [], "author": "", diff --git a/packages/autorelease/src/index.ts b/packages/autorelease/src/create-releases.ts similarity index 100% rename from packages/autorelease/src/index.ts rename to packages/autorelease/src/create-releases.ts diff --git a/packages/autorelease/src/delete-n-releases.ts b/packages/autorelease/src/delete-n-releases.ts new file mode 100644 index 000000000..a1fe4cc1e --- /dev/null +++ b/packages/autorelease/src/delete-n-releases.ts @@ -0,0 +1,45 @@ +import { Octokit } from "@octokit/rest" + + +const deleteNMostRecentReleases = async (n: number) => { + const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }) + + const releases = await octokit.repos.listReleases({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + }) + + const toDelete = releases.data.slice(0, n) + + await Promise.all(toDelete.map(async (release) => { + await octokit.repos.deleteRelease({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + release_id: release.id, + }) + await octokit.git.deleteRef({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + ref: `tags/${release.tag_name}`, + }) + })) +} + + +(async () => { + const nVersions = process.env.N_VERSIONS; + + if (!nVersions) { + throw new Error("N_VERSIONS is not defined.") + } + + if (Number(nVersions) < 1) { + throw new Error("N_VERSIONS must be greater than 0.") + } + + if (Number(nVersions) > 4) { + throw new Error("N_VERSIONS must be less than 5 (to stop u accidentally deleting too many).") + } + + await deleteNMostRecentReleases(Number(nVersions)) +})() \ No newline at end of file From b5a60cee519fd11dde5aa9931bc1bf974dbfb020 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 12:00:15 +0000 Subject: [PATCH 12/18] Fix check --- .github/workflows/release-sdks.yaml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release-sdks.yaml b/.github/workflows/release-sdks.yaml index 2d7944a4a..6ef9534b0 100644 --- a/.github/workflows/release-sdks.yaml +++ b/.github/workflows/release-sdks.yaml @@ -9,11 +9,19 @@ jobs: - name: Checkout repo uses: actions/checkout@v3 - - name: Install Fern - run: npm install -g fern-api + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Install Dependencies + shell: bash + run: pnpm install - - name: Check Fern API is valid - run: fern check + - name: Run fern check + env: + FERN_TOKEN: ${{ secrets.FERN_TOKEN }} + run: pnpm run docs:check fern-generate-node: needs: fern-check From f1c73542c882cb688c3681f5aa245af714acd8d7 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 12:08:26 +0000 Subject: [PATCH 13/18] Add environment --- .github/workflows/release-sdks.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/release-sdks.yaml b/.github/workflows/release-sdks.yaml index 6ef9534b0..16c486945 100644 --- a/.github/workflows/release-sdks.yaml +++ b/.github/workflows/release-sdks.yaml @@ -24,6 +24,7 @@ jobs: run: pnpm run docs:check fern-generate-node: + environment: sdk-release needs: fern-check if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/node@') runs-on: ubuntu-latest @@ -48,6 +49,7 @@ jobs: fern generate --group node-sdk --version "$SDK_VERSION" --log-level debug fern-generate-go: + environment: sdk-release needs: fern-check if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/go@') runs-on: ubuntu-latest @@ -71,6 +73,7 @@ jobs: fern generate --group go-sdk --version "$SDK_VERSION" --log-level debug fern-generate-java: + environment: sdk-release needs: fern-check if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/java@') runs-on: ubuntu-latest @@ -99,6 +102,7 @@ jobs: fern generate --group java-sdk --version "$SDK_VERSION" --log-level debug fern-generate-python: + environment: sdk-release needs: fern-check if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/python@') runs-on: ubuntu-latest From ec7da77b2220dfbf023b2a060197373f5b6b3e1e Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 12:09:54 +0000 Subject: [PATCH 14/18] Fix formatting in delete-n-releases workflow --- .github/workflows/delete-n-releases.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/delete-n-releases.yml b/.github/workflows/delete-n-releases.yml index 722f66658..33108b59c 100644 --- a/.github/workflows/delete-n-releases.yml +++ b/.github/workflows/delete-n-releases.yml @@ -22,7 +22,7 @@ jobs: - name: Install Dependencies shell: bash - run: pnpm install + run: pnpm install - name: Run snippet tests env: From 969258dba1d1c001280212cad62cc6968fcc8db8 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 12:47:37 +0000 Subject: [PATCH 15/18] Add version bump input to create-sdk-releases workflow and implement release deletion logic --- .github/workflows/create-sdk-releases.yml | 13 ++++- packages/autorelease/src/create-releases.ts | 57 +++++++++++++++++---- 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/.github/workflows/create-sdk-releases.yml b/.github/workflows/create-sdk-releases.yml index 9d383c3a4..fd1d792a3 100644 --- a/.github/workflows/create-sdk-releases.yml +++ b/.github/workflows/create-sdk-releases.yml @@ -1,8 +1,16 @@ name: create-sdk-releases on: - workflow_dispatch: {} - + workflow_dispatch: + inputs: + bump_type: + description: 'The type of version bump to make' + required: true + type: choice + options: + - 'major' + - 'minor' + - 'patch' jobs: run: runs-on: ubuntu-latest @@ -24,4 +32,5 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_OWNER: ${{ github.repository_owner }} GITHUB_REPO: ${{ github.event.repository.name }} + BUMP_TYPE: ${{ github.event.inputs.bump_type }} run: pnpm run --filter autorelease release \ No newline at end of file diff --git a/packages/autorelease/src/create-releases.ts b/packages/autorelease/src/create-releases.ts index aa1f3c7c1..f81a67250 100644 --- a/packages/autorelease/src/create-releases.ts +++ b/packages/autorelease/src/create-releases.ts @@ -8,7 +8,7 @@ const sortVersions = (versions: string[]) => { return versions.sort((a, b) => { const [aMajor, aMinor, aPatch] = a.split(".").map(Number) const [bMajor, bMinor, bPatch] = b.split(".").map(Number) - + if (aMajor !== bMajor) { return aMajor - bMajor } else if (aMinor !== bMinor) { @@ -40,7 +40,7 @@ const getGoVersions = async () => { const updateVersion = async (version: string, update: "major" | "minor" | "patch") => { const [major, minor, patch] = version.split(".").map(Number) - + return ({ major: `${major + 1}.0.0`, minor: `${major}.${minor + 1}.0`, @@ -80,20 +80,59 @@ const getNextVersions = async (update: "major" | "minor" | "patch") => { } } -const createRelease = (language: typeof languages[number], version: string) => { +const formatTagName = (language: typeof languages[number], version: string) => `${language}@${version}` + +const maybeDeleteRelease = async (language: typeof languages[number], version: string) => { const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }) - - octokit.repos.createRelease({ + + for await (const releases of octokit.paginate.iterator( + octokit.repos.listReleases, + { + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + } + )) { + const release = releases.data.find(release => release.tag_name === formatTagName(language, version)) + + console.log(`Deleting existing release for ${formatTagName(language, version)}`) + + if (release) { + await octokit.repos.deleteRelease({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + release_id: release.id, + }) + await octokit.git.deleteRef({ + owner: process.env.GITHUB_OWNER!, + repo: process.env.GITHUB_REPO!, + ref: `tags/${release.tag_name}`, + }) + } + } +} + +const createRelease = async (language: typeof languages[number], version: string) => { + const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }) + + await maybeDeleteRelease(language, version) + + await octokit.repos.createRelease({ owner: process.env.GITHUB_OWNER!, repo: process.env.GITHUB_REPO!, - tag_name: `${language}@${version}`, - name: `${language}@${version}`, + tag_name: formatTagName(language, version), + name: formatTagName(language, version), body: `This release updates the ${language} package to ${version}.`, }) } (async () => { - const nextVersions = await getNextVersions("patch") + const bumpType = process.env.BUMP_TYPE as typeof languages[number] | undefined + + if (!bumpType) { + throw new Error("BUMP_TYPE is not defined.") + } + + const nextVersions = await getNextVersions(bumpType) - await Promise.all(languages.map(async language => createRelease(language, nextVersions[language].next))) + await Promise.all(languages.map(async language => createRelease(language, nextVersions[language].next))) })() \ No newline at end of file From c3f201687c82c140f31ab32f57121d8e4b862d39 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 12:57:33 +0000 Subject: [PATCH 16/18] Add language selection to create-sdk-releases workflow and update version handling for new languages --- .github/workflows/create-sdk-releases.yml | 9 + packages/autorelease/src/create-releases.ts | 28 +- pnpm-lock.yaml | 275 ++++++++++++++++++++ 3 files changed, 302 insertions(+), 10 deletions(-) diff --git a/.github/workflows/create-sdk-releases.yml b/.github/workflows/create-sdk-releases.yml index fd1d792a3..6e56ead1e 100644 --- a/.github/workflows/create-sdk-releases.yml +++ b/.github/workflows/create-sdk-releases.yml @@ -11,6 +11,15 @@ on: - 'major' - 'minor' - 'patch' + language: + description: 'If you want to just release a specific language' + required: true + type: choice + options: + - 'go' + - 'java' + - 'python' + - 'typescript' jobs: run: runs-on: ubuntu-latest diff --git a/packages/autorelease/src/create-releases.ts b/packages/autorelease/src/create-releases.ts index f81a67250..8f149294a 100644 --- a/packages/autorelease/src/create-releases.ts +++ b/packages/autorelease/src/create-releases.ts @@ -2,7 +2,9 @@ import { Octokit } from "@octokit/rest" const versionMatchRegex = /v?(\d+\.\d+\.\d+)/g -const languages = ["python", "npm", "go"] as const +const languages = ["python", "typescript", "go", "typescript"] as const + +const bumpTypes = ["major", "minor", "patch"] as const const sortVersions = (versions: string[]) => { return versions.sort((a, b) => { @@ -38,7 +40,7 @@ const getGoVersions = async () => { return [json.Version.replace("v", "")] } -const updateVersion = async (version: string, update: "major" | "minor" | "patch") => { +const updateVersion = async (version: string, update: typeof bumpTypes[number]) => { const [major, minor, patch] = version.split(".").map(Number) return ({ @@ -49,19 +51,20 @@ const updateVersion = async (version: string, update: "major" | "minor" | "patch } const getLatestVersions = async () => { - const [pythonVersions, npmVersions, goVersions] = await Promise.all([ + const [pythonVersions, typescriptVersions, goVersions] = await Promise.all([ getPythonVersions(), getNpmVersions(), getGoVersions(), ]) return { python: sortVersions(pythonVersions).pop()!, - npm: sortVersions(npmVersions).pop()!, + typescript: sortVersions(typescriptVersions).pop()!, go: sortVersions(goVersions).pop()!, + java: "0.0.0" // TODO: java } } -const getNextVersions = async (update: "major" | "minor" | "patch") => { +const getNextVersions = async (update: typeof bumpTypes[number]) => { const latest = await getLatestVersions() return { @@ -69,14 +72,18 @@ const getNextVersions = async (update: "major" | "minor" | "patch") => { previous: latest.python, next: await updateVersion(latest.python, update), }, - npm: { - previous: latest.npm, - next: await updateVersion(latest.npm, update), + typescript: { + previous: latest.typescript, + next: await updateVersion(latest.typescript, update), }, go: { previous: latest.go, next: await updateVersion(latest.go, update), }, + java: { + previous: latest.java, + next: await updateVersion(latest.java, update), + } } } @@ -126,7 +133,8 @@ const createRelease = async (language: typeof languages[number], version: string } (async () => { - const bumpType = process.env.BUMP_TYPE as typeof languages[number] | undefined + const bumpType = process.env.BUMP_TYPE as typeof bumpTypes[number] | undefined + const language = process.env.LANGUAGE as typeof languages[number] | undefined if (!bumpType) { throw new Error("BUMP_TYPE is not defined.") @@ -134,5 +142,5 @@ const createRelease = async (language: typeof languages[number], version: string const nextVersions = await getNextVersions(bumpType) - await Promise.all(languages.map(async language => createRelease(language, nextVersions[language].next))) + await Promise.all(languages.filter(l => language ? l === language : true).map(async language => createRelease(language, nextVersions[language].next))) })() \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73fb18329..4a1906897 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,6 +66,9 @@ importers: ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.14.10)(typescript@5.6.3) + tsx: + specifier: ^4.19.2 + version: 4.19.2 devDependencies: '@babel/core': specifier: ^7.25.8 @@ -890,6 +893,150 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1668,6 +1815,11 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1792,6 +1944,9 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2464,6 +2619,9 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -2663,6 +2821,11 @@ packages: tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tsx@4.19.2: + resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==} + engines: {node: '>=18.0.0'} + hasBin: true + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -4060,6 +4223,78 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5103,6 +5338,33 @@ snapshots: es-errors@1.3.0: {} + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + escalade@3.2.0: {} escape-string-regexp@2.0.0: {} @@ -5219,6 +5481,10 @@ snapshots: get-stream@6.0.1: {} + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6023,6 +6289,8 @@ snapshots: resolve-from@5.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.2: {} resolve@1.22.8: @@ -6235,6 +6503,13 @@ snapshots: tslib@2.8.0: {} + tsx@4.19.2: + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.8.1 + optionalDependencies: + fsevents: 2.3.3 + type-detect@4.0.8: {} type-fest@0.21.3: {} From 3750d1acd646c756fc690ff0e446de13a5731bd5 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 14:01:42 +0000 Subject: [PATCH 17/18] Remove requirement for language selection in create-sdk-releases workflow --- .github/workflows/create-sdk-releases.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/create-sdk-releases.yml b/.github/workflows/create-sdk-releases.yml index 6e56ead1e..50b2176c9 100644 --- a/.github/workflows/create-sdk-releases.yml +++ b/.github/workflows/create-sdk-releases.yml @@ -13,7 +13,6 @@ on: - 'patch' language: description: 'If you want to just release a specific language' - required: true type: choice options: - 'go' From 69cc357131d6e8c6294dff8bd1d6388b4a437642 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Wed, 15 Jan 2025 14:13:40 +0000 Subject: [PATCH 18/18] Fix patch version calculation in updateVersion function --- packages/autorelease/src/create-releases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/autorelease/src/create-releases.ts b/packages/autorelease/src/create-releases.ts index 8f149294a..571747355 100644 --- a/packages/autorelease/src/create-releases.ts +++ b/packages/autorelease/src/create-releases.ts @@ -46,7 +46,7 @@ const updateVersion = async (version: string, update: typeof bumpTypes[number]) return ({ major: `${major + 1}.0.0`, minor: `${major}.${minor + 1}.0`, - patch: `${major}.${minor + 1}.${patch + 1}`, + patch: `${major}.${minor}.${patch + 1}`, })[update] }