@robinpath/json
Advanced tools
+37
-7
| { | ||
| "name": "@robinpath/json", | ||
| "version": "0.1.0", | ||
| "publishConfig": { "access": "public" }, | ||
| "version": "0.1.1", | ||
| "publishConfig": { | ||
| "access": "public" | ||
| }, | ||
| "type": "module", | ||
| "main": "dist/index.js", | ||
| "types": "dist/index.d.ts", | ||
| "exports": { ".": { "import": "./dist/index.js", "types": "./dist/index.d.ts" } }, | ||
| "files": ["dist"], | ||
| "scripts": { "build": "tsc", "test": "node --import tsx --test tests/*.test.ts" }, | ||
| "peerDependencies": { "@wiredwp/robinpath": ">=0.20.0" }, | ||
| "devDependencies": { "@wiredwp/robinpath": "^0.30.1", "tsx": "^4.19.0", "typescript": "^5.6.0" } | ||
| "exports": { | ||
| ".": { | ||
| "import": "./dist/index.js", | ||
| "types": "./dist/index.d.ts" | ||
| } | ||
| }, | ||
| "files": [ | ||
| "dist" | ||
| ], | ||
| "scripts": { | ||
| "build": "tsc", | ||
| "test": "node --import tsx --test tests/*.test.ts" | ||
| }, | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "tsx": "^4.19.0", | ||
| "typescript": "^5.6.0" | ||
| }, | ||
| "description": "JSON manipulation: parse, stringify, deep merge, flatten, unflatten, diff, query by path, pick, and omit", | ||
| "keywords": [ | ||
| "json", | ||
| "utility" | ||
| ], | ||
| "license": "MIT", | ||
| "robinpath": { | ||
| "category": "utility", | ||
| "type": "utility", | ||
| "auth": "none", | ||
| "functionCount": 13 | ||
| } | ||
| } |
| import type { ModuleAdapter } from "@wiredwp/robinpath"; | ||
| declare const JsonModule: ModuleAdapter; | ||
| export default JsonModule; | ||
| export { JsonModule }; | ||
| export { JsonFunctions, JsonFunctionMetadata, JsonModuleMetadata } from "./json.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,QAAA,MAAM,UAAU,EAAE,aAMjB,CAAC;AAEF,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"} |
| import { JsonFunctions, JsonFunctionMetadata, JsonModuleMetadata } from "./json.js"; | ||
| const JsonModule = { | ||
| name: "json", | ||
| functions: JsonFunctions, | ||
| functionMetadata: JsonFunctionMetadata, | ||
| moduleMetadata: JsonModuleMetadata, | ||
| global: false, | ||
| }; // as ModuleAdapter | ||
| export default JsonModule; | ||
| export { JsonModule }; | ||
| export { JsonFunctions, JsonFunctionMetadata, JsonModuleMetadata } from "./json.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEpF,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE,aAAa;IACxB,gBAAgB,EAAE,oBAA2B;IAC7C,cAAc,EAAE,kBAAyB;IACzC,MAAM,EAAE,KAAK;CACd,CAAC,CAAC,mBAAmB;AAEtB,eAAe,UAAU,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC"} |
-186
| import type { BuiltinHandler } from "@wiredwp/robinpath"; | ||
| export declare const JsonFunctions: Record<string, BuiltinHandler>; | ||
| export declare const JsonFunctionMetadata: { | ||
| parse: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| stringify: { | ||
| description: string; | ||
| parameters: ({ | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| defaultValue?: undefined; | ||
| } | { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| defaultValue: string; | ||
| })[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| get: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| set: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| merge: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| flatten: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| unflatten: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| diff: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| clone: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| isValid: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| keys: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| pick: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| omit: { | ||
| description: string; | ||
| parameters: { | ||
| name: string; | ||
| dataType: string; | ||
| description: string; | ||
| formInputType: string; | ||
| required: boolean; | ||
| }[]; | ||
| returnType: string; | ||
| returnDescription: string; | ||
| example: string; | ||
| }; | ||
| }; | ||
| export declare const JsonModuleMetadata: { | ||
| description: string; | ||
| methods: string[]; | ||
| }; | ||
| //# sourceMappingURL=json.d.ts.map |
| {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAoC,MAAM,oBAAoB,CAAC;AA0J3F,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAExD,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAchC,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;CAG9B,CAAC"} |
-176
| function resolvePath(obj, path) { | ||
| const keys = path.split("."); | ||
| let current = obj; | ||
| for (const key of keys) { | ||
| if (current == null || typeof current !== "object") | ||
| return undefined; | ||
| current = current[key]; | ||
| } | ||
| return current; | ||
| } | ||
| function setPath(obj, path, value) { | ||
| const clone = JSON.parse(JSON.stringify(obj)); | ||
| const keys = path.split("."); | ||
| let current = clone; | ||
| for (let i = 0; i < keys.length - 1; i++) { | ||
| const key = keys[i]; | ||
| if (current[key] == null || typeof current[key] !== "object") { | ||
| current[key] = {}; | ||
| } | ||
| current = current[key]; | ||
| } | ||
| current[keys[keys.length - 1]] = value; | ||
| return clone; | ||
| } | ||
| function deepMerge(target, ...sources) { | ||
| const result = { ...target }; | ||
| for (const source of sources) { | ||
| for (const key of Object.keys(source)) { | ||
| const targetVal = result[key]; | ||
| const sourceVal = source[key]; | ||
| if (targetVal && sourceVal && typeof targetVal === "object" && typeof sourceVal === "object" && !Array.isArray(targetVal) && !Array.isArray(sourceVal)) { | ||
| result[key] = deepMerge(targetVal, sourceVal); | ||
| } | ||
| else { | ||
| result[key] = sourceVal; | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function flattenObj(obj, prefix = "") { | ||
| const result = {}; | ||
| if (obj == null || typeof obj !== "object" || Array.isArray(obj)) | ||
| return result; | ||
| for (const [key, value] of Object.entries(obj)) { | ||
| const newKey = prefix ? `${prefix}.${key}` : key; | ||
| if (value && typeof value === "object" && !Array.isArray(value)) { | ||
| Object.assign(result, flattenObj(value, newKey)); | ||
| } | ||
| else { | ||
| result[newKey] = value; | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function unflattenObj(obj) { | ||
| const result = {}; | ||
| for (const [key, value] of Object.entries(obj)) { | ||
| const keys = key.split("."); | ||
| let current = result; | ||
| for (let i = 0; i < keys.length - 1; i++) { | ||
| const k = keys[i]; | ||
| if (!current[k] || typeof current[k] !== "object") | ||
| current[k] = {}; | ||
| current = current[k]; | ||
| } | ||
| current[keys[keys.length - 1]] = value; | ||
| } | ||
| return result; | ||
| } | ||
| function diffObjects(a, b, path = "") { | ||
| const diffs = []; | ||
| const aObj = a; | ||
| const bObj = b; | ||
| const allKeys = new Set([...Object.keys(aObj ?? {}), ...Object.keys(bObj ?? {})]); | ||
| for (const key of allKeys) { | ||
| const fullPath = path ? `${path}.${key}` : key; | ||
| const aVal = aObj?.[key]; | ||
| const bVal = bObj?.[key]; | ||
| if (aVal && bVal && typeof aVal === "object" && typeof bVal === "object" && !Array.isArray(aVal) && !Array.isArray(bVal)) { | ||
| diffs.push(...diffObjects(aVal, bVal, fullPath)); | ||
| } | ||
| else if (JSON.stringify(aVal) !== JSON.stringify(bVal)) { | ||
| diffs.push({ path: fullPath, oldValue: aVal, newValue: bVal }); | ||
| } | ||
| } | ||
| return diffs; | ||
| } | ||
| function collectKeys(obj, prefix = "") { | ||
| const keys = []; | ||
| if (obj == null || typeof obj !== "object" || Array.isArray(obj)) | ||
| return keys; | ||
| for (const [key, value] of Object.entries(obj)) { | ||
| const fullKey = prefix ? `${prefix}.${key}` : key; | ||
| keys.push(fullKey); | ||
| if (value && typeof value === "object" && !Array.isArray(value)) { | ||
| keys.push(...collectKeys(value, fullKey)); | ||
| } | ||
| } | ||
| return keys; | ||
| } | ||
| // ── Handlers ──────────────────────────────────────────────────────── | ||
| const parse = (args) => JSON.parse(String(args[0] ?? "")); | ||
| const stringify = (args) => { | ||
| const indent = args[1] != null ? Number(args[1]) : 2; | ||
| return JSON.stringify(args[0], null, indent); | ||
| }; | ||
| const get = (args) => resolvePath(args[0], String(args[1] ?? "")); | ||
| const set = (args) => setPath(args[0], String(args[1] ?? ""), args[2]); | ||
| const merge = (args) => { | ||
| const objects = args.filter((a) => a && typeof a === "object"); | ||
| if (objects.length === 0) | ||
| return {}; | ||
| return objects.reduce((acc, obj) => deepMerge(acc, obj)); | ||
| }; | ||
| const flatten = (args) => flattenObj(args[0]); | ||
| const unflatten = (args) => unflattenObj(args[0]); | ||
| const diff = (args) => diffObjects(args[0], args[1]); | ||
| const clone = (args) => JSON.parse(JSON.stringify(args[0])); | ||
| const isValid = (args) => { | ||
| try { | ||
| JSON.parse(String(args[0] ?? "")); | ||
| return true; | ||
| } | ||
| catch { | ||
| return false; | ||
| } | ||
| }; | ||
| const keys = (args) => collectKeys(args[0]); | ||
| const pick = (args) => { | ||
| const obj = args[0]; | ||
| const pickKeys = args[1]; | ||
| if (!obj || !Array.isArray(pickKeys)) | ||
| return {}; | ||
| const result = {}; | ||
| for (const key of pickKeys) { | ||
| if (key in obj) | ||
| result[key] = obj[key]; | ||
| } | ||
| return result; | ||
| }; | ||
| const omit = (args) => { | ||
| const obj = args[0]; | ||
| const omitKeys = new Set(args[1]); | ||
| if (!obj || !omitKeys.size) | ||
| return { ...obj }; | ||
| const result = {}; | ||
| for (const [key, value] of Object.entries(obj)) { | ||
| if (!omitKeys.has(key)) | ||
| result[key] = value; | ||
| } | ||
| return result; | ||
| }; | ||
| export const JsonFunctions = { | ||
| parse, stringify, get, set, merge, flatten, unflatten, diff, clone, isValid, keys, pick, omit, | ||
| }; | ||
| export const JsonFunctionMetadata = { | ||
| parse: { description: "Parse a JSON string into an object", parameters: [{ name: "jsonString", dataType: "string", description: "JSON string to parse", formInputType: "textarea", required: true }], returnType: "object", returnDescription: "Parsed JavaScript value", example: 'json.parse \'{"name":"Alice"}\'' }, | ||
| stringify: { description: "Convert a value to a JSON string", parameters: [{ name: "value", dataType: "any", description: "Value to stringify", formInputType: "json", required: true }, { name: "indent", dataType: "number", description: "Indentation spaces (default: 2)", formInputType: "number", required: false, defaultValue: "2" }], returnType: "string", returnDescription: "JSON string", example: "json.stringify $obj" }, | ||
| get: { description: "Get a nested value by dot-separated path", parameters: [{ name: "obj", dataType: "object", description: "Source object", formInputType: "json", required: true }, { name: "path", dataType: "string", description: "Dot-separated path (e.g. user.name)", formInputType: "text", required: true }], returnType: "any", returnDescription: "Value at the path", example: 'json.get $obj "user.name"' }, | ||
| set: { description: "Set a nested value by dot-separated path, returning a new object", parameters: [{ name: "obj", dataType: "object", description: "Source object", formInputType: "json", required: true }, { name: "path", dataType: "string", description: "Dot-separated path", formInputType: "text", required: true }, { name: "value", dataType: "any", description: "Value to set", formInputType: "text", required: true }], returnType: "object", returnDescription: "New object with the value set", example: 'json.set $obj "user.name" "Bob"' }, | ||
| merge: { description: "Deep merge two or more objects", parameters: [{ name: "objects", dataType: "object", description: "Objects to merge (pass multiple args)", formInputType: "json", required: true }], returnType: "object", returnDescription: "Merged object", example: "json.merge $obj1 $obj2" }, | ||
| flatten: { description: "Flatten a nested object to dot-notation keys", parameters: [{ name: "obj", dataType: "object", description: "Object to flatten", formInputType: "json", required: true }], returnType: "object", returnDescription: "Flat object with dot-notation keys", example: "json.flatten $obj" }, | ||
| unflatten: { description: "Unflatten dot-notation keys back to a nested object", parameters: [{ name: "obj", dataType: "object", description: "Flat object with dot-notation keys", formInputType: "json", required: true }], returnType: "object", returnDescription: "Nested object", example: "json.unflatten $flat" }, | ||
| diff: { description: "Compare two objects and return differences", parameters: [{ name: "a", dataType: "object", description: "First object", formInputType: "json", required: true }, { name: "b", dataType: "object", description: "Second object", formInputType: "json", required: true }], returnType: "array", returnDescription: "Array of {path, oldValue, newValue}", example: "json.diff $obj1 $obj2" }, | ||
| clone: { description: "Deep clone an object", parameters: [{ name: "obj", dataType: "any", description: "Value to clone", formInputType: "json", required: true }], returnType: "any", returnDescription: "Deep cloned value", example: "json.clone $obj" }, | ||
| isValid: { description: "Check if a string is valid JSON", parameters: [{ name: "str", dataType: "string", description: "String to check", formInputType: "textarea", required: true }], returnType: "boolean", returnDescription: "True if valid JSON", example: 'json.isValid \'{"a":1}\'' }, | ||
| keys: { description: "Get all keys including nested paths with dot notation", parameters: [{ name: "obj", dataType: "object", description: "Source object", formInputType: "json", required: true }], returnType: "array", returnDescription: "Array of all key paths", example: "json.keys $obj" }, | ||
| pick: { description: "Pick specific keys from an object", parameters: [{ name: "obj", dataType: "object", description: "Source object", formInputType: "json", required: true }, { name: "keys", dataType: "array", description: "Array of keys to pick", formInputType: "json", required: true }], returnType: "object", returnDescription: "Object with only picked keys", example: 'json.pick $obj ["name", "age"]' }, | ||
| omit: { description: "Omit specific keys from an object", parameters: [{ name: "obj", dataType: "object", description: "Source object", formInputType: "json", required: true }, { name: "keys", dataType: "array", description: "Array of keys to omit", formInputType: "json", required: true }], returnType: "object", returnDescription: "Object without omitted keys", example: 'json.omit $obj ["password"]' }, | ||
| }; | ||
| export const JsonModuleMetadata = { | ||
| description: "JSON manipulation: parse, stringify, deep merge, flatten, unflatten, diff, query by path, pick, and omit", | ||
| methods: ["parse", "stringify", "get", "set", "merge", "flatten", "unflatten", "diff", "clone", "isValid", "keys", "pick", "omit"], | ||
| }; | ||
| //# sourceMappingURL=json.js.map |
| {"version":3,"file":"json.js","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"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"} |
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No License Found
LicenseLicense information could not be found.
Found 1 instance in 1 package
0
-100%3536
-88.91%2
-80%0
-100%2
Infinity%