@natlibfi/marc-record-validators-melinda 12.0.0-alpha.1 → 12.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,61 +1,89 @@
1
- import AccessRights from "./access-rights";
2
- import AddMissingField041 from "./addMissingField041";
3
- import AddMissingField336 from "./addMissingField336";
4
- import AddMissingField337 from "./addMissingField337";
5
- import AddMissingField338 from "./addMissingField338";
6
- import Cyrillux from "./cyrillux";
7
- import CyrilluxUsemarconReplacement from "./cyrillux-usemarcon-replacement";
8
- import DisambiguateSeriesStatements from "./disambiguateSeriesStatements";
9
- import DoubleCommas from "./double-commas";
10
- import DuplicatesInd1 from "./duplicates-ind1";
11
- import EmptyFields from "./empty-fields";
12
- import EndingPunctuation from "./ending-punctuation";
13
- import EndingWhitespace from "./ending-whitespace";
14
- import Field008CharacterGroups from "./field-008-18-34-character-groups";
15
- import Field505Separators from "./field-505-separators";
16
- import Field521Fix from "./field-521-fix";
17
- import FieldExclusion from "./field-exclusion";
18
- import FieldStructure from "./field-structure";
19
- import FieldsPresent from "./fields-present";
20
- import Fix33X from "./fix-33X";
21
- import FixCountryCodes from "./fix-country-codes";
22
- import FixLanguageCodes from "./fix-language-codes";
23
- import FixRelatorTerms from "./fixRelatorTerms";
24
- import FixedFields from "./fixed-fields";
25
- import IdenticalFields from "./identical-fields";
26
- import IndicatorFixes from "./indicator-fixes";
27
- import IsbnIssn from "./isbn-issn";
28
- import ItemLanguage from "./item-language";
29
- import MergeField500Lisapainokset from "./mergeField500Lisapainokset";
30
- import MergeFields from "./merge-fields/";
31
- import MergeRelatorTermFields from "./mergeRelatorTermFields";
32
- import Modernize502 from "./modernize-502";
33
- import MultipleSubfield0s from "./multiple-subfield-0";
34
- import NonBreakingSpace from "./non-breaking-space";
35
- import NormalizeDashes from "./normalize-dashes";
36
- import NormalizeIdentifiers from "./normalize-identifiers";
37
- import NormalizeQualifyingInformation from "./normalize-qualifying-information";
38
- import NormalizeUTF8Diacritics from "./normalize-utf8-diacritics";
39
- import Punctuation from "./punctuation/";
40
- import Punctuation2 from "./punctuation2";
41
- import ReindexSubfield6OccurenceNumbers from "./reindexSubfield6OccurenceNumbers";
42
- import RemoveDuplicateDataFields from "./removeDuplicateDataFields";
43
- import RemoveInferiorDataFields from "./removeInferiorDataFields";
44
- import ResolvableExtReferences from "./resolvable-ext-references-melinda";
45
- import ResolveOrphanedSubfield6s from "./resolveOrphanedSubfield6s";
46
- import SanitizeVocabularySourceCodes from "./sanitize-vocabulary-source-codes";
47
- import SortFields from "./sortFields";
48
- import SortRelatorTerms from "./sortRelatorTerms";
49
- import SortSubfields from "./sortSubfields";
50
- import SortTags from "./sort-tags";
51
- import SubfieldValueNormalizations from "./subfieldValueNormalizations";
52
- import SubfieldExclusion from "./subfield-exclusion";
53
- import Sync007And300 from "./sync-007-and-300";
54
- import TranslateTerms from "./translate-terms";
55
- import TypeOfDateF008 from "./typeOfDate-008";
56
- import UnicodeDecomposition from "./unicode-decomposition";
57
- import UpdateField540 from "./update-field-540";
58
- import Urn from "./urn";
1
+ import AccessRights from "./access-rights.js";
2
+ import AddMissingField041 from "./addMissingField041.js";
3
+ import AddMissingField336 from "./addMissingField336.js";
4
+ import AddMissingField337 from "./addMissingField337.js";
5
+ import AddMissingField338 from "./addMissingField338.js";
6
+ import Cyrillux from "./cyrillux.js";
7
+ import CyrilluxUsemarconReplacement from "./cyrillux-usemarcon-replacement.js";
8
+ import DisambiguateSeriesStatements from "./disambiguateSeriesStatements.js";
9
+ import DoubleCommas from "./double-commas.js";
10
+ import DuplicatesInd1 from "./duplicates-ind1.js";
11
+ import EmptyFields from "./empty-fields.js";
12
+ import EndingPunctuation from "./ending-punctuation.js";
13
+ import EndingWhitespace from "./ending-whitespace.js";
14
+ import Field008CharacterGroups from "./field-008-18-34-character-groups.js";
15
+ import Field505Separators from "./field-505-separators.js";
16
+ import Field521Fix from "./field-521-fix.js";
17
+ import FieldExclusion from "./field-exclusion.js";
18
+ import FieldStructure from "./field-structure.js";
19
+ import FieldsPresent from "./fields-present.js";
20
+ import Fix33X from "./fix-33X.js";
21
+ import FixCountryCodes from "./fix-country-codes.js";
22
+ import FixLanguageCodes from "./fix-language-codes.js";
23
+ import FixRelatorTerms from "./fixRelatorTerms.js";
24
+ import FixedFields from "./fixed-fields.js";
25
+ import IdenticalFields from "./identical-fields.js";
26
+ import IndicatorFixes from "./indicator-fixes.js";
27
+ import IsbnIssn from "./isbn-issn.js";
28
+ import ItemLanguage from "./item-language.js";
29
+ import MergeField500Lisapainokset from "./mergeField500Lisapainokset.js";
30
+ import MergeFields from "./merge-fields/index.js";
31
+ import MergeRelatorTermFields from "./mergeRelatorTermFields.js";
32
+ import Modernize502 from "./modernize-502.js";
33
+ import MultipleSubfield0s from "./multiple-subfield-0.js";
34
+ import NonBreakingSpace from "./non-breaking-space.js";
35
+ import NormalizeDashes from "./normalize-dashes.js";
36
+ import NormalizeIdentifiers from "./normalize-identifiers.js";
37
+ import NormalizeQualifyingInformation from "./normalize-qualifying-information.js";
38
+ import NormalizeUTF8Diacritics from "./normalize-utf8-diacritics.js";
39
+ import Punctuation from "./punctuation/index.js";
40
+ import Punctuation2 from "./punctuation2.js";
41
+ import ReindexSubfield6OccurenceNumbers from "./reindexSubfield6OccurenceNumbers.js";
42
+ import RemoveDuplicateDataFields from "./removeDuplicateDataFields.js";
43
+ import RemoveInferiorDataFields from "./removeInferiorDataFields.js";
44
+ import ResolvableExtReferences from "./resolvable-ext-references-melinda.js";
45
+ import ResolveOrphanedSubfield6s from "./resolveOrphanedSubfield6s.js";
46
+ import SanitizeVocabularySourceCodes from "./sanitize-vocabulary-source-codes.js";
47
+ import SortFields from "./sortFields.js";
48
+ import SortRelatorTerms from "./sortRelatorTerms.js";
49
+ import SortSubfields from "./sortSubfields.js";
50
+ import SortTags from "./sort-tags.js";
51
+ import SubfieldValueNormalizations from "./subfieldValueNormalizations.js";
52
+ import SubfieldExclusion from "./subfield-exclusion.js";
53
+ import Sync007And300 from "./sync-007-and-300.js";
54
+ import TranslateTerms from "./translate-terms.js";
55
+ import TypeOfDateF008 from "./typeOfDate-008.js";
56
+ import UnicodeDecomposition from "./unicode-decomposition.js";
57
+ import UpdateField540 from "./update-field-540.js";
58
+ import Urn from "./urn.js";
59
+ import { getCounterpart } from "./merge-fields/counterpartField.js";
60
+ import { postprocessRecords } from "./merge-fields/mergeOrAddPostprocess.js";
61
+ import { mergeField } from "./merge-fields/mergeField.js";
62
+ import {
63
+ fieldGetOccurrenceNumberPairs,
64
+ fieldGetUnambiguousOccurrenceNumber,
65
+ fieldToNormalizedString,
66
+ fieldsToNormalizedString,
67
+ get6s,
68
+ isValidSubfield6,
69
+ recordGetMaxSubfield6OccurrenceNumberAsInteger,
70
+ intToOccurrenceNumberString,
71
+ resetSubfield6Tag,
72
+ subfield6ResetOccurrenceNumber,
73
+ subfield6GetOccurrenceNumber,
74
+ subfield6GetOccurrenceNumberAsInteger
75
+ } from "./subfield6Utils.js";
76
+ import { getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber } from "./subfield8Utils.js";
77
+ import { recordFixRelatorTerms } from "./fixRelatorTerms.js";
78
+ import { fieldTrimSubfieldValues } from "./normalizeFieldForComparison.js";
79
+ import { baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield } from "./prepublicationUtils.js";
80
+ import { melindaFieldSpecs } from "@natlibfi/marc-record-validators-melinda/dist/melindaCustomMergeFields.js";
81
+ import { cloneAndRemovePunctuation } from "./normalizeFieldForComparison.js";
82
+ import { removeWorsePrepubField500s, removeWorsePrepubField594s } from "./prepublicationUtils.js";
83
+ import { fieldFixPunctuation } from "./punctuation2.js";
84
+ import { recordResetSubfield6OccurrenceNumbers } from "./reindexSubfield6OccurenceNumbers.js";
85
+ import { sortAdjacentSubfields } from "./sortSubfields.js";
86
+ import { fieldsToString } from "./utils.js";
59
87
  export {
60
88
  AccessRights,
61
89
  AddMissingField041,
@@ -114,6 +142,41 @@ export {
114
142
  UpdateField540,
115
143
  Urn,
116
144
  SortFields,
117
- MergeFields
145
+ MergeFields,
146
+ getEncodingLevel,
147
+ cloneAndRemovePunctuation,
148
+ fieldFixPunctuation,
149
+ fieldToNormalizedString,
150
+ fieldTrimSubfieldValues,
151
+ fieldsToNormalizedString,
152
+ fieldsToString,
153
+ recordFixRelatorTerms,
154
+ sortAdjacentSubfields,
155
+ baseHasEqualOrHigherEncodingLevel,
156
+ deleteAllPrepublicationNotesFromField500InNonPubRecord,
157
+ encodingLevelIsBetterThanPrepublication,
158
+ isEnnakkotietoField,
159
+ isEnnakkotietoSubfield,
160
+ removeWorsePrepubField500s,
161
+ removeWorsePrepubField594s,
162
+ fieldGetOccurrenceNumberPairs,
163
+ get6s,
164
+ fieldGetUnambiguousOccurrenceNumber,
165
+ intToOccurrenceNumberString,
166
+ isValidSubfield6,
167
+ recordGetMaxSubfield6OccurrenceNumberAsInteger,
168
+ recordResetSubfield6OccurrenceNumbers,
169
+ resetSubfield6Tag,
170
+ subfield6ResetOccurrenceNumber,
171
+ subfield6GetOccurrenceNumber,
172
+ subfield6GetOccurrenceNumberAsInteger,
173
+ getSubfield8LinkingNumber,
174
+ isValidSubfield8,
175
+ recordGetAllSubfield8LinkingNumbers,
176
+ recordGetFieldsWithSubfield8LinkingNumber,
177
+ getCounterpart,
178
+ melindaFieldSpecs,
179
+ mergeField,
180
+ postprocessRecords
118
181
  };
119
182
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.js"],
4
- "sourcesContent": ["import AccessRights from './access-rights';\nimport AddMissingField041 from './addMissingField041';\nimport AddMissingField336 from './addMissingField336';\nimport AddMissingField337 from './addMissingField337';\nimport AddMissingField338 from './addMissingField338';\nimport Cyrillux from './cyrillux';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements';\nimport DoubleCommas from './double-commas';\nimport DuplicatesInd1 from './duplicates-ind1';\nimport EmptyFields from './empty-fields';\nimport EndingPunctuation from './ending-punctuation';\nimport EndingWhitespace from './ending-whitespace';\nimport Field008CharacterGroups from './field-008-18-34-character-groups';\nimport Field505Separators from './field-505-separators';\nimport Field521Fix from './field-521-fix';\nimport FieldExclusion from './field-exclusion';\nimport FieldStructure from './field-structure';\nimport FieldsPresent from './fields-present';\nimport Fix33X from './fix-33X';\nimport FixCountryCodes from './fix-country-codes';\nimport FixLanguageCodes from './fix-language-codes';\nimport FixRelatorTerms from './fixRelatorTerms';\nimport FixedFields from './fixed-fields';\nimport IdenticalFields from './identical-fields';\nimport IndicatorFixes from './indicator-fixes';\nimport IsbnIssn from './isbn-issn';\nimport ItemLanguage from './item-language';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset';\nimport MergeFields from './merge-fields/';\nimport MergeRelatorTermFields from './mergeRelatorTermFields';\nimport Modernize502 from './modernize-502';\nimport MultipleSubfield0s from './multiple-subfield-0';\nimport NonBreakingSpace from './non-breaking-space';\nimport NormalizeDashes from './normalize-dashes';\nimport NormalizeIdentifiers from './normalize-identifiers';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics';\nimport Punctuation from './punctuation/';\nimport Punctuation2 from './punctuation2';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields';\nimport RemoveInferiorDataFields from './removeInferiorDataFields';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes';\nimport SortFields from './sortFields';\nimport SortRelatorTerms from './sortRelatorTerms';\nimport SortSubfields from './sortSubfields';\nimport SortTags from './sort-tags';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations';\nimport SubfieldExclusion from './subfield-exclusion';\nimport Sync007And300 from './sync-007-and-300';\nimport TranslateTerms from './translate-terms';\nimport TypeOfDateF008 from './typeOfDate-008';\nimport UnicodeDecomposition from './unicode-decomposition';\nimport UpdateField540 from './update-field-540';\nimport Urn from './urn';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n TypeOfDateF008,\n TranslateTerms,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields // Run this last *iff* you want to use this at all\n};\n"],
5
- "mappings": "AAAA,OAAO,kBAAkB;AACzB,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,wBAAwB;AAC/B,OAAO,cAAc;AACrB,OAAO,kCAAkC;AACzC,OAAO,kCAAkC;AACzC,OAAO,kBAAkB;AACzB,OAAO,oBAAoB;AAC3B,OAAO,iBAAiB;AACxB,OAAO,uBAAuB;AAC9B,OAAO,sBAAsB;AAC7B,OAAO,6BAA6B;AACpC,OAAO,wBAAwB;AAC/B,OAAO,iBAAiB;AACxB,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAC3B,OAAO,mBAAmB;AAC1B,OAAO,YAAY;AACnB,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AAC7B,OAAO,qBAAqB;AAC5B,OAAO,iBAAiB;AACxB,OAAO,qBAAqB;AAC5B,OAAO,oBAAoB;AAC3B,OAAO,cAAc;AACrB,OAAO,kBAAkB;AACzB,OAAO,gCAAgC;AACvC,OAAO,iBAAiB;AACxB,OAAO,4BAA4B;AACnC,OAAO,kBAAkB;AACzB,OAAO,wBAAwB;AAC/B,OAAO,sBAAsB;AAC7B,OAAO,qBAAqB;AAC5B,OAAO,0BAA0B;AACjC,OAAO,oCAAoC;AAC3C,OAAO,6BAA6B;AACpC,OAAO,iBAAiB;AACxB,OAAO,kBAAkB;AACzB,OAAO,sCAAsC;AAC7C,OAAO,+BAA+B;AACtC,OAAO,8BAA8B;AACrC,OAAO,6BAA6B;AACpC,OAAO,+BAA+B;AACtC,OAAO,mCAAmC;AAC1C,OAAO,gBAAgB;AACvB,OAAO,sBAAsB;AAC7B,OAAO,mBAAmB;AAC1B,OAAO,cAAc;AAErB,OAAO,iCAAiC;AACxC,OAAO,uBAAuB;AAC9B,OAAO,mBAAmB;AAC1B,OAAO,oBAAoB;AAC3B,OAAO,oBAAoB;AAC3B,OAAO,0BAA0B;AACjC,OAAO,oBAAoB;AAC3B,OAAO,SAAS;AAEhB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;",
4
+ "sourcesContent": ["import AccessRights from './access-rights.js';\nimport AddMissingField041 from './addMissingField041.js';\nimport AddMissingField336 from './addMissingField336.js';\nimport AddMissingField337 from './addMissingField337.js';\nimport AddMissingField338 from './addMissingField338.js';\nimport Cyrillux from './cyrillux.js';\nimport CyrilluxUsemarconReplacement from './cyrillux-usemarcon-replacement.js';\nimport DisambiguateSeriesStatements from './disambiguateSeriesStatements.js';\nimport DoubleCommas from './double-commas.js';\nimport DuplicatesInd1 from './duplicates-ind1.js';\nimport EmptyFields from './empty-fields.js';\nimport EndingPunctuation from './ending-punctuation.js';\nimport EndingWhitespace from './ending-whitespace.js';\nimport Field008CharacterGroups from './field-008-18-34-character-groups.js';\nimport Field505Separators from './field-505-separators.js';\nimport Field521Fix from './field-521-fix.js';\nimport FieldExclusion from './field-exclusion.js';\nimport FieldStructure from './field-structure.js';\nimport FieldsPresent from './fields-present.js';\nimport Fix33X from './fix-33X.js';\nimport FixCountryCodes from './fix-country-codes.js';\nimport FixLanguageCodes from './fix-language-codes.js';\nimport FixRelatorTerms from './fixRelatorTerms.js';\nimport FixedFields from './fixed-fields.js';\nimport IdenticalFields from './identical-fields.js';\nimport IndicatorFixes from './indicator-fixes.js';\nimport IsbnIssn from './isbn-issn.js';\nimport ItemLanguage from './item-language.js';\nimport MergeField500Lisapainokset from './mergeField500Lisapainokset.js';\nimport MergeFields from './merge-fields/index.js';\nimport MergeRelatorTermFields from './mergeRelatorTermFields.js';\nimport Modernize502 from './modernize-502.js';\nimport MultipleSubfield0s from './multiple-subfield-0.js';\nimport NonBreakingSpace from './non-breaking-space.js';\nimport NormalizeDashes from './normalize-dashes.js';\nimport NormalizeIdentifiers from './normalize-identifiers.js';\nimport NormalizeQualifyingInformation from './normalize-qualifying-information.js';\nimport NormalizeUTF8Diacritics from './normalize-utf8-diacritics.js';\nimport Punctuation from './punctuation/index.js';\nimport Punctuation2 from './punctuation2.js';\nimport ReindexSubfield6OccurenceNumbers from './reindexSubfield6OccurenceNumbers.js';\nimport RemoveDuplicateDataFields from './removeDuplicateDataFields.js';\nimport RemoveInferiorDataFields from './removeInferiorDataFields.js';\nimport ResolvableExtReferences from './resolvable-ext-references-melinda.js';\nimport ResolveOrphanedSubfield6s from './resolveOrphanedSubfield6s.js';\nimport SanitizeVocabularySourceCodes from './sanitize-vocabulary-source-codes.js';\nimport SortFields from './sortFields.js';\nimport SortRelatorTerms from './sortRelatorTerms.js';\nimport SortSubfields from './sortSubfields.js';\nimport SortTags from './sort-tags.js';\n// import StripPunctuation from './stripPunctuation'; // Can we add this here? Should be used very cautiosly!\nimport SubfieldValueNormalizations from './subfieldValueNormalizations.js';\nimport SubfieldExclusion from './subfield-exclusion.js';\nimport Sync007And300 from './sync-007-and-300.js';\nimport TranslateTerms from './translate-terms.js';\nimport TypeOfDateF008 from './typeOfDate-008.js';\nimport UnicodeDecomposition from './unicode-decomposition.js';\nimport UpdateField540 from './update-field-540.js';\nimport Urn from './urn.js';\n\nimport {getCounterpart} from './merge-fields/counterpartField.js';\n\nimport {postprocessRecords} from './merge-fields/mergeOrAddPostprocess.js';\nimport {mergeField} from './merge-fields/mergeField.js';\nimport {fieldGetOccurrenceNumberPairs, fieldGetUnambiguousOccurrenceNumber, fieldToNormalizedString, fieldsToNormalizedString, get6s,\n isValidSubfield6, recordGetMaxSubfield6OccurrenceNumberAsInteger,\n intToOccurrenceNumberString, resetSubfield6Tag, subfield6ResetOccurrenceNumber, subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger} from './subfield6Utils.js';\n\nimport {getSubfield8LinkingNumber, isValidSubfield8, recordGetAllSubfield8LinkingNumbers, recordGetFieldsWithSubfield8LinkingNumber} from './subfield8Utils.js';\n\nimport {recordFixRelatorTerms} from './fixRelatorTerms.js';\nimport {fieldTrimSubfieldValues} from './normalizeFieldForComparison.js';\nimport {baseHasEqualOrHigherEncodingLevel, deleteAllPrepublicationNotesFromField500InNonPubRecord, encodingLevelIsBetterThanPrepublication, getEncodingLevel, isEnnakkotietoField, isEnnakkotietoSubfield} from './prepublicationUtils.js';\nimport {melindaFieldSpecs} from '@natlibfi/marc-record-validators-melinda/dist/melindaCustomMergeFields.js';\n\nimport {cloneAndRemovePunctuation} from './normalizeFieldForComparison.js';\nimport {removeWorsePrepubField500s, removeWorsePrepubField594s} from './prepublicationUtils.js';\nimport {fieldFixPunctuation} from './punctuation2.js';\nimport {recordResetSubfield6OccurrenceNumbers} from './reindexSubfield6OccurenceNumbers.js';\nimport {sortAdjacentSubfields} from './sortSubfields.js';\nimport {fieldsToString} from './utils.js';\n\nexport {\n AccessRights,\n AddMissingField041,\n AddMissingField336,\n AddMissingField337,\n AddMissingField338,\n Cyrillux,\n CyrilluxUsemarconReplacement,\n DisambiguateSeriesStatements,\n DoubleCommas,\n DuplicatesInd1,\n EmptyFields,\n EndingPunctuation,\n EndingWhitespace,\n Field008CharacterGroups,\n Field505Separators,\n Field521Fix,\n FieldExclusion,\n FieldsPresent,\n FieldStructure,\n Fix33X,\n FixCountryCodes,\n FixLanguageCodes,\n FixRelatorTerms,\n FixedFields,\n IdenticalFields,\n IndicatorFixes,\n IsbnIssn,\n ItemLanguage,\n MergeField500Lisapainokset,\n MergeRelatorTermFields,\n Modernize502, //\n MultipleSubfield0s,\n NonBreakingSpace,\n NormalizeDashes,\n NormalizeIdentifiers,\n NormalizeQualifyingInformation,\n NormalizeUTF8Diacritics,\n Punctuation,\n Punctuation2,\n ResolveOrphanedSubfield6s, // Do this before reindexing! (thus I'm not sticking with alphabetical order here)\n ReindexSubfield6OccurenceNumbers,\n RemoveDuplicateDataFields,\n RemoveInferiorDataFields,\n ResolvableExtReferences,\n SanitizeVocabularySourceCodes,\n SortRelatorTerms,\n SortSubfields,\n SortTags,\n SubfieldExclusion,\n SubfieldValueNormalizations,\n Sync007And300,\n TypeOfDateF008,\n TranslateTerms,\n UnicodeDecomposition,\n UpdateField540,\n Urn,\n SortFields, // Keep this penultimate\n MergeFields, // Run this last *iff* you want to use this at all\n\n // Functions for processing record... These should probably go to some other project.\n // Too specific for marc-record-js though...\n // 1. generic low level stuff\n getEncodingLevel,\n\n // 2. text normalizations (eg. for similarity comparisons, field merge)\n cloneAndRemovePunctuation,\n fieldFixPunctuation,\n fieldToNormalizedString,\n fieldTrimSubfieldValues,\n fieldsToNormalizedString,\n fieldsToString,\n recordFixRelatorTerms,\n sortAdjacentSubfields,\n\n // 3. prepublication stuff\n baseHasEqualOrHigherEncodingLevel,\n deleteAllPrepublicationNotesFromField500InNonPubRecord,\n encodingLevelIsBetterThanPrepublication,\n isEnnakkotietoField,\n isEnnakkotietoSubfield,\n removeWorsePrepubField500s,\n removeWorsePrepubField594s,\n\n // 4. subfield $6 related functions\n fieldGetOccurrenceNumberPairs,\n get6s,\n fieldGetUnambiguousOccurrenceNumber,\n intToOccurrenceNumberString,\n isValidSubfield6,\n recordGetMaxSubfield6OccurrenceNumberAsInteger,\n recordResetSubfield6OccurrenceNumbers,\n resetSubfield6Tag,\n subfield6ResetOccurrenceNumber,\n subfield6GetOccurrenceNumber,\n subfield6GetOccurrenceNumberAsInteger,\n\n // 5. subfield $8 related functions\n getSubfield8LinkingNumber,\n isValidSubfield8,\n recordGetAllSubfield8LinkingNumbers,\n recordGetFieldsWithSubfield8LinkingNumber,\n\n // 6. merge, other\n getCounterpart, // field merge: finds a similar field with which a field can merge\n melindaFieldSpecs, // contains information about the legal fields and subfields, and their repeatability\n mergeField,\n postprocessRecords // clean-up function that cleans up both base and source record (which may be the same)\n\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -165,7 +165,7 @@ function getLanguages(record) {
165
165
  return true;
166
166
  }
167
167
  }
