diff --git a/README.md b/README.md
index 14ebb1555..4b65fccec 100644
--- a/README.md
+++ b/README.md
@@ -106,6 +106,27 @@ generator.getTemplateFile({
* Node.js v7.6+
+## Contributing
+
+Contributions are more than welcome. If you want to make a contribution, please make sure you go through the following steps:
+
+1. Pick or create an issue. It's always a good idea to leave a message saying that you're going to work on it before you start any actual work.
+2. Fork the repository and work there.
+3. Open a Pull Request pointing to `develop` branch.
+4. A maintainer will review and, eventually, merge your Pull Request. Please, be patient as most of us are doing this in our spare time.
+
+If you're a maintainer, take it from here:
+
+1. Merge Pull Request into `develop`.
+2. Make sure your local `develop` and `master` branches are up to date.
+3. Switch to `develop` branch.
+4. Whenever you think it makes sense, make a release:
+ 1. From develop branch, run: `git flow release start X.X.X`.
+ 2. In release branch, update version in `package.json` and `package-lock.json`.
+ 3. In release branch, run: `git flow release finish X.X.X`.
+ 4. You should now be in `develop` branch. Run: `git push --tags && git checkout master && git push`.
+5. Release to NPM should happen automatically. You can check status at https://travis-ci.org/asyncapi/asyncapi.
+
## Author
Fran Méndez ([@fmvilas](http://twitter.com/fmvilas))
diff --git a/lib/beautifier.js b/lib/beautifier.js
index 005e1dc55..13f3813bd 100644
--- a/lib/beautifier.js
+++ b/lib/beautifier.js
@@ -160,9 +160,11 @@ module.exports = (asyncapi) => {
beautifySchema(schema);
});
- const commonPrefix = sharedStart(Object.keys(asyncapi.topics));
- const levels = commonPrefix.split('.').length - 1;
- asyncapi.__commonPrefix = commonPrefix.split('.').slice(0, levels).join('.');
+ if (asyncapi.topics) {
+ const commonPrefix = sharedStart(Object.keys(asyncapi.topics));
+ const levels = commonPrefix.split('.').length - 1;
+ asyncapi.__commonPrefix = commonPrefix.split('.').slice(0, levels).join('.');
+ }
return asyncapi;
};
diff --git a/package-lock.json b/package-lock.json
index 7ca9a3d2a..e6279b6fc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "asyncapi-generator",
- "version": "0.5.1",
+ "version": "0.6.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -33,9 +33,9 @@
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
},
"asyncapi": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/asyncapi/-/asyncapi-2.0.2.tgz",
- "integrity": "sha512-iKgKWs2Ox+f9pFvnRjtnHOPXo5hU4GhkWK44Rw6lKYn/Um9eEx50VCayjCJBNT3cvzn7CSVFMZiioRAFwRGz4g=="
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/asyncapi/-/asyncapi-2.1.0.tgz",
+ "integrity": "sha512-k4x3yz8wIHYVnuM/mDfDCSy0IaDZfQkivvX6Du1npXX2vNpcc2DPYMcHMg/kRt7B+O7alpxeGfzy+2PEbsFApg=="
},
"balanced-match": {
"version": "1.0.0",
diff --git a/package.json b/package.json
index daf06248c..f529b59e6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "asyncapi-generator",
- "version": "0.5.1",
+ "version": "0.6.0",
"description": "The AsyncAPI generator. It can generate documentation, code, anything!",
"main": "./lib/generator.js",
"bin": {
@@ -27,7 +27,7 @@
},
"homepage": "https://github.com/asyncapi/generator",
"dependencies": {
- "asyncapi": "^2.0.2",
+ "asyncapi": "^2.1.0",
"commander": "^2.12.2",
"fs.extra": "^1.3.2",
"handlebars": "^4.0.6",
@@ -35,11 +35,11 @@
"json-schema-ref-parser": "^5.1.0",
"lodash": "^4.17.4",
"markdown-it": "^8.4.1",
+ "minimatch": "^3.0.4",
"mkdirp": "^0.5.1",
"openapi-sampler": "^1.0.0-beta.9",
"project-name-generator": "^2.1.5",
- "z-schema": "^3.18.2",
- "minimatch": "^3.0.4"
+ "z-schema": "^3.18.2"
},
"devDependencies": {}
}
diff --git a/templates/markdown/.partials/content.md b/templates/markdown/.partials/content.md
index fdf592440..3ea8bd5cf 100644
--- a/templates/markdown/.partials/content.md
+++ b/templates/markdown/.partials/content.md
@@ -2,7 +2,13 @@
{{> security}}
+{{#if asyncapi.topics}}
{{> topics }}
+{{/if}}
+
+{{#if asyncapi.events}}
+{{> events }}
+{{/if}}
{{> messages}}
diff --git a/templates/markdown/.partials/events.md b/templates/markdown/.partials/events.md
new file mode 100644
index 000000000..99541ed7a
--- /dev/null
+++ b/templates/markdown/.partials/events.md
@@ -0,0 +1,21 @@
+## Events
+
+### Events a client can receive:
+{{#each asyncapi.events.receive as |event index|}}
+{{#if event.x-title}}
+#### {{event.x-title}} {{#if event.deprecated}} (**deprecated**){{/if}}
+{{else}}
+#### Event #{{index}} {{#if event.deprecated}} (**deprecated**){{/if}}
+{{/if}}
+{{> message message=event hideTitle=true}}
+{{/each}}
+
+### Events a client can send:
+{{#each asyncapi.events.send as |event index|}}
+{{#if event.x-title}}
+#### {{event.x-title}} {{#if event.deprecated}} (**deprecated**){{/if}}
+{{else}}
+#### Event #{{index}} {{#if event.deprecated}} (**deprecated**){{/if}}
+{{/if}}
+{{> message message=event hideTitle=true}}
+{{/each}}
diff --git a/templates/markdown/.partials/message.md b/templates/markdown/.partials/message.md
index 732ccc4e9..dca23f5d7 100644
--- a/templates/markdown/.partials/message.md
+++ b/templates/markdown/.partials/message.md
@@ -1,4 +1,6 @@
-### {{messageName}} {{#if message.deprecated}} (**deprecated**){{/if}}
+{{#unless hideTitle}}
+### {{messageName}} {{#if message.deprecated}} (**deprecated**){{/if}}
+{{/unless}}
{{#if message.summary}}
{{{message.summary}}}
diff --git a/templates/markdown/asyncapi.md b/templates/markdown/asyncapi.md
index a419cef53..87117592a 100644
--- a/templates/markdown/asyncapi.md
+++ b/templates/markdown/asyncapi.md
@@ -19,6 +19,8 @@
{{/if}}
{{#if asyncapi.events}}
* [Events](#events)
+ - [Events a client can receive](#events-receive)
+ - [Events a client can send](#events-send)
{{/if}}
{{#if asyncapi.stream}}
* [Stream](#stream)
diff --git a/test/docs/slack-rtm.yml b/test/docs/slack-rtm.yml
new file mode 100644
index 000000000..4d6fc0ed4
--- /dev/null
+++ b/test/docs/slack-rtm.yml
@@ -0,0 +1,877 @@
+asyncapi: '1.2.0'
+info:
+ title: Slack Real Time Messaging API
+ version: '1.0.0'
+
+servers:
+ - url: https://slack.com/api/rtm.connect
+ scheme: https
+ schemeVersion: '1.1'
+
+security:
+ - token: []
+
+events:
+ receive:
+ - $ref: '#/components/messages/hello'
+ - $ref: '#/components/messages/connectionError'
+ - $ref: '#/components/messages/accountsChanged'
+ - $ref: '#/components/messages/botAdded'
+ - $ref: '#/components/messages/botChanged'
+ - $ref: '#/components/messages/channelArchive'
+ - $ref: '#/components/messages/channelCreated'
+ - $ref: '#/components/messages/channelDeleted'
+ - $ref: '#/components/messages/channelHistoryChanged'
+ - $ref: '#/components/messages/channelJoined'
+ - $ref: '#/components/messages/channelLeft'
+ - $ref: '#/components/messages/channelMarked'
+ - $ref: '#/components/messages/channelRename'
+ - $ref: '#/components/messages/channelUnarchive'
+ - $ref: '#/components/messages/commandsChanged'
+ - $ref: '#/components/messages/dndUpdated'
+ - $ref: '#/components/messages/dndUpdatedUser'
+ - $ref: '#/components/messages/emailDomainChanged'
+ - $ref: '#/components/messages/emojiRemoved'
+ - $ref: '#/components/messages/emojiAdded'
+ - $ref: '#/components/messages/fileChange'
+ - $ref: '#/components/messages/fileCommentAdded'
+ - $ref: '#/components/messages/fileCommentDeleted'
+ - $ref: '#/components/messages/fileCommentEdited'
+ - $ref: '#/components/messages/fileCreated'
+ - $ref: '#/components/messages/fileDeleted'
+ - $ref: '#/components/messages/filePublic'
+ - $ref: '#/components/messages/fileShared'
+ - $ref: '#/components/messages/fileUnshared'
+ - $ref: '#/components/messages/goodbye'
+ - $ref: '#/components/messages/groupArchive'
+ - $ref: '#/components/messages/groupClose'
+ - $ref: '#/components/messages/groupHistoryChanged'
+ - $ref: '#/components/messages/groupJoined'
+ - $ref: '#/components/messages/groupLeft'
+ - $ref: '#/components/messages/groupMarked'
+ - $ref: '#/components/messages/groupOpen'
+ - $ref: '#/components/messages/groupRename'
+ - $ref: '#/components/messages/groupUnarchive'
+ - $ref: '#/components/messages/imClose'
+ - $ref: '#/components/messages/imCreated'
+ - $ref: '#/components/messages/imMarked'
+ - $ref: '#/components/messages/imOpen'
+ - $ref: '#/components/messages/manualPresenceChange'
+ - $ref: '#/components/messages/memberJoinedChannel'
+ - $ref: '#/components/messages/message'
+ send:
+ - $ref: '#/components/messages/outgoingMessage'
+
+components:
+ securitySchemes:
+ token:
+ type: httpApiKey
+ name: token
+ in: query
+
+ schemas:
+ attachment:
+ type: object
+ properties:
+ fallback:
+ type: string
+ color:
+ type: string
+ pretext:
+ type: string
+ author_name:
+ type: string
+ author_link:
+ type: string
+ format: uri
+ author_icon:
+ type: string
+ format: uri
+ title:
+ type: string
+ title_link:
+ type: string
+ format: uri
+ text:
+ type: string
+ fields:
+ type: array
+ items:
+ type: object
+ properties:
+ title:
+ type: string
+ value:
+ type: string
+ short:
+ type: boolean
+ image_url:
+ type: string
+ format: uri
+ thumb_url:
+ type: string
+ format: uri
+ footer:
+ type: string
+ footer_icon:
+ type: string
+ format: uri
+ ts:
+ type: number
+
+ messages:
+ hello:
+ x-title: Hello
+ summary: First event received upon connection.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['hello']
+
+ connectionError:
+ summary: Event received when a connection error happens.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['error']
+ error:
+ type: object
+ properties:
+ code:
+ type: number
+ msg:
+ type: string
+
+ accountsChanged:
+ summary: The list of accounts a user is signed into has changed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['accounts_changed']
+
+ botAdded:
+ summary: A bot user was added.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['bot_added']
+ bot:
+ type: object
+ properties:
+ id:
+ type: string
+ app_id:
+ type: string
+ name:
+ type: string
+ icons:
+ type: object
+ additionalProperties:
+ type: string
+
+ botChanged:
+ summary: A bot user was changed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['bot_added']
+ bot:
+ type: object
+ properties:
+ id:
+ type: string
+ app_id:
+ type: string
+ name:
+ type: string
+ icons:
+ type: object
+ additionalProperties:
+ type: string
+
+ channelArchive:
+ summary: A channel was archived.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_archive']
+ channel:
+ type: string
+ user:
+ type: string
+
+ channelCreated:
+ summary: A channel was created.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_created']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+ creator:
+ type: string
+
+ channelDeleted:
+ summary: A channel was deleted.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_deleted']
+ channel:
+ type: string
+
+ channelHistoryChanged:
+ summary: Bulk updates were made to a channel's history.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_history_changed']
+ latest:
+ type: string
+ ts:
+ type: string
+ event_ts:
+ type: string
+
+ channelJoined:
+ summary: You joined a channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_joined']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+ creator:
+ type: string
+
+ channelLeft:
+ summary: You left a channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_left']
+ channel:
+ type: string
+
+ channelMarked:
+ summary: Your channel read marker was updated.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_marked']
+ channel:
+ type: string
+ ts:
+ type: string
+
+ channelRename:
+ summary: A channel was renamed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_rename']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+
+ channelUnarchive:
+ summary: A channel was unarchived.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['channel_unarchive']
+ channel:
+ type: string
+ user:
+ type: string
+
+ commandsChanged:
+ summary: A slash command has been added or changed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['commands_changed']
+ event_ts:
+ type: string
+
+ dndUpdated:
+ summary: Do not Disturb settings changed for the current user.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['dnd_updated']
+ user:
+ type: string
+ dnd_status:
+ type: object
+ properties:
+ dnd_enabled:
+ type: boolean
+ next_dnd_start_ts:
+ type: number
+ next_dnd_end_ts:
+ type: number
+ snooze_enabled:
+ type: boolean
+ snooze_endtime:
+ type: number
+
+ dndUpdatedUser:
+ summary: Do not Disturb settings changed for a member.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['dnd_updated_user']
+ user:
+ type: string
+ dnd_status:
+ type: object
+ properties:
+ dnd_enabled:
+ type: boolean
+ next_dnd_start_ts:
+ type: number
+ next_dnd_end_ts:
+ type: number
+
+ emailDomainChanged:
+ summary: The workspace email domain has changed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['email_domain_changed']
+ email_domain:
+ type: string
+ event_ts:
+ type: string
+
+ emojiRemoved:
+ summary: A custom emoji has been removed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['emoji_changed']
+ subtype:
+ type: string
+ enum: ['remove']
+ names:
+ type: array
+ items:
+ type: string
+ event_ts:
+ type: string
+
+ emojiAdded:
+ summary: A custom emoji has been added.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['emoji_changed']
+ subtype:
+ type: string
+ enum: ['add']
+ name:
+ type: string
+ value:
+ type: string
+ format: uri
+ event_ts:
+ type: string
+
+ fileChange:
+ summary: A file was changed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_change']
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileCommentAdded:
+ summary: A file comment was added.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_comment_added']
+ comment: {}
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileCommentDeleted:
+ summary: A file comment was deleted.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_comment_deleted']
+ comment:
+ type: string
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileCommentEdited:
+ summary: A file comment was edited.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_comment_edited']
+ comment: {}
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileCreated:
+ summary: A file was created.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_created']
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileDeleted:
+ summary: A file was deleted.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_deleted']
+ file_id:
+ type: string
+ event_ts:
+ type: string
+
+ filePublic:
+ summary: A file was made public.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_public']
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileShared:
+ summary: A file was shared.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_shared']
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ fileUnshared:
+ summary: A file was unshared.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['file_unshared']
+ file_id:
+ type: string
+ file:
+ type: object
+ properties:
+ id:
+ type: string
+
+ goodbye:
+ summary: The server intends to close the connection soon.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['goodbye']
+
+ groupArchive:
+ summary: A private channel was archived.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_archive']
+ channel:
+ type: string
+
+ groupClose:
+ summary: You closed a private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_close']
+ user:
+ type: string
+ channel:
+ type: string
+
+ groupHistoryChanged:
+ summary: Bulk updates were made to a private channel's history.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_history_changed']
+ latest:
+ type: string
+ ts:
+ type: string
+ event_ts:
+ type: string
+
+ groupJoined:
+ summary: You joined a private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_joined']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+ creator:
+ type: string
+
+ groupLeft:
+ summary: You left a private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_left']
+ channel:
+ type: string
+
+ groupMarked:
+ summary: A private channel read marker was updated.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_marked']
+ channel:
+ type: string
+ ts:
+ type: string
+
+ groupOpen:
+ summary: You opened a private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_open']
+ user:
+ type: string
+ channel:
+ type: string
+
+ groupRename:
+ summary: A private channel was renamed.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_rename']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+
+ groupUnarchive:
+ summary: A private channel was unarchived.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['group_unarchive']
+ channel:
+ type: string
+ user:
+ type: string
+
+ imClose:
+ summary: You closed a DM.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['im_close']
+ channel:
+ type: string
+ user:
+ type: string
+
+ imCreated:
+ summary: A DM was created.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['im_created']
+ channel:
+ type: object
+ properties:
+ id:
+ type: string
+ name:
+ type: string
+ created:
+ type: number
+ creator:
+ type: string
+ user:
+ type: string
+
+ imMarked:
+ summary: A direct message read marker was updated.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['im_marked']
+ channel:
+ type: string
+ ts:
+ type: string
+
+ imOpen:
+ summary: You opened a DM.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['im_open']
+ channel:
+ type: string
+ user:
+ type: string
+
+ manualPresenceChange:
+ summary: You manually updated your presence.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['manual_presence_change']
+ presence:
+ type: string
+
+ memberJoinedChannel:
+ summary: A user joined a public or private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['member_joined_channel']
+ user:
+ type: string
+ channel:
+ type: string
+ channel_type:
+ type: string
+ enum:
+ - C
+ - G
+ team:
+ type: string
+ inviter:
+ type: string
+
+ memberLeftChannel:
+ summary: A user left a public or private channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['member_left_channel']
+ user:
+ type: string
+ channel:
+ type: string
+ channel_type:
+ type: string
+ enum:
+ - C
+ - G
+ team:
+ type: string
+
+ message:
+ summary: A message was sent to a channel.
+ payload:
+ type: object
+ properties:
+ type:
+ type: string
+ enum: ['message']
+ user:
+ type: string
+ channel:
+ type: string
+ text:
+ type: string
+ ts:
+ type: string
+ attachments:
+ type: array
+ items:
+ $ref: '#/components/schemas/attachment'
+ edited:
+ type: object
+ properties:
+ user:
+ type: string
+ ts:
+ type: string
+
+ outgoingMessage:
+ summary: A message was sent to a channel.
+ payload:
+ type: object
+ properties:
+ id:
+ type: number
+ type:
+ type: string
+ enum: ['message']
+ channel:
+ type: string
+ text:
+ type: string