@biblioteksentralen/marc 0.2.0 → 0.4.0

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/README.md CHANGED
@@ -103,4 +103,6 @@ const result = validate(record.toJSON());
103
103
 
104
104
  ## Changelog
105
105
 
106
+ - 0.4.0: Line MARC serialization: Remove linebreaks and trim surrounding whitespace
107
+ - 0.3.0: Upgrade to Zod 4
106
108
  - 0.2.0: Removed the logger argument from `MarcRecord.fromJSON()`.
package/dist/index.cjs CHANGED
@@ -247,14 +247,18 @@ function serializeMarcXmlCollection(input, pretty = false) {
247
247
  }
248
248
 
249
249
  // src/marc-record/serializeLineMarc.ts
250
- function serializeLineMarc(input) {
250
+ var BIBLIOFIL_DOLLAR_ESCAPE_CHARACTER = "@{2}";
251
+ function serializeLineMarc(input, options = {}) {
252
+ const serializer = createDefaultSerializer({
253
+ dollarEscapeCharacter: options.dollarEscapeCharacter ?? BIBLIOFIL_DOLLAR_ESCAPE_CHARACTER
254
+ });
251
255
  const leader = serializer.leader(input.leader);
252
256
  const control = input.getControlFields().map(serializer.controlfield).join("");
253
257
  const data = input.getDataFields().map(serializer.datafield).join("");
254
258
  return `${leader}${control}${data}^
255
259
  `;
256
260
  }
257
- var serializer = {
261
+ var createDefaultSerializer = (options) => ({
258
262
  leader: (leader) => `*LDR${leader}
259
263
  `,
260
264
  controlfield: (field) => `*${field.tag}${field.value}
@@ -263,14 +267,14 @@ var serializer = {
263
267
  const ind1 = field.ind1 ?? " ";
264
268
  const ind2 = field.ind2 ?? " ";
265
269
  const subfields = field.subfields.map(
266
- (subfield) => `$${subfield.code}${escapeSubfieldValue(subfield.value)}`
270
+ (subfield) => `$${subfield.code}${escapeSubfieldValue(subfield.value, options)}`
267
271
  ).join("");
268
272
  return `*${field.tag}${ind1}${ind2}${subfields}
269
273
  `;
270
274
  }
271
- };
272
- var escapeSubfieldValue = (value) => {
273
- return value.replace(/\n/g, " ").replace(/\$/g, "@{2}");
275
+ });
276
+ var escapeSubfieldValue = (value, options) => {
277
+ return value.replace(/[\n|\r]/g, " ").replace(/\s\s+/g, " ").replace(/\$/g, options.dollarEscapeCharacter).trim();
274
278
  };
275
279
 
276
280
  // src/marc-record/MarcRecord.ts
package/dist/index.d.cts CHANGED
@@ -139,79 +139,28 @@ declare function parseMarcXml(input: string | XmlElement, options?: MarcXmlOptio
139
139
  declare const marcRecordZodSchema: z.ZodObject<{
140
140
  format: z.ZodOptional<z.ZodString>;
141
141
  leader: z.ZodString;
142
- fields: z.ZodArray<z.ZodUnion<[z.ZodObject<{
142
+ fields: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
143
143
  tag: z.ZodString;
144
144
  value: z.ZodString;
145
- }, "strip", z.ZodTypeAny, {
146
- tag: string;
147
- value: string;
148
- }, {
149
- tag: string;
150
- value: string;
151
- }>, z.ZodObject<{
145
+ }, z.core.$strip>, z.ZodObject<{
152
146
  tag: z.ZodString;
153
147
  ind1: z.ZodOptional<z.ZodString>;
154
148
  ind2: z.ZodOptional<z.ZodString>;
155
149
  subfields: z.ZodArray<z.ZodObject<{
156
150
  code: z.ZodString;
157
151
  value: z.ZodString;
158
- }, "strip", z.ZodTypeAny, {
159
- value: string;
160
- code: string;
161
- }, {
162
- value: string;
163
- code: string;
164
- }>, "many">;
165
- }, "strip", z.ZodTypeAny, {
166
- tag: string;
167
- subfields: {
168
- value: string;
169
- code: string;
170
- }[];
171
- ind1?: string | undefined;
172
- ind2?: string | undefined;
173
- }, {
174
- tag: string;
175
- subfields: {
176
- value: string;
177
- code: string;
178
- }[];
179
- ind1?: string | undefined;
180
- ind2?: string | undefined;
181
- }>]>, "many">;
182
- }, "strip", z.ZodTypeAny, {
183
- fields: ({
184
- tag: string;
185
- value: string;
186
- } | {
187
- tag: string;
188
- subfields: {
189
- value: string;
190
- code: string;
191
- }[];
192
- ind1?: string | undefined;
193
- ind2?: string | undefined;
194
- })[];
195
- leader: string;
196
- format?: string | undefined;
197
- }, {
198
- fields: ({
199
- tag: string;
200
- value: string;
201
- } | {
202
- tag: string;
203
- subfields: {
204
- value: string;
205
- code: string;
206
- }[];
207
- ind1?: string | undefined;
208
- ind2?: string | undefined;
209
- })[];
210
- leader: string;
211
- format?: string | undefined;
212
- }>;
152
+ }, z.core.$strip>>;
153
+ }, z.core.$strip>]>>;
154
+ }, z.core.$strip>;
213
155
 
214
- declare function serializeLineMarc(input: MarcRecord): string;
156
+ type SerializeLineMarcOptions = {
157
+ /**
158
+ * Replacement character to use for $ characters in field values.
159
+ * Defaults to `@{2}`
160
+ */
161
+ dollarEscapeCharacter: string;
162
+ };
163
+ declare function serializeLineMarc(input: MarcRecord, options?: Partial<SerializeLineMarcOptions>): string;
215
164
 
216
165
  declare function serializeMarcXml(input: MarcRecord, pretty?: boolean): string;
217
166
  declare function serializeMarcXmlCollection(input: MarcRecord[], pretty?: boolean): string;
package/dist/index.d.ts CHANGED
@@ -139,79 +139,28 @@ declare function parseMarcXml(input: string | XmlElement, options?: MarcXmlOptio
139
139
  declare const marcRecordZodSchema: z.ZodObject<{
140
140
  format: z.ZodOptional<z.ZodString>;
141
141
  leader: z.ZodString;
142
- fields: z.ZodArray<z.ZodUnion<[z.ZodObject<{
142
+ fields: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
143
143
  tag: z.ZodString;
144
144
  value: z.ZodString;
145
- }, "strip", z.ZodTypeAny, {
146
- tag: string;
147
- value: string;
148
- }, {
149
- tag: string;
150
- value: string;
151
- }>, z.ZodObject<{
145
+ }, z.core.$strip>, z.ZodObject<{
152
146
  tag: z.ZodString;
153
147
  ind1: z.ZodOptional<z.ZodString>;
154
148
  ind2: z.ZodOptional<z.ZodString>;
155
149
  subfields: z.ZodArray<z.ZodObject<{
156
150
  code: z.ZodString;
157
151
  value: z.ZodString;
158
- }, "strip", z.ZodTypeAny, {
159
- value: string;
160
- code: string;
161
- }, {
162
- value: string;
163
- code: string;
164
- }>, "many">;
165
- }, "strip", z.ZodTypeAny, {
166
- tag: string;
167
- subfields: {
168
- value: string;
169
- code: string;
170
- }[];
171
- ind1?: string | undefined;
172
- ind2?: string | undefined;
173
- }, {
174
- tag: string;
175
- subfields: {
176
- value: string;
177
- code: string;
178
- }[];
179
- ind1?: string | undefined;
180
- ind2?: string | undefined;
181
- }>]>, "many">;
182
- }, "strip", z.ZodTypeAny, {
183
- fields: ({
184
- tag: string;
185
- value: string;
186
- } | {
187
- tag: string;
188
- subfields: {
189
- value: string;
190
- code: string;
191
- }[];
192
- ind1?: string | undefined;
193
- ind2?: string | undefined;
194
- })[];
195
- leader: string;
196
- format?: string | undefined;
197
- }, {
198
- fields: ({
199
- tag: string;
200
- value: string;
201
- } | {
202
- tag: string;
203
- subfields: {
204
- value: string;
205
- code: string;
206
- }[];
207
- ind1?: string | undefined;
208
- ind2?: string | undefined;
209
- })[];
210
- leader: string;
211
- format?: string | undefined;
212
- }>;
152
+ }, z.core.$strip>>;
153
+ }, z.core.$strip>]>>;
154
+ }, z.core.$strip>;
213
155
 
214
- declare function serializeLineMarc(input: MarcRecord): string;
156
+ type SerializeLineMarcOptions = {
157
+ /**
158
+ * Replacement character to use for $ characters in field values.
159
+ * Defaults to `@{2}`
160
+ */
161
+ dollarEscapeCharacter: string;
162
+ };
163
+ declare function serializeLineMarc(input: MarcRecord, options?: Partial<SerializeLineMarcOptions>): string;
215
164
 
216
165
  declare function serializeMarcXml(input: MarcRecord, pretty?: boolean): string;
217
166
  declare function serializeMarcXmlCollection(input: MarcRecord[], pretty?: boolean): string;
package/dist/index.js CHANGED
@@ -245,14 +245,18 @@ function serializeMarcXmlCollection(input, pretty = false) {
245
245
  }
246
246
 
247
247
  // src/marc-record/serializeLineMarc.ts
248
- function serializeLineMarc(input) {
248
+ var BIBLIOFIL_DOLLAR_ESCAPE_CHARACTER = "@{2}";
249
+ function serializeLineMarc(input, options = {}) {
250
+ const serializer = createDefaultSerializer({
251
+ dollarEscapeCharacter: options.dollarEscapeCharacter ?? BIBLIOFIL_DOLLAR_ESCAPE_CHARACTER
252
+ });
249
253
  const leader = serializer.leader(input.leader);
250
254
  const control = input.getControlFields().map(serializer.controlfield).join("");
251
255
  const data = input.getDataFields().map(serializer.datafield).join("");
252
256
  return `${leader}${control}${data}^
253
257
  `;
254
258
  }
255
- var serializer = {
259
+ var createDefaultSerializer = (options) => ({
256
260
  leader: (leader) => `*LDR${leader}
257
261
  `,
258
262
  controlfield: (field) => `*${field.tag}${field.value}
@@ -261,14 +265,14 @@ var serializer = {
261
265
  const ind1 = field.ind1 ?? " ";
262
266
  const ind2 = field.ind2 ?? " ";
263
267
  const subfields = field.subfields.map(
264
- (subfield) => `$${subfield.code}${escapeSubfieldValue(subfield.value)}`
268
+ (subfield) => `$${subfield.code}${escapeSubfieldValue(subfield.value, options)}`
265
269
  ).join("");
266
270
  return `*${field.tag}${ind1}${ind2}${subfields}
267
271
  `;
268
272
  }
269
- };
270
- var escapeSubfieldValue = (value) => {
271
- return value.replace(/\n/g, " ").replace(/\$/g, "@{2}");
273
+ });
274
+ var escapeSubfieldValue = (value, options) => {
275
+ return value.replace(/[\n|\r]/g, " ").replace(/\s\s+/g, " ").replace(/\$/g, options.dollarEscapeCharacter).trim();
272
276
  };
273
277
 
274
278
  // src/marc-record/MarcRecord.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@biblioteksentralen/marc",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "MARC record parser and serializer",
@@ -26,13 +26,13 @@
26
26
  ],
27
27
  "dependencies": {
28
28
  "ajv": "^8.17.1",
29
- "zod": "^3.23.8",
29
+ "zod": "^4.3.6",
30
30
  "@biblioteksentralen/xml-utils": "^0.0.3"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@arethetypeswrong/cli": "^0.15.4",
34
34
  "@types/json-schema": "^7.0.15",
35
- "@types/node": "^22.15.3",
35
+ "@types/node": "^24.11.0",
36
36
  "eslint": "^9.26.0",
37
37
  "rimraf": "^5.0.5",
38
38
  "tsup": "^8.0.2",