diff --git a/index.js b/index.js new file mode 100644 index 0000000..baaacb5 --- /dev/null +++ b/index.js @@ -0,0 +1,8 @@ +var Cloudevent = require('./lib/cloudevent.js'); +//var Spec_0_1 = require('./lib/spec_0_1.js'); +//var Spec_0_2 = require('./lib/spec_0_2.js'); + +module.exports = Cloudevent; +//module.exports.Spec_0_1 = Spec_0_1; +//module.exports.Spec_0_2 = Spec_0_2; + diff --git a/lib/cloudevent.js b/lib/cloudevent.js new file mode 100644 index 0000000..318b5ac --- /dev/null +++ b/lib/cloudevent.js @@ -0,0 +1,34 @@ +var Spec_0_1 = require('./spec_0_1.js'); +var Spec_0_2 = require('./spec_0_2.js'); +var JSONFormatter = require('./jsonformatter.js'); + +function Cloudevent(_spec, _formatter){ + this.spec = (_spec) ? new _spec(Cloudevent) : new Spec_0_1(Cloudevent); + this.formatter = (_formatter) ? _formatter : new JSONFormatter(); +} + +Cloudevent.prototype.format = function(){ + return this.formatter.format(this.spec.payload); +} + +Cloudevent.prototype.toString = function(){ + return this.formatter.toString(this.spec.payload); +} + +Cloudevent.prototype.type = function(type){ + this.spec.type(type); + return this; +} + +Cloudevent.prototype.source = function(_source){ + this.spec.source(_source); + return this; +} + +Cloudevent.specs = { + '0.1': Spec_0_1, + '0.2': Spec_0_2 +}; + +module.exports = Cloudevent; + diff --git a/lib/jsonformatter.js b/lib/jsonformatter.js new file mode 100644 index 0000000..7f0ca46 --- /dev/null +++ b/lib/jsonformatter.js @@ -0,0 +1,14 @@ + +function JSONFormatter(){ + +} + +JSONFormatter.prototype.format = function(payload){ + return payload; +} + +JSONFormatter.prototype.toString = function(payload){ + return JSON.stringify(payload); +} + +module.exports = JSONFormatter; diff --git a/lib/spec_0_1.js b/lib/spec_0_1.js new file mode 100644 index 0000000..3b4e657 --- /dev/null +++ b/lib/spec_0_1.js @@ -0,0 +1,43 @@ +var uuid = require('uuid/v4'); + +function Spec_0_1(_caller){ + this.payload = { + cloudEventsVersion: '0.1', + eventID: uuid() + }; + + /* + * Used to inject backward compatibility functions or attributes. + */ + this.caller = _caller; + + /* + * Inject the method to set the version related to data attribute. + */ + this.caller.prototype.eventTypeVersion = function(_version){ + this.spec.eventTypeVersion(_version); + } +} + +Spec_0_1.prototype.type = function(_type){ + this.payload['eventType'] = _type; + return this; +} + +Spec_0_1.prototype.eventTypeVersion = function(version){ + this.payload['eventTypeVersion'] = version; + return this; +} + +Spec_0_1.prototype.source = function(_source){ + this.payload['source'] = _source; + return this; +} + +Spec_0_1.prototype.id = function(_id){ + this.payload['eventID'] = _id; + return this; +} + +module.exports = Spec_0_1; + diff --git a/lib/spec_0_2.js b/lib/spec_0_2.js new file mode 100644 index 0000000..de8fed8 --- /dev/null +++ b/lib/spec_0_2.js @@ -0,0 +1,26 @@ +var uuid = require('uuid/v4'); + +function Spec_0_2(){ + this.payload = { + specversion: '0.2', + id: uuid() + }; +} + +Spec_0_2.prototype.type = function(_type){ + this.payload['type'] = _type; + return this; +} + +Spec_0_2.prototype.source = function(_source){ + this.payload['source'] = _source; + return this; +} + +Spec_0_2.prototype.id = function(_id){ + this.payload['id'] = _id; + return this; +} + +module.exports = Spec_0_2; + diff --git a/package.json b/package.json index b6827ec..93c5621 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "CloudEvents SDK for JavaScript", "main": "index.js", "scripts": { - "test": "mocha test/test.js" + "test": "./node_modules/.bin/mocha -C test/*.js" }, "repository": { "type": "git", @@ -17,13 +17,20 @@ ], "author": "cloudevents.io", "contributors": { - "name" : "Fábio José de Moraes", - "email" : "fabiojose@gmail.com", - "url" : "https://github.com/fabiojose" + "name": "Fábio José de Moraes", + "email": "fabiojose@gmail.com", + "url": "https://github.com/fabiojose" }, "license": "Apache-2.0", "bugs": { "url": "https://github.com/cloudevents/sdk-javascript/issues" }, - "homepage": "https://github.com/cloudevents/sdk-javascript#readme" + "homepage": "https://github.com/cloudevents/sdk-javascript#readme", + "dependencies": { + "uuid": "3.3.2" + }, + "devDependencies": { + "chai": "4.2.0", + "mocha": "5.2.0" + } } diff --git a/test/cloudevent_spec_0_1.js b/test/cloudevent_spec_0_1.js new file mode 100644 index 0000000..b42d71d --- /dev/null +++ b/test/cloudevent_spec_0_1.js @@ -0,0 +1,32 @@ +var expect = require("chai").expect; +var Cloudevent = require("../index.js"); + +var cloudevent = new Cloudevent() + .type("com.github.pull.create") + .source("urn:event:from:myapi/resourse/123"); + +describe("CloudEvents Spec 0.1 - JavaScript SDK", () => { + + describe("JSON Format", () => { + + describe("Required context attributes", () => { + it("requires 'eventType'", () => { + expect(cloudevent.format()).to.have.property('eventType'); + }); + + it("requires 'cloudEventsVersion'", () => { + expect(cloudevent.format()).to.have.property('cloudEventsVersion'); + }); + + it("requires 'source'", () => { + expect(cloudevent.format()).to.have.property('source'); + }); + + it("requires 'eventID'", () => { + expect(cloudevent.format()).to.have.property('eventID'); + }); + }); + + }); + +}); diff --git a/test/cloudevent_spec_0_2.js b/test/cloudevent_spec_0_2.js new file mode 100644 index 0000000..a94faa1 --- /dev/null +++ b/test/cloudevent_spec_0_2.js @@ -0,0 +1,32 @@ +var expect = require("chai").expect; +var Cloudevent = require("../index.js"); + +var cloudevent = new Cloudevent(Cloudevent.specs['0.2']) + .type("com.github.pull.create") + .source("urn:event:from:myapi/resourse/123"); + +describe("CloudEvents Spec 0.2 - JavaScript SDK", () => { + + describe("JSON Format", () => { + + describe("Required context attributes", () => { + it("requires 'type'", () => { + expect(cloudevent.format()).to.have.property('type'); + }); + + it("requires 'specversion'", () => { + expect(cloudevent.format()).to.have.property('specversion'); + }); + + it("requires 'source'", () => { + expect(cloudevent.format()).to.have.property('source'); + }); + + it("requires 'id'", () => { + expect(cloudevent.format()).to.have.property('id'); + }); + }); + + }); + +});