@mrfylke/nsr-barcode-generator 1.2.0 → 1.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 +26 -4
- package/assets/images/Boat.png +0 -0
- package/assets/images/Bus.png +0 -0
- package/dist/api.d.ts +16 -10
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +90 -85
- package/dist/api.js.map +1 -1
- package/dist/cli.js +29 -4
- package/dist/cli.js.map +1 -1
- package/dist/utils/assets.js +4 -4
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/enturApi.d.ts +14 -0
- package/dist/utils/enturApi.d.ts.map +1 -1
- package/dist/utils/enturApi.js +32 -13
- package/dist/utils/enturApi.js.map +1 -1
- package/dist/utils/fileReader.js +4 -4
- package/dist/utils/fileReader.js.map +1 -1
- package/dist/utils/fontLoader.js +2 -2
- package/dist/utils/fontLoader.js.map +1 -1
- package/dist/utils/nsrId.js +1 -1
- package/dist/utils/nsrId.js.map +1 -1
- package/dist/utils/pdfGenerator.d.ts +18 -2
- package/dist/utils/pdfGenerator.d.ts.map +1 -1
- package/dist/utils/pdfGenerator.js +355 -327
- package/dist/utils/pdfGenerator.js.map +1 -1
- package/package.json +8 -2
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ interface PdfGenerationOptions {
|
|
|
50
50
|
orientation?: "landscape" | "portrait"; // default "landscape"
|
|
51
51
|
style?: PdfStyleConfig; // colors/logo, see below
|
|
52
52
|
overwrite?: boolean; // replace existing files (default false = skip)
|
|
53
|
-
onProgress?: (event: PdfProgressEvent) => void;
|
|
53
|
+
onProgress?: (event: PdfProgressEvent) => void; // see "Result & progress" below
|
|
54
54
|
|
|
55
55
|
// Custom QR payload. Called once metadata is resolved; the returned
|
|
56
56
|
// string is used verbatim (no rewriting). Must be an absolute http(s)
|
|
@@ -117,7 +117,27 @@ interface PdfGenerationResult {
|
|
|
117
117
|
outputDirectory: string;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
// Discriminated union on `type`. Fetching events precede generation events.
|
|
121
|
+
type PdfProgressEvent =
|
|
122
|
+
| DataFetchingProgressEvent
|
|
123
|
+
| DataFetchingBatchProgressEvent
|
|
124
|
+
| GenerationProgressEvent;
|
|
125
|
+
|
|
126
|
+
interface DataFetchingProgressEvent {
|
|
127
|
+
type: "data-fetching";
|
|
128
|
+
current: number; total: number; nsrId: string;
|
|
129
|
+
status: "fetched" | "error";
|
|
130
|
+
error?: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Fired once per batch of Entur lookups, right before the delay ahead of the next batch.
|
|
134
|
+
interface DataFetchingBatchProgressEvent {
|
|
135
|
+
type: "data-fetching-batch";
|
|
136
|
+
batchNumber: number; totalBatches: number; delayMs: number;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
interface GenerationProgressEvent {
|
|
140
|
+
type: "generation";
|
|
121
141
|
current: number; total: number; nsrId: string;
|
|
122
142
|
outputPath?: string;
|
|
123
143
|
status: "generated" | "skipped" | "error";
|
|
@@ -125,11 +145,11 @@ interface PdfProgressEvent {
|
|
|
125
145
|
}
|
|
126
146
|
```
|
|
127
147
|
|
|
128
|
-
`onProgress` fires once per requested ID. One item failing never aborts the batch.
|
|
148
|
+
`onProgress` first fires once per ID needing an Entur lookup (`type: "data-fetching"`), with a `type: "data-fetching-batch"` event between batches while fetches are throttled, then once per requested ID as PDFs are written (`type: "generation"`). One item failing never aborts the batch. Fetching events (including batch events) are only emitted for the built-in Entur client - a custom `stopPlaceFetcher` does not report fetch progress.
|
|
129
149
|
|
|
130
150
|
### Types
|
|
131
151
|
|
|
132
|
-
`ProcessFileOptions/Result`, `GenerateSinglePdfOptions/Result`, `PdfGenerationOptions/Result`, `PdfProgressEvent`, `PdfStyleConfig`, `StopPlaceQrContext`, `StopPlaceId`/`StopPlaceInput`/`StopPlaceRequest`, `ValidationResult`, `IdParseResult`/`IdParseError` are all exported.
|
|
152
|
+
`ProcessFileOptions/Result`, `GenerateSinglePdfOptions/Result`, `PdfGenerationOptions/Result`, `PdfProgressEvent`, `DataFetchingProgressEvent`, `DataFetchingBatchProgressEvent`, `GenerationProgressEvent`, `PdfStyleConfig`, `StopPlaceQrContext`, `StopPlaceId`/`StopPlaceInput`/`StopPlaceRequest`, `ValidationResult`, `IdParseResult`/`IdParseError` are all exported.
|
|
133
153
|
|
|
134
154
|
### NSR ID format & filenames
|
|
135
155
|
|
|
@@ -149,6 +169,8 @@ nsr-barcode validate NSR:StopPlace:39598 # check ID format only
|
|
|
149
169
|
nsr-barcode parse ids.txt # list unique IDs, no PDFs
|
|
150
170
|
```
|
|
151
171
|
|
|
172
|
+
`file` and `id` print one line per `onProgress` event as they happen - Entur lookups first (`[fetching n/total] ...`), with a `Processed batch n/total. Waiting <ms>ms before next batch...` line whenever fetches are large enough to be throttled into batches, then PDF writes (`[generating n/total] ...`) - followed by the final summary.
|
|
173
|
+
|
|
152
174
|
## Embeddability
|
|
153
175
|
|
|
154
176
|
Fonts (bundled Poppins) and images resolve relative to the package's own install location, not `process.cwd()` - safe inside a packaged desktop app with a read-only install dir. Nothing is downloaded or cached to disk at runtime; a bundled font that fails to read falls back to Helvetica.
|
package/assets/images/Boat.png
CHANGED
|
Binary file
|
package/assets/images/Bus.png
CHANGED
|
Binary file
|
package/dist/api.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { formatIdCountResult, IdParseError, IdParseResult } from "./utils/idParser";
|
|
2
|
-
import { PdfGenerationOptions, PdfGenerationResult, PdfGenerationItemResult, PdfGenerationFailure, PdfProgressEvent, PdfStyleConfig, StopPlaceQrContext, StopPlaceId, StopPlaceInput, StopPlaceRequest } from "./utils/pdfGenerator";
|
|
3
2
|
import { extractStopPlaceNumber } from "./utils/nsrId";
|
|
3
|
+
import { DataFetchingBatchProgressEvent, DataFetchingProgressEvent, GenerationProgressEvent, PdfGenerationFailure, PdfGenerationItemResult, PdfGenerationOptions, PdfGenerationResult, PdfProgressEvent, PdfStyleConfig, StopPlaceId, StopPlaceInput, StopPlaceQrContext, StopPlaceRequest } from "./utils/pdfGenerator";
|
|
4
4
|
interface CommonPdfOptions {
|
|
5
5
|
assetsDirectory?: string;
|
|
6
6
|
format?: "A4" | "A3" | "Letter";
|
|
@@ -36,14 +36,20 @@ export interface ValidationResult {
|
|
|
36
36
|
isValid: boolean;
|
|
37
37
|
error?: string;
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
declare function validateNsrId(nsrId: string): ValidationResult;
|
|
40
|
+
declare function processFile(options: ProcessFileOptions): Promise<ProcessFileResult>;
|
|
41
|
+
declare function generateSinglePdf(options: GenerateSinglePdfOptions): Promise<GenerateSinglePdfResult>;
|
|
42
|
+
declare function generateMultiplePdfs(stopPlaces: StopPlaceRequest[], options: PdfGenerationOptions): Promise<PdfGenerationResult>;
|
|
43
|
+
declare function parseIds(content: string): Promise<IdParseResult>;
|
|
44
|
+
declare function parseIdsFromFile(filePath: string): Promise<IdParseResult>;
|
|
45
|
+
export declare const NsrBarcodeApi: {
|
|
46
|
+
processFile: typeof processFile;
|
|
47
|
+
generateSinglePdf: typeof generateSinglePdf;
|
|
48
|
+
generateMultiplePdfs: typeof generateMultiplePdfs;
|
|
49
|
+
validateNsrId: typeof validateNsrId;
|
|
50
|
+
parseIds: typeof parseIds;
|
|
51
|
+
parseIdsFromFile: typeof parseIdsFromFile;
|
|
52
|
+
};
|
|
53
|
+
export { DataFetchingBatchProgressEvent, DataFetchingProgressEvent, extractStopPlaceNumber, formatIdCountResult, GenerationProgressEvent, IdParseError, IdParseResult, PdfGenerationFailure, PdfGenerationItemResult, PdfGenerationOptions, PdfGenerationResult, PdfProgressEvent, PdfStyleConfig, StopPlaceId, StopPlaceInput, StopPlaceQrContext, StopPlaceRequest, };
|
|
48
54
|
export default NsrBarcodeApi;
|
|
49
55
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,aAAa,EAEd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAyB,MAAM,eAAe,CAAC;AAC9E,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,uBAAuB,EAEvB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAM9B,UAAU,gBAAgB;IAExB,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC;IAEhC,WAAW,CAAC,EAAE,WAAW,GAAG,UAAU,CAAC;IAEvC,KAAK,CAAC,EAAE,cAAc,CAAC;IAKvB,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,MAAM,CAAC;IAE1D,SAAS,CAAC,EAAE,OAAO,CAAC;IAOpB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAE/C,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAS5D,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAKD,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB;IAE1D,QAAQ,EAAE,MAAM,CAAC;IAEjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAKD,MAAM,WAAW,iBAAiB;IAEhC,WAAW,EAAE,aAAa,CAAC;IAE3B,SAAS,EAAE,mBAAmB,CAAC;IAE/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAEhE,KAAK,EAAE,MAAM,CAAC;IAEd,eAAe,EAAE,MAAM,CAAC;IAKxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAKD,MAAM,WAAW,uBAAuB;IAEtC,SAAS,EAAE,mBAAmB,CAAC;IAE/B,OAAO,EAAE,OAAO,CAAC;IAEjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,gBAAgB;IAE/B,OAAO,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA8CD,iBAAS,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAiBtD;AAOD,iBAAe,WAAW,CACxB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAwC5B;AAOD,iBAAe,iBAAiB,CAC9B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAkClC;AAYD,iBAAe,oBAAoB,CACjC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAW9B;AAOD,iBAAe,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAE/D;AAOD,iBAAe,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGxE;AAKD,eAAO,MAAM,aAAa;;;;;;;CAOzB,CAAC;AAGF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,CAAC;eAGa,aAAa"}
|
package/dist/api.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.formatIdCountResult = exports.extractStopPlaceNumber = exports.NsrBarcodeApi = void 0;
|
|
4
4
|
const fileReader_1 = require("./utils/fileReader");
|
|
5
5
|
const idParser_1 = require("./utils/idParser");
|
|
6
6
|
Object.defineProperty(exports, "formatIdCountResult", { enumerable: true, get: function () { return idParser_1.formatIdCountResult; } });
|
|
7
|
-
const pdfGenerator_1 = require("./utils/pdfGenerator");
|
|
8
7
|
const nsrId_1 = require("./utils/nsrId");
|
|
9
8
|
Object.defineProperty(exports, "extractStopPlaceNumber", { enumerable: true, get: function () { return nsrId_1.extractStopPlaceNumber; } });
|
|
9
|
+
const pdfGenerator_1 = require("./utils/pdfGenerator");
|
|
10
10
|
function buildPdfOptions(outputDirectory, options) {
|
|
11
11
|
const pdfOptions = { outputDirectory };
|
|
12
12
|
if (options.assetsDirectory) {
|
|
@@ -38,99 +38,104 @@ function buildPdfOptions(outputDirectory, options) {
|
|
|
38
38
|
}
|
|
39
39
|
return pdfOptions;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const uniqueIdsArray = Array.from(parseResult.uniqueIds);
|
|
48
|
-
for (const nsrId of uniqueIdsArray) {
|
|
49
|
-
const validation = this.validateNsrId(nsrId);
|
|
50
|
-
if (!validation.isValid) {
|
|
51
|
-
throw new Error(`Invalid NSR ID "${nsrId}": ${validation.error}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
55
|
-
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)(uniqueIdsArray, pdfOptions);
|
|
56
|
-
const parseSummary = (0, idParser_1.formatIdCountResult)(parseResult);
|
|
57
|
-
const pdfSummary = `Generated ${pdfResult.totalGenerated} PDF files in ${pdfResult.outputDirectory}`;
|
|
58
|
-
const summary = `${parseSummary}\n\n${pdfSummary}`;
|
|
59
|
-
return {
|
|
60
|
-
parseResult,
|
|
61
|
-
pdfResult,
|
|
62
|
-
summary,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
if (error instanceof Error) {
|
|
67
|
-
throw error;
|
|
68
|
-
}
|
|
69
|
-
throw new Error("An unexpected error occurred during file processing");
|
|
70
|
-
}
|
|
41
|
+
function validateNsrId(nsrId) {
|
|
42
|
+
if (!nsrId) {
|
|
43
|
+
return {
|
|
44
|
+
isValid: false,
|
|
45
|
+
error: "NSR ID cannot be empty",
|
|
46
|
+
};
|
|
71
47
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
throw new Error(validation.error);
|
|
78
|
-
}
|
|
79
|
-
const request = name
|
|
80
|
-
? { id: nsrId, name, ...(transportMode ? { transportMode } : {}) }
|
|
81
|
-
: nsrId;
|
|
82
|
-
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
83
|
-
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)([request], pdfOptions);
|
|
84
|
-
const success = pdfResult.totalGenerated > 0 || pdfResult.skipped.length > 0;
|
|
85
|
-
const summary = success
|
|
86
|
-
? `Successfully generated PDF for ${nsrId} in ${pdfResult.outputDirectory}`
|
|
87
|
-
: `Failed to generate PDF for ${nsrId}`;
|
|
88
|
-
return {
|
|
89
|
-
pdfResult,
|
|
90
|
-
success,
|
|
91
|
-
summary,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
catch (error) {
|
|
95
|
-
if (error instanceof Error) {
|
|
96
|
-
throw error;
|
|
97
|
-
}
|
|
98
|
-
throw new Error("An unexpected error occurred during PDF generation");
|
|
99
|
-
}
|
|
48
|
+
if (!(0, nsrId_1.isValidNsrStopPlaceId)(nsrId)) {
|
|
49
|
+
return {
|
|
50
|
+
isValid: false,
|
|
51
|
+
error: "Invalid NSR ID format. Expected format: NSR:StopPlace:<digits> with no extra whitespace or characters",
|
|
52
|
+
};
|
|
100
53
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
54
|
+
return { isValid: true };
|
|
55
|
+
}
|
|
56
|
+
async function processFile(options) {
|
|
57
|
+
const { filePath, outputDirectory } = options;
|
|
58
|
+
try {
|
|
59
|
+
const content = await (0, fileReader_1.readFile)(filePath);
|
|
60
|
+
const parseResult = await (0, idParser_1.parseUniqueIds)(content);
|
|
61
|
+
const uniqueIdsArray = Array.from(parseResult.uniqueIds);
|
|
62
|
+
for (const nsrId of uniqueIdsArray) {
|
|
63
|
+
const validation = validateNsrId(nsrId);
|
|
105
64
|
if (!validation.isValid) {
|
|
106
65
|
throw new Error(`Invalid NSR ID "${nsrId}": ${validation.error}`);
|
|
107
66
|
}
|
|
108
67
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
68
|
+
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
69
|
+
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)(uniqueIdsArray, pdfOptions);
|
|
70
|
+
const parseSummary = (0, idParser_1.formatIdCountResult)(parseResult);
|
|
71
|
+
const pdfSummary = `Generated ${pdfResult.totalGenerated} PDF files in ${pdfResult.outputDirectory}`;
|
|
72
|
+
const summary = `${parseSummary}\n\n${pdfSummary}`;
|
|
73
|
+
return {
|
|
74
|
+
parseResult,
|
|
75
|
+
pdfResult,
|
|
76
|
+
summary,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof Error) {
|
|
81
|
+
throw error;
|
|
117
82
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
83
|
+
throw new Error("An unexpected error occurred during file processing");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function generateSinglePdf(options) {
|
|
87
|
+
const { nsrId, outputDirectory, name, transportMode } = options;
|
|
88
|
+
try {
|
|
89
|
+
const validation = validateNsrId(nsrId);
|
|
90
|
+
if (!validation.isValid) {
|
|
91
|
+
throw new Error(validation.error);
|
|
123
92
|
}
|
|
124
|
-
|
|
93
|
+
const request = name
|
|
94
|
+
? { id: nsrId, name, ...(transportMode ? { transportMode } : {}) }
|
|
95
|
+
: nsrId;
|
|
96
|
+
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
97
|
+
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)([request], pdfOptions);
|
|
98
|
+
const success = pdfResult.totalGenerated > 0 || pdfResult.skipped.length > 0;
|
|
99
|
+
const summary = success
|
|
100
|
+
? `Successfully generated PDF for ${nsrId} in ${pdfResult.outputDirectory}`
|
|
101
|
+
: `Failed to generate PDF for ${nsrId}`;
|
|
102
|
+
return {
|
|
103
|
+
pdfResult,
|
|
104
|
+
success,
|
|
105
|
+
summary,
|
|
106
|
+
};
|
|
125
107
|
}
|
|
126
|
-
|
|
127
|
-
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error) {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
throw new Error("An unexpected error occurred during PDF generation");
|
|
128
113
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
114
|
+
}
|
|
115
|
+
async function generateMultiplePdfs(stopPlaces, options) {
|
|
116
|
+
for (const request of stopPlaces) {
|
|
117
|
+
const nsrId = typeof request === "string" ? request : request.id;
|
|
118
|
+
const validation = validateNsrId(nsrId);
|
|
119
|
+
if (!validation.isValid) {
|
|
120
|
+
throw new Error(`Invalid NSR ID "${nsrId}": ${validation.error}`);
|
|
121
|
+
}
|
|
132
122
|
}
|
|
123
|
+
return (0, pdfGenerator_1.generatePdfsForStopPlaces)(stopPlaces, options);
|
|
124
|
+
}
|
|
125
|
+
async function parseIds(content) {
|
|
126
|
+
return (0, idParser_1.parseUniqueIds)(content);
|
|
127
|
+
}
|
|
128
|
+
async function parseIdsFromFile(filePath) {
|
|
129
|
+
const content = await (0, fileReader_1.readFile)(filePath);
|
|
130
|
+
return (0, idParser_1.parseUniqueIds)(content);
|
|
133
131
|
}
|
|
134
|
-
exports.NsrBarcodeApi =
|
|
135
|
-
|
|
132
|
+
exports.NsrBarcodeApi = {
|
|
133
|
+
processFile,
|
|
134
|
+
generateSinglePdf,
|
|
135
|
+
generateMultiplePdfs,
|
|
136
|
+
validateNsrId,
|
|
137
|
+
parseIds,
|
|
138
|
+
parseIdsFromFile,
|
|
139
|
+
};
|
|
140
|
+
exports.default = exports.NsrBarcodeApi;
|
|
136
141
|
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";;;AAKA,mDAA8C;AAC9C,+CAK0B;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -2,9 +2,32 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
|
-
const api_1 = require("./api");
|
|
6
5
|
const package_json_1 = require("../package.json");
|
|
6
|
+
const api_1 = require("./api");
|
|
7
7
|
const program = new commander_1.Command();
|
|
8
|
+
function logProgress(event) {
|
|
9
|
+
if (event.type === "data-fetching") {
|
|
10
|
+
if (event.status === "error") {
|
|
11
|
+
console.log(`[fetching ${event.current}/${event.total}] ${event.nsrId} - failed: ${event.error}`);
|
|
12
|
+
}
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (event.type === "data-fetching-batch") {
|
|
16
|
+
console.log(`Processed batch ${event.batchNumber}/${event.totalBatches}. Waiting ${event.delayMs}ms before next batch...`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
switch (event.status) {
|
|
20
|
+
case "generated":
|
|
21
|
+
console.log(`[generating ${event.current}/${event.total}] ${event.nsrId} -> ${event.outputPath}`);
|
|
22
|
+
break;
|
|
23
|
+
case "skipped":
|
|
24
|
+
console.log(`[generating ${event.current}/${event.total}] ${event.nsrId} - skipped (already exists)`);
|
|
25
|
+
break;
|
|
26
|
+
case "error":
|
|
27
|
+
console.log(`[generating ${event.current}/${event.total}] ${event.nsrId} - failed: ${event.error}`);
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
8
31
|
program
|
|
9
32
|
.name("nsr-barcode")
|
|
10
33
|
.description("Generate PDF files for unique IDs from input files")
|
|
@@ -61,6 +84,7 @@ program
|
|
|
61
84
|
const processOptions = {
|
|
62
85
|
filePath,
|
|
63
86
|
outputDirectory: options.output,
|
|
87
|
+
onProgress: logProgress,
|
|
64
88
|
};
|
|
65
89
|
if (format && format !== "A4") {
|
|
66
90
|
processOptions.format = format;
|
|
@@ -75,7 +99,7 @@ program
|
|
|
75
99
|
processOptions.overwrite = true;
|
|
76
100
|
}
|
|
77
101
|
const result = await api_1.NsrBarcodeApi.processFile(processOptions);
|
|
78
|
-
console.log(
|
|
102
|
+
console.log(`\n${result.summary}`);
|
|
79
103
|
const uniqueIdsCount = result.parseResult.uniqueIds.size;
|
|
80
104
|
if (result.pdfResult.totalGenerated !== uniqueIdsCount) {
|
|
81
105
|
console.warn(`\nWarning: Only ${result.pdfResult.totalGenerated} of ${uniqueIdsCount} PDFs were generated successfully`);
|
|
@@ -137,6 +161,7 @@ program
|
|
|
137
161
|
const generateOptions = {
|
|
138
162
|
nsrId,
|
|
139
163
|
outputDirectory: options.output,
|
|
164
|
+
onProgress: logProgress,
|
|
140
165
|
};
|
|
141
166
|
if (format && format !== "A4") {
|
|
142
167
|
generateOptions.format = format;
|
|
@@ -151,7 +176,7 @@ program
|
|
|
151
176
|
generateOptions.overwrite = true;
|
|
152
177
|
}
|
|
153
178
|
const result = await api_1.NsrBarcodeApi.generateSinglePdf(generateOptions);
|
|
154
|
-
console.log(
|
|
179
|
+
console.log(`\n${result.summary}`);
|
|
155
180
|
if (!result.success) {
|
|
156
181
|
console.error(`Error: Failed to generate PDF for ID: ${nsrId}`);
|
|
157
182
|
process.exit(1);
|
|
@@ -184,7 +209,7 @@ program
|
|
|
184
209
|
console.log(`Parsing file: ${filePath}`);
|
|
185
210
|
const result = await api_1.NsrBarcodeApi.parseIdsFromFile(filePath);
|
|
186
211
|
const summary = require("./utils/idParser").formatIdCountResult(result);
|
|
187
|
-
console.log(
|
|
212
|
+
console.log(`\n${summary}`);
|
|
188
213
|
console.log(`\nUnique IDs found:`);
|
|
189
214
|
Array.from(result.uniqueIds).forEach((id, index) => {
|
|
190
215
|
console.log(`${index + 1}. ${id}`);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAOA,yCAAoC;AACpC
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/assets.js
CHANGED
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getAssetPath = getAssetPath;
|
|
4
4
|
exports.resolveAssetPath = resolveAssetPath;
|
|
5
|
-
const
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
6
|
function getPackageRoot() {
|
|
7
|
-
return (0,
|
|
7
|
+
return (0, node_path_1.join)(__dirname, "..", "..");
|
|
8
8
|
}
|
|
9
9
|
function getAssetPath(...segments) {
|
|
10
|
-
return (0,
|
|
10
|
+
return (0, node_path_1.join)(getPackageRoot(), "assets", ...segments);
|
|
11
11
|
}
|
|
12
12
|
function resolveAssetPath(assetsDirectory, ...segments) {
|
|
13
13
|
return assetsDirectory
|
|
14
|
-
? (0,
|
|
14
|
+
? (0, node_path_1.join)(assetsDirectory, ...segments)
|
|
15
15
|
: getAssetPath(...segments);
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=assets.js.map
|
package/dist/utils/assets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":";;;;AAAA
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/utils/assets.ts"],"names":[],"mappings":";;;;AAAA,yCAAiC;AAajC,SAAS,cAAc;IACrB,OAAO,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,sBAA6B,GAAG,QAAkB;IAChD,OAAO,IAAA,gBAAI,EAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC;AACvD,CAAC;AAOD,0BACE,eAAmC,EACnC,GAAG,QAAkB;IAErB,OAAO,eAAe;QACpB,CAAC,CAAC,IAAA,gBAAI,EAAC,eAAe,EAAE,GAAG,QAAQ,CAAC;QACpC,CAAC,CAAC,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/utils/enturApi.d.ts
CHANGED
|
@@ -21,6 +21,18 @@ export interface RetryConfig {
|
|
|
21
21
|
maxDelay: number;
|
|
22
22
|
backoffMultiplier: number;
|
|
23
23
|
}
|
|
24
|
+
export interface StopPlaceFetchProgressEvent {
|
|
25
|
+
current: number;
|
|
26
|
+
total: number;
|
|
27
|
+
nsrId: string;
|
|
28
|
+
status: "fetched" | "error";
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface StopPlaceBatchProgressEvent {
|
|
32
|
+
batchNumber: number;
|
|
33
|
+
totalBatches: number;
|
|
34
|
+
delayMs: number;
|
|
35
|
+
}
|
|
24
36
|
export declare class EnturApiClient {
|
|
25
37
|
private readonly baseUrl;
|
|
26
38
|
private readonly clientName;
|
|
@@ -33,6 +45,8 @@ export declare class EnturApiClient {
|
|
|
33
45
|
batchSize?: number;
|
|
34
46
|
delayBetweenBatches?: number;
|
|
35
47
|
concurrency?: number;
|
|
48
|
+
onProgress?: (event: StopPlaceFetchProgressEvent) => void;
|
|
49
|
+
onBatchComplete?: (event: StopPlaceBatchProgressEvent) => void;
|
|
36
50
|
}): Promise<(StopPlaceInfo | null)[]>;
|
|
37
51
|
private processBatchWithConcurrency;
|
|
38
52
|
private parseStopPlaceResponse;
|
|
@@ -1 +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,
|
|
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;AA0BD,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;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,CA6I9D;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;QAErB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;QAE1D,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,CAAC;KAC3D,GACL,OAAO,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,CAkDnC;YAQa,2BAA2B;IAiDzC,OAAO,CAAC,sBAAsB;CAuD/B;AAQD,wBAAgB,6BAA6B,CAC3C,UAAU,CAAC,EAAE,MAAM,GAClB,cAAc,CAOhB;AAKD,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
|
package/dist/utils/enturApi.js
CHANGED
|
@@ -28,7 +28,7 @@ class EnturApiClient {
|
|
|
28
28
|
return Math.min(retryAfter * 1000, this.retryConfig.maxDelay);
|
|
29
29
|
}
|
|
30
30
|
const delay = this.retryConfig.baseDelay *
|
|
31
|
-
|
|
31
|
+
this.retryConfig.backoffMultiplier ** attempt;
|
|
32
32
|
return Math.min(delay, this.retryConfig.maxDelay);
|
|
33
33
|
}
|
|
34
34
|
async getStopPlace(stopPlaceId) {
|
|
@@ -108,7 +108,6 @@ class EnturApiClient {
|
|
|
108
108
|
const delay = this.calculateRetryDelay(attempt);
|
|
109
109
|
console.warn(`Unknown error for stop place ${stopPlaceId}. Retrying in ${delay}ms (attempt ${attempt + 1}/${this.retryConfig.maxRetries})`);
|
|
110
110
|
await this.sleep(delay);
|
|
111
|
-
continue;
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
113
|
}
|
|
@@ -117,20 +116,38 @@ class EnturApiClient {
|
|
|
117
116
|
throw unknownError;
|
|
118
117
|
}
|
|
119
118
|
async getMultipleStopPlaces(stopPlaceIds, options = {}) {
|
|
120
|
-
const { batchSize = 100, delayBetweenBatches = 1000, concurrency = 5, } = options;
|
|
119
|
+
const { batchSize = 100, delayBetweenBatches = 1000, concurrency = 5, onProgress, onBatchComplete, } = options;
|
|
121
120
|
const results = [];
|
|
121
|
+
const total = stopPlaceIds.length;
|
|
122
|
+
let completed = 0;
|
|
123
|
+
const onItemDone = onProgress
|
|
124
|
+
? (id, status, error) => {
|
|
125
|
+
completed++;
|
|
126
|
+
onProgress({
|
|
127
|
+
current: completed,
|
|
128
|
+
total,
|
|
129
|
+
nsrId: id,
|
|
130
|
+
status,
|
|
131
|
+
...(error ? { error } : {}),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
: undefined;
|
|
122
135
|
for (let i = 0; i < stopPlaceIds.length; i += batchSize) {
|
|
123
136
|
const batch = stopPlaceIds.slice(i, i + batchSize);
|
|
124
|
-
const batchResults = await this.processBatchWithConcurrency(batch, concurrency);
|
|
137
|
+
const batchResults = await this.processBatchWithConcurrency(batch, concurrency, onItemDone);
|
|
125
138
|
results.push(...batchResults);
|
|
126
139
|
if (i + batchSize < stopPlaceIds.length) {
|
|
127
|
-
|
|
140
|
+
onBatchComplete?.({
|
|
141
|
+
batchNumber: Math.floor(i / batchSize) + 1,
|
|
142
|
+
totalBatches: Math.ceil(stopPlaceIds.length / batchSize),
|
|
143
|
+
delayMs: delayBetweenBatches,
|
|
144
|
+
});
|
|
128
145
|
await this.sleep(delayBetweenBatches);
|
|
129
146
|
}
|
|
130
147
|
}
|
|
131
148
|
return results;
|
|
132
149
|
}
|
|
133
|
-
async processBatchWithConcurrency(stopPlaceIds, concurrency) {
|
|
150
|
+
async processBatchWithConcurrency(stopPlaceIds, concurrency, onItemDone) {
|
|
134
151
|
const results = new Array(stopPlaceIds.length);
|
|
135
152
|
for (let i = 0; i < stopPlaceIds.length; i += concurrency) {
|
|
136
153
|
const chunk = stopPlaceIds.slice(i, i + concurrency);
|
|
@@ -139,10 +156,12 @@ class EnturApiClient {
|
|
|
139
156
|
try {
|
|
140
157
|
const result = await this.getStopPlace(id);
|
|
141
158
|
results[globalIndex] = result;
|
|
159
|
+
onItemDone?.(id, "fetched");
|
|
142
160
|
}
|
|
143
161
|
catch (error) {
|
|
144
162
|
console.warn(`Failed to fetch stop place ${id}:`, error.message);
|
|
145
163
|
results[globalIndex] = null;
|
|
164
|
+
onItemDone?.(id, "error", error.message);
|
|
146
165
|
}
|
|
147
166
|
});
|
|
148
167
|
await Promise.allSettled(chunkPromises);
|
|
@@ -158,18 +177,18 @@ class EnturApiClient {
|
|
|
158
177
|
};
|
|
159
178
|
try {
|
|
160
179
|
if (data) {
|
|
161
|
-
if (data.name
|
|
162
|
-
stopPlace.name = data.name.value;
|
|
163
|
-
}
|
|
164
|
-
else if (typeof data.name === "string") {
|
|
180
|
+
if (typeof data.name === "string") {
|
|
165
181
|
stopPlace.name = data.name;
|
|
166
182
|
}
|
|
167
|
-
if (data.
|
|
168
|
-
stopPlace.
|
|
183
|
+
else if (data.name?.value) {
|
|
184
|
+
stopPlace.name = data.name.value;
|
|
169
185
|
}
|
|
170
|
-
|
|
186
|
+
if (typeof data.description === "string") {
|
|
171
187
|
stopPlace.description = data.description;
|
|
172
188
|
}
|
|
189
|
+
else if (data.description?.value) {
|
|
190
|
+
stopPlace.description = data.description.value;
|
|
191
|
+
}
|
|
173
192
|
if (data.transportMode) {
|
|
174
193
|
stopPlace.transportMode = Array.isArray(data.transportMode)
|
|
175
194
|
? data.transportMode
|