@mrfylke/nsr-barcode-generator 1.1.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.
Files changed (48) hide show
  1. package/README.md +182 -0
  2. package/assets/fonts/poppins-400-normal.ttf +0 -0
  3. package/assets/fonts/poppins-700-normal.ttf +0 -0
  4. package/assets/images/Boat.png +0 -0
  5. package/assets/images/Bus.png +0 -0
  6. package/assets/images/Ferry.png +0 -0
  7. package/assets/images/fram_mor_fylkeskommune_dark.png +0 -0
  8. package/dist/api.d.ts +48 -0
  9. package/dist/api.d.ts.map +1 -0
  10. package/dist/api.js +133 -0
  11. package/dist/api.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +228 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +28 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/utils/assets.d.ts +2 -0
  21. package/dist/utils/assets.d.ts.map +1 -0
  22. package/dist/utils/assets.js +11 -0
  23. package/dist/utils/assets.js.map +1 -0
  24. package/dist/utils/enturApi.d.ts +42 -0
  25. package/dist/utils/enturApi.d.ts.map +1 -0
  26. package/dist/utils/enturApi.js +206 -0
  27. package/dist/utils/enturApi.js.map +1 -0
  28. package/dist/utils/fileReader.d.ts +2 -0
  29. package/dist/utils/fileReader.d.ts.map +1 -0
  30. package/dist/utils/fileReader.js +30 -0
  31. package/dist/utils/fileReader.js.map +1 -0
  32. package/dist/utils/fontLoader.d.ts +10 -0
  33. package/dist/utils/fontLoader.d.ts.map +1 -0
  34. package/dist/utils/fontLoader.js +36 -0
  35. package/dist/utils/fontLoader.js.map +1 -0
  36. package/dist/utils/idParser.d.ts +12 -0
  37. package/dist/utils/idParser.d.ts.map +1 -0
  38. package/dist/utils/idParser.js +59 -0
  39. package/dist/utils/idParser.js.map +1 -0
  40. package/dist/utils/nsrId.d.ts +3 -0
  41. package/dist/utils/nsrId.d.ts.map +1 -0
  42. package/dist/utils/nsrId.js +13 -0
  43. package/dist/utils/nsrId.js.map +1 -0
  44. package/dist/utils/pdfGenerator.d.ts +56 -0
  45. package/dist/utils/pdfGenerator.d.ts.map +1 -0
  46. package/dist/utils/pdfGenerator.js +526 -0
  47. package/dist/utils/pdfGenerator.js.map +1 -0
  48. package/package.json +69 -0
