Skip to content

Commit

Permalink
fix: use uri-js to resovle uri's
Browse files Browse the repository at this point in the history
  • Loading branch information
Sondre Lefsaker committed Aug 6, 2017
1 parent 1452f30 commit cf8f9d3
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 11 deletions.
19 changes: 9 additions & 10 deletions lib/compile/resolve.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

var url = require('url')
var URI = require('uri-js')
, equal = require('fast-deep-equal')
, util = require('./util')
, SchemaObject = require('./schema_obj')
Expand Down Expand Up @@ -67,7 +67,7 @@ function resolve(compile, root, ref) {
*/
function resolveSchema(root, ref) {
/* jshint validthis: true */
var p = url.parse(ref, false, true)
var p = URI.parse(ref)
, refPath = _getFullPath(p)
, baseId = getFullPath(this._getId(root.schema));
if (refPath !== baseId) {
Expand Down Expand Up @@ -115,9 +115,9 @@ var PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum
/* @this Ajv */
function getJsonPointer(parsedRef, baseId, schema, root) {
/* jshint validthis: true */
parsedRef.hash = parsedRef.hash || '';
if (parsedRef.hash.slice(0,2) != '#/') return;
var parts = parsedRef.hash.split('/');
parsedRef.fragment = parsedRef.fragment || '';
if (parsedRef.fragment.slice(0,1) != '/') return;
var parts = parsedRef.fragment.split('/');

for (var i = 1; i < parts.length; i++) {
var part = parts[i];
Expand Down Expand Up @@ -206,14 +206,13 @@ function countKeys(schema) {

function getFullPath(id, normalize) {
if (normalize !== false) id = normalizeId(id);
var p = url.parse(id, false, true);
var p = URI.parse(id);
return _getFullPath(p);
}


function _getFullPath(p) {
var protocolSeparator = p.protocol || p.href.slice(0,2) == '//' ? '//' : '';
return (p.protocol||'') + protocolSeparator + (p.host||'') + (p.path||'') + '#';
return URI.serialize(p).split('#')[0] + '#';
}


Expand All @@ -225,7 +224,7 @@ function normalizeId(id) {

function resolveUrl(baseId, id) {
id = normalizeId(id);
return url.resolve(baseId, id);
return URI.resolve(baseId, id);
}


Expand All @@ -246,7 +245,7 @@ function resolveIds(schema) {
fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));

if (typeof id == 'string') {
id = baseId = normalizeId(baseId ? url.resolve(baseId, id) : id);
id = baseId = normalizeId(baseId ? URI.resolve(baseId, id) : id);

var refVal = self._refs[id];
if (typeof refVal == 'string') refVal = self._refs[refVal];
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@
"co": "^4.6.0",
"fast-deep-equal": "^1.0.0",
"json-schema-traverse": "^0.3.0",
"json-stable-stringify": "^1.0.1"
"json-stable-stringify": "^1.0.1",
"uri-js": "^3.0.2"
},
"devDependencies": {
"ajv-async": "^0.1.0",
Expand Down
29 changes: 29 additions & 0 deletions spec/resolve.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,35 @@ describe('resolve', function () {
});
});
});

it('should resolve ids defined as urn\'s (issue #423)', function() {
var schema = {
"type": "object",
"properties": {
"ip1": {
"id": "urn:some:ip:prop",
"type": "string",
"format": "ipv4"
},
"ip2": {
"$ref": "urn:some:ip:prop"
}
},
"required": [
"ip1",
"ip2"
]
};

var data = {
"ip1": "0.0.0.0",
"ip2": "0.0.0.0"
};
instances.forEach(function (ajv) {
var validate = ajv.compile(schema);
validate(data) .should.equal(true);
});
});
});


Expand Down

0 comments on commit cf8f9d3

Please sign in to comment.