@natlibfi/marc-record-validators-melinda 11.3.2 → 11.3.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/access-rights.js +24 -19
- package/dist/access-rights.js.map +1 -1
- package/dist/melindaCustomMergeFields.js +11236 -0
- package/dist/melindaCustomMergeFields.js.map +1 -0
- package/dist/merge-fields/index.js +6 -5
- package/dist/merge-fields/index.js.map +1 -1
- package/dist/merge-fields/mergeConfig.js +175 -0
- package/dist/merge-fields/mergeConfig.js.map +1 -0
- package/dist/sortSubfields.js +5 -0
- package/dist/sortSubfields.js.map +1 -1
- package/dist/utils.js +8 -5
- package/dist/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/access-rights.js +21 -21
- package/src/melindaCustomMergeFields.js +5142 -0
- package/src/merge-fields/index.js +5 -3
- package/src/merge-fields/mergeConfig.js +69 -0
- package/src/sortSubfields.js +1 -0
- package/src/utils.js +4 -3
- package/dist/merge-fields/config.json +0 -83
- package/src/merge-fields/config.json +0 -83
|
@@ -4,12 +4,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = _default;
|
|
7
|
-
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
-
var _path = _interopRequireDefault(require("path"));
|
|
9
7
|
var _mergeField = require("./mergeField");
|
|
10
8
|
var _marcRecord = require("@natlibfi/marc-record");
|
|
11
9
|
var _mergeOrAddPostprocess = require("./mergeOrAddPostprocess.js");
|
|
12
|
-
|
|
10
|
+
var _mergeConfig = require("./mergeConfig.js");
|
|
13
11
|
// NB! This validator is build on code that merged two different records originally in marc-record-merge-reducers.
|
|
14
12
|
// The idea was to write a validator that can merge fields in one record. (This is a good idea at least for field tags /^[1678](00|10|11|30)$/.)
|
|
15
13
|
// As we don't want copypaste coding everything was moved here, and marc-record-merge-reducers exports mergeField() function.
|
|
@@ -17,9 +15,12 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
17
15
|
// and the test coverage is low. The extensive set of tests in in marc-record-merge-reducers for this code.
|
|
18
16
|
|
|
19
17
|
//import createDebugLogger from 'debug';
|
|
18
|
+
//import fs from 'fs';
|
|
19
|
+
//import path from 'path';
|
|
20
20
|
|
|
21
21
|
const description = 'Merge fields within record';
|
|
22
|
-
const defaultConfig = JSON.parse(
|
|
22
|
+
//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'merge-fields', 'config.json'), 'utf8'));
|
|
23
|
+
|
|
23
24
|
function _default() {
|
|
24
25
|
return {
|
|
25
26
|
description,
|
|
@@ -38,7 +39,7 @@ function _default() {
|
|
|
38
39
|
mergeFieldsWithinRecord(record, config);
|
|
39
40
|
}
|
|
40
41
|
function fix(record, config = undefined) {
|
|
41
|
-
const config2 = config ||
|
|
42
|
+
const config2 = config || _mergeConfig.mergeConfig;
|
|
42
43
|
record.internalMerge = true; // eslint-disable-line functional/immutable-data
|
|
43
44
|
mergeFieldsWithinRecord(record, config2);
|
|
44
45
|
delete record.internalMerge; // eslint-disable-line functional/immutable-data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["_mergeField","require","_marcRecord","_mergeOrAddPostprocess","_mergeConfig","description","_default","validate","fix","mergeFieldsWithinRecord","record","config","fields","tagPattern","get","reverse","mergedField","find","f","mergeField","removeField","undefined","config2","defaultConfig","internalMerge","postprocessRecords","res","message","valid","nFields","length","clonedRecord","MarcRecord","subfieldValues","nFields2","msg"],"sources":["../../src/merge-fields/index.js"],"sourcesContent":["// NB! This validator is build on code that merged two different records originally in marc-record-merge-reducers.\n// The idea was to write a validator that can merge fields in one record. (This is a good idea at least for field tags /^[1678](00|10|11|30)$/.)\n// As we don't want copypaste coding everything was moved here, and marc-record-merge-reducers exports mergeField() function.\n// That function uses a lot of stuff that is meant for the two-record-merge case only. Thus the tests for this validator are pretty limited here,\n// and the test coverage is low. The extensive set of tests in in marc-record-merge-reducers for this code.\n\n\n//import createDebugLogger from 'debug';\n//import fs from 'fs';\n//import path from 'path';\nimport {mergeField} from './mergeField';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {postprocessRecords} from './mergeOrAddPostprocess.js';\n\nconst description = 'Merge fields within record';\n\nimport {mergeConfig as defaultConfig} from './mergeConfig.js';\n\n//const defaultConfig = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'src', 'merge-fields', 'config.json'), 'utf8'));\n\nexport default function () {\n\n return {\n description, validate, fix\n };\n\n\n function mergeFieldsWithinRecord(record, config) {\n //const candFields = record.fields.toReversed(); // Node 20+ only! Filter via config?\n const fields = config && config.tagPattern ? record.get(config.tagPattern) : record.get(/^[1678](?:00|10|11|30)$/u);\n\n fields.reverse(); // eslint-disable-line functional/immutable-data\n const mergedField = fields.find(f => mergeField(record, record, f, config));\n if (!mergedField) {\n return;\n }\n record.removeField(mergedField);\n mergeFieldsWithinRecord(record, config);\n\n }\n\n function fix(record, config = undefined) {\n const config2 = config || defaultConfig;\n record.internalMerge = true; // eslint-disable-line functional/immutable-data\n mergeFieldsWithinRecord(record, config2);\n delete record.internalMerge; // eslint-disable-line functional/immutable-data\n // Remove deleted fields and field.merged marks:\n postprocessRecords(record, record);\n\n const res = {message: [], fix: [], valid: true};\n return res;\n }\n\n function validate(record, config) {\n //nvdebug(`VALIDATE ${description}...`);\n\n const nFields = record.fields.length;\n const clonedRecord = new MarcRecord(record, {subfieldValues: false});\n fix(clonedRecord, config);\n\n const nFields2 = clonedRecord.fields.length;\n if (nFields === nFields2) {\n return {message: [], valid: true};\n }\n\n const msg = `${description}: number of fields changes from ${nFields} to ${nFields2}`;\n return {message: [msg], valid: false};\n }\n\n}\n\n"],"mappings":";;;;;;AAUA,IAAAA,WAAA,GAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,sBAAA,GAAAF,OAAA;AAIA,IAAAG,YAAA,GAAAH,OAAA;AAhBA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;;AAKA,MAAMI,WAAW,GAAG,4BAA4B;AAIhD;;AAEe,SAAAC,SAAA,EAAY;EAEzB,OAAO;IACLD,WAAW;IAAEE,QAAQ;IAAEC;EACzB,CAAC;EAGD,SAASC,uBAAuBA,CAACC,MAAM,EAAEC,MAAM,EAAE;IAC/C;IACA,MAAMC,MAAM,GAAGD,MAAM,IAAIA,MAAM,CAACE,UAAU,GAAGH,MAAM,CAACI,GAAG,CAACH,MAAM,CAACE,UAAU,CAAC,GAAGH,MAAM,CAACI,GAAG,CAAC,0BAA0B,CAAC;IAEnHF,MAAM,CAACG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,MAAMC,WAAW,GAAGJ,MAAM,CAACK,IAAI,CAACC,CAAC,IAAI,IAAAC,sBAAU,EAACT,MAAM,EAAEA,MAAM,EAAEQ,CAAC,EAAEP,MAAM,CAAC,CAAC;IAC3E,IAAI,CAACK,WAAW,EAAE;MAChB;IACF;IACAN,MAAM,CAACU,WAAW,CAACJ,WAAW,CAAC;IAC/BP,uBAAuB,CAACC,MAAM,EAAEC,MAAM,CAAC;EAEzC;EAEA,SAASH,GAAGA,CAACE,MAAM,EAAEC,MAAM,GAAGU,SAAS,EAAE;IACvC,MAAMC,OAAO,GAAGX,MAAM,IAAIY,wBAAa;IACvCb,MAAM,CAACc,aAAa,GAAG,IAAI,CAAC,CAAC;IAC7Bf,uBAAuB,CAACC,MAAM,EAAEY,OAAO,CAAC;IACxC,OAAOZ,MAAM,CAACc,aAAa,CAAC,CAAC;IAC7B;IACA,IAAAC,yCAAkB,EAACf,MAAM,EAAEA,MAAM,CAAC;IAElC,MAAMgB,GAAG,GAAG;MAACC,OAAO,EAAE,EAAE;MAAEnB,GAAG,EAAE,EAAE;MAAEoB,KAAK,EAAE;IAAI,CAAC;IAC/C,OAAOF,GAAG;EACZ;EAEA,SAASnB,QAAQA,CAACG,MAAM,EAAEC,MAAM,EAAE;IAChC;;IAEA,MAAMkB,OAAO,GAAGnB,MAAM,CAACE,MAAM,CAACkB,MAAM;IACpC,MAAMC,YAAY,GAAG,IAAIC,sBAAU,CAACtB,MAAM,EAAE;MAACuB,cAAc,EAAE;IAAK,CAAC,CAAC;IACpEzB,GAAG,CAACuB,YAAY,EAAEpB,MAAM,CAAC;IAEzB,MAAMuB,QAAQ,GAAGH,YAAY,CAACnB,MAAM,CAACkB,MAAM;IAC3C,IAAID,OAAO,KAAKK,QAAQ,EAAE;MACxB,OAAO;QAACP,OAAO,EAAE,EAAE;QAAEC,KAAK,EAAE;MAAI,CAAC;IACnC;IAEA,MAAMO,GAAG,GAAG,GAAG9B,WAAW,mCAAmCwB,OAAO,OAAOK,QAAQ,EAAE;IACrF,OAAO;MAACP,OAAO,EAAE,CAACQ,GAAG,CAAC;MAAEP,KAAK,EAAE;IAAK,CAAC;EACvC;AAEF","ignoreList":[]}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mergeConfig = void 0;
|
|
7
|
+
const mergeConfig = exports.mergeConfig = {
|
|
8
|
+
'mergeConfiguration': {
|
|
9
|
+
'comment #1': 'Meaningless indicators (=indicators having but one legal value) are derived from melindaCustomMergeFields.',
|
|
10
|
+
'comment #2': 'Meaningless indicators and non-filing indicators never prevent merge. (Hard-coded in mergableIndicator.js)',
|
|
11
|
+
'comment #3': 'When merging, indicator preference defaults are defined in mergeIndicators.js. However, these can be overridden here.',
|
|
12
|
+
'indicator1PreferredValues': {
|
|
13
|
+
'022': {
|
|
14
|
+
'0': 1,
|
|
15
|
+
'1': 1,
|
|
16
|
+
' ': 2
|
|
17
|
+
},
|
|
18
|
+
'041': {
|
|
19
|
+
'0': 1,
|
|
20
|
+
'1': 1,
|
|
21
|
+
' ': 2
|
|
22
|
+
},
|
|
23
|
+
'246': {
|
|
24
|
+
'0': 1,
|
|
25
|
+
'1': 1,
|
|
26
|
+
'2': 1,
|
|
27
|
+
'3': 1,
|
|
28
|
+
' ': 2
|
|
29
|
+
},
|
|
30
|
+
'341': {
|
|
31
|
+
'0': 1,
|
|
32
|
+
'1': 1,
|
|
33
|
+
' ': 2
|
|
34
|
+
},
|
|
35
|
+
'363': {
|
|
36
|
+
'0': 1,
|
|
37
|
+
'1': 1,
|
|
38
|
+
' ': 2
|
|
39
|
+
},
|
|
40
|
+
'382': {
|
|
41
|
+
'0': 1,
|
|
42
|
+
'1': 1,
|
|
43
|
+
'2': 1,
|
|
44
|
+
'3': 1,
|
|
45
|
+
' ': 2
|
|
46
|
+
},
|
|
47
|
+
'384': {
|
|
48
|
+
'0': 1,
|
|
49
|
+
'1': 1,
|
|
50
|
+
' ': 2
|
|
51
|
+
},
|
|
52
|
+
'388': {
|
|
53
|
+
'0': 1,
|
|
54
|
+
'1': 1,
|
|
55
|
+
' ': 2
|
|
56
|
+
},
|
|
57
|
+
'490': ['1', '0'],
|
|
58
|
+
'505': ['8', '0', '2', '1'],
|
|
59
|
+
'506': {
|
|
60
|
+
'0': 1,
|
|
61
|
+
'1': 1,
|
|
62
|
+
' ': 2
|
|
63
|
+
},
|
|
64
|
+
'541': {
|
|
65
|
+
'0': 1,
|
|
66
|
+
'1': 1,
|
|
67
|
+
' ': 2
|
|
68
|
+
},
|
|
69
|
+
'542': {
|
|
70
|
+
'0': 1,
|
|
71
|
+
'1': 1,
|
|
72
|
+
' ': 2
|
|
73
|
+
},
|
|
74
|
+
'544': {
|
|
75
|
+
'0': 1,
|
|
76
|
+
'1': 1,
|
|
77
|
+
' ': 2
|
|
78
|
+
},
|
|
79
|
+
'545': {
|
|
80
|
+
'0': 1,
|
|
81
|
+
'1': 1,
|
|
82
|
+
' ': 2
|
|
83
|
+
},
|
|
84
|
+
'561': {
|
|
85
|
+
'0': 1,
|
|
86
|
+
'1': 1,
|
|
87
|
+
' ': 2
|
|
88
|
+
},
|
|
89
|
+
'583': {
|
|
90
|
+
'0': 1,
|
|
91
|
+
'1': 1,
|
|
92
|
+
' ': 2
|
|
93
|
+
},
|
|
94
|
+
'588': {
|
|
95
|
+
'0': 1,
|
|
96
|
+
'1': 1,
|
|
97
|
+
' ': 2
|
|
98
|
+
},
|
|
99
|
+
'650': [' ', '1', '2', '0']
|
|
100
|
+
},
|
|
101
|
+
'indicator2PreferredValues': {
|
|
102
|
+
'024': {
|
|
103
|
+
'0': 1,
|
|
104
|
+
'1': 1,
|
|
105
|
+
' ': 2
|
|
106
|
+
},
|
|
107
|
+
'033': {
|
|
108
|
+
'0': 1,
|
|
109
|
+
'1': 1,
|
|
110
|
+
'2': 1,
|
|
111
|
+
' ': 2
|
|
112
|
+
},
|
|
113
|
+
'246': {
|
|
114
|
+
'0': 1,
|
|
115
|
+
'1': 1,
|
|
116
|
+
'2': 1,
|
|
117
|
+
'3': 1,
|
|
118
|
+
'4': 1,
|
|
119
|
+
'5': 1,
|
|
120
|
+
'6': 1,
|
|
121
|
+
'7': 1,
|
|
122
|
+
'8': 1,
|
|
123
|
+
' ': 2
|
|
124
|
+
},
|
|
125
|
+
'363': {
|
|
126
|
+
'0': 1,
|
|
127
|
+
'1': 1,
|
|
128
|
+
' ': 2
|
|
129
|
+
},
|
|
130
|
+
'382': {
|
|
131
|
+
'0': 1,
|
|
132
|
+
'1': 1,
|
|
133
|
+
' ': 2
|
|
134
|
+
},
|
|
135
|
+
'730': ['2', ' ']
|
|
136
|
+
},
|
|
137
|
+
'comment #4': 'List indicators that do not block merge here. Non-filing indicators do not prevent field merge (their support is hard-coded). They are mainly listed here as an example.',
|
|
138
|
+
'ignoreIndicator1': ['100', '110', '111', '130', '210', '242', '245', '246', '247', '307', '490', '505', '506', '510', '511', '516', '520', '521', '522', '524', '526', '583', '586', '600', '610', '630', '650', '651', '655', '700', '710', '730', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788', '800', '810'],
|
|
139
|
+
'ignoreIndicator2': ['017', '222', '240', '242', '243', '245', '760', '762', '765', '767', '770', '773', '774', '775', '776', '777', '786', '787', '788', '830'],
|
|
140
|
+
'comment #5': 'If one indicator has value, and the other has not, it does not necessarily mean mismatch',
|
|
141
|
+
'tolerateBlankIndicator1': ['022', '037', '041', '046', '050', '055', '060', '070', '080', '246', '260', '264', '341', '363', '382', '384', '388', '541', '542', '544', '545', '561', '583', '588', '856'],
|
|
142
|
+
'tolerateBlankIndicator2': ['024', '033', '082', '246', '363', '382', '856'],
|
|
143
|
+
'preprocessorDirectives': [{
|
|
144
|
+
'operation': 'retag',
|
|
145
|
+
'recordType': 'source',
|
|
146
|
+
'fieldSpecification': {
|
|
147
|
+
'tag': '100'
|
|
148
|
+
},
|
|
149
|
+
'comment': 'NB! Retags should check corresponding 880 fields as well.',
|
|
150
|
+
'newTag': '700'
|
|
151
|
+
}, {
|
|
152
|
+
'operation': 'retag',
|
|
153
|
+
'recordType': 'source',
|
|
154
|
+
'fieldSpecification': {
|
|
155
|
+
'tag': '110'
|
|
156
|
+
},
|
|
157
|
+
'newTag': '710'
|
|
158
|
+
}, {
|
|
159
|
+
'operation': 'retag',
|
|
160
|
+
'recordType': 'source',
|
|
161
|
+
'fieldSpecification': {
|
|
162
|
+
'tag': '111'
|
|
163
|
+
},
|
|
164
|
+
'newTag': '711'
|
|
165
|
+
}, {
|
|
166
|
+
'operation': 'retag',
|
|
167
|
+
'recordType': 'source',
|
|
168
|
+
'fieldSpecification': {
|
|
169
|
+
'tag': '130'
|
|
170
|
+
},
|
|
171
|
+
'newTag': '730'
|
|
172
|
+
}]
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=mergeConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mergeConfig.js","names":["mergeConfig","exports"],"sources":["../../src/merge-fields/mergeConfig.js"],"sourcesContent":["export const mergeConfig = {\n 'mergeConfiguration': {\n 'comment #1': 'Meaningless indicators (=indicators having but one legal value) are derived from melindaCustomMergeFields.',\n 'comment #2': 'Meaningless indicators and non-filing indicators never prevent merge. (Hard-coded in mergableIndicator.js)',\n 'comment #3': 'When merging, indicator preference defaults are defined in mergeIndicators.js. However, these can be overridden here.',\n 'indicator1PreferredValues': {\n '022': {'0': 1, '1': 1, ' ': 2},\n '041': {'0': 1, '1': 1, ' ': 2},\n '246': {'0': 1, '1': 1, '2': 1, '3': 1, ' ': 2},\n '341': {'0': 1, '1': 1, ' ': 2},\n '363': {'0': 1, '1': 1, ' ': 2},\n '382': {'0': 1, '1': 1, '2': 1, '3': 1, ' ': 2},\n '384': {'0': 1, '1': 1, ' ': 2},\n '388': {'0': 1, '1': 1, ' ': 2},\n '490': ['1', '0'],\n '505': ['8', '0', '2', '1'],\n '506': {'0': 1, '1': 1, ' ': 2},\n '541': {'0': 1, '1': 1, ' ': 2},\n '542': {'0': 1, '1': 1, ' ': 2},\n '544': {'0': 1, '1': 1, ' ': 2},\n '545': {'0': 1, '1': 1, ' ': 2},\n '561': {'0': 1, '1': 1, ' ': 2},\n '583': {'0': 1, '1': 1, ' ': 2},\n '588': {'0': 1, '1': 1, ' ': 2},\n '650': [' ', '1', '2', '0']\n },\n 'indicator2PreferredValues': {\n '024': {'0': 1, '1': 1, ' ': 2},\n '033': {'0': 1, '1': 1, '2': 1, ' ': 2},\n '246': {'0': 1, '1': 1, '2': 1, '3': 1, '4': 1, '5': 1, '6': 1, '7': 1, '8': 1, ' ': 2},\n '363': {'0': 1, '1': 1, ' ': 2},\n '382': {'0': 1, '1': 1, ' ': 2},\n '730': ['2', ' ']\n },\n 'comment #4': 'List indicators that do not block merge here. Non-filing indicators do not prevent field merge (their support is hard-coded). They are mainly listed here as an example.',\n 'ignoreIndicator1': ['100', '110', '111', '130', '210', '242', '245', '246', '247', '307', '490', '505', '506', '510', '511', '516', '520', '521', '522', '524', '526', '583', '586', '600', '610', '630', '650', '651', '655', '700', '710', '730', '740', '760', '762', '765', '767', '770', '772', '773', '774', '775', '776', '777', '780', '785', '786', '787', '788', '800', '810'],\n 'ignoreIndicator2': ['017', '222', '240', '242', '243', '245', '760', '762', '765', '767', '770', '773', '774', '775', '776', '777', '786', '787', '788', '830'],\n 'comment #5': 'If one indicator has value, and the other has not, it does not necessarily mean mismatch',\n 'tolerateBlankIndicator1': ['022', '037', '041', '046', '050', '055', '060', '070', '080', '246', '260', '264', '341', '363', '382', '384', '388', '541', '542', '544', '545', '561', '583', '588', '856'],\n 'tolerateBlankIndicator2': ['024', '033', '082', '246', '363', '382', '856'],\n 'preprocessorDirectives': [\n {\n 'operation': 'retag',\n 'recordType': 'source',\n 'fieldSpecification': {'tag': '100'},\n 'comment': 'NB! Retags should check corresponding 880 fields as well.',\n 'newTag': '700'\n },\n {\n 'operation': 'retag',\n 'recordType': 'source',\n 'fieldSpecification': {'tag': '110'},\n 'newTag': '710'\n },\n {\n 'operation': 'retag',\n 'recordType': 'source',\n 'fieldSpecification': {'tag': '111'},\n 'newTag': '711'\n },\n {\n 'operation': 'retag',\n 'recordType': 'source',\n 'fieldSpecification': {'tag': '130'},\n 'newTag': '730'\n }\n ]\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
package/dist/sortSubfields.js
CHANGED
|
@@ -217,6 +217,11 @@ const subfieldSortOrder = [{
|
|
|
217
217
|
'sortOrder': ['a', 'n', 'x', 'v']
|
|
218
218
|
},
|
|
219
219
|
// INCOMPLETE, SAME AS 490? APPARENTLY NOT...
|
|
220
|
+
{
|
|
221
|
+
'tag': '856',
|
|
222
|
+
'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']
|
|
223
|
+
},
|
|
224
|
+
// incomplete, LoC examples are inconclusive
|
|
220
225
|
{
|
|
221
226
|
'tag': '880',
|
|
222
227
|
'sortOrder': ['6', 'a']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","tagPattern","description","validate","fix","getRelevantFields","record","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (tagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', '6', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', '6', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', '6', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['6', 'a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '880', 'sortOrder': ['6', 'a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '6', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '6', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"sortSubfields.js","names":["_clone","_interopRequireDefault","require","_debug","_utils","e","__esModule","default","debug","createDebugLogger","debugDev","extend","defaultSortOrderStringFinns","defaultSortOrderStringOthers","defaultSortOrderFinns","split","defaultSortOrderOthers","_default","tagPattern","description","validate","fix","getRelevantFields","record","datafields","fields","filter","f","subfields","regexp","RegExp","test","tag","res","message","valid","relevantFields","forEach","field","sortAdjacentSubfields","clonedField","clone","clonedFieldAsString","fieldToString","fieldAsString","push","length","sortOrderForX00","sortOrderForX10","sortOrderFor7XX","sortOrderFor246","subfieldSortOrder","getSubfieldSortOrder","entry","currEntry","sortOrder","nvdebug","swapSubfields","loopAgain","some","sf","index","currPos","getPosition","prevPos","tmp","subfield","indexOf","code","includes","value","twoBeforeZero","sf2","externalSortOrder","finnishWay","controlSubfieldOrder","sortOrderForField","defaultSortOrder","subfieldOrder"],"sources":["../src/sortSubfields.js"],"sourcesContent":["// Author(s): Nicholas Volk\n\nimport clone from 'clone';\nimport createDebugLogger from 'debug';\nimport {fieldToString, nvdebug} from './utils';\n\nconst debug = createDebugLogger('@natlibfi/marc-record-validators-melinda:sortSubfields');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst defaultSortOrderStringFinns = '8673abcdefghijklmnopqrstuvwxyz420159'; // NB! We Finns like $2 before $0 in 6XX...\nconst defaultSortOrderStringOthers = '8673abcdefghijklmnopqrstuvwxyz402159';\n\nconst defaultSortOrderFinns = defaultSortOrderStringFinns.split('');\nconst defaultSortOrderOthers = defaultSortOrderStringOthers.split('');\n\n\nexport default function (tagPattern) {\n\n return {\n description: 'Swap adjacent subfields',\n validate, fix\n };\n\n function getRelevantFields(record, tagPattern) {\n const datafields = record.fields.filter(f => f.subfields);\n if (!tagPattern) {\n return datafields;\n }\n\n const regexp = new RegExp(tagPattern, 'u');\n return datafields.filter(f => regexp.test(f.tag));\n }\n\n function fix(record, tagPattern) {\n const res = {message: [], fix: [], valid: true};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n sortAdjacentSubfields(field);\n });\n\n return res;\n }\n\n function validate(record) {\n const res = {message: []};\n\n const relevantFields = getRelevantFields(record, tagPattern);\n\n relevantFields.forEach(field => {\n const clonedField = clone(field);\n sortAdjacentSubfields(clonedField);\n const clonedFieldAsString = fieldToString(clonedField);\n const fieldAsString = fieldToString(field);\n if (fieldAsString !== clonedFieldAsString) { // eslint-disable-line functional/no-conditional-statements\n res.message.push(clonedFieldAsString); // eslint-disable-line functional/immutable-data\n }\n });\n\n res.valid = !(res.message.length >= 1); // eslint-disable-line functional/immutable-data\n return res;\n }\n}\n\n\n// X00, X10, X11 and X130 could also for their own sets...\n// (ouch! sometimes $c comes after $d...): LoC: 100 0# ‡a Black Foot, ‡c Chief, ‡d d. 1877 ‡c (Spirit)\nconst sortOrderForX00 = ['6', 'i', 'a', 'b', 'c', 'q', 'd', 'e', 't', 'u', 'l', 'f', 'x', 'y', 'z', '0', '5', '9']; // skip $g. Can't remember why, though...\nconst sortOrderForX10 = ['6', 'i', 'a', 'b', 't', 'n', 'e', 'v', 'w', 'x', 'y', 'z', '0', '5', '9']; // somewhat iffy\nconst sortOrderFor7XX = ['8', '6', '7', 'i', 'a', 's', 't', 'b', 'c', 'd', 'm', 'h', 'k', 'o', 'x', 'z', 'g', 'q', 'w'];\nconst sortOrderFor246 = ['i', 'a', 'b', 'n', 'p', 'f', '5', '9']; // Used by field 946 as well\n\n// List *only* exceptional order here. Otherwise default order is used.\nconst subfieldSortOrder = [\n {'tag': '017', 'sortOrder': ['i', 'a', 'b', 'd']},\n {'tag': '028', 'sortOrder': ['b', 'a', 'q']}, // National convention\n //{'tag': '031', 'sortOrder': ['a', 'b', 'c', 'm', 'e', 'd']}, // utter guesswork\n {'tag': '040', 'sortOrder': ['8', '6', 'a', 'b', 'e', 'c', 'd', 'x']},\n {'tag': '041', 'sortOrder': ['8', '6', 'a', 'd', 'j', 'p', 'h', 'e', 'g', 'm']}, // guesswork\n {'tag': '048', 'sortOrder': ['8', '6', 'b', 'a']},\n {'tag': '100', 'sortOrder': sortOrderForX00},\n {'tag': '110', 'sortOrder': sortOrderForX10},\n {'tag': '111', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '130', 'sortOrder': ['a', 'n', 'p', 'k', 'l']},\n {'tag': '240', 'sortOrder': ['a', 'm', 'n', 'p', 's', 'l', '2', '0', '1', '5', '9']},\n {'tag': '245', 'sortOrder': ['6', 'a', 'b', 'n', 'p', 'k', 'f', 'c']},\n {'tag': '246', 'sortOrder': sortOrderFor246},\n {'tag': '382', 'sortOrder': ['a']},\n {'tag': '385', 'sortOrder': ['8', 'm', 'n', 'a', '2', '0']},\n {'tag': '386', 'sortOrder': ['8', 'm', 'n', 'a']},\n {'tag': '490', 'sortOrder': ['a', 'x', 'y', 'v', 'l']},\n {'tag': '505', 'sortOrder': ['a']},\n {'tag': '526', 'sortOrder': ['i', 'a', 'b', 'x', 'z']},\n {'tag': '540', 'sortOrder': ['a', 'b', 'c', 'd', 'f', '2', 'u']},\n {'tag': '600', 'sortOrder': sortOrderForX00},\n {'tag': '610', 'sortOrder': sortOrderForX10},\n {'tag': '611', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '650', 'sortOrder': ['a', 'x', 'y', 'z']},\n {'tag': '700', 'sortOrder': sortOrderForX00},\n {'tag': '710', 'sortOrder': sortOrderForX10},\n {'tag': '711', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '760', 'sortOrder': sortOrderFor7XX},\n {'tag': '762', 'sortOrder': sortOrderFor7XX},\n {'tag': '765', 'sortOrder': sortOrderFor7XX},\n {'tag': '767', 'sortOrder': sortOrderFor7XX},\n {'tag': '770', 'sortOrder': sortOrderFor7XX},\n {'tag': '772', 'sortOrder': sortOrderFor7XX},\n {'tag': '773', 'sortOrder': sortOrderFor7XX},\n {'tag': '774', 'sortOrder': sortOrderFor7XX},\n {'tag': '775', 'sortOrder': sortOrderFor7XX},\n {'tag': '776', 'sortOrder': sortOrderFor7XX},\n {'tag': '777', 'sortOrder': sortOrderFor7XX},\n {'tag': '780', 'sortOrder': sortOrderFor7XX},\n {'tag': '785', 'sortOrder': sortOrderFor7XX},\n {'tag': '786', 'sortOrder': sortOrderFor7XX},\n {'tag': '787', 'sortOrder': sortOrderFor7XX},\n {'tag': '788', 'sortOrder': sortOrderFor7XX},\n {'tag': '800', 'sortOrder': sortOrderForX00},\n {'tag': '810', 'sortOrder': sortOrderForX10},\n {'tag': '811', 'sortOrder': ['a', 'n', 'd', 'c', 'e', 'g', 'j']},\n {'tag': '830', 'sortOrder': ['a', 'n', 'x', 'v']}, // INCOMPLETE, SAME AS 490? APPARENTLY NOT...\n {'tag': '856', 'sortOrder': ['3', 'u', 'q', 'x', 'y', 'z', '5']}, // incomplete, LoC examples are inconclusive\n {'tag': '880', 'sortOrder': ['6', 'a']},\n {'tag': '946', 'sortOrder': sortOrderFor246},\n {'tag': 'LOW', 'sortOrder': ['a', 'b', 'c', 'l', 'h']},\n {'tag': 'SID', 'sortOrder': ['c', 'b']} // Hack, so that default order is not used\n];\n\nfunction getSubfieldSortOrder(field) {\n const entry = subfieldSortOrder.filter(currEntry => field.tag === currEntry.tag);\n if (entry.length > 0 && 'sortOrder' in entry[0]) {\n debugDev(`sort order for ${field.tag}: ${entry[0].sortOrder}`);\n return entry[0].sortOrder;\n }\n nvdebug(`WARNING!\\tNo subfield order found for ${field.tag}.`);\n return [];\n}\n\n\nfunction swapSubfields(field, sortOrder) {\n if (!field.subfields) {\n return;\n }\n\n const loopAgain = field.subfields.some((sf, index) => {\n if (index === 0) {\n return false;\n }\n const currPos = getPosition(sf, sortOrder);\n const prevPos = getPosition(field.subfields[index - 1], sortOrder);\n if (currPos === -1 || prevPos === -1 || currPos >= prevPos) {\n return false;\n }\n // Swap:\n const tmp = field.subfields[index - 1];\n field.subfields[index - 1] = sf; // eslint-disable-line functional/immutable-data\n field.subfields[index] = tmp; // eslint-disable-line functional/immutable-data\n return true;\n });\n\n if (loopAgain) {\n return swapSubfields(field, sortOrder);\n }\n\n return;\n\n function getPosition(subfield, sortOrder) {\n // Magic exception that *always* comes first, used by Aleph in linking overlong fields\n if (sortOrder.indexOf('9') > -1 && subfield.code === '9' && ['^', '^^'].includes(subfield.value)) {\n return -0.5; // normal \"best value\" is 0, and \"worst value\" is N\n }\n return sortOrder.indexOf(subfield.code);\n }\n}\n\n\nfunction twoBeforeZero(field) {\n const sf2 = field.subfields.filter(sf => sf.code === '2');\n if (sf2.length !== 1) {\n return true; // both true and false are ok here\n }\n // MRA-465: gcipplatform (field 753)\n // rdasco (344), creatorbio (353), gbd (668), lsch (eg. 385)\n if (['creatorbio', 'gbd', 'gcipplatform', 'lscsh', 'rdasco'].includes(sf2[0].value)) {\n return false;\n }\n return true;\n}\n\nexport function sortAdjacentSubfields(field, externalSortOrder = []) {\n if (!field.subfields) {\n return field;\n }\n // Features:\n // - Swap only sort adjacent pairs.\n // - No sorting over unlisted subfield codes. Thus a given subfield can not shift to wrong side of 700$t...\n\n // Implement: 880 field should use values from $6...\n\n // Should we support multiple sort orders per field?\n\n // Try to handle control subfield order. This is not 100% fool proof. Control subfields are pretty stable, though.\n // However, there are exceptions (eg. $9 ^^ comes first and $2 $0 is a Finnish convention...)\n\n const finnishWay = twoBeforeZero(field);\n const controlSubfieldOrder = finnishWay ? ['8', '6', '7', '3', 'a', '4', '2', '0', '1', '5', '9'] : ['8', '6', '7', '3', 'a', '4', '0', '2', '1', '5', '9'];\n swapSubfields(field, controlSubfieldOrder);\n\n const sortOrderForField = externalSortOrder.length > 0 ? externalSortOrder : getSubfieldSortOrder(field);\n //nvdebug(`INTERMEDIATE SUBFIELD ORDER FOR ${field.tag}: ${sortOrderForField.join(', ')}`);\n\n const defaultSortOrder = finnishWay ? defaultSortOrderFinns : defaultSortOrderOthers; // $2 vs $0\n const subfieldOrder = sortOrderForField.length > 0 ? sortOrderForField : defaultSortOrder;\n //nvdebug(`FINAL SUBFIELD ORDER (FINNISH=${finnishWay}) FOR ${field.tag}: ${subfieldOrder.join(', ')}`);\n //if (sortOrder === null) { return field; } //// Currently always sort..\n //nvdebug(`IN: ${fieldToString(field)}`);\n swapSubfields(field, subfieldOrder);\n //nvdebug(`OUT: ${fieldToString(field)}`);\n\n return field;\n}\n\n"],"mappings":"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","ignoreList":[]}
|
package/dist/utils.js
CHANGED
|
@@ -27,13 +27,16 @@ exports.subfieldToString = subfieldToString;
|
|
|
27
27
|
exports.subfieldsAreIdentical = subfieldsAreIdentical;
|
|
28
28
|
exports.uniqArray = uniqArray;
|
|
29
29
|
var _debug = _interopRequireDefault(require("debug"));
|
|
30
|
-
var
|
|
31
|
-
var _path = _interopRequireDefault(require("path"));
|
|
30
|
+
var _melindaCustomMergeFields = require("./melindaCustomMergeFields");
|
|
32
31
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
32
|
+
//import fs from 'fs';
|
|
33
|
+
//import path from 'path';
|
|
34
|
+
|
|
33
35
|
const debug = (0, _debug.default)('@natlibfi/melinda-marc-record-merge-reducers:utils');
|
|
34
36
|
//const debugData = debug.extend('data');
|
|
35
37
|
const debugDev = debug.extend('dev');
|
|
36
|
-
|
|
38
|
+
//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));
|
|
39
|
+
|
|
37
40
|
function isElectronicMaterial(record) {
|
|
38
41
|
const f337s = record.get('337');
|
|
39
42
|
return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));
|
|
@@ -178,7 +181,7 @@ function subfieldIsRepeatable(tag, subfieldCode) {
|
|
|
178
181
|
// Uh, can $0 appear on any field?
|
|
179
182
|
return true;
|
|
180
183
|
}
|
|
181
|
-
const fieldSpecs =
|
|
184
|
+
const fieldSpecs = _melindaCustomMergeFields.melindaCustomMergeFields.fields.filter(field => field.tag === tag);
|
|
182
185
|
if (fieldSpecs.length !== 1) {
|
|
183
186
|
nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);
|
|
184
187
|
return true;
|
|
@@ -193,7 +196,7 @@ function subfieldIsRepeatable(tag, subfieldCode) {
|
|
|
193
196
|
return subfieldSpecs[0].repeatable;
|
|
194
197
|
}
|
|
195
198
|
function marc21GetTagsLegalIndicators(tag) {
|
|
196
|
-
const fieldSpecs =
|
|
199
|
+
const fieldSpecs = _melindaCustomMergeFields.melindaCustomMergeFields.fields.filter(field => field.tag === tag);
|
|
197
200
|
if (fieldSpecs.length === 0) {
|
|
198
201
|
return undefined;
|
|
199
202
|
}
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_fs","_path","e","__esModule","default","debug","createDebugLogger","debugDev","extend","melindaFields","JSON","parse","fs","readFileSync","path","join","__dirname","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\nimport fs from 'fs';\nimport path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nconst melindaFields = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode); // eslint-disable-line functional/immutable-data\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"utils.js","names":["_debug","_interopRequireDefault","require","_melindaCustomMergeFields","e","__esModule","default","debug","createDebugLogger","debugDev","extend","isElectronicMaterial","record","f337s","get","length","some","f","fieldHasSubfield","nvdebug","message","func","undefined","field","subfieldCode","subfieldValue","subfields","sf","code","value","subfieldToString","normalizeIndicatorValue","val","recordToString","ldr","leader","fields","map","fieldToString","join","removeSubfield","tag","filter","recordRemoveValuelessSubfields","ind1","ind2","formatSubfields","fieldsToString","nvdebugFieldArray","prefix","forEach","isControlSubfieldCode","includes","getCatalogingLanguage","defaultCatalogingLanguage","field040","b","uniqArray","arr","i","indexOf","fieldsAreIdentical","field1","field2","fieldHasNSubfields","relevantSubfields","removeCopyright","replace","isNonStandardNonrepeatableSubfield","subfieldIsRepeatable","fieldSpecs","melindaFields","subfieldSpecs","subfield","repeatable","marc21GetTagsLegalIndicators","indicators","marc21GetTagsLegalInd1Value","indicator","marc21GetTagsLegalInd2Value","nvdebugSubfieldArray","subfieldsAreIdentical","subfieldA","subfieldB","fieldHasMultipleSubfields","hasCopyright","modValue"],"sources":["../src/utils.js"],"sourcesContent":["import createDebugLogger from 'debug';\n\n//import fs from 'fs';\n//import path from 'path';\n\nconst debug = createDebugLogger('@natlibfi/melinda-marc-record-merge-reducers:utils');\n//const debugData = debug.extend('data');\nconst debugDev = debug.extend('dev');\n\nimport {melindaCustomMergeFields as melindaFields} from './melindaCustomMergeFields';\n\n//JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'src', 'melindaCustomMergeFields.json'), 'utf8'));\n\nexport function isElectronicMaterial(record) {\n const f337s = record.get('337');\n\n return f337s.length > 0 && f337s.some(f => fieldHasSubfield(f, 'b', 'c') && fieldHasSubfield(f, '2', 'rdamedia'));\n}\n\nexport function nvdebug(message, func = undefined) {\n if (func) { // eslint-disable-line functional/no-conditional-statements\n func(message);\n }\n //console.info(message); // eslint-disable-line no-console\n}\n\nexport function fieldHasSubfield(field, subfieldCode, subfieldValue = null) {\n if (!field.subfields) {\n return false;\n }\n if (subfieldValue === null) {\n return field.subfields.some(sf => sf.code === subfieldCode);\n }\n return field.subfields.some(sf => sf.code === subfieldCode && subfieldValue === sf.value);\n}\n\nexport function subfieldToString(sf) {\n if (!sf.value) {\n return `‡${sf.code}`;\n }\n return `‡${sf.code} ${sf.value}`;\n}\n\nfunction normalizeIndicatorValue(val) {\n if (val === ' ') {\n return '#';\n }\n return val;\n}\n\nexport function recordToString(record) {\n const ldr = `LDR ${record.leader}`;\n const fields = record.fields.map(f => fieldToString(f));\n return `${ldr}\\n${fields.join('\\n')}`;\n}\n\nexport function removeSubfield(record, tag, subfieldCode) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (field.tag !== tag || !field.subfields) { // Don't procss irrelevant fields\n return field;\n }\n field.subfields = field.subfields.filter(sf => sf.code !== subfieldCode); // eslint-disable-line functional/immutable-data\n if (field.subfields.length === 0) {\n return false;\n }\n return field;\n }).filter(field => field);\n}\n\nexport function recordRemoveValuelessSubfields(record) {\n record.fields = record.fields.map(field => { // eslint-disable-line functional/immutable-data\n if (!field.subfields) { // Keep control fields\n return field;\n }\n // Remove empty subfields from datafields:\n field.subfields = field.subfields.filter(sf => sf.value); // eslint-disable-line functional/immutable-data\n\n if (field.subfields && field.subfields.length === 0) {\n return false; // Return false instead of a field if field has no subfields left. These will soon be filtered out.\n }\n\n return field; //if field has subfields return it\n }).filter(field => field); // Filter those falses out\n}\n\nexport function fieldToString(f) {\n if ('subfields' in f) {\n return `${f.tag} ${normalizeIndicatorValue(f.ind1)}${normalizeIndicatorValue(f.ind2)}${formatSubfields(f)}`;\n }\n return `${f.tag} ${f.value}`;\n\n function formatSubfields(field) {\n return field.subfields.map(sf => ` ${subfieldToString(sf)}`).join('');\n }\n}\n\nexport function fieldsToString(fields) {\n return fields.map(f => fieldToString(f)).join('\\t__SEPARATOR__\\t');\n}\n\nexport function nvdebugFieldArray(fields, prefix = ' ', func = undefined) {\n fields.forEach(field => nvdebug(`${prefix}${fieldToString(field)}`, func));\n}\n\nexport function isControlSubfieldCode(subfieldCode) {\n if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'w'].includes(subfieldCode)) {\n return true;\n }\n return false;\n}\n\nexport function getCatalogingLanguage(record, defaultCatalogingLanguage = undefined) {\n const [field040] = record.get(/^040$/u);\n if (!field040) {\n return defaultCatalogingLanguage;\n }\n const [b] = field040.subfields.filter(sf => sf.code === 'b');\n if (!b) {\n return defaultCatalogingLanguage;\n }\n return b.value;\n}\n\n\nexport function uniqArray(arr) {\n return arr.filter((val, i) => arr.indexOf(val) === i);\n}\n\nexport function fieldsAreIdentical(field1, field2) {\n if (field1.tag !== field2.tag) { // NB! We are skipping normalizations here on purpose! They should be done beforehand...\n return false;\n }\n return fieldToString(field1) === fieldToString(field2);\n\n // The order of subfields is relevant! Bloody JS idiotisms make people use conditions such as:\n // return field1.subfields.every(sf => field2.subfields.some(sf2 => sf.code === sf2.code && sf.value === sf2.value));\n}\n\nexport function fieldHasNSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n const relevantSubfields = field.subfields.filter(sf => sf.code === subfieldCode);\n //if (subfieldValue === null) {\n return relevantSubfields.length;\n //}\n //const subset = relevantSubfields.filter(value => value === subfieldValue);\n //return subset.length;\n}\n\nexport function removeCopyright(value) {\n return value.replace(/^(?:c|p|©|℗|Cop\\. ?) ?((?:1[0-9][0-9][0-9]|20[012][0-9])\\.?)$/ui, '$1'); // eslint-disable-line prefer-named-capture-group\n}\n\nfunction isNonStandardNonrepeatableSubfield(tag, subfieldCode) {\n // Put these into config or so...\n if (tag === '264') {\n return ['a', 'b', 'c'].includes(subfieldCode);\n }\n\n if (['336', '337', '338'].includes(tag)) {\n return ['a', 'b', '2'].includes(subfieldCode);\n }\n\n return false;\n}\n\n\nexport function subfieldIsRepeatable(tag, subfieldCode) {\n\n if (isNonStandardNonrepeatableSubfield(tag, subfieldCode)) {\n return false;\n }\n\n // These we know or \"know\":\n // NB! $5 is (according to MARC21 format) non-repeatable, and not usable in all fields, but Melinda has a local exception to this, see MET-300\n if ('0159'.indexOf(subfieldCode) > -1) {\n // Uh, can $0 appear on any field?\n return true;\n }\n\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length !== 1) {\n nvdebug(` WARNING! Getting field ${tag} data failed! ${fieldSpecs.length} hits. Default value true is used for'${subfieldCode}' .`, debugDev);\n return true;\n }\n\n const subfieldSpecs = fieldSpecs[0].subfields.filter(subfield => subfield.code === subfieldCode);\n // Currently we don't support multiple $6 fields due to re-indexing limitations...\n // Well, $6 is non-repeatable, isn't it?!?\n // (This might actually already be fixed... Marginal issue, but check eventually.)\n if (subfieldSpecs.length !== 1 || subfieldCode === '6') {\n return false; // repeatable if not specified, I guess. Maybe add log or warn?\n }\n return subfieldSpecs[0].repeatable;\n}\n\nfunction marc21GetTagsLegalIndicators(tag) {\n const fieldSpecs = melindaFields.fields.filter(field => field.tag === tag);\n if (fieldSpecs.length === 0) {\n return undefined;\n }\n return fieldSpecs[0].indicators;\n}\n\nexport function marc21GetTagsLegalInd1Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind1;\n}\n\nexport function marc21GetTagsLegalInd2Value(tag) {\n const indicator = marc21GetTagsLegalIndicators(tag);\n if (indicator === undefined) {\n return undefined;\n }\n return indicator.ind2;\n}\n\nexport function nvdebugSubfieldArray(subfields, prefix = ' ', func = undefined) {\n subfields.forEach(subfield => nvdebug(`${prefix}${subfieldToString(subfield)}`, func));\n}\n\nexport function subfieldsAreIdentical(subfieldA, subfieldB) {\n return subfieldA.code === subfieldB.code && subfieldA.value === subfieldB.value;\n}\n\nexport function fieldHasMultipleSubfields(field, subfieldCode/*, subfieldValue = null*/) {\n return fieldHasNSubfields(field, subfieldCode) > 1;\n}\n\nexport function hasCopyright(value) {\n const modValue = removeCopyright(value);\n return value !== modValue;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"url": "git@github.com:natlibfi/marc-record-validators-melinda.git"
|
|
15
15
|
},
|
|
16
16
|
"license": "MIT",
|
|
17
|
-
"version": "11.3.
|
|
17
|
+
"version": "11.3.3",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"publishConfig": {
|
|
20
20
|
"access": "public"
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"clone": "^2.1.2",
|
|
46
46
|
"debug": "^4.3.4",
|
|
47
47
|
"iso9_1995": "^0.0.2",
|
|
48
|
-
"isbn3": "^1.1.
|
|
48
|
+
"isbn3": "^1.1.52",
|
|
49
49
|
"langs": "^2.0.0",
|
|
50
50
|
"node-fetch": "^2.7.0",
|
|
51
51
|
"sfs4900": "^0.0.1",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"@natlibfi/marc-record-validate": "^8.0.7"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@babel/cli": "^7.
|
|
59
|
+
"@babel/cli": "^7.25.6",
|
|
60
60
|
"@babel/core": "^7.24.7",
|
|
61
|
-
"@babel/preset-env": "^7.
|
|
61
|
+
"@babel/preset-env": "^7.25.4",
|
|
62
62
|
"@natlibfi/eslint-config-melinda-backend": "^3.0.5",
|
|
63
63
|
"@natlibfi/fixugen": "^2.0.5",
|
|
64
64
|
"@natlibfi/fixura": "^3.0.5",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"chai-as-promised": "^7.1.2",
|
|
69
69
|
"cross-env": "^7.0.3",
|
|
70
70
|
"eslint": "^8.57.0",
|
|
71
|
-
"fetch-mock": "^11.1.
|
|
71
|
+
"fetch-mock": "^11.1.3",
|
|
72
72
|
"mocha": "^10.4.0",
|
|
73
73
|
"nyc": "^17.0.0"
|
|
74
74
|
},
|