diff --git a/package-lock.json b/package-lock.json index 460df7c..582aad6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/common", - "version": "5.17.0", + "version": "5.19.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/common", - "version": "5.17.0", + "version": "5.19.0", "license": "MIT", "dependencies": { "@fastify/formbody": "^8.0.2", diff --git a/package.json b/package.json index 0c7ca30..7aeb5f3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/common", - "version": "5.18.0", + "version": "5.19.0", "description": "The Athenna common helpers to use in any Node.js ESM project.", "license": "MIT", "author": "João Lenon ", diff --git a/src/helpers/Json.ts b/src/helpers/Json.ts index de49f8f..f0c38ca 100644 --- a/src/helpers/Json.ts +++ b/src/helpers/Json.ts @@ -421,6 +421,27 @@ export class Json { return lodash.get(object, key, defaultValue) } + /** + * Sort an object or an array of objects by it keys names. + */ + public static sort(object: T) { + if (Is.Array(object)) { + return object.map(Json.sort) + } + + if (!object || !Is.Object(object)) { + return object + } + + return Object.keys(object) + .sort() + .reduce((sortedObject, key) => { + sortedObject[key] = Json.sort(object[key]) + + return sortedObject + }, {}) + } + /** * Validate if an object or array is equal to another. * diff --git a/tests/unit/helpers/JsonTest.ts b/tests/unit/helpers/JsonTest.ts index ae552a6..5d14d12 100644 --- a/tests/unit/helpers/JsonTest.ts +++ b/tests/unit/helpers/JsonTest.ts @@ -185,6 +185,26 @@ export default class JsonTest { assert.deepEqual(falsyDefaultValue, false) } + @Test() + public async shouldBeAbleToSortObjects({ assert }: Context) { + const object = { + c: 'c', + b: 'b', + a: 'a' + } + + const sortedObject = Json.sort(object) + const sortedArrayOfObjects = Json.sort([object, object]) + const sortedObjectRecursive = Json.sort({ d: object, ...object }) + + assert.deepEqual(Object.keys(object), ['c', 'b', 'a']) + assert.deepEqual(Object.keys(sortedObject), ['a', 'b', 'c']) + assert.deepEqual(Object.keys(sortedArrayOfObjects[0]), ['a', 'b', 'c']) + assert.deepEqual(Object.keys(sortedArrayOfObjects[1]), ['a', 'b', 'c']) + assert.deepEqual(Object.keys(sortedObjectRecursive), ['a', 'b', 'c', 'd']) + assert.deepEqual(Object.keys(sortedObjectRecursive.d), ['a', 'b', 'c']) + } + @Test() public async shouldBeAbleToBuildObjectsUsingTheObjectBuilder({ assert }: Context) { const me = Json.builder() diff --git a/tests/unit/helpers/PathTest.ts b/tests/unit/helpers/PathTest.ts index 19578e1..85a4205 100644 --- a/tests/unit/helpers/PathTest.ts +++ b/tests/unit/helpers/PathTest.ts @@ -219,10 +219,10 @@ export default class PathTest { assert.isTrue(Path.database().endsWith(`build${sep}src${sep}database`)) assert.isTrue(Path.seeders().endsWith(`build${sep}src${sep}database${sep}seeders`)) assert.isTrue(Path.migrations().endsWith(`build${sep}src${sep}database${sep}migrations`)) - assert.isTrue(Path.resources().endsWith(`build${sep}src${sep}resources`)) - assert.isTrue(Path.apiResources().endsWith(`build${sep}src${sep}resources${sep}resources`)) - assert.isTrue(Path.views().endsWith(`build${sep}src${sep}resources${sep}views`)) - assert.isTrue(Path.locales().endsWith(`build${sep}src${sep}resources${sep}locales`)) + assert.isTrue(Path.resources().endsWith(`build${sep}resources`)) + assert.isTrue(Path.views().endsWith(`build${sep}resources${sep}views`)) + assert.isTrue(Path.locales().endsWith(`build${sep}resources${sep}locales`)) + assert.isTrue(Path.apiResources().endsWith(`build${sep}src${sep}resources`)) assert.isTrue(Path.nodeModules().endsWith(`build${sep}node_modules`)) assert.isTrue(Path.nodeModulesBin().endsWith(`build${sep}node_modules${sep}.bin`)) assert.isTrue(Path.providers().endsWith(`build${sep}src${sep}providers`))