@natlibfi/melinda-rest-api-commons 6.1.0-alpha.0 → 6.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 (92) hide show
  1. package/.github/workflows/melinda-node-tests-and-publish.yml +4 -2
  2. package/README.md +211 -14
  3. package/dist/amqp.d.ts +41 -0
  4. package/dist/amqp.d.ts.map +1 -0
  5. package/dist/amqp.js +251 -235
  6. package/dist/amqp.js.map +1 -7
  7. package/dist/constants.d.ts +49 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +38 -38
  10. package/dist/constants.js.map +1 -7
  11. package/dist/helpers/conversion.d.ts +8 -0
  12. package/dist/helpers/conversion.d.ts.map +1 -0
  13. package/dist/helpers/conversion.js +70 -64
  14. package/dist/helpers/conversion.js.map +1 -7
  15. package/dist/helpers/fix-constants.d.ts +76 -0
  16. package/dist/helpers/fix-constants.d.ts.map +1 -0
  17. package/dist/helpers/fix-constants.js +41 -41
  18. package/dist/helpers/fix-constants.js.map +1 -7
  19. package/dist/helpers/fix-handle-tempurns.d.ts +3 -0
  20. package/dist/helpers/fix-handle-tempurns.d.ts.map +1 -0
  21. package/dist/helpers/fix-handle-tempurns.js +73 -71
  22. package/dist/helpers/fix-handle-tempurns.js.map +1 -7
  23. package/dist/helpers/fix-strip-f884s.d.ts +10 -0
  24. package/dist/helpers/fix-strip-f884s.d.ts.map +1 -0
  25. package/dist/helpers/fix-strip-f884s.js +161 -163
  26. package/dist/helpers/fix-strip-f884s.js.map +1 -7
  27. package/dist/helpers/fix.d.ts +6 -0
  28. package/dist/helpers/fix.d.ts.map +1 -0
  29. package/dist/helpers/fix.js +133 -121
  30. package/dist/helpers/fix.js.map +1 -7
  31. package/dist/helpers/validation.d.ts +9 -0
  32. package/dist/helpers/validation.d.ts.map +1 -0
  33. package/dist/helpers/validation.js +14 -16
  34. package/dist/helpers/validation.js.map +1 -7
  35. package/dist/index.d.ts +13 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -7
  39. package/dist/mongo.d.ts +165 -0
  40. package/dist/mongo.d.ts.map +1 -0
  41. package/dist/mongo.js +595 -547
  42. package/dist/mongo.js.map +1 -7
  43. package/dist/mongoError.d.ts +2 -0
  44. package/dist/mongoError.d.ts.map +1 -0
  45. package/dist/mongoError.js +19 -0
  46. package/dist/mongoError.js.map +1 -0
  47. package/dist/mongoLog.d.ts +50 -0
  48. package/dist/mongoLog.d.ts.map +1 -0
  49. package/dist/mongoLog.js +274 -242
  50. package/dist/mongoLog.js.map +1 -7
  51. package/dist/utils.d.ts +36 -0
  52. package/dist/utils.d.ts.map +1 -0
  53. package/dist/utils.js +112 -110
  54. package/dist/utils.js.map +1 -7
  55. package/eslint.config.ts +66 -0
  56. package/package.json +17 -11
  57. package/{tests/amqp-error-branches.test.js → test/amqp-error-branches.test.ts} +135 -61
  58. package/{tests/amqp.healthtest.js → test/amqp.healthtest.ts} +19 -11
  59. package/{tests/amqp.tests.localtest.js → test/amqp.tests.localtest.ts} +54 -35
  60. package/{tests/helpers/conversion.test.js → test/helpers/conversion.test.ts} +26 -14
  61. package/{tests/helpers/fix-edge.test.js → test/helpers/fix-edge.test.ts} +16 -12
  62. package/{tests/helpers/fix.test.js → test/helpers/fix.test.ts} +14 -8
  63. package/{tests/helpers/validation.test.js → test/helpers/validation.test.ts} +7 -6
  64. package/{tests/mongo-add-blob-size.test.js → test/mongo-add-blob-size.test.ts} +14 -15
  65. package/{tests/mongo-check-and-check-state.test.js → test/mongo-check-and-check-state.test.ts} +6 -8
  66. package/{tests/mongo-check-and-set-import-job-state.test.js → test/mongo-check-and-set-import-job-state.test.ts} +6 -9
  67. package/{tests/mongo-check-timeout.test.js → test/mongo-check-timeout.test.ts} +6 -9
  68. package/{tests/mongo-create-bulk.test.js → test/mongo-create-bulk.test.ts} +6 -7
  69. package/{tests/mongo-create-prio.test.js → test/mongo-create-prio.test.ts} +6 -6
  70. package/{tests/mongo-error-branches.test.js → test/mongo-error-branches.test.ts} +166 -65
  71. package/{tests/mongo-get-one.test.js → test/mongo-get-one.test.ts} +6 -6
  72. package/{tests/mongo-get-stream.test.js → test/mongo-get-stream.test.ts} +6 -8
  73. package/{tests/mongo-push-ids.test.js → test/mongo-push-ids.test.ts} +6 -6
  74. package/{tests/mongo-push-messages.test.js → test/mongo-push-messages.test.ts} +6 -6
  75. package/{tests/mongo-query-by-id.test.js → test/mongo-query-by-id.test.ts} +6 -9
  76. package/{tests/mongo-query.test.js → test/mongo-query.test.ts} +6 -7
  77. package/{tests/mongo-read-content.test.js → test/mongo-read-content.test.ts} +6 -9
  78. package/{tests/mongo-remove.test.js → test/mongo-remove.test.ts} +6 -8
  79. package/{tests/mongo-set-blob-size.test.js → test/mongo-set-blob-size.test.ts} +6 -6
  80. package/{tests/mongo-set-import-job-state.test.js → test/mongo-set-import-job-state.test.ts} +6 -6
  81. package/{tests/mongo-set-operation.test.js → test/mongo-set-operation.test.ts} +6 -6
  82. package/{tests/mongo-set-operations.test.js → test/mongo-set-operations.test.ts} +6 -6
  83. package/{tests/mongo-set-state.test.js → test/mongo-set-state.test.ts} +6 -6
  84. package/{tests/mongoLog-protect.test.js → test/mongoLog-protect.test.ts} +18 -17
  85. package/{tests/mongoLog.test.js → test/mongoLog.test.ts} +8 -8
  86. package/{tests/testUtils.js → test/testUtils.ts} +49 -15
  87. package/{tests/utils.test.js → test/utils.test.ts} +5 -5
  88. package/tsconfig.json +62 -0
  89. package/tsconfig.test.json +17 -0
  90. package/dist/helpers/fix-utils.js +0 -39
  91. package/dist/helpers/fix-utils.js.map +0 -7
  92. package/eslint.config.js +0 -53
