lt-public-transport-sdk 1.0.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/LICENSE +21 -0
- package/README.md +283 -0
- package/assets/architecture.png +0 -0
- package/dist/config.d.ts +221 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +200 -0
- package/dist/config.js.map +1 -0
- package/dist/enrichment/index.d.ts +6 -0
- package/dist/enrichment/index.d.ts.map +1 -0
- package/dist/enrichment/index.js +6 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/route-matcher.d.ts +64 -0
- package/dist/enrichment/route-matcher.d.ts.map +1 -0
- package/dist/enrichment/route-matcher.js +121 -0
- package/dist/enrichment/route-matcher.js.map +1 -0
- package/dist/errors.d.ts +70 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +104 -0
- package/dist/errors.js.map +1 -0
- package/dist/gtfs/index.d.ts +7 -0
- package/dist/gtfs/index.d.ts.map +1 -0
- package/dist/gtfs/index.js +7 -0
- package/dist/gtfs/index.js.map +1 -0
- package/dist/gtfs/parser.d.ts +39 -0
- package/dist/gtfs/parser.d.ts.map +1 -0
- package/dist/gtfs/parser.js +189 -0
- package/dist/gtfs/parser.js.map +1 -0
- package/dist/gtfs/sync.d.ts +72 -0
- package/dist/gtfs/sync.d.ts.map +1 -0
- package/dist/gtfs/sync.js +271 -0
- package/dist/gtfs/sync.js.map +1 -0
- package/dist/index.d.ts +203 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +342 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/gps-full.d.ts +39 -0
- package/dist/parsers/gps-full.d.ts.map +1 -0
- package/dist/parsers/gps-full.js +212 -0
- package/dist/parsers/gps-full.js.map +1 -0
- package/dist/parsers/gps-lite.d.ts +60 -0
- package/dist/parsers/gps-lite.d.ts.map +1 -0
- package/dist/parsers/gps-lite.js +141 -0
- package/dist/parsers/gps-lite.js.map +1 -0
- package/dist/parsers/index.d.ts +7 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +7 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/schemas.d.ts +129 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +200 -0
- package/dist/schemas.js.map +1 -0
- package/dist/scripts/test-city-specific.d.ts +2 -0
- package/dist/scripts/test-city-specific.d.ts.map +1 -0
- package/dist/scripts/test-city-specific.js +264 -0
- package/dist/scripts/test-city-specific.js.map +1 -0
- package/dist/scripts/test-config-options.d.ts +2 -0
- package/dist/scripts/test-config-options.d.ts.map +1 -0
- package/dist/scripts/test-config-options.js +166 -0
- package/dist/scripts/test-config-options.js.map +1 -0
- package/dist/scripts/test-data-quality.d.ts +2 -0
- package/dist/scripts/test-data-quality.d.ts.map +1 -0
- package/dist/scripts/test-data-quality.js +204 -0
- package/dist/scripts/test-data-quality.js.map +1 -0
- package/dist/scripts/test-error-handling.d.ts +2 -0
- package/dist/scripts/test-error-handling.d.ts.map +1 -0
- package/dist/scripts/test-error-handling.js +146 -0
- package/dist/scripts/test-error-handling.js.map +1 -0
- package/dist/scripts/test-live.d.ts +2 -0
- package/dist/scripts/test-live.d.ts.map +1 -0
- package/dist/scripts/test-live.js +121 -0
- package/dist/scripts/test-live.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/coordinates.d.ts +68 -0
- package/dist/utils/coordinates.d.ts.map +1 -0
- package/dist/utils/coordinates.js +98 -0
- package/dist/utils/coordinates.js.map +1 -0
- package/dist/utils/encoding.d.ts +47 -0
- package/dist/utils/encoding.d.ts.map +1 -0
- package/dist/utils/encoding.js +153 -0
- package/dist/utils/encoding.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/time.d.ts +50 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +94 -0
- package/dist/utils/time.js.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility module exports
|
|
3
|
+
* @module utils
|
|
4
|
+
*/
|
|
5
|
+
export { normalizeCoordinate, isValidLithuaniaCoord, normalizeAndValidateCoordinates, normalizeBearing, normalizeSpeed, LITHUANIA_BOUNDS, } from './coordinates.js';
|
|
6
|
+
export { repairMojibake, hasMojibake, decodeWindows1257, decodeBalticText, cleanTextField, } from './encoding.js';
|
|
7
|
+
export { secondsFromMidnightToDate, dateToSecondsFromMidnight, isDataStale, parseTimeSeconds, getCurrentSecondsFromMidnight, } from './time.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,+BAA+B,EAC/B,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility module exports
|
|
3
|
+
* @module utils
|
|
4
|
+
*/
|
|
5
|
+
export { normalizeCoordinate, isValidLithuaniaCoord, normalizeAndValidateCoordinates, normalizeBearing, normalizeSpeed, LITHUANIA_BOUNDS, } from './coordinates.js';
|
|
6
|
+
export { repairMojibake, hasMojibake, decodeWindows1257, decodeBalticText, cleanTextField, } from './encoding.js';
|
|
7
|
+
export { secondsFromMidnightToDate, dateToSecondsFromMidnight, isDataStale, parseTimeSeconds, getCurrentSecondsFromMidnight, } from './time.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,+BAA+B,EAC/B,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timestamp utilities for converting service day seconds
|
|
3
|
+
* @module utils/time
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert "seconds from midnight" to a Date object.
|
|
7
|
+
*
|
|
8
|
+
* GTFS and stops.lt use "service day" times where values > 86400 (24:00:00)
|
|
9
|
+
* represent times after midnight that belong to the previous service day.
|
|
10
|
+
*
|
|
11
|
+
* For example:
|
|
12
|
+
* - 90000 seconds = 25:00:00 = 01:00:00 the next calendar day
|
|
13
|
+
* - If it's Tuesday 02:00 and we see 90000, it means:
|
|
14
|
+
* - The service started Monday (previous day)
|
|
15
|
+
* - Monday 00:00 + 90000s = Tuesday 01:00
|
|
16
|
+
*
|
|
17
|
+
* @param seconds - Seconds from midnight (can exceed 86400)
|
|
18
|
+
* @returns Date object representing the measurement time
|
|
19
|
+
*/
|
|
20
|
+
export declare function secondsFromMidnightToDate(seconds: number): Date;
|
|
21
|
+
/**
|
|
22
|
+
* Convert a Date to "seconds from midnight" format.
|
|
23
|
+
* Used for testing and reverse calculations.
|
|
24
|
+
*
|
|
25
|
+
* @param date - Date to convert
|
|
26
|
+
* @returns Seconds from midnight
|
|
27
|
+
*/
|
|
28
|
+
export declare function dateToSecondsFromMidnight(date: Date): number;
|
|
29
|
+
/**
|
|
30
|
+
* Check if measurement data is stale (older than threshold).
|
|
31
|
+
*
|
|
32
|
+
* @param measuredAt - When the data was measured
|
|
33
|
+
* @param thresholdMs - Stale threshold in milliseconds (default: 5 minutes)
|
|
34
|
+
* @returns true if data is stale
|
|
35
|
+
*/
|
|
36
|
+
export declare function isDataStale(measuredAt: Date, thresholdMs?: number): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Parse a time value from GPS data.
|
|
39
|
+
* Returns null if parsing fails.
|
|
40
|
+
*
|
|
41
|
+
* @param value - Raw string value (seconds from midnight)
|
|
42
|
+
* @returns Parsed integer or null
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseTimeSeconds(value: string): number | null;
|
|
45
|
+
/**
|
|
46
|
+
* Get the current time as seconds from midnight.
|
|
47
|
+
* Useful for comparisons with GPS time fields.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getCurrentSecondsFromMidnight(): number;
|
|
50
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAc/D;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAM5D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,IAAI,EAChB,WAAW,GAAE,MAAmC,GAC/C,OAAO,CAUT;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAY7D;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,IAAI,MAAM,CAGtD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timestamp utilities for converting service day seconds
|
|
3
|
+
* @module utils/time
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Seconds in a day (24 hours).
|
|
7
|
+
*/
|
|
8
|
+
const SECONDS_PER_DAY = 86400;
|
|
9
|
+
/**
|
|
10
|
+
* Stale data threshold in milliseconds (5 minutes).
|
|
11
|
+
*/
|
|
12
|
+
const DEFAULT_STALE_THRESHOLD_MS = 5 * 60 * 1000;
|
|
13
|
+
/**
|
|
14
|
+
* Convert "seconds from midnight" to a Date object.
|
|
15
|
+
*
|
|
16
|
+
* GTFS and stops.lt use "service day" times where values > 86400 (24:00:00)
|
|
17
|
+
* represent times after midnight that belong to the previous service day.
|
|
18
|
+
*
|
|
19
|
+
* For example:
|
|
20
|
+
* - 90000 seconds = 25:00:00 = 01:00:00 the next calendar day
|
|
21
|
+
* - If it's Tuesday 02:00 and we see 90000, it means:
|
|
22
|
+
* - The service started Monday (previous day)
|
|
23
|
+
* - Monday 00:00 + 90000s = Tuesday 01:00
|
|
24
|
+
*
|
|
25
|
+
* @param seconds - Seconds from midnight (can exceed 86400)
|
|
26
|
+
* @returns Date object representing the measurement time
|
|
27
|
+
*/
|
|
28
|
+
export function secondsFromMidnightToDate(seconds) {
|
|
29
|
+
const now = new Date();
|
|
30
|
+
const baseMidnight = new Date(now);
|
|
31
|
+
baseMidnight.setHours(0, 0, 0, 0);
|
|
32
|
+
// If seconds >= 86400, this is a "night owl" trip from previous service day.
|
|
33
|
+
// The base should be yesterday's midnight.
|
|
34
|
+
// Yesterday 00:00 + 90000s = Today 01:00
|
|
35
|
+
if (seconds >= SECONDS_PER_DAY) {
|
|
36
|
+
baseMidnight.setDate(baseMidnight.getDate() - 1);
|
|
37
|
+
}
|
|
38
|
+
// Add full seconds (do NOT modulo - we need the overflow)
|
|
39
|
+
return new Date(baseMidnight.getTime() + seconds * 1000);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Convert a Date to "seconds from midnight" format.
|
|
43
|
+
* Used for testing and reverse calculations.
|
|
44
|
+
*
|
|
45
|
+
* @param date - Date to convert
|
|
46
|
+
* @returns Seconds from midnight
|
|
47
|
+
*/
|
|
48
|
+
export function dateToSecondsFromMidnight(date) {
|
|
49
|
+
return (date.getHours() * 3600 +
|
|
50
|
+
date.getMinutes() * 60 +
|
|
51
|
+
date.getSeconds());
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if measurement data is stale (older than threshold).
|
|
55
|
+
*
|
|
56
|
+
* @param measuredAt - When the data was measured
|
|
57
|
+
* @param thresholdMs - Stale threshold in milliseconds (default: 5 minutes)
|
|
58
|
+
* @returns true if data is stale
|
|
59
|
+
*/
|
|
60
|
+
export function isDataStale(measuredAt, thresholdMs = DEFAULT_STALE_THRESHOLD_MS) {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
const age = now - measuredAt.getTime();
|
|
63
|
+
// Negative age means measurement is in the future - likely a prediction, not stale
|
|
64
|
+
if (age < 0) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return age > thresholdMs;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse a time value from GPS data.
|
|
71
|
+
* Returns null if parsing fails.
|
|
72
|
+
*
|
|
73
|
+
* @param value - Raw string value (seconds from midnight)
|
|
74
|
+
* @returns Parsed integer or null
|
|
75
|
+
*/
|
|
76
|
+
export function parseTimeSeconds(value) {
|
|
77
|
+
if (!value || value.trim() === '') {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const parsed = parseInt(value, 10);
|
|
81
|
+
if (!Number.isFinite(parsed) || parsed < 0) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return parsed;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the current time as seconds from midnight.
|
|
88
|
+
* Useful for comparisons with GPS time fields.
|
|
89
|
+
*/
|
|
90
|
+
export function getCurrentSecondsFromMidnight() {
|
|
91
|
+
const now = new Date();
|
|
92
|
+
return dateToSecondsFromMidnight(now);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B;;GAEG;AACH,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAe;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAElC,6EAA6E;IAC7E,2CAA2C;IAC3C,yCAAyC;IACzC,IAAI,OAAO,IAAI,eAAe,EAAE,CAAC;QAC/B,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAU;IAClD,OAAO,CACL,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI;QACtB,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QACtB,IAAI,CAAC,UAAU,EAAE,CAClB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CACzB,UAAgB,EAChB,cAAsB,0BAA0B;IAEhD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;IAEvC,mFAAmF;IACnF,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,GAAG,GAAG,WAAW,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B;IAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,OAAO,yBAAyB,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lt-public-transport-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TypeScript SDK for real-time public transport data in Lithuanian cities. Provides vehicle GPS positions, GTFS routes, and stops from stops.lt.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "vitest run",
|
|
11
|
+
"test:watch": "vitest",
|
|
12
|
+
"test:integration": "npx tsx scripts/test-error-handling.ts && npx tsx scripts/test-config-options.ts && npx tsx scripts/test-data-quality.ts && npx tsx scripts/test-city-specific.ts",
|
|
13
|
+
"lint": "eslint src",
|
|
14
|
+
"prepublishOnly": "npm run build"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=18.0.0"
|
|
18
|
+
},
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./errors": {
|
|
25
|
+
"types": "./dist/errors.d.ts",
|
|
26
|
+
"import": "./dist/errors.js"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"author": {
|
|
30
|
+
"name": "Giedrius Macevičius",
|
|
31
|
+
"email": "gmacev@gmail.com",
|
|
32
|
+
"url": "https://github.com/gmacev/"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/gmacev/lt-public-transport-sdk.git"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/gmacev/lt-public-transport-sdk/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/gmacev/lt-public-transport-sdk#readme",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"keywords": [
|
|
44
|
+
"lithuania",
|
|
45
|
+
"public-transport",
|
|
46
|
+
"gtfs",
|
|
47
|
+
"real-time",
|
|
48
|
+
"gps",
|
|
49
|
+
"bus",
|
|
50
|
+
"trolleybus",
|
|
51
|
+
"vilnius",
|
|
52
|
+
"kaunas",
|
|
53
|
+
"klaipeda",
|
|
54
|
+
"stops-lt",
|
|
55
|
+
"transport-api",
|
|
56
|
+
"sdk"
|
|
57
|
+
],
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@eslint/js": "^9.39.2",
|
|
60
|
+
"@types/node": "^22.0.0",
|
|
61
|
+
"@types/yauzl-promise": "^4.0.1",
|
|
62
|
+
"@typescript-eslint/eslint-plugin": "^8.51.0",
|
|
63
|
+
"@typescript-eslint/parser": "^8.51.0",
|
|
64
|
+
"eslint": "^9.39.2",
|
|
65
|
+
"tsx": "^4.21.0",
|
|
66
|
+
"typescript": "^5.5.3",
|
|
67
|
+
"typescript-eslint": "^8.51.0",
|
|
68
|
+
"vitest": "^2.0.0"
|
|
69
|
+
},
|
|
70
|
+
"publishConfig": {
|
|
71
|
+
"access": "public"
|
|
72
|
+
},
|
|
73
|
+
"sideEffects": false,
|
|
74
|
+
"files": [
|
|
75
|
+
"dist",
|
|
76
|
+
"README.md",
|
|
77
|
+
"LICENSE",
|
|
78
|
+
"assets"
|
|
79
|
+
],
|
|
80
|
+
"dependencies": {
|
|
81
|
+
"yauzl-promise": "^4.0.0",
|
|
82
|
+
"zod": "^4.3.4"
|
|
83
|
+
}
|
|
84
|
+
}
|