UNPKG

@natlibfi/marc-record

Version:

MARC record implementation in JavaScript

117 lines (116 loc) 4.72 kB
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