@@ -0,0 +1,36 @@
1
+ export declare function logError(err: unknown): void;
2
+ export declare function assertString(value: unknown, name: string): void;
3
+ export declare function assertNumber(value: unknown, name: string): void;
4
+ export declare function assertImportJobStateFilter(value: Record<string, unknown>, name: string): void;
5
+ export declare function createImportJobState(operation: string, state: string, queryImportJobState?: boolean): Record<string, string>;
6
+ export declare function createRecordResponseItem(params: {
7
+ responsePayload?: any;
8
+ responseStatus: number | string;
9
+ recordMetadata?: unknown;
10
+ id?: string;
11
+ }): {
12
+ recordStatus: any;
13
+ detailedRecordStatus: any;
14
+ message: any;
15
+ ids?: undefined;
16
+ databaseId: string;
17
+ recordMetadata: any;
18
+ } | {
19
+ recordStatus: string;
20
+ detailedRecordStatus: any;
21
+ message: any;
22
+ ids: any;
23
+ databaseId: string;
24
+ recordMetadata: any;
25
+ };
26
+ export declare function addRecordResponseItem({ recordResponseItem, correlationId, mongoOperator }: {
27
+ recordResponseItem: unknown;
28
+ correlationId: string;
29
+ mongoOperator: any;
30
+ }): Promise<boolean>;
31
+ export declare function addRecordResponseItems({ recordResponseItems, correlationId, mongoOperator }: {
32
+ recordResponseItems: unknown;
33
+ correlationId: string;
34
+ mongoOperator: any;
35
+ }): Promise<boolean>;
36
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAUA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,QAapC;AAKD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAIxD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAIxD;AAMD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,QAatF;AAKD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,UAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB1H;AAKD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE;IAC/C,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;;;;;;;;;;;;;;EAiBA;AAkFD,wBAAsB,qBAAqB,CAAC,EAC1C,kBAAkB,EAClB,aAAa,EACb,aAAa,EACd,EAAE;IACD,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAMD,wBAAsB,sBAAsB,CAAC,EAC3C,mBAAmB,EACnB,aAAa,EACb,aAAa,EACd,EAAE;IACD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CAMnB"}
package/dist/utils.js CHANGED
@@ -1,131 +1,133 @@
1
- import httpStatus from "http-status";
2
- import { createLogger, Error as ApiError } from "@natlibfi/melinda-commons";
1
+ import httpStatus from 'http-status';
2
+ import { createLogger, Error as ApiError } from '@natlibfi/melinda-commons';
3
3
  import { IMPORT_JOB_STATE, OPERATIONS } from "./constants.js";
