diff --git a/Makefile b/Makefile
index f34805ada..c04c4128a 100644
--- a/Makefile
+++ b/Makefile
@@ -43,11 +43,15 @@ $(BUILDJS_TARGETS): $(BUILDJS_SOURCES) build.js
MODULE_TARGETS = \
- js/lib/id/actions.js
+ js/lib/id/actions.js \
+ js/lib/id/validations.js
js/lib/id/actions.js: modules/
node_modules/.bin/rollup -f umd -n iD.actions modules/actions/index.js --no-strict > $@
+js/lib/id/validations.js: modules/
+ node_modules/.bin/rollup -f umd -n iD.validations modules/validations/index.js --no-strict > $@
+
dist/iD.js: \
js/lib/bootstrap-tooltip.js \
js/lib/d3.v3.js \
@@ -226,11 +230,6 @@ dist/iD.js: \
js/id/presets/collection.js \
js/id/presets/field.js \
js/id/presets/preset.js \
- js/id/validations.js \
- js/id/validations/deprecated_tag.js \
- js/id/validations/many_deletions.js \
- js/id/validations/missing_tag.js \
- js/id/validations/tag_suggests_area.js \
js/id/end.js \
js/lib/locale.js \
data/introGraph.js
diff --git a/js/id/validations.js b/js/id/validations.js
deleted file mode 100644
index 4bfccb1e4..000000000
--- a/js/id/validations.js
+++ /dev/null
@@ -1 +0,0 @@
-iD.validations = {};
diff --git a/js/lib/id/actions.js b/js/lib/id/actions.js
index b1ae56512..8882a2386 100644
--- a/js/lib/id/actions.js
+++ b/js/lib/id/actions.js
@@ -8,7 +8,7 @@
return function(graph) {
return graph.replace(way);
};
- };
+ }
function AddMember(relationId, member, memberIndex) {
return function(graph) {
@@ -38,7 +38,7 @@
return graph.replace(relation.addMember(member, memberIndex));
};
- };
+ }
function AddMidpoint(midpoint, node) {
return function(graph) {
@@ -62,20 +62,20 @@
return graph;
};
- };
+ }
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
function AddVertex(wayId, nodeId, index) {
return function(graph) {
return graph.replace(graph.entity(wayId).addNode(nodeId, index));
};
- };
+ }
function ChangeMember(relationId, member, memberIndex) {
return function(graph) {
return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
};
- };
+ }
function ChangePreset(entityId, oldPreset, newPreset) {
return function(graph) {
@@ -88,14 +88,14 @@
return graph.replace(entity.update({tags: tags}));
};
- };
+ }
function ChangeTags(entityId, tags) {
return function(graph) {
var entity = graph.entity(entityId);
return graph.replace(entity.update({tags: tags}));
};
- };
+ }
function Circularize(wayId, projection, maxAngle) {
maxAngle = (maxAngle || 20) * Math.PI / 180;
@@ -279,7 +279,7 @@
};
return action;
- };
+ }
function DeleteMultiple(ids) {
var actions = {
@@ -307,7 +307,7 @@
};
return action;
- };
+ }
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
function DeleteRelation(relationId) {
@@ -398,7 +398,7 @@
};
return action;
- };
+ }
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
function DeleteNode(nodeId) {
@@ -433,7 +433,7 @@
};
return action;
- };
+ }
// Connect the ways at the given nodes.
//
@@ -476,7 +476,7 @@
return graph;
};
- };
+ }
function CopyEntities(ids, fromGraph) {
var copies = {};
@@ -498,7 +498,7 @@
};
return action;
- };
+ }
function DeleteMember(relationId, memberIndex) {
return function(graph) {
@@ -512,7 +512,7 @@
return graph;
};
- };
+ }
function DeprecateTags(entityId) {
return function(graph) {
@@ -1168,7 +1168,7 @@
};
return action;
- };
+ }
// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
@@ -1448,7 +1448,7 @@
};
return action;
- };
+ }
// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
diff --git a/js/lib/id/validations.js b/js/lib/id/validations.js
new file mode 100644
index 000000000..3aaf8c271
--- /dev/null
+++ b/js/lib/id/validations.js
@@ -0,0 +1,121 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (factory((global.iD = global.iD || {}, global.iD.validations = global.iD.validations || {})));
+}(this, function (exports) { 'use strict';
+
+ function DeprecatedTag() {
+
+ var validation = function(changes) {
+ var warnings = [];
+ for (var i = 0; i < changes.created.length; i++) {
+ var change = changes.created[i],
+ deprecatedTags = change.deprecatedTags();
+
+ if (!_.isEmpty(deprecatedTags)) {
+ var tags = iD.util.tagText({ tags: deprecatedTags });
+ warnings.push({
+ id: 'deprecated_tags',
+ message: t('validations.deprecated_tags', { tags: tags }),
+ entity: change
+ });
+ }
+ }
+ return warnings;
+ };
+
+ return validation;
+ }
+
+ function ManyDeletions() {
+ var threshold = 100;
+
+ var validation = function(changes) {
+ var warnings = [];
+ if (changes.deleted.length > threshold) {
+ warnings.push({
+ id: 'many_deletions',
+ message: t('validations.many_deletions', { n: changes.deleted.length })
+ });
+ }
+ return warnings;
+ };
+
+ return validation;
+ }
+
+ function MissingTag() {
+
+ // Slightly stricter check than Entity#isUsed (#3091)
+ function hasTags(entity, graph) {
+ return _.without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
+ graph.parentRelations(entity).length > 0;
+ }
+
+ var validation = function(changes, graph) {
+ var warnings = [];
+ for (var i = 0; i < changes.created.length; i++) {
+ var change = changes.created[i],
+ geometry = change.geometry(graph);
+
+ if ((geometry === 'point' || geometry === 'line' || geometry === 'area') && !hasTags(change, graph)) {
+ warnings.push({
+ id: 'missing_tag',
+ message: t('validations.untagged_' + geometry),
+ tooltip: t('validations.untagged_' + geometry + '_tooltip'),
+ entity: change
+ });
+ }
+ }
+ return warnings;
+ };
+
+ return validation;
+ }
+
+ function TagSuggestsArea() {
+
+ // https://github.com/openstreetmap/josm/blob/mirror/src/org/
+ // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
+ function tagSuggestsArea(tags) {
+ if (_.isEmpty(tags)) return false;
+
+ var presence = ['landuse', 'amenities', 'tourism', 'shop'];
+ for (var i = 0; i < presence.length; i++) {
+ if (tags[presence[i]] !== undefined) {
+ return presence[i] + '=' + tags[presence[i]];
+ }
+ }
+
+ if (tags.building && tags.building === 'yes') return 'building=yes';
+ }
+
+ var validation = function(changes, graph) {
+ var warnings = [];
+ for (var i = 0; i < changes.created.length; i++) {
+ var change = changes.created[i],
+ geometry = change.geometry(graph),
+ suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
+
+ if (suggestion) {
+ warnings.push({
+ id: 'tag_suggests_area',
+ message: t('validations.tag_suggests_area', { tag: suggestion }),
+ entity: change
+ });
+ }
+ }
+ return warnings;
+ };
+
+ return validation;
+ }
+
+ exports.DeprecatedTag = DeprecatedTag;
+ exports.ManyDeletions = ManyDeletions;
+ exports.MissingTag = MissingTag;
+ exports.TagSuggestsArea = TagSuggestsArea;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
\ No newline at end of file
diff --git a/js/id/validations/deprecated_tag.js b/modules/validations/deprecated_tag.js
similarity index 93%
rename from js/id/validations/deprecated_tag.js
rename to modules/validations/deprecated_tag.js
index d8b749445..d9ff27c45 100644
--- a/js/id/validations/deprecated_tag.js
+++ b/modules/validations/deprecated_tag.js
@@ -1,4 +1,4 @@
-iD.validations.DeprecatedTag = function() {
+export function DeprecatedTag() {
var validation = function(changes) {
var warnings = [];
@@ -19,4 +19,4 @@ iD.validations.DeprecatedTag = function() {
};
return validation;
-};
+}
diff --git a/modules/validations/index.js b/modules/validations/index.js
new file mode 100644
index 000000000..1e8966154
--- /dev/null
+++ b/modules/validations/index.js
@@ -0,0 +1,4 @@
+export { DeprecatedTag } from './deprecated_tag';
+export { ManyDeletions } from './many_deletions';
+export { MissingTag } from './missing_tag';
+export { TagSuggestsArea } from './tag_suggests_area';
diff --git a/js/id/validations/many_deletions.js b/modules/validations/many_deletions.js
similarity index 88%
rename from js/id/validations/many_deletions.js
rename to modules/validations/many_deletions.js
index 96a6ddb85..01b917e62 100644
--- a/js/id/validations/many_deletions.js
+++ b/modules/validations/many_deletions.js
@@ -1,4 +1,4 @@
-iD.validations.ManyDeletions = function() {
+export function ManyDeletions() {
var threshold = 100;
var validation = function(changes) {
@@ -13,4 +13,4 @@ iD.validations.ManyDeletions = function() {
};
return validation;
-};
+}
diff --git a/js/id/validations/missing_tag.js b/modules/validations/missing_tag.js
similarity index 95%
rename from js/id/validations/missing_tag.js
rename to modules/validations/missing_tag.js
index 9e3807c46..8477b63ff 100644
--- a/js/id/validations/missing_tag.js
+++ b/modules/validations/missing_tag.js
@@ -1,4 +1,4 @@
-iD.validations.MissingTag = function() {
+export function MissingTag() {
// Slightly stricter check than Entity#isUsed (#3091)
function hasTags(entity, graph) {
@@ -25,4 +25,4 @@ iD.validations.MissingTag = function() {
};
return validation;
-};
+}
diff --git a/js/id/validations/tag_suggests_area.js b/modules/validations/tag_suggests_area.js
similarity index 96%
rename from js/id/validations/tag_suggests_area.js
rename to modules/validations/tag_suggests_area.js
index 8c91a7d96..48d085d75 100644
--- a/js/id/validations/tag_suggests_area.js
+++ b/modules/validations/tag_suggests_area.js
@@ -1,4 +1,4 @@
-iD.validations.TagSuggestsArea = function() {
+export function TagSuggestsArea() {
// https://github.com/openstreetmap/josm/blob/mirror/src/org/
// openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
@@ -34,4 +34,4 @@ iD.validations.TagSuggestsArea = function() {
};
return validation;
-};
+}
diff --git a/test/index.html b/test/index.html
index f93b5e2b8..f293d4b18 100644
--- a/test/index.html
+++ b/test/index.html
@@ -42,6 +42,7 @@
+
@@ -193,12 +194,6 @@
-
-
-
-
-
-