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