4
4
  const logger = createLogger();
5
5
  export function logError(err) {
6
- if (err instanceof ApiError) {
7
- logger.error(JSON.stringify(err));
8
- return;
9
- }
10
- if (err === "SIGINT") {
11
- logger.error(err);
12
- return;
13
- }
14
- logger.error(err.stack === void 0 ? err : err.stack);
6
+ if (err instanceof ApiError) {
7
+ logger.error(JSON.stringify(err));
8
+ return;
9
+ }
10
+ if (err === 'SIGINT') {
11
+ logger.error(err);
12
+ return;
13
+ }
14
+ const maybeError = err;
15
+ logger.error(maybeError.stack === undefined ? err : maybeError.stack);
15
16
  }
16
17
  export function assertString(value, name) {
17
- if (typeof value !== "string") {
18
- throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a string`);
19
- }
18
+ if (typeof value !== 'string') {
19
+ throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a string`);
20
+ }
20
21
  }
21
22
  export function assertNumber(value, name) {
22
- if (typeof value !== "number") {
23
- throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a number`);
24
- }
23
+ if (typeof value !== 'number') {
24
+ throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a number`);
25
+ }
25
26
  }
26
27
  export function assertImportJobStateFilter(value, name) {
27
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
28
- throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be an object`);
29
- }
30
- const validKeys = Object.values(OPERATIONS).map((operation) => `importJobState.${operation}`);
31
- for (const [key, state] of Object.entries(value)) {
32
- if (!validKeys.includes(key)) {
33
- throw new ApiError(httpStatus.BAD_REQUEST, `${name} key ${key} must be one of ${validKeys.join(", ")}`);
34
- }
35
- if (typeof state !== "string") {
36
- throw new ApiError(httpStatus.BAD_REQUEST, `${name}.${key} must be a string`);
37
- }
38
- }
28
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
29
+ throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be an object`);
30
+ }
31
+ const validKeys = Object.values(OPERATIONS).map(operation => `importJobState.${operation}`);
32
+ for (const [key, state] of Object.entries(value)) {
33
+ if (!validKeys.includes(key)) {
34
+ throw new ApiError(httpStatus.BAD_REQUEST, `${name} key ${key} must be one of ${validKeys.join(', ')}`);
35
+ }
36
+ if (typeof state !== 'string') {
37
+ throw new ApiError(httpStatus.BAD_REQUEST, `${name}.${key} must be a string`);
38
+ }
39
+ }
39
40
  }
