postman-collection
Advanced tools
Comparing version 3.0.4-beta.1 to 3.0.4
# Postman Collection SDK Changelog | ||
#### v3.0.4-beta,1 (November 9, 2017) | ||
#### Unreleased | ||
#### 3.0.4 | ||
* :tada: Get and set objects in variables with `json` variable type | ||
```js | ||
var variable = new Variable({ type: 'json' }); | ||
// set objects as values for `json types` | ||
variable.set({ version: 'v1' }); | ||
// get object values | ||
console.log(variable.get()); // { version: 'v1' } | ||
console.log(typeof variable.get()); // object | ||
``` | ||
* #502 Added support for system property in query parameters | ||
* #503 `request~toJSON` no longer converts `url` to string | ||
* Made sure all Script instances have an id | ||
* :bug: Fixed a bug where updating types in a variable removed value functions | ||
* :bug: `auth` is now included in `collection.toJSON` | ||
* :bug: Fixed a bug where `item.getAuth` would return an empty `RequestAuth`, instead of looking up in the parent | ||
* :bug: Fixed a bug where empty `auth` was created for `new {Request,ItemGroup,Collection}({auth: null})`. This affected the auth lookup in parents. | ||
@@ -7,0 +25,0 @@ #### v3.0.3 (November 8, 2017) |
@@ -18,3 +18,4 @@ var _ = require('../util').lodash, | ||
* @example <caption>Create a new CertificateList</caption> | ||
* var certificateList = new CertificateList({}, [ | ||
* var CertificateList = require('postman-collection').CertificateList, | ||
* certificateList = new CertificateList({}, [ | ||
* { | ||
@@ -32,3 +33,3 @@ * name: 'my certificate for example.com', | ||
* } | ||
* ]) | ||
* ]); | ||
*/ | ||
@@ -35,0 +36,0 @@ CertificateList = function (parent, list) { |
@@ -20,3 +20,3 @@ var _ = require('../util').lodash, | ||
* @property {{ src: (String) }} [key] Object with path on the file system for private key file, as src | ||
* @property {{ src: (String) }} [cert] Object with path on the file system fot certificate file, as src | ||
* @property {{ src: (String) }} [cert] Object with path on the file system for certificate file, as src | ||
* @property {String} [passphrase] The passphrase for the certificate key | ||
@@ -26,7 +26,7 @@ * | ||
* { | ||
* name: 'My certificate for example.com', | ||
* matches: ['https://example.com/*'], | ||
* key: { src: '/path/to/key' }, | ||
* cert: { src: '/User/path/to/certificate' }, | ||
* passphrase: 'iampassphrase' | ||
* "name": "My certificate for example.com", | ||
* "matches": ["https://example.com/*"], | ||
* "key": { "src": "/path/to/key" }, | ||
* "cert": { "src": "/User/path/to/certificate" }, | ||
* "passphrase": "iampassphrase" | ||
* } | ||
@@ -33,0 +33,0 @@ */ |
@@ -29,2 +29,6 @@ var _ = require('../util').lodash, | ||
* that are a *part of the collection*, as opposed to environments, which are separate entities. | ||
* @property {Object<RequestAuth~definition>=} [auth] Collection auth allows you to define an authentication, | ||
* that *applies to all items* in the collection. | ||
* @property {Array<Event~definition>=} [event] Postman allows you to configure scripts to run when specific events | ||
* occur. | ||
* @property {String|Version~definition=} [version] Version of the collection expressed in [semver](http://semver.org/) | ||
@@ -88,3 +92,3 @@ * format. | ||
* // log items at root level of the collection | ||
* console.log(inspect(myCollection)); | ||
* console.log(pretty(myCollection)); | ||
* | ||
@@ -103,3 +107,3 @@ * @example <caption>Create a blank collection and write to file</caption> | ||
* // log the collection to console to see its contents | ||
* fs.writeFileSync('myCollection.postman_collection', myCollection.toString()); | ||
* fs.writeFileSync('myCollection.postman_collection', JSON.stringify(myCollection, null, 2)); | ||
*/ | ||
@@ -193,13 +197,17 @@ Collection = function PostmanCollection (definition, environments) { | ||
toJSON: function () { | ||
return { | ||
info: { | ||
id: this.id, | ||
name: this.name, | ||
version: this.version, | ||
schema: SCHEMA_URL | ||
}, | ||
event: this.events ? this.events.toJSON() : undefined, | ||
variable: this.variables ? this.variables.toJSON() : undefined, | ||
item: this.items.toJSON() | ||
var json = ItemGroup.prototype.toJSON.apply(this); | ||
// move ids and stuff from root level to `info` object | ||
json.info = { | ||
id: this.id, | ||
name: this.name, | ||
version: this.version, | ||
schema: SCHEMA_URL | ||
}; | ||
delete json.id; | ||
delete json.name; | ||
delete json.version; | ||
return json; | ||
} | ||
@@ -206,0 +214,0 @@ }); |
@@ -32,3 +32,3 @@ var _ = require('../util').lodash, | ||
* @property {String=} [value] The value stored in the Cookie | ||
* @property {String=} [expires] Expires sets an expiry date for when a coo0kie gets deleted. It should either be a | ||
* @property {String=} [expires] Expires sets an expiry date for when a cookie gets deleted. It should either be a | ||
* date object or timestamp string of date. | ||
@@ -54,16 +54,18 @@ * @property {Number=} [maxAge] Max-age sets the time in seconds for when a cookie will be deleted. | ||
* | ||
* @example <caption>JSON definition of an example collection</caption> | ||
* @example <caption>JSON definition of an example cookie</caption> | ||
* { | ||
* key: 'my-cookie-name', | ||
* expires: '1464769543832', // UNIX timestamp, in *milliseconds* | ||
* maxAge: '300' // In seconds. In this case, the Cookie is valid for 5 minutes | ||
* domain: 'something.example.com', | ||
* path: '/', | ||
* secure: false, | ||
* httpOnly: true, | ||
* session: false, | ||
* value: 'my-cookie-value', | ||
* extensions: [{ | ||
* key: 'Priority', | ||
* value: 'HIGH' | ||
* "key": "my-cookie-name", | ||
* "expires": "1464769543832", | ||
* // UNIX timestamp, in *milliseconds* | ||
* "maxAge": "300", | ||
* // In seconds. In this case, the Cookie is valid for 5 minutes | ||
* "domain": "something.example.com", | ||
* "path": "/", | ||
* "secure": false, | ||
* "httpOnly": true, | ||
* "session": false, | ||
* "value": "my-cookie-value", | ||
* "extensions": [{ | ||
* "key": "Priority", | ||
* "value": "HIGH" | ||
* }] | ||
@@ -86,3 +88,3 @@ * } | ||
* expires: '1464769543832', // UNIX timestamp, in *milliseconds* | ||
* maxAge: '300' // In seconds. In this case, the Cookie is valid for 5 minutes | ||
* maxAge: '300', // In seconds. In this case, the Cookie is valid for 5 minutes | ||
* domain: 'something.example.com', | ||
@@ -89,0 +91,0 @@ * path: '/', |
@@ -17,3 +17,3 @@ var util = require('../util'), | ||
* | ||
* @example Create a header | ||
* @example <caption>Create a header</caption> | ||
* var Header = require('postman-collection').Header, | ||
@@ -52,3 +52,16 @@ * header = new Header({ | ||
* | ||
* assert headerString === Header.unparse(headers); | ||
* function assert(condition, message) { | ||
* if (!condition) { | ||
* message = message || "Assertion failed"; | ||
* if (typeof Error !== "undefined") { | ||
* throw new Error(message); | ||
* } | ||
* throw message; //fallback | ||
* } | ||
* else { | ||
* console.log("Assertion passed"); | ||
* } | ||
* } | ||
* | ||
* assert(headerString.trim() === Header.unparse(headers).trim()); | ||
*/ | ||
@@ -55,0 +68,0 @@ Header = function PostmanHeader (options, name) { |
@@ -38,3 +38,3 @@ var _ = require('../util').lodash, | ||
* "listen": "prerequest", | ||
* "script: { | ||
* "script": { | ||
* "type": "text/javascript", | ||
@@ -71,3 +71,3 @@ * "exec": "console.log(new Date())" | ||
* myCollection = new Collection(); // create an empty collection | ||
* myCollection.add(new ItemGroup({ // add a folder called "blank folder" | ||
* myCollection.items.add(new ItemGroup({ // add a folder called "blank folder" | ||
* "name": "This is a blank folder" | ||
@@ -134,3 +134,5 @@ * })); | ||
*/ | ||
auth: _.createDefined(definition, 'auth', RequestAuth), | ||
// auth is a special case, empty RequestAuth should not be created for falsy values | ||
// to allow inheritance from parent | ||
auth: definition && definition.auth ? new RequestAuth(definition.auth) : undefined, | ||
@@ -137,0 +139,0 @@ /** |
@@ -6,6 +6,20 @@ var _ = require('../util').lodash, | ||
Request = require('./request').Request, | ||
RequestAuth = require('./request-auth').RequestAuth, | ||
Response = require('./response').Response, | ||
Item; | ||
Item, | ||
/** | ||
* Extracts `auth` from an entity. Checks if `auth` is present and it is not falsy type. | ||
* | ||
* @private | ||
* | ||
* @param {Object} [entity] | ||
*/ | ||
extractAuth = function (entity) { | ||
var auth; | ||
return (entity && (auth = entity.auth) && RequestAuth.isValidType(auth.type)) ? auth : undefined; | ||
}; | ||
/** | ||
@@ -64,7 +78,7 @@ * The following defines the object (or JSON) structure that one can pass to the Item while creating a new Item | ||
* // add a request to "my-folder-1" that sends a GET request | ||
* myCollection.items.one("my-folder-1").add(new Item({ | ||
* myCollection.items.one("my-folder-1").items.add(new Item({ | ||
* "name": "Send a GET request", | ||
* "id": "my-get-request" | ||
* "id": "my-get-request", | ||
* "request": { | ||
* "url": 'https://postman-echo.com/get", | ||
* "url": "https://postman-echo.com/get", | ||
* "method": "GET" | ||
@@ -108,5 +122,5 @@ * } | ||
* "name": "Send a GET request", | ||
* "id": "my-get-request" | ||
* "id": "my-get-request", | ||
* "request": { | ||
* "url": 'https://postman-echo.com/get", | ||
* "url": "https://postman-echo.com/get", | ||
* "method": "GET" | ||
@@ -142,3 +156,3 @@ * } | ||
* | ||
* returns {RequestAuth} | ||
* @returns {RequestAuth} | ||
* | ||
@@ -148,3 +162,6 @@ * @note Since v3.0 release, this returns the entire auth RequestAuth, instead of just the parameters | ||
getAuth: function () { | ||
return this.request && this.request.auth || this.findInParents('auth'); | ||
var requestAuth; | ||
// find auth on request, if not found or empty auth, lookup in the parents | ||
return (requestAuth = extractAuth(this.request)) ? requestAuth : this.findInParents('auth', extractAuth); | ||
}, | ||
@@ -151,0 +168,0 @@ |
@@ -61,8 +61,12 @@ var _ = require('../util').lodash, | ||
* Tries to find the given property locally, and then proceeds to lookup in each parent, | ||
* going up the chain as necessary. | ||
* going up the chain as necessary. Lookup will continue until `customizer` returns a truthy value. If used | ||
* without a customizer, the lookup will stop at the first parent that contains the property. | ||
* | ||
* @param {String} property | ||
* @param {Function} [customizer] | ||
* | ||
* @returns {*|undefined} | ||
*/ | ||
findInParents: function (property) { | ||
var owner = this.findParentContaining(property); | ||
findInParents: function (property, customizer) { | ||
var owner = this.findParentContaining(property, customizer); | ||
return owner ? owner[property] : undefined; | ||
@@ -72,23 +76,38 @@ }, | ||
/** | ||
* Looks up the closest parent which has a truthy value for the given property. | ||
* Looks up the closest parent which has a truthy value for the given property. Lookup will continue | ||
* until `customizer` returns a truthy value. If used without a customizer, | ||
* the lookup will stop at the first parent that contains the property. | ||
* | ||
* @param {String} property | ||
* @param {Function} [customizer] | ||
* | ||
* @returns {PropertyBase|undefined} | ||
* @private | ||
*/ | ||
findParentContaining: function (property) { | ||
var parent; | ||
findParentContaining: function (property, customizer) { | ||
var parent = this; | ||
// If the required property is present locally, `this` is the owner | ||
if (this[property]) { | ||
return this; | ||
// if customizer is present test with it | ||
if (customizer) { | ||
customizer = customizer.bind(this); | ||
do { | ||
// else check for existence | ||
if (customizer(parent)) { | ||
return parent; | ||
} | ||
parent = parent.__parent; | ||
} while (parent); | ||
} | ||
// Start travelling up the parent chain, to find the required property. | ||
parent = this.__parent; | ||
// else check for existence | ||
else { | ||
do { | ||
if (parent[property]) { | ||
return parent; | ||
} | ||
while (parent) { | ||
if (parent[property]) { | ||
return parent; | ||
} | ||
parent = parent.__parent; | ||
parent = parent.__parent; | ||
} while (parent); | ||
} | ||
@@ -95,0 +114,0 @@ }, |
@@ -322,3 +322,3 @@ var _ = require('../util').lodash, | ||
* @param {PropertyList|Array} source | ||
* @param {Boolean=false} prune Setting this to `true` will cause the extra items from the list to be deleted | ||
* @param {Boolean} [prune=false] Setting this to `true` will cause the extra items from the list to be deleted | ||
*/ | ||
@@ -325,0 +325,0 @@ assimilate: function (source, prune) { |
@@ -32,7 +32,7 @@ var _ = require('../util').lodash, | ||
* { | ||
* match: 'http+https://example.com/*', | ||
* host: 'proxy.com', | ||
* port: 8080 | ||
* tunnel: true, | ||
* disabled: false | ||
* "match": "http+https://example.com/*", | ||
* "host": "proxy.com", | ||
* "port": "8080", | ||
* "tunnel": true, | ||
* "disabled": false | ||
* } | ||
@@ -39,0 +39,0 @@ */ |
@@ -54,2 +54,3 @@ var _ = require('../util').lodash, | ||
// Although a similar check is being done in the .update call below, this handles falsy options as well. | ||
/** | ||
@@ -59,3 +60,2 @@ * @type {String} | ||
*/ | ||
// Although a similar check is being done in the .update call below, this handles falsy options as well. | ||
method: ((options && options.method) || DEFAULT_REQ_METHOD).toUpperCase() | ||
@@ -95,6 +95,8 @@ }); | ||
// auth is a special case, empty RequestAuth should not be created for falsy values | ||
// to allow inheritance from parent | ||
/** | ||
* @type {RequestAuth} | ||
*/ | ||
auth: _.createDefined(options, 'auth', RequestAuth), | ||
auth: options.auth ? new RequestAuth(options.auth) : undefined, | ||
@@ -101,0 +103,0 @@ /** |
@@ -54,2 +54,10 @@ var _ = require('../util').lodash, | ||
/** | ||
* Defines whether this property instances requires an id | ||
* @private | ||
* @readOnly | ||
* @type {Boolean} | ||
*/ | ||
_postman_propertyRequiresId: true, | ||
/** | ||
* Converts the script lines array to a single source string. | ||
@@ -56,0 +64,0 @@ * |
@@ -67,3 +67,3 @@ var _ = require('../util').lodash, | ||
* @param {Boolean=} track | ||
* @param {Boolean=true} prune | ||
* @param {Boolean} [prune=true] | ||
* | ||
@@ -70,0 +70,0 @@ * @returns {Object} |
@@ -109,3 +109,4 @@ var _ = require('../util').lodash, | ||
* @example <caption>Iterate on all variables</caption> | ||
* var env = new VariableScope([{ | ||
* var VariableScope = require('postman-collection').VariableScope, | ||
* env = new VariableScope([{ | ||
* key: 'var1', | ||
@@ -112,0 +113,0 @@ * value: 'one' |
@@ -6,2 +6,3 @@ var _ = require('../util').lodash, | ||
ANY = 'any', | ||
STRING = 'string', | ||
@@ -60,3 +61,3 @@ Variable; | ||
if (!((definition === undefined) || (definition === null))) { | ||
if (!_.isNil(definition)) { | ||
/** | ||
@@ -80,3 +81,3 @@ * The name of the variable. This is used for referencing this variable from other locations and scripts | ||
get: function () { | ||
return _.isFunction(this.value) ? this.cast(this.value()) : this.value; | ||
return _.isFunction(this.value) ? this.castOut(this.value()) : this.castOut(this.value); | ||
}, | ||
@@ -91,3 +92,3 @@ | ||
// @todo - figure out how secure is this! | ||
this.value = _.isFunction(value) ? value : this.cast(value); | ||
this.value = _.isFunction(value) ? value : this.castIn(value); | ||
}, | ||
@@ -122,22 +123,60 @@ | ||
cast: function (value) { | ||
return (Variable.types[this.type] || Variable.types.any)(value); | ||
return this.castOut(value); | ||
}, | ||
/** | ||
* Typecasts a value to the {@link Variable.types} of this {@link Variable}. Returns the value of the variable | ||
* converted to the type specified in {@link Variable#type}. | ||
* | ||
* @private | ||
* @param {*} value | ||
* @returns {*} | ||
*/ | ||
castIn: function (value) { | ||
var handler = Variable.types[this.type] || Variable.types.any; | ||
return _.isFunction(handler) ? handler(value) : handler.in(value); | ||
}, | ||
/** | ||
* Typecasts a value from the {@link Variable.types} of this {@link Variable}. Returns the value of the variable | ||
* converted to the type specified in {@link Variable#type}. | ||
* | ||
* @private | ||
* @param {*} value | ||
* @returns {*} | ||
*/ | ||
castOut: function (value) { | ||
var handler = Variable.types[this.type] || Variable.types.any; | ||
return _.isFunction(handler) ? handler(value) : handler.out(value); | ||
}, | ||
/** | ||
* Sets or gets the type of the value. | ||
* | ||
* @param {String} typeName | ||
* @param {Boolean} _nocast | ||
* @param {Boolean} _noCast | ||
* @returns {String} - returns the current type of the variable from the list of {@link Variable.types} | ||
*/ | ||
valueType: function (typeName, _nocast) { | ||
if (!typeName || !Variable.types[(typeName = typeName && typeName.toString().toLowerCase())]) { | ||
valueType: function (typeName, _noCast) { | ||
!_.isNil(typeName) && (typeName = typeName.toString().toLowerCase()); // sanitize | ||
if (!Variable.types[typeName]) { | ||
return this.type || ANY; // @todo: throw new Error('Invalid variable type.'); | ||
} | ||
// set the new type if it is valid and cast the stored value | ||
// set type if it is valid | ||
this.type = typeName; | ||
!_nocast && (this.value = this.cast(this.value)); | ||
return typeName; | ||
// 1. get the current value | ||
// 2. set the new type if it is valid and cast the stored value | ||
// 3. then set the interstitial value | ||
var interstitialCastValue; | ||
// do not touch value functions | ||
if (!(_noCast || _.isFunction(this.value))) { | ||
interstitialCastValue = this.get(); | ||
this.set(interstitialCastValue); | ||
interstitialCastValue = null; // just a precaution | ||
} | ||
return this.type; | ||
}, | ||
@@ -207,10 +246,59 @@ | ||
/** | ||
* A "json" type value stores JSON data format | ||
*/ | ||
'json': { | ||
/** | ||
* @param {Object|Array} val | ||
* @returns {String} | ||
*/ | ||
in: function (val) { | ||
try { | ||
// @todo: shoud we check if `val` is a valid JSON string? | ||
val = typeof val === STRING ? val : JSON.stringify(val); | ||
} | ||
catch (e) { | ||
val = 'null'; | ||
} | ||
return val; | ||
}, | ||
/** | ||
* A "json" type value stores JSON data format | ||
* | ||
* @param {String} val | ||
* @returns {Object} | ||
*/ | ||
out: function (val) { | ||
try { | ||
val = JSON.parse(val); | ||
} | ||
catch (e) { | ||
val = null; | ||
} | ||
return val; | ||
} | ||
}, | ||
/** | ||
* Free-form type of a value. This is the default for any variable, unless specified otherwise. It ensures that | ||
* the variable can store data in any type and no conversion is done while using {@link Variable#get}. | ||
* | ||
* @param {*} val | ||
* @returns {*} | ||
*/ | ||
'any': function (val) { | ||
return val; // pass through | ||
'any': { | ||
/** | ||
* @param {*} val | ||
* @returns {*} | ||
*/ | ||
in: function (val) { | ||
return val; // pass through | ||
}, | ||
/** | ||
* @param {*} val | ||
* @returns {*} | ||
*/ | ||
out: function (val) { | ||
return val; // pass through | ||
} | ||
} | ||
@@ -217,0 +305,0 @@ }, |
@@ -5,3 +5,3 @@ { | ||
"author": "Postman Labs <help@getpostman.com>", | ||
"version": "3.0.4-beta.1", | ||
"version": "3.0.4", | ||
"keywords": [ | ||
@@ -40,3 +40,3 @@ "postman" | ||
"liquid-json": "0.3.1", | ||
"lodash": "4.17.2", | ||
"lodash": "4.17.4", | ||
"8fold-marked": "0.3.8", | ||
@@ -56,3 +56,3 @@ "mime-format": "2.0.0", | ||
"dependency-check": "2.9.1", | ||
"eslint": "4.10.0", | ||
"eslint": "4.11.0", | ||
"eslint-plugin-jsdoc": "3.2.0", | ||
@@ -66,5 +66,5 @@ "eslint-plugin-lodash": "2.5.0", | ||
"jsdoc": "3.5.5", | ||
"jsdoc-to-markdown": "3.0.1", | ||
"jsdoc-to-markdown": "3.0.2", | ||
"karma": "1.7.1", | ||
"karma-browserify": "5.1.1", | ||
"karma-browserify": "5.1.2", | ||
"karma-chrome-launcher": "2.2.0", | ||
@@ -71,0 +71,0 @@ "karma-mocha": "1.3.0", |
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
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
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
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
406431
8742
0
+ Addedlodash@4.17.4(transitive)
- Removedlodash@4.17.2(transitive)
Updatedlodash@4.17.4