json.sortify
Advanced tools
+176
| Apache License | ||
| Version 2.0, January 2004 | ||
| http://www.apache.org/licenses/ | ||
| TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION | ||
| 1. Definitions. | ||
| "License" shall mean the terms and conditions for use, reproduction, | ||
| and distribution as defined by Sections 1 through 9 of this document. | ||
| "Licensor" shall mean the copyright owner or entity authorized by | ||
| the copyright owner that is granting the License. | ||
| "Legal Entity" shall mean the union of the acting entity and all | ||
| other entities that control, are controlled by, or are under common | ||
| control with that entity. For the purposes of this definition, | ||
| "control" means (i) the power, direct or indirect, to cause the | ||
| direction or management of such entity, whether by contract or | ||
| otherwise, or (ii) ownership of fifty percent (50%) or more of the | ||
| outstanding shares, or (iii) beneficial ownership of such entity. | ||
| "You" (or "Your") shall mean an individual or Legal Entity | ||
| exercising permissions granted by this License. | ||
| "Source" form shall mean the preferred form for making modifications, | ||
| including but not limited to software source code, documentation | ||
| source, and configuration files. | ||
| "Object" form shall mean any form resulting from mechanical | ||
| transformation or translation of a Source form, including but | ||
| not limited to compiled object code, generated documentation, | ||
| and conversions to other media types. | ||
| "Work" shall mean the work of authorship, whether in Source or | ||
| Object form, made available under the License, as indicated by a | ||
| copyright notice that is included in or attached to the work | ||
| (an example is provided in the Appendix below). | ||
| "Derivative Works" shall mean any work, whether in Source or Object | ||
| form, that is based on (or derived from) the Work and for which the | ||
| editorial revisions, annotations, elaborations, or other modifications | ||
| represent, as a whole, an original work of authorship. For the purposes | ||
| of this License, Derivative Works shall not include works that remain | ||
| separable from, or merely link (or bind by name) to the interfaces of, | ||
| the Work and Derivative Works thereof. | ||
| "Contribution" shall mean any work of authorship, including | ||
| the original version of the Work and any modifications or additions | ||
| to that Work or Derivative Works thereof, that is intentionally | ||
| submitted to Licensor for inclusion in the Work by the copyright owner | ||
| or by an individual or Legal Entity authorized to submit on behalf of | ||
| the copyright owner. For the purposes of this definition, "submitted" | ||
| means any form of electronic, verbal, or written communication sent | ||
| to the Licensor or its representatives, including but not limited to | ||
| communication on electronic mailing lists, source code control systems, | ||
| and issue tracking systems that are managed by, or on behalf of, the | ||
| Licensor for the purpose of discussing and improving the Work, but | ||
| excluding communication that is conspicuously marked or otherwise | ||
| designated in writing by the copyright owner as "Not a Contribution." | ||
| "Contributor" shall mean Licensor and any individual or Legal Entity | ||
| on behalf of whom a Contribution has been received by Licensor and | ||
| subsequently incorporated within the Work. | ||
| 2. Grant of Copyright License. Subject to the terms and conditions of | ||
| this License, each Contributor hereby grants to You a perpetual, | ||
| worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||
| copyright license to reproduce, prepare Derivative Works of, | ||
| publicly display, publicly perform, sublicense, and distribute the | ||
| Work and such Derivative Works in Source or Object form. | ||
| 3. Grant of Patent License. Subject to the terms and conditions of | ||
| this License, each Contributor hereby grants to You a perpetual, | ||
| worldwide, non-exclusive, no-charge, royalty-free, irrevocable | ||
| (except as stated in this section) patent license to make, have made, | ||
| use, offer to sell, sell, import, and otherwise transfer the Work, | ||
| where such license applies only to those patent claims licensable | ||
| by such Contributor that are necessarily infringed by their | ||
| Contribution(s) alone or by combination of their Contribution(s) | ||
| with the Work to which such Contribution(s) was submitted. If You | ||
| institute patent litigation against any entity (including a | ||
| cross-claim or counterclaim in a lawsuit) alleging that the Work | ||
| or a Contribution incorporated within the Work constitutes direct | ||
| or contributory patent infringement, then any patent licenses | ||
| granted to You under this License for that Work shall terminate | ||
| as of the date such litigation is filed. | ||
| 4. Redistribution. You may reproduce and distribute copies of the | ||
| Work or Derivative Works thereof in any medium, with or without | ||
| modifications, and in Source or Object form, provided that You | ||
| meet the following conditions: | ||
| (a) You must give any other recipients of the Work or | ||
| Derivative Works a copy of this License; and | ||
| (b) You must cause any modified files to carry prominent notices | ||
| stating that You changed the files; and | ||
| (c) You must retain, in the Source form of any Derivative Works | ||
| that You distribute, all copyright, patent, trademark, and | ||
| attribution notices from the Source form of the Work, | ||
| excluding those notices that do not pertain to any part of | ||
| the Derivative Works; and | ||
| (d) If the Work includes a "NOTICE" text file as part of its | ||
| distribution, then any Derivative Works that You distribute must | ||
| include a readable copy of the attribution notices contained | ||
| within such NOTICE file, excluding those notices that do not | ||
| pertain to any part of the Derivative Works, in at least one | ||
| of the following places: within a NOTICE text file distributed | ||
| as part of the Derivative Works; within the Source form or | ||
| documentation, if provided along with the Derivative Works; or, | ||
| within a display generated by the Derivative Works, if and | ||
| wherever such third-party notices normally appear. The contents | ||
| of the NOTICE file are for informational purposes only and | ||
| do not modify the License. You may add Your own attribution | ||
| notices within Derivative Works that You distribute, alongside | ||
| or as an addendum to the NOTICE text from the Work, provided | ||
| that such additional attribution notices cannot be construed | ||
| as modifying the License. | ||
| You may add Your own copyright statement to Your modifications and | ||
| may provide additional or different license terms and conditions | ||
| for use, reproduction, or distribution of Your modifications, or | ||
| for any such Derivative Works as a whole, provided Your use, | ||
| reproduction, and distribution of the Work otherwise complies with | ||
| the conditions stated in this License. | ||
| 5. Submission of Contributions. Unless You explicitly state otherwise, | ||
| any Contribution intentionally submitted for inclusion in the Work | ||
| by You to the Licensor shall be under the terms and conditions of | ||
| this License, without any additional terms or conditions. | ||
| Notwithstanding the above, nothing herein shall supersede or modify | ||
| the terms of any separate license agreement you may have executed | ||
| with Licensor regarding such Contributions. | ||
| 6. Trademarks. This License does not grant permission to use the trade | ||
| names, trademarks, service marks, or product names of the Licensor, | ||
| except as required for reasonable and customary use in describing the | ||
| origin of the Work and reproducing the content of the NOTICE file. | ||
| 7. Disclaimer of Warranty. Unless required by applicable law or | ||
| agreed to in writing, Licensor provides the Work (and each | ||
| Contributor provides its Contributions) on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||
| implied, including, without limitation, any warranties or conditions | ||
| of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A | ||
| PARTICULAR PURPOSE. You are solely responsible for determining the | ||
| appropriateness of using or redistributing the Work and assume any | ||
| risks associated with Your exercise of permissions under this License. | ||
| 8. Limitation of Liability. In no event and under no legal theory, | ||
| whether in tort (including negligence), contract, or otherwise, | ||
| unless required by applicable law (such as deliberate and grossly | ||
| negligent acts) or agreed to in writing, shall any Contributor be | ||
| liable to You for damages, including any direct, indirect, special, | ||
| incidental, or consequential damages of any character arising as a | ||
| result of this License or out of the use or inability to use the | ||
| Work (including but not limited to damages for loss of goodwill, | ||
| work stoppage, computer failure or malfunction, or any and all | ||
| other commercial damages or losses), even if such Contributor | ||
| has been advised of the possibility of such damages. | ||
| 9. Accepting Warranty or Additional Liability. While redistributing | ||
| the Work or Derivative Works thereof, You may choose to offer, | ||
| and charge a fee for, acceptance of support, warranty, indemnity, | ||
| or other liability obligations and/or rights consistent with this | ||
| License. However, in accepting such obligations, You may act only | ||
| on Your own behalf and on Your sole responsibility, not on behalf | ||
| of any other Contributor, and only if You agree to indemnify, | ||
| defend, and hold each Contributor harmless for any liability | ||
| incurred by, or claims asserted against, such Contributor by reason | ||
| of your accepting any such warranty or additional liability. | ||
| END OF TERMS AND CONDITIONS |
| <!doctype html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8"><!-- encoding must be set for mocha's special characters to render properly --> | ||
| <link rel="stylesheet" href="../node_modules/mocha/mocha.css"/> | ||
| </head> | ||
| <body> | ||
| <div id="mocha"></div> | ||
| <script src="../node_modules/mocha/mocha.js"></script> | ||
| <script> | ||
| mocha.ui('bdd'); | ||
| </script> | ||
| <script src="../node_modules/expect/umd/expect.min.js"></script> | ||
| <script> // very basic AMD loader mock | ||
| (function () { | ||
| var modules = {}; | ||
| window.define = function (id, factory) { | ||
| modules[id] = factory(); | ||
| }; | ||
| define.amd = {}; | ||
| window.require = function (dependencies, callback) { | ||
| var resolved = []; | ||
| for (var i = 0; i < dependencies.length; i++) { | ||
| resolved.push(modules[dependencies[i]]); | ||
| } | ||
| callback.apply(this, resolved); | ||
| }; | ||
| })(); | ||
| </script> | ||
| <script src="../dist/JSON.sortify.js"></script> | ||
| <script src="test.js"></script> | ||
| <script> | ||
| console.info('with AMD mock'); | ||
| require(['json.sortify'], function (jsonSortify) { | ||
| JSON.sortify = jsonSortify; | ||
| mocha.run(); | ||
| }); | ||
| </script> | ||
| </body> | ||
| </html> |
| <!doctype html> | ||
| <html> | ||
| <head> | ||
| <meta charset="utf-8"><!-- encoding must be set for mocha's special characters to render properly --> | ||
| <link rel="stylesheet" href="../node_modules/mocha/mocha.css"/> | ||
| </head> | ||
| <body> | ||
| <div id="mocha"></div> | ||
| <script src="../node_modules/mocha/mocha.js"></script> | ||
| <script> | ||
| mocha.ui('bdd'); | ||
| </script> | ||
| <script src="../node_modules/expect/umd/expect.min.js"></script> | ||
| <script src="../dist/JSON.sortify.js"></script> | ||
| <script src="test.js"></script> | ||
| <script> | ||
| mocha.run(); | ||
| </script> | ||
| </body> | ||
| </html> |
+1
-3
@@ -18,5 +18,3 @@ 'use strict'; | ||
| (function(name, factory) { | ||
| if (typeof module != 'undefined') | ||
| module.exports = factory(); | ||
| else if (typeof define == 'function' && typeof define.amd == 'object') | ||
| if (typeof define == 'function' && typeof define.amd == 'object') | ||
| define('json.sortify', factory); | ||
@@ -23,0 +21,0 @@ else |
@@ -1,2 +0,2 @@ | ||
| 'use strict';var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol?"symbol":typeof obj;};(function(name,factory){if(typeof module!='undefined')module.exports=factory();else if(typeof define=='function'&&_typeof(define.amd)=='object')define('json.sortify',factory);else JSON.sortify=factory();})(undefined,function(){ /*! | ||
| 'use strict';var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol?"symbol":typeof obj;};(function(name,factory){if(typeof define=='function'&&_typeof(define.amd)=='object')define('json.sortify',factory);else JSON.sortify=factory();})(undefined,function(){ /*! | ||
| * Copyright 2015-2016 Thomas Rosenau | ||
@@ -15,2 +15,2 @@ * | ||
| * limitations under the License. | ||
| */'use strict';var sortKeys=function sortKeys(o){if(Array.isArray(o)){return o.map(sortKeys);}else if(o instanceof Object){var _ret=function(){var numeric=[];var nonNumeric=[];Object.keys(o).forEach(function(key){if(/^(0|[1-9][0-9]*)$/.test(key)){numeric.push(+key);}else {nonNumeric.push(key);}});return {v:numeric.sort().concat(nonNumeric.sort()).reduce(function(result,key){result[key]=sortKeys(o[key]);return result;},{})};}();if((typeof _ret==='undefined'?'undefined':_typeof(_ret))==="object")return _ret.v;}return o;};var jsonStringify=JSON.stringify.bind(JSON);var sortify=function sortify(value,replacer,space){var native=jsonStringify(value,replacer,0);if(!native||native[0]!=='{'&&native[0]!=='['){return native;}var cleanObj=JSON.parse(native);return jsonStringify(sortKeys(cleanObj),null,space);};return sortify;}); | ||
| */'use strict';var sortKeys=function sortKeys(o){if(Array.isArray(o)){return o.map(sortKeys);}else if(o instanceof Object){var _ret=function(){var numeric=[];var nonNumeric=[];Object.keys(o).forEach(function(key){if(/^(0|[1-9][0-9]*)$/.test(key)){numeric.push(+key);}else {nonNumeric.push(key);}});return {v:numeric.sort(function(a,b){return a-b;}).concat(nonNumeric.sort()).reduce(function(result,key){result[key]=sortKeys(o[key]);return result;},{})};}();if((typeof _ret==='undefined'?'undefined':_typeof(_ret))==="object")return _ret.v;}return o;};var jsonStringify=JSON.stringify.bind(JSON);var sortify=function sortify(value,replacer,space){var native=jsonStringify(value,replacer,0);if(!native||native[0]!=='{'&&native[0]!=='['){return native;}var cleanObj=JSON.parse(native);return jsonStringify(sortKeys(cleanObj),null,space);};return sortify;}); |
+3
-1
@@ -44,3 +44,5 @@ /*! | ||
| // do the rearrangement | ||
| return numeric.sort().concat(nonNumeric.sort()).reduce((result, key) => { | ||
| return numeric.sort(function (a, b) { | ||
| return a - b; | ||
| }).concat(nonNumeric.sort()).reduce((result, key) => { | ||
| result[key] = sortKeys(o[key]); // recurse! | ||
@@ -47,0 +49,0 @@ return result; |
+10
-5
| { | ||
| "name": "json.sortify", | ||
| "description": "A deterministic version of JSON.stringify that sorts object keys alphabetically.", | ||
| "version": "2.0.1", | ||
| "version": "2.0.2", | ||
| "engines": { | ||
@@ -38,12 +38,17 @@ "node": ">=0.10.0" | ||
| "babel-preset-es2015": "^6.6.0", | ||
| "expect": "^1.15.2", | ||
| "istanbul": "^0.3.17", | ||
| "mocha": "^2.2.5", | ||
| "should": "^7.0.2" | ||
| "mocha-phantomjs": "^4.0.2" | ||
| }, | ||
| "scripts": { | ||
| "prepublish": "node build/build.js", | ||
| "test": "mocha --check-leaks --bail --reporter spec test/", | ||
| "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/", | ||
| "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/" | ||
| "test": "npm run test:node && npm run test:browser", | ||
| "test:node": "mocha --check-leaks --bail --reporter spec test/", | ||
| "test:browser": "npm run test:browser:inject && npm run test:browser:amd", | ||
| "test:browser:inject": "mocha-phantomjs test/test.html", | ||
| "test:browser:amd": "mocha-phantomjs test/test-amd.html", | ||
| "test:cov": "istanbul cover _mocha -- --check-leaks --reporter dot test/", | ||
| "test:travis": "npm run test:browser && istanbul cover _mocha --report lcovonly -- --check-leaks --reporter spec test/" | ||
| } | ||
| } |
+43
-16
@@ -1,4 +0,10 @@ | ||
| JSON.sortify = require('../'); | ||
| var assert = require('assert'); | ||
| var should = require('should'); | ||
| if (typeof module !== 'undefined' && module.exports) { | ||
| console.info('Running in NodeJS'); | ||
| JSON.sortify = require('../'); | ||
| var expect = require('expect'); | ||
| } else { // Browser | ||
| console.info('Running in browser'); | ||
| global = window; | ||
| // libs provided via <script> | ||
| } | ||
@@ -8,7 +14,7 @@ describe('JSON.sortify', function () { | ||
| it('should define a function', function () { | ||
| JSON.sortify.should.be.a.function; | ||
| expect(JSON.sortify).toBeA(Function); | ||
| }); | ||
| it('should take precisely three arguments', function () { | ||
| assert.equal(JSON.sortify.length, 3); | ||
| expect(JSON.sortify.length).toBe(3); | ||
| }); | ||
@@ -37,3 +43,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture), JSON.stringify(fixture)); | ||
| expect(JSON.sortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
@@ -51,3 +57,3 @@ | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture), JSON.stringify(fixture)); | ||
| expect(JSON.sortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
@@ -62,3 +68,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture), JSON.stringify(fixture)); | ||
| expect(JSON.sortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
@@ -73,3 +79,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture), JSON.stringify(fixture)); | ||
| expect(JSON.sortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
@@ -86,3 +92,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture), JSON.stringify(fixture)); | ||
| expect(JSON.sortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
@@ -101,3 +107,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture[0], fixture[1]), JSON.stringify(fixture[0], fixture[1])); | ||
| expect(JSON.sortify(fixture[0], fixture[1])).toEqual(JSON.stringify(fixture[0], fixture[1])); | ||
| }); | ||
@@ -118,3 +124,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture[0], null, fixture[1]), JSON.stringify(fixture[0], null, fixture[1])); | ||
| expect(JSON.sortify(fixture[0], null, fixture[1])).toEqual(JSON.stringify(fixture[0], null, fixture[1])); | ||
| }); | ||
@@ -130,3 +136,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify.apply(JSON, fixture), JSON.stringify.apply(JSON, fixture)); | ||
| expect(JSON.sortify.apply(JSON, fixture)).toEqual(JSON.stringify.apply(JSON, fixture)); | ||
| }); | ||
@@ -149,3 +155,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.throws(JSON.sortify.bind(JSON, fixture), TypeError); | ||
| expect(JSON.sortify.bind(JSON, fixture)).toThrow(TypeError); | ||
| }); | ||
@@ -164,3 +170,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture[0]), fixture[1]); | ||
| expect(JSON.sortify(fixture[0])).toEqual(fixture[1]); | ||
| }); | ||
@@ -191,3 +197,3 @@ }); | ||
| fixtures.forEach(function (fixture) { | ||
| assert.equal(JSON.sortify(fixture[0], fixture[1], fixture[2]), fixture[3]); | ||
| expect(JSON.sortify(fixture[0], fixture[1], fixture[2])).toEqual(fixture[3]); | ||
| }); | ||
@@ -197,2 +203,23 @@ | ||
| }); | ||
| describe('interoperability / interchangeability', function () { | ||
| var fixtures = [ | ||
| 1, | ||
| [1, {a: 1, b: 2, c: [1, 2]}], | ||
| {a: {b:1, toJSON:function (key) { return 'x' + key + 'y'; }}} | ||
| ]; | ||
| it('should not depend on the “JSON” scope', function () { | ||
| var jsonSortify = JSON.sortify; | ||
| fixtures.forEach(function (fixture) { | ||
| expect(jsonSortify(fixture)).toEqual(JSON.stringify(fixture)); | ||
| }); | ||
| }); | ||
| it('should allow to overwrite “JSON.stringify”', function () { | ||
| var jsonStringifyOriginal = JSON.stringify.bind(JSON); | ||
| JSON.stringify = JSON.sortify; | ||
| fixtures.forEach(function (fixture) { | ||
| expect(JSON.stringify(fixture)).toEqual(jsonStringifyOriginal(fixture)); | ||
| }); | ||
| }); | ||
| }); | ||
| }); |
Sorry, the diff of this file is not supported yet
| <!-- TODO: More sophisticated tests for this - GH-3 --> | ||
| <script src="../dist/JSON.sortify.js"></script> | ||
| <script> | ||
| try{ | ||
| var result = JSON.sortify({b:1,a:2}); | ||
| if (result !== '{"a":2,"b":1}') { | ||
| throw new Error(); | ||
| } | ||
| document.write('<p style="background:lime">PASS</p>'); | ||
| } catch(e) { | ||
| document.write('<p style="background:orangered">FAIL</p>'); | ||
| } | ||
| </script> |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
50227
34.67%13
8.33%300
9.49%6
20%