40
41
  export function createImportJobState(operation, state, queryImportJobState = false) {
41
- if (!(state in IMPORT_JOB_STATE)) {
42
- throw new Error("Invalid IMPORT_JOB_STATE");
43
- }
44
- if (!(operation in OPERATIONS)) {
45
- throw new Error("Invalid operation");
46
- }
47
- if (queryImportJobState) {
48
- const importJobStateWithOperation = `importJobState.${operation}`;
49
- const importJobStateForQuery = { [importJobStateWithOperation]: state };
50
- return importJobStateForQuery;
51
- }
52
- return { [operation]: state };
42
+ if (!(state in IMPORT_JOB_STATE)) {
43
+ throw new Error('Invalid IMPORT_JOB_STATE');
44
+ }
45
+ if (!(operation in OPERATIONS)) {
46
+ throw new Error('Invalid operation');
47
+ }
48
+ if (queryImportJobState) {
49
+ const importJobStateWithOperation = `importJobState.${operation}`;
50
+ const importJobStateForQuery = { [importJobStateWithOperation]: state };
51
+ return importJobStateForQuery;
52
+ }
53
+ return { [operation]: state };
53
54
  }
54
- export function createRecordResponseItem({ responsePayload, responseStatus, recordMetadata, id }) {
55
- if (responsePayload === void 0 || responsePayload === null) {
56
- throw new Error("responsePayload must be an object or a string!");
57
- }
58
- const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);
59
- const recordResponseItem = {
60
- databaseId: id || "000000000",
61
- recordMetadata: responsePayload.recordMetadata || recordMetadata || void 0,
62
- ...recordResponseStatusAndMessage
63
- };
64
- return recordResponseItem;
55
+ export function createRecordResponseItem(params) {
56
+ const { responsePayload, responseStatus, recordMetadata, id } = params;
57
+ if (responsePayload === undefined || responsePayload === null) {
58
+ throw new Error('responsePayload must be an object or a string!');
59
+ }
60
+ const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);
61
+ const recordResponseItem = {
62
+ databaseId: id || '000000000',
63
+ recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,
64
+ ...recordResponseStatusAndMessage
65
+ };
66
+ return recordResponseItem;
65
67
  }
66
68
  function getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {
67
- logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
68
- const message = getMessageFromResponsePayload(responsePayload);
69
- const ids = responsePayload.ids || [];
70
- logger.debug(`Response message: ${message}`);
71
- if (["UPDATED", "CREATED", "INVALID", "ERROR", "SKIPPED", "FIXED"].includes(responseStatus)) {
72
- return { recordStatus: responseStatus, detailedRecordStatus: responseStatus, message };
73
- }
74
- if (["SKIPPED_CHANGE", "SKIPPED_UPDATE"].includes(responseStatus)) {
75
- return { recordStatus: "SKIPPED", detailedRecordStatus: responseStatus, message };
76
- }
77
- if (["UNKNOWN"].includes(responseStatus)) {
78
- return { recordStatus: "ERROR", detailedRecordStatus: responseStatus, message, ids };
79
- }
80
- if ([httpStatus.CONFLICT, "CONFLICT"].includes(responseStatus)) {
81
- if (/^Duplicates in database/u.test(message)) {
82
- return { recordStatus: "DUPLICATE", detailedRecordStatus: "DUPLICATE", message, ids };
83
- }
84
- if (/^MatchValidation for all/u.test(message)) {
85
- return { recordStatus: "ERROR", detailedRecordStatus: "CONFLICT", message, ids };
86
- }
87
- if (ids.length > 1 || ids.length > 0 && ids[0] !== id) {
88
- return { recordStatus: "ERROR", detailedRecordStatus: "CONFLICT", message, ids };
89
- }
90
- return { recordStatus: "ERROR", detailedRecordStatus: "CONFLICT", message };
91
- }
92
- if ([httpStatus.UNPROCESSABLE_ENTITY, "UNPROCESSABLE_ENTITY"].includes(responseStatus)) {
93
- if (ids.length > 1 || ids.length > 0 && ids[0] !== id) {
94
- return { recordStatus: "INVALID", detailedRecordStatus: "UNPROCESSABLE_ENTITY", message, ids };
95
- }
96
- return { recordStatus: "INVALID", detailedRecordStatus: "UNPROCESSABLE_ENTITY", message };
97
- }
98
- if ([httpStatus.NOT_FOUND, "NOT_FOUND"].includes(responseStatus)) {
99
- return { recordStatus: "ERROR", detailedRecordStatus: "NOT_FOUND", message };
100
- }
101
- if ([httpStatus.FORBIDDEN, "FORBIDDEN"].includes(responseStatus)) {
102
- return { recordStatus: "ERROR", detailedRecordStatus: "FORBIDDEN", message };
103
- }
104
- logger.debug(`Unknown responseStatus: ${responseStatus}`);
105
- const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;
106
- return { recordStatus: "ERROR", detailedRecordStatus: responseStatus, message: newMessage };
69
+ logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);
70
+ const message = getMessageFromResponsePayload(responsePayload);
71
+ const ids = responsePayload.ids || [];
72
+ logger.debug(`Response message: ${message}`);
73
+ if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {
74
+ return { recordStatus: responseStatus, detailedRecordStatus: responseStatus, message };
75
+ }
76
+ if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {
77
+ return { recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message };
78
+ }
79
+ if (['UNKNOWN'].includes(responseStatus)) {
80
+ return { recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids };
81
+ }
82
+ if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {
83
+ if ((/^Duplicates in database/u).test(message)) {
84
+ return { recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids };
85
+ }
86
+ if ((/^MatchValidation for all/u).test(message)) {
87
+ return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids };
88
+ }
89
+ if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {
90
+ return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids };
91
+ }
92
+ return { recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message };
93
+ }
94
+ if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {
95
+ if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {
96
+ return { recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids };
97
+ }
98
+ return { recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message };
99
+ }
100
+ if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {
101
+ return { recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message };
102
+ }
103
+ if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {
104
+ return { recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message };
105
+ }
106
+ logger.debug(`Unknown responseStatus: ${responseStatus}`);
107
+ const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;
108
+ return { recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage };
107
109
  }
