swagger-tools
Advanced tools
Comparing version 0.5.1 to 0.5.2
148
lib/specs.js
@@ -32,2 +32,4 @@ /* | ||
var jjve = require('jjve'); | ||
var expressStylePath = require('../middleware/helpers').expressStylePath; | ||
var pathToRegexp = require('path-to-regexp'); | ||
var validators = require('./validators'); | ||
@@ -464,2 +466,3 @@ | ||
var modelRefs = {}; | ||
var modelsById = {}; | ||
var addModelRef = function addModelRef (modelId, modelRef) { | ||
@@ -495,3 +498,2 @@ if (_.isUndefined(modelRefs[modelId])) { | ||
}; | ||
var modelsById = {}; | ||
@@ -527,3 +529,13 @@ // Build the authorization model | ||
var aPath = ['apis', index.toString()]; | ||
var pKeys = []; | ||
var pParams = []; | ||
var pRegex = pathToRegexp(expressStylePath('', api.path), pKeys).toString(); | ||
var rParams = _.map(pKeys, function (key) { return key.name; }); | ||
// Validate duplicate resource path | ||
if (seenApiPaths.indexOf(pRegex) > -1) { | ||
createErrorOrWarning('DUPLICATE_API_PATH', 'API path (or equivalent) already defined: ' + api.path, | ||
api.path, aPath.concat('path'), result.errors); | ||
} | ||
// Validate operations | ||
@@ -563,3 +575,3 @@ _.reduce(api.operations, function (seenMethods, operation, index) { | ||
// Validate parameters | ||
_.each(operation.parameters, function (parameter, index) { | ||
_.reduce(operation.parameters, function (seenParameters, parameter, index) { | ||
// Add model references from parameter type/items | ||
@@ -572,15 +584,36 @@ if (spec.primitives.indexOf(parameter.type) === -1) { | ||
if (_.isUndefined(parameter.defaultValue)) { | ||
return; | ||
// Validate duplicate parameter name | ||
validateNoExist(seenParameters, parameter.name, 'OPERATION_PARAMETER', 'Operation parameter', | ||
oPath.concat('parameters', index.toString(), 'name'), result.errors); | ||
// Keep track of path parameters | ||
if (parameter.paramType === 'path') { | ||
if (rParams.indexOf(parameter.name) === -1) { | ||
createErrorOrWarning('UNRESOLVABLE_API_PATH_PARAMETER', | ||
'API path parameter could not be resolved: ' + parameter.name, parameter.name, | ||
oPath.concat('parameters', index.toString(), 'name'), result.errors); | ||
} | ||
if (pParams.indexOf(parameter.name) === -1) { | ||
pParams.push(parameter.name); | ||
} | ||
} | ||
// Validate default value against constraints | ||
validateParameterConstraints(spec, parameter, parameter.defaultValue, | ||
oPath.concat('parameters', index.toString(), 'defaultValue'), | ||
result.errors); | ||
if (!_.isUndefined(parameter.defaultValue)) { | ||
// Validate default value against constraints | ||
validateParameterConstraints(spec, parameter, parameter.defaultValue, | ||
oPath.concat('parameters', index.toString(), 'defaultValue'), | ||
result.errors); | ||
} | ||
return seenParameters.concat(parameter.name); | ||
}, []); | ||
// Validate missing path parameters (in path but not in operation.parameters) | ||
_.each(_.difference(rParams, pParams), function (unused) { | ||
createErrorOrWarning('MISSING_API_PATH_PARAMETER', | ||
'API requires path parameter but it is not defined: ' + unused, api.path, | ||
aPath.concat('path'), result.errors); | ||
}); | ||
// Validate duplicate resource path | ||
validateNoExist(seenApiPaths, api.path, 'API_PATH', 'API path', aPath.concat('path'), result.errors); | ||
// Validate unique response code | ||
@@ -610,3 +643,3 @@ _.reduce(operation.responseMessages, function (seenResponseCodes, responseMessage, index) { | ||
return seenApiPaths.concat(api.path); | ||
return seenApiPaths.concat(pRegex); | ||
}, []); | ||
@@ -682,3 +715,3 @@ | ||
_.each(_.difference(scopes, apiAuthRefs[name] || []), function (scope, index) { | ||
_.each(_.difference(scopes, apiAuthRefs[name] || []), function (scope) { | ||
var sIndex = scopes.indexOf(scope); | ||
@@ -750,16 +783,15 @@ | ||
// Validate the Paths | ||
_.each(rlOrSO.paths, function (path, name) { | ||
_.reduce(rlOrSO.paths, function (seenPaths, path, name) { | ||
var aPath = ['paths', name]; | ||
var pKeys = []; | ||
var pParams = []; | ||
var pRegex = pathToRegexp(expressStylePath('', name), pKeys).toString(); | ||
var rParams = _.map(pKeys, function (key) { return key.name; }); | ||
// Validate parameter constraints | ||
_.each(path.parameters, function (parameter, index) { | ||
if (!_.isUndefined(parameter.schema)) { | ||
parameter = parameter.schema; | ||
// Validate duplicate resource path | ||
if (seenPaths.indexOf(pRegex) > -1) { | ||
createErrorOrWarning('DUPLICATE_API_PATH', 'API path (or equivalent) already defined: ' + name, | ||
name, aPath, response.errors); | ||
} | ||
validateParameterConstraints(spec, parameter, parameter.default, | ||
aPath.concat('parameters', index.toString(), 'schema', 'default'), | ||
response.errors); | ||
} | ||
}); | ||
// Validate the Operations | ||
@@ -770,2 +802,36 @@ _.each(path, function (operation, method) { | ||
if (method === 'parameters') { | ||
// Validate parameter constraints | ||
_.reduce(path.parameters, function (seenParameters, parameter, index) { | ||
// Validate duplicate parameter name | ||
validateNoExist(seenParameters, parameter.name, 'API_PARAMETER', 'API parameter', | ||
oPath.concat(index.toString(), 'name'), response.errors); | ||
// Keep track of path parameters | ||
if (parameter.in === 'path') { | ||
if (rParams.indexOf(parameter.name) === -1) { | ||
createErrorOrWarning('UNRESOLVABLE_API_PATH_PARAMETER', | ||
'API path parameter could not be resolved: ' + parameter.name, parameter.name, | ||
oPath.concat(index.toString(), 'name'), response.errors); | ||
} | ||
if (pParams.indexOf(parameter.name) === -1) { | ||
pParams.push(parameter.name); | ||
} | ||
} | ||
if (!_.isUndefined(parameter.schema)) { | ||
parameter = parameter.schema; | ||
if (_.isUndefined(parameter.default)) { | ||
return; | ||
} | ||
validateParameterConstraints(spec, parameter, parameter.default, | ||
oPath.concat('parameters', index.toString(), 'schema', 'default'), | ||
response.errors); | ||
} | ||
return seenParameters.concat(parameter.name); | ||
}, []); | ||
return; | ||
@@ -781,3 +847,20 @@ } | ||
// Validate parameter constraints | ||
_.each(path.parameters, function (parameter, index) { | ||
_.reduce(operation.parameters, function (seenParameters, parameter, index) { | ||
// Validate duplicate parameter name | ||
validateNoExist(seenParameters, parameter.name, 'OPERATION_PARAMETER', 'Operation parameter', | ||
oPath.concat('parameters', index.toString(), 'name'), response.errors); | ||
// Keep track of path parameters | ||
if (parameter.in === 'path') { | ||
if (rParams.indexOf(parameter.name) === -1) { | ||
createErrorOrWarning('UNRESOLVABLE_API_PATH_PARAMETER', | ||
'API path parameter could not be resolved: ' + parameter.name, parameter.name, | ||
oPath.concat('parameters', index.toString(), 'name'), response.errors); | ||
} | ||
if (pParams.indexOf(parameter.name) === -1) { | ||
pParams.push(parameter.name); | ||
} | ||
} | ||
if (!_.isUndefined(parameter.schema)) { | ||
@@ -794,8 +877,19 @@ parameter = parameter.schema; | ||
} | ||
}); | ||
return seenParameters.concat(parameter.name); | ||
}, []); | ||
}); | ||
// Validate missing path parameters (in path but not in operation.parameters) | ||
_.each(_.difference(rParams, pParams), function (unused) { | ||
createErrorOrWarning('MISSING_API_PATH_PARAMETER', | ||
'API requires path parameter but it is not defined: ' + unused, name, | ||
aPath, response.errors); | ||
}); | ||
// TODO: Validate the definitions | ||
// TODO: Validate definition references | ||
}); | ||
return seenPaths.concat(pRegex); | ||
}, []); | ||
} | ||
@@ -802,0 +896,0 @@ |
{ | ||
"name": "swagger-tools", | ||
"version": "0.5.1", | ||
"version": "0.5.2", | ||
"description": "Various tools for using and integrating with Swagger.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
130304
3142