diff --git a/modules/osm/changeset.js b/modules/osm/changeset.js
new file mode 100644
index 000000000..b2ed36f11
--- /dev/null
+++ b/modules/osm/changeset.js
@@ -0,0 +1,53 @@
+import _ from 'lodash';
+import { osmEntity } from './entity';
+import { geoExtent } from '../geo';
+
+
+export function osmChangeset() {
+ if (!(this instanceof osmChangeset)) {
+ return (new osmChangeset()).initialize(arguments);
+ } else if (arguments.length) {
+ this.initialize(arguments);
+ }
+}
+
+
+osmEntity.changeset = osmChangeset;
+
+osmChangeset.prototype = Object.create(osmEntity.prototype);
+
+_.extend(osmChangeset.prototype, {
+
+ type: 'changeset',
+
+
+ extent: function() {
+ return new geoExtent();
+ },
+
+
+ geometry: function() {
+ return 'changeset';
+ },
+
+
+ asJXON: function() {
+ return {
+ osm: {
+ changeset: {
+ tag: _.map(this.tags, function(value, key) {
+ return { '@k': key, '@v': value };
+ }),
+ '@version': 0.6,
+ '@generator': 'iD'
+ }
+ }
+ };
+ },
+
+
+ asGeoJSON: function() {
+ return {};
+ }
+
+});
diff --git a/modules/osm/entity.js b/modules/osm/entity.js
index 1c17c3731..652652155 100644
--- a/modules/osm/entity.js
+++ b/modules/osm/entity.js
@@ -26,7 +26,7 @@ osmEntity.id = function(type) {
osmEntity.id.next = {
- node: -1, way: -1, relation: -1
+ changeset: -1, node: -1, way: -1, relation: -1
};
@@ -41,7 +41,7 @@ osmEntity.id.toOSM = function(id) {
osmEntity.id.type = function(id) {
- return { 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
+ return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
};
diff --git a/modules/osm/index.js b/modules/osm/index.js
index 38bc88520..528f679ef 100644
--- a/modules/osm/index.js
+++ b/modules/osm/index.js
@@ -1,3 +1,4 @@
+export { osmChangeset } from './changeset';
export { osmEntity } from './entity';
export { osmNode } from './node';
export { osmRelation } from './relation';
diff --git a/test/index.html b/test/index.html
index f36f8fd68..ad42a95b7 100644
--- a/test/index.html
+++ b/test/index.html
@@ -81,6 +81,7 @@
+
diff --git a/test/spec/osm/changeset.js b/test/spec/osm/changeset.js
new file mode 100644
index 000000000..566704218
--- /dev/null
+++ b/test/spec/osm/changeset.js
@@ -0,0 +1,29 @@
+describe('iD.osmChangeset', function () {
+ it('returns a changeset', function () {
+ expect(iD.osmChangeset()).to.be.an.instanceOf(iD.osmChangeset);
+ expect(iD.osmChangeset().type).to.equal('changeset');
+ });
+
+ it('defaults tags to an empty object', function () {
+ expect(iD.osmChangeset().tags).to.eql({});
+ });
+
+ it('sets tags as specified', function () {
+ expect(iD.osmChangeset({tags: {foo: 'bar'}}).tags).to.eql({foo: 'bar'});
+ });
+
+ describe('#asJXON', function () {
+ it('converts a node to jxon', function() {
+ var node = iD.osmChangeset({tags: {'comment': 'hello'}});
+ expect(node.asJXON()).to.eql({
+ osm: {
+ changeset: {
+ tag: [{ '@k': 'comment', '@v': 'hello' }],
+ '@version': 0.6,
+ '@generator': 'iD'
+ }
+ }
+ });
+ });
+ });
+});