@natlibfi/melinda-commons 13.0.21 → 13.2.0-alpha.1

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.
Files changed (31) hide show
  1. package/dist/subRecordPicker.js +41 -7
  2. package/dist/subRecordPicker.js.map +1 -1
  3. package/dist/subRecordPicker.spec.js +24 -4
  4. package/dist/subRecordPicker.spec.js.map +1 -1
  5. package/dist/utils.js +40 -0
  6. package/dist/utils.js.map +1 -1
  7. package/dist/utils.spec.js +42 -0
  8. package/dist/utils.spec.js.map +1 -1
  9. package/package.json +1 -1
  10. package/src/subRecordPicker.js +41 -8
  11. package/src/subRecordPicker.spec.js +21 -3
  12. package/src/utils.js +43 -0
  13. package/src/utils.spec.js +55 -1
  14. package/test-fixtures/subRecordPicker/readAllSubrecords/01/metadata.json +1 -0
  15. package/test-fixtures/subRecordPicker/readAllSubrecords/02/expected-records.json +632 -0
  16. package/test-fixtures/subRecordPicker/readAllSubrecords/02/metadata.json +22 -0
  17. package/test-fixtures/subRecordPicker/readAllSubrecords/02/response01.xml +136 -0
  18. package/test-fixtures/subRecordPicker/readAllSubrecords/02/response02.xml +71 -0
  19. package/test-fixtures/subRecordPicker/readAllSubrecords/03/expected-records.json +1 -0
  20. package/test-fixtures/subRecordPicker/readAllSubrecords/03/metadata.json +17 -0
  21. package/test-fixtures/subRecordPicker/readAllSubrecords/03/response01.xml +4 -0
  22. package/test-fixtures/subRecordPicker/readSomeSubrecords/01/metadata.json +1 -0
  23. package/test-fixtures/subRecordPicker/readSubrecordAmount/01/metadata.json +16 -0
  24. package/test-fixtures/subRecordPicker/readSubrecordAmount/01/response01.xml +4 -0
  25. package/test-fixtures/utils/isComponentRecord/record1.json +35 -0
  26. package/test-fixtures/utils/isComponentRecord/record2.json +35 -0
  27. package/test-fixtures/utils/isComponentRecord/record3.json +20 -0
  28. package/test-fixtures/utils/isComponentRecord/record4.json +20 -0
  29. package/test-fixtures/utils/isComponentRecord/record5.json +20 -0
  30. package/test-fixtures/utils/isComponentRecord/record6.json +35 -0
  31. package/test-fixtures/utils/isComponentRecord/record7.json +35 -0
@@ -9,28 +9,55 @@ var _sruClient = _interopRequireDefault(require("@natlibfi/sru-client"));
9
9
  var _marcRecordSerializers = require("@natlibfi/marc-record-serializers");
10
10
  var _debug = _interopRequireDefault(require("debug"));
11
11
  var _error = require("./error");