108
110
  function getMessageFromResponsePayload(responsePayload) {
109
- if (responsePayload.message) {
110
- return responsePayload.message;
111
- }
112
- if (typeof responsePayload === "string" || responsePayload instanceof String) {
113
- return responsePayload;
114
- }
115
- return "";
111
+ if (responsePayload.message) {
112
+ return responsePayload.message;
113
+ }
114
+ if (typeof responsePayload === 'string' || responsePayload instanceof String) {
115
+ return responsePayload;
116
+ }
117
+ return '';
116
118
  }
117
119
  export async function addRecordResponseItem({ recordResponseItem, correlationId, mongoOperator }) {
118
- if (!recordResponseItem || typeof recordResponseItem !== "object" || Array.isArray(recordResponseItem)) {
119
- throw new Error("RecordResponseItem is not an object!");
120
- }
121
- await mongoOperator.pushMessages({ correlationId, messages: [recordResponseItem], messageField: "records" });
122
- return true;
120
+ if (!recordResponseItem || typeof recordResponseItem !== 'object' || Array.isArray(recordResponseItem)) {
121
+ throw new Error('RecordResponseItem is not an object!');
122
+ }
123
+ await mongoOperator.pushMessages({ correlationId, messages: [recordResponseItem], messageField: 'records' });
124
+ return true;
123
125
  }
124
126
  export async function addRecordResponseItems({ recordResponseItems, correlationId, mongoOperator }) {
125
- if (!Array.isArray(recordResponseItems)) {
126
- throw new Error("RecordResponseItems is not an array!");
127
- }
128
- await mongoOperator.pushMessages({ correlationId, messages: recordResponseItems, messageField: "records" });
129
- return true;
127
+ if (!Array.isArray(recordResponseItems)) {
128
+ throw new Error('RecordResponseItems is not an array!');
129
+ }
130
+ await mongoOperator.pushMessages({ correlationId, messages: recordResponseItems, messageField: 'records' });
131
+ return true;
130
132
  }
