@dvashim/changesets-gitlab
Advanced tools
| export declare const createApi: (gitlabToken?: string) => import("@gitbeaker/core").Gitlab<false>; |
+31
| import { Gitlab } from '@gitbeaker/rest'; | ||
| import { bootstrap } from 'global-agent'; | ||
| import { env } from "./env.js"; | ||
| const PROXY_PROPS = ['http_proxy', 'https_proxy', 'no_proxy']; | ||
| let bootstrapped = false; | ||
| export const createApi = (gitlabToken) => { | ||
| if (!bootstrapped) { | ||
| bootstrapped = true; | ||
| bootstrap(); | ||
| for (const prop of PROXY_PROPS) { | ||
| const uProp = prop.toUpperCase(); | ||
| const value = process.env[uProp] || process.env[prop]; | ||
| if (value) { | ||
| GLOBAL_AGENT[uProp] = value; | ||
| } | ||
| } | ||
| } | ||
| const token = gitlabToken || env.GITLAB_TOKEN; | ||
| const host = env.GITLAB_HOST; | ||
| if (env.GITLAB_TOKEN_TYPE === 'oauth') { | ||
| return new Gitlab({ | ||
| host, | ||
| oauthToken: token, | ||
| }); | ||
| } | ||
| return new Gitlab({ | ||
| host, | ||
| token, | ||
| }); | ||
| }; | ||
| //# sourceMappingURL=api.js.map |
| {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,UAAU,CAAU,CAAA;AAEtE,IAAI,YAAY,GAAG,KAAK,CAAA;AAExB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,WAAoB,EAAE,EAAE;IAChD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAI,CAAA;QAEnB,SAAS,EAAE,CAAA;QAEX,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAuC,CAAA;YACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACrD,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,IAAI,GAAG,CAAC,YAAY,CAAA;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAA;IAE5B,IAAI,GAAG,CAAC,iBAAiB,KAAK,OAAO,EAAE,CAAC;QACtC,OAAO,IAAI,MAAM,CAAC;YAChB,IAAI;YACJ,UAAU,EAAE,KAAK;SAClB,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,IAAI,MAAM,CAAC;QAChB,IAAI;QACJ,KAAK;KACN,CAAC,CAAA;AACJ,CAAC,CAAA"} |
| #!/usr/bin/env node | ||
| import './env.js'; |
+22
| #!/usr/bin/env node | ||
| import './env.js'; | ||
| import { program } from 'commander'; | ||
| import { comment } from './comment.js'; | ||
| import { main } from './main.js'; | ||
| import { cjsRequire, getOptionalInput } from './utils.js'; | ||
| const run = async () => { | ||
| program.version(cjsRequire('../package.json').version); | ||
| program.command('comment').action(async () => { | ||
| await comment(); | ||
| }); | ||
| program.command('main', { isDefault: true }).action(() => main({ | ||
| published: getOptionalInput('published'), | ||
| onlyChangesets: getOptionalInput('only_changesets'), | ||
| })); | ||
| return program.showHelpAfterError().parseAsync(); | ||
| }; | ||
| run().catch((err) => { | ||
| console.error(err); | ||
| process.exitCode = 1; | ||
| }); | ||
| //# sourceMappingURL=cli.js.map |
| {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,UAAU,CAAA;AACjB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAEzD,MAAM,GAAG,GAAG,KAAK,IAAI,EAAE;IACrB,OAAO,CAAC,OAAO,CACZ,UAAU,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAC/D,CAAA;IAED,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,OAAO,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CACvD,IAAI,CAAC;QACH,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC;QACxC,cAAc,EAAE,gBAAgB,CAAC,iBAAiB,CAAC;KACpD,CAAC,CACH,CAAA;IAED,OAAO,OAAO,CAAC,kBAAkB,EAAE,CAAC,UAAU,EAAE,CAAA;AAClD,CAAC,CAAA;AAED,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"} |
| import { type DiscussionSchema, type MergeRequestNoteSchema } from '@gitbeaker/rest'; | ||
| export declare const comment: () => Promise<DiscussionSchema | MergeRequestNoteSchema | import("@gitbeaker/core").MergeRequestDiscussionNoteSchema | undefined>; |
+228
| import { ValidationError } from '@changesets/errors'; | ||
| import { GitbeakerRequestError, } from '@gitbeaker/rest'; | ||
| import { humanId } from 'human-id'; | ||
| import { markdownTable } from 'markdown-table'; | ||
| import { createApi } from "./api.js"; | ||
| import * as context from './context.js'; | ||
| import { env } from './env.js'; | ||
| import { getChangedPackages } from './get-changed-packages.js'; | ||
| import { getUsername, HTTP_STATUS_NOT_FOUND, TRUTHY_VALUES } from './utils.js'; | ||
| const generatedByBotNote = 'Generated By Changesets GitLab Bot'; | ||
| const getReleasePlanMessage = (releasePlan) => { | ||
| if (!releasePlan) { | ||
| return ''; | ||
| } | ||
| const publishableReleases = releasePlan.releases.filter((x) => x.type !== 'none'); | ||
| const table = markdownTable([ | ||
| ['Name', 'Type'], | ||
| ...publishableReleases.map((x) => [ | ||
| x.name, | ||
| { | ||
| major: 'Major', | ||
| minor: 'Minor', | ||
| patch: 'Patch', | ||
| }[x.type], | ||
| ]), | ||
| ]); | ||
| return `<details><summary>This MR includes ${releasePlan.changesets.length > 0 | ||
| ? `changesets to release ${publishableReleases.length === 1 | ||
| ? '1 package' | ||
| : `${publishableReleases.length} packages`}` | ||
| : 'no changesets'}</summary> | ||
| ${publishableReleases.length > 0 | ||
| ? table | ||
| : "When changesets are added to this MR, you'll see the packages that this MR includes changesets for and the associated semver types"} | ||
| </details>`; | ||
| }; | ||
| const customLinks = env.GITLAB_COMMENT_CUSTOM_LINKS?.trim(); | ||
| const ADD_CHANGESET_URL_PLACEHOLDER_REGEXP = /\{\{\s*addChangesetUrl\s*\}\}/; | ||
| const getAbsentMessage = (commitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan) => `### ⚠️ No Changeset found | ||
| Latest commit: ${commitSha} | ||
| Merging this MR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.** | ||
| ${getReleasePlanMessage(releasePlan)} | ||
| ${customLinks | ||
| ? customLinks.replace(ADD_CHANGESET_URL_PLACEHOLDER_REGEXP, addChangesetUrl) | ||
| : `[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). | ||
| [Click here if you're a maintainer who wants to add a changeset to this MR](${addChangesetUrl})`} | ||
| ${newChangesetTemplateFallback} | ||
| __${generatedByBotNote}__ | ||
| `; | ||
| const getApproveMessage = (commitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan) => `### 🦋 Changeset detected | ||
| Latest commit: ${commitSha} | ||
| **The changes in this MR will be included in the next version bump.** | ||
| ${getReleasePlanMessage(releasePlan)} | ||
| ${customLinks | ||
| ? customLinks.replace(ADD_CHANGESET_URL_PLACEHOLDER_REGEXP, addChangesetUrl) | ||
| : `Not sure what this means? [Click here to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). | ||
| [Click here if you're a maintainer who wants to add another changeset to this MR](${addChangesetUrl})`} | ||
| ${newChangesetTemplateFallback} | ||
| __${generatedByBotNote}__ | ||
| `; | ||
| const getNewChangesetTemplate = (changedPackages, title) => `--- | ||
| ${changedPackages.map((x) => `"${x}": patch`).join('\n')} | ||
| --- | ||
| ${title} | ||
| `; | ||
| const isMrNote = (discussionOrNote) => 'noteable_type' in discussionOrNote | ||
| && discussionOrNote.noteable_type === 'MergeRequest'; | ||
| const RANDOM_BOT_NAME_PATTERN = /^((?:project|group)_\d+_bot\w*)_[\da-z]+$/i; | ||
| const isChangesetBotNote = (note, username, random) => (note.author.username === username | ||
| || (random | ||
| && RANDOM_BOT_NAME_PATTERN.exec(note.author.username)?.[1] === username)) | ||
| && note.body.includes(generatedByBotNote); | ||
| async function getNoteInfo(api, mrIid, commentType, random) { | ||
| const discussionOrNotes = await (commentType === 'discussion' | ||
| ? api.MergeRequestDiscussions.all(context.projectId, mrIid) | ||
| : api.MergeRequestNotes.all(context.projectId, +mrIid)); | ||
| const username = await getUsername(api); | ||
| for (const discussionOrNote of discussionOrNotes) { | ||
| if (isMrNote(discussionOrNote)) { | ||
| if (isChangesetBotNote(discussionOrNote, username, random)) { | ||
| return { | ||
| noteId: discussionOrNote.id, | ||
| }; | ||
| } | ||
| continue; | ||
| } | ||
| if (!discussionOrNote.notes) { | ||
| continue; | ||
| } | ||
| const changesetBotNote = discussionOrNote.notes.find((note) => isChangesetBotNote(note, username)); | ||
| if (changesetBotNote) { | ||
| return { | ||
| discussionId: discussionOrNote.id, | ||
| noteId: changesetBotNote.id, | ||
| }; | ||
| } | ||
| } | ||
| return random ? null : getNoteInfo(api, mrIid, commentType, true); | ||
| } | ||
| const hasChangesetBeenAdded = async (changedFilesPromise) => { | ||
| const changedFiles = await changedFilesPromise; | ||
| return changedFiles.some((file) => { | ||
| return (file.new_file | ||
| && /^\.changeset\/.+\.md$/.test(file.new_path) | ||
| && file.new_path !== '.changeset/README.md'); | ||
| }); | ||
| }; | ||
| export const comment = async () => { | ||
| const mrBranch = env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME; | ||
| if (!mrBranch) { | ||
| console.warn('[changesets-gitlab:comment] It should only be used on MR'); | ||
| return; | ||
| } | ||
| const { CI_MERGE_REQUEST_IID: mrIid, GITLAB_COMMENT_TYPE: commentType, GITLAB_ADD_CHANGESET_MESSAGE: commitMessage, } = env; | ||
| if (mrBranch.startsWith('changeset-release')) { | ||
| return; | ||
| } | ||
| const api = createApi(); | ||
| let errFromFetchingChangedFiles = ''; | ||
| try { | ||
| const latestCommitSha = env.CI_MERGE_REQUEST_SOURCE_BRANCH_SHA; | ||
| const changedFilesPromise = api.MergeRequests.allDiffs(context.projectId, mrIid).catch(async (err) => { | ||
| if (!(err instanceof GitbeakerRequestError) | ||
| || err.cause?.response.status !== HTTP_STATUS_NOT_FOUND) { | ||
| throw err; | ||
| } | ||
| const { changes } = await api.MergeRequests.showChanges(context.projectId, mrIid); | ||
| return changes; | ||
| }); | ||
| const [noteInfo, hasChangeset, { changedPackages, releasePlan }] = await Promise.all([ | ||
| getNoteInfo(api, mrIid, commentType), | ||
| hasChangesetBeenAdded(changedFilesPromise), | ||
| getChangedPackages({ | ||
| changedFiles: changedFilesPromise.then((changedFiles) => changedFiles.map(({ new_path }) => new_path)), | ||
| api, | ||
| }).catch((err) => { | ||
| if (err instanceof ValidationError) { | ||
| errFromFetchingChangedFiles = `<details><summary>💥 An error occurred when fetching the changed packages and changesets in this MR</summary>\n\n\`\`\`\n${err.message}\n\`\`\`\n\n</details>\n`; | ||
| } | ||
| else { | ||
| console.error(err); | ||
| } | ||
| return { | ||
| changedPackages: ['@fake-scope/fake-pkg'], | ||
| releasePlan: null, | ||
| }; | ||
| }), | ||
| ]); | ||
| const newChangesetFileName = `.changeset/${humanId({ | ||
| separator: '-', | ||
| capitalize: false, | ||
| })}.md`; | ||
| const newChangesetTemplate = getNewChangesetTemplate(changedPackages, env.CI_MERGE_REQUEST_TITLE); | ||
| const addChangesetUrl = `${env.CI_MERGE_REQUEST_PROJECT_URL}/-/new/${mrBranch}?file_name=${newChangesetFileName}&file=${encodeURIComponent(newChangesetTemplate)}${commitMessage | ||
| ? `&commit_message=${encodeURIComponent(commitMessage)}` | ||
| : ''}`; | ||
| const newChangesetTemplateFallback = ` | ||
| If the above link doesn't fill the changeset template file name and content which is [a known regression on GitLab >= 16.11](https://gitlab.com/gitlab-org/gitlab/-/issues/532221), you can copy and paste the following template into ${newChangesetFileName} instead: | ||
| \`\`\`yaml | ||
| ${newChangesetTemplate} | ||
| \`\`\` | ||
| `.trim(); | ||
| const prComment = (hasChangeset | ||
| ? getApproveMessage(latestCommitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan) | ||
| : getAbsentMessage(latestCommitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan)) + errFromFetchingChangedFiles; | ||
| switch (commentType) { | ||
| case 'discussion': { | ||
| if (noteInfo) { | ||
| if (hasChangeset | ||
| && TRUTHY_VALUES.has(env.GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE || '1')) { | ||
| await api.MergeRequestDiscussions.resolve(context.projectId, mrIid, noteInfo.discussionId, true); | ||
| } | ||
| return api.MergeRequestDiscussions.editNote(context.projectId, mrIid, noteInfo.discussionId, noteInfo.noteId, { | ||
| body: prComment, | ||
| }); | ||
| } | ||
| return api.MergeRequestDiscussions.create(context.projectId, mrIid, prComment); | ||
| } | ||
| case 'note': { | ||
| if (noteInfo) { | ||
| return api.MergeRequestNotes.edit(context.projectId, mrIid, noteInfo.noteId, { body: prComment }); | ||
| } | ||
| return api.MergeRequestNotes.create(context.projectId, mrIid, prComment); | ||
| } | ||
| default: { | ||
| throw new Error(`Invalid comment type "${commentType}", should be "discussion" or "note"`); | ||
| } | ||
| } | ||
| } | ||
| catch (err) { | ||
| if (err instanceof GitbeakerRequestError && err.cause) { | ||
| const { description, request, response } = err.cause; | ||
| console.error(description); | ||
| try { | ||
| console.error('request:', await request.text()); | ||
| } | ||
| catch { | ||
| console.error("The error's request could not be used as plain text"); | ||
| } | ||
| try { | ||
| console.error('response:', await response.text()); | ||
| } | ||
| catch { | ||
| console.error("The error's response could not be used as plain text"); | ||
| } | ||
| } | ||
| throw err; | ||
| } | ||
| }; | ||
| //# sourceMappingURL=comment.js.map |
| {"version":3,"file":"comment.js","sourceRoot":"","sources":["../src/comment.ts"],"names":[],"mappings":"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"} |
| export declare const projectId: string; | ||
| export declare const ref: string; |
| export const projectId = process.env.CI_PROJECT_ID; | ||
| export const ref = process.env.CI_COMMIT_REF_NAME; | ||
| //# sourceMappingURL=context.js.map |
| {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,aAAc,CAAA;AAEnD,MAAM,CAAC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAmB,CAAA"} |
| import type { Env } from './types.js'; | ||
| export declare const env: Env; |
+23
| import { setFailed } from '@actions/core'; | ||
| import dotenv from 'dotenv'; | ||
| dotenv.config(); | ||
| let isGitlabTokenValidated = false; | ||
| export const env = { | ||
| ...process.env, | ||
| CI_MERGE_REQUEST_IID: +process.env.CI_MERGE_REQUEST_IID, | ||
| GITLAB_HOST: process.env.GITLAB_HOST | ||
| ?? process.env.CI_SERVER_URL | ||
| ?? 'https://gitlab.com', | ||
| GITLAB_CI_USER_EMAIL: process.env.GITLAB_CI_USER_EMAIL || 'gitlab[bot]@users.noreply.gitlab.com', | ||
| GITLAB_COMMENT_TYPE: process.env.GITLAB_COMMENT_TYPE ?? 'discussion', | ||
| get GITLAB_TOKEN() { | ||
| if (!isGitlabTokenValidated) { | ||
| isGitlabTokenValidated = true; | ||
| if (!process.env.GITLAB_TOKEN) { | ||
| setFailed('Please add the `GITLAB_TOKEN` to the changesets action'); | ||
| } | ||
| } | ||
| return process.env.GITLAB_TOKEN; | ||
| }, | ||
| }; | ||
| //# sourceMappingURL=env.js.map |
| {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAG3B,MAAM,CAAC,MAAM,EAAE,CAAA;AAEf,IAAI,sBAAsB,GAAG,KAAK,CAAA;AAElC,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,GAAG,OAAO,CAAC,GAAG;IAEd,oBAAoB,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAqB;IACxD,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,WAAW;WACpB,OAAO,CAAC,GAAG,CAAC,aAAa;WACzB,oBAAoB;IACzB,oBAAoB,EAClB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,sCAAsC;IAC5E,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,YAAY;IAIpE,IAAI,YAAY;QACd,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC5B,sBAAsB,GAAG,IAAI,CAAA;YAC7B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;gBAC9B,SAAS,CAAC,wDAAwD,CAAC,CAAA;YACrE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,YAAa,CAAA;IAClC,CAAC;CACK,CAAA"} |
| import type { Gitlab } from '@gitbeaker/core'; | ||
| export declare const getChangedPackages: ({ changedFiles: changedFilesPromise, }: { | ||
| changedFiles: Promise<string[]> | string[]; | ||
| api: Gitlab; | ||
| }) => Promise<{ | ||
| changedPackages: string[]; | ||
| releasePlan: import("@changesets/types").ReleasePlan; | ||
| }>; |
| import fs from 'node:fs/promises'; | ||
| import nodePath from 'node:path'; | ||
| import assembleReleasePlan from '@changesets/assemble-release-plan'; | ||
| import { parse as parseConfig } from '@changesets/config'; | ||
| import parseChangeset from '@changesets/parse'; | ||
| import micromatch from 'micromatch'; | ||
| import { parse } from 'yaml'; | ||
| import { getAllFiles } from './utils.js'; | ||
| function fetchFile(path) { | ||
| return fs.readFile(path, 'utf8'); | ||
| } | ||
| export const getChangedPackages = async ({ changedFiles: changedFilesPromise, }) => { | ||
| let hasErrored = false; | ||
| async function fetchJsonFile(path) { | ||
| try { | ||
| const x = await fetchFile(path); | ||
| return JSON.parse(x); | ||
| } | ||
| catch (err) { | ||
| hasErrored = true; | ||
| console.error(err); | ||
| return {}; | ||
| } | ||
| } | ||
| async function fetchTextFile(path) { | ||
| try { | ||
| return await fetchFile(path); | ||
| } | ||
| catch (err) { | ||
| hasErrored = true; | ||
| console.error(err); | ||
| return ''; | ||
| } | ||
| } | ||
| async function getPackage(pkgPath) { | ||
| const jsonContent = await fetchJsonFile(`${pkgPath}/package.json`); | ||
| return { | ||
| packageJson: jsonContent, | ||
| dir: pkgPath, | ||
| }; | ||
| } | ||
| const rootPackageJsonContentsPromise = fetchJsonFile('package.json'); | ||
| const configPromise = fetchJsonFile('.changeset/config.json'); | ||
| const tree = await getAllFiles(process.cwd()); | ||
| let preStatePromise; | ||
| const changesetPromises = []; | ||
| const potentialWorkspaceDirectories = []; | ||
| let isPnpm = false; | ||
| const changedFiles = await changedFilesPromise; | ||
| for (const item of tree) { | ||
| if (item.endsWith('/package.json')) { | ||
| const dirPath = nodePath.dirname(item); | ||
| potentialWorkspaceDirectories.push(dirPath); | ||
| } | ||
| else if (item === 'pnpm-workspace.yaml') { | ||
| isPnpm = true; | ||
| } | ||
| else if (item === '.changeset/pre.json') { | ||
| preStatePromise = fetchJsonFile('.changeset/pre.json'); | ||
| } | ||
| else if (item !== '.changeset/README.md' | ||
| && item.startsWith('.changeset') | ||
| && item.endsWith('.md') | ||
| && changedFiles.includes(item)) { | ||
| const res = /\.changeset\/([^.]+)\.md/.exec(item); | ||
| if (!res) { | ||
| throw new Error('could not get name from changeset filename'); | ||
| } | ||
| const id = res[1]; | ||
| changesetPromises.push(fetchTextFile(item).then((text) => ({ | ||
| ...parseChangeset(text), | ||
| id, | ||
| }))); | ||
| } | ||
| } | ||
| let tool; | ||
| if (isPnpm) { | ||
| tool = { | ||
| tool: 'pnpm', | ||
| globs: parse(await fetchTextFile('pnpm-workspace.yaml')).packages, | ||
| }; | ||
| } | ||
| else { | ||
| const rootPackageJsonContent = await rootPackageJsonContentsPromise; | ||
| if (rootPackageJsonContent.workspaces) { | ||
| tool = { | ||
| tool: 'yarn', | ||
| globs: Array.isArray(rootPackageJsonContent.workspaces) | ||
| ? rootPackageJsonContent.workspaces | ||
| : rootPackageJsonContent.workspaces.packages, | ||
| }; | ||
| } | ||
| else if (rootPackageJsonContent.bolt?.workspaces) { | ||
| tool = { | ||
| tool: 'bolt', | ||
| globs: rootPackageJsonContent.bolt.workspaces, | ||
| }; | ||
| } | ||
| } | ||
| const rootPackageJsonContent = await rootPackageJsonContentsPromise; | ||
| const packages = { | ||
| root: { | ||
| dir: '/', | ||
| packageJson: rootPackageJsonContent, | ||
| }, | ||
| tool: (tool ? tool.tool : 'root'), | ||
| packages: [], | ||
| }; | ||
| if (tool) { | ||
| if (!Array.isArray(tool.globs) | ||
| || !tool.globs.every((x) => typeof x === 'string')) { | ||
| throw new Error(`globs are not valid: ${JSON.stringify(tool.globs)}`); | ||
| } | ||
| const matches = micromatch(potentialWorkspaceDirectories, tool.globs); | ||
| packages.packages = await Promise.all(matches.map((dir) => getPackage(dir))); | ||
| } | ||
| else { | ||
| packages.packages.push(packages.root); | ||
| } | ||
| if (hasErrored) { | ||
| throw new Error('an error occurred when fetching files'); | ||
| } | ||
| const config = await configPromise.then((rawConfig) => parseConfig(rawConfig, packages)); | ||
| const releasePlan = assembleReleasePlan(await Promise.all(changesetPromises), packages, config, await preStatePromise); | ||
| return { | ||
| changedPackages: (packages.tool === 'root' | ||
| ? packages.packages | ||
| : packages.packages.filter((pkg) => changedFiles.some((changedFile) => changedFile.includes(pkg.dir)))) | ||
| .filter((pkg) => pkg.packageJson.private !== true | ||
| && !config.ignore.includes(pkg.packageJson.name)) | ||
| .map((x) => x.packageJson.name), | ||
| releasePlan, | ||
| }; | ||
| }; | ||
| //# sourceMappingURL=get-changed-packages.js.map |
| {"version":3,"file":"get-changed-packages.js","sourceRoot":"","sources":["../src/get-changed-packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACjC,OAAO,QAAQ,MAAM,WAAW,CAAA;AAChC,OAAO,mBAAmB,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,cAAc,MAAM,mBAAmB,CAAA;AAQ9C,OAAO,UAAU,MAAM,YAAY,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,EACvC,YAAY,EAAE,mBAAmB,GAIlC,EAAE,EAAE;IACH,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,KAAK,UAAU,aAAa,CAAc,IAAY;QACpD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;YAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAM,CAAA;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAA;YACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,OAAO,EAAkB,CAAA;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,UAAU,aAAa,CAAC,IAAY;QACvC,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,GAAG,IAAI,CAAA;YACjB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAClB,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,OAAe;QACvC,MAAM,WAAW,GAAG,MAAM,aAAa,CACrC,GAAG,OAAO,eAAe,CAC1B,CAAA;QACD,OAAO;YACL,WAAW,EAAE,WAAW;YACxB,GAAG,EAAE,OAAO;SACb,CAAA;IACH,CAAC;IAED,MAAM,8BAA8B,GAAG,aAAa,CAWlD,cAAc,CAAC,CAAA;IACjB,MAAM,aAAa,GAAG,aAAa,CAAgB,wBAAwB,CAAC,CAAA;IAE5E,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAE7C,IAAI,eAA8C,CAAA;IAClD,MAAM,iBAAiB,GAAiC,EAAE,CAAA;IAC1D,MAAM,6BAA6B,GAAa,EAAE,CAAA;IAClD,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAA;IAE9C,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACtC,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7C,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,MAAM,GAAG,IAAI,CAAA;QACf,CAAC;aAAM,IAAI,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAC1C,eAAe,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAA;QACxD,CAAC;aAAM,IACL,IAAI,KAAK,sBAAsB;eAC5B,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;eAC7B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;eACpB,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAC9B,CAAC;YACD,MAAM,GAAG,GAAG,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YAC/D,CAAC;YACD,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACjB,iBAAiB,CAAC,IAAI,CACpB,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAClC,GAAG,cAAc,CAAC,IAAI,CAAC;gBACvB,EAAE;aACH,CAAC,CAAC,CACJ,CAAA;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAqE,CAAA;IAEzE,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,GAAG;YACL,IAAI,EAAE,MAAM;YACZ,KAAK,EACH,KAAK,CAAC,MAAM,aAAa,CAAC,qBAAqB,CAAC,CAGjD,CAAC,QAAQ;SACX,CAAA;IACH,CAAC;SAAM,CAAC;QACN,MAAM,sBAAsB,GAAG,MAAM,8BAA8B,CAAA;QAEnE,IAAI,sBAAsB,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,GAAG;gBACL,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,UAAU,CAAC;oBACrD,CAAC,CAAC,sBAAsB,CAAC,UAAU;oBACnC,CAAC,CAAC,sBAAsB,CAAC,UAAU,CAAC,QAAQ;aAC/C,CAAA;QACH,CAAC;aAAM,IAAI,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC;YACnD,IAAI,GAAG;gBACL,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,sBAAsB,CAAC,IAAI,CAAC,UAAU;aAC9C,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,sBAAsB,GAAG,MAAM,8BAA8B,CAAA;IAEnE,MAAM,QAAQ,GAAG;QACf,IAAI,EAAE;YACJ,GAAG,EAAE,GAAG;YACR,WAAW,EAAE,sBAAsB;SACpC;QACD,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAsC;QACtE,QAAQ,EAAE,EAAiD;KAC5D,CAAA;IAED,IAAI,IAAI,EAAE,CAAC;QACT,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;eACvB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAClD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,6BAA6B,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACrE,QAAQ,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACpD,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CACjC,CAAA;IAED,MAAM,WAAW,GAAG,mBAAmB,CACrC,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EACpC,QAAQ,EACR,MAAM,EACN,MAAM,eAAe,CACtB,CAAA;IAED,OAAO;QACL,eAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;YACxC,CAAC,CAAC,QAAQ,CAAC,QAAQ;YACnB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAClE,CACJ;aACE,MAAM,CACL,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,CAAC,WAAW,CAAC,OAAO,KAAK,IAAI;eAC7B,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CACnD;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QACjC,WAAW;KACZ,CAAA;AACH,CAAC,CAAA"} |
| export declare const setupUser: () => Promise<void>; | ||
| export declare const pullBranch: (branch: string) => Promise<void>; | ||
| export declare const push: (branch: string, { force }?: { | ||
| force?: boolean; | ||
| }) => Promise<void>; | ||
| export declare const pushTags: () => Promise<void>; | ||
| export declare const pushTag: (tag: string) => Promise<void>; | ||
| export declare const switchToMaybeExistingBranch: (branch: string) => Promise<void>; | ||
| export declare const reset: (pathSpec: string, mode?: "hard" | "mixed" | "soft") => Promise<void>; | ||
| export declare const commitAll: (message: string) => Promise<void>; | ||
| export declare const checkIfClean: () => Promise<boolean>; |
| import { exec } from '@actions/exec'; | ||
| import { env } from './env.js'; | ||
| import { execWithOutput, identify } from './utils.js'; | ||
| export const setupUser = async () => { | ||
| await exec('git', [ | ||
| 'config', | ||
| 'user.name', | ||
| env.GITLAB_CI_USER_NAME || env.GITLAB_USER_NAME, | ||
| ]); | ||
| await exec('git', ['config', 'user.email', env.GITLAB_CI_USER_EMAIL]); | ||
| }; | ||
| export const pullBranch = async (branch) => { | ||
| await exec('git', ['pull', 'origin', branch]); | ||
| }; | ||
| export const push = async (branch, { force } = {}) => { | ||
| await exec('git', ['push', 'origin', `HEAD:${branch}`, force && '--force'].filter(identify)); | ||
| }; | ||
| export const pushTags = async () => { | ||
| await exec('git', ['push', 'origin', '--tags']); | ||
| }; | ||
| export const pushTag = async (tag) => { | ||
| await exec('git', ['push', 'origin', tag]); | ||
| }; | ||
| export const switchToMaybeExistingBranch = async (branch) => { | ||
| const { stderr } = await execWithOutput('git', ['checkout', branch], { | ||
| ignoreReturnCode: true, | ||
| }); | ||
| const isCreatingBranch = !stderr.includes(`Switched to branch '${branch}'`) | ||
| && !stderr.includes(`Switched to a new branch '${branch}'`); | ||
| if (isCreatingBranch) { | ||
| await exec('git', ['checkout', '-b', branch]); | ||
| } | ||
| }; | ||
| export const reset = async (pathSpec, mode = 'hard') => { | ||
| await exec('git', ['reset', `--${mode}`, pathSpec]); | ||
| }; | ||
| export const commitAll = async (message) => { | ||
| await exec('git', ['add', '-A', '.']); | ||
| await exec('git', ['commit', '-m', message]); | ||
| }; | ||
| export const checkIfClean = async () => { | ||
| const { stdout } = await execWithOutput('git', ['status', '--porcelain']); | ||
| return stdout.length === 0; | ||
| }; | ||
| //# sourceMappingURL=git-utils.js.map |
| {"version":3,"file":"git-utils.js","sourceRoot":"","sources":["../src/git-utils.ts"],"names":[],"mappings":"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"} |
+959
| 'use strict'; | ||
| var rest = require('@gitbeaker/rest'); | ||
| var globalAgent = require('global-agent'); | ||
| var core = require('@actions/core'); | ||
| var dotenv = require('dotenv'); | ||
| var errors = require('@changesets/errors'); | ||
| var humanId = require('human-id'); | ||
| var markdownTable = require('markdown-table'); | ||
| var fs$1 = require('node:fs/promises'); | ||
| var path = require('node:path'); | ||
| var assembleReleasePlan = require('@changesets/assemble-release-plan'); | ||
| var config = require('@changesets/config'); | ||
| var parseChangeset = require('@changesets/parse'); | ||
| var micromatch = require('micromatch'); | ||
| var yaml = require('yaml'); | ||
| var node_child_process = require('node:child_process'); | ||
| var fs = require('node:fs'); | ||
| var node_module = require('node:module'); | ||
| var exec = require('@actions/exec'); | ||
| var getPackages = require('@manypkg/get-packages'); | ||
| var mdastUtilToString = require('mdast-util-to-string'); | ||
| var remarkParse = require('remark-parse'); | ||
| var remarkStringify = require('remark-stringify'); | ||
| var unified = require('unified'); | ||
| var node_url = require('node:url'); | ||
| var pre = require('@changesets/pre'); | ||
| var readChangesets = require('@changesets/read'); | ||
| var pLimit = require('p-limit'); | ||
| var resolveFrom = require('resolve-from'); | ||
| var semver = require('semver'); | ||
| var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null; | ||
| function _interopNamespaceDefault(e) { | ||
| var n = Object.create(null); | ||
| if (e) { | ||
| Object.keys(e).forEach(function (k) { | ||
| if (k !== 'default') { | ||
| var d = Object.getOwnPropertyDescriptor(e, k); | ||
| Object.defineProperty(n, k, d.get ? d : { | ||
| enumerable: true, | ||
| get: function () { return e[k]; } | ||
| }); | ||
| } | ||
| }); | ||
| } | ||
| n.default = e; | ||
| return Object.freeze(n); | ||
| } | ||
| var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver); | ||
| dotenv.config(); | ||
| let isGitlabTokenValidated = false; | ||
| const env = { | ||
| ...process.env, | ||
| CI_MERGE_REQUEST_IID: +process.env.CI_MERGE_REQUEST_IID, | ||
| GITLAB_HOST: process.env.GITLAB_HOST ?? process.env.CI_SERVER_URL ?? "https://gitlab.com", | ||
| GITLAB_CI_USER_EMAIL: process.env.GITLAB_CI_USER_EMAIL || "gitlab[bot]@users.noreply.gitlab.com", | ||
| GITLAB_COMMENT_TYPE: process.env.GITLAB_COMMENT_TYPE ?? "discussion", | ||
| // only check for the token if we are explicitly using it | ||
| get GITLAB_TOKEN() { | ||
| if (!isGitlabTokenValidated) { | ||
| isGitlabTokenValidated = true; | ||
| if (!process.env.GITLAB_TOKEN) { | ||
| core.setFailed("Please add the `GITLAB_TOKEN` to the changesets action"); | ||
| } | ||
| } | ||
| return process.env.GITLAB_TOKEN; | ||
| } | ||
| }; | ||
| const PROXY_PROPS = ["http_proxy", "https_proxy", "no_proxy"]; | ||
| let bootstrapped = false; | ||
| const createApi = (gitlabToken) => { | ||
| if (!bootstrapped) { | ||
| bootstrapped = true; | ||
| globalAgent.bootstrap(); | ||
| for (const prop of PROXY_PROPS) { | ||
| const uProp = prop.toUpperCase(); | ||
| const value = process.env[uProp] || process.env[prop]; | ||
| if (value) { | ||
| GLOBAL_AGENT[uProp] = value; | ||
| } | ||
| } | ||
| } | ||
| const token = gitlabToken || env.GITLAB_TOKEN; | ||
| const host = env.GITLAB_HOST; | ||
| if (env.GITLAB_TOKEN_TYPE === "oauth") { | ||
| return new rest.Gitlab({ | ||
| host, | ||
| oauthToken: token | ||
| }); | ||
| } | ||
| return new rest.Gitlab({ | ||
| host, | ||
| token | ||
| }); | ||
| }; | ||
| const projectId = process.env.CI_PROJECT_ID; | ||
| const ref = process.env.CI_COMMIT_REF_NAME; | ||
| const BumpLevels = { | ||
| dep: 0, | ||
| patch: 1, | ||
| minor: 2, | ||
| major: 3 | ||
| }; | ||
| async function getVersionsByDirectory(cwd) { | ||
| const { packages } = await getPackages.getPackages(cwd); | ||
| return new Map(packages.map((x) => [x.dir, x.packageJson.version])); | ||
| } | ||
| async function getChangedPackages$1(cwd, previousVersions) { | ||
| const { packages } = await getPackages.getPackages(cwd); | ||
| const changedPackages = /* @__PURE__ */ new Set(); | ||
| for (const pkg of packages) { | ||
| const previousVersion = previousVersions.get(pkg.dir); | ||
| if (previousVersion !== pkg.packageJson.version) { | ||
| changedPackages.add(pkg); | ||
| } | ||
| } | ||
| return [...changedPackages]; | ||
| } | ||
| function getChangelogEntry(changelog, version) { | ||
| const ast = unified.unified().use(remarkParse).parse(changelog); | ||
| let highestLevel = BumpLevels.dep; | ||
| const nodes = ast.children; | ||
| let headingStartInfo; | ||
| let endIndex; | ||
| for (const [i, node] of nodes.entries()) { | ||
| if (node.type === "heading") { | ||
| const stringified = mdastUtilToString.toString(node); | ||
| const match = /(major|minor|patch)/.exec(stringified.toLowerCase()); | ||
| if (match !== null) { | ||
| const level = BumpLevels[match[0]]; | ||
| highestLevel = Math.max(level, highestLevel); | ||
| } | ||
| if (headingStartInfo === void 0 && stringified === version) { | ||
| headingStartInfo = { | ||
| index: i, | ||
| depth: node.depth | ||
| }; | ||
| continue; | ||
| } | ||
| if (endIndex === void 0 && headingStartInfo !== void 0 && headingStartInfo.depth === node.depth) { | ||
| endIndex = i; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| if (headingStartInfo) { | ||
| ast.children = ast.children.slice(headingStartInfo.index + 1, endIndex); | ||
| } | ||
| return { | ||
| content: unified.unified().use(remarkStringify).stringify(ast), | ||
| highestLevel | ||
| }; | ||
| } | ||
| async function execWithOutput(command, args, options) { | ||
| let myOutput = ""; | ||
| let myError = ""; | ||
| return { | ||
| code: await exec.exec(command, args, { | ||
| listeners: { | ||
| stdout: (data) => { | ||
| myOutput += data.toString(); | ||
| }, | ||
| stderr: (data) => { | ||
| myError += data.toString(); | ||
| } | ||
| }, | ||
| ...options | ||
| }), | ||
| stdout: myOutput, | ||
| stderr: myError | ||
| }; | ||
| } | ||
| function sortTheThings(a, b) { | ||
| if (a.private === b.private) { | ||
| return b.highestLevel - a.highestLevel; | ||
| } | ||
| if (a.private) { | ||
| return 1; | ||
| } | ||
| return -1; | ||
| } | ||
| const identify = (_) => !!_; | ||
| async function getAllFiles(dir, base = dir) { | ||
| const direntList = await fs.promises.readdir(dir, { withFileTypes: true }); | ||
| const files = await Promise.all( | ||
| direntList.map((dirent) => { | ||
| const res = path.resolve(dir, dirent.name); | ||
| return dirent.isDirectory() ? getAllFiles(res, base) : [path.relative(base, res)]; | ||
| }) | ||
| ); | ||
| return files.flat(); | ||
| } | ||
| const execSync = (command) => node_child_process.execSync(command, { stdio: "inherit" }); | ||
| const getOptionalInput = (name) => core.getInput(name) || void 0; | ||
| const getUsername = async (api) => { | ||
| return env.GITLAB_CI_USER_NAME ?? (await api.Users.showCurrentUser()).username; | ||
| }; | ||
| const cjsRequire = typeof require === "undefined" ? node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))) : require; | ||
| const FALSY_VALUES = /* @__PURE__ */ new Set(["false", "0"]); | ||
| const TRUTHY_VALUES = /* @__PURE__ */ new Set(["true", "1"]); | ||
| const GITLAB_MAX_TAGS = 4; | ||
| const HTTP_STATUS_NOT_FOUND = 404; | ||
| function fetchFile(path) { | ||
| return fs$1.readFile(path, "utf8"); | ||
| } | ||
| const getChangedPackages = async ({ | ||
| changedFiles: changedFilesPromise | ||
| }) => { | ||
| let hasErrored = false; | ||
| async function fetchJsonFile(path) { | ||
| try { | ||
| const x = await fetchFile(path); | ||
| return JSON.parse(x); | ||
| } catch (err) { | ||
| hasErrored = true; | ||
| console.error(err); | ||
| return {}; | ||
| } | ||
| } | ||
| async function fetchTextFile(path) { | ||
| try { | ||
| return await fetchFile(path); | ||
| } catch (err) { | ||
| hasErrored = true; | ||
| console.error(err); | ||
| return ""; | ||
| } | ||
| } | ||
| async function getPackage(pkgPath) { | ||
| const jsonContent = await fetchJsonFile( | ||
| `${pkgPath}/package.json` | ||
| ); | ||
| return { | ||
| packageJson: jsonContent, | ||
| dir: pkgPath | ||
| }; | ||
| } | ||
| const rootPackageJsonContentsPromise = fetchJsonFile("package.json"); | ||
| const configPromise = fetchJsonFile(".changeset/config.json"); | ||
| const tree = await getAllFiles(process.cwd()); | ||
| let preStatePromise; | ||
| const changesetPromises = []; | ||
| const potentialWorkspaceDirectories = []; | ||
| let isPnpm = false; | ||
| const changedFiles = await changedFilesPromise; | ||
| for (const item of tree) { | ||
| if (item.endsWith("/package.json")) { | ||
| const dirPath = path.dirname(item); | ||
| potentialWorkspaceDirectories.push(dirPath); | ||
| } else if (item === "pnpm-workspace.yaml") { | ||
| isPnpm = true; | ||
| } else if (item === ".changeset/pre.json") { | ||
| preStatePromise = fetchJsonFile(".changeset/pre.json"); | ||
| } else if (item !== ".changeset/README.md" && item.startsWith(".changeset") && item.endsWith(".md") && changedFiles.includes(item)) { | ||
| const res = /\.changeset\/([^.]+)\.md/.exec(item); | ||
| if (!res) { | ||
| throw new Error("could not get name from changeset filename"); | ||
| } | ||
| const id = res[1]; | ||
| changesetPromises.push( | ||
| fetchTextFile(item).then((text) => ({ | ||
| ...parseChangeset(text), | ||
| id | ||
| })) | ||
| ); | ||
| } | ||
| } | ||
| let tool; | ||
| if (isPnpm) { | ||
| tool = { | ||
| tool: "pnpm", | ||
| globs: yaml.parse(await fetchTextFile("pnpm-workspace.yaml")).packages | ||
| }; | ||
| } else { | ||
| const rootPackageJsonContent2 = await rootPackageJsonContentsPromise; | ||
| if (rootPackageJsonContent2.workspaces) { | ||
| tool = { | ||
| tool: "yarn", | ||
| globs: Array.isArray(rootPackageJsonContent2.workspaces) ? rootPackageJsonContent2.workspaces : rootPackageJsonContent2.workspaces.packages | ||
| }; | ||
| } else if (rootPackageJsonContent2.bolt?.workspaces) { | ||
| tool = { | ||
| tool: "bolt", | ||
| globs: rootPackageJsonContent2.bolt.workspaces | ||
| }; | ||
| } | ||
| } | ||
| const rootPackageJsonContent = await rootPackageJsonContentsPromise; | ||
| const packages = { | ||
| root: { | ||
| dir: "/", | ||
| packageJson: rootPackageJsonContent | ||
| }, | ||
| tool: tool ? tool.tool : "root", | ||
| packages: [] | ||
| }; | ||
| if (tool) { | ||
| if (!Array.isArray(tool.globs) || !tool.globs.every((x) => typeof x === "string")) { | ||
| throw new Error(`globs are not valid: ${JSON.stringify(tool.globs)}`); | ||
| } | ||
| const matches = micromatch(potentialWorkspaceDirectories, tool.globs); | ||
| packages.packages = await Promise.all(matches.map((dir) => getPackage(dir))); | ||
| } else { | ||
| packages.packages.push(packages.root); | ||
| } | ||
| if (hasErrored) { | ||
| throw new Error("an error occurred when fetching files"); | ||
| } | ||
| const config$1 = await configPromise.then( | ||
| (rawConfig) => config.parse(rawConfig, packages) | ||
| ); | ||
| const releasePlan = assembleReleasePlan( | ||
| await Promise.all(changesetPromises), | ||
| packages, | ||
| config$1, | ||
| await preStatePromise | ||
| ); | ||
| return { | ||
| changedPackages: (packages.tool === "root" ? packages.packages : packages.packages.filter( | ||
| (pkg) => changedFiles.some((changedFile) => changedFile.includes(pkg.dir)) | ||
| )).filter( | ||
| (pkg) => pkg.packageJson.private !== true && !config$1.ignore.includes(pkg.packageJson.name) | ||
| ).map((x) => x.packageJson.name), | ||
| releasePlan | ||
| }; | ||
| }; | ||
| const generatedByBotNote = "Generated By Changesets GitLab Bot"; | ||
| const getReleasePlanMessage = (releasePlan) => { | ||
| if (!releasePlan) { | ||
| return ""; | ||
| } | ||
| const publishableReleases = releasePlan.releases.filter( | ||
| (x) => x.type !== "none" | ||
| ); | ||
| const table = markdownTable.markdownTable([ | ||
| ["Name", "Type"], | ||
| ...publishableReleases.map((x) => [ | ||
| x.name, | ||
| { | ||
| major: "Major", | ||
| minor: "Minor", | ||
| patch: "Patch" | ||
| }[x.type] | ||
| ]) | ||
| ]); | ||
| return `<details><summary>This MR includes ${releasePlan.changesets.length > 0 ? `changesets to release ${publishableReleases.length === 1 ? "1 package" : `${publishableReleases.length} packages`}` : "no changesets"}</summary> | ||
| ${publishableReleases.length > 0 ? table : "When changesets are added to this MR, you'll see the packages that this MR includes changesets for and the associated semver types"} | ||
| </details>`; | ||
| }; | ||
| const customLinks = env.GITLAB_COMMENT_CUSTOM_LINKS?.trim(); | ||
| const ADD_CHANGESET_URL_PLACEHOLDER_REGEXP = /\{\{\s*addChangesetUrl\s*\}\}/; | ||
| const getAbsentMessage = (commitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan) => `### \u26A0\uFE0F No Changeset found | ||
| Latest commit: ${commitSha} | ||
| Merging this MR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. **If these changes should result in a version bump, you need to add a changeset.** | ||
| ${getReleasePlanMessage(releasePlan)} | ||
| ${customLinks ? customLinks.replace(ADD_CHANGESET_URL_PLACEHOLDER_REGEXP, addChangesetUrl) : `[Click here to learn what changesets are, and how to add one](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). | ||
| [Click here if you're a maintainer who wants to add a changeset to this MR](${addChangesetUrl})`} | ||
| ${newChangesetTemplateFallback} | ||
| __${generatedByBotNote}__ | ||
| `; | ||
| const getApproveMessage = (commitSha, addChangesetUrl, newChangesetTemplateFallback, releasePlan) => `### \u{1F98B} Changeset detected | ||
| Latest commit: ${commitSha} | ||
| **The changes in this MR will be included in the next version bump.** | ||
| ${getReleasePlanMessage(releasePlan)} | ||
| ${customLinks ? customLinks.replace(ADD_CHANGESET_URL_PLACEHOLDER_REGEXP, addChangesetUrl) : `Not sure what this means? [Click here to learn what changesets are](https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md). | ||
| [Click here if you're a maintainer who wants to add another changeset to this MR](${addChangesetUrl})`} | ||
| ${newChangesetTemplateFallback} | ||
| __${generatedByBotNote}__ | ||
| `; | ||
| const getNewChangesetTemplate = (changedPackages, title) => `--- | ||
| ${changedPackages.map((x) => `"${x}": patch`).join("\n")} | ||
| --- | ||
| ${title} | ||
| `; | ||
| const isMrNote = (discussionOrNote) => "noteable_type" in discussionOrNote && discussionOrNote.noteable_type === "MergeRequest"; | ||
| const RANDOM_BOT_NAME_PATTERN = /^((?:project|group)_\d+_bot\w*)_[\da-z]+$/i; | ||
| const isChangesetBotNote = (note, username, random) => (note.author.username === username || random && RANDOM_BOT_NAME_PATTERN.exec(note.author.username)?.[1] === username) && note.body.includes(generatedByBotNote); | ||
| async function getNoteInfo(api, mrIid, commentType, random) { | ||
| const discussionOrNotes = await (commentType === "discussion" ? api.MergeRequestDiscussions.all(projectId, mrIid) : api.MergeRequestNotes.all(projectId, +mrIid)); | ||
| const username = await getUsername(api); | ||
| for (const discussionOrNote of discussionOrNotes) { | ||
| if (isMrNote(discussionOrNote)) { | ||
| if (isChangesetBotNote(discussionOrNote, username, random)) { | ||
| return { | ||
| noteId: discussionOrNote.id | ||
| }; | ||
| } | ||
| continue; | ||
| } | ||
| if (!discussionOrNote.notes) { | ||
| continue; | ||
| } | ||
| const changesetBotNote = discussionOrNote.notes.find( | ||
| (note) => isChangesetBotNote(note, username) | ||
| ); | ||
| if (changesetBotNote) { | ||
| return { | ||
| discussionId: discussionOrNote.id, | ||
| noteId: changesetBotNote.id | ||
| }; | ||
| } | ||
| } | ||
| return random ? null : getNoteInfo(api, mrIid, commentType, true); | ||
| } | ||
| const hasChangesetBeenAdded = async (changedFilesPromise) => { | ||
| const changedFiles = await changedFilesPromise; | ||
| return changedFiles.some((file) => { | ||
| return file.new_file && /^\.changeset\/.+\.md$/.test(file.new_path) && file.new_path !== ".changeset/README.md"; | ||
| }); | ||
| }; | ||
| const comment = async () => { | ||
| const mrBranch = env.CI_MERGE_REQUEST_SOURCE_BRANCH_NAME; | ||
| if (!mrBranch) { | ||
| console.warn("[changesets-gitlab:comment] It should only be used on MR"); | ||
| return; | ||
| } | ||
| const { | ||
| CI_MERGE_REQUEST_IID: mrIid, | ||
| GITLAB_COMMENT_TYPE: commentType, | ||
| GITLAB_ADD_CHANGESET_MESSAGE: commitMessage | ||
| } = env; | ||
| if (mrBranch.startsWith("changeset-release")) { | ||
| return; | ||
| } | ||
| const api = createApi(); | ||
| let errFromFetchingChangedFiles = ""; | ||
| try { | ||
| const latestCommitSha = env.CI_MERGE_REQUEST_SOURCE_BRANCH_SHA; | ||
| const changedFilesPromise = api.MergeRequests.allDiffs( | ||
| projectId, | ||
| mrIid | ||
| ).catch(async (err) => { | ||
| if (!(err instanceof rest.GitbeakerRequestError) || err.cause?.response.status !== HTTP_STATUS_NOT_FOUND) { | ||
| throw err; | ||
| } | ||
| const { changes } = await api.MergeRequests.showChanges( | ||
| projectId, | ||
| mrIid | ||
| ); | ||
| return changes; | ||
| }); | ||
| const [noteInfo, hasChangeset, { changedPackages, releasePlan }] = await Promise.all([ | ||
| getNoteInfo(api, mrIid, commentType), | ||
| hasChangesetBeenAdded(changedFilesPromise), | ||
| getChangedPackages({ | ||
| changedFiles: changedFilesPromise.then( | ||
| (changedFiles) => changedFiles.map(({ new_path }) => new_path) | ||
| ), | ||
| api | ||
| }).catch((err) => { | ||
| if (err instanceof errors.ValidationError) { | ||
| errFromFetchingChangedFiles = `<details><summary>\u{1F4A5} An error occurred when fetching the changed packages and changesets in this MR</summary> | ||
| \`\`\` | ||
| ${err.message} | ||
| \`\`\` | ||
| </details> | ||
| `; | ||
| } else { | ||
| console.error(err); | ||
| } | ||
| return { | ||
| changedPackages: ["@fake-scope/fake-pkg"], | ||
| releasePlan: null | ||
| }; | ||
| }) | ||
| ]); | ||
| const newChangesetFileName = `.changeset/${humanId.humanId({ | ||
| separator: "-", | ||
| capitalize: false | ||
| })}.md`; | ||
| const newChangesetTemplate = getNewChangesetTemplate( | ||
| changedPackages, | ||
| env.CI_MERGE_REQUEST_TITLE | ||
| ); | ||
| const addChangesetUrl = `${env.CI_MERGE_REQUEST_PROJECT_URL}/-/new/${mrBranch}?file_name=${newChangesetFileName}&file=${encodeURIComponent(newChangesetTemplate)}${commitMessage ? `&commit_message=${encodeURIComponent(commitMessage)}` : ""}`; | ||
| const newChangesetTemplateFallback = ` | ||
| If the above link doesn't fill the changeset template file name and content which is [a known regression on GitLab >= 16.11](https://gitlab.com/gitlab-org/gitlab/-/issues/532221), you can copy and paste the following template into ${newChangesetFileName} instead: | ||
| \`\`\`yaml | ||
| ${newChangesetTemplate} | ||
| \`\`\` | ||
| `.trim(); | ||
| const prComment = (hasChangeset ? getApproveMessage( | ||
| latestCommitSha, | ||
| addChangesetUrl, | ||
| newChangesetTemplateFallback, | ||
| releasePlan | ||
| ) : getAbsentMessage( | ||
| latestCommitSha, | ||
| addChangesetUrl, | ||
| newChangesetTemplateFallback, | ||
| releasePlan | ||
| )) + errFromFetchingChangedFiles; | ||
| switch (commentType) { | ||
| case "discussion": { | ||
| if (noteInfo) { | ||
| if (hasChangeset && TRUTHY_VALUES.has( | ||
| env.GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE || "1" | ||
| )) { | ||
| await api.MergeRequestDiscussions.resolve( | ||
| projectId, | ||
| mrIid, | ||
| noteInfo.discussionId, | ||
| true | ||
| ); | ||
| } | ||
| return api.MergeRequestDiscussions.editNote( | ||
| projectId, | ||
| mrIid, | ||
| noteInfo.discussionId, | ||
| noteInfo.noteId, | ||
| { | ||
| body: prComment | ||
| } | ||
| ); | ||
| } | ||
| return api.MergeRequestDiscussions.create( | ||
| projectId, | ||
| mrIid, | ||
| prComment | ||
| ); | ||
| } | ||
| case "note": { | ||
| if (noteInfo) { | ||
| return api.MergeRequestNotes.edit( | ||
| projectId, | ||
| mrIid, | ||
| noteInfo.noteId, | ||
| { body: prComment } | ||
| ); | ||
| } | ||
| return api.MergeRequestNotes.create(projectId, mrIid, prComment); | ||
| } | ||
| default: { | ||
| throw new Error( | ||
| `Invalid comment type "${commentType}", should be "discussion" or "note"` | ||
| ); | ||
| } | ||
| } | ||
| } catch (err) { | ||
| if (err instanceof rest.GitbeakerRequestError && err.cause) { | ||
| const { description, request, response } = err.cause; | ||
| console.error(description); | ||
| try { | ||
| console.error("request:", await request.text()); | ||
| } catch { | ||
| console.error("The error's request could not be used as plain text"); | ||
| } | ||
| try { | ||
| console.error("response:", await response.text()); | ||
| } catch { | ||
| console.error("The error's response could not be used as plain text"); | ||
| } | ||
| } | ||
| throw err; | ||
| } | ||
| }; | ||
| const setupUser = async () => { | ||
| await exec.exec("git", [ | ||
| "config", | ||
| "user.name", | ||
| env.GITLAB_CI_USER_NAME || env.GITLAB_USER_NAME | ||
| ]); | ||
| await exec.exec("git", ["config", "user.email", env.GITLAB_CI_USER_EMAIL]); | ||
| }; | ||
| const push = async (branch, { force } = {}) => { | ||
| await exec.exec( | ||
| "git", | ||
| ["push", "origin", `HEAD:${branch}`, force && "--force"].filter(identify) | ||
| ); | ||
| }; | ||
| const pushTags = async () => { | ||
| await exec.exec("git", ["push", "origin", "--tags"]); | ||
| }; | ||
| const pushTag = async (tag) => { | ||
| await exec.exec("git", ["push", "origin", tag]); | ||
| }; | ||
| const switchToMaybeExistingBranch = async (branch) => { | ||
| const { stderr } = await execWithOutput("git", ["checkout", branch], { | ||
| ignoreReturnCode: true | ||
| }); | ||
| const isCreatingBranch = !stderr.includes(`Switched to branch '${branch}'`) && !stderr.includes(`Switched to a new branch '${branch}'`); | ||
| if (isCreatingBranch) { | ||
| await exec.exec("git", ["checkout", "-b", branch]); | ||
| } | ||
| }; | ||
| const reset = async (pathSpec, mode = "hard") => { | ||
| await exec.exec("git", ["reset", `--${mode}`, pathSpec]); | ||
| }; | ||
| const commitAll = async (message) => { | ||
| await exec.exec("git", ["add", "-A", "."]); | ||
| await exec.exec("git", ["commit", "-m", message]); | ||
| }; | ||
| const checkIfClean = async () => { | ||
| const { stdout } = await execWithOutput("git", ["status", "--porcelain"]); | ||
| return stdout.length === 0; | ||
| }; | ||
| async function readChangesetState(cwd = process.cwd()) { | ||
| const preState = await pre.readPreState(cwd); | ||
| const isInPreMode = preState !== void 0 && preState.mode === "pre"; | ||
| let changesets = await readChangesets(cwd); | ||
| if (isInPreMode) { | ||
| const changesetsToFilter = new Set(preState.changesets); | ||
| changesets = changesets.filter((x) => !changesetsToFilter.has(x.id)); | ||
| } | ||
| return { | ||
| preState: isInPreMode ? preState : void 0, | ||
| changesets | ||
| }; | ||
| } | ||
| const limit = pLimit(2 * 3); | ||
| const createRelease = async (api, { pkg, tagName }) => { | ||
| try { | ||
| const changelogFileName = path.join(pkg.dir, "CHANGELOG.md"); | ||
| const changelog = await fs$1.readFile(changelogFileName, "utf8"); | ||
| const changelogEntry = getChangelogEntry(changelog, pkg.packageJson.version); | ||
| if (!changelogEntry) { | ||
| throw new Error( | ||
| `Could not find changelog entry for ${pkg.packageJson.name}@${pkg.packageJson.version}` | ||
| ); | ||
| } | ||
| await api.ProjectReleases.create(projectId, { | ||
| name: tagName, | ||
| tag_name: tagName, | ||
| description: changelogEntry.content, | ||
| pre_release: pkg.packageJson.version.includes("-") | ||
| }); | ||
| } catch (err) { | ||
| if (err.code !== "ENOENT") { | ||
| throw err; | ||
| } | ||
| } | ||
| }; | ||
| async function runPublish({ | ||
| script, | ||
| gitlabToken, | ||
| createGitlabReleases = true, | ||
| cwd = process.cwd() | ||
| }) { | ||
| const api = createApi(gitlabToken); | ||
| const [publishCommand, ...publishArgs] = script.split(/\s+/); | ||
| const changesetPublishOutput = await execWithOutput( | ||
| publishCommand, | ||
| publishArgs, | ||
| { cwd } | ||
| ); | ||
| const { packages, tool } = await getPackages.getPackages(cwd); | ||
| const pushAllTags = packages.length <= GITLAB_MAX_TAGS || await api.FeatureFlags.show( | ||
| projectId, | ||
| "git_push_create_all_pipelines" | ||
| ).then(({ active }) => active).catch(() => false); | ||
| if (pushAllTags) { | ||
| await pushTags(); | ||
| } | ||
| const releasedPackages = []; | ||
| if (tool.type === "root") { | ||
| if (packages.length !== 1) { | ||
| throw new Error( | ||
| `No package found.This is probably a bug in the action, please open an issue` | ||
| ); | ||
| } | ||
| const pkg = packages[0]; | ||
| const newTagRegex = /New tag:/; | ||
| for (const line of changesetPublishOutput.stdout.split("\n")) { | ||
| const match = newTagRegex.exec(line); | ||
| if (match) { | ||
| releasedPackages.push(pkg); | ||
| const tagName = `v${pkg.packageJson.version}`; | ||
| if (createGitlabReleases) { | ||
| await createRelease(api, { pkg, tagName }); | ||
| } | ||
| break; | ||
| } | ||
| } | ||
| } else { | ||
| const newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@(\S+)/; | ||
| const packagesByName = new Map(packages.map((x) => [x.packageJson.name, x])); | ||
| for (const line of changesetPublishOutput.stdout.split("\n")) { | ||
| const match = newTagRegex.exec(line); | ||
| if (match === null) { | ||
| continue; | ||
| } | ||
| const pkgName = match[1]; | ||
| const pkg = packagesByName.get(pkgName); | ||
| if (pkg === void 0) { | ||
| throw new Error( | ||
| `Package "${pkgName}" not found.This is probably a bug in the action, please open an issue` | ||
| ); | ||
| } | ||
| releasedPackages.push(pkg); | ||
| } | ||
| if (!pushAllTags) { | ||
| await Promise.all( | ||
| releasedPackages.map( | ||
| (pkg) => pushTag(`${pkg.packageJson.name}@${pkg.packageJson.version}`) | ||
| ) | ||
| ); | ||
| } | ||
| if (createGitlabReleases) { | ||
| await Promise.all( | ||
| releasedPackages.map( | ||
| (pkg) => limit( | ||
| () => createRelease(api, { | ||
| pkg, | ||
| tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}` | ||
| }) | ||
| ) | ||
| ) | ||
| ); | ||
| } | ||
| } | ||
| if (releasedPackages.length > 0) { | ||
| return { | ||
| published: true, | ||
| publishedPackages: releasedPackages.map((pkg) => ({ | ||
| name: pkg.packageJson.name, | ||
| version: pkg.packageJson.version | ||
| })) | ||
| }; | ||
| } | ||
| return { published: false }; | ||
| } | ||
| const requireChangesetsCliPkgJson = (cwd) => { | ||
| try { | ||
| return cjsRequire(resolveFrom(cwd, "@changesets/cli/package.json")); | ||
| } catch (err) { | ||
| if (err?.code === "MODULE_NOT_FOUND") { | ||
| throw new Error( | ||
| `Have you forgotten to install \`@changesets/cli\` in "${cwd}"?` | ||
| ); | ||
| } | ||
| throw err; | ||
| } | ||
| }; | ||
| async function runVersion({ | ||
| script, | ||
| gitlabToken, | ||
| cwd = process.cwd(), | ||
| mrTitle = "Version Packages", | ||
| mrTargetBranch = ref, | ||
| commitMessage = "Version Packages", | ||
| removeSourceBranch = false, | ||
| hasPublishScript = false | ||
| }) { | ||
| const currentBranch = ref; | ||
| const versionBranch = `changeset-release/${currentBranch}`; | ||
| const api = createApi(gitlabToken); | ||
| const { preState } = await readChangesetState(cwd); | ||
| await switchToMaybeExistingBranch(versionBranch); | ||
| await exec.exec("git", ["fetch", "origin", currentBranch]); | ||
| await reset(`origin/${currentBranch}`); | ||
| const labels = getOptionalInput("labels")?.split(",").map((x) => x.trim()); | ||
| const versionsByDirectory = await getVersionsByDirectory(cwd); | ||
| if (script) { | ||
| const [versionCommand, ...versionArgs] = script.split(/\s+/); | ||
| await exec.exec(versionCommand, versionArgs, { cwd }); | ||
| } else { | ||
| const changesetsCliPkgJson = requireChangesetsCliPkgJson(cwd); | ||
| const cmd = semver__namespace.lt(changesetsCliPkgJson.version, "2.0.0") ? "bump" : "version"; | ||
| await exec.exec("node", [resolveFrom(cwd, "@changesets/cli/bin.js"), cmd], { | ||
| cwd | ||
| }); | ||
| } | ||
| const changedPackages = await getChangedPackages$1(cwd, versionsByDirectory); | ||
| const mrBodyPromise = (async () => `This MR was opened by the [changesets-gitlab](https://github.com/un-ts/changesets-gitlab) GitLab CI script. When you're ready to do a release, you can merge this and ${hasPublishScript ? "the packages will be published to npm automatically" : "publish to npm yourself or [setup this action to publish automatically](https://github.com/un-ts/changesets-gitlab#with-publishing)"}. If you're not ready to do a release yet, that's fine, whenever you add more changesets to ${currentBranch}, this MR will be updated. | ||
| ${preState ? ` | ||
| \u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F | ||
| \`${currentBranch}\` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run \`changeset pre exit\` on \`${currentBranch}\`. | ||
| \u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F\u26A0\uFE0F | ||
| ` : ""} | ||
| # Releases | ||
| ` + (await Promise.all( | ||
| changedPackages.map(async (pkg) => { | ||
| const changelogContents = await fs$1.readFile( | ||
| path.join(pkg.dir, "CHANGELOG.md"), | ||
| "utf8" | ||
| ); | ||
| const entry = getChangelogEntry( | ||
| changelogContents, | ||
| pkg.packageJson.version | ||
| ); | ||
| return { | ||
| highestLevel: entry.highestLevel, | ||
| private: !!pkg.packageJson.private, | ||
| content: `## ${pkg.packageJson.name}@${pkg.packageJson.version} | ||
| ` + entry.content | ||
| }; | ||
| }) | ||
| )).filter(Boolean).sort(sortTheThings).map((x) => x.content).join("\n "))(); | ||
| const finalMrTitle = `${mrTitle}${preState ? ` (${preState.tag})` : ""}`; | ||
| if (!await checkIfClean()) { | ||
| const finalCommitMessage = `${commitMessage}${preState ? ` (${preState.tag})` : ""}`; | ||
| await commitAll(finalCommitMessage); | ||
| } | ||
| await push(versionBranch, { force: true }); | ||
| const searchResult = await api.MergeRequests.all({ | ||
| projectId: projectId, | ||
| state: "opened", | ||
| sourceBranch: versionBranch, | ||
| target_branch: mrTargetBranch, | ||
| maxPages: 1, | ||
| perPage: 1 | ||
| }); | ||
| console.log(JSON.stringify(searchResult, null, 2)); | ||
| if (searchResult.length === 0) { | ||
| console.log( | ||
| `creating merge request from ${versionBranch} to ${mrTargetBranch}.` | ||
| ); | ||
| await api.MergeRequests.create( | ||
| projectId, | ||
| versionBranch, | ||
| mrTargetBranch, | ||
| finalMrTitle, | ||
| { | ||
| description: await mrBodyPromise, | ||
| removeSourceBranch, | ||
| labels | ||
| } | ||
| ); | ||
| } else { | ||
| console.log(`updating found merge request !${searchResult[0].iid}`); | ||
| await api.MergeRequests.edit(projectId, searchResult[0].iid, { | ||
| title: finalMrTitle, | ||
| description: await mrBodyPromise, | ||
| removeSourceBranch, | ||
| labels | ||
| }); | ||
| } | ||
| } | ||
| const main = async ({ | ||
| published, | ||
| onlyChangesets | ||
| } = {}) => { | ||
| const { GITLAB_TOKEN, NPM_TOKEN } = env; | ||
| core.setOutput("published", false); | ||
| core.setOutput("publishedPackages", []); | ||
| if (env.CI) { | ||
| console.log("setting git user"); | ||
| await setupUser(); | ||
| const url = new node_url.URL(env.GITLAB_HOST); | ||
| console.log("setting GitLab credentials"); | ||
| const username = await getUsername(createApi()); | ||
| await exec.exec( | ||
| "git", | ||
| [ | ||
| "remote", | ||
| "set-url", | ||
| "origin", | ||
| `${url.protocol}//${encodeURIComponent(username)}:${GITLAB_TOKEN}@${url.host}${url.pathname.replace(/\/$/, "")}/${env.CI_PROJECT_PATH}.git` | ||
| ], | ||
| { silent: !TRUTHY_VALUES.has(env.DEBUG_GITLAB_CREDENTIAL) } | ||
| ); | ||
| } | ||
| const { changesets } = await readChangesetState(); | ||
| const publishScript = core.getInput("publish"); | ||
| const hasChangesets = changesets.length > 0; | ||
| const hasPublishScript = !!publishScript; | ||
| switch (true) { | ||
| case (!hasChangesets && !hasPublishScript): { | ||
| console.log("No changesets found"); | ||
| return; | ||
| } | ||
| case (!hasChangesets && hasPublishScript): { | ||
| console.log( | ||
| "No changesets found, attempting to publish any unpublished packages to npm" | ||
| ); | ||
| const npmrcPath = `${env.HOME}/.npmrc`; | ||
| if (fs.existsSync(npmrcPath)) { | ||
| console.log("Found existing .npmrc file"); | ||
| } else if (NPM_TOKEN) { | ||
| console.log("No .npmrc file found, creating one"); | ||
| await fs.promises.writeFile( | ||
| npmrcPath, | ||
| `//registry.npmjs.org/:_authToken=${NPM_TOKEN}` | ||
| ); | ||
| } else { | ||
| core.setFailed( | ||
| "No `.npmrc` found nor `NPM_TOKEN` provided, unable to publish packages" | ||
| ); | ||
| return; | ||
| } | ||
| const result = await runPublish({ | ||
| script: publishScript, | ||
| gitlabToken: GITLAB_TOKEN, | ||
| createGitlabReleases: !FALSY_VALUES.has( | ||
| core.getInput("create_gitlab_releases") | ||
| ) | ||
| }); | ||
| if (result.published) { | ||
| core.setOutput("published", true); | ||
| core.setOutput("publishedPackages", result.publishedPackages); | ||
| core.exportVariable("PUBLISHED", true); | ||
| core.exportVariable("PUBLISHED_PACKAGES", result.publishedPackages); | ||
| if (published) { | ||
| execSync(published); | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| case hasChangesets: { | ||
| await runVersion({ | ||
| script: getOptionalInput("version"), | ||
| gitlabToken: GITLAB_TOKEN, | ||
| mrTitle: getOptionalInput("title"), | ||
| mrTargetBranch: getOptionalInput("target_branch"), | ||
| commitMessage: getOptionalInput("commit"), | ||
| removeSourceBranch: core.getInput("remove_source_branch") === "true", | ||
| hasPublishScript | ||
| }); | ||
| if (onlyChangesets) { | ||
| execSync(onlyChangesets); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| exports.comment = comment; | ||
| exports.createApi = createApi; | ||
| exports.createRelease = createRelease; | ||
| exports.env = env; | ||
| exports.main = main; | ||
| exports.projectId = projectId; | ||
| exports.ref = ref; | ||
| exports.runPublish = runPublish; | ||
| exports.runVersion = runVersion; |
| export * from './api.js'; | ||
| export * from './comment.js'; | ||
| export * from './context.js'; | ||
| export * from './env.js'; | ||
| export * from './main.js'; | ||
| export * from './read-changeset-state.js'; | ||
| export * from './run.js'; | ||
| export type * from './types.js'; | ||
| export type * from './utils.js'; |
| export * from './api.js'; | ||
| export * from './comment.js'; | ||
| export * from './context.js'; | ||
| export * from './env.js'; | ||
| export * from './main.js'; | ||
| export * from './read-changeset-state.js'; | ||
| export * from './run.js'; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,2BAA2B,CAAA;AACzC,cAAc,UAAU,CAAA"} |
| import type { MainCommandOptions } from './types.js'; | ||
| export declare const main: ({ published, onlyChangesets, }?: MainCommandOptions) => Promise<void>; |
+83
| import fs from 'node:fs'; | ||
| import { URL } from 'node:url'; | ||
| import { exportVariable, getInput, setFailed, setOutput } from '@actions/core'; | ||
| import { exec } from '@actions/exec'; | ||
| import { createApi } from "./api.js"; | ||
| import { env } from './env.js'; | ||
| import { setupUser } from './git-utils.js'; | ||
| import readChangesetState from './read-changeset-state.js'; | ||
| import { runPublish, runVersion } from './run.js'; | ||
| import { execSync, FALSY_VALUES, getOptionalInput, getUsername, TRUTHY_VALUES, } from './utils.js'; | ||
| export const main = async ({ published, onlyChangesets, } = {}) => { | ||
| const { GITLAB_TOKEN, NPM_TOKEN } = env; | ||
| setOutput('published', false); | ||
| setOutput('publishedPackages', []); | ||
| if (env.CI) { | ||
| console.log('setting git user'); | ||
| await setupUser(); | ||
| const url = new URL(env.GITLAB_HOST); | ||
| console.log('setting GitLab credentials'); | ||
| const username = await getUsername(createApi()); | ||
| await exec('git', [ | ||
| 'remote', | ||
| 'set-url', | ||
| 'origin', | ||
| `${url.protocol}//${encodeURIComponent(username)}:${GITLAB_TOKEN}@${url.host}${url.pathname.replace(/\/$/, '')}/${env.CI_PROJECT_PATH}.git`, | ||
| ], { silent: !TRUTHY_VALUES.has(env.DEBUG_GITLAB_CREDENTIAL) }); | ||
| } | ||
| const { changesets } = await readChangesetState(); | ||
| const publishScript = getInput('publish'); | ||
| const hasChangesets = changesets.length > 0; | ||
| const hasPublishScript = !!publishScript; | ||
| switch (true) { | ||
| case !hasChangesets && !hasPublishScript: { | ||
| console.log('No changesets found'); | ||
| return; | ||
| } | ||
| case !hasChangesets && hasPublishScript: { | ||
| console.log('No changesets found, attempting to publish any unpublished packages to npm'); | ||
| const npmrcPath = `${env.HOME}/.npmrc`; | ||
| if (fs.existsSync(npmrcPath)) { | ||
| console.log('Found existing .npmrc file'); | ||
| } | ||
| else if (NPM_TOKEN) { | ||
| console.log('No .npmrc file found, creating one'); | ||
| await fs.promises.writeFile(npmrcPath, `//registry.npmjs.org/:_authToken=${NPM_TOKEN}`); | ||
| } | ||
| else { | ||
| setFailed('No `.npmrc` found nor `NPM_TOKEN` provided, unable to publish packages'); | ||
| return; | ||
| } | ||
| const result = await runPublish({ | ||
| script: publishScript, | ||
| gitlabToken: GITLAB_TOKEN, | ||
| createGitlabReleases: !FALSY_VALUES.has(getInput('create_gitlab_releases')), | ||
| }); | ||
| if (result.published) { | ||
| setOutput('published', true); | ||
| setOutput('publishedPackages', result.publishedPackages); | ||
| exportVariable('PUBLISHED', true); | ||
| exportVariable('PUBLISHED_PACKAGES', result.publishedPackages); | ||
| if (published) { | ||
| execSync(published); | ||
| } | ||
| } | ||
| return; | ||
| } | ||
| case hasChangesets: { | ||
| await runVersion({ | ||
| script: getOptionalInput('version'), | ||
| gitlabToken: GITLAB_TOKEN, | ||
| mrTitle: getOptionalInput('title'), | ||
| mrTargetBranch: getOptionalInput('target_branch'), | ||
| commitMessage: getOptionalInput('commit'), | ||
| removeSourceBranch: getInput('remove_source_branch') === 'true', | ||
| hasPublishScript, | ||
| }); | ||
| if (onlyChangesets) { | ||
| execSync(onlyChangesets); | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| //# sourceMappingURL=main.js.map |
| {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"} |
| import type { NewChangeset, PreState } from '@changesets/types'; | ||
| export interface ChangesetState { | ||
| preState: PreState | undefined; | ||
| changesets: NewChangeset[]; | ||
| } | ||
| export default function readChangesetState(cwd?: string): Promise<ChangesetState>; |
| import { readPreState } from '@changesets/pre'; | ||
| import readChangesets from '@changesets/read'; | ||
| export default async function readChangesetState(cwd = process.cwd()) { | ||
| const preState = await readPreState(cwd); | ||
| const isInPreMode = preState !== undefined && preState.mode === 'pre'; | ||
| let changesets = await readChangesets(cwd); | ||
| if (isInPreMode) { | ||
| const changesetsToFilter = new Set(preState.changesets); | ||
| changesets = changesets.filter((x) => !changesetsToFilter.has(x.id)); | ||
| } | ||
| return { | ||
| preState: isInPreMode ? preState : undefined, | ||
| changesets, | ||
| }; | ||
| } | ||
| //# sourceMappingURL=read-changeset-state.js.map |
| {"version":3,"file":"read-changeset-state.js","sourceRoot":"","sources":["../src/read-changeset-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,cAAc,MAAM,kBAAkB,CAAA;AAQ7C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,kBAAkB,CAC9C,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAA;IACxC,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAA;IAErE,IAAI,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAA;IAE1C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACvD,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtE,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QAC5C,UAAU;KACX,CAAA;AACH,CAAC"} |
+34
| import type { Gitlab } from '@gitbeaker/core'; | ||
| import type { Package } from '@manypkg/get-packages'; | ||
| export declare const createRelease: (api: Gitlab, { pkg, tagName }: { | ||
| pkg: Package; | ||
| tagName: string; | ||
| }) => Promise<void>; | ||
| export interface PublishOptions { | ||
| script: string; | ||
| gitlabToken: string; | ||
| createGitlabReleases?: boolean; | ||
| cwd?: string; | ||
| } | ||
| export interface PublishedPackage { | ||
| name: string; | ||
| version: string; | ||
| } | ||
| export type PublishResult = { | ||
| published: false; | ||
| } | { | ||
| published: true; | ||
| publishedPackages: PublishedPackage[]; | ||
| }; | ||
| export declare function runPublish({ script, gitlabToken, createGitlabReleases, cwd, }: PublishOptions): Promise<PublishResult>; | ||
| export interface VersionOptions { | ||
| script?: string; | ||
| gitlabToken: string; | ||
| cwd?: string; | ||
| mrTitle?: string; | ||
| removeSourceBranch?: boolean; | ||
| mrTargetBranch?: string; | ||
| commitMessage?: string; | ||
| hasPublishScript?: boolean; | ||
| } | ||
| export declare function runVersion({ script, gitlabToken, cwd, mrTitle, mrTargetBranch, commitMessage, removeSourceBranch, hasPublishScript, }: VersionOptions): Promise<void>; |
+202
| import fs from 'node:fs/promises'; | ||
| import path from 'node:path'; | ||
| import { exec } from '@actions/exec'; | ||
| import { getPackages } from '@manypkg/get-packages'; | ||
| import pLimit from 'p-limit'; | ||
| import resolveFrom from 'resolve-from'; | ||
| import * as semver from 'semver'; | ||
| import { createApi } from "./api.js"; | ||
| import * as context from './context.js'; | ||
| import * as gitUtils from './git-utils.js'; | ||
| import readChangesetState from './read-changeset-state.js'; | ||
| import { cjsRequire, execWithOutput, GITLAB_MAX_TAGS, getChangedPackages, getChangelogEntry, getOptionalInput, getVersionsByDirectory, sortTheThings, } from './utils.js'; | ||
| const limit = pLimit(2 * 3); | ||
| export const createRelease = async (api, { pkg, tagName }) => { | ||
| try { | ||
| const changelogFileName = path.join(pkg.dir, 'CHANGELOG.md'); | ||
| const changelog = await fs.readFile(changelogFileName, 'utf8'); | ||
| const changelogEntry = getChangelogEntry(changelog, pkg.packageJson.version); | ||
| if (!changelogEntry) { | ||
| throw new Error(`Could not find changelog entry for ${pkg.packageJson.name}@${pkg.packageJson.version}`); | ||
| } | ||
| await api.ProjectReleases.create(context.projectId, { | ||
| name: tagName, | ||
| tag_name: tagName, | ||
| description: changelogEntry.content, | ||
| pre_release: pkg.packageJson.version.includes('-'), | ||
| }); | ||
| } | ||
| catch (err) { | ||
| if (err.code !== 'ENOENT') { | ||
| throw err; | ||
| } | ||
| } | ||
| }; | ||
| export async function runPublish({ script, gitlabToken, createGitlabReleases = true, cwd = process.cwd(), }) { | ||
| const api = createApi(gitlabToken); | ||
| const [publishCommand, ...publishArgs] = script.split(/\s+/); | ||
| const changesetPublishOutput = await execWithOutput(publishCommand, publishArgs, { cwd }); | ||
| const { packages, tool } = await getPackages(cwd); | ||
| const pushAllTags = packages.length <= GITLAB_MAX_TAGS | ||
| || (await api.FeatureFlags.show(context.projectId, 'git_push_create_all_pipelines') | ||
| .then(({ active }) => active) | ||
| .catch(() => false)); | ||
| if (pushAllTags) { | ||
| await gitUtils.pushTags(); | ||
| } | ||
| const releasedPackages = []; | ||
| if (tool.type === 'root') { | ||
| if (packages.length !== 1) { | ||
| throw new Error(`No package found.` | ||
| + 'This is probably a bug in the action, please open an issue'); | ||
| } | ||
| const pkg = packages[0]; | ||
| const newTagRegex = /New tag:/; | ||
| for (const line of changesetPublishOutput.stdout.split('\n')) { | ||
| const match = newTagRegex.exec(line); | ||
| if (match) { | ||
| releasedPackages.push(pkg); | ||
| const tagName = `v${pkg.packageJson.version}`; | ||
| if (createGitlabReleases) { | ||
| await createRelease(api, { pkg, tagName }); | ||
| } | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| else { | ||
| const newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@(\S+)/; | ||
| const packagesByName = new Map(packages.map((x) => [x.packageJson.name, x])); | ||
| for (const line of changesetPublishOutput.stdout.split('\n')) { | ||
| const match = newTagRegex.exec(line); | ||
| if (match === null) { | ||
| continue; | ||
| } | ||
| const pkgName = match[1]; | ||
| const pkg = packagesByName.get(pkgName); | ||
| if (pkg === undefined) { | ||
| throw new Error(`Package "${pkgName}" not found.` | ||
| + 'This is probably a bug in the action, please open an issue'); | ||
| } | ||
| releasedPackages.push(pkg); | ||
| } | ||
| if (!pushAllTags) { | ||
| await Promise.all(releasedPackages.map((pkg) => gitUtils.pushTag(`${pkg.packageJson.name}@${pkg.packageJson.version}`))); | ||
| } | ||
| if (createGitlabReleases) { | ||
| await Promise.all(releasedPackages.map((pkg) => limit(() => createRelease(api, { | ||
| pkg, | ||
| tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}`, | ||
| })))); | ||
| } | ||
| } | ||
| if (releasedPackages.length > 0) { | ||
| return { | ||
| published: true, | ||
| publishedPackages: releasedPackages.map((pkg) => ({ | ||
| name: pkg.packageJson.name, | ||
| version: pkg.packageJson.version, | ||
| })), | ||
| }; | ||
| } | ||
| return { published: false }; | ||
| } | ||
| const requireChangesetsCliPkgJson = (cwd) => { | ||
| try { | ||
| return cjsRequire(resolveFrom(cwd, '@changesets/cli/package.json')); | ||
| } | ||
| catch (err) { | ||
| if (err?.code === 'MODULE_NOT_FOUND') { | ||
| throw new Error(`Have you forgotten to install \`@changesets/cli\` in "${cwd}"?`); | ||
| } | ||
| throw err; | ||
| } | ||
| }; | ||
| export async function runVersion({ script, gitlabToken, cwd = process.cwd(), mrTitle = 'Version Packages', mrTargetBranch = context.ref, commitMessage = 'Version Packages', removeSourceBranch = false, hasPublishScript = false, }) { | ||
| const currentBranch = context.ref; | ||
| const versionBranch = `changeset-release/${currentBranch}`; | ||
| const api = createApi(gitlabToken); | ||
| const { preState } = await readChangesetState(cwd); | ||
| await gitUtils.switchToMaybeExistingBranch(versionBranch); | ||
| await exec('git', ['fetch', 'origin', currentBranch]); | ||
| await gitUtils.reset(`origin/${currentBranch}`); | ||
| const labels = getOptionalInput('labels') | ||
| ?.split(',') | ||
| .map((x) => x.trim()); | ||
| const versionsByDirectory = await getVersionsByDirectory(cwd); | ||
| if (script) { | ||
| const [versionCommand, ...versionArgs] = script.split(/\s+/); | ||
| await exec(versionCommand, versionArgs, { cwd }); | ||
| } | ||
| else { | ||
| const changesetsCliPkgJson = requireChangesetsCliPkgJson(cwd); | ||
| const cmd = semver.lt(changesetsCliPkgJson.version, '2.0.0') | ||
| ? 'bump' | ||
| : 'version'; | ||
| await exec('node', [resolveFrom(cwd, '@changesets/cli/bin.js'), cmd], { | ||
| cwd, | ||
| }); | ||
| } | ||
| const changedPackages = await getChangedPackages(cwd, versionsByDirectory); | ||
| const mrBodyPromise = (async () => `This MR was opened by the [changesets-gitlab](https://github.com/un-ts/changesets-gitlab) GitLab CI script. When you're ready to do a release, you can merge this and ${hasPublishScript | ||
| ? 'the packages will be published to npm automatically' | ||
| : 'publish to npm yourself or [setup this action to publish automatically](https://github.com/un-ts/changesets-gitlab#with-publishing)'}. If you're not ready to do a release yet, that's fine, whenever you add more changesets to ${currentBranch}, this MR will be updated. | ||
| ${preState | ||
| ? ` | ||
| ⚠️⚠️⚠️⚠️⚠️⚠️ | ||
| \`${currentBranch}\` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run \`changeset pre exit\` on \`${currentBranch}\`. | ||
| ⚠️⚠️⚠️⚠️⚠️⚠️ | ||
| ` | ||
| : ''} | ||
| # Releases | ||
| ` | ||
| + (await Promise.all(changedPackages.map(async (pkg) => { | ||
| const changelogContents = await fs.readFile(path.join(pkg.dir, 'CHANGELOG.md'), 'utf8'); | ||
| const entry = getChangelogEntry(changelogContents, pkg.packageJson.version); | ||
| return { | ||
| highestLevel: entry.highestLevel, | ||
| private: !!pkg.packageJson.private, | ||
| content: `## ${pkg.packageJson.name}@${pkg.packageJson.version}\n\n` | ||
| + entry.content, | ||
| }; | ||
| }))) | ||
| .filter(Boolean) | ||
| .sort(sortTheThings) | ||
| .map((x) => x.content) | ||
| .join('\n '))(); | ||
| const finalMrTitle = `${mrTitle}${preState ? ` (${preState.tag})` : ''}`; | ||
| if (!(await gitUtils.checkIfClean())) { | ||
| const finalCommitMessage = `${commitMessage}${preState ? ` (${preState.tag})` : ''}`; | ||
| await gitUtils.commitAll(finalCommitMessage); | ||
| } | ||
| await gitUtils.push(versionBranch, { force: true }); | ||
| const searchResult = await api.MergeRequests.all({ | ||
| projectId: context.projectId, | ||
| state: 'opened', | ||
| sourceBranch: versionBranch, | ||
| target_branch: mrTargetBranch, | ||
| maxPages: 1, | ||
| perPage: 1, | ||
| }); | ||
| console.log(JSON.stringify(searchResult, null, 2)); | ||
| if (searchResult.length === 0) { | ||
| console.log(`creating merge request from ${versionBranch} to ${mrTargetBranch}.`); | ||
| await api.MergeRequests.create(context.projectId, versionBranch, mrTargetBranch, finalMrTitle, { | ||
| description: await mrBodyPromise, | ||
| removeSourceBranch, | ||
| labels, | ||
| }); | ||
| } | ||
| else { | ||
| console.log(`updating found merge request !${searchResult[0].iid}`); | ||
| await api.MergeRequests.edit(context.projectId, searchResult[0].iid, { | ||
| title: finalMrTitle, | ||
| description: await mrBodyPromise, | ||
| removeSourceBranch, | ||
| labels, | ||
| }); | ||
| } | ||
| } | ||
| //# sourceMappingURL=run.js.map |
| {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"} |
| export interface MainCommandOptions { | ||
| published?: string; | ||
| onlyChangesets?: string; | ||
| } | ||
| export type LooseString<T extends string> = T | (string & {}); | ||
| export type Env = GitLabCIPredefinedVariables & MergeRequestVariables & { | ||
| GITLAB_HOST: string; | ||
| GITLAB_TOKEN: string; | ||
| GITLAB_TOKEN_TYPE: LooseString<'job' | 'oauth'>; | ||
| GITLAB_CI_USER_NAME?: string; | ||
| GITLAB_CI_USER_EMAIL: string; | ||
| GITLAB_COMMENT_TYPE: LooseString<'discussion' | 'note'>; | ||
| GITLAB_COMMENT_DISCUSSION_AUTO_RESOLVE?: LooseString<'1' | 'true'>; | ||
| GITLAB_ADD_CHANGESET_MESSAGE?: string; | ||
| DEBUG_GITLAB_CREDENTIAL?: LooseString<'1' | 'true'>; | ||
| GITLAB_COMMENT_CUSTOM_LINKS?: string; | ||
| HOME: string; | ||
| NPM_TOKEN?: string; | ||
| }; | ||
| type MergeRequestVariables = { | ||
| CI_MERGE_REQUEST_SOURCE_BRANCH_NAME: undefined; | ||
| } | { | ||
| CI_MERGE_REQUEST_IID: number; | ||
| CI_MERGE_REQUEST_PROJECT_URL: string; | ||
| CI_MERGE_REQUEST_SOURCE_BRANCH_NAME: string; | ||
| CI_MERGE_REQUEST_SOURCE_BRANCH_SHA: string; | ||
| CI_MERGE_REQUEST_TITLE: string; | ||
| }; | ||
| type GitLabCIPredefinedVariables = { | ||
| GITLAB_USER_NAME: string; | ||
| } & ({ | ||
| CI: undefined; | ||
| } | { | ||
| CI: 'true'; | ||
| CI_PROJECT_PATH: string; | ||
| CI_SERVER_URL: string; | ||
| }); | ||
| export {}; |
| export {}; | ||
| //# sourceMappingURL=types.js.map |
| {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""} |
| import type { Gitlab } from '@gitbeaker/core'; | ||
| import type { Package } from '@manypkg/get-packages'; | ||
| export declare const BumpLevels: { | ||
| readonly dep: 0; | ||
| readonly patch: 1; | ||
| readonly minor: 2; | ||
| readonly major: 3; | ||
| }; | ||
| export declare function getVersionsByDirectory(cwd: string): Promise<Map<string, string>>; | ||
| export declare function getChangedPackages(cwd: string, previousVersions: Map<string, string>): Promise<Package[]>; | ||
| export declare function getChangelogEntry(changelog: string, version: string): { | ||
| content: string; | ||
| highestLevel: number; | ||
| }; | ||
| export declare function execWithOutput(command: string, args?: string[], options?: { | ||
| ignoreReturnCode?: boolean; | ||
| cwd?: string; | ||
| }): Promise<{ | ||
| code: number; | ||
| stdout: string; | ||
| stderr: string; | ||
| }>; | ||
| export declare function sortTheThings(a: { | ||
| private: boolean; | ||
| highestLevel: number; | ||
| }, b: { | ||
| private: boolean; | ||
| highestLevel: number; | ||
| }): number; | ||
| export declare const identify: <T>(_: T) => _ is Exclude<T, "" | (T extends boolean ? false : boolean) | null | undefined>; | ||
| export declare function getAllFiles(dir: string, base?: string): Promise<string[]>; | ||
| export declare const execSync: (command: string) => NonSharedBuffer; | ||
| export declare const getOptionalInput: (name: string) => string | undefined; | ||
| export declare const getUsername: (api: Gitlab) => Promise<string>; | ||
| export declare const cjsRequire: NodeJS.Require; | ||
| export declare const FALSY_VALUES: Set<string>; | ||
| export declare const TRUTHY_VALUES: Set<string>; | ||
| export declare const GITLAB_MAX_TAGS = 4; | ||
| export declare const HTTP_STATUS_NOT_FOUND = 404; |
+120
| import { execSync as execSync_ } from 'node:child_process'; | ||
| import fs from 'node:fs'; | ||
| import { createRequire } from 'node:module'; | ||
| import path from 'node:path'; | ||
| import { getInput } from '@actions/core'; | ||
| import { exec } from '@actions/exec'; | ||
| import { getPackages } from '@manypkg/get-packages'; | ||
| import { toString as mdastToString } from 'mdast-util-to-string'; | ||
| import remarkParse from 'remark-parse'; | ||
| import remarkStringify from 'remark-stringify'; | ||
| import { unified } from 'unified'; | ||
| import { env } from './env.js'; | ||
| export const BumpLevels = { | ||
| dep: 0, | ||
| patch: 1, | ||
| minor: 2, | ||
| major: 3, | ||
| }; | ||
| export async function getVersionsByDirectory(cwd) { | ||
| const { packages } = await getPackages(cwd); | ||
| return new Map(packages.map((x) => [x.dir, x.packageJson.version])); | ||
| } | ||
| export async function getChangedPackages(cwd, previousVersions) { | ||
| const { packages } = await getPackages(cwd); | ||
| const changedPackages = new Set(); | ||
| for (const pkg of packages) { | ||
| const previousVersion = previousVersions.get(pkg.dir); | ||
| if (previousVersion !== pkg.packageJson.version) { | ||
| changedPackages.add(pkg); | ||
| } | ||
| } | ||
| return [...changedPackages]; | ||
| } | ||
| export function getChangelogEntry(changelog, version) { | ||
| const ast = unified().use(remarkParse).parse(changelog); | ||
| let highestLevel = BumpLevels.dep; | ||
| const nodes = ast.children; | ||
| let headingStartInfo; | ||
| let endIndex; | ||
| for (const [i, node] of nodes.entries()) { | ||
| if (node.type === 'heading') { | ||
| const stringified = mdastToString(node); | ||
| const match = /(major|minor|patch)/.exec(stringified.toLowerCase()); | ||
| if (match !== null) { | ||
| const level = BumpLevels[match[0]]; | ||
| highestLevel = Math.max(level, highestLevel); | ||
| } | ||
| if (headingStartInfo === undefined && stringified === version) { | ||
| headingStartInfo = { | ||
| index: i, | ||
| depth: node.depth, | ||
| }; | ||
| continue; | ||
| } | ||
| if (endIndex === undefined | ||
| && headingStartInfo !== undefined | ||
| && headingStartInfo.depth === node.depth) { | ||
| endIndex = i; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| if (headingStartInfo) { | ||
| ast.children = ast.children.slice(headingStartInfo.index + 1, endIndex); | ||
| } | ||
| return { | ||
| content: unified().use(remarkStringify).stringify(ast), | ||
| highestLevel, | ||
| }; | ||
| } | ||
| export async function execWithOutput(command, args, options) { | ||
| let myOutput = ''; | ||
| let myError = ''; | ||
| return { | ||
| code: await exec(command, args, { | ||
| listeners: { | ||
| stdout: (data) => { | ||
| myOutput += data.toString(); | ||
| }, | ||
| stderr: (data) => { | ||
| myError += data.toString(); | ||
| }, | ||
| }, | ||
| ...options, | ||
| }), | ||
| stdout: myOutput, | ||
| stderr: myError, | ||
| }; | ||
| } | ||
| export function sortTheThings(a, b) { | ||
| if (a.private === b.private) { | ||
| return b.highestLevel - a.highestLevel; | ||
| } | ||
| if (a.private) { | ||
| return 1; | ||
| } | ||
| return -1; | ||
| } | ||
| export const identify = (_) => !!_; | ||
| export async function getAllFiles(dir, base = dir) { | ||
| const direntList = await fs.promises.readdir(dir, { withFileTypes: true }); | ||
| const files = await Promise.all(direntList.map((dirent) => { | ||
| const res = path.resolve(dir, dirent.name); | ||
| return dirent.isDirectory() | ||
| ? getAllFiles(res, base) | ||
| : [path.relative(base, res)]; | ||
| })); | ||
| return files.flat(); | ||
| } | ||
| export const execSync = (command) => execSync_(command, { stdio: 'inherit' }); | ||
| export const getOptionalInput = (name) => getInput(name) || undefined; | ||
| export const getUsername = async (api) => { | ||
| return env.GITLAB_CI_USER_NAME ?? (await api.Users.showCurrentUser()).username; | ||
| }; | ||
| export const cjsRequire = typeof require === 'undefined' ? createRequire(import.meta.url) : require; | ||
| export const FALSY_VALUES = new Set(['false', '0']); | ||
| export const TRUTHY_VALUES = new Set(['true', '1']); | ||
| export const GITLAB_MAX_TAGS = 4; | ||
| export const HTTP_STATUS_NOT_FOUND = 404; | ||
| //# sourceMappingURL=utils.js.map |
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"} |
+1
-1
| { | ||
| "name": "@dvashim/changesets-gitlab", | ||
| "version": "0.0.2", | ||
| "version": "0.0.3", | ||
| "keywords": [ | ||
@@ -5,0 +5,0 @@ "@changesets/cli", |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 9 instances in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
120853
988.18%44
1000%1965
Infinity%25
Infinity%