@mrfylke/nsr-barcode-generator 1.1.0 → 1.3.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 +32 -4
- package/dist/api.d.ts +17 -10
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +93 -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.d.ts +1 -0
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +9 -3
- 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.d.ts +2 -2
- package/dist/utils/fontLoader.d.ts.map +1 -1
- package/dist/utils/fontLoader.js +12 -10
- 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 +19 -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
|
@@ -45,11 +45,12 @@ All three generation methods share these options:
|
|
|
45
45
|
```typescript
|
|
46
46
|
interface PdfGenerationOptions {
|
|
47
47
|
outputDirectory: string;
|
|
48
|
+
assetsDirectory?: string; // copied package assets for bundled executables
|
|
48
49
|
format?: "A4" | "A3" | "Letter"; // default "A4"
|
|
49
50
|
orientation?: "landscape" | "portrait"; // default "landscape"
|
|
50
51
|
style?: PdfStyleConfig; // colors/logo, see below
|
|
51
52
|
overwrite?: boolean; // replace existing files (default false = skip)
|
|
52
|
-
onProgress?: (event: PdfProgressEvent) => void;
|
|
53
|
+
onProgress?: (event: PdfProgressEvent) => void; // see "Result & progress" below
|
|
53
54
|
|
|
54
55
|
// Custom QR payload. Called once metadata is resolved; the returned
|
|
55
56
|
// string is used verbatim (no rewriting). Must be an absolute http(s)
|
|
@@ -74,6 +75,11 @@ interface PdfStyleConfig {
|
|
|
74
75
|
}
|
|
75
76
|
```
|
|
76
77
|
|
|
78
|
+
When bundling the API into an executable, copy this package's `assets/`
|
|
79
|
+
directory alongside the application and pass its absolute path as
|
|
80
|
+
`assetsDirectory`. This avoids build-time `__dirname` rewriting by bundlers
|
|
81
|
+
such as Bun while leaving regular Node.js package resolution unchanged.
|
|
82
|
+
|
|
77
83
|
`generateSinglePdf` additionally takes `nsrId: string`, plus `name?`/`transportMode?` shortcuts (see below). `processFile` takes `filePath: string` instead of a stop-place array.
|
|
78
84
|
|
|
79
85
|
### Supplying stop place data (skip Entur)
|
|
@@ -111,7 +117,27 @@ interface PdfGenerationResult {
|
|
|
111
117
|
outputDirectory: string;
|
|
112
118
|
}
|
|
113
119
|
|
|
114
|
-
|
|
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";
|
|
115
141
|
current: number; total: number; nsrId: string;
|
|
116
142
|
outputPath?: string;
|
|
117
143
|
status: "generated" | "skipped" | "error";
|
|
@@ -119,11 +145,11 @@ interface PdfProgressEvent {
|
|
|
119
145
|
}
|
|
120
146
|
```
|
|
121
147
|
|
|
122
|
-
`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.
|
|
123
149
|
|
|
124
150
|
### Types
|
|
125
151
|
|
|
126
|
-
`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.
|
|
127
153
|
|
|
128
154
|
### NSR ID format & filenames
|
|
129
155
|
|
|
@@ -143,6 +169,8 @@ nsr-barcode validate NSR:StopPlace:39598 # check ID format only
|
|
|
143
169
|
nsr-barcode parse ids.txt # list unique IDs, no PDFs
|
|
144
170
|
```
|
|
145
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
|
+
|
|
146
174
|
## Embeddability
|
|
147
175
|
|
|
148
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/dist/api.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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
|
+
assetsDirectory?: string;
|
|
5
6
|
format?: "A4" | "A3" | "Letter";
|
|
6
7
|
orientation?: "landscape" | "portrait";
|
|
7
8
|
style?: PdfStyleConfig;
|
|
@@ -35,14 +36,20 @@ export interface ValidationResult {
|
|
|
35
36
|
isValid: boolean;
|
|
36
37
|
error?: string;
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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, };
|
|
47
54
|
export default NsrBarcodeApi;
|
|
48
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,14 +1,17 @@
|
|
|
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
|
+
if (options.assetsDirectory) {
|
|
13
|
+
pdfOptions.assetsDirectory = options.assetsDirectory;
|
|
14
|
+
}
|
|
12
15
|
if (options.format) {
|
|
13
16
|
pdfOptions.format = options.format;
|
|
14
17
|
}
|
|
@@ -35,99 +38,104 @@ function buildPdfOptions(outputDirectory, options) {
|
|
|
35
38
|
}
|
|
36
39
|
return pdfOptions;
|
|
37
40
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const uniqueIdsArray = Array.from(parseResult.uniqueIds);
|
|
45
|
-
for (const nsrId of uniqueIdsArray) {
|
|
46
|
-
const validation = this.validateNsrId(nsrId);
|
|
47
|
-
if (!validation.isValid) {
|
|
48
|
-
throw new Error(`Invalid NSR ID "${nsrId}": ${validation.error}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
52
|
-
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)(uniqueIdsArray, pdfOptions);
|
|
53
|
-
const parseSummary = (0, idParser_1.formatIdCountResult)(parseResult);
|
|
54
|
-
const pdfSummary = `Generated ${pdfResult.totalGenerated} PDF files in ${pdfResult.outputDirectory}`;
|
|
55
|
-
const summary = `${parseSummary}\n\n${pdfSummary}`;
|
|
56
|
-
return {
|
|
57
|
-
parseResult,
|
|
58
|
-
pdfResult,
|
|
59
|
-
summary,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
catch (error) {
|
|
63
|
-
if (error instanceof Error) {
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
throw new Error("An unexpected error occurred during file processing");
|
|
67
|
-
}
|
|
41
|
+
function validateNsrId(nsrId) {
|
|
42
|
+
if (!nsrId) {
|
|
43
|
+
return {
|
|
44
|
+
isValid: false,
|
|
45
|
+
error: "NSR ID cannot be empty",
|
|
46
|
+
};
|
|
68
47
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
throw new Error(validation.error);
|
|
75
|
-
}
|
|
76
|
-
const request = name
|
|
77
|
-
? { id: nsrId, name, ...(transportMode ? { transportMode } : {}) }
|
|
78
|
-
: nsrId;
|
|
79
|
-
const pdfOptions = buildPdfOptions(outputDirectory, options);
|
|
80
|
-
const pdfResult = await (0, pdfGenerator_1.generatePdfsForStopPlaces)([request], pdfOptions);
|
|
81
|
-
const success = pdfResult.totalGenerated > 0 || pdfResult.skipped.length > 0;
|
|
82
|
-
const summary = success
|
|
83
|
-
? `Successfully generated PDF for ${nsrId} in ${pdfResult.outputDirectory}`
|
|
84
|
-
: `Failed to generate PDF for ${nsrId}`;
|
|
85
|
-
return {
|
|
86
|
-
pdfResult,
|
|
87
|
-
success,
|
|
88
|
-
summary,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
if (error instanceof Error) {
|
|
93
|
-
throw error;
|
|
94
|
-
}
|
|
95
|
-
throw new Error("An unexpected error occurred during PDF generation");
|
|
96
|
-
}
|
|
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
|
+
};
|
|
97
53
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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);
|
|
102
64
|
if (!validation.isValid) {
|
|
103
65
|
throw new Error(`Invalid NSR ID "${nsrId}": ${validation.error}`);
|
|
104
66
|
}
|
|
105
67
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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;
|
|
114
82
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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);
|
|
120
92
|
}
|
|
121
|
-
|
|
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
|
+
};
|
|
122
107
|
}
|
|
123
|
-
|
|
124
|
-
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error) {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
throw new Error("An unexpected error occurred during PDF generation");
|
|
125
113
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
+
}
|
|
129
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);
|
|
130
131
|
}
|
|
131
|
-
exports.NsrBarcodeApi =
|
|
132
|
-
|
|
132
|
+
exports.NsrBarcodeApi = {
|
|
133
|
+
processFile,
|
|
134
|
+
generateSinglePdf,
|
|
135
|
+
generateMultiplePdfs,
|
|
136
|
+
validateNsrId,
|
|
137
|
+
parseIds,
|
|
138
|
+
parseIdsFromFile,
|
|
139
|
+
};
|
|
140
|
+
exports.default = exports.NsrBarcodeApi;
|
|
133
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.d.ts
CHANGED
|
@@ -1 +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"}
|
|
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;AAOD,wBAAgB,gBAAgB,CAC9B,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,GAAG,QAAQ,EAAE,MAAM,EAAE,GACpB,MAAM,CAIR"}
|
package/dist/utils/assets.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getAssetPath = getAssetPath;
|
|
4
|
-
|
|
4
|
+
exports.resolveAssetPath = resolveAssetPath;
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
5
6
|
function getPackageRoot() {
|
|
6
|
-
return (0,
|
|
7
|
+
return (0, node_path_1.join)(__dirname, "..", "..");
|
|
7
8
|
}
|
|
8
9
|
function getAssetPath(...segments) {
|
|
9
|
-
return (0,
|
|
10
|
+
return (0, node_path_1.join)(getPackageRoot(), "assets", ...segments);
|
|
11
|
+
}
|
|
12
|
+
function resolveAssetPath(assetsDirectory, ...segments) {
|
|
13
|
+
return assetsDirectory
|
|
14
|
+
? (0, node_path_1.join)(assetsDirectory, ...segments)
|
|
15
|
+
: getAssetPath(...segments);
|
|
10
16
|
}
|
|
11
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":"
|
|
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"}
|