131
- //# sourceMappingURL=utils.js.map
133
+ //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1,7 +1 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/utils.js"],
4
- "sourcesContent": ["import httpStatus from 'http-status';\nimport {createLogger, Error as ApiError} from '@natlibfi/melinda-commons';\nimport {IMPORT_JOB_STATE, OPERATIONS} from './constants.js';\n\nconst logger = createLogger();\n\nexport function logError(err) {\n if (err instanceof ApiError) {\n logger.error(JSON.stringify(err));\n return;\n }\n\n if (err === 'SIGINT') {\n logger.error(err);\n return;\n }\n\n logger.error(err.stack === undefined ? err : err.stack);\n}\n\n// Entry-point type guards: correlationIds and scalar params are expected as\n// plain strings/numbers. A non-scalar (e.g. an object) would be spliced into\n// the query as a MongoDB operator, so reject it with 400 before any query.\nexport function assertString(value, name) {\n if (typeof value !== 'string') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a string`);\n }\n}\n\nexport function assertNumber(value, name) {\n if (typeof value !== 'number') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be a number`);\n }\n}\n\n// getOne may filter on import job state subfields (importJobState.CREATE /\n// .UPDATE / .FIX), which are spliced straight into the Mongo filter, so a\n// $-operator key or an object value would inject operators: restrict the keys\n// to the known operations and the values to plain state strings.\nexport function assertImportJobStateFilter(value, name) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} must be an object`);\n }\n const validKeys = Object.values(OPERATIONS).map(operation => `importJobState.${operation}`);\n for (const [key, state] of Object.entries(value)) {\n if (!validKeys.includes(key)) {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name} key ${key} must be one of ${validKeys.join(', ')}`);\n }\n if (typeof state !== 'string') {\n throw new ApiError(httpStatus.BAD_REQUEST, `${name}.${key} must be a string`);\n }\n }\n}\n\nexport function createImportJobState(operation, state, queryImportJobState = false) {\n if (!(state in IMPORT_JOB_STATE)) {\n throw new Error('Invalid IMPORT_JOB_STATE');\n }\n\n if (!(operation in OPERATIONS)) {\n throw new Error('Invalid operation');\n }\n\n if (queryImportJobState) {\n const importJobStateWithOperation = `importJobState.${operation}`;\n const importJobStateForQuery = {[importJobStateWithOperation]: state};\n\n return importJobStateForQuery;\n }\n\n return {[operation]: state};\n}\n\nexport function createRecordResponseItem({responsePayload, responseStatus, recordMetadata, id}) {\n // symmetric with addRecordResponseItem \u2014 reject a missing payload up\n // front with a clear message instead of a raw TypeError further down.\n // Strings are a valid payload form (see getMessageFromResponsePayload),\n // so only undefined/null are rejected.\n if (responsePayload === undefined || responsePayload === null) {\n throw new Error('responsePayload must be an object or a string!');\n }\n\n const recordResponseStatusAndMessage = getRecordResponseStatusAndMessage(responseStatus, responsePayload, id);\n const recordResponseItem = {\n databaseId: id || '000000000',\n recordMetadata: responsePayload.recordMetadata || recordMetadata || undefined,\n ...recordResponseStatusAndMessage\n };\n return recordResponseItem;\n}\n\nfunction getRecordResponseStatusAndMessage(responseStatus, responsePayload, id) {\n\n logger.debug(`Response status: ${responseStatus} responsePayload: ${JSON.stringify(responsePayload)}`);\n //const responseStatusName = httpStatus[`${responseStatus}_NAME`];\n //logger.debug(`Response status name: ${responseStatusName}`);\n\n const message = getMessageFromResponsePayload(responsePayload);\n const ids = responsePayload.ids || [];\n\n logger.debug(`Response message: ${message}`);\n\n // We map responseStatus here for a wider recordStatus and more detailed detailedRecordStatus\n // recordStatus corresponds to RECORD_IMPORT_STATEs used in https://github.com/NatLibFi/melinda-record-import-commons-js\n\n // Non-http statuses\n if (['UPDATED', 'CREATED', 'INVALID', 'ERROR', 'SKIPPED', 'FIXED'].includes(responseStatus)) {\n return {recordStatus: responseStatus, detailedRecordStatus: responseStatus, message};\n }\n\n // More detailed SKIPPED statuses\n if (['SKIPPED_CHANGE', 'SKIPPED_UPDATE'].includes(responseStatus)) {\n return {recordStatus: 'SKIPPED', detailedRecordStatus: responseStatus, message};\n }\n\n if (['UNKNOWN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message, ids};\n }\n\n // Duplicates and other CONFLICT statuses\n if ([httpStatus.CONFLICT, 'CONFLICT'].includes(responseStatus)) {\n if ((/^Duplicates in database/u).test(message)) {\n return {recordStatus: 'DUPLICATE', detailedRecordStatus: 'DUPLICATE', message, ids};\n }\n if ((/^MatchValidation for all/u).test(message)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n\n // Use ids only if there are more than one id or the id in payload does not match databaseId\n // only compare ids[0] when there is at least one id\n if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message, ids};\n }\n return {recordStatus: 'ERROR', detailedRecordStatus: 'CONFLICT', message};\n }\n\n if ([httpStatus.UNPROCESSABLE_ENTITY, 'UNPROCESSABLE_ENTITY'].includes(responseStatus)) {\n // only compare ids[0] when there is at least one id\n if (ids.length > 1 || (ids.length > 0 && ids[0] !== id)) {\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message, ids};\n }\n return {recordStatus: 'INVALID', detailedRecordStatus: 'UNPROCESSABLE_ENTITY', message};\n }\n\n if ([httpStatus.NOT_FOUND, 'NOT_FOUND'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'NOT_FOUND', message};\n }\n\n if ([httpStatus.FORBIDDEN, 'FORBIDDEN'].includes(responseStatus)) {\n return {recordStatus: 'ERROR', detailedRecordStatus: 'FORBIDDEN', message};\n }\n\n // Otherwise\n logger.debug(`Unknown responseStatus: ${responseStatus}`);\n const newMessage = `${message} - Unknown recordStatus: ${responseStatus}`;\n return {recordStatus: 'ERROR', detailedRecordStatus: responseStatus, message: newMessage};\n}\n\nfunction getMessageFromResponsePayload(responsePayload) {\n if (responsePayload.message) {\n return responsePayload.message;\n }\n if (typeof responsePayload === 'string' || responsePayload instanceof String) {\n return responsePayload;\n }\n return '';\n}\n\nexport async function addRecordResponseItem({recordResponseItem, correlationId, mongoOperator}) {\n // symmetric with addRecordResponseItems \u2014 reject non-object input\n // (including arrays) before it gets pushed into the records field\n if (!recordResponseItem || typeof recordResponseItem !== 'object' || Array.isArray(recordResponseItem)) {\n throw new Error('RecordResponseItem is not an object!');\n }\n await mongoOperator.pushMessages({correlationId, messages: [recordResponseItem], messageField: 'records'});\n return true;\n}\n\n// Use addRecordResponseItems to add several recordResponseItems in one mongo operation to avoid writeconflicts\nexport async function addRecordResponseItems({recordResponseItems, correlationId, mongoOperator}) {\n if (!Array.isArray(recordResponseItems)) {\n throw new Error('RecordResponseItems is not an array!');\n }\n await mongoOperator.pushMessages({correlationId, messages: recordResponseItems, messageField: 'records'});\n return true;\n}\n\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ // @ts-check
2
+ import {defineConfig} from 'eslint/config';
3
+ import tseslint from 'typescript-eslint';
4
+
5
+ // House rules (see melinda-commons-js) for src/ and test/. The
6
+ // typescript-eslint no-unused-vars variant is used because the base rule
7
+ // does not understand TS syntax (interface method params etc.).
8
+ const houseRules = {
9
+ "array-callback-return": [
10
+ "error",
11
+ {
12
+ "checkForEach": false
13
+ }
14
+ ],
15
+ "eqeqeq": ["error", "always"],
16
+ "max-depth": ["warn", 4],
17
+ "max-lines": ["warn", 500],
18
+ "max-lines-per-function": ["warn", {"max": 100}],
19
+ "no-console": "warn",
20
+ "no-const-assign": "error",
21
+ "no-else-return": ["error", {allowElseIf: false}],
22
+ "no-plusplus": [
23
+ "error",
24
+ {
25
+ "allowForLoopAfterthoughts": true
26
+ }
27
+ ],
28
+ "no-unused-vars": "off",
29
+ "@typescript-eslint/no-unused-vars": [
30
+ "error",
31
+ {
32
+ "argsIgnorePattern": "next"
33
+ }
34
+ ],
35
+ "no-var": "error",
36
+ "no-warning-comments": "off"
37
+ };
38
+
39
+ export default defineConfig(
40
+ [
41
+ ...tseslint.configs.recommended,
42
+ ...tseslint.configs.stylistic,
43
+ {
44
+ files: [
45
+ "src/**/*.ts",
46
+ "test/**/*.ts"
47
+ ],
48
+ ignores: ['node_modules/**', "**/.*", "**/dist/"],
49
+ linterOptions: {
50
+ reportUnusedInlineConfigs: "error",
51
+ reportUnusedDisableDirectives: true
52
+ },
53
+ rules: houseRules
54
+ },
55
+ {
56
+ // Fixture-driven test scaffolding: any-typed fixture values and no-op
57
+ // stubs are intentional in tests (tsc -p tsconfig.test.json still
58
+ // typechecks the directory).
59
+ files: ["test/**/*.ts"],
60
+ rules: {
61
+ "@typescript-eslint/no-explicit-any": "off",
62
+ "@typescript-eslint/no-empty-function": "off"
63
+ }
64
+ }
65
+ ]
66
+ );
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "url": "https://github.com/NatLibFi/melinda-rest-api-commons"
14
14
  },
