@jdsalasc/solvejs-objects 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -0
- package/dist/cjs/index.cjs +135 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.d.ts +52 -0
- package/dist/esm/index.js +127 -0
- package/dist/esm/index.js.map +1 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# @jdsalasc/solvejs-objects
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@jdsalasc/solvejs-objects)
|
|
4
|
+
[](https://www.npmjs.com/package/@jdsalasc/solvejs-objects)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Zero-dependency object utilities for JavaScript and TypeScript.
|
|
8
|
+
|
|
9
|
+
## Utilities
|
|
10
|
+
|
|
11
|
+
- `pick`, `omit`, `hasOwn`
|
|
12
|
+
- `get`, `set`
|
|
13
|
+
- `deepMerge`
|
|
14
|
+
|
|
15
|
+
## When to use this package
|
|
16
|
+
|
|
17
|
+
Use it when you need consistent object shaping and nested path operations without pulling a larger utility library.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm i @jdsalasc/solvejs-objects
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Quick example
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { pick, set, deepMerge } from "@jdsalasc/solvejs-objects";
|
|
29
|
+
|
|
30
|
+
const user = pick({ id: "u1", name: "Ada", role: "admin" }, ["id", "name"]);
|
|
31
|
+
const state = { filters: {} };
|
|
32
|
+
set(state, "filters.status", "active");
|
|
33
|
+
deepMerge({ app: { flags: { a: true } } }, { app: { flags: { b: true } } });
|
|
34
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasOwn = hasOwn;
|
|
4
|
+
exports.pick = pick;
|
|
5
|
+
exports.omit = omit;
|
|
6
|
+
exports.get = get;
|
|
7
|
+
exports.set = set;
|
|
8
|
+
exports.deepMerge = deepMerge;
|
|
9
|
+
/**
|
|
10
|
+
* Returns whether a value is a plain object.
|
|
11
|
+
*
|
|
12
|
+
* @param value - Value to evaluate.
|
|
13
|
+
* @returns `true` when value is a plain object literal.
|
|
14
|
+
*/
|
|
15
|
+
function isPlainObject(value) {
|
|
16
|
+
return Object.prototype.toString.call(value) === "[object Object]";
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Safely checks whether an object owns a property.
|
|
20
|
+
*
|
|
21
|
+
* @param value - Candidate object.
|
|
22
|
+
* @param key - Property key.
|
|
23
|
+
* @returns `true` when key is an own property.
|
|
24
|
+
*/
|
|
25
|
+
function hasOwn(value, key) {
|
|
26
|
+
return value != null && Object.prototype.hasOwnProperty.call(value, key);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Picks a subset of keys from an object.
|
|
30
|
+
*
|
|
31
|
+
* @param value - Source object.
|
|
32
|
+
* @param keys - Keys to include.
|
|
33
|
+
* @returns New object with selected keys.
|
|
34
|
+
*/
|
|
35
|
+
function pick(value, keys) {
|
|
36
|
+
const output = {};
|
|
37
|
+
for (const key of keys) {
|
|
38
|
+
if (hasOwn(value, key)) {
|
|
39
|
+
output[key] = value[key];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return output;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Omits a subset of keys from an object.
|
|
46
|
+
*
|
|
47
|
+
* @param value - Source object.
|
|
48
|
+
* @param keys - Keys to remove.
|
|
49
|
+
* @returns New object without omitted keys.
|
|
50
|
+
*/
|
|
51
|
+
function omit(value, keys) {
|
|
52
|
+
const blocked = new Set(keys);
|
|
53
|
+
const output = {};
|
|
54
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
55
|
+
if (!blocked.has(key)) {
|
|
56
|
+
output[key] = value[key];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return output;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gets a nested value using dot-separated path segments.
|
|
63
|
+
*
|
|
64
|
+
* @param value - Source object.
|
|
65
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
66
|
+
* @param fallback - Value returned when path is missing.
|
|
67
|
+
* @returns Resolved value or fallback.
|
|
68
|
+
*/
|
|
69
|
+
function get(value, path, fallback) {
|
|
70
|
+
if (!path.trim()) {
|
|
71
|
+
return fallback;
|
|
72
|
+
}
|
|
73
|
+
const segments = path.split(".").filter(Boolean);
|
|
74
|
+
let current = value;
|
|
75
|
+
for (const segment of segments) {
|
|
76
|
+
if (current == null || !(segment in Object(current))) {
|
|
77
|
+
return fallback;
|
|
78
|
+
}
|
|
79
|
+
current = current[segment];
|
|
80
|
+
}
|
|
81
|
+
return current ?? fallback;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sets a nested value using dot-separated path segments.
|
|
85
|
+
*
|
|
86
|
+
* @param value - Source object.
|
|
87
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
88
|
+
* @param nextValue - Value to assign.
|
|
89
|
+
* @returns Same object reference for chaining.
|
|
90
|
+
* @throws {TypeError} If value is not object-like.
|
|
91
|
+
* @throws {TypeError} If path is empty.
|
|
92
|
+
*/
|
|
93
|
+
function set(value, path, nextValue) {
|
|
94
|
+
if (value == null || (typeof value !== "object" && typeof value !== "function")) {
|
|
95
|
+
throw new TypeError("Expected value to be an object.");
|
|
96
|
+
}
|
|
97
|
+
const segments = path.split(".").filter(Boolean);
|
|
98
|
+
if (segments.length === 0) {
|
|
99
|
+
throw new TypeError("Expected path to be a non-empty dot path.");
|
|
100
|
+
}
|
|
101
|
+
let cursor = value;
|
|
102
|
+
for (let index = 0; index < segments.length - 1; index += 1) {
|
|
103
|
+
const segment = segments[index];
|
|
104
|
+
const current = cursor[segment];
|
|
105
|
+
if (current == null || typeof current !== "object") {
|
|
106
|
+
cursor[segment] = {};
|
|
107
|
+
}
|
|
108
|
+
cursor = cursor[segment];
|
|
109
|
+
}
|
|
110
|
+
cursor[segments[segments.length - 1]] = nextValue;
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Deeply merges plain objects. Arrays are replaced by source value.
|
|
115
|
+
*
|
|
116
|
+
* @param target - Base object.
|
|
117
|
+
* @param sources - Objects to merge into target.
|
|
118
|
+
* @returns New merged object.
|
|
119
|
+
*/
|
|
120
|
+
function deepMerge(target, ...sources) {
|
|
121
|
+
const output = { ...target };
|
|
122
|
+
for (const source of sources) {
|
|
123
|
+
for (const [key, value] of Object.entries(source)) {
|
|
124
|
+
const existing = output[key];
|
|
125
|
+
if (isPlainObject(existing) && isPlainObject(value)) {
|
|
126
|
+
output[key] = deepMerge(existing, value);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
output[key] = value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return output;
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safely checks whether an object owns a property.
|
|
3
|
+
*
|
|
4
|
+
* @param value - Candidate object.
|
|
5
|
+
* @param key - Property key.
|
|
6
|
+
* @returns `true` when key is an own property.
|
|
7
|
+
*/
|
|
8
|
+
export declare function hasOwn(value: unknown, key: PropertyKey): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Picks a subset of keys from an object.
|
|
11
|
+
*
|
|
12
|
+
* @param value - Source object.
|
|
13
|
+
* @param keys - Keys to include.
|
|
14
|
+
* @returns New object with selected keys.
|
|
15
|
+
*/
|
|
16
|
+
export declare function pick<T extends object, K extends keyof T>(value: T, keys: readonly K[]): Pick<T, K>;
|
|
17
|
+
/**
|
|
18
|
+
* Omits a subset of keys from an object.
|
|
19
|
+
*
|
|
20
|
+
* @param value - Source object.
|
|
21
|
+
* @param keys - Keys to remove.
|
|
22
|
+
* @returns New object without omitted keys.
|
|
23
|
+
*/
|
|
24
|
+
export declare function omit<T extends object, K extends keyof T>(value: T, keys: readonly K[]): Omit<T, K>;
|
|
25
|
+
/**
|
|
26
|
+
* Gets a nested value using dot-separated path segments.
|
|
27
|
+
*
|
|
28
|
+
* @param value - Source object.
|
|
29
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
30
|
+
* @param fallback - Value returned when path is missing.
|
|
31
|
+
* @returns Resolved value or fallback.
|
|
32
|
+
*/
|
|
33
|
+
export declare function get<T>(value: unknown, path: string, fallback?: T): T | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Sets a nested value using dot-separated path segments.
|
|
36
|
+
*
|
|
37
|
+
* @param value - Source object.
|
|
38
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
39
|
+
* @param nextValue - Value to assign.
|
|
40
|
+
* @returns Same object reference for chaining.
|
|
41
|
+
* @throws {TypeError} If value is not object-like.
|
|
42
|
+
* @throws {TypeError} If path is empty.
|
|
43
|
+
*/
|
|
44
|
+
export declare function set<T extends object>(value: T, path: string, nextValue: unknown): T;
|
|
45
|
+
/**
|
|
46
|
+
* Deeply merges plain objects. Arrays are replaced by source value.
|
|
47
|
+
*
|
|
48
|
+
* @param target - Base object.
|
|
49
|
+
* @param sources - Objects to merge into target.
|
|
50
|
+
* @returns New merged object.
|
|
51
|
+
*/
|
|
52
|
+
export declare function deepMerge<T extends Record<string, unknown>>(target: T, ...sources: ReadonlyArray<Record<string, unknown>>): T;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns whether a value is a plain object.
|
|
3
|
+
*
|
|
4
|
+
* @param value - Value to evaluate.
|
|
5
|
+
* @returns `true` when value is a plain object literal.
|
|
6
|
+
*/
|
|
7
|
+
function isPlainObject(value) {
|
|
8
|
+
return Object.prototype.toString.call(value) === "[object Object]";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Safely checks whether an object owns a property.
|
|
12
|
+
*
|
|
13
|
+
* @param value - Candidate object.
|
|
14
|
+
* @param key - Property key.
|
|
15
|
+
* @returns `true` when key is an own property.
|
|
16
|
+
*/
|
|
17
|
+
export function hasOwn(value, key) {
|
|
18
|
+
return value != null && Object.prototype.hasOwnProperty.call(value, key);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Picks a subset of keys from an object.
|
|
22
|
+
*
|
|
23
|
+
* @param value - Source object.
|
|
24
|
+
* @param keys - Keys to include.
|
|
25
|
+
* @returns New object with selected keys.
|
|
26
|
+
*/
|
|
27
|
+
export function pick(value, keys) {
|
|
28
|
+
const output = {};
|
|
29
|
+
for (const key of keys) {
|
|
30
|
+
if (hasOwn(value, key)) {
|
|
31
|
+
output[key] = value[key];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return output;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Omits a subset of keys from an object.
|
|
38
|
+
*
|
|
39
|
+
* @param value - Source object.
|
|
40
|
+
* @param keys - Keys to remove.
|
|
41
|
+
* @returns New object without omitted keys.
|
|
42
|
+
*/
|
|
43
|
+
export function omit(value, keys) {
|
|
44
|
+
const blocked = new Set(keys);
|
|
45
|
+
const output = {};
|
|
46
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
47
|
+
if (!blocked.has(key)) {
|
|
48
|
+
output[key] = value[key];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return output;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Gets a nested value using dot-separated path segments.
|
|
55
|
+
*
|
|
56
|
+
* @param value - Source object.
|
|
57
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
58
|
+
* @param fallback - Value returned when path is missing.
|
|
59
|
+
* @returns Resolved value or fallback.
|
|
60
|
+
*/
|
|
61
|
+
export function get(value, path, fallback) {
|
|
62
|
+
if (!path.trim()) {
|
|
63
|
+
return fallback;
|
|
64
|
+
}
|
|
65
|
+
const segments = path.split(".").filter(Boolean);
|
|
66
|
+
let current = value;
|
|
67
|
+
for (const segment of segments) {
|
|
68
|
+
if (current == null || !(segment in Object(current))) {
|
|
69
|
+
return fallback;
|
|
70
|
+
}
|
|
71
|
+
current = current[segment];
|
|
72
|
+
}
|
|
73
|
+
return current ?? fallback;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Sets a nested value using dot-separated path segments.
|
|
77
|
+
*
|
|
78
|
+
* @param value - Source object.
|
|
79
|
+
* @param path - Dot path like `"user.profile.name"`.
|
|
80
|
+
* @param nextValue - Value to assign.
|
|
81
|
+
* @returns Same object reference for chaining.
|
|
82
|
+
* @throws {TypeError} If value is not object-like.
|
|
83
|
+
* @throws {TypeError} If path is empty.
|
|
84
|
+
*/
|
|
85
|
+
export function set(value, path, nextValue) {
|
|
86
|
+
if (value == null || (typeof value !== "object" && typeof value !== "function")) {
|
|
87
|
+
throw new TypeError("Expected value to be an object.");
|
|
88
|
+
}
|
|
89
|
+
const segments = path.split(".").filter(Boolean);
|
|
90
|
+
if (segments.length === 0) {
|
|
91
|
+
throw new TypeError("Expected path to be a non-empty dot path.");
|
|
92
|
+
}
|
|
93
|
+
let cursor = value;
|
|
94
|
+
for (let index = 0; index < segments.length - 1; index += 1) {
|
|
95
|
+
const segment = segments[index];
|
|
96
|
+
const current = cursor[segment];
|
|
97
|
+
if (current == null || typeof current !== "object") {
|
|
98
|
+
cursor[segment] = {};
|
|
99
|
+
}
|
|
100
|
+
cursor = cursor[segment];
|
|
101
|
+
}
|
|
102
|
+
cursor[segments[segments.length - 1]] = nextValue;
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Deeply merges plain objects. Arrays are replaced by source value.
|
|
107
|
+
*
|
|
108
|
+
* @param target - Base object.
|
|
109
|
+
* @param sources - Objects to merge into target.
|
|
110
|
+
* @returns New merged object.
|
|
111
|
+
*/
|
|
112
|
+
export function deepMerge(target, ...sources) {
|
|
113
|
+
const output = { ...target };
|
|
114
|
+
for (const source of sources) {
|
|
115
|
+
for (const [key, value] of Object.entries(source)) {
|
|
116
|
+
const existing = output[key];
|
|
117
|
+
if (isPlainObject(existing) && isPlainObject(value)) {
|
|
118
|
+
output[key] = deepMerge(existing, value);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
output[key] = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return output;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jdsalasc/solvejs-objects",
|
|
3
|
+
"version": "1.4.0",
|
|
4
|
+
"description": "Production-ready JS/TS object utilities: pick, omit, hasOwn, get/set nested paths, and deepMerge.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/cjs/index.cjs",
|
|
9
|
+
"module": "./dist/esm/index.js",
|
|
10
|
+
"types": "./dist/esm/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/esm/index.d.ts",
|
|
14
|
+
"import": "./dist/esm/index.js",
|
|
15
|
+
"require": "./dist/cjs/index.cjs"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "npm run clean && npm run build:esm && npm run build:cjs",
|
|
24
|
+
"build:esm": "tsc -p tsconfig.esm.json",
|
|
25
|
+
"build:cjs": "tsc -p tsconfig.cjs.json && node ./scripts/rename-cjs.mjs",
|
|
26
|
+
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
27
|
+
"test": "npm run build && node --test test/*.test.mjs",
|
|
28
|
+
"lint": "node -e \"console.log('No lint configured for @jdsalasc/solvejs-objects')\""
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
},
|
|
33
|
+
"author": "jdsalasc",
|
|
34
|
+
"homepage": "https://github.com/jdsalasca/solvejs#readme",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/jdsalasca/solvejs.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/jdsalasca/solvejs/issues"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18"
|
|
44
|
+
},
|
|
45
|
+
"keywords": [
|
|
46
|
+
"javascript object utilities",
|
|
47
|
+
"typescript object utilities",
|
|
48
|
+
"pick object keys",
|
|
49
|
+
"omit object keys",
|
|
50
|
+
"deep merge objects",
|
|
51
|
+
"get nested value",
|
|
52
|
+
"set nested value",
|
|
53
|
+
"has own property",
|
|
54
|
+
"zero dependency",
|
|
55
|
+
"solvejs"
|
|
56
|
+
]
|
|
57
|
+
}
|