@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.
- package/.github/workflows/melinda-node-tests.yml +2 -2
- package/dist/error.js +4 -11
- package/dist/error.js.map +7 -1
- package/dist/error.test.js +14 -0
- package/dist/error.test.js.map +7 -0
- package/dist/index.js +7 -42
- package/dist/index.js.map +7 -1
- package/dist/subRecordPicker.js +21 -47
- package/dist/subRecordPicker.js.map +7 -1
- package/dist/subRecordPicker.test.js +42 -0
- package/dist/subRecordPicker.test.js.map +7 -0
- package/dist/utils.js +25 -49
- package/dist/utils.js.map +7 -1
- package/dist/utils.test.js +126 -0
- package/dist/utils.test.js.map +7 -0
- package/eslint.config.mjs +52 -0
- package/package.json +16 -94
- package/src/error.js +2 -2
- package/src/error.test.js +15 -0
- package/src/subRecordPicker.js +5 -5
- package/src/{subRecordPicker.spec.js → subRecordPicker.test.js} +18 -9
- package/src/{utils.spec.js → utils.test.js} +27 -26
- package/dist/error.spec.js +0 -14
- package/dist/error.spec.js.map +0 -1
- package/dist/subRecordPicker.spec.js +0 -51
- package/dist/subRecordPicker.spec.js.map +0 -1
- package/dist/utils.spec.js +0 -117
- package/dist/utils.spec.js.map +0 -1
- package/src/error.spec.js +0 -12
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
node-version: [
|
|
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
|
|
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
|
-
|
|
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;
|
|
11
|
-
this.payload = payload;
|
|
4
|
+
this.status = status;
|
|
5
|
+
this.payload = payload;
|
|
12
6
|
}
|
|
13
7
|
}
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=error.js.map
|
|
8
|
+
//# sourceMappingURL=error.js.map
|
package/dist/error.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
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
|
-
{
|
|
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
|
+
}
|
package/dist/subRecordPicker.js
CHANGED
|
@@ -1,72 +1,46 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 = (
|
|
9
|
+
const debug = createDebugLogger("@natlibfi/melinda-commons:subRecordPicker");
|
|
18
10
|
debug(`SRU client url: ${sruUrl}`);
|
|
19
|
-
const sruClient = (
|
|
20
|
-
|
|
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
|
-
|
|
34
|
-
}).on(
|
|
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(
|
|
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(
|
|
56
|
-
promises.push(
|
|
57
|
-
|
|
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(
|
|
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
|
-
{
|
|
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
|
-
"
|
|
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 ([
|
|
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
|
-
|
|
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 ===
|
|
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
|
-
|
|
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 ===
|
|
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 => [
|
|
67
|
-
const subfield = field.subfields.find(sf => [
|
|
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,
|
|
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
|
-
{
|
|
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": "AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAQ,UAAU,UAAS;AAC3B,OAAO,YAAY;AACnB,SAAQ,kBAAiB;AACzB;AAAA,EACE;AAAA,EAA6B;AAAA,EAAiB;AAAA,EAAc;AAAA,EAC5D;AAAA,EAAgB;AAAA,OACX;AAEP,WAAW,qBAAqB,EAAC,gBAAgB,MAAK,CAAC;AAEvD,MAAM,gBAAgB,KAAK,KAAK,YAAY,SAAS,wBAAwB;AAE7E,SAAS,SAAS,MAAM;AACtB,WAAS,+BAA+B,MAAM;AAC5C,OAAG,+CAA+C,MAAM;AACtD,YAAM,QAAQ,4BAA4B,OAAO,KAAK;AACtD,aAAO,MAAM,OAAO,oBAAoB;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,mBAAmB,MAAM;AAChC,OAAG,2CAA2C,MAAM;AAClD,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,wCAAwC,MAAM;AAC/C,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,wCAAwC,MAAM;AAC/C,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,sCAAsC,MAAM;AAC7C,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,KAAK;AAAA,IAC7C,CAAC;AAED,OAAG,0CAA0C,MAAM;AACjD,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,+CAA+C,MAAM;AACtD,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,kDAAkD,MAAM;AACzD,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAED,OAAG,uDAAuD,MAAM;AAC9D,YAAM,OAAO,GAAG,aAAa,KAAK,KAAK,eAAe,8BAA8B,GAAG,MAAM;AAC7F,YAAM,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC;AAC9C,aAAO,MAAM,gBAAgB,MAAM,GAAG,IAAI;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AAED,WAAS,gBAAgB,MAAM;AAC7B,OAAG,mCAAmC,MAAM;AAC1C,aAAO,MAAM,aAAa,MAAS,GAAG,KAAK;AAAA,IAC7C,CAAC;AAED,OAAG,4CAA4C,MAAM;AACnD,aAAO,MAAM,aAAa,EAAE,GAAG,KAAK;AAAA,IACtC,CAAC;AAED,OAAG,yCAAyC,MAAM;AAChD,aAAO,MAAM,aAAa,GAAG,GAAG,IAAI;AAAA,IACtC,CAAC;AAED,OAAG,0CAA0C,MAAM;AACjD,aAAO,MAAM,aAAa,GAAG,GAAG,KAAK;AAAA,IACvC,CAAC;AAED,OAAG,+CAAiD,MAAM;AACxD,aAAO,MAAM,aAAa,OAAO,GAAG,KAAK;AAAA,IAC3C,CAAC;AAED,OAAG,6CAA6C,MAAM;AACpD,aAAO,MAAM,aAAa,KAAK,GAAG,IAAI;AAAA,IACxC,CAAC;AAED,OAAG,+CAAiD,MAAM;AACxD,aAAO,MAAM,aAAa,OAAO,GAAG,KAAK;AAAA,IAC3C,CAAC;AAED,OAAG,+CAAiD,MAAM;AACxD,aAAO,MAAM,aAAa,OAAO,GAAG,KAAK;AAAA,IAC3C,CAAC;AAAA,EAEH,CAAC;AAED,WAAS,kBAAkB,MAAM;AAC/B;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,OAAO,UAAU;AAC1B,SAAG,OAAO,MAAM;AACd,cAAM,QAAQ,GAAG,aAAa,KAAK,KAAK,eAAe,uBAAuB,KAAK,MAAM,GAAG,MAAM;AAClG,cAAM,aAAa,GAAG,aAAa,KAAK,KAAK,eAAe,wBAAwB,KAAK,OAAO,GAAG,MAAM;AACzG,cAAM,SAAS,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC;AAEpD,eAAO,MAAM,eAAe,MAAM,GAAG,KAAK;AAAA,MAC5C,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,gCAAgC,MAAM;AAC7C;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE,QAAQ,CAAC,OAAO,UAAU;AAC1B,SAAG,OAAO,MAAM;AACd,cAAM,cAAc,KAAK,MAAM,GAAG,aAAa,KAAK,KAAK,eAAe,2CAA2C,KAAK,OAAO,GAAG,MAAM,CAAC;AACzI,cAAM,aAAa,GAAG,aAAa,KAAK,KAAK,eAAe,sCAAsC,KAAK,OAAO,GAAG,MAAM;AACvH,cAAM,SAAS,IAAI,WAAW,KAAK,MAAM,UAAU,CAAC;AAEpD,eAAO,gBAAgB,6BAA6B,MAAM,GAAG,WAAW;AAAA,MAC1E,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,WAAS,SAAS,MAAM;AACtB,OAAG,0BAA0B,MAAM;AACjC,YAAM,MAAM,KAAK,MAAM,GAAG,aAAa,KAAK,KAAK,eAAe,kBAAkB,GAAG,MAAM,CAAC;AAC5F,YAAM,SAAS,MAAM,GAAG;AAExB,aAAO,MAAM,OAAO,GAAG,KAAK,MAAM,GAAG,KAAK;AAC1C,aAAO,gBAAgB,QAAQ,GAAG;AAAA,IACpC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|