aboutsummaryrefslogtreecommitdiffstats
path: root/packages/monorepo-scripts/src/convert_changelogs.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/monorepo-scripts/src/convert_changelogs.ts')
-rw-r--r--packages/monorepo-scripts/src/convert_changelogs.ts99
1 files changed, 99 insertions, 0 deletions
diff --git a/packages/monorepo-scripts/src/convert_changelogs.ts b/packages/monorepo-scripts/src/convert_changelogs.ts
new file mode 100644
index 000000000..b5be14ed8
--- /dev/null
+++ b/packages/monorepo-scripts/src/convert_changelogs.ts
@@ -0,0 +1,99 @@
+#!/usr/bin/env node
+/**
+ * TEMPORARY SCRIPT
+ * This script exists to migrate the legacy CHANGELOG.md to the canonical CHANGELOG.md
+ * TODO: Remove after migration is successful and committed.
+ */
+
+import * as fs from 'fs';
+import lernaGetPackages = require('lerna-get-packages');
+import * as _ from 'lodash';
+import * as moment from 'moment';
+import * as path from 'path';
+import { exec as execAsync } from 'promisify-child-process';
+
+import { constants } from './constants';
+import { Changelog, Changes, UpdatedPackage } from './types';
+import { utils } from './utils';
+
+const HEADER_PRAGMA = '##';
+
+(async () => {
+ const allLernaPackages = lernaGetPackages(constants.monorepoRootPath);
+ const publicLernaPackages = _.filter(allLernaPackages, pkg => !pkg.package.private);
+ for (const lernaPackage of publicLernaPackages) {
+ const changelogMdIfExists = getChangelogMdIfExists(lernaPackage.package.name, lernaPackage.location);
+ if (_.isUndefined(changelogMdIfExists)) {
+ throw new Error(`${lernaPackage.package.name} should have CHANGELOG.md b/c it's public. Add one.`);
+ }
+
+ const lines = changelogMdIfExists.split('\n');
+ const changelogs: Changelog[] = [];
+ let changelog: Changelog = {
+ version: '',
+ changes: [],
+ };
+ /**
+ * Example MD entry:
+ * ## v0.3.1 - _March 18, 2018_
+ *
+ * * Add TS types for `yargs` (#400)
+ */
+ for (const line of lines) {
+ if (_.startsWith(line, `${HEADER_PRAGMA} `)) {
+ let version = line.substr(4).split(' - ')[0];
+ if (version === '0.x.x') {
+ version = utils.getNextPatchVersion(lernaPackage.package.version);
+ }
+ const dateStr = line.split('_')[1];
+ let date;
+ if (!_.includes(dateStr, 'TBD')) {
+ date = moment(dateStr, 'MMMM D, YYYY');
+ }
+ changelog = {
+ version,
+ changes: [],
+ };
+ if (!_.isUndefined(date)) {
+ changelog.timestamp = date.unix();
+ }
+ if (!_.includes(dateStr, 'TBD')) {
+ changelog.isPublished = true;
+ }
+ changelogs.push(changelog);
+ } else if (_.includes(line, '* ')) {
+ const note = line.split('* ')[1].split(' (#')[0];
+ const prChunk = line.split(' (#')[1];
+ let pr;
+ if (!_.isUndefined(prChunk)) {
+ pr = prChunk.split(')')[0];
+ }
+ const changes: Changes = {
+ note,
+ };
+ if (!_.isUndefined(pr)) {
+ changes.pr = _.parseInt(pr);
+ }
+ changelog.changes.push(changes);
+ }
+ }
+ const changelogJSON = JSON.stringify(changelogs, null, 4);
+ const changelogJSONPath = `${lernaPackage.location}/CHANGELOG.json`;
+ fs.writeFileSync(changelogJSONPath, changelogJSON);
+ await utils.prettifyAsync(changelogJSONPath, constants.monorepoRootPath);
+ }
+})().catch(err => {
+ utils.log(err.stdout);
+ process.exit(1);
+});
+
+function getChangelogMdIfExists(packageName: string, location: string): string | undefined {
+ const changelogPath = path.join(location, 'CHANGELOG.md');
+ let changelogMd: string;
+ try {
+ changelogMd = fs.readFileSync(changelogPath, 'utf-8');
+ return changelogMd;
+ } catch (err) {
+ return undefined;
+ }
+}