a6y-schema
v0.3.3
Published
Specification of the Antology schema.
Downloads
4
Readme
Antology schema
Simple JSON schema definition language in pure JSON.
Helper functions
inferSchema({object})
- creates a schema definition from the JSON objectobject
checkSchema({schema})
- checks if a schema definitionschema
is a valid a6y schemaverifyObject({schema, object})
- checks is an objectobject
satisfies an a6y schemaschema
Schema definition definition
We tried to develop a definition language that is as simple as possible but still allows for specifying the definition language itself:
verifyObject({object: schemaDefinition, schema: schemaDefinition}).success === true
Meta definition
The following JSON object is a valid a6y schema and specifies how an a6y schema has to look. Mixing meta layers can be quite confusing. It is like you wanted to describe how an English phrase is structured just using English words.
{
"version": "1",
"name": "$",
"type": "struct",
"struct": [
{
"name": "version",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "type",
"type": "string"
},
{
"name": "struct",
"type": "list",
"optional": true,
"list": {
"type": "struct",
"struct": [
{
"name": "name",
"type": "string"
},
{
"name": "type",
"type": "string"
},
{
"name": "struct",
"type": "$.struct",
"optional": true
},
{
"name": "list",
"type": "$.list",
"optional": true
},
{
"name": "optional",
"type": "boolean",
"optional": true
}
]
}
},
{
"name": "list",
"type": "struct",
"optional": true,
"struct": [
{
"name": "type",
"type": "string"
},
{
"name": "struct",
"type": "$.struct",
"optional": true
},
{
"name": "list",
"type": "$.list",
"optional": true
}
]
}
]
}
Even though it might seem complicated it is actually quite simple considering it fully specifies the a6y schema language as an a6y schema.
Examples
String
inferSchema({object: 'test'}).schema
{
"version": "1",
"name": "$",
"type": "string"
}
List of integers
inferSchema({object: [1, 2, 3]}).schema
{
"version": "1",
"name": "$",
"type": "list",
"list": {
"type": "integer"
}
}
Recursive definition
Imagine you have a filesystem structure like this:
{
"name": "filesystem",
"files": [
"text.txt",
"image.png",
"audio.mp3"
],
"subfolders": [
{
"name": "logs",
"files": [
"logs1.txt",
"logs2.txt",
"logs3.txt"
],
"subfolders": {
"name": "archive",
"files": [
"oldlogs1.txt",
"oldlogs2.txt",
"oldlogs3.txt"
]
}
},
{
"name": "empty_folder"
}
]
}
In this case you have a potentially infinitely deeply nested structure which needs recursive definition:
{
"version": "1",
"name": "$",
"type": "struct",
"struct": [
{
"name": "name",
"type": "string"
},
{
"name": "files",
"type": "list",
"optional": true,
"list": {
"type": "string"
}
},
{
"name": "subfolders",
"type": "list",
"optional": true,
"list": {
"type": "$"
}
}
]
}
Note the dollar sign $
at the end which refers to the root element and allows for recursive nesting.