From 42035604dfa7c8a2aa28e6f2482ca297fe7949d8 Mon Sep 17 00:00:00 2001 From: electrovir Date: Thu, 20 Jun 2024 01:34:38 +0000 Subject: [PATCH] [patch] fix setValueWithNestedKeys --- package-lock.json | 60 ++++---- package.json | 2 +- packages/browser-testing/package.json | 6 +- packages/browser/package.json | 6 +- packages/chai/package.json | 6 +- packages/common-tests/package.json | 8 +- .../src/tests/object/nested-keys.test.ts | 145 +++++++++++++----- packages/common/package.json | 2 +- .../common/src/augments/object/nested-keys.ts | 27 ++-- packages/docker/package.json | 6 +- packages/node-js/package.json | 6 +- packages/prisma-node-js/package.json | 6 +- packages/scripts/package.json | 6 +- packages/testing/package.json | 4 +- 14 files changed, 178 insertions(+), 112 deletions(-) diff --git a/package-lock.json b/package-lock.json index bbbb03b1..091e6d5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "augment-vir", - "version": "28.2.2", + "version": "28.2.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "augment-vir", - "version": "28.2.2", + "version": "28.2.3", "license": "(MIT or CC0 1.0)", "workspaces": [ "./packages/*" @@ -15071,15 +15071,15 @@ }, "packages/browser": { "name": "@augment-vir/browser", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", + "@augment-vir/common": "^28.2.2", "html-spec-tags": "^2.2.0", "run-time-assertions": "^1.5.1" }, "devDependencies": { - "@augment-vir/browser-testing": "^28.2.1", + "@augment-vir/browser-testing": "^28.2.2", "@open-wc/testing": "^4.0.0", "@types/chai": "^4.3.16", "@types/mocha": "^10.0.6", @@ -15098,11 +15098,11 @@ }, "packages/browser-testing": { "name": "@augment-vir/browser-testing", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", - "@augment-vir/testing": "^28.2.1", + "@augment-vir/common": "^28.2.2", + "@augment-vir/testing": "^28.2.2", "@open-wc/testing": "^4.0.0", "@types/mocha": "^10.0.6", "@web/test-runner-commands": "^0.9.0", @@ -15142,11 +15142,11 @@ }, "packages/chai": { "name": "@augment-vir/chai", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", - "@augment-vir/testing": "^28.2.1", + "@augment-vir/common": "^28.2.2", + "@augment-vir/testing": "^28.2.2", "type-fest": "^4.20.1" }, "devDependencies": { @@ -15169,7 +15169,7 @@ }, "packages/common": { "name": "@augment-vir/common", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { "browser-or-node": "^3.0.0", @@ -15182,12 +15182,12 @@ }, "packages/common-tests": { "name": "@augment-vir/common-tests", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "devDependencies": { - "@augment-vir/chai": "^28.2.1", - "@augment-vir/common": "^28.2.1", - "@augment-vir/node-js": "^28.2.1", + "@augment-vir/chai": "^28.2.2", + "@augment-vir/common": "^28.2.2", + "@augment-vir/node-js": "^28.2.2", "@electrovir/nyc": "^15.1.0-fix0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/chai": "^4.3.16", @@ -15227,11 +15227,11 @@ }, "packages/docker": { "name": "@augment-vir/docker", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", - "@augment-vir/node-js": "^28.2.1" + "@augment-vir/common": "^28.2.2", + "@augment-vir/node-js": "^28.2.2" }, "devDependencies": { "typescript": "5.4.5" @@ -15239,10 +15239,10 @@ }, "packages/node-js": { "name": "@augment-vir/node-js", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", + "@augment-vir/common": "^28.2.2", "ansi-colors": "^4.1.3", "axios": "^1.7.2", "fs-extra": "^11.2.0", @@ -15251,7 +15251,7 @@ "type-fest": "^4.20.1" }, "devDependencies": { - "@augment-vir/chai": "^28.2.1", + "@augment-vir/chai": "^28.2.2", "@electrovir/nyc": "^15.1.0-fix0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/chai": "^4.3.16", @@ -15279,11 +15279,11 @@ }, "packages/prisma-node-js": { "name": "@augment-vir/prisma-node-js", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", - "@augment-vir/node-js": "^28.2.1", + "@augment-vir/common": "^28.2.2", + "@augment-vir/node-js": "^28.2.2", "type-fest": "^4.20.1" }, "devDependencies": { @@ -15304,11 +15304,11 @@ }, "packages/scripts": { "name": "@augment-vir/scripts", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", - "@augment-vir/node-js": "^28.2.1" + "@augment-vir/common": "^28.2.2", + "@augment-vir/node-js": "^28.2.2" }, "devDependencies": { "@electrovir/nyc": "^15.1.0-fix0", @@ -15339,10 +15339,10 @@ }, "packages/testing": { "name": "@augment-vir/testing", - "version": "28.2.2", + "version": "28.2.3", "license": "MIT", "dependencies": { - "@augment-vir/common": "^28.2.1", + "@augment-vir/common": "^28.2.2", "expect-type": "^0.15.0", "type-fest": "^4.20.1" }, diff --git a/package.json b/package.json index 9756b2a0..0784a387 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "augment-vir", - "version": "28.2.2", + "version": "28.2.3", "private": true, "homepage": "https://github.com/electrovir/augment-vir", "bugs": { diff --git a/packages/browser-testing/package.json b/packages/browser-testing/package.json index 44e04489..099dcfa5 100644 --- a/packages/browser-testing/package.json +++ b/packages/browser-testing/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/browser-testing", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -23,8 +23,8 @@ "test:coverage": "npm test" }, "dependencies": { - "@augment-vir/common": "^28.2.2", - "@augment-vir/testing": "^28.2.2", + "@augment-vir/common": "^28.2.3", + "@augment-vir/testing": "^28.2.3", "@open-wc/testing": "^4.0.0", "@types/mocha": "^10.0.6", "@web/test-runner-commands": "^0.9.0", diff --git a/packages/browser/package.json b/packages/browser/package.json index f695e253..ebbb4839 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/browser", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/browser", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -24,12 +24,12 @@ "test:watch": "web-test-runner --color --config configs/web-test-runner.config.mjs --watch" }, "dependencies": { - "@augment-vir/common": "^28.2.2", + "@augment-vir/common": "^28.2.3", "html-spec-tags": "^2.2.0", "run-time-assertions": "^1.5.1" }, "devDependencies": { - "@augment-vir/browser-testing": "^28.2.2", + "@augment-vir/browser-testing": "^28.2.3", "@open-wc/testing": "^4.0.0", "@types/chai": "^4.3.16", "@types/mocha": "^10.0.6", diff --git a/packages/chai/package.json b/packages/chai/package.json index d094ae1e..c6bd9fc0 100644 --- a/packages/chai/package.json +++ b/packages/chai/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/chai", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -23,8 +23,8 @@ "test:coverage": "npm test" }, "dependencies": { - "@augment-vir/common": "^28.2.2", - "@augment-vir/testing": "^28.2.2", + "@augment-vir/common": "^28.2.3", + "@augment-vir/testing": "^28.2.3", "type-fest": "^4.20.1" }, "devDependencies": { diff --git a/packages/common-tests/package.json b/packages/common-tests/package.json index 870166e0..52cb3923 100644 --- a/packages/common-tests/package.json +++ b/packages/common-tests/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/common-tests", - "version": "28.2.2", + "version": "28.2.3", "private": true, "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common-tests", "bugs": { @@ -22,9 +22,9 @@ "test:types": "tsc --noEmit" }, "devDependencies": { - "@augment-vir/chai": "^28.2.2", - "@augment-vir/common": "^28.2.2", - "@augment-vir/node-js": "^28.2.2", + "@augment-vir/chai": "^28.2.3", + "@augment-vir/common": "^28.2.3", + "@augment-vir/node-js": "^28.2.3", "@electrovir/nyc": "^15.1.0-fix0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/chai": "^4.3.16", diff --git a/packages/common-tests/src/tests/object/nested-keys.test.ts b/packages/common-tests/src/tests/object/nested-keys.test.ts index 17075140..11781eff 100644 --- a/packages/common-tests/src/tests/object/nested-keys.test.ts +++ b/packages/common-tests/src/tests/object/nested-keys.test.ts @@ -4,6 +4,7 @@ import { NestedKeys, NestedSequentialKeys, NestedValue, + copyThroughJson, getValueFromNestedKeys, randomString, setValueWithNestedKeys, @@ -51,7 +52,13 @@ describe(setValueWithNestedKeys.name, () => { newValue, ); - assert.strictEqual(exampleOriginal.a.b.c, newValue); + assert.deepStrictEqual(exampleOriginal, { + a: { + b: { + c: newValue, + }, + }, + }); }); it("creates keys that didn't exist", () => { @@ -68,7 +75,105 @@ describe(setValueWithNestedKeys.name, () => { newValue, ); - assert.strictEqual(missingKeys.a.b.c, newValue); + assert.deepStrictEqual(missingKeys, { + a: { + b: { + c: newValue, + }, + }, + }); + }); + it('should set a value', () => { + const myObject = { + a: 'hi', + b: { + c: 'hello', + d: { + e: 'super deep', + }, + }, + }; + + const newValue = randomString(); + + setValueWithNestedKeys( + myObject, + [ + 'b', + 'd', + 'e', + ], + newValue, + ); + + assert.deepStrictEqual(myObject, { + a: 'hi', + b: { + c: 'hello', + d: { + e: newValue, + }, + }, + }); + }); + it('sets a value only one key deep', () => { + const myObject = { + a: 'hi', + }; + + const newValue = randomString(); + + setValueWithNestedKeys( + myObject, + [ + 'a', + ], + newValue, + ); + + assert.deepStrictEqual(myObject, { + a: newValue, + }); + }); + it('sets a value in an object without any keys', () => { + const myObject = {} as Partial<{a: string}>; + + const newValue = randomString(); + + setValueWithNestedKeys( + myObject, + [ + 'a', + ], + newValue, + ); + + assert.deepStrictEqual(myObject, { + a: newValue, + }); + }); + it('does nothing with no keys', () => { + const myObject = { + a: 'hi', + b: { + c: 'hello', + d: { + e: 'super deep', + }, + }, + }; + const originalObject = copyThroughJson(myObject); + + const newValue = randomString(); + + setValueWithNestedKeys( + myObject, + // @ts-expect-error: intentionally leave empty + [], + newValue, + ); + + assert.deepStrictEqual(myObject, originalObject); }); }); @@ -192,42 +297,6 @@ describe('NestedValue', () => { }); }); -describe(setValueWithNestedKeys.name, () => { - it('should set a value', () => { - const myObject = { - a: 'hi', - b: { - c: 'hello', - d: { - e: 'super deep', - }, - }, - }; - - const newValue = randomString(); - - setValueWithNestedKeys( - myObject, - [ - 'b', - 'd', - 'e', - ], - newValue, - ); - - assert.deepStrictEqual(myObject, { - a: 'hi', - b: { - c: 'hello', - d: { - e: newValue, - }, - }, - }); - }); -}); - describe(getValueFromNestedKeys.name, () => { it('should restrict types properly', () => { const example: ExampleObjectType = {} as any; diff --git a/packages/common/package.json b/packages/common/package.json index 95046fcf..3018f162 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/common", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/common", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" diff --git a/packages/common/src/augments/object/nested-keys.ts b/packages/common/src/augments/object/nested-keys.ts index 6679385a..863dee07 100644 --- a/packages/common/src/augments/object/nested-keys.ts +++ b/packages/common/src/augments/object/nested-keys.ts @@ -1,4 +1,5 @@ import {isRunTimeType} from 'run-time-assertions'; +import {isLengthAtLeast} from '../tuple'; import {ArrayElement} from '../type'; import { TsRecurse, @@ -6,6 +7,7 @@ import { TsRecursionTracker, TsTooMuchRecursion, } from '../type-recursion'; +import {AnyObject} from './any-object'; import {PropertyValueType, isObject} from './object'; import {UnionToIntersection} from './old-union-to-intersection'; import {typedHasProperty} from './typed-has-property'; @@ -93,7 +95,7 @@ export function setValueWithNestedKeys< * affect the external API of this function. */ const nestedKeysInput = nestedKeys as ReadonlyArray; - const inputObject = originalObject as Record; + const inputObject = originalObject as AnyObject; if (isRunTimeType(inputObject, 'array')) { inputObject.forEach((entry) => { @@ -101,22 +103,17 @@ export function setValueWithNestedKeys< (setValueWithNestedKeys as any)(entry, nestedKeysInput, value); } }); - return; - } - - const nextKey = nestedKeysInput[0]!; - if (!(nextKey in inputObject)) { - inputObject[nextKey] = {} as any; - } else if (!isObject(inputObject[nextKey])) { - throw new Error(`Cannot set value at key '${String(nextKey)}' as its not an object.`); - } - - const nextParent = inputObject[nextKey]; + } else if (isLengthAtLeast(nestedKeysInput, 2)) { + /** If there are more keys to traverse into. */ + const nextKey = nestedKeysInput[0]; + if (!(nextKey in inputObject)) { + inputObject[nextKey] = {} as any; + } + const nextParent = inputObject[nextKey]; - if (nestedKeysInput.length > 2) { (setValueWithNestedKeys as any)(nextParent, nestedKeysInput.slice(1), value); - } else { - (nextParent as any)[nestedKeysInput[1]!] = value; + } else if (isLengthAtLeast(nestedKeysInput, 1)) { + inputObject[nestedKeysInput[0]] = value; } } diff --git a/packages/docker/package.json b/packages/docker/package.json index 2ba9511b..fd3d5bef 100644 --- a/packages/docker/package.json +++ b/packages/docker/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/docker", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/docker", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -22,8 +22,8 @@ "test:coverage": "npm test" }, "dependencies": { - "@augment-vir/common": "^28.2.2", - "@augment-vir/node-js": "^28.2.2" + "@augment-vir/common": "^28.2.3", + "@augment-vir/node-js": "^28.2.3" }, "devDependencies": { "typescript": "5.4.5" diff --git a/packages/node-js/package.json b/packages/node-js/package.json index 14335c4c..340154c5 100644 --- a/packages/node-js/package.json +++ b/packages/node-js/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/node-js", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/node-js", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -22,7 +22,7 @@ "test:coverage": "npm test coverage" }, "dependencies": { - "@augment-vir/common": "^28.2.2", + "@augment-vir/common": "^28.2.3", "ansi-colors": "^4.1.3", "axios": "^1.7.2", "fs-extra": "^11.2.0", @@ -31,7 +31,7 @@ "type-fest": "^4.20.1" }, "devDependencies": { - "@augment-vir/chai": "^28.2.2", + "@augment-vir/chai": "^28.2.3", "@electrovir/nyc": "^15.1.0-fix0", "@istanbuljs/nyc-config-typescript": "^1.0.2", "@types/chai": "^4.3.16", diff --git a/packages/prisma-node-js/package.json b/packages/prisma-node-js/package.json index f5680035..5ff41f2e 100644 --- a/packages/prisma-node-js/package.json +++ b/packages/prisma-node-js/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/prisma-node-js", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/prisma-node-js", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -22,8 +22,8 @@ "test:coverage": "npm test" }, "dependencies": { - "@augment-vir/common": "^28.2.2", - "@augment-vir/node-js": "^28.2.2", + "@augment-vir/common": "^28.2.3", + "@augment-vir/node-js": "^28.2.3", "type-fest": "^4.20.1" }, "devDependencies": { diff --git a/packages/scripts/package.json b/packages/scripts/package.json index 31ecf542..a4169017 100644 --- a/packages/scripts/package.json +++ b/packages/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/scripts", - "version": "28.2.2", + "version": "28.2.3", "private": true, "license": "MIT", "author": { @@ -14,8 +14,8 @@ "verify": "ts-node src/index.ts" }, "dependencies": { - "@augment-vir/common": "^28.2.2", - "@augment-vir/node-js": "^28.2.2" + "@augment-vir/common": "^28.2.3", + "@augment-vir/node-js": "^28.2.3" }, "devDependencies": { "@electrovir/nyc": "^15.1.0-fix0", diff --git a/packages/testing/package.json b/packages/testing/package.json index 8ed46eb3..d46835c1 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@augment-vir/testing", - "version": "28.2.2", + "version": "28.2.3", "homepage": "https://github.com/electrovir/augment-vir/tree/main/packages/testing", "bugs": { "url": "https://github.com/electrovir/augment-vir/issues" @@ -23,7 +23,7 @@ "test:coverage": "npm test coverage" }, "dependencies": { - "@augment-vir/common": "^28.2.2", + "@augment-vir/common": "^28.2.3", "expect-type": "^0.15.0", "type-fest": "^4.20.1" },