UNPKG

3.47 kBJavaScriptView Raw
1/*
2 * chg
3 * https://github.com/heff/chg
4 *
5 * Copyright (c) 2014 heff
6 * Licensed under the Apache license.
7 */
8
9'use strict';
10
11var chg = module.exports = {};
12
13var fs = require('fs');
14var shell = require('shelljs');
15var moment = require('moment');
16
17var changeLogFile = 'CHANGELOG.md';
18var unreleasedTitle = '## HEAD (Unreleased)\n';
19var noItems = '_(none)_';
20var divider = '--------------------\n\n';
21
22var ERR_NO_CHANGELOG = changeLogFile+' does not exist. Change to the directory where it does exist, or run `init` to create one in the current directory.';
23
24function defCallback(){}
25
26function getChangeLog(){
27 if (!fs.existsSync(changeLogFile)) {
28 return null;
29 }
30 return fs.readFileSync(changeLogFile, 'utf8');
31}
32
33chg.init = function(options, callback){
34 options = options || {};
35 callback = callback || defCallback;
36
37 if (fs.existsSync(changeLogFile)){
38 return callback(changeLogFile + ' already exists');
39 }
40
41 var contents = 'CHANGELOG\n=========\n\n';
42 contents += unreleasedTitle + noItems + '\n\n' + divider;
43
44 fs.writeFileSync(changeLogFile, contents, 'utf8');
45
46 callback(null, changeLogFile+' created');
47};
48
49chg.delete = function(options, callback){
50 options = options || {};
51 callback = callback || defCallback;
52
53 if (fs.existsSync(changeLogFile)){
54 shell.rm(changeLogFile);
55 callback(null, changeLogFile+' deleted');
56 } else {
57 callback(changeLogFile+' does not exist');
58 }
59};
60
61chg.add = function(line, options, callback){
62 var contents, sections, top;
63
64 options = options || {};
65 callback = callback || defCallback;
66
67 // get existing contents
68 contents = getChangeLog();
69 if (!contents) {
70 return callback(ERR_NO_CHANGELOG);
71 }
72
73 // if 'noItems' is there, remove it
74 contents = contents.replace(unreleasedTitle + noItems + '\n', unreleasedTitle);
75
76 // split on the divider including preceding newline
77 sections = contents.split('\n'+divider);
78 // add new line to the unreleased section
79 top = sections[0] + '* ' + line + '\n\n';
80
81 // combine new contents and write file
82 contents = top + divider + sections[1];
83 fs.writeFileSync(changeLogFile, contents, 'utf8');
84
85 callback(null, 'Change added');
86};
87
88chg.release = function(version, options, callback){
89 var date, contents, changes, title;
90
91 callback = callback || defCallback;
92 options = options || {};
93 date = options.date || moment().format('YYYY-MM-DD');
94 version = version || options.version || null;
95
96 if (!version) {
97 return callback('Version number required');
98 }
99
100 // if (!version && fs.existsSync('package.json')) {
101 // version = JSON.parse(fs.readFileSync('package.json', 'utf8')).version;
102 // }
103
104 // get existing contents
105 contents = getChangeLog();
106 if (!contents) {
107 return callback(ERR_NO_CHANGELOG);
108 }
109
110 // get everything after the unreleased title
111 changes = contents.split(unreleasedTitle)[1];
112 // get only the unreleased changes
113 changes = changes.split('\n\n')[0];
114 // replace unreleased changes with noItems
115 contents = contents.replace(changes, noItems);
116
117 // build new release title
118 title = '##' + ' ' + version + ' ('+ date +')\n';
119 // add title at the top of the release section
120 contents = contents.replace(divider, divider + title + changes + '\n\n');
121
122 fs.writeFileSync(changeLogFile, contents, 'utf8');
123
124 callback(null, 'Changelog updated with new release');
125};
\No newline at end of file