15
15
  "license": "MIT",
16
- "version": "6.1.0-alpha.0",
16
+ "version": "6.2.0-alpha.1",
17
17
  "main": "./dist/index.js",
18
18
  "type": "module",
19
19
  "engines": {
@@ -24,14 +24,15 @@
24
24
  },
25
25
  "scripts": {
26
26
  "prepare": "npm run build",
27
- "build": "esbuild ./src/*.js ./src/**/*.js --sourcemap --platform=node --main-fields=main --outdir=dist --allow-overwrite --analyze",
28
- "lint": "eslint ./src",
29
- "lint:dev": "eslint --fix ./src",
30
- "test": "npm run lint && npm run test:base",
31
- "test:base": "node --test --test-force-exit --experimental-test-coverage --test-coverage-lines=88 --test-coverage-branches=88 --test-coverage-functions=90 --test-reporter=spec './tests/**/*.test.js'",
32
- "test:local": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './tests/amqp.*.localtest.js'",
33
- "test:healthcheck": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './tests/amqp.healthtest.js'",
34
- "watch:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './tests/**/*.test.js'",
27
+ "build": "tsc",
28
+ "lint": "eslint ./src ./test",
29
+ "lint:dev": "eslint --fix ./src ./test",
30
+ "typecheck": "tsc -p tsconfig.test.json",
31
+ "test": "npm run lint && npm run typecheck && npm run test:base",
32
+ "test:base": "node --test --test-force-exit --experimental-test-coverage --test-coverage-lines=88 --test-coverage-branches=88 --test-coverage-functions=90 --test-coverage-include=src/** --test-reporter=spec 'test/**/*.test.ts'",
33
+ "test:local": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/amqp.*.localtest.ts'",
34
+ "test:healthcheck": "cross-env NODE_ENV=test node --test --test-force-exit --experimental-test-coverage --test-reporter=spec './test/amqp.healthtest.ts'",
35
+ "watch:test": "cross-env DEBUG=@natlibfi/* NODE_ENV=test node --watch --test --experimental-test-coverage --test-reporter=spec './test/**/*.test.ts'",
35
36
  "dev": "npm run watch:test",
36
37
  "dev:debug": "cross-env LOG_LEVEL=debug DEBUG=@natlibfi/* NODE_ENV=test npm run watch:test"
37
38
  },
@@ -50,8 +51,13 @@
50
51
  "@natlibfi/fixugen": "^4.0.0",
51
52
  "@natlibfi/fixura": "^5.0.0",
52
53
  "@natlibfi/fixura-mongo": "^4.0.2",
54
+ "@types/debug": "^4.1.13",
55
+ "@types/http-status": "^0.2.30",
56
+ "@types/node": "^25.9.9",
53
57
  "cross-env": "^10.1.0",
54
- "esbuild": "^0.28.1",
55
- "eslint": "^10.12.0"
58
+ "eslint": "^10.12.0",
59
+ "jiti": "^2.7.0",
60
+ "typescript": "^6.0.3",
61
+ "typescript-eslint": "^8.72.0"
56
62
  }
57
63
  }