UNPKG

12.6 kBMarkdownView Raw
1# [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Dependency Status][daviddm-image]][daviddm-url] [![Coverage Status][coverage-image]][coverage-url]
2
3> Write logs based on conventional commits and templates
4
5## Install
6
7```sh
8$ npm install --save conventional-changelog-writer
9```
10
11## Usage
12
13```js
14var conventionalChangelogWriter = require('conventional-changelog-writer');
15
16conventionalChangelogWriter(context, options);
17```
18
19It returns a transform stream.
20
21It expects an object mode upstream that looks something like this:
22
23```js
24{ hash: '9b1aff905b638aa274a5fc8f88662df446d374bd',
25 header: 'feat(scope): broadcast $destroy event on scope destruction',
26 type: 'feat',
27 scope: 'scope',
28 subject: 'broadcast $destroy event on scope destruction',
29 body: null,
30 footer: 'Closes #1',
31 notes: [],
32 references: [ { action: 'Closes', owner: null, repository: null, issue: '1', raw: '#1' } ] }
33{ hash: '13f31602f396bc269076ab4d389cfd8ca94b20ba',
34 header: 'feat(ng-list): Allow custom separator',
35 type: 'feat',
36 scope: 'ng-list',
37 subject: 'Allow custom separator',
38 body: 'bla bla bla',
39 footer: 'BREAKING CHANGE: some breaking change',
40 notes: [ { title: 'BREAKING CHANGE', text: 'some breaking change' } ],
41 references: [] }
42```
43
44Each chunk should be a commit. Json object is also **valid**. Parts of the objects will be formatted and combined into a log based on the handlebars context, templates and options.
45
46The downstream might look something like this:
47
48```js
49## 0.0.1 "this is a title" (2015-05-29)
50
51
52### Features
53
54* **ng-list:** Allow custom separator ([13f3160](https://github.com/a/b/commits/13f3160))
55* **scope:** broadcast $destroy event on scope destruction ([9b1aff9](https://github.com/a/b/commits/9b1aff9)), closes [#1](https://github.com/a/b/issues/1)
56
57
58### BREAKING CHANGES
59
60* some breaking change
61```
62
63
64## API
65
66### conventionalChangelogWriter([context, [options]])
67
68Returns a transform stream.
69
70### conventionalChangelogWriter.parseArray(commits, [context, [options]])
71
72Rather than returning a transform stream for parsing commits,
73parses the array of commits provided generating a CHANGELOG entry.
74
75#### context
76
77Variables that will be interpolated to the template. This object contains, but not limits to the following fields.
78
79##### version
80
81Type: `string`
82
83Version number of the up-coming release. If `version` is found in the last commit before generating logs, it will be overwritten.
84
85##### title
86
87Type: `string`
88
89##### isPatch
90
91Type: `boolean` Default: `semver.patch(context.version) !== 0`
92
93By default, this value is true if `version`'s patch is `0`.
94
95##### host
96
97Type: `string`
98
99The hosting website. Eg: `'https://github.com'` or `'https://bitbucket.org'`
100
101##### owner
102
103Type: `string`
104
105The owner of the repository. Eg: `'stevemao'`.
106
107##### repository
108
109Type: `string`
110
111The repository name on `host`. Eg: `'conventional-changelog-writer'`.
112
113##### repoUrl
114
115Type: `string`
116
117The whole repository url. Eg: `'https://github.com/conventional-changelog/conventional-changelog-writer'`.
118The should be used as a fallback when `context.repository` doesn't exist.
119
120##### linkReferences
121
122Type: `boolean` Default: `true` if (`context.repository` or `context.repoUrl`), `context.commit` and `context.issue` are truthy
123
124Should all references be linked?
125
126##### commit
127
128Type: `string` Default: `'commits'`
129
130Commit keyword in the url if `context.linkReferences === true`.
131
132##### issue
133
134Type: `string` Default: `'issues'`
135
136Issue or pull request keyword in the url if `context.linkReferences === true`.
137
138##### date
139
140Type: `string` Default: `dateFormat(new Date(), 'yyyy-mm-dd', true)`
141
142Default to formatted (`'yyyy-mm-dd'`) today's date. [dateformat](https://github.com/felixge/node-dateformat) is used for formatting the date. If `version` is found in the last commit, `committerDate` will overwrite this.
143
144#### options
145
146Type: `object`
147
148##### transform
149
150Type: `object` or `function` Default: get the first 7 digits of hash, and `committerDate` will be formatted as `'yyyy-mm-dd'`.
151
152Replace with new values in each commit.
153
154If this is an object, the keys are paths to a nested object property. the values can be a string (static) and a function (dynamic) with the old value and path passed as arguments. This value is merged with your own transform object.
155
156If this is a function, the commit chunk will be passed as the argument and the returned value would be the new commit object. This is a handy function if you can't provide a transform stream as an upstream of this one. If returns a falsy value this commit is ignored.
157
158a `raw` object that is originally poured form upstream is attached to `commit`.
159
160##### groupBy
161
162Type: `string` Default: `'type'`
163
164How to group the commits. EG: based on the same type. If this value is falsy, commits are not grouped.
165
166##### commitGroupsSort
167
168Type: `function`, `string` or `array`
169
170A compare function used to sort commit groups. If it's a string or array, it sorts on the property(ies) by `localeCompare`. Will not sort if this is a falsy value.
171
172##### commitsSort
173
174Type: `function`, `string` or `array` Default: `'header'`
175
176A compare function used to sort commits. If it's a string or array, it sorts on the property(ies) by `localeCompare`. Will not sort if this is a falsy value.
177
178##### noteGroupsSort
179
180Type: `function`, `string` or `array` Default: `'title'`
181
182A compare function used to sort note groups. If it's a string or array, it sorts on the property(ies) by `localeCompare`. Will not sort if this is a falsy value.
183
184##### notesSort
185
186Type: `function`, `string` or `array` Default: `'text'`
187
188A compare function used to sort note groups. If it's a string or array, it sorts on the property(ies) by `localeCompare`. Will not sort if this is a falsy value.
189
190##### generateOn
191
192Type: `function`, `string` or `any` Default: if `commit.version` is a valid semver.
193
194When the upstream finishes pouring the commits it will generate a block of logs if `doFlush` is `true`. However, you can generate more than one block based on this criteria (usually a version) even if there are still commits from the upstream.
195
196###### generateOn(commit, commits, context, options)
197
198####### commit
199
200Current commit.
201
202####### commits
203
204Current collected commits.
205
206####### context
207
208The generated context based on original input `context` and `options`.
209
210####### options
211
212Normalized options.
213
214**NOTE**: It checks on the transformed commit chunk instead of the original one (you can check on the original by access the `raw` object on the `commit`). However, if the transformed commit is ignored it falls back to the original commit.
215
216If this value is a `string`, it checks the existence of the field. Set to other type to disable it.
217
218##### finalizeContext
219
220Type: `function` Default: pass through
221
222Last chance to modify your context before generating a changelog.
223
224###### finalizeContext(context, options, commits, keyCommit)
225
226####### context
227
228The generated context based on original input `context` and `options`.
229
230####### options
231
232Normalized options.
233
234####### commits
235
236Filtered commits from your git metadata.
237
238####### keyCommit
239
240The commit that triggers to generate the log.
241
242##### debug
243
244Type: `function` Default: `function() {}`
245
246A function to get debug information.
247
248##### reverse
249
250Type: `boolean` Default: `false`
251
252The normal order means reverse chronological order. `reverse` order means chronological order. Are the commits from upstream in the reverse order? You should only worry about this when generating more than one blocks of logs based on `generateOn`. If you find the last commit is in the wrong block inverse this value.
253
254##### includeDetails
255
256Type: `boolean` Default: `false`
257
258If this value is `true`, instead of emitting strings of changelog, it emits objects containing the details the block.
259
260*NOTE:* The downstream must be in object mode if this is `true`.
261*NOTE:* This is only supported when using streaming mode.
262
263##### ignoreReverted
264
265Type: `boolean` Default: `true`
266
267If `true`, reverted commits will be ignored.
268
269##### doFlush
270
271Type: `boolean` Default: `true`
272
273If `true`, the stream will flush out the last bit of commits (could be empty) to changelog.
274
275*NOTE:* This is only supported when using streaming mode.
276
277##### mainTemplate
278
279Type: `string` Default: [template.hbs](templates/template.hbs)
280
281The main handlebars template.
282
283##### headerPartial
284
285Type: `string` Default: [header.hbs](templates/header.hbs)
286
287##### commitPartial
288
289Type: `string` Default: [commit.hbs](templates/commit.hbs)
290
291##### footerPartial
292
293Type: `string` Default: [footer.hbs](templates/footer.hbs)
294
295##### partials
296
297Type: `object`
298
299Partials that used in the main template, if any. The key should be the partial name and the value should be handlebars template strings. If you are using handlebars template files, read files by yourself.
300
301
302## Customization Guide
303
304It is possible to customize this the changelog to suit your needs. Templates are written in [handlebars](http://handlebarsjs.com). You can customize all partials or the whole template. Template variables are from either `upstream` or `context`. The following are a suggested way of defining variables.
305
306### upstream
307
308Variables in upstream are commit specific and should be used per commit. Eg: *commit date* and *commit username*. You can think of them as "local" or "isolate" variables. A "raw" commit message (original commit poured from upstream) is attached to `commit`. `transform` can be used to modify a commit.
309
310### context
311
312context should be module specific and can be used across the whole log. Thus these variables should not be related to any single commit and should be generic information of the module or all commits. Eg: *repository url* and *author names*, etc. You can think of them as "global" or "root" variables.
313
314Basically you can make your own templates and define all your template context. Extra context are based on commits from upstream and `options`. For more details, please checkout [handlebars](http://handlebarsjs.com) and the source code of this module. `finalizeContext` can be used at last to modify context before generating a changelog.
315
316
317## CLI
318
319```sh
320$ npm install --global conventional-changelog-writer
321$ conventional-changelog-writer --help # for more details
322```
323
324It works with [Line Delimited JSON](http://en.wikipedia.org/wiki/Line_Delimited_JSON).
325
326If you have commits.ldjson
327
328```js
329{"hash":"9b1aff905b638aa274a5fc8f88662df446d374bd","header":"feat(ngMessages): provide support for dynamic message resolution","type":"feat","scope":"ngMessages","subject":"provide support for dynamic message resolution","body":"Prior to this fix it was impossible to apply a binding to a the ngMessage directive to represent the name of the error.","footer":"BREAKING CHANGE: The `ngMessagesInclude` attribute is now its own directive and that must be placed as a **child** element within the element with the ngMessages directive.\nCloses #10036\nCloses #9338","notes":[{"title":"BREAKING CHANGE","text":"The `ngMessagesInclude` attribute is now its own directive and that must be placed as a **child** element within the element with the ngMessages directive."}],"references":[{"action":"Closes","owner",null,"repository":null,"issue":"10036","raw":"#10036"},{"action":"Closes","owner":null,"repository":null,"issue":"9338","raw":"#9338"}]}
330```
331
332And you run
333
334```sh
335$ conventional-changelog-writer commits.ldjson -o options.js
336```
337
338The output might look something like this
339
340```md
341# 1.0.0 (2015-04-09)
342
343
344### Features
345
346* **ngMessages:** provide support for dynamic message resolution 9b1aff9, closes #10036 #9338
347
348
349### BREAKING CHANGES
350
351* The `ngMessagesInclude` attribute is now its own directive and that must be placed as a **child** element within the element with the ngMessages directive.
352```
353
354It is printed to stdout.
355
356
357## License
358
359MIT © [Steve Mao](https://github.com/stevemao)
360
361
362[npm-image]: https://badge.fury.io/js/conventional-changelog-writer.svg
363[npm-url]: https://npmjs.org/package/conventional-changelog-writer
364[travis-image]: https://travis-ci.org/conventional-changelog/conventional-changelog-writer.svg?branch=master
365[travis-url]: https://travis-ci.org/conventional-changelog/conventional-changelog-writer
366[daviddm-image]: https://david-dm.org/conventional-changelog/conventional-changelog-writer.svg?theme=shields.io
367[daviddm-url]: https://david-dm.org/conventional-changelog/conventional-changelog-writer
368[coverage-image]: https://coveralls.io/repos/github/conventional-changelog/conventional-changelog/badge.svg?branch=master
369[coverage-url]: https://coveralls.io/github/conventional-changelog/conventional-changelog?branch=master