168
- export function recordNormalizeIndicators(record) {
168
+ function recordNormalizeIndicators(record) {
169
169
  recordNormalize490(record);
170
170
  const languages = getLanguages(record);
171
171
  record.fields.forEach((field) => fieldNormalizeIndicators(field, record, languages));
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/indicator-fixes.js"],
4
- "sourcesContent": ["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\nimport {fieldToString} from './utils.js';\n\n\nexport default function () {\n\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n recordNormalizeIndicators(record);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1;\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) {\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);\n }\n if (clonedFields[index].ind2 !== field.ind2) {\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields;\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^de[nt] /u) && !name.match(/^de[nt] som /u)) {\n return '4';\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^a /u) && !languages.includes('hun') && !name.match(/^a (?:b |la )/u)) { // Skip \"a b c\", \"a la carte\"...\n return '2';\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages);\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages);\n}\n\nconst fiktiivisenAineistonLisaluokatFI = ['El\u00E4imet', 'Erotiikka', 'Er\u00E4', 'Fantasia', 'Historia', 'Huumori', 'J\u00E4nnitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];\n\nfunction containsFiktiivisenAineistonLisaluokka(field) {\n // Should we check Swedish versions as well?\n return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));\n}\n\nfunction normalize084Indicator1(field) {\n if (field.tag !== '084') {\n return;\n }\n\n // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka\n if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {\n field.ind1 = '9';\n return;\n }\n}\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1';\n}\n\nfunction normalize776Indicator2(field) {\n if (field.tag !== '776') {\n return;\n }\n // If subfield $i exists, ind2 must me '8'\n if (field.subfields.some(sf => sf.code === 'i')) {\n field.ind2 = '8';\n return;\n }\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1';\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0';\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (!['a', 'd', 'h'].includes(subfield.code)) {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nexport function recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize084Indicator1(field);\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n normalize776Indicator2(field);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Relocated from melinda-marc-record-merge-reducers (and renamed)\n//import createDebugLogger from 'debug';\n//const debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:normalizeIdentifiers');\n\nimport {fieldToString} from './utils.js';\n\n\nexport default function () {\n\n return {\n description: 'Normalizes indicator values',\n validate, fix\n };\n\n function fix(record) {\n const res = {message: [], fix: [], valid: true};\n\n recordNormalizeIndicators(record);\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n validateRecord(record, res);\n\n res.valid = res.message.length < 1;\n return res;\n }\n\n\n function validateRecord(record, res) {\n //nvdebug(record);\n const clonedFields = JSON.parse(JSON.stringify(record.fields));\n recordNormalizeIndicators(record);\n\n record.fields.forEach((field, index) => compareFields(field, index));\n\n function compareFields(field, index) {\n const origFieldAsString = fieldToString(clonedFields[index]);\n //const clonedFieldAsString = fieldToString(field);\n if (clonedFields[index].ind1 !== field.ind1) {\n //nvdebug(`FIX IND1: '${clonedFields[index].ind1}' => '${field.ind1}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND1 for '${origFieldAsString}' is '${field.ind1}'`);\n }\n if (clonedFields[index].ind2 !== field.ind2) {\n //nvdebug(`FIX IND2: '${clonedFields[index].ind2}' => '${field.ind2}': ${clonedFieldAsString}`);\n res.message.push(`Expected IND2 for '${origFieldAsString}' is '${field.ind2}'`);\n }\n }\n // Validator should not change the original record:\n record.fields = clonedFields;\n return;\n }\n}\n\n\nconst ind1NonFilingChars = ['130', '630', '730', '740'];\nconst ind2NonFilingChars = ['222', '240', '242', '243', '245', '830'];\n\nfunction hasNonFilingIndicator1(field) {\n return ind1NonFilingChars.includes(field.tag);\n}\n\nfunction modifiableIndicatorValue(value) {\n // If field contains a legit-looking value, don't try to modify it here...\n return !['9', '8', '7', '6', '5', '4', '3', '2', '1'].includes(value);\n}\n\nfunction hasNonFilingIndicator2(field) {\n return ind2NonFilingChars.includes(field.tag);\n}\n\nfunction valueBeginsWithDeterminer(value, cands) {\n return cands.find(cand => value.substring(0, cand.length) === cand);\n}\n\nfunction determineNonFilingIndicatorValue(field, languages = undefined) {\n const subfieldA = field.subfields.find(sf => sf.code === 'a');\n if (!subfieldA) {\n // nvdebug(' Subfield $a miss!');\n return;\n }\n\n const name = subfieldA.value.toLowerCase();\n\n if (languages.includes('eng')) {\n const match = valueBeginsWithDeterminer(name, ['a ', 'an ', 'the ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('fre')) {\n const match = valueBeginsWithDeterminer(name, ['l\\'', 'le ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('ger')) {\n const match = valueBeginsWithDeterminer(name, ['das ', 'der ', 'die ']);\n if (match) {\n return `${match.length}`;\n }\n }\n\n if (languages.includes('swe')) {\n const match = valueBeginsWithDeterminer(name, ['en ', 'ett ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^de[nt] /u) && !name.match(/^de[nt] som /u)) {\n return '4';\n }\n }\n\n // Fallback-ish: try to guess even without languages:\n const match = valueBeginsWithDeterminer(name, ['the ']);\n if (match) {\n return `${match.length}`;\n }\n if (name.match(/^a /u) && !languages.includes('hun') && !name.match(/^a (?:b |la )/u)) { // Skip \"a b c\", \"a la carte\"...\n return '2';\n }\n\n return '0';\n}\n\nfunction normalizeNonFilingIndicator1(field, languages = []) {\n if (!hasNonFilingIndicator1(field) || !modifiableIndicatorValue(field.ind1)) {\n return;\n }\n\n field.ind1 = determineNonFilingIndicatorValue(field, languages);\n}\n\nfunction normalizeNonFilingIndicator2(field, languages = []) {\n if (!hasNonFilingIndicator2(field) || !modifiableIndicatorValue(field.ind2)) {\n return;\n }\n\n field.ind2 = determineNonFilingIndicatorValue(field, languages);\n}\n\nconst fiktiivisenAineistonLisaluokatFI = ['El\u00E4imet', 'Erotiikka', 'Er\u00E4', 'Fantasia', 'Historia', 'Huumori', 'J\u00E4nnitys', 'Kauhu', 'Novellit', 'Romantiikka', 'Scifi', 'Sota', 'Urheilu', 'Uskonto'];\n\nfunction containsFiktiivisenAineistonLisaluokka(field) {\n // Should we check Swedish versions as well?\n return field.subfields.some(sf => sf.code === 'a' && fiktiivisenAineistonLisaluokatFI.includes(sf.value));\n}\n\nfunction normalize084Indicator1(field) {\n if (field.tag !== '084') {\n return;\n }\n\n // https://marc21.kansalliskirjasto.fi/bib/05X-08X.htm#084 and https://finto.fi/ykl/fi/page/fiktioluokka\n if (field.ind1 !== '9' && containsFiktiivisenAineistonLisaluokka(field) && field.subfields.some(sf => sf.code === '2' && sf.value === 'ykl')) {\n field.ind1 = '9';\n return;\n }\n}\n\nfunction normalize245Indicator1(field, record) {\n if (field.tag !== '245') {\n return;\n }\n const field1XX = record.get('^1..$');\n field.ind1 = field1XX.length === 0 ? '0' : '1';\n}\n\nfunction normalize776Indicator2(field) {\n if (field.tag !== '776') {\n return;\n }\n // If subfield $i exists, ind2 must me '8'\n if (field.subfields.some(sf => sf.code === 'i')) {\n field.ind2 = '8';\n return;\n }\n}\n\n\nfunction recordNormalize490(record) {\n const fields490 = record.get('^490$');\n const fields8XX = record.get('^(?:800|810|811|830)$');\n\n if (fields490.length === 0) {\n return;\n }\n if (fields490.length <= fields8XX.length) {\n // Trace found for each field 490:\n fields490.forEach(f => {\n f.ind1 = '1';\n });\n return;\n }\n if (fields8XX.length === 0) { // Fields 490 are always untraced (no traces found)\n fields490.forEach(f => {\n f.ind1 = '0';\n });\n return;\n }\n // For other combinations we just can't be sure, so leave them as they are.\n}\n\n\nfunction getLanguages(record) {\n const langFields = record.get('^041$');\n\n if (langFields.length === 0) {\n return [];\n }\n\n return langFields[0].subfields.filter(sf => isRelevantSubfield(sf)).map(subfield => subfield.value);\n\n function isRelevantSubfield(subfield) {\n if (!['a', 'd', 'h'].includes(subfield.code)) {\n return false;\n }\n if (subfield.value.length !== 3) {\n return false;\n }\n // We could require /^[a-z][a-z][a-z]$/ etc as well, but it's not really that relevant.\n return true;\n }\n\n}\n\nfunction recordNormalizeIndicators(record) {\n recordNormalize490(record);\n\n // Language is used to handle non-filing indicators\n const languages = getLanguages(record);\n\n record.fields.forEach(field => fieldNormalizeIndicators(field, record, languages));\n\n}\n\nfunction fieldNormalizeIndicators(field, record, languages) {\n normalize084Indicator1(field);\n normalize245Indicator1(field, record);\n normalizeNonFilingIndicator1(field, languages);\n normalizeNonFilingIndicator2(field, languages);\n normalize776Indicator2(field);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["match"]
7
7
  }
@@ -1,4 +1,4 @@
1
- export const melindaCustomMergeFields = { "fields": [
1
+ export const melindaFieldSpecs = { "fields": [
2
2
  {
3
3
  "tag": "leader",
4
4
  "repeatable": false,