@natlibfi/marc-record
Version:
MARC record implementation in JavaScript
117 lines (116 loc) • 4.72 kB
JavaScript
const anythingPattern = /[\s\S]*/su;
const controlFieldTagPattern = /^(?:[0A-Z][0A-Z][0-9A-Z]|[0a-z][0a-z][0-9a-z])$/u;
const controlFieldValuePattern = /^[\x20-\x7E]*$/u;
const dataFieldTagPattern = /^(?:[1-9A-Z][0-9A-Z][0-9A-Z]|[0-9A-Z][1-9A-Z][0-9A-Z]|[1-9a-z][0-9a-z][0-9a-z]|[0-9a-z][1-9a-z][0-9a-z])$/u;
const subfieldCodePattern = /^[\x21-\x40\x5B-\x7E]$/u;
const indicatorPattern = /^[0-9a-z ]$/u;
const dataFieldValuePatternNoControlCharacters = /^[^\x00-\x1F\x7F]*$/u;
const dataFieldValuePattern = /.*/u;
const maximumFieldLength = 9999;
export default function({ strict = false, fields = true, subfields = true, subfieldValues = true, controlFieldValues = true, leader = false, characters = false, noControlCharacters = false, noAdditionalProperties = false }) {
if (strict) {
return schema({ fields: true, subfields: true, subfieldValues: true, controlFieldValues: true, leader: true, characters: true, noControlCharacters: true, noAdditionalProperties: true });
}
return schema({ fields, subfields, subfieldValues, controlFieldValues, leader, characters, noControlCharacters, noAdditionalProperties });
}
function schema({ fields = true, subfields = true, subfieldValues = true, controlFieldValues = true, leader = false, characters = false, noControlCharacters = false, noAdditionalProperties = false }) {
return {
type: "object",
properties: {
leader: {
type: "string",
minLength: leader ? 24 : 0,
maxLength: leader ? 24 : maximumFieldLength,
pattern: characters ? controlFieldValuePattern : anythingPattern,
maxOccurence: 1
},
fields: {
type: "array",
minItems: fields ? 1 : 0,
items: {
anyOf: [
{
type: "object",
properties: {
tag: {
type: "string",
minLength: 3,
maxLength: 3,
pattern: characters ? controlFieldTagPattern : anythingPattern
},
value: {
type: "string",
minLength: controlFieldValues ? 1 : 0,
maxLength: maximumFieldLength,
pattern: characters ? controlFieldValuePattern : anythingPattern
},
ind1: false,
ind2: false,
subfields: false
},
required: controlFieldValues ? ["tag", "value"] : ["tag"],
additionalProperties: !noAdditionalProperties
},
{
type: "object",
properties: {
tag: {
type: "string",
minLength: 3,
maxLength: 3,
pattern: characters ? dataFieldTagPattern : anythingPattern
},
ind1: {
type: "string",
minLength: 1,
maxLength: 1,
pattern: characters ? indicatorPattern : anythingPattern
},
ind2: {
type: "string",
minLength: 1,
maxLength: 1,
pattern: characters ? indicatorPattern : anythingPattern
},
subfields: {
type: "array",
minItems: subfields ? 1 : 0,
items: {
type: "object",
properties: {
code: {
type: "string",
minLength: 1,
maxLength: 1,
pattern: characters ? subfieldCodePattern : anythingPattern
},
value: {
type: "string",
maxLength: maximumFieldLength,
minLength: subfieldValues ? 1 : 0,
pattern: noControlCharacters ? dataFieldValuePatternNoControlCharacters : dataFieldValuePattern
}
},
required: subfieldValues ? ["code", "value"] : ["code"],
additionalProperties: !noAdditionalProperties
}
},
value: false,
additionalProperties: !noAdditionalProperties
},
required: [
"tag",
"ind1",
"ind2",
"subfields"
],
additionalProperties: !noAdditionalProperties
}
]
}
}
},
required: leader ? ["leader", "fields"] : ["fields"]
};
}
//# sourceMappingURL=schema.js.map