@@ -0,0 +1,526 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generatePdfsForStopPlaces = generatePdfsForStopPlaces;
40
+ const pdfkit_1 = __importDefault(require("pdfkit"));
41
+ const fs_1 = require("fs");
42
+ const path_1 = require("path");
43
+ const fs_2 = require("fs");
44
+ const QRCode = __importStar(require("qrcode"));
45
+ const enturApi_1 = require("./enturApi");
46
+ const fontLoader_1 = require("./fontLoader");
47
+ const assets_1 = require("./assets");
48
+ async function generatePdfsForStopPlaces(requests, options) {
49
+ const { outputDirectory, overwrite = false, onProgress } = options;
50
+ await ensureDirectoryExists(outputDirectory);
51
+ const generated = [];
52
+ const skipped = [];
53
+ const failed = [];
54
+ const ids = requests.map((request) => typeof request === "string" ? request : request.id);
55
+ const overridesById = new Map();
56
+ for (const request of requests) {
57
+ if (typeof request !== "string") {
58
+ overridesById.set(request.id, request);
59
+ }
60
+ }
61
+ const idsNeedingFetch = ids.filter((id) => {
62
+ const override = overridesById.get(id);
63
+ if (!override)
64
+ return true;
65
+ return Boolean(options.enrichTransportMode) && !override.transportMode;
66
+ });
67
+ let fetchedInfos = [];
68
+ if (idsNeedingFetch.length > 0) {
69
+ const fetchStopPlaces = options.stopPlaceFetcher ??
70
+ ((idsToFetch) => enturApi_1.enturApi.getMultipleStopPlaces(idsToFetch));
71
+ fetchedInfos = await fetchStopPlaces(idsNeedingFetch);
72
+ }
73
+ const fetchedById = new Map(idsNeedingFetch.map((id, index) => [id, fetchedInfos[index] ?? null]));
74
+ const stopPlaceInfos = ids.map((id) => {
75
+ const override = overridesById.get(id);
76
+ if (override) {
77
+ const info = { id, name: override.name };
78
+ const transportMode = override.transportMode ?? fetchedById.get(id)?.transportMode;
79
+ if (transportMode) {
80
+ info.transportMode = transportMode;
81
+ }
82
+ return info;
83
+ }
84
+ return fetchedById.get(id) ?? null;
85
+ });
86
+ const total = ids.length;
87
+ for (let i = 0; i < ids.length; i++) {
88
+ const id = ids[i];
89
+ if (!id)
90
+ continue;
91
+ const current = i + 1;
92
+ try {
93
+ const stopPlaceInfo = stopPlaceInfos[i] ?? null;
94
+ if (!stopPlaceInfo) {
95
+ throw new Error(`Failed to resolve stop place metadata for "${id}"`);
96
+ }
97
+ const filename = generateSafeFilename(id, stopPlaceInfo.name);
98
+ const outputPath = (0, path_1.join)(outputDirectory, `${filename}.pdf`);
99
+ if (!overwrite && (await pathExists(outputPath))) {
100
+ skipped.push({ nsrId: id, outputPath });
101
+ onProgress?.({
102
+ current,
103
+ total,
104
+ nsrId: id,
105
+ outputPath,
106
+ status: "skipped",
107
+ });
108
+ continue;
109
+ }
110
+ await generateSinglePdf(id, outputPath, stopPlaceInfo, options);
111
+ generated.push({ nsrId: id, outputPath });
112
+ onProgress?.({
113
+ current,
114
+ total,
115
+ nsrId: id,
116
+ outputPath,
117
+ status: "generated",
118
+ });
119
+ }
120
+ catch (error) {
121
+ const message = error instanceof Error ? error.message : "Unknown error";
122
+ failed.push({ nsrId: id, error: message });
123
+ onProgress?.({ current, total, nsrId: id, status: "error", error: message });
124
+ }
125
+ }
126
+ return {
127
+ generatedFiles: generated.map((item) => item.outputPath),
128
+ totalGenerated: generated.length,
129
+ outputDirectory: (0, path_1.resolve)(outputDirectory),
130
+ generated,
131
+ skipped,
132
+ failed,
133
+ };
134
+ }
135
+ function isValidAbsoluteHttpUrl(value) {
136
+ if (typeof value !== "string" || value.length === 0) {
137
+ return false;
138
+ }
139
+ try {
140
+ const parsed = new URL(value);
141
+ return parsed.protocol === "http:" || parsed.protocol === "https:";
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ }
147
+ async function generateSinglePdf(id, outputPath, stopPlaceInfo, options) {
148
+ return new Promise(async (resolvePromise, reject) => {
149
+ try {
150
+ const fonts = await fontLoader_1.fontLoader.loadPoppins();
151
+ const orientation = options?.orientation || "landscape";
152
+ const format = options?.format || "A4";
153
+ const doc = new pdfkit_1.default({
154
+ size: format,
155
+ layout: orientation,
156
+ margins: {
157
+ top: 50,
158
+ bottom: 50,
159
+ left: 50,
160
+ right: 50,
161
+ },
162
+ });
163
+ let poppinsRegular = "Helvetica";
164
+ let poppinsBold = "Helvetica-Bold";
165
+ try {
166
+ if (fonts.regular !== "Helvetica") {
167
+ doc.registerFont("Poppins-Regular", fonts.regular);
168
+ poppinsRegular = "Poppins-Regular";
169
+ }
170
+ if (fonts.bold !== "Helvetica-Bold") {
171
+ doc.registerFont("Poppins-Bold", fonts.bold);
172
+ poppinsBold = "Poppins-Bold";
173
+ }
174
+ }
175
+ catch (fontError) {
176
+ console.warn("Failed to register Poppins fonts, using fallback:", fontError);
177
+ }
178
+ const stream = (0, fs_2.createWriteStream)(outputPath);
179
+ doc.pipe(stream);
180
+ const pageWidth = doc.page.width;
181
+ const pageHeight = doc.page.height;
182
+ const styleConfig = options?.style || {};
183
+ const headerFooterColor = styleConfig.headerFooterColor || "#1A4D75";
184
+ const logoPath = styleConfig.logoPath ||
185
+ (0, assets_1.getAssetPath)("images", "fram_mor_fylkeskommune_dark.png");
186
+ const logoWidth = styleConfig.logoWidth || 105;
187
+ const fallbackLogoText = styleConfig.fallbackLogoText || "FRAM";
188
+ const fallbackLogoSubtext = styleConfig.fallbackLogoSubtext || "Møre og Romsdal fylkeskommune";
189
+ const white = "#FFFFFF";
190
+ const darkGray = "#333333";
191
+ const borderRadius = 15;
192
+ const borderMargin = 20;
193
+ const boxWidth = pageWidth - borderMargin * 2;
194
+ const boxHeight = pageHeight - borderMargin * 2;
195
+ doc
196
+ .lineWidth(0.25)
197
+ .roundedRect(borderMargin, borderMargin, boxWidth, boxHeight, borderRadius)
198
+ .stroke("#000000");
199
+ const headerHeight = 80;
200
+ doc
201
+ .save()
202
+ .roundedRect(borderMargin, borderMargin, boxWidth, boxHeight, borderRadius)
203
+ .clip()
204
+ .rect(borderMargin, borderMargin, boxWidth, headerHeight)
205
+ .fill(headerFooterColor)
206
+ .restore();
207
+ const iconX = 80;
208
+ const iconY = 60;
209
+ const iconSize = 50;
210
+ try {
211
+ const transportModes = stopPlaceInfo.transportMode || [];
212
+ let iconFileName = "Bus.png";
213
+ const modes = Array.isArray(transportModes)
214
+ ? transportModes
215
+ : [transportModes];
216
+ const modeString = modes.join(" ").toLowerCase();
217
+ if (modeString.includes("water") || modeString.includes("boat")) {
218
+ iconFileName = "Boat.png";
219
+ }
220
+ else if (modeString.includes("ferry")) {
221
+ iconFileName = "Ferry.png";
222
+ }
223
+ else if (modeString.includes("bus")) {
224
+ iconFileName = "Bus.png";
225
+ }
226
+ const iconPath = (0, assets_1.getAssetPath)("images", iconFileName);
227
+ const iconBuffer = await fs_1.promises.readFile(iconPath);
228
+ doc
229
+ .lineWidth(3)
230
+ .circle(iconX, iconY, iconSize / 2)
231
+ .stroke(white)
232
+ .circle(iconX, iconY, iconSize / 2)
233
+ .stroke(white);
234
+ const iconImageSize = iconSize * 0.6;
235
+ const iconImageX = iconX - iconImageSize / 2;
236
+ const iconImageY = iconY - iconImageSize / 2;
237
+ doc.image(iconBuffer, iconImageX, iconImageY, {
238
+ width: iconImageSize,
239
+ height: iconImageSize,
240
+ });
241
+ }
242
+ catch (error) {
243
+ console.warn("Could not load transport mode icon:", error);
244
+ doc
245
+ .lineWidth(3)
246
+ .circle(iconX, iconY, iconSize / 2)
247
+ .stroke(white);
248
+ doc
249
+ .fillColor(white)
250
+ .fontSize(20)
251
+ .font(poppinsBold)
252
+ .text("x", iconX - 10, iconY - 10);
253
+ }
254
+ const stopName = stopPlaceInfo.name || id;
255
+ doc
256
+ .fillColor(white)
257
+ .fontSize(36)
258
+ .font(poppinsBold)
259
+ .text(stopName, 130, 35, {
260
+ width: pageWidth - 200,
261
+ align: "left",
262
+ });
263
+ const footerHeight = 80;
264
+ const availableHeight = pageHeight - headerHeight - footerHeight;
265
+ const contentHeight = orientation === "portrait" ? 400 : 310;
266
+ const contentY = headerHeight + (availableHeight - contentHeight) / 2;
267
+ let qrUrl;
268
+ if (options?.generateQrUrl) {
269
+ const qrContext = {
270
+ id,
271
+ name: stopPlaceInfo.name ?? id,
272
+ };
273
+ const candidate = options.generateQrUrl(qrContext);
274
+ if (!isValidAbsoluteHttpUrl(candidate)) {
275
+ throw new Error(`generateQrUrl returned an invalid URL for "${id}": ${JSON.stringify(candidate)}. Expected a non-empty absolute http(s) URL.`);
276
+ }
277
+ qrUrl = candidate;
278
+ }
279
+ else {
280
+ qrUrl = `https://reise.frammr.no/departures/${encodeURIComponent(id)}?qr`;
281
+ }
282
+ const qrCodeDataURL = await QRCode.toDataURL(qrUrl, {
283
+ width: 200,
284
+ margin: 1,
285
+ color: {
286
+ dark: "#000000",
287
+ light: "#FFFFFF",
288
+ },
289
+ });
290
+ const base64Data = qrCodeDataURL.split(",")[1];
291
+ let qrCodeBuffer = null;
292
+ if (base64Data) {
293
+ qrCodeBuffer = Buffer.from(base64Data, "base64");
294
+ }
295
+ if (orientation === "portrait") {
296
+ const qrSize = 120;
297
+ const topMargin = headerHeight + 20;
298
+ const qrX = iconX - iconSize / 2;
299
+ const qrY = topMargin;
300
+ if (qrCodeBuffer) {
301
+ doc.image(qrCodeBuffer, qrX, qrY, { width: qrSize, height: qrSize });
302
+ }
303
+ const rightColumnX = pageWidth - 350;
304
+ const rightColumnStartY = topMargin;
305
+ doc
306
+ .fillColor(darkGray)
307
+ .fontSize(24)
308
+ .font(poppinsBold)
309
+ .text("Når kjem bussen?", rightColumnX, rightColumnStartY);
310
+ doc
311
+ .fillColor(darkGray)
312
+ .fontSize(14)
313
+ .font(poppinsRegular)
314
+ .text("Opne mobilkameraet ditt og hald", rightColumnX, rightColumnStartY + 40)
315
+ .text("kameralinsa over QR-koden. Lenka", rightColumnX, rightColumnStartY + 60)
316
+ .text("fører deg til reiseplanleggaren, og viser", rightColumnX, rightColumnStartY + 80)
317
+ .text("busslinjer og avgangar frå haldeplassen", rightColumnX, rightColumnStartY + 100)
318
+ .text("du står på.", rightColumnX, rightColumnStartY + 120);
319
+ const englishStartY = rightColumnStartY + 160;
320
+ doc
321
+ .fillColor(darkGray)
322
+ .fontSize(24)
323
+ .font(poppinsBold)
324
+ .text("When will the bus", rightColumnX, englishStartY)
325
+ .text("arrive?", rightColumnX, englishStartY + 25);
326
+ doc
327
+ .fillColor(darkGray)
328
+ .fontSize(14)
329
+ .font(poppinsRegular)
330
+ .text("Open your mobile camera and hold", rightColumnX, englishStartY + 60)
331
+ .text("camera lens over the QR code. The link", rightColumnX, englishStartY + 80)
332
+ .text("takes you to the travel planner, and", rightColumnX, englishStartY + 100)
333
+ .text("shows bus lines and departures from the", rightColumnX, englishStartY + 120)
334
+ .text("stop you are at.", rightColumnX, englishStartY + 140);
335
+ const infoStartY = englishStartY + 180;
336
+ doc
337
+ .fillColor(darkGray)
338
+ .fontSize(14)
339
+ .font(poppinsBold)
340
+ .text("Informasjon om bussavgangar", rightColumnX, infoStartY)
341
+ .text("finn du också:", rightColumnX, infoStartY + 20);
342
+ doc
343
+ .fillColor(darkGray)
344
+ .fontSize(14)
345
+ .font(poppinsRegular)
346
+ .text("Information about bus departures", rightColumnX, infoStartY + 40)
347
+ .text("can also be found:", rightColumnX, infoStartY + 60);
348
+ doc
349
+ .fillColor(darkGray)
350
+ .fontSize(14)
351
+ .font(poppinsRegular)
352
+ .text("• I appane / in the apps:", rightColumnX, infoStartY + 100);
353
+ doc
354
+ .font(poppinsBold)
355
+ .text("FRAM / Entur", rightColumnX + 10, infoStartY + 120);
356
+ doc
357
+ .font(poppinsRegular)
358
+ .text("• På nettsidene / on the websites:", rightColumnX, infoStartY + 155);
359
+ doc
360
+ .font(poppinsBold)
361
+ .text("frammr.no / entur.no", rightColumnX + 10, infoStartY + 175);
362
+ }
363
+ else {
364
+ const qrSize = 120;
365
+ const qrX = iconX - iconSize / 2;
366
+ const qrY = contentY;
367
+ if (qrCodeBuffer) {
368
+ doc.image(qrCodeBuffer, qrX, qrY, { width: qrSize, height: qrSize });
369
+ }
370
+ const textStartX = qrX + qrSize + 20;
371
+ const rightColumnX = pageWidth - 320;
372
+ doc
373
+ .fillColor(darkGray)
374
+ .fontSize(24)
375
+ .font(poppinsBold)
376
+ .text("Når kjem bussen?", textStartX, contentY);
377
+ doc
378
+ .fillColor(darkGray)
379
+ .fontSize(14)
380
+ .font(poppinsRegular)
381
+ .text("Opne mobilkameraet ditt og hald", textStartX, contentY + 40)
382
+ .text("kameralinsa over QR-koden. Lenka", textStartX, contentY + 60)
383
+ .text("fører deg til reiseplanleggaren, og viser", textStartX, contentY + 80)
384
+ .text("busslinjer og avgangar frå haldeplassen", textStartX, contentY + 100)
385
+ .text("du står på.", textStartX, contentY + 120);
386
+ doc
387
+ .fillColor(darkGray)
388
+ .fontSize(24)
389
+ .font(poppinsBold)
390
+ .text("When will the bus", textStartX, contentY + 160)
391
+ .text("arrive?", textStartX, contentY + 185);
392
+ doc
393
+ .fillColor(darkGray)
394
+ .fontSize(14)
395
+ .font(poppinsRegular)
396
+ .text("Open your mobile camera and hold", textStartX, contentY + 220)
397
+ .text("camera lens over the QR code. The link", textStartX, contentY + 240)
398
+ .text("takes you to the travel planner, and", textStartX, contentY + 260)
399
+ .text("shows bus lines and departures from the", textStartX, contentY + 280)
400
+ .text("stop you are at.", textStartX, contentY + 300);
401
+ const separatorX = rightColumnX - 22;
402
+ doc
403
+ .lineWidth(0.25)
404
+ .moveTo(separatorX, contentY)
405
+ .lineTo(separatorX, contentY + 320)
406
+ .stroke("#000000");
407
+ const rightColumnStartY = contentY + 40;
408
+ doc
409
+ .fillColor(darkGray)
410
+ .fontSize(14)
411
+ .font(poppinsBold)
412
+ .text("Informasjon om bussavgangar", rightColumnX, rightColumnStartY)
413
+ .text("finn du også:", rightColumnX, rightColumnStartY + 20);
414
+ doc
415
+ .fillColor(darkGray)
416
+ .fontSize(14)
417
+ .font(poppinsRegular)
418
+ .text("Information about bus departures", rightColumnX, rightColumnStartY + 40)
419
+ .text("can also be found:", rightColumnX, rightColumnStartY + 60);
420
+ doc
421
+ .fillColor(darkGray)
422
+ .fontSize(14)
423
+ .font(poppinsRegular)
424
+ .text("• I appane / in the apps:", rightColumnX, rightColumnStartY + 100);
425
+ doc
426
+ .font(poppinsBold)
427
+ .text("FRAM / Entur", rightColumnX + 10, rightColumnStartY + 120);
428
+ doc
429
+ .font(poppinsRegular)
430
+ .text("• På nettsidene / on the websites:", rightColumnX, rightColumnStartY + 155);
431
+ doc
432
+ .font(poppinsBold)
433
+ .text("frammr.no / entur.no", rightColumnX + 10, rightColumnStartY + 175);
434
+ }
435
+ const footerY = pageHeight - footerHeight;
436
+ doc
437
+ .save()
438
+ .roundedRect(borderMargin, borderMargin, boxWidth, boxHeight, borderRadius)
439
+ .clip()
440
+ .rect(borderMargin, footerY, boxWidth, footerHeight)
441
+ .fill(headerFooterColor)
442
+ .restore();
443
+ try {
444
+ const logoBuffer = await fs_1.promises.readFile(logoPath);
445
+ const logoHeight = Math.round(logoWidth * 0.27);
446
+ const logoX = pageWidth - borderMargin - logoWidth - 20;
447
+ const logoY = footerY + footerHeight - logoHeight - 35;
448
+ doc.image(logoBuffer, logoX, logoY, {
449
+ width: logoWidth,
450
+ height: logoHeight,
451
+ });
452
+ }
453
+ catch (error) {
454
+ console.warn("Could not load logo image:", error);
455
+ doc
456
+ .fillColor(white)
457
+ .fontSize(24)
458
+ .font(poppinsBold)
459
+ .text(fallbackLogoText, pageWidth - 150, footerY + 25);
460
+ if (fallbackLogoSubtext) {
461
+ doc
462
+ .fillColor(white)
463
+ .fontSize(10)
464
+ .font(poppinsRegular)
465
+ .text(fallbackLogoSubtext, pageWidth - 220, footerY + 55);
466
+ }
467
+ }
468
+ doc.end();
469
+ stream.on("finish", () => {
470
+ resolvePromise();
471
+ });
472
+ stream.on("error", (error) => {
473
+ reject(new Error(`Failed to write PDF: ${error.message}`));
474
+ });
475
+ }
476
+ catch (error) {
477
+ reject(new Error(`PDF generation failed: ${error instanceof Error ? error.message : "Unknown error"}`));
478
+ }
479
+ });
480
+ }
481
+ function slugify(text) {
482
+ return (text
483
+ .toLowerCase()
484
+ .trim()
485
+ .replace(/[æÆ]/g, "ae")
486
+ .replace(/[øØ]/g, "o")
487
+ .replace(/[åÅ]/g, "aa")
488
+ .replace(/[àáâãäå]/g, "a")
489
+ .replace(/[èéêë]/g, "e")
490
+ .replace(/[ìíîï]/g, "i")
491
+ .replace(/[òóôõö]/g, "o")
492
+ .replace(/[ùúûü]/g, "u")
493
+ .replace(/[ñ]/g, "n")
494
+ .replace(/[ç]/g, "c")
495
+ .replace(/[\s\W-]+/g, "-")
496
+ .replace(/^-+|-+$/g, "")
497
+ .substring(0, 50));
498
+ }
499
+ function generateSafeFilename(id, stopPlaceName) {
500
+ const safeId = id.replace(/[^a-zA-Z0-9\-_]/g, "_");
501
+ if (stopPlaceName && stopPlaceName.trim()) {
502
+ const slugifiedName = slugify(stopPlaceName);
503
+ if (slugifiedName) {
504
+ return `${safeId}-${slugifiedName}`;
505
+ }
506
+ }
507
+ return safeId;
508
+ }
509
+ async function ensureDirectoryExists(dirPath) {
510
+ try {
511
+ await fs_1.promises.access(dirPath);
512
+ }
513
+ catch {
514
+ await fs_1.promises.mkdir(dirPath, { recursive: true });
515
+ }
516
+ }
517
+ async function pathExists(path) {
518
+ try {
519
+ await fs_1.promises.access(path);
520
+ return true;
521
+ }
522
+ catch {
523
+ return false;
524
+ }
525
+ }
526
+ //# sourceMappingURL=pdfGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfGenerator.js","sourceRoot":"","sources":["../../src/utils/pdfGenerator.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@mrfylke/nsr-barcode-generator",
3
+ "version": "1.1.0",
4
+ "description": "A CLI tool and programmatic API to generate PDF files for unique NSR IDs",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "nsr-barcode": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "assets"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "require": "./dist/index.js"
19
+ },
20
+ "./api": {
21
+ "types": "./dist/api.d.ts",
22
+ "import": "./dist/api.js",
23
+ "require": "./dist/api.js"
24
+ }
25
+ },
26
+ "keywords": [
27
+ "cli",
28
+ "api",
29
+ "pdf",
30
+ "barcode",
31
+ "qr-code",
32
+ "nsr",
33
+ "entur",
34
+ "typescript",
35
+ "public-transport"
36
+ ],
37
+ "author": "",
38
+ "license": "MIT",
39
+ "devDependencies": {
40
+ "@types/node": "^26.5.0",
41
+ "@types/pdfkit": "^0.17.6",
42
+ "@types/qrcode": "^1.5.6",
43
+ "@types/xml2js": "^0.4.14",
44
+ "rimraf": "^6.1.3",
45
+ "tsx": "^4.23.13",
46
+ "typescript": "^7.0.2",
47
+ "vitest": "^5.0.0"
48
+ },
49
+ "dependencies": {
50
+ "axios": "^1.20.0",
51
+ "commander": "^15.0.0",
52
+ "pdfkit": "^0.20.2",
53
+ "qrcode": "^1.5.4",
54
+ "xml2js": "^0.6.2"
55
+ },
56
+ "engines": {
57
+ "node": ">=18.0.0",
58
+ "pnpm": ">=8.0.0"
59
+ },
60
+ "scripts": {
61
+ "build": "tsc",
62
+ "dev": "tsx src/index.ts",
63
+ "start": "node dist/index.js",
64
+ "watch": "tsc --watch",
65
+ "clean": "rimraf dist",
66
+ "test": "vitest run",
67
+ "test:watch": "vitest"
68
+ }
69
+ }