Operators that make complex JSON structures easy to read and write.
Action | Operator | Key/Value |
---|---|---|
Assign Value | <= |
Value |
Assign Defaults | << , >> |
Key |
Merge | << , >> |
Value |
Mixin | $ |
Key |
Conditional Defaults | <<? , >>? |
Key |
npm install structured-json
import { build, update } from "structured-json"
let { stores, products } = build({
stores: {
grocery: {
products: "<= products",
},
},
products: {
milk: {
store: "<= stores.grocery",
},
},
})
stores.grocery.products // { milk }
products.milk.store // { products }
Assignment supports circular references, but it is up to you to be careful about infinite enumeration.
let { products } = build({
organicProducts: {
eggs: {},
milk: {},
},
veganProducts: {
kale: {},
tofu: {},
},
products: "<= organicProducts << veganProducts",
})
products
// { eggs: {},
// milk: {},
// kale: {},
// tofu: {} }
When used in a key, the merge operator defines a default object for its siblings (>>
) or its parent (<<
):
let { organicProducts, veganProducts } = build({
organicProducts: {
">>": { organic: true },
eggs: {},
milk: {},
},
veganProducts: {
">>": { vegan: true },
kale: {},
tofu: {},
},
})
organicProducts
// { eggs: { organic },
// milk: { organic } }
veganProducts
// { kale: { vegan },
// tofu: { vegan } }
Define defaults for sibling child objects with successive merge operators (">> >>":
).
A mixin is a variable meant only for referencing, and does not show up in enumeration.
let { products } = build({
products: {
$green: {
color: "green",
},
$white: {
color: "white",
},
milk: { "<<": "<= $white" },
kale: { "<<": "<= $green" },
tofu: { "<<": "<= $white" },
},
})
products
// { milk: { color: "white" },
// kale: { color: "green" },
// tofu: { color: "white" } }
let { products } = build({
winter: true,
products: {
">>? winter": {
local: false,
},
">>": {
local: true,
},
kale: {},
},
})
products // { kale: { local: false } }