
Product
Rust Support Now in Beta
Socket's Rust support is moving to Beta: all users can scan Cargo projects and generate SBOMs, including Cargo.toml-only crates, with Rust-aware supply chain checks.
A dynamic markup language with support for directives and plugins. More details on kyoml.com
npm install --save kyoml
const kyoml = require('kyoml');
const json = kyoml.compile(`
key1 = 'value1'
key2 = 'value2'
block {
key3 = [1,2,3]
}
`)
Directives can be added anywhere in the document with an @
prefix. In essence they are functions that allow you to alter your document and create enriched experiences.
const kyoml = require('kyoml');
const json = kyoml.compile(`
key1 = 'value1'
key2 = 'value2'
block {
@uppercase
key3 = [1,2,3]
}
`, {
directives: {
uppercase: (node) => {
const {
root, // The root of the entire document
base, // The direct parent on which element you're operating on is
key, // The key on the base which contains the element
path, // The full path from the root (e.g document.block)
value, // The element itself
set, // A handy replace method
get // A getter allowing you to access anything in the entire document
} = node;
// You can now operate on your node
set(_.mapKeys(value, key => key.toUpperCase()));
}
}
})
Output:
{
"key1": "value1",
"key2": "value2",
"block": {
"KEY3": [1,2,3]
}
}
Directives can also take arguments, e.g
const kyoml = require('kyoml');
const json = kyoml.compile(`
@prefix("foo_")
key1 = 'value1'
key2 = 'value2'
block {
key3 = [1,2,3]
}
`, {
directives: {
prefix: ({ value }, prefix) => {
set(_.mapKeys(value, key => prefix + key));
}
}
})
Output:
{
"foo_key1": "value1",
"foo_key2": "value2",
"foo_block": {
"key3": [1,2,3]
}
}
Mappers are simply directives, which replace the value directly
const kyoml = require('kyoml');
const json = kyoml.compile(`
@addProperty("foo")
key1 = 'value1'
key2 = 'value2'
`, {
mappers: {
addProperty: (value, key) => ({ ...value, [key]: 'bar' })
}
})
Output:
{
"key1": "value1",
"key2": "value2",
"foo": "bar"
}
Values can be piped into directives using the directional |>
or |<
operators
e.g
const kyoml = require('kyoml');
const json = kyoml.compile(`
key1 = 'value1' |> @uppercase
key2 = @uppercase <| 'value2'
`, {
mappers: {
uppercase: (value) => (value.toUpperCase())
}
})
Output:
{
"key1": "VALUE1",
"key2": "VALUE2"
}
String interpolation is supported using ${}
Example
block {
hello = 'hello'
subblock {
array = ["world"]
sentence = "${block.hello} ${block.subblock.array[0]}"
}
}
NOTE: only double quoted strings will be interpolated
FAQs
A pluggable dynamic markup language
We found that kyoml demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket's Rust support is moving to Beta: all users can scan Cargo projects and generate SBOMs, including Cargo.toml-only crates, with Rust-aware supply chain checks.
Product
Socket Fix 2.0 brings targeted CVE remediation, smarter upgrade planning, and broader ecosystem support to help developers get to zero alerts.
Security News
Socket CEO Feross Aboukhadijeh joins Risky Business Weekly to unpack recent npm phishing attacks, their limited impact, and the risks if attackers get smarter.