Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@dvashim/changesets-gitlab

Package Overview
Dependencies
Maintainers
1
Versions
8
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@dvashim/changesets-gitlab - npm Package Compare versions

Comparing version
0.0.2
to
0.0.3
+1
lib/api.d.ts
export declare const createApi: (gitlabToken?: string) => import("@gitbeaker/core").Gitlab<false>;
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';
#!/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>;
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;
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":"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"}
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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErD,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;IAClC,MAAM,IAAI,CAAC,KAAK,EAAE;QAChB,QAAQ;QACR,WAAW;QACX,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,gBAAgB;KAChD,CAAC,CAAA;IACF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAA;AACvE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IACjD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EACvB,MAAc,EACd,EAAE,KAAK,KAA0B,EAAE,EACnC,EAAE;IACF,MAAM,IAAI,CACR,KAAK,EACL,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,MAAM,EAAE,EAAE,KAAK,IAAI,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC1E,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IACjC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAA;AACjD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;IAC3C,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE;QACnE,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAA;IACF,MAAM,gBAAgB,GACpB,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,MAAM,GAAG,CAAC;WAC/C,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,MAAM,GAAG,CAAC,CAAA;IAC7D,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,EACxB,QAAgB,EAChB,OAAkC,MAAM,EACxC,EAAE;IACF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;IACjD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;IACrC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;AAC9C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAsB,EAAE;IACvD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAA;IACzE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAA;AAC5B,CAAC,CAAA"}
'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>;
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"}
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>;
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;
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",