@natlibfi/melinda-commons 13.0.21-alpha.1 → 14.0.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.
@@ -11,7 +11,7 @@ jobs:
11
11
 
12
12
  strategy:
13
13
  matrix:
14
- node-version: [18.x, 20.x, 22.x, 23.x]
14
+ node-version: [22.x, 24.x]
15
15
  # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
16
16
 
17
17
  steps:
@@ -35,7 +35,7 @@ jobs:
35
35
 
36
36
  steps:
37
37
  - uses: actions/checkout@v4
38
- - uses: mikaelvesavuori/license-compliance-action@v1.0.3
38
+ - uses: mikaelvesavuori/license-compliance-action@v1
39
39
  with:
40
40
  exclude_pattern: /^@natlibfi/
41
41
 
package/dist/error.js CHANGED
@@ -1,15 +1,8 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- class _default extends Error {
1
+ export default class extends Error {
8
2
  constructor(status, payload, ...params) {
9
3
  super(params);
10
- this.status = status; // eslint-disable-line functional/no-this-expressions
11
- this.payload = payload; // eslint-disable-line functional/no-this-expressions
4
+ this.status = status;
5
+ this.payload = payload;
12
6
  }
13
7
  }
14
- exports.default = _default;
15
- //# sourceMappingURL=error.js.map
8
+ //# sourceMappingURL=error.js.map
package/dist/error.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"error.js","names":["_default","Error","constructor","status","payload","params","exports","default"],"sources":["../src/error.js"],"sourcesContent":["export default class extends Error {\n constructor(status, payload, ...params) {\n super(params);\n this.status = status; // eslint-disable-line functional/no-this-expressions\n this.payload = payload; // eslint-disable-line functional/no-this-expressions\n }\n}\n"],"mappings":";;;;;;AAAe,MAAAA,QAAA,SAAcC,KAAK,CAAC;EACjCC,WAAWA,CAACC,MAAM,EAAEC,OAAO,EAAE,GAAGC,MAAM,EAAE;IACtC,KAAK,CAACA,MAAM,CAAC;IACb,IAAI,CAACF,MAAM,GAAGA,MAAM,CAAC,CAAC;IACtB,IAAI,CAACC,OAAO,GAAGA,OAAO,CAAC,CAAC;EAC1B;AACF;AAACE,OAAA,CAAAC,OAAA,GAAAP,QAAA","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/error.js"],
4
+ "sourcesContent": ["export default class extends Error {\n constructor(status, payload, ...params) {\n super(params);\n this.status = status;\n this.payload = payload;\n }\n}\n"],
5
+ "mappings": "AAAA,6BAA6B,MAAM;AAAA,EACjC,YAAY,QAAQ,YAAY,QAAQ;AACtC,UAAM,MAAM;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACjB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert";
3
+ import CommonsError from "./error.js";
4
+ describe("error", () => {
5
+ it("Should construct the expected instance", () => {
6
+ const error = new CommonsError(200, "foobar");
7
+ assert(error instanceof Error);
8
+ assert.equal(Object.hasOwn(error, "status"), true);
9
+ assert.equal(Object.hasOwn(error, "payload"), true);
10
+ assert.equal(error.status, 200);
11
+ assert.equal(error.payload, "foobar");
12
+ });
13
+ });
14
+ //# sourceMappingURL=error.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/error.test.js"],
4
+ "sourcesContent": ["import {describe, it} from 'node:test';\nimport assert from 'node:assert';\nimport CommonsError from './error.js';\n\ndescribe('error', () => {\n it('Should construct the expected instance', () => {\n const error = new CommonsError(200, 'foobar');\n\n assert(error instanceof Error);\n assert.equal(Object.hasOwn(error, 'status'), true);\n assert.equal(Object.hasOwn(error, 'payload'), true);\n assert.equal(error.status, 200);\n assert.equal(error.payload, 'foobar');\n });\n});\n"],
5
+ "mappings": "AAAA,SAAQ,UAAU,UAAS;AAC3B,OAAO,YAAY;AACnB,OAAO,kBAAkB;AAEzB,SAAS,SAAS,MAAM;AACtB,KAAG,0CAA0C,MAAM;AACjD,UAAM,QAAQ,IAAI,aAAa,KAAK,QAAQ;AAE5C,WAAO,iBAAiB,KAAK;AAC7B,WAAO,MAAM,OAAO,OAAO,OAAO,QAAQ,GAAG,IAAI;AACjD,WAAO,MAAM,OAAO,OAAO,OAAO,SAAS,GAAG,IAAI;AAClD,WAAO,MAAM,MAAM,QAAQ,GAAG;AAC9B,WAAO,MAAM,MAAM,SAAS,QAAQ;AAAA,EACtC,CAAC;AACH,CAAC;",
6
+ "names": []
7
+ }
package/dist/index.js CHANGED
@@ -1,42 +1,7 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- var _exportNames = {
8
- createSubrecordPicker: true,
9
- Error: true
10
- };
11
- Object.defineProperty(exports, "Error", {
12
- enumerable: true,
13
- get: function () {
14
- return _error.default;
15
- }
16
- });
17
- Object.defineProperty(exports, "createSubrecordPicker", {
18
- enumerable: true,
19
- get: function () {
20
- return _subRecordPicker.createSubrecordPicker;
21
- }
22
- });
23
- var _marcRecord = require("@natlibfi/marc-record");
24
- var _subRecordPicker = require("./subRecordPicker");
25
- var _utils = require("./utils");
26
- Object.keys(_utils).forEach(function (key) {
27
- if (key === "default" || key === "__esModule") return;
28
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
29
- if (key in exports && exports[key] === _utils[key]) return;
30
- Object.defineProperty(exports, key, {
31
- enumerable: true,
32
- get: function () {
33
- return _utils[key];
34
- }
35
- });
36
- });
37
- var _error = _interopRequireDefault(require("./error"));
38
- // Aleph creates partial subfields...
39
- _marcRecord.MarcRecord.setValidationOptions({
40
- subfieldValues: false
41
- });
42
- //# sourceMappingURL=index.js.map
1
+ import { MarcRecord } from "@natlibfi/marc-record";
2
+ MarcRecord.setValidationOptions({ subfieldValues: false });
3
+ import { createSubrecordPicker } from "./subRecordPicker";
4
+ export * from "./utils";
5
+ export { default as Error } from "./error";
6
+ export { createSubrecordPicker };
7
+ //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","names":["_marcRecord","require","_subRecordPicker","_utils","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_error","_interopRequireDefault","MarcRecord","setValidationOptions","subfieldValues"],"sources":["../src/index.js"],"sourcesContent":["import {MarcRecord} from '@natlibfi/marc-record';\n\n// Aleph creates partial subfields...\nMarcRecord.setValidationOptions({subfieldValues: false});\n\nimport {createSubrecordPicker} from './subRecordPicker';\n\nexport * from './utils';\n\nexport {default as Error} from './error';\nexport {createSubrecordPicker};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAKA,IAAAC,gBAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAAAG,MAAA,CAAAC,IAAA,CAAAF,MAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,MAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,MAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAEA,IAAAS,MAAA,GAAAC,sBAAA,CAAAhB,OAAA;AAPA;AACAiB,sBAAU,CAACC,oBAAoB,CAAC;EAACC,cAAc,EAAE;AAAK,CAAC,CAAC","ignoreList":[]}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.js"],
4
+ "sourcesContent": ["import {MarcRecord} from '@natlibfi/marc-record';\n\n// Aleph creates partial subfields...\nMarcRecord.setValidationOptions({subfieldValues: false});\n\nimport {createSubrecordPicker} from './subRecordPicker';\n\nexport * from './utils';\n\nexport {default as Error} from './error';\nexport {createSubrecordPicker};\n"],
5
+ "mappings": "AAAA,SAAQ,kBAAiB;AAGzB,WAAW,qBAAqB,EAAC,gBAAgB,MAAK,CAAC;AAEvD,SAAQ,6BAA4B;AAEpC,cAAc;AAEd,SAAQ,WAAW,aAAY;AAC/B,SAAQ;",
6
+ "names": []
7
+ }
@@ -1,72 +1,46 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.createSubrecordPicker = createSubrecordPicker;
8
- var _sruClient = _interopRequireDefault(require("@natlibfi/sru-client"));
9
- var _marcRecordSerializers = require("@natlibfi/marc-record-serializers");
10
- var _debug = _interopRequireDefault(require("debug"));
11
- var _error = require("./error");
12
- function createSubrecordPicker(sruUrl, retrieveAll = false) {
13
- if (sruUrl === undefined) {
14
- // eslint-disable-line functional/no-conditional-statements
15
- throw new _error.Error(400, 'Invalid sru url');
1
+ import { default as createSruClient } from "@natlibfi/sru-client";
2
+ import { MARCXML } from "@natlibfi/marc-record-serializers";
3
+ import createDebugLogger from "debug";
4
+ import ApiError from "./error.js";
5
+ export function createSubrecordPicker(sruUrl, retrieveAll = false) {
6
+ if (sruUrl === void 0) {
7
+ throw new ApiError(400, "Invalid sru url");
16
8
  }
17
- const debug = (0, _debug.default)('@natlibfi/melinda-commons:subRecordPicker');
9
+ const debug = createDebugLogger("@natlibfi/melinda-commons:subRecordPicker");
18
10
  debug(`SRU client url: ${sruUrl}`);
19
- const sruClient = (0, _sruClient.default)({
20
- url: sruUrl,
21
- recordSchema: 'marcxml',
22
- retrieveAll
23
- });
24
- return {
25
- readSomeSubrecords,
26
- readAllSubrecords
27
- };
11
+ const sruClient = createSruClient({ url: sruUrl, recordSchema: "marcxml", retrieveAll });
12
+ return { readSomeSubrecords, readAllSubrecords };
28
13
  function readSomeSubrecords(recordId, offset = 1) {
29
14
  debug(`Picking subrecords for ${recordId}`);
30
15
  return new Promise((resolve, reject) => {
31
16
  const promises = [];
32
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`, {
33
- startRecord: offset
34
- }).on('record', xmlString => {
35
- promises.push(_marcRecordSerializers.MARCXML.from(xmlString, {
36
- subfieldValues: false
37
- })); // eslint-disable-line functional/immutable-data
38
- }).on('end', async nextRecordOffset => {
17
+ sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`, { startRecord: offset }).on("record", (xmlString) => {
18
+ promises.push(MARCXML.from(xmlString, { subfieldValues: false }));
19
+ }).on("end", async (nextRecordOffset) => {
39
20
  try {
40
21
  const records = await Promise.all(promises);
41
- resolve({
42
- nextRecordOffset,
43
- records
44
- });
22
+ resolve({ nextRecordOffset, records });
45
23
  } catch (error) {
46
24
  reject(error);
47
25
  }
48
- }).on('error', err => reject(err));
26
+ }).on("error", (err) => reject(err));
49
27
  });
50
28
  }
