autorel 2.4.3 → 2.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/autorel.js +14 -8
- package/dist/autorel.js.map +1 -1
- package/package.json +1 -1
package/dist/autorel.js
CHANGED
|
@@ -63,9 +63,11 @@ async function autorel(args) {
|
|
|
63
63
|
isDryRun && logger_1.default.info('Running in dry-run mode. No changes will be made.');
|
|
64
64
|
isPrerelease && logger_1.default.info(`Using prerelease channel: ${(0, colorette_1.bold)(prereleaseChannel)}`);
|
|
65
65
|
!isPrerelease && logger_1.default.info('This is a production release.');
|
|
66
|
-
!!args.useVersion && logger_1.default.info(`
|
|
66
|
+
!!args.useVersion && logger_1.default.info(`Will release specified version: ${(0, colorette_1.bold)(args.useVersion.replace('v', ''))}`);
|
|
67
|
+
logger_1.default.info('-> Fetching git tags...');
|
|
67
68
|
git.gitFetch();
|
|
68
69
|
const { highestTag, highestChannelTag, highestStableTag, tagFromWhichToFindCommits, } = (0, getTags_1.getTags)(prereleaseChannel);
|
|
70
|
+
logger_1.default.info(`-> Fetching git commits since ${tagFromWhichToFindCommits}...`);
|
|
69
71
|
const commits = git.getCommitsFromTag(tagFromWhichToFindCommits);
|
|
70
72
|
logger_1.default.info(`Found ${(0, colorette_1.bold)(commits.length.toString())} commit(s).`);
|
|
71
73
|
const parsedCommits = commits.map((commit) => convCom.parseConventionalCommit(commit.message, commit.hash))
|
|
@@ -93,14 +95,15 @@ async function autorel(args) {
|
|
|
93
95
|
prereleaseChannel,
|
|
94
96
|
latestChannelVer: highestChannelTag ? semver.fromTag(highestChannelTag) : undefined,
|
|
95
97
|
}));
|
|
96
|
-
const changelog = (0, changelog_1.generateChangelog)(parsedCommits, commitTypeMap, args.breakingChangeTitle);
|
|
97
98
|
logger_1.default.info(`The next version is: ${(0, colorette_1.bold)(nextTag)}`);
|
|
99
|
+
logger_1.default.info('-> Generating changelog...');
|
|
100
|
+
const changelog = (0, changelog_1.generateChangelog)(parsedCommits, commitTypeMap, args.breakingChangeTitle);
|
|
98
101
|
logger_1.default.debug(`The changelog is:\n${changelog}`);
|
|
99
102
|
if (args.dryRun)
|
|
100
103
|
return;
|
|
101
104
|
// User-defined scripts for things like running tests, building the project, etc.
|
|
102
105
|
if (args.preRun) {
|
|
103
|
-
logger_1.default.info('Running pre-release bash script...');
|
|
106
|
+
logger_1.default.info('-> Running pre-release bash script...');
|
|
104
107
|
(0, sh_1.bash)(args.preRun);
|
|
105
108
|
}
|
|
106
109
|
// The rest goes in a transaction so we can rollback if something goes wrong
|
|
@@ -112,6 +115,7 @@ async function autorel(args) {
|
|
|
112
115
|
});
|
|
113
116
|
// create GitHub release
|
|
114
117
|
if (!args.skipRelease) {
|
|
118
|
+
logger_1.default.info('-> Creating GitHub release...');
|
|
115
119
|
if (!args.githubToken)
|
|
116
120
|
throw new Error('GitHub token is required to publish a release. Please set the GITHUB_TOKEN environment variable or pass it as an argument.');
|
|
117
121
|
const { owner, repository } = git.getRepo();
|
|
@@ -125,7 +129,7 @@ async function autorel(args) {
|
|
|
125
129
|
prerelease: isPrerelease,
|
|
126
130
|
});
|
|
127
131
|
addToRollback(async () => {
|
|
128
|
-
logger_1.default.info('Rolling back GitHub release...');
|
|
132
|
+
logger_1.default.info('<- Rolling back GitHub release...');
|
|
129
133
|
await github.deleteReleaseById({
|
|
130
134
|
token: process.env.GITHUB_TOKEN,
|
|
131
135
|
owner,
|
|
@@ -136,15 +140,16 @@ async function autorel(args) {
|
|
|
136
140
|
}
|
|
137
141
|
// update package.json and publish to npm registry
|
|
138
142
|
if (args.publish) {
|
|
143
|
+
logger_1.default.info('-> Publishing to npm registry...');
|
|
139
144
|
const oldVersion = packageJson.read().version;
|
|
140
145
|
packageJson.setVersion(nextTag.replace('v', ''));
|
|
141
146
|
addToRollback(async () => {
|
|
142
|
-
logger_1.default.info('Rolling back package.json...');
|
|
147
|
+
logger_1.default.info('<- Rolling back package.json...');
|
|
143
148
|
packageJson.setVersion(oldVersion);
|
|
144
149
|
});
|
|
145
150
|
npm.publishPackage(prereleaseChannel);
|
|
146
151
|
addToRollback(async () => {
|
|
147
|
-
logger_1.default.info('Rolling back npm publish...');
|
|
152
|
+
logger_1.default.info('<- Rolling back npm publish...');
|
|
148
153
|
await npm.unpublishPackage(`${packageJson.read().name}@${nextTag}`);
|
|
149
154
|
});
|
|
150
155
|
}
|
|
@@ -153,15 +158,16 @@ async function autorel(args) {
|
|
|
153
158
|
process.env.NEXT_TAG = nextTag;
|
|
154
159
|
// run user-defined release scripts
|
|
155
160
|
if (args.run) {
|
|
156
|
-
logger_1.default.info('Running release bash script...');
|
|
161
|
+
logger_1.default.info('-> Running release bash script...');
|
|
157
162
|
(0, sh_1.bash)(args.run);
|
|
158
163
|
}
|
|
159
164
|
else if (args.runScript) {
|
|
160
165
|
// TODO: delete this block in the next major version
|
|
161
166
|
logger_1.default.warn('🚨 Warning: The "runScript" option is deprecated. Please use "run" instead. It will be removed in the next major version.');
|
|
162
|
-
logger_1.default.info('Running post-release bash script...');
|
|
167
|
+
logger_1.default.info('-> Running post-release bash script...');
|
|
163
168
|
(0, sh_1.bash)(args.runScript);
|
|
164
169
|
}
|
|
170
|
+
logger_1.default.info('🤘🎸 All done!');
|
|
165
171
|
}, onRollback, onRollbackError);
|
|
166
172
|
return nextTag.replace('v', '');
|
|
167
173
|
}
|
package/dist/autorel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autorel.js","sourceRoot":"","sources":["../src/autorel.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA2C;AAC3C,+DAAiD;AACjD,oDAAsC;AACtC,oDAAsC;AACtC,iDAAmC;AACnC,0DAA4C;AAC5C,oEAAsD;AACtD,2CAA8C;AAC9C,+DAAuC;AACvC,yCAA2E;AAC3E,iEAA4D;AAC5D,wBAAyC;AACzC,uCAAkC;AAClC,+CAA0C;AAC1C,sCAAmC;AACnC,yCAAkC;AAClC,mCAAiD;AAEjD,MAAM,UAAU,GAAG,CAAC,GAAU,EAAE,EAAE;IAE9B,gBAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAClE,gBAAM,CAAC,KAAK,CAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;AAE7D,CAAC,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,GAAU,EAAE,EAAE;IAEnC,gBAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACnD,gBAAM,CAAC,KAAK,CAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC;AAE7D,CAAC,CAAC;AAEK,KAAK,UAAU,OAAO,CAAC,IAAY;IAEtC,MAAM,CAAC,aAAa,CAAC,GAAG,IAAA,iBAAQ,EAAC,GAAG,EAAE,CAAC,IAAA,iBAAc,EAAC,IAAI,CAAC,CAAC,CAAC;IAE7D,IAAI,aAAa,YAAY,wBAAe,EAAE;QAE1C,MAAM,IAAI,KAAK,CAAC,2BAA2B,IAAA,mBAAO,EAAC,aAAa,CAAC,QAAQ,EAAE,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAC,CAAC,EAAE,CAAC,CAAC;KAE/G;IAED,MAAM,iBAAiB,GAAG,IAAA,2CAAoB,EAAC,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAC/B,MAAM,YAAY,GAAG,CAAC,CAAC,iBAAiB,CAAC;IAEzC,QAAQ,IAAI,gBAAM,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAC7E,YAAY,IAAI,gBAAM,CAAC,IAAI,CAAC,6BAA6B,IAAA,gBAAI,EAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC,YAAY,IAAI,gBAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC9D,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,gBAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"autorel.js","sourceRoot":"","sources":["../src/autorel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "autorel",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.5",
|
|
4
4
|
"description": "Automate semantic releases based on conventional commits. Similar to semantic-release but much simpler.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Marc H. Weiner <mhweiner234@gmail.com> (https://mhweiner.com)",
|