12
- function createSubrecordPicker(sruUrl, retrieveAll = false) {
12
+ const componentIndex = 'melinda.partsofhost';
13
+ const monoHostComponentIndex = 'melinda.partsofmonohost';
14
+ function createSubrecordPicker(sruUrl, retrieveAll = false, monoHostComponentsOnly = false) {
15
+ const debug = (0, _debug.default)('@natlibfi/melinda-commons:subRecordPicker');
16
+ debug(`SRU client url: ${sruUrl}`);
13
17
  if (sruUrl === undefined) {
14
18
  // eslint-disable-line functional/no-conditional-statements
15
19
  throw new _error.Error(400, 'Invalid sru url');
16
20
  }
17
- const debug = (0, _debug.default)('@natlibfi/melinda-commons:subRecordPicker');
18
- debug(`SRU client url: ${sruUrl}`);
19
21
  const sruClient = (0, _sruClient.default)({
20
22
  url: sruUrl,
21
23
  recordSchema: 'marcxml',
22
24
  retrieveAll
23
25
  });
26
+ // SRU client with maxRecordsPerRequest does not retrieve any records
27
+ const sruClientForAmount = (0, _sruClient.default)({
28
+ url: sruUrl,
29
+ recordSchema: 'marcxml',
30
+ retrieveAll,
31
+ maxRecordsPerRequest: 0
32
+ });
33
+ const index = monoHostComponentsOnly ? monoHostComponentIndex : componentIndex;
34
+ debug(`Using index ${index}, (monoHostComponentsOnly: ${monoHostComponentsOnly})`);
24
35
  return {
36
+ readSubrecordAmount,
25
37
  readSomeSubrecords,
26
38
  readAllSubrecords
27
39
  };
40
+ function readSubrecordAmount(recordId) {
41
+ debug(`Getting subrecord amount for ${recordId}`);
42
+ return new Promise((resolve, reject) => {
43
+ sruClientForAmount.searchRetrieve(`${index}=${recordId}`).on('total', totalNumberOfRecords => {
44
+ resolve({
45
+ amount: totalNumberOfRecords
46
+ });
47
+ }).on('error', err => reject(err));
48
+ });
49
+ }
28
50
  function readSomeSubrecords(recordId, offset = 1) {
29
51
  debug(`Picking subrecords for ${recordId}`);
30
52
  return new Promise((resolve, reject) => {
31
53
  const promises = [];
32
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`, {
54
+ // eslint-disable-next-line functional/no-let
55
+ let amount;
56
+ sruClient.searchRetrieve(`${index}=${recordId}`, {
33
57
  startRecord: offset
58
+ }).on('total', totalNumberOfRecords => {
59
+ // eslint-disable-next-line no-const-assign
60
+ amount = totalNumberOfRecords;
34
61
  }).on('record', xmlString => {
35
62
  promises.push(_marcRecordSerializers.MARCXML.from(xmlString, {
36
63
  subfieldValues: false
@@ -40,7 +67,8 @@ function createSubrecordPicker(sruUrl, retrieveAll = false) {
40
67
  const records = await Promise.all(promises);
41
68
  resolve({
42
69
  nextRecordOffset,
43
- records
70
+ records,
71
+ amount
44
72
  });
45
73
  } catch (error) {
46
74
  reject(error);
@@ -52,7 +80,12 @@ function createSubrecordPicker(sruUrl, retrieveAll = false) {
52
80
  debug(`Picking subrecords for ${recordId}`);
53
81
  return new Promise((resolve, reject) => {
54
82
  const promises = [];
55
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`).on('record', xmlString => {
83
+ // eslint-disable-next-line functional/no-let
84
+ let amount;
85
+ sruClient.searchRetrieve(`${index}=${recordId}`).on('total', totalNumberOfRecords => {
86
+ // eslint-disable-next-line no-const-assign
87
+ amount = totalNumberOfRecords;
88
+ }).on('record', xmlString => {
56
89
  promises.push(_marcRecordSerializers.MARCXML.from(xmlString, {
57
90
  subfieldValues: false
58
91
  })); // eslint-disable-line functional/immutable-data
@@ -60,7 +93,8 @@ function createSubrecordPicker(sruUrl, retrieveAll = false) {
60
93
  try {
61
94
  const records = await Promise.all(promises);
62
95
  resolve({
63
- records
96
+ records,
97
+ amount
64
98
  });
65
99
  } catch (error) {
66
100
  reject(error);
@@ -1 +1 @@
1
- {"version":3,"file":"subRecordPicker.js","names":["_sruClient","_interopRequireDefault","require","_marcRecordSerializers","_debug","_error","createSubrecordPicker","sruUrl","retrieveAll","undefined","ApiError","debug","createDebugLogger","sruClient","createSruClient","url","recordSchema","readSomeSubrecords","readAllSubrecords","recordId","offset","Promise","resolve","reject","promises","searchRetrieve","startRecord","on","xmlString","push","MARCXML","from","subfieldValues","nextRecordOffset","records","all","error","err"],"sources":["../src/subRecordPicker.js"],"sourcesContent":["import createSruClient from '@natlibfi/sru-client';\nimport {MARCXML} from '@natlibfi/marc-record-serializers';\nimport createDebugLogger from 'debug';\nimport {Error as ApiError} from './error';\n\nexport function createSubrecordPicker(sruUrl, retrieveAll = false) {\n if (sruUrl === undefined) { // eslint-disable-line functional/no-conditional-statements\n throw new ApiError(400, 'Invalid sru url');\n }\n\n const debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker');\n debug(`SRU client url: ${sruUrl}`);\n const sruClient = createSruClient({url: sruUrl, recordSchema: 'marcxml', retrieveAll});\n\n return {readSomeSubrecords, readAllSubrecords};\n\n function readSomeSubrecords(recordId, offset = 1) {\n debug(`Picking subrecords for ${recordId}`);\n return new Promise((resolve, reject) => {\n const promises = [];\n sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`, {startRecord: offset})\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data\n })\n .on('end', async nextRecordOffset => {\n try {\n const records = await Promise.all(promises);\n resolve({nextRecordOffset, records});\n } catch (error) {\n reject(error);\n }\n })\n .on('error', err => reject(err));\n });\n }\n\n function readAllSubrecords(recordId) {\n debug(`Picking subrecords for ${recordId}`);\n return new Promise((resolve, reject) => {\n const promises = [];\n sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`)\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data\n })\n .on('end', async () => {\n try {\n const records = await Promise.all(promises);\n resolve({records});\n } catch (error) {\n reject(error);\n }\n })\n .on('error', err => reject(err));\n });\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,UAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAEO,SAASI,qBAAqBA,CAACC,MAAM,EAAEC,WAAW,GAAG,KAAK,EAAE;EACjE,IAAID,MAAM,KAAKE,SAAS,EAAE;IAAE;IAC1B,MAAM,IAAIC,YAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;EAC5C;EAEA,MAAMC,KAAK,GAAG,IAAAC,cAAiB,EAAC,2CAA2C,CAAC;EAC5ED,KAAK,CAAC,mBAAmBJ,MAAM,EAAE,CAAC;EAClC,MAAMM,SAAS,GAAG,IAAAC,kBAAe,EAAC;IAACC,GAAG,EAAER,MAAM;IAAES,YAAY,EAAE,SAAS;IAAER;EAAW,CAAC,CAAC;EAEtF,OAAO;IAACS,kBAAkB;IAAEC;EAAiB,CAAC;EAE9C,SAASD,kBAAkBA,CAACE,QAAQ,EAAEC,MAAM,GAAG,CAAC,EAAE;IAChDT,KAAK,CAAC,0BAA0BQ,QAAQ,EAAE,CAAC;IAC3C,OAAO,IAAIE,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC,MAAMC,QAAQ,GAAG,EAAE;MACnBX,SAAS,CAACY,cAAc,CAAC,uBAAuBN,QAAQ,EAAE,EAAE;QAACO,WAAW,EAAEN;MAAM,CAAC,CAAC,CAC/EO,EAAE,CAAC,QAAQ,EAAEC,SAAS,IAAI;QACzBJ,QAAQ,CAACK,IAAI,CAACC,8BAAO,CAACC,IAAI,CAACH,SAAS,EAAE;UAACI,cAAc,EAAE;QAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MACnE,CAAC,CAAC,CACDL,EAAE,CAAC,KAAK,EAAE,MAAMM,gBAAgB,IAAI;QACnC,IAAI;UACF,MAAMC,OAAO,GAAG,MAAMb,OAAO,CAACc,GAAG,CAACX,QAAQ,CAAC;UAC3CF,OAAO,CAAC;YAACW,gBAAgB;YAAEC;UAAO,CAAC,CAAC;QACtC,CAAC,CAAC,OAAOE,KAAK,EAAE;UACdb,MAAM,CAACa,KAAK,CAAC;QACf;MACF,CAAC,CAAC,CACDT,EAAE,CAAC,OAAO,EAAEU,GAAG,IAAId,MAAM,CAACc,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC;EACJ;EAEA,SAASnB,iBAAiBA,CAACC,QAAQ,EAAE;IACnCR,KAAK,CAAC,0BAA0BQ,QAAQ,EAAE,CAAC;IAC3C,OAAO,IAAIE,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC,MAAMC,QAAQ,GAAG,EAAE;MACnBX,SAAS,CAACY,cAAc,CAAC,uBAAuBN,QAAQ,EAAE,CAAC,CACxDQ,EAAE,CAAC,QAAQ,EAAEC,SAAS,IAAI;QACzBJ,QAAQ,CAACK,IAAI,CAACC,8BAAO,CAACC,IAAI,CAACH,SAAS,EAAE;UAACI,cAAc,EAAE;QAAK,CAAC,CAAC,CAAC,CAAC,CAAC;MACnE,CAAC,CAAC,CACDL,EAAE,CAAC,KAAK,EAAE,YAAY;QACrB,IAAI;UACF,MAAMO,OAAO,GAAG,MAAMb,OAAO,CAACc,GAAG,CAACX,QAAQ,CAAC;UAC3CF,OAAO,CAAC;YAACY;UAAO,CAAC,CAAC;QACpB,CAAC,CAAC,OAAOE,KAAK,EAAE;UACdb,MAAM,CAACa,KAAK,CAAC;QACf;MACF,CAAC,CAAC,CACDT,EAAE,CAAC,OAAO,EAAEU,GAAG,IAAId,MAAM,CAACc,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC;EACJ;AACF","ignoreList":[]}
1
+ {"version":3,"file":"subRecordPicker.js","names":["_sruClient","_interopRequireDefault","require","_marcRecordSerializers","_debug","_error","componentIndex","monoHostComponentIndex","createSubrecordPicker","sruUrl","retrieveAll","monoHostComponentsOnly","debug","createDebugLogger","undefined","ApiError","sruClient","createSruClient","url","recordSchema","sruClientForAmount","maxRecordsPerRequest","index","readSubrecordAmount","readSomeSubrecords","readAllSubrecords","recordId","Promise","resolve","reject","searchRetrieve","on","totalNumberOfRecords","amount","err","offset","promises","startRecord","xmlString","push","MARCXML","from","subfieldValues","nextRecordOffset","records","all","error"],"sources":["../src/subRecordPicker.js"],"sourcesContent":["import createSruClient from '@natlibfi/sru-client';\nimport {MARCXML} from '@natlibfi/marc-record-serializers';\nimport createDebugLogger from 'debug';\nimport {Error as ApiError} from './error';\n\nconst componentIndex = 'melinda.partsofhost';\nconst monoHostComponentIndex = 'melinda.partsofmonohost';\n\nexport function createSubrecordPicker(sruUrl, retrieveAll = false, monoHostComponentsOnly = false) {\n\n const debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker');\n\n debug(`SRU client url: ${sruUrl}`);\n if (sruUrl === undefined) { // eslint-disable-line functional/no-conditional-statements\n throw new ApiError(400, 'Invalid sru url');\n }\n\n const sruClient = createSruClient({url: sruUrl, recordSchema: 'marcxml', retrieveAll});\n // SRU client with maxRecordsPerRequest does not retrieve any records\n const sruClientForAmount = createSruClient({url: sruUrl, recordSchema: 'marcxml', retrieveAll, maxRecordsPerRequest: 0});\n\n const index = monoHostComponentsOnly ? monoHostComponentIndex : componentIndex;\n debug(`Using index ${index}, (monoHostComponentsOnly: ${monoHostComponentsOnly})`);\n\n return {readSubrecordAmount, readSomeSubrecords, readAllSubrecords};\n\n function readSubrecordAmount(recordId) {\n debug(`Getting subrecord amount for ${recordId}`);\n return new Promise((resolve, reject) => {\n sruClientForAmount.searchRetrieve(`${index}=${recordId}`)\n .on('total', totalNumberOfRecords => {\n resolve({amount: totalNumberOfRecords});\n })\n .on('error', err => reject(err));\n });\n }\n\n function readSomeSubrecords(recordId, offset = 1) {\n debug(`Picking subrecords for ${recordId}`);\n return new Promise((resolve, reject) => {\n const promises = [];\n // eslint-disable-next-line functional/no-let\n let amount;\n sruClient.searchRetrieve(`${index}=${recordId}`, {startRecord: offset})\n .on('total', totalNumberOfRecords => {\n // eslint-disable-next-line no-const-assign\n amount = totalNumberOfRecords;\n })\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data\n })\n .on('end', async nextRecordOffset => {\n try {\n const records = await Promise.all(promises);\n resolve({nextRecordOffset, records, amount});\n } catch (error) {\n reject(error);\n }\n })\n .on('error', err => reject(err));\n });\n }\n\n function readAllSubrecords(recordId) {\n debug(`Picking subrecords for ${recordId}`);\n return new Promise((resolve, reject) => {\n const promises = [];\n // eslint-disable-next-line functional/no-let\n let amount;\n sruClient.searchRetrieve(`${index}=${recordId}`)\n .on('total', totalNumberOfRecords => {\n // eslint-disable-next-line no-const-assign\n amount = totalNumberOfRecords;\n })\n .on('record', xmlString => {\n promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data\n })\n .on('end', async () => {\n try {\n const records = await Promise.all(promises);\n resolve({records, amount});\n } catch (error) {\n reject(error);\n }\n })\n .on('error', err => reject(err));\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -5,19 +5,25 @@ var _chai = require("chai");
5
5
  var _subRecordPicker = require("./subRecordPicker");
6
6
  var _fixura = require("@natlibfi/fixura");
7
7
  var _fixugenHttpClient = _interopRequireDefault(require("@natlibfi/fixugen-http-client"));
8
+ var _debug = _interopRequireDefault(require("debug"));
9
+ const debug = (0, _debug.default)('@natlibfi/melinda-commons:subRecordPicker:test');
8
10
  describe('subRecordPicker', () => {
9
11
  const sruUrl = 'https://sru';
10
12
  const retrieveAll = false;
13
+ //const monoHostComponentsOnly = false;
14
+
11
15
  describe('createSubrecordPicker', () => {
12
16
  it('Client should have methods', () => {
13
17
  const client = (0, _subRecordPicker.createSubrecordPicker)(sruUrl, retrieveAll);
14
18
  (0, _chai.expect)(client).to.respondTo('readAllSubrecords');
15
19
  (0, _chai.expect)(client).to.respondTo('readSomeSubrecords');
20
+ (0, _chai.expect)(client).to.respondTo('readSubrecordAmount');
16
21
  });
17
22
  it('Create client should work with just one parametter', () => {
18
23
  const client = (0, _subRecordPicker.createSubrecordPicker)(sruUrl);
19
24
  (0, _chai.expect)(client).to.respondTo('readAllSubrecords');
20
25
  (0, _chai.expect)(client).to.respondTo('readSomeSubrecords');
26
+ (0, _chai.expect)(client).to.respondTo('readSubrecordAmount');
21
27
  });
22
28
  it('Create client should have at least one parametter', () => {
23
29
  (0, _chai.expect)(_subRecordPicker.createSubrecordPicker).to.throw();
@@ -32,17 +38,31 @@ describe('subRecordPicker', () => {
32
38
  method,
33
39
  sruUrl,
34
40
  retrieveAll,
35
- recordId
41
+ recordId,
42
+ expectedAmount = undefined
36
43
  }) {
37
44
  const client = (0, _subRecordPicker.createSubrecordPicker)(sruUrl, retrieveAll);
38
45
  const expectedRecords = getFixture({
39
46
  components: ['expected-records.json'],
40
47
  reader: _fixura.READERS.JSON
41
48
  });
49
+ debug(`Testing: ${method}`);
50
+ const result = await client[method](recordId);
51
+ debug(`${JSON.stringify(result)}`);
42
52
  const {
43
- records
44
- } = await client[method](recordId);
45
- (0, _chai.expect)(format()).to.eql(expectedRecords);
53
+ records,
54
+ amount
55
+ } = result;
56
+
57
+ // eslint-disable-next-line functional/no-conditional-statements
58
+ if (expectedRecords) {
59
+ (0, _chai.expect)(format()).to.eql(expectedRecords);
60
+ }
61
+
62
+ // eslint-disable-next-line functional/no-conditional-statements
63
+ if (expectedAmount) {
64
+ (0, _chai.expect)(amount).to.eql(expectedAmount);
65
+ }
46
66
  function format() {
47
67
  return records.map(r => r.toObject());
48
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subRecordPicker.spec.js","names":["_chai","require","_subRecordPicker","_fixura","_fixugenHttpClient","_interopRequireDefault","describe","sruUrl","retrieveAll","it","client","createSubrecordPicker","expect","to","respondTo","throw","generateTests","callback","path","__dirname","getFixture","method","recordId","expectedRecords","components","reader","READERS","JSON","records","format","eql","map","r","toObject"],"sources":["../src/subRecordPicker.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {createSubrecordPicker} from './subRecordPicker';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen-http-client';\n\ndescribe('subRecordPicker', () => {\n const sruUrl = 'https://sru';\n const retrieveAll = false;\n\n describe('createSubrecordPicker', () => {\n it('Client should have methods', () => {\n const client = createSubrecordPicker(sruUrl, retrieveAll);\n expect(client).to.respondTo('readAllSubrecords');\n expect(client).to.respondTo('readSomeSubrecords');\n });\n\n it('Create client should work with just one parametter', () => {\n const client = createSubrecordPicker(sruUrl);\n expect(client).to.respondTo('readAllSubrecords');\n expect(client).to.respondTo('readSomeSubrecords');\n });\n\n it('Create client should have at least one parametter', () => {\n expect(createSubrecordPicker).to.throw();\n });\n });\n\n generateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'subRecordPicker']\n });\n\n async function callback({getFixture, method, sruUrl, retrieveAll, recordId}) {\n const client = createSubrecordPicker(sruUrl, retrieveAll);\n const expectedRecords = getFixture({components: ['expected-records.json'], reader: READERS.JSON});\n const {records} = await client[method](recordId);\n\n expect(format()).to.eql(expectedRecords);\n\n function format() {\n return records.map(r => r.toObject());\n }\n }\n});\n"],"mappings":";;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAEAK,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChC,MAAMC,MAAM,GAAG,aAAa;EAC5B,MAAMC,WAAW,GAAG,KAAK;EAEzBF,QAAQ,CAAC,uBAAuB,EAAE,MAAM;IACtCG,EAAE,CAAC,4BAA4B,EAAE,MAAM;MACrC,MAAMC,MAAM,GAAG,IAAAC,sCAAqB,EAACJ,MAAM,EAAEC,WAAW,CAAC;MACzD,IAAAI,YAAM,EAACF,MAAM,CAAC,CAACG,EAAE,CAACC,SAAS,CAAC,mBAAmB,CAAC;MAChD,IAAAF,YAAM,EAACF,MAAM,CAAC,CAACG,EAAE,CAACC,SAAS,CAAC,oBAAoB,CAAC;IACnD,CAAC,CAAC;IAEFL,EAAE,CAAC,oDAAoD,EAAE,MAAM;MAC7D,MAAMC,MAAM,GAAG,IAAAC,sCAAqB,EAACJ,MAAM,CAAC;MAC5C,IAAAK,YAAM,EAACF,MAAM,CAAC,CAACG,EAAE,CAACC,SAAS,CAAC,mBAAmB,CAAC;MAChD,IAAAF,YAAM,EAACF,MAAM,CAAC,CAACG,EAAE,CAACC,SAAS,CAAC,oBAAoB,CAAC;IACnD,CAAC,CAAC;IAEFL,EAAE,CAAC,mDAAmD,EAAE,MAAM;MAC5D,IAAAG,YAAM,EAACD,sCAAqB,CAAC,CAACE,EAAE,CAACE,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAAC,0BAAa,EAAC;IACZC,QAAQ;IACRC,IAAI,EAAE,CAACC,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,iBAAiB;EAC5D,CAAC,CAAC;EAEF,eAAeF,QAAQA,CAAC;IAACG,UAAU;IAAEC,MAAM;IAAEd,MAAM;IAAEC,WAAW;IAAEc;EAAQ,CAAC,EAAE;IAC3E,MAAMZ,MAAM,GAAG,IAAAC,sCAAqB,EAACJ,MAAM,EAAEC,WAAW,CAAC;IACzD,MAAMe,eAAe,GAAGH,UAAU,CAAC;MAACI,UAAU,EAAE,CAAC,uBAAuB,CAAC;MAAEC,MAAM,EAAEC,eAAO,CAACC;IAAI,CAAC,CAAC;IACjG,MAAM;MAACC;IAAO,CAAC,GAAG,MAAMlB,MAAM,CAACW,MAAM,CAAC,CAACC,QAAQ,CAAC;IAEhD,IAAAV,YAAM,EAACiB,MAAM,CAAC,CAAC,CAAC,CAAChB,EAAE,CAACiB,GAAG,CAACP,eAAe,CAAC;IAExC,SAASM,MAAMA,CAAA,EAAG;MAChB,OAAOD,OAAO,CAACG,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,QAAQ,CAAC,CAAC,CAAC;IACvC;EACF;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"subRecordPicker.spec.js","names":["_chai","require","_subRecordPicker","_fixura","_fixugenHttpClient","_interopRequireDefault","_debug","debug","createDebugLogger","describe","sruUrl","retrieveAll","it","client","createSubrecordPicker","expect","to","respondTo","throw","generateTests","callback","path","__dirname","getFixture","method","recordId","expectedAmount","undefined","expectedRecords","components","reader","READERS","JSON","result","stringify","records","amount","format","eql","map","r","toObject"],"sources":["../src/subRecordPicker.spec.js"],"sourcesContent":["import {expect} from 'chai';\nimport {createSubrecordPicker} from './subRecordPicker';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen-http-client';\nimport createDebugLogger from 'debug';\n\nconst debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker:test');\n\n\ndescribe('subRecordPicker', () => {\n const sruUrl = 'https://sru';\n const retrieveAll = false;\n //const monoHostComponentsOnly = false;\n\n describe('createSubrecordPicker', () => {\n it('Client should have methods', () => {\n const client = createSubrecordPicker(sruUrl, retrieveAll);\n expect(client).to.respondTo('readAllSubrecords');\n expect(client).to.respondTo('readSomeSubrecords');\n expect(client).to.respondTo('readSubrecordAmount');\n });\n\n it('Create client should work with just one parametter', () => {\n const client = createSubrecordPicker(sruUrl);\n expect(client).to.respondTo('readAllSubrecords');\n expect(client).to.respondTo('readSomeSubrecords');\n expect(client).to.respondTo('readSubrecordAmount');\n });\n\n it('Create client should have at least one parametter', () => {\n expect(createSubrecordPicker).to.throw();\n });\n });\n\n generateTests({\n callback,\n path: [__dirname, '..', 'test-fixtures', 'subRecordPicker']\n });\n\n async function callback({getFixture, method, sruUrl, retrieveAll, recordId, expectedAmount = undefined}) {\n const client = createSubrecordPicker(sruUrl, retrieveAll);\n const expectedRecords = getFixture({components: ['expected-records.json'], reader: READERS.JSON});\n debug(`Testing: ${method}`);\n const result = await client[method](recordId);\n debug(`${JSON.stringify(result)}`);\n const {records, amount} = result;\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (expectedRecords) {\n expect(format()).to.eql(expectedRecords);\n }\n\n // eslint-disable-next-line functional/no-conditional-statements\n if (expectedAmount) {\n expect(amount).to.eql(expectedAmount);\n }\n\n function format() {\n return records.map(r => r.toObject());\n }\n }\n});\n"],"mappings":"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","ignoreList":[]}
package/dist/utils.js CHANGED
@@ -8,6 +8,7 @@ exports.fromAlephId = fromAlephId;
8
8
  exports.generateAuthorizationHeader = generateAuthorizationHeader;
9
9
  exports.getRecordStandardIdentifiers = getRecordStandardIdentifiers;
10
10
  exports.getRecordTitle = getRecordTitle;
11
+ exports.isComponentRecord = isComponentRecord;
11
12
  exports.isDeletedRecord = isDeletedRecord;
12
13
  exports.parseBoolean = parseBoolean;
13
14
  exports.toAlephId = toAlephId;
@@ -44,6 +45,45 @@ function isDeletedRecord(record) {
44
45
  }
45
46
  }
46
47
  }
48
+ function isComponentRecord(record, ignoreCollections = false, additionalHostFields = []) {
49
+ // Record is a component record if it has bibliografic level of a component in leader
50
+ // and/or has at least one host link field (f773)
51
+
52
+ // Ignore collections - optionally do not handle collections (LDR/07 'c')
53
+ // or collection subUnits (LDR/07 'd') as components, even if they do have f773
54
+
55
+ // https://www.loc.gov/marc/bibliographic/bdleader.html
56
+ // LDR/07
57
+ // c - Collection
58
+ // d - Subunit (in a collection)
59
+
60
+ if (ignoreCollections && ['c', 'd'].includes(record.leader[7])) {
61
+ return false;
62
+ }
63
+
64
+ // https://www.loc.gov/marc/bibliographic/bdleader.html
65
+ // LDR/07
66
+ // a - Monographic component part
67
+ // b - Serial component part
68
+ // d - Subunit (in a collection)
69
+
70
+ if (['a', 'b', 'd'].includes(record.leader[7])) {
71
+ return true;
72
+ }
73
+
74
+ // https://www.loc.gov/marc/bibliographic/bd773.html
75
+ // 773 - Host Item Entry (R)
76
+
77
+ // additionalHostFields (for example f973 for Viola's multihost componenets)
78
+ // optionally recognize fields given in additionalHostFields array as hostFields
79
+
80
+ const hostFields = additionalHostFields.concat('773');
81
+ const hostFieldPatternString = `^(${hostFields.join('|')})$`;
82
+ const hostFieldRegex = new RegExp(hostFieldPatternString, 'u');
83
+ const recordHasHostFields = record.get(hostFieldRegex).length > 0;
84
+ return recordHasHostFields;
85
+ //return record.get(/^773$/u).length > 0;
86
+ }
47
87
  function parseBoolean(value) {
48
88
  if (value === undefined) {
49
89
  return false;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":["generateAuthorizationHeader","username","password","encoded","Buffer","from","toString","isDeletedRecord","record","includes","leader","checkDel","checkSta","get","some","check","subfields","code","value","values","parseBoolean","undefined","Number","isNaN","length","test","Boolean","getRecordTitle","TRIM_PATTERN","field","find","f","sf","replace","RegExp","getRecordStandardIdentifiers","filter","map","subfield","clone","o","JSON","parse","stringify","toAlephId","id","padStart","fromAlephId"],"sources":["../src/utils.js"],"sourcesContent":["export function generateAuthorizationHeader(username, password = '') {\n const encoded = Buffer.from(`${username}:${password}`).toString('base64');\n return `Basic ${encoded}`;\n}\n\nexport function isDeletedRecord(record) {\n if (['d', 's', 'x'].includes(record.leader[5])) {\n return true;\n }\n\n return checkDel() || checkSta();\n\n function checkDel() {\n return record.get(/^DEL$/u).some(check);\n\n function check({subfields}) {\n return subfields.some(({code, value}) => code === 'a' && value === 'Y');\n }\n }\n\n function checkSta() {\n return record.get(/^STA$/u).some(check);\n\n function check({subfields}) {\n const values = ['DELETED', 'DELETED-SPLIT', 'DELETED-DEPRECATED'];\n return subfields.some(({code, value}) => code === 'a' && values.includes(value));\n }\n }\n}\n\nexport function parseBoolean(value) {\n if (value === undefined) {\n return false;\n }\n\n if (Number.isNaN(Number(value))) {\n return value.length > 0 && !(/^(?:false)$/ui).test(value);\n }\n\n return Boolean(Number(value));\n}\n\nexport function getRecordTitle(record) {\n const TRIM_PATTERN = '[?!.,(){}:;/ ]*';\n // DEVELOP: get mainHeadings for aut records\n const field = record\n .get(/^245$/u)\n .find(f => f.subfields.some(sf => sf.code === 'a'));\n\n if (field) {\n return field.subfields.find(sf => sf.code === 'a').value\n .replace(new RegExp(`^${TRIM_PATTERN}`, 'u'), '')\n .replace(new RegExp(`${TRIM_PATTERN}$`, 'u'), '');\n }\n\n return '';\n}\n\nexport function getRecordStandardIdentifiers(record) {\n return record.get(/^(?<def>020|022|024)$/u)\n .filter(f => f.subfields.some(sf => ['a', 'z'].includes(sf.code)))\n .map(field => {\n const subfield = field.subfields.find(sf => ['a', 'z'].includes(sf.code));\n return subfield.value;\n });\n}\n\nexport function clone(o) {\n return JSON.parse(JSON.stringify(o));\n}\n\nexport function toAlephId(id) {\n return id.padStart(9, '0');\n}\n\nexport function fromAlephId(id) {\n return id.replace(/^0+/u, '');\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.js","names":["generateAuthorizationHeader","username","password","encoded","Buffer","from","toString","isDeletedRecord","record","includes","leader","checkDel","checkSta","get","some","check","subfields","code","value","values","isComponentRecord","ignoreCollections","additionalHostFields","hostFields","concat","hostFieldPatternString","join","hostFieldRegex","RegExp","recordHasHostFields","length","parseBoolean","undefined","Number","isNaN","test","Boolean","getRecordTitle","TRIM_PATTERN","field","find","f","sf","replace","getRecordStandardIdentifiers","filter","map","subfield","clone","o","JSON","parse","stringify","toAlephId","id","padStart","fromAlephId"],"sources":["../src/utils.js"],"sourcesContent":["export function generateAuthorizationHeader(username, password = '') {\n const encoded = Buffer.from(`${username}:${password}`).toString('base64');\n return `Basic ${encoded}`;\n}\n\nexport function isDeletedRecord(record) {\n if (['d', 's', 'x'].includes(record.leader[5])) {\n return true;\n }\n\n return checkDel() || checkSta();\n\n function checkDel() {\n return record.get(/^DEL$/u).some(check);\n\n function check({subfields}) {\n return subfields.some(({code, value}) => code === 'a' && value === 'Y');\n }\n }\n\n function checkSta() {\n return record.get(/^STA$/u).some(check);\n\n function check({subfields}) {\n const values = ['DELETED', 'DELETED-SPLIT', 'DELETED-DEPRECATED'];\n return subfields.some(({code, value}) => code === 'a' && values.includes(value));\n }\n }\n}\n\nexport function isComponentRecord(record, ignoreCollections = false, additionalHostFields = []) {\n\n // Record is a component record if it has bibliografic level of a component in leader\n // and/or has at least one host link field (f773)\n\n\n // Ignore collections - optionally do not handle collections (LDR/07 'c')\n // or collection subUnits (LDR/07 'd') as components, even if they do have f773\n\n // https://www.loc.gov/marc/bibliographic/bdleader.html\n // LDR/07\n // c - Collection\n // d - Subunit (in a collection)\n\n if (ignoreCollections && ['c', 'd'].includes(record.leader[7])) {\n return false;\n }\n\n // https://www.loc.gov/marc/bibliographic/bdleader.html\n // LDR/07\n // a - Monographic component part\n // b - Serial component part\n // d - Subunit (in a collection)\n\n if (['a', 'b', 'd'].includes(record.leader[7])) {\n return true;\n }\n\n // https://www.loc.gov/marc/bibliographic/bd773.html\n // 773 - Host Item Entry (R)\n\n // additionalHostFields (for example f973 for Viola's multihost componenets)\n // optionally recognize fields given in additionalHostFields array as hostFields\n\n const hostFields = additionalHostFields.concat('773');\n const hostFieldPatternString = `^(${hostFields.join('|')})$`;\n const hostFieldRegex = new RegExp(hostFieldPatternString, 'u');\n\n const recordHasHostFields = record.get(hostFieldRegex).length > 0;\n return recordHasHostFields;\n //return record.get(/^773$/u).length > 0;\n}\n\nexport function parseBoolean(value) {\n if (value === undefined) {\n return false;\n }\n\n if (Number.isNaN(Number(value))) {\n return value.length > 0 && !(/^(?:false)$/ui).test(value);\n }\n\n return Boolean(Number(value));\n}\n\nexport function getRecordTitle(record) {\n const TRIM_PATTERN = '[?!.,(){}:;/ ]*';\n // DEVELOP: get mainHeadings for aut records\n const field = record\n .get(/^245$/u)\n .find(f => f.subfields.some(sf => sf.code === 'a'));\n\n if (field) {\n return field.subfields.find(sf => sf.code === 'a').value\n .replace(new RegExp(`^${TRIM_PATTERN}`, 'u'), '')\n .replace(new RegExp(`${TRIM_PATTERN}$`, 'u'), '');\n }\n\n return '';\n}\n\nexport function getRecordStandardIdentifiers(record) {\n return record.get(/^(?<def>020|022|024)$/u)\n .filter(f => f.subfields.some(sf => ['a', 'z'].includes(sf.code)))\n .map(field => {\n const subfield = field.subfields.find(sf => ['a', 'z'].includes(sf.code));\n return subfield.value;\n });\n}\n\nexport function clone(o) {\n return JSON.parse(JSON.stringify(o));\n}\n\nexport function toAlephId(id) {\n return id.padStart(9, '0');\n}\n\nexport function fromAlephId(id) {\n return id.replace(/^0+/u, '');\n}\n"],"mappings":"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","ignoreList":[]}
@@ -85,6 +85,48 @@ describe('utils', () => {
85
85
  (0, _chai.expect)((0, _utils.parseBoolean)('FAlsE')).to.equal(false);
86
86
  });
87
87
  });
88
+ describe('isComponentRecord', () => {
89
+ it('Should find out that the record is a component record (f773)', () => {
90
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record1.json'), 'utf8');
91
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
92
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record)).to.equal(true);
93
+ });
94
+ it('Should find out that the record is a component record (f773 + LDR/07 "a")', () => {
95
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record2.json'), 'utf8');
96
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
97
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record)).to.equal(true);
98
+ });
99
+ it('Should find out that the record is a component (LDR/07 "d")', () => {
100
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record3.json'), 'utf8');
101
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
102
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record)).to.equal(true);
103
+ });
104
+ it('Should find out that the record is not a component record', () => {
105
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record4.json'), 'utf8');
106
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
107
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record)).to.equal(false);
108
+ });
109
+ it('Should find out that the record is not a component record when ignoring collections', () => {
110
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record4.json'), 'utf8');
111
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
112
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record, true)).to.equal(false);
113
+ });
114
+ it('Should find out that the record is not a component record when ignoring collections (LDR/07 "d")', () => {
115
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record5.json'), 'utf8');
116
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
117
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record, true)).to.equal(false);
118
+ });
119
+ it('Should find out that the record is not a component record when ignoring collections (LDR/07 "c" and f773)', () => {
120
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record6.json'), 'utf8');
121
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
122
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record, true)).to.equal(false);
123
+ });
124
+ it('Should find out that the record is a component record when using additional host fields (f973)', () => {
125
+ const data = _fs.default.readFileSync(_path.default.join(FIXTURES_PATH, 'isComponentRecord/record7.json'), 'utf8');
126
+ const record = new _marcRecord.MarcRecord(JSON.parse(data));
127
+ (0, _chai.expect)((0, _utils.isComponentRecord)(record, false, ['973'])).to.equal(true);
128
+ });
129
+ });
88
130
  describe('getRecordTitle', () => {
89
131
  ['Should find a title', 'Should not find a title'].forEach((descr, index) => {
90
132
  it(descr, () => {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.spec.js","names":["_fs","_interopRequireDefault","require","_path","_chai","_marcRecord","_utils","MarcRecord","setValidationOptions","subfieldValues","FIXTURES_PATH","path","join","__dirname","describe","it","value","generateAuthorizationHeader","expect","to","equal","data","fs","readFileSync","record","JSON","parse","isDeletedRecord","parseBoolean","undefined","forEach","descr","index","title","recordData","getRecordTitle","identifiers","getRecordStandardIdentifiers","eql","obj","cloned","clone","not"],"sources":["../src/utils.spec.js"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {\n generateAuthorizationHeader, isDeletedRecord, parseBoolean, clone,\n getRecordTitle, getRecordStandardIdentifiers\n} from './utils';\n\nMarcRecord.setValidationOptions({subfieldValues: false});\n\nconst FIXTURES_PATH = path.join(__dirname, '../test-fixtures/utils');\n\ndescribe('utils', () => {\n describe('generateAuthorizationHeader', () => {\n it('Should create a proper Authorization header', () => {\n const value = generateAuthorizationHeader('foo', 'bar');\n expect(value).to.equal('Basic Zm9vOmJhcg==');\n });\n });\n\n describe('isDeletedRecord', () => {\n it('Should find the record deleted (Leader)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record1.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (DEL)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record2.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (STA)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record3.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record not deleted', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record4.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(false);\n });\n\n it('Should find the record deleted (Split)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record5.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Deprecated)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record6.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Split (Aleph))', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record7.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Deprecated (Aleph))', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record8.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n });\n\n describe('parseBoolean', () => {\n it('Should parse undefined as false', () => {\n expect(parseBoolean(undefined)).to.equal(false);\n });\n\n it('Should parse zero-length string as false', () => {\n expect(parseBoolean('')).to.equal(false);\n });\n\n it('Should parse numericish value as true', () => {\n expect(parseBoolean('1')).to.equal(true);\n });\n\n it('Should parse numericush value as false', () => {\n expect(parseBoolean('0')).to.equal(false);\n });\n\n it('Should parse literal \\'false\\' value as false', () => {\n expect(parseBoolean('false')).to.equal(false);\n });\n\n it('Should parse non-numericish value as true', () => {\n expect(parseBoolean('foo')).to.equal(true);\n });\n\n it('Should parse literal \\'FALSE\\' value as false', () => {\n expect(parseBoolean('FALSE')).to.equal(false);\n });\n\n it('Should parse literal \\'FAlsE\\' value as false', () => {\n expect(parseBoolean('FAlsE')).to.equal(false);\n });\n\n });\n\n describe('getRecordTitle', () => {\n [\n 'Should find a title',\n 'Should not find a title'\n ].forEach((descr, index) => {\n it(descr, () => {\n const title = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/title${index}.txt`), 'utf8');\n const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/record${index}.json`), 'utf8');\n const record = new MarcRecord(JSON.parse(recordData));\n\n expect(getRecordTitle(record)).to.equal(title);\n });\n });\n });\n\n describe('getRecordStandardIdentifiers', () => {\n [\n 'Should find identifiers',\n 'Should not find an identifier'\n ].forEach((descr, index) => {\n it(descr, () => {\n const identifiers = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/identifiers${index}.json`), 'utf8'));\n const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/record${index}.json`), 'utf8');\n const record = new MarcRecord(JSON.parse(recordData));\n\n expect(getRecordStandardIdentifiers(record)).to.eql(identifiers);\n });\n });\n });\n\n describe('clone', () => {\n it('Should clone an object', (index = '1') => {\n const obj = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `clone/${index}/obj.json`), 'utf8'));\n const cloned = clone(obj);\n\n expect(obj).to.not.equal(cloned);\n expect(cloned).to.eql(obj);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"utils.spec.js","names":["_fs","_interopRequireDefault","require","_path","_chai","_marcRecord","_utils","MarcRecord","setValidationOptions","subfieldValues","FIXTURES_PATH","path","join","__dirname","describe","it","value","generateAuthorizationHeader","expect","to","equal","data","fs","readFileSync","record","JSON","parse","isDeletedRecord","parseBoolean","undefined","isComponentRecord","forEach","descr","index","title","recordData","getRecordTitle","identifiers","getRecordStandardIdentifiers","eql","obj","cloned","clone","not"],"sources":["../src/utils.spec.js"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport {expect} from 'chai';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {\n generateAuthorizationHeader, isDeletedRecord, parseBoolean, clone,\n getRecordTitle, getRecordStandardIdentifiers, isComponentRecord\n} from './utils';\n\nMarcRecord.setValidationOptions({subfieldValues: false});\n\nconst FIXTURES_PATH = path.join(__dirname, '../test-fixtures/utils');\n\ndescribe('utils', () => {\n describe('generateAuthorizationHeader', () => {\n it('Should create a proper Authorization header', () => {\n const value = generateAuthorizationHeader('foo', 'bar');\n expect(value).to.equal('Basic Zm9vOmJhcg==');\n });\n });\n\n describe('isDeletedRecord', () => {\n it('Should find the record deleted (Leader)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record1.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (DEL)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record2.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (STA)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record3.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record not deleted', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record4.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(false);\n });\n\n it('Should find the record deleted (Split)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record5.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Deprecated)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record6.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Split (Aleph))', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record7.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n\n it('Should find the record deleted (Deprecated (Aleph))', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isDeletedRecord/record8.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isDeletedRecord(record)).to.equal(true);\n });\n });\n\n describe('parseBoolean', () => {\n it('Should parse undefined as false', () => {\n expect(parseBoolean(undefined)).to.equal(false);\n });\n\n it('Should parse zero-length string as false', () => {\n expect(parseBoolean('')).to.equal(false);\n });\n\n it('Should parse numericish value as true', () => {\n expect(parseBoolean('1')).to.equal(true);\n });\n\n it('Should parse numericush value as false', () => {\n expect(parseBoolean('0')).to.equal(false);\n });\n\n it('Should parse literal \\'false\\' value as false', () => {\n expect(parseBoolean('false')).to.equal(false);\n });\n\n it('Should parse non-numericish value as true', () => {\n expect(parseBoolean('foo')).to.equal(true);\n });\n\n it('Should parse literal \\'FALSE\\' value as false', () => {\n expect(parseBoolean('FALSE')).to.equal(false);\n });\n\n it('Should parse literal \\'FAlsE\\' value as false', () => {\n expect(parseBoolean('FAlsE')).to.equal(false);\n });\n\n });\n\n describe('isComponentRecord', () => {\n it('Should find out that the record is a component record (f773)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record1.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record)).to.equal(true);\n });\n\n it('Should find out that the record is a component record (f773 + LDR/07 \"a\")', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record2.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record)).to.equal(true);\n });\n\n it('Should find out that the record is a component (LDR/07 \"d\")', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record3.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record)).to.equal(true);\n });\n\n it('Should find out that the record is not a component record', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record4.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record)).to.equal(false);\n });\n\n it('Should find out that the record is not a component record when ignoring collections', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record4.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record, true)).to.equal(false);\n });\n\n\n it('Should find out that the record is not a component record when ignoring collections (LDR/07 \"d\")', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record5.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record, true)).to.equal(false);\n });\n\n\n it('Should find out that the record is not a component record when ignoring collections (LDR/07 \"c\" and f773)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record6.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record, true)).to.equal(false);\n });\n\n it('Should find out that the record is a component record when using additional host fields (f973)', () => {\n const data = fs.readFileSync(path.join(FIXTURES_PATH, 'isComponentRecord/record7.json'), 'utf8');\n const record = new MarcRecord(JSON.parse(data));\n expect(isComponentRecord(record, false, ['973'])).to.equal(true);\n });\n\n });\n\n\n describe('getRecordTitle', () => {\n [\n 'Should find a title',\n 'Should not find a title'\n ].forEach((descr, index) => {\n it(descr, () => {\n const title = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/title${index}.txt`), 'utf8');\n const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/record${index}.json`), 'utf8');\n const record = new MarcRecord(JSON.parse(recordData));\n\n expect(getRecordTitle(record)).to.equal(title);\n });\n });\n });\n\n describe('getRecordStandardIdentifiers', () => {\n [\n 'Should find identifiers',\n 'Should not find an identifier'\n ].forEach((descr, index) => {\n it(descr, () => {\n const identifiers = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/identifiers${index}.json`), 'utf8'));\n const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/record${index}.json`), 'utf8');\n const record = new MarcRecord(JSON.parse(recordData));\n\n expect(getRecordStandardIdentifiers(record)).to.eql(identifiers);\n });\n });\n });\n\n describe('clone', () => {\n it('Should clone an object', (index = '1') => {\n const obj = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `clone/${index}/obj.json`), 'utf8'));\n const cloned = clone(obj);\n\n expect(obj).to.not.equal(cloned);\n expect(cloned).to.eql(obj);\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "url": "git@github.com:natlibfi/melinda-commons-js.git"
15
15
  },
16
16
  "license": "MIT",
17
- "version": "13.0.21",
17
+ "version": "13.2.0-alpha.1",
18
18
  "main": "./dist/index.js",
19
19
  "engines": {
20
20
  "node": ">=18"
@@ -3,29 +3,56 @@ import {MARCXML} from '@natlibfi/marc-record-serializers';
3
3
  import createDebugLogger from 'debug';
4
4
  import {Error as ApiError} from './error';
5
5
 
6
- export function createSubrecordPicker(sruUrl, retrieveAll = false) {
6
+ const componentIndex = 'melinda.partsofhost';
7
+ const monoHostComponentIndex = 'melinda.partsofmonohost';
8
+
9
+ export function createSubrecordPicker(sruUrl, retrieveAll = false, monoHostComponentsOnly = false) {
10
+
11
+ const debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker');
12
+
13
+ debug(`SRU client url: ${sruUrl}`);
7
14
  if (sruUrl === undefined) { // eslint-disable-line functional/no-conditional-statements
8
15
  throw new ApiError(400, 'Invalid sru url');
9
16
  }
10
17
 
11
- const debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker');
12
- debug(`SRU client url: ${sruUrl}`);
13
18
  const sruClient = createSruClient({url: sruUrl, recordSchema: 'marcxml', retrieveAll});
19
+ // SRU client with maxRecordsPerRequest does not retrieve any records
20
+ const sruClientForAmount = createSruClient({url: sruUrl, recordSchema: 'marcxml', retrieveAll, maxRecordsPerRequest: 0});
21
+
22
+ const index = monoHostComponentsOnly ? monoHostComponentIndex : componentIndex;
23
+ debug(`Using index ${index}, (monoHostComponentsOnly: ${monoHostComponentsOnly})`);
14
24
 
15
- return {readSomeSubrecords, readAllSubrecords};
25
+ return {readSubrecordAmount, readSomeSubrecords, readAllSubrecords};
26
+
27
+ function readSubrecordAmount(recordId) {
28
+ debug(`Getting subrecord amount for ${recordId}`);
29
+ return new Promise((resolve, reject) => {
30
+ sruClientForAmount.searchRetrieve(`${index}=${recordId}`)
31
+ .on('total', totalNumberOfRecords => {
32
+ resolve({amount: totalNumberOfRecords});
33
+ })
34
+ .on('error', err => reject(err));
35
+ });
36
+ }
16
37
 
17
38
  function readSomeSubrecords(recordId, offset = 1) {
18
39
  debug(`Picking subrecords for ${recordId}`);
19
40
  return new Promise((resolve, reject) => {
20
41
  const promises = [];
21
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`, {startRecord: offset})
42
+ // eslint-disable-next-line functional/no-let
43
+ let amount;
44
+ sruClient.searchRetrieve(`${index}=${recordId}`, {startRecord: offset})
45
+ .on('total', totalNumberOfRecords => {
46
+ // eslint-disable-next-line no-const-assign
47
+ amount = totalNumberOfRecords;
48
+ })
22
49
  .on('record', xmlString => {
23
50
  promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data
24
51
  })
25
52
  .on('end', async nextRecordOffset => {
26
53
  try {
27
54
  const records = await Promise.all(promises);
28
- resolve({nextRecordOffset, records});
55
+ resolve({nextRecordOffset, records, amount});
29
56
  } catch (error) {
30
57
  reject(error);
31
58
  }
@@ -38,14 +65,20 @@ export function createSubrecordPicker(sruUrl, retrieveAll = false) {
38
65
  debug(`Picking subrecords for ${recordId}`);
39
66
  return new Promise((resolve, reject) => {
40
67
  const promises = [];
41
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`)
68
+ // eslint-disable-next-line functional/no-let
69
+ let amount;
70
+ sruClient.searchRetrieve(`${index}=${recordId}`)
71
+ .on('total', totalNumberOfRecords => {
72
+ // eslint-disable-next-line no-const-assign
73
+ amount = totalNumberOfRecords;
74
+ })
42
75
  .on('record', xmlString => {
43
76
  promises.push(MARCXML.from(xmlString, {subfieldValues: false})); // eslint-disable-line functional/immutable-data
44
77
  })
45
78
  .on('end', async () => {
46
79
  try {
47
80
  const records = await Promise.all(promises);
48
- resolve({records});
81
+ resolve({records, amount});
49
82
  } catch (error) {
50
83
  reject(error);
51
84
  }
@@ -2,22 +2,29 @@ import {expect} from 'chai';
2
2
  import {createSubrecordPicker} from './subRecordPicker';
3
3
  import {READERS} from '@natlibfi/fixura';
4
4
  import generateTests from '@natlibfi/fixugen-http-client';
5
+ import createDebugLogger from 'debug';
6
+
7
+ const debug = createDebugLogger('@natlibfi/melinda-commons:subRecordPicker:test');
8
+
5
9
 
6
10
  describe('subRecordPicker', () => {
7
11
  const sruUrl = 'https://sru';
8
12
  const retrieveAll = false;
13
+ //const monoHostComponentsOnly = false;
9
14
 
10
15
  describe('createSubrecordPicker', () => {
11
16
  it('Client should have methods', () => {
12
17
  const client = createSubrecordPicker(sruUrl, retrieveAll);
13
18
  expect(client).to.respondTo('readAllSubrecords');
14
19
  expect(client).to.respondTo('readSomeSubrecords');
20
+ expect(client).to.respondTo('readSubrecordAmount');
15
21
  });
16
22
 
17
23
  it('Create client should work with just one parametter', () => {
18
24
  const client = createSubrecordPicker(sruUrl);
19
25
  expect(client).to.respondTo('readAllSubrecords');
20
26
  expect(client).to.respondTo('readSomeSubrecords');
27
+ expect(client).to.respondTo('readSubrecordAmount');
21
28
  });
22
29
 
23
30
  it('Create client should have at least one parametter', () => {
@@ -30,12 +37,23 @@ describe('subRecordPicker', () => {
30
37
  path: [__dirname, '..', 'test-fixtures', 'subRecordPicker']
31
38
  });
32
39
 
33
- async function callback({getFixture, method, sruUrl, retrieveAll, recordId}) {
40
+ async function callback({getFixture, method, sruUrl, retrieveAll, recordId, expectedAmount = undefined}) {
34
41
  const client = createSubrecordPicker(sruUrl, retrieveAll);
35
42
  const expectedRecords = getFixture({components: ['expected-records.json'], reader: READERS.JSON});
36
- const {records} = await client[method](recordId);
43
+ debug(`Testing: ${method}`);
44
+ const result = await client[method](recordId);
45
+ debug(`${JSON.stringify(result)}`);
46
+ const {records, amount} = result;
47
+
48
+ // eslint-disable-next-line functional/no-conditional-statements
49
+ if (expectedRecords) {
50
+ expect(format()).to.eql(expectedRecords);
51
+ }
37
52
 
38
- expect(format()).to.eql(expectedRecords);
53
+ // eslint-disable-next-line functional/no-conditional-statements
54
+ if (expectedAmount) {
55
+ expect(amount).to.eql(expectedAmount);
56
+ }
39
57
 
40
58
  function format() {
41
59
  return records.map(r => r.toObject());