51
29
  function readAllSubrecords(recordId) {
52
30
  debug(`Picking subrecords for ${recordId}`);
53
31
  return new Promise((resolve, reject) => {
54
32
  const promises = [];
55
- sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`).on('record', xmlString => {
56
- promises.push(_marcRecordSerializers.MARCXML.from(xmlString, {
57
- subfieldValues: false
58
- })); // eslint-disable-line functional/immutable-data
59
- }).on('end', async () => {
33
+ sruClient.searchRetrieve(`melinda.partsofhost=${recordId}`).on("record", (xmlString) => {
34
+ promises.push(MARCXML.from(xmlString, { subfieldValues: false }));
35
+ }).on("end", async () => {
60
36
  try {
61
37
  const records = await Promise.all(promises);
62
- resolve({
63
- records
64
- });
38
+ resolve({ records });
65
39
  } catch (error) {
66
40
  reject(error);
67
41
  }
68
- }).on('error', err => reject(err));
42
+ }).on("error", (err) => reject(err));
69
43
  });
70
44
  }
71
45
  }
72
- //# sourceMappingURL=subRecordPicker.js.map
46
+ //# sourceMappingURL=subRecordPicker.js.map
@@ -1 +1,7 @@
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
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subRecordPicker.js"],
4
+ "sourcesContent": ["import {default as createSruClient} from '@natlibfi/sru-client';\nimport {MARCXML} from '@natlibfi/marc-record-serializers';\nimport createDebugLogger from 'debug';\nimport ApiError from './error.js';\n\nexport function createSubrecordPicker(sruUrl, retrieveAll = false) {\n if (sruUrl === undefined) {\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}));\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}));\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"],
5
+ "mappings": "AAAA,SAAQ,WAAW,uBAAsB;AACzC,SAAQ,eAAc;AACtB,OAAO,uBAAuB;AAC9B,OAAO,cAAc;AAEd,gBAAS,sBAAsB,QAAQ,cAAc,OAAO;AACjE,MAAI,WAAW,QAAW;AACxB,UAAM,IAAI,SAAS,KAAK,iBAAiB;AAAA,EAC3C;AAEA,QAAM,QAAQ,kBAAkB,2CAA2C;AAC3E,QAAM,mBAAmB,MAAM,EAAE;AACjC,QAAM,YAAY,gBAAgB,EAAC,KAAK,QAAQ,cAAc,WAAW,YAAW,CAAC;AAErF,SAAO,EAAC,oBAAoB,kBAAiB;AAE7C,WAAS,mBAAmB,UAAU,SAAS,GAAG;AAChD,UAAM,0BAA0B,QAAQ,EAAE;AAC1C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,WAAW,CAAC;AAClB,gBAAU,eAAe,uBAAuB,QAAQ,IAAI,EAAC,aAAa,OAAM,CAAC,EAC9E,GAAG,UAAU,eAAa;AACzB,iBAAS,KAAK,QAAQ,KAAK,WAAW,EAAC,gBAAgB,MAAK,CAAC,CAAC;AAAA,MAChE,CAAC,EACA,GAAG,OAAO,OAAM,qBAAoB;AACnC,YAAI;AACF,gBAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAC1C,kBAAQ,EAAC,kBAAkB,QAAO,CAAC;AAAA,QACrC,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC,EACA,GAAG,SAAS,SAAO,OAAO,GAAG,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AAEA,WAAS,kBAAkB,UAAU;AACnC,UAAM,0BAA0B,QAAQ,EAAE;AAC1C,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,WAAW,CAAC;AAClB,gBAAU,eAAe,uBAAuB,QAAQ,EAAE,EACvD,GAAG,UAAU,eAAa;AACzB,iBAAS,KAAK,QAAQ,KAAK,WAAW,EAAC,gBAAgB,MAAK,CAAC,CAAC;AAAA,MAChE,CAAC,EACA,GAAG,OAAO,YAAY;AACrB,YAAI;AACF,gBAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAC1C,kBAAQ,EAAC,QAAO,CAAC;AAAA,QACnB,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,CAAC,EACA,GAAG,SAAS,SAAO,OAAO,GAAG,CAAC;AAAA,IACnC,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,42 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert";
3
+ import { READERS } from "@natlibfi/fixura";
4
+ import generateTests from "@natlibfi/fixugen-http-client";
5
+ import { createSubrecordPicker } from "./subRecordPicker.js";
6
+ describe("subRecordPicker", () => {
7
+ const sruUrl = "https://sru";
8
+ const retrieveAll = false;
9
+ describe("createSubrecordPicker", () => {
10
+ it("Client should have methods", () => {
11
+ const client = createSubrecordPicker(sruUrl, retrieveAll);
12
+ assert(typeof client.readAllSubrecords, "function");
13
+ assert(typeof client.readSomeSubrecords, "function");
14
+ });
15
+ it("Create client should work with just one parametter", () => {
16
+ const client = createSubrecordPicker(sruUrl);
17
+ assert(typeof client.readAllSubrecords, "function");
18
+ assert(typeof client.readSomeSubrecords, "function");
19
+ });
20
+ it("Create client should have at least one parametter", () => {
21
+ try {
22
+ createSubrecordPicker();
23
+ } catch (error) {
24
+ assert.equal(error.payload, "Invalid sru url");
25
+ }
26
+ });
27
+ });
28
+ generateTests({
29
+ callback,
30
+ path: [import.meta.dirname, "..", "test-fixtures", "subRecordPicker"]
31
+ });
32
+ async function callback({ getFixture, method, sruUrl: sruUrl2, retrieveAll: retrieveAll2, recordId }) {
33
+ const client = createSubrecordPicker(sruUrl2, retrieveAll2);
34
+ const expectedRecords = getFixture({ components: ["expected-records.json"], reader: READERS.JSON });
35
+ const { records } = await client[method](recordId);
36
+ assert.deepStrictEqual(format(), expectedRecords);
37
+ function format() {
38
+ return records.map((r) => r.toObject());
39
+ }
40
+ }
41
+ });
42
+ //# sourceMappingURL=subRecordPicker.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/subRecordPicker.test.js"],
4
+ "sourcesContent": ["import {describe, it} from 'node:test';\nimport assert from 'node:assert';\nimport {READERS} from '@natlibfi/fixura';\nimport generateTests from '@natlibfi/fixugen-http-client';\nimport {createSubrecordPicker} from './subRecordPicker.js';\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 assert(typeof client.readAllSubrecords, 'function');\n assert(typeof client.readSomeSubrecords, 'function');\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 assert(typeof client.readAllSubrecords, 'function');\n assert(typeof client.readSomeSubrecords, 'function');\n });\n\n it('Create client should have at least one parametter', () => {\n try {\n createSubrecordPicker();\n } catch (error) {\n assert.equal(error.payload, 'Invalid sru url');\n }\n });\n });\n\n generateTests({\n callback,\n path: [import.meta.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 assert.deepStrictEqual(format(), expectedRecords);\n\n function format() {\n return records.map(r => r.toObject());\n }\n }\n});\n"],
5
+ "mappings": "AAAA,SAAQ,UAAU,UAAS;AAC3B,OAAO,YAAY;AACnB,SAAQ,eAAc;AACtB,OAAO,mBAAmB;AAC1B,SAAQ,6BAA4B;AAEpC,SAAS,mBAAmB,MAAM;AAChC,QAAM,SAAS;AACf,QAAM,cAAc;AAEpB,WAAS,yBAAyB,MAAM;AACtC,OAAG,8BAA8B,MAAM;AACrC,YAAM,SAAS,sBAAsB,QAAQ,WAAW;AAGxD,aAAO,OAAO,OAAO,mBAAmB,UAAU;AAClD,aAAO,OAAO,OAAO,oBAAoB,UAAU;AAAA,IACrD,CAAC;AAED,OAAG,sDAAsD,MAAM;AAC7D,YAAM,SAAS,sBAAsB,MAAM;AAG3C,aAAO,OAAO,OAAO,mBAAmB,UAAU;AAClD,aAAO,OAAO,OAAO,oBAAoB,UAAU;AAAA,IACrD,CAAC;AAED,OAAG,qDAAqD,MAAM;AAC5D,UAAI;AACF,8BAAsB;AAAA,MACxB,SAAS,OAAO;AACd,eAAO,MAAM,MAAM,SAAS,iBAAiB;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,gBAAc;AAAA,IACZ;AAAA,IACA,MAAM,CAAC,YAAY,SAAS,MAAM,iBAAiB,iBAAiB;AAAA,EACtE,CAAC;AAED,iBAAe,SAAS,EAAC,YAAY,QAAQ,QAAAA,SAAQ,aAAAC,cAAa,SAAQ,GAAG;AAC3E,UAAM,SAAS,sBAAsBD,SAAQC,YAAW;AACxD,UAAM,kBAAkB,WAAW,EAAC,YAAY,CAAC,uBAAuB,GAAG,QAAQ,QAAQ,KAAI,CAAC;AAChG,UAAM,EAAC,QAAO,IAAI,MAAM,OAAO,MAAM,EAAE,QAAQ;AAE/C,WAAO,gBAAgB,OAAO,GAAG,eAAe;AAEhD,aAAS,SAAS;AAChB,aAAO,QAAQ,IAAI,OAAK,EAAE,SAAS,CAAC;AAAA,IACtC;AAAA,EACF;AACF,CAAC;",
6
+ "names": ["sruUrl", "retrieveAll"]
7
+ }
package/dist/utils.js CHANGED
@@ -1,51 +1,28 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.clone = clone;
7
- exports.fromAlephId = fromAlephId;
8
- exports.generateAuthorizationHeader = generateAuthorizationHeader;
9
- exports.getRecordStandardIdentifiers = getRecordStandardIdentifiers;
10
- exports.getRecordTitle = getRecordTitle;
11
- exports.isDeletedRecord = isDeletedRecord;
12
- exports.parseBoolean = parseBoolean;
13
- exports.toAlephId = toAlephId;
14
- function generateAuthorizationHeader(username, password = '') {
15
- const encoded = Buffer.from(`${username}:${password}`).toString('base64');
1
+ export function generateAuthorizationHeader(username, password = "") {
2
+ const encoded = Buffer.from(`${username}:${password}`).toString("base64");
16
3
  return `Basic ${encoded}`;
17
4
  }
18
- function isDeletedRecord(record) {
19
- if (['d', 's', 'x'].includes(record.leader[5])) {
5
+ export function isDeletedRecord(record) {
6
+ if (["d", "s", "x"].includes(record.leader[5])) {
20
7
  return true;
21
8
  }
22
9
  return checkDel() || checkSta();
23
10
  function checkDel() {
24
11
  return record.get(/^DEL$/u).some(check);
25
- function check({
26
- subfields
27
- }) {
28
- return subfields.some(({
29
- code,
30
- value
31
- }) => code === 'a' && value === 'Y');
12
+ function check({ subfields }) {
13
+ return subfields.some(({ code, value }) => code === "a" && value === "Y");
32
14
  }
33
15
  }
34
16
  function checkSta() {
35
17
  return record.get(/^STA$/u).some(check);
36
- function check({
37
- subfields
38
- }) {
39
- const values = ['DELETED', 'DELETED-SPLIT', 'DELETED-DEPRECATED'];
40
- return subfields.some(({
41
- code,
42
- value
43
- }) => code === 'a' && values.includes(value));
18
+ function check({ subfields }) {
19
+ const values = ["DELETED", "DELETED-SPLIT", "DELETED-DEPRECATED"];
20
+ return subfields.some(({ code, value }) => code === "a" && values.includes(value));
44
21
  }
45
22
  }
46
23
  }
47
- function parseBoolean(value) {
48
- if (value === undefined) {
24
+ export function parseBoolean(value) {
25
+ if (value === void 0) {
49
26
  return false;
50
27
  }
51
28
  if (Number.isNaN(Number(value))) {
@@ -53,28 +30,27 @@ function parseBoolean(value) {
53
30
  }
54
31
  return Boolean(Number(value));
55
32
  }
56
- function getRecordTitle(record) {
57
- const TRIM_PATTERN = '[?!.,(){}:;/ ]*';
58
- // DEVELOP: get mainHeadings for aut records
59
- const field = record.get(/^245$/u).find(f => f.subfields.some(sf => sf.code === 'a'));
33
+ export function getRecordTitle(record) {
34
+ const TRIM_PATTERN = "[?!.,(){}:;/ ]*";
35
+ const field = record.get(/^245$/u).find((f) => f.subfields.some((sf) => sf.code === "a"));
60
36
  if (field) {
61
- return field.subfields.find(sf => sf.code === 'a').value.replace(new RegExp(`^${TRIM_PATTERN}`, 'u'), '').replace(new RegExp(`${TRIM_PATTERN}$`, 'u'), '');
37
+ return field.subfields.find((sf) => sf.code === "a").value.replace(new RegExp(`^${TRIM_PATTERN}`, "u"), "").replace(new RegExp(`${TRIM_PATTERN}$`, "u"), "");
62
38
  }
63
- return '';
39
+ return "";
64
40
  }
65
- function getRecordStandardIdentifiers(record) {
66
- return record.get(/^(?<def>020|022|024)$/u).filter(f => f.subfields.some(sf => ['a', 'z'].includes(sf.code))).map(field => {
67
- const subfield = field.subfields.find(sf => ['a', 'z'].includes(sf.code));
41
+ export function getRecordStandardIdentifiers(record) {
42
+ return record.get(/^(?<def>020|022|024)$/u).filter((f) => f.subfields.some((sf) => ["a", "z"].includes(sf.code))).map((field) => {
43
+ const subfield = field.subfields.find((sf) => ["a", "z"].includes(sf.code));
68
44
  return subfield.value;
69
45
  });
70
46
  }
71
- function clone(o) {
47
+ export function clone(o) {
72
48
  return JSON.parse(JSON.stringify(o));
73
49
  }
74
- function toAlephId(id) {
75
- return id.padStart(9, '0');
50
+ export function toAlephId(id) {
51
+ return id.padStart(9, "0");
76
52
  }
77
- function fromAlephId(id) {
78
- return id.replace(/^0+/u, '');
53
+ export function fromAlephId(id) {
54
+ return id.replace(/^0+/u, "");
79
55
  }
80
- //# sourceMappingURL=utils.js.map
56
+ //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1,7 @@
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
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils.js"],
4
+ "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"],
5
+ "mappings": "AAAO,gBAAS,4BAA4B,UAAU,WAAW,IAAI;AACnE,QAAM,UAAU,OAAO,KAAK,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE,SAAS,QAAQ;AACxE,SAAO,SAAS,OAAO;AACzB;AAEO,gBAAS,gBAAgB,QAAQ;AACtC,MAAI,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,OAAO,OAAO,CAAC,CAAC,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,KAAK,SAAS;AAE9B,WAAS,WAAW;AAClB,WAAO,OAAO,IAAI,QAAQ,EAAE,KAAK,KAAK;AAEtC,aAAS,MAAM,EAAC,UAAS,GAAG;AAC1B,aAAO,UAAU,KAAK,CAAC,EAAC,MAAM,MAAK,MAAM,SAAS,OAAO,UAAU,GAAG;AAAA,IACxE;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,OAAO,IAAI,QAAQ,EAAE,KAAK,KAAK;AAEtC,aAAS,MAAM,EAAC,UAAS,GAAG;AAC1B,YAAM,SAAS,CAAC,WAAW,iBAAiB,oBAAoB;AAChE,aAAO,UAAU,KAAK,CAAC,EAAC,MAAM,MAAK,MAAM,SAAS,OAAO,OAAO,SAAS,KAAK,CAAC;AAAA,IACjF;AAAA,EACF;AACF;AAEO,gBAAS,aAAa,OAAO;AAClC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG;AAC/B,WAAO,MAAM,SAAS,KAAK,CAAE,gBAAiB,KAAK,KAAK;AAAA,EAC1D;AAEA,SAAO,QAAQ,OAAO,KAAK,CAAC;AAC9B;AAEO,gBAAS,eAAe,QAAQ;AACrC,QAAM,eAAe;AAErB,QAAM,QAAQ,OACX,IAAI,QAAQ,EACZ,KAAK,OAAK,EAAE,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,CAAC;AAEpD,MAAI,OAAO;AACT,WAAO,MAAM,UAAU,KAAK,QAAM,GAAG,SAAS,GAAG,EAAE,MAChD,QAAQ,IAAI,OAAO,IAAI,YAAY,IAAI,GAAG,GAAG,EAAE,EAC/C,QAAQ,IAAI,OAAO,GAAG,YAAY,KAAK,GAAG,GAAG,EAAE;AAAA,EACpD;AAEA,SAAO;AACT;AAEO,gBAAS,6BAA6B,QAAQ;AACnD,SAAO,OAAO,IAAI,wBAAwB,EACvC,OAAO,OAAK,EAAE,UAAU,KAAK,QAAM,CAAC,KAAK,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,EAChE,IAAI,WAAS;AACZ,UAAM,WAAW,MAAM,UAAU,KAAK,QAAM,CAAC,KAAK,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;AACxE,WAAO,SAAS;AAAA,EAClB,CAAC;AACL;AAEO,gBAAS,MAAM,GAAG;AACvB,SAAO,KAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AACrC;AAEO,gBAAS,UAAU,IAAI;AAC5B,SAAO,GAAG,SAAS,GAAG,GAAG;AAC3B;AAEO,gBAAS,YAAY,IAAI;AAC9B,SAAO,GAAG,QAAQ,QAAQ,EAAE;AAC9B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,126 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { describe, it } from "node:test";
4
+ import assert from "node:assert";
5
+ import { MarcRecord } from "@natlibfi/marc-record";
6
+ import {
7
+ generateAuthorizationHeader,
8
+ isDeletedRecord,
9
+ parseBoolean,
10
+ clone,
11
+ getRecordTitle,
12
+ getRecordStandardIdentifiers
13
+ } from "./utils.js";
14
+ MarcRecord.setValidationOptions({ subfieldValues: false });
15
+ const FIXTURES_PATH = path.join(import.meta.dirname, "../test-fixtures/utils");
16
+ describe("utils", () => {
17
+ describe("generateAuthorizationHeader", () => {
18
+ it("Should create a proper Authorization header", () => {
19
+ const value = generateAuthorizationHeader("foo", "bar");
20
+ assert.equal(value, "Basic Zm9vOmJhcg==");
21
+ });
22
+ });
23
+ describe("isDeletedRecord", () => {
24
+ it("Should find the record deleted (Leader)", () => {
25
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record1.json"), "utf8");
26
+ const record = new MarcRecord(JSON.parse(data));
27
+ assert.equal(isDeletedRecord(record), true);
28
+ });
29
+ it("Should find the record deleted (DEL)", () => {
30
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record2.json"), "utf8");
31
+ const record = new MarcRecord(JSON.parse(data));
32
+ assert.equal(isDeletedRecord(record), true);
33
+ });
34
+ it("Should find the record deleted (STA)", () => {
35
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record3.json"), "utf8");
36
+ const record = new MarcRecord(JSON.parse(data));
37
+ assert.equal(isDeletedRecord(record), true);
38
+ });
39
+ it("Should find the record not deleted", () => {
40
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record4.json"), "utf8");
41
+ const record = new MarcRecord(JSON.parse(data));
42
+ assert.equal(isDeletedRecord(record), false);
43
+ });
44
+ it("Should find the record deleted (Split)", () => {
45
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record5.json"), "utf8");
46
+ const record = new MarcRecord(JSON.parse(data));
47
+ assert.equal(isDeletedRecord(record), true);
48
+ });
49
+ it("Should find the record deleted (Deprecated)", () => {
50
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record6.json"), "utf8");
51
+ const record = new MarcRecord(JSON.parse(data));
52
+ assert.equal(isDeletedRecord(record), true);
53
+ });
54
+ it("Should find the record deleted (Split (Aleph))", () => {
55
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record7.json"), "utf8");
56
+ const record = new MarcRecord(JSON.parse(data));
57
+ assert.equal(isDeletedRecord(record), true);
58
+ });
59
+ it("Should find the record deleted (Deprecated (Aleph))", () => {
60
+ const data = fs.readFileSync(path.join(FIXTURES_PATH, "isDeletedRecord/record8.json"), "utf8");
61
+ const record = new MarcRecord(JSON.parse(data));
62
+ assert.equal(isDeletedRecord(record), true);
63
+ });
64
+ });
65
+ describe("parseBoolean", () => {
66
+ it("Should parse undefined as false", () => {
67
+ assert.equal(parseBoolean(void 0), false);
68
+ });
69
+ it("Should parse zero-length string as false", () => {
70
+ assert.equal(parseBoolean(""), false);
71
+ });
72
+ it("Should parse numericish value as true", () => {
73
+ assert.equal(parseBoolean("1"), true);
74
+ });
75
+ it("Should parse numericush value as false", () => {
76
+ assert.equal(parseBoolean("0"), false);
77
+ });
78
+ it("Should parse literal 'false' value as false", () => {
79
+ assert.equal(parseBoolean("false"), false);
80
+ });
81
+ it("Should parse non-numericish value as true", () => {
82
+ assert.equal(parseBoolean("foo"), true);
83
+ });
84
+ it("Should parse literal 'FALSE' value as false", () => {
85
+ assert.equal(parseBoolean("FALSE"), false);
86
+ });
87
+ it("Should parse literal 'FAlsE' value as false", () => {
88
+ assert.equal(parseBoolean("FAlsE"), false);
89
+ });
90
+ });
91
+ describe("getRecordTitle", () => {
92
+ [
93
+ "Should find a title",
94
+ "Should not find a title"
95
+ ].forEach((descr, index) => {
96
+ it(descr, () => {
97
+ const title = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/title${index}.txt`), "utf8");
98
+ const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordTitle/record${index}.json`), "utf8");
99
+ const record = new MarcRecord(JSON.parse(recordData));
100
+ assert.equal(getRecordTitle(record), title);
101
+ });
102
+ });
103
+ });
104
+ describe("getRecordStandardIdentifiers", () => {
105
+ [
106
+ "Should find identifiers",
107
+ "Should not find an identifier"
108
+ ].forEach((descr, index) => {
109
+ it(descr, () => {
110
+ const identifiers = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/identifiers${index}.json`), "utf8"));
111
+ const recordData = fs.readFileSync(path.join(FIXTURES_PATH, `getRecordStandardIdentifiers/record${index}.json`), "utf8");
112
+ const record = new MarcRecord(JSON.parse(recordData));
113
+ assert.deepStrictEqual(getRecordStandardIdentifiers(record), identifiers);
114
+ });
115
+ });
116
+ });
117
+ describe("clone", () => {
118
+ it("Should clone an object", () => {
119
+ const obj = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `clone/1/obj.json`), "utf8"));
120
+ const cloned = clone(obj);
121
+ assert.equal(Object.is(obj, cloned), false);
122
+ assert.deepStrictEqual(cloned, obj);
123
+ });
124
+ });
125
+ });
126
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils.test.js"],
4
+ "sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport {describe, it} from 'node:test';\nimport assert from 'node:assert';\nimport {MarcRecord} from '@natlibfi/marc-record';\nimport {\n generateAuthorizationHeader, isDeletedRecord, parseBoolean, clone,\n getRecordTitle, getRecordStandardIdentifiers\n} from './utils.js';\n\nMarcRecord.setValidationOptions({subfieldValues: false});\n\nconst FIXTURES_PATH = path.join(import.meta.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 assert.equal(value, '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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), 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 assert.equal(isDeletedRecord(record), true);\n });\n });\n\n describe('parseBoolean', () => {\n it('Should parse undefined as false', () => {\n assert.equal(parseBoolean(undefined), false);\n });\n\n it('Should parse zero-length string as false', () => {\n assert.equal(parseBoolean(''), false);\n });\n\n it('Should parse numericish value as true', () => {\n assert.equal(parseBoolean('1'), true);\n });\n\n it('Should parse numericush value as false', () => {\n assert.equal(parseBoolean('0'), false);\n });\n\n it('Should parse literal \\'false\\' value as false', () => {\n assert.equal(parseBoolean('false'), false);\n });\n\n it('Should parse non-numericish value as true', () => {\n assert.equal(parseBoolean('foo'), true);\n });\n\n it('Should parse literal \\'FALSE\\' value as false', () => {\n assert.equal(parseBoolean('FALSE'), false);\n });\n\n it('Should parse literal \\'FAlsE\\' value as false', () => {\n assert.equal(parseBoolean('FAlsE'), 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 assert.equal(getRecordTitle(record), 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 assert.deepStrictEqual(getRecordStandardIdentifiers(record), identifiers);\n });\n });\n });\n\n describe('clone', () => {\n it('Should clone an object', () => {\n const obj = JSON.parse(fs.readFileSync(path.join(FIXTURES_PATH, `clone/1/obj.json`), 'utf8'));\n const cloned = clone(obj);\n\n assert.equal(Object.is(obj, cloned), false);\n assert.deepStrictEqual(cloned, obj);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }