@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
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.NsrBarcodeApi = void 0;
22
+ __exportStar(require("./api"), exports);
23
+ var api_1 = require("./api");
24
+ Object.defineProperty(exports, "NsrBarcodeApi", { enumerable: true, get: function () { return __importDefault(api_1).default; } });
25
+ if (require.main === module) {
26
+ require("./cli");
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AASA,wCAAsB;AACtB,6BAAiD;AAAxC,qHAAA,OAAO,OAAiB;AAGjC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getAssetPath(...segments: string[]): string;
2
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":"AAiBA,wBAAgB,YAAY,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAssetPath = getAssetPath;
4
+ const path_1 = require("path");
5
+ function getPackageRoot() {
6
+ return (0, path_1.join)(__dirname, "..", "..");
7
+ }
8
+ function getAssetPath(...segments) {
9
+ return (0, path_1.join)(getPackageRoot(), "assets", ...segments);
10
+ }
11
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":";;;AAAA,+BAA4B;AAa5B,SAAS,cAAc;IACrB,OAAO,IAAA,WAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,sBAA6B,GAAG,QAAkB;IAChD,OAAO,IAAA,WAAI,EAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;AACvD,CAAC"}
@@ -0,0 +1,42 @@
1
+ export interface StopPlaceInfo {
2
+ id: string;
3
+ name?: string;
4
+ description?: string;
5
+ transportMode?: string[];
6
+ coordinates?: {
7
+ latitude: number;
8
+ longitude: number;
9
+ };
10
+ municipality?: string;
11
+ county?: string;
12
+ }
13
+ export interface EnturApiError extends Error {
14
+ code: "API_ERROR" | "NOT_FOUND" | "NETWORK_ERROR" | "INVALID_ID" | "RATE_LIMITED";
15
+ statusCode?: number;
16
+ retryAfter?: number;
17
+ }
18
+ export interface RetryConfig {
19
+ maxRetries: number;
20
+ baseDelay: number;
21
+ maxDelay: number;
22
+ backoffMultiplier: number;
23
+ }
24
+ export declare class EnturApiClient {
25
+ private readonly baseUrl;
26
+ private readonly clientName;
27
+ private readonly retryConfig;
28
+ constructor(clientName?: string, retryConfig?: Partial<RetryConfig>);
29
+ private sleep;
30
+ private calculateRetryDelay;
31
+ getStopPlace(stopPlaceId: string): Promise<StopPlaceInfo>;
32
+ getMultipleStopPlaces(stopPlaceIds: string[], options?: {
33
+ batchSize?: number;
34
+ delayBetweenBatches?: number;
35
+ concurrency?: number;
36
+ }): Promise<(StopPlaceInfo | null)[]>;
37
+ private processBatchWithConcurrency;
38
+ private parseStopPlaceResponse;
39
+ }
40
+ export declare function createConservativeEnturClient(clientName?: string): EnturApiClient;
41
+ export declare const enturApi: EnturApiClient;
42
+ //# sourceMappingURL=enturApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enturApi.d.ts","sourceRoot":"","sources":["../../src/utils/enturApi.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,KAAK;IAC1C,IAAI,EACA,WAAW,GACX,WAAW,GACX,eAAe,GACf,YAAY,GACZ,cAAc,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAKD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAE1C,YACE,UAAU,GAAE,MAAgC,EAC5C,WAAW,GAAE,OAAO,CAAC,WAAW,CAAM,EAUvC;YAMa,KAAK;IAUnB,OAAO,CAAC,mBAAmB;IAkBrB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA8I9D;IAQK,qBAAqB,CACzB,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,GAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;KACjB,GACL,OAAO,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAgCnC;YAQa,2BAA2B;IA0CzC,OAAO,CAAC,sBAAsB;CAoD/B;AAQD,wBAAgB,6BAA6B,CAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAOhB;AAKD,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.enturApi = exports.EnturApiClient = void 0;
7
+ exports.createConservativeEnturClient = createConservativeEnturClient;
8
+ const axios_1 = __importDefault(require("axios"));
9
+ class EnturApiClient {
10
+ baseUrl = "https://api.entur.io/stop-places/v1";
11
+ clientName;
12
+ retryConfig;
13
+ constructor(clientName = "nsr-barcode-generator", retryConfig = {}) {
14
+ this.clientName = clientName;
15
+ this.retryConfig = {
16
+ maxRetries: 3,
17
+ baseDelay: 1000,
18
+ maxDelay: 30000,
19
+ backoffMultiplier: 2,
20
+ ...retryConfig,
21
+ };
22
+ }
23
+ async sleep(ms) {
24
+ return new Promise((resolve) => setTimeout(resolve, ms));
25
+ }
26
+ calculateRetryDelay(attempt, retryAfter) {
27
+ if (retryAfter) {
28
+ return Math.min(retryAfter * 1000, this.retryConfig.maxDelay);
29
+ }
30
+ const delay = this.retryConfig.baseDelay *
31
+ Math.pow(this.retryConfig.backoffMultiplier, attempt);
32
+ return Math.min(delay, this.retryConfig.maxDelay);
33
+ }
34
+ async getStopPlace(stopPlaceId) {
35
+ if (!stopPlaceId.startsWith("NSR:StopPlace:")) {
36
+ const error = new Error(`Invalid stop place ID format: ${stopPlaceId}`);
37
+ error.code = "INVALID_ID";
38
+ throw error;
39
+ }
40
+ let lastError = new Error("Unknown error");
41
+ for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {
42
+ try {
43
+ const response = await axios_1.default.get(`${this.baseUrl}/read/stop-places/${encodeURIComponent(stopPlaceId)}`, {
44
+ headers: {
45
+ "ET-Client-Name": this.clientName,
46
+ Accept: "application/json",
47
+ },
48
+ timeout: 10000,
49
+ });
50
+ return this.parseStopPlaceResponse(response.data, stopPlaceId);
51
+ }
52
+ catch (error) {
53
+ lastError = error;
54
+ if (axios_1.default.isAxiosError(error)) {
55
+ if (error.response?.status === 404) {
56
+ const apiError = new Error(`Stop place not found: ${stopPlaceId}`);
57
+ apiError.code = "NOT_FOUND";
58
+ apiError.statusCode = 404;
59
+ throw apiError;
60
+ }
61
+ if (error.response?.status === 429) {
62
+ if (attempt < this.retryConfig.maxRetries) {
63
+ const retryAfterHeader = error.response.headers["retry-after"];
64
+ const retryAfter = retryAfterHeader
65
+ ? parseInt(retryAfterHeader, 10)
66
+ : undefined;
67
+ const delay = this.calculateRetryDelay(attempt, retryAfter);
68
+ console.warn(`Rate limited for stop place ${stopPlaceId}. Retrying in ${delay}ms (attempt ${attempt + 1}/${this.retryConfig.maxRetries})`);
69
+ await this.sleep(delay);
70
+ continue;
71
+ }
72
+ else {
73
+ const rateLimitError = new Error(`Rate limit exceeded for stop place ${stopPlaceId} after ${this.retryConfig.maxRetries} retries`);
74
+ rateLimitError.code = "RATE_LIMITED";
75
+ rateLimitError.statusCode = 429;
76
+ throw rateLimitError;
77
+ }
78
+ }
79
+ if (error.response?.status) {
80
+ if (error.response.status >= 500 &&
81
+ attempt < this.retryConfig.maxRetries) {
82
+ const delay = this.calculateRetryDelay(attempt);
83
+ console.warn(`Server error ${error.response.status} for stop place ${stopPlaceId}. Retrying in ${delay}ms (attempt ${attempt + 1}/${this.retryConfig.maxRetries})`);
84
+ await this.sleep(delay);
85
+ continue;
86
+ }
87
+ const apiError = new Error(`API error: ${error.response.status} - ${error.response.statusText}`);
88
+ apiError.code = "API_ERROR";
89
+ apiError.statusCode = error.response.status;
90
+ throw apiError;
91
+ }
92
+ else {
93
+ if (attempt < this.retryConfig.maxRetries) {
94
+ const delay = this.calculateRetryDelay(attempt);
95
+ console.warn(`Network error for stop place ${stopPlaceId}. Retrying in ${delay}ms (attempt ${attempt + 1}/${this.retryConfig.maxRetries})`);
96
+ await this.sleep(delay);
97
+ continue;
98
+ }
99
+ const networkError = new Error(`Network error: ${error.message}`);
100
+ networkError.code = "NETWORK_ERROR";
101
+ throw networkError;
102
+ }
103
+ }
104
+ if (error.code) {
105
+ throw error;
106
+ }
107
+ if (attempt < this.retryConfig.maxRetries) {
108
+ const delay = this.calculateRetryDelay(attempt);
109
+ console.warn(`Unknown error for stop place ${stopPlaceId}. Retrying in ${delay}ms (attempt ${attempt + 1}/${this.retryConfig.maxRetries})`);
110
+ await this.sleep(delay);
111
+ continue;
112
+ }
113
+ }
114
+ }
115
+ const unknownError = new Error(`All retries exhausted for stop place ${stopPlaceId}. Last error: ${lastError.message}`);
116
+ unknownError.code = "API_ERROR";
117
+ throw unknownError;
118
+ }
119
+ async getMultipleStopPlaces(stopPlaceIds, options = {}) {
120
+ const { batchSize = 100, delayBetweenBatches = 1000, concurrency = 5, } = options;
121
+ const results = [];
122
+ for (let i = 0; i < stopPlaceIds.length; i += batchSize) {
123
+ const batch = stopPlaceIds.slice(i, i + batchSize);
124
+ const batchResults = await this.processBatchWithConcurrency(batch, concurrency);
125
+ results.push(...batchResults);
126
+ if (i + batchSize < stopPlaceIds.length) {
127
+ console.log(`Processed batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(stopPlaceIds.length / batchSize)}. Waiting ${delayBetweenBatches}ms before next batch...`);
128
+ await this.sleep(delayBetweenBatches);
129
+ }
130
+ }
131
+ return results;
132
+ }
133
+ async processBatchWithConcurrency(stopPlaceIds, concurrency) {
134
+ const results = new Array(stopPlaceIds.length);
135
+ for (let i = 0; i < stopPlaceIds.length; i += concurrency) {
136
+ const chunk = stopPlaceIds.slice(i, i + concurrency);
137
+ const chunkPromises = chunk.map(async (id, chunkIndex) => {
138
+ const globalIndex = i + chunkIndex;
139
+ try {
140
+ const result = await this.getStopPlace(id);
141
+ results[globalIndex] = result;
142
+ }
143
+ catch (error) {
144
+ console.warn(`Failed to fetch stop place ${id}:`, error.message);
145
+ results[globalIndex] = null;
146
+ }
147
+ });
148
+ await Promise.allSettled(chunkPromises);
149
+ if (i + concurrency < stopPlaceIds.length) {
150
+ await this.sleep(100);
151
+ }
152
+ }
153
+ return results;
154
+ }
155
+ parseStopPlaceResponse(data, originalId) {
156
+ const stopPlace = {
157
+ id: originalId,
158
+ };
159
+ try {
160
+ if (data) {
161
+ if (data.name?.value) {
162
+ stopPlace.name = data.name.value;
163
+ }
164
+ else if (typeof data.name === "string") {
165
+ stopPlace.name = data.name;
166
+ }
167
+ if (data.description?.value) {
168
+ stopPlace.description = data.description.value;
169
+ }
170
+ else if (typeof data.description === "string") {
171
+ stopPlace.description = data.description;
172
+ }
173
+ if (data.transportMode) {
174
+ stopPlace.transportMode = Array.isArray(data.transportMode)
175
+ ? data.transportMode
176
+ : [data.transportMode];
177
+ }
178
+ if (data.centroid?.location?.longitude &&
179
+ data.centroid?.location?.latitude) {
180
+ stopPlace.coordinates = {
181
+ latitude: data.centroid.location.latitude,
182
+ longitude: data.centroid.location.longitude,
183
+ };
184
+ }
185
+ if (data.topographicPlaceRef?.ref) {
186
+ stopPlace.municipality = `Ref: ${data.topographicPlaceRef.ref}`;
187
+ }
188
+ }
189
+ }
190
+ catch (error) {
191
+ console.warn(`Error parsing stop place data for ${originalId}:`, error);
192
+ }
193
+ return stopPlace;
194
+ }
195
+ }
196
+ exports.EnturApiClient = EnturApiClient;
197
+ function createConservativeEnturClient(clientName) {
198
+ return new EnturApiClient(clientName, {
199
+ maxRetries: 5,
200
+ baseDelay: 2000,
201
+ maxDelay: 60000,
202
+ backoffMultiplier: 2,
203
+ });
204
+ }
205
+ exports.enturApi = new EnturApiClient();
206
+ //# sourceMappingURL=enturApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enturApi.js","sourceRoot":"","sources":["../../src/utils/enturApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function readFile(filePath: string): Promise<string>;
2
+ //# sourceMappingURL=fileReader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileReader.d.ts","sourceRoot":"","sources":["../../src/utils/fileReader.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBhE"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readFile = readFile;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ async function readFile(filePath) {
7
+ try {
8
+ const absolutePath = (0, path_1.resolve)(filePath);
9
+ const content = await fs_1.promises.readFile(absolutePath, "utf-8");
10
+ return content;
11
+ }
12
+ catch (error) {
13
+ if (error instanceof Error) {
14
+ if ("code" in error) {
15
+ switch (error.code) {
16
+ case "ENOENT":
17
+ throw new Error(`File not found: ${filePath}`);
18
+ case "EACCES":
19
+ throw new Error(`Permission denied: ${filePath}`);
20
+ case "EISDIR":
21
+ throw new Error(`Path is a directory, not a file: ${filePath}`);
22
+ default:
23
+ throw new Error(`Failed to read file: ${error.message}`);
24
+ }
25
+ }
26
+ }
27
+ throw new Error(`Failed to read file: ${filePath}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=fileReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileReader.js","sourceRoot":"","sources":["../../src/utils/fileReader.ts"],"names":[],"mappings":";;;AAAA,2BAAoC;AACpC,+BAA+B;AAQxB,KAAK,mBAAmB,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,aAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAE3B,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBACpB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;oBACnB,KAAK,QAAQ;wBACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;oBACjD,KAAK,QAAQ;wBACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;oBACpD,KAAK,QAAQ;wBACX,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;oBAClE;wBACE,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface FontFamily {
2
+ regular: string;
3
+ bold: string;
4
+ }
5
+ export declare class FontLoader {
6
+ private cachedFontFamily;
7
+ loadPoppins(): Promise<FontFamily>;
8
+ }
9
+ export declare const fontLoader: FontLoader;
10
+ //# sourceMappingURL=fontLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontLoader.d.ts","sourceRoot":"","sources":["../../src/utils/fontLoader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAaD,qBAAa,UAAU;IACrB,OAAO,CAAC,gBAAgB,CAA2B;IAO7C,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC,CAyBvC;CACF;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fontLoader = exports.FontLoader = void 0;
4
+ const fs_1 = require("fs");
5
+ const assets_1 = require("./assets");
6
+ const HELVETICA_FALLBACK = {
7
+ regular: "Helvetica",
8
+ bold: "Helvetica-Bold",
9
+ };
10
+ class FontLoader {
11
+ cachedFontFamily = null;
12
+ async loadPoppins() {
13
+ if (this.cachedFontFamily) {
14
+ return this.cachedFontFamily;
15
+ }
16
+ const regularPath = (0, assets_1.getAssetPath)("fonts", "poppins-400-normal.ttf");
17
+ const boldPath = (0, assets_1.getAssetPath)("fonts", "poppins-700-normal.ttf");
18
+ try {
19
+ await Promise.all([fs_1.promises.access(regularPath), fs_1.promises.access(boldPath)]);
20
+ const fontFamily = {
21
+ regular: regularPath,
22
+ bold: boldPath,
23
+ };
24
+ this.cachedFontFamily = fontFamily;
25
+ return fontFamily;
26
+ }
27
+ catch (error) {
28
+ console.warn("Failed to read bundled Poppins fonts, falling back to Helvetica:", error instanceof Error ? error.message : error);
29
+ this.cachedFontFamily = HELVETICA_FALLBACK;
30
+ return HELVETICA_FALLBACK;
31
+ }
32
+ }
33
+ }
34
+ exports.FontLoader = FontLoader;
35
+ exports.fontLoader = new FontLoader();
36
+ //# sourceMappingURL=fontLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fontLoader.js","sourceRoot":"","sources":["../../src/utils/fontLoader.ts"],"names":[],"mappings":";;;AAAA,2BAAoC;AACpC,qCAAwC;AAOxC,MAAM,kBAAkB,GAAe;IACrC,OAAO,EAAE,WAAW;IACpB,IAAI,EAAE,gBAAgB;CACvB,CAAC;AAQF;IACU,gBAAgB,GAAsB,IAAI,CAAC;IAOnD,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,IAAA,qBAAY,EAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAA,qBAAY,EAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,aAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,aAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAEjE,MAAM,UAAU,GAAe;gBAC7B,OAAO,EAAE,WAAW;gBACpB,IAAI,EAAE,QAAQ;aACf,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;YACnC,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,kEAAkE,EAClE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,CAAC;YAC3C,OAAO,kBAAkB,CAAC;QAC5B,CAAC;IACH,CAAC;CACF;;AAGY,QAAA,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface IdParseResult {
2
+ uniqueIds: Set<string>;
3
+ totalCount: number;
4
+ duplicateCount: number;
5
+ emptyLineCount: number;
6
+ }
7
+ export interface IdParseError extends Error {
8
+ code: "EMPTY_FILE" | "NO_VALID_IDS" | "INVALID_FORMAT";
9
+ }
10
+ export declare function parseUniqueIds(content: string): Promise<IdParseResult>;
11
+ export declare function formatIdCountResult(result: IdParseResult): string;
12
+ //# sourceMappingURL=idParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idParser.d.ts","sourceRoot":"","sources":["../../src/utils/idParser.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAa,SAAQ,KAAK;IACzC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,gBAAgB,CAAC;CACxD;AAQD,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAsD5E;AAOD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAejE"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseUniqueIds = parseUniqueIds;
4
+ exports.formatIdCountResult = formatIdCountResult;
5
+ async function parseUniqueIds(content) {
6
+ if (!content || content.trim().length === 0) {
7
+ const error = new Error("File is empty or contains no content");
8
+ error.code = "EMPTY_FILE";
9
+ throw error;
10
+ }
11
+ const lines = content.split(/\r?\n/);
12
+ const uniqueIds = new Set();
13
+ let totalCount = 0;
14
+ let duplicateCount = 0;
15
+ let emptyLineCount = 0;
16
+ for (const line of lines) {
17
+ const trimmedLine = line.trim();
18
+ if (trimmedLine === "") {
19
+ emptyLineCount++;
20
+ continue;
21
+ }
22
+ if (trimmedLine.includes(" ") || trimmedLine.includes("\t")) {
23
+ const error = new Error(`Invalid ID format: IDs cannot contain whitespace. Found: "${trimmedLine}"`);
24
+ error.code = "INVALID_FORMAT";
25
+ throw error;
26
+ }
27
+ totalCount++;
28
+ if (uniqueIds.has(trimmedLine)) {
29
+ duplicateCount++;
30
+ }
31
+ else {
32
+ uniqueIds.add(trimmedLine);
33
+ }
34
+ }
35
+ if (uniqueIds.size === 0) {
36
+ const error = new Error("No valid IDs found in file");
37
+ error.code = "NO_VALID_IDS";
38
+ throw error;
39
+ }
40
+ return {
41
+ uniqueIds,
42
+ totalCount,
43
+ duplicateCount,
44
+ emptyLineCount,
45
+ };
46
+ }
47
+ function formatIdCountResult(result) {
48
+ const { uniqueIds, totalCount, duplicateCount, emptyLineCount } = result;
49
+ let output = `Number of unique IDs: ${uniqueIds.size}`;
50
+ if (duplicateCount > 0) {
51
+ output += `\nTotal IDs processed: ${totalCount}`;
52
+ output += `\nDuplicate IDs found: ${duplicateCount}`;
53
+ }
54
+ if (emptyLineCount > 0) {
55
+ output += `\nEmpty lines skipped: ${emptyLineCount}`;
56
+ }
57
+ return output;
58
+ }
59
+ //# sourceMappingURL=idParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idParser.js","sourceRoot":"","sources":["../../src/utils/idParser.ts"],"names":[],"mappings":";;;;AAqBO,KAAK,yBAAyB,OAAe;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,sCAAsC,CACvB,CAAC;QAClB,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAGhC,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QAGD,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAI,KAAK,CACrB,6DAA6D,WAAW,GAAG,CAC5D,CAAC;YAClB,KAAK,CAAC,IAAI,GAAG,gBAAgB,CAAC;YAC9B,MAAM,KAAK,CAAC;QACd,CAAC;QAED,UAAU,EAAE,CAAC;QAEb,IAAI,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,cAAc,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAiB,CAAC;QACtE,KAAK,CAAC,IAAI,GAAG,cAAc,CAAC;QAC5B,MAAM,KAAK,CAAC;IACd,CAAC;IAED,OAAO;QACL,SAAS;QACT,UAAU;QACV,cAAc;QACd,cAAc;KACf,CAAC;AACJ,CAAC;AAOD,6BAAoC,MAAqB;IACvD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAEzE,IAAI,MAAM,GAAG,yBAAyB,SAAS,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,0BAA0B,UAAU,EAAE,CAAC;QACjD,MAAM,IAAI,0BAA0B,cAAc,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,0BAA0B,cAAc,EAAE,CAAC;IACvD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function extractStopPlaceNumber(nsrId: string): string | null;
2
+ export declare function isValidNsrStopPlaceId(nsrId: string): boolean;
3
+ //# sourceMappingURL=nsrId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsrId.d.ts","sourceRoot":"","sources":["../../src/utils/nsrId.ts"],"names":[],"mappings":"AAaA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAKD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractStopPlaceNumber = extractStopPlaceNumber;
4
+ exports.isValidNsrStopPlaceId = isValidNsrStopPlaceId;
5
+ const NSR_STOP_PLACE_PATTERN = /^NSR:StopPlace:([0-9]+)$/;
6
+ function extractStopPlaceNumber(nsrId) {
7
+ const match = NSR_STOP_PLACE_PATTERN.exec(nsrId);
8
+ return match ? match[1] : null;
9
+ }
10
+ function isValidNsrStopPlaceId(nsrId) {
11
+ return NSR_STOP_PLACE_PATTERN.test(nsrId);
12
+ }
13
+ //# sourceMappingURL=nsrId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nsrId.js","sourceRoot":"","sources":["../../src/utils/nsrId.ts"],"names":[],"mappings":";;;;AAMA,MAAM,sBAAsB,GAAG,0BAA0B,CAAC;AAO1D,gCAAuC,KAAa;IAClD,MAAM,KAAK,GAAG,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAKD,+BAAsC,KAAa;IACjD,OAAO,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { StopPlaceInfo } from "./enturApi";
2
+ export interface PdfStyleConfig {
3
+ headerFooterColor?: string;
4
+ logoPath?: string;
5
+ logoWidth?: number;
6
+ fallbackLogoText?: string;
7
+ fallbackLogoSubtext?: string;
8
+ }
9
+ export interface StopPlaceQrContext {
10
+ id: string;
11
+ name: string;
12
+ }
13
+ export interface PdfProgressEvent {
14
+ current: number;
15
+ total: number;
16
+ nsrId: string;
17
+ outputPath?: string;
18
+ status: "generated" | "skipped" | "error";
19
+ error?: string;
20
+ }
21
+ export type StopPlaceId = string;
22
+ export interface StopPlaceInput {
23
+ id: StopPlaceId;
24
+ name: string;
25
+ transportMode?: string[];
26
+ }
27
+ export type StopPlaceRequest = StopPlaceId | StopPlaceInput;
28
+ export interface PdfGenerationOptions {
29
+ outputDirectory: string;
30
+ format?: "A4" | "A3" | "Letter";
31
+ orientation?: "landscape" | "portrait";
32
+ generateQrUrl?: (stopPlace: StopPlaceQrContext) => string;
33
+ style?: PdfStyleConfig;
34
+ overwrite?: boolean;
35
+ onProgress?: (event: PdfProgressEvent) => void;
36
+ stopPlaceFetcher?: (ids: string[]) => Promise<(StopPlaceInfo | null)[]>;
37
+ enrichTransportMode?: boolean;
38
+ }
39
+ export interface PdfGenerationItemResult {
40
+ nsrId: string;
41
+ outputPath: string;
42
+ }
43
+ export interface PdfGenerationFailure {
44
+ nsrId: string;
45
+ error: string;
46
+ }
47
+ export interface PdfGenerationResult {
48
+ generatedFiles: string[];
49
+ totalGenerated: number;
50
+ outputDirectory: string;
51
+ generated: PdfGenerationItemResult[];
52
+ skipped: PdfGenerationItemResult[];
53
+ failed: PdfGenerationFailure[];
54
+ }
55
+ export declare function generatePdfsForStopPlaces(requests: StopPlaceRequest[], options: PdfGenerationOptions): Promise<PdfGenerationResult>;
56
+ //# sourceMappingURL=pdfGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdfGenerator.d.ts","sourceRoot":"","sources":["../../src/utils/pdfGenerator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAY,aAAa,EAAE,MAAM,YAAY,CAAC;AAIrD,MAAM,WAAW,cAAc;IAE7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,MAAM,WAAW,kBAAkB;IAEjC,EAAE,EAAE,MAAM,CAAC;IAEX,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAMjC,MAAM,WAAW,cAAc;IAE7B,EAAE,EAAE,WAAW,CAAC;IAEhB,IAAI,EAAE,MAAM,CAAC;IAEb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AASD,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,cAAc,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IAEhC,WAAW,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAUvC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAE1D,KAAK,CAAC,EAAE,cAAc,CAAC;IAEvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAM/C,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAYxE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAElC,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IAExB,SAAS,EAAE,uBAAuB,EAAE,CAAC;IAErC,OAAO,EAAE,uBAAuB,EAAE,CAAC;IAEnC,MAAM,EAAE,oBAAoB,EAAE,CAAC;CAChC;AAWD,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA4G9B"}