hk-bus-eta 2.0.0 → 2.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.
- package/dist/ctb.d.ts +9 -0
- package/dist/ctb.js +24 -0
- package/dist/ctb.js.map +1 -0
- package/dist/gmb.d.ts +9 -0
- package/dist/gmb.js +24 -0
- package/dist/gmb.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/kmb.d.ts +10 -0
- package/dist/kmb.js +23 -0
- package/dist/kmb.js.map +1 -0
- package/dist/lightRail.d.ts +8 -0
- package/dist/lightRail.js +45 -0
- package/dist/lightRail.js.map +1 -0
- package/dist/lrtfeeder.d.ts +8 -0
- package/dist/lrtfeeder.js +34 -0
- package/dist/lrtfeeder.js.map +1 -0
- package/dist/mtr.d.ts +8 -0
- package/dist/mtr.js +24 -0
- package/dist/mtr.js.map +1 -0
- package/dist/nlb.d.ts +7 -0
- package/dist/nlb.js +30 -0
- package/dist/nlb.js.map +1 -0
- package/dist/type.d.ts +60 -0
- package/dist/type.js +3 -0
- package/dist/type.js.map +1 -0
- package/dist/utils.d.ts +1 -0
- package/dist/utils.js +16 -0
- package/dist/utils.js.map +1 -0
- package/esm/ctb.d.ts +9 -0
- package/esm/ctb.js +21 -0
- package/esm/ctb.js.map +1 -0
- package/esm/gmb.d.ts +9 -0
- package/esm/gmb.js +21 -0
- package/esm/gmb.js.map +1 -0
- package/esm/index.d.ts +9 -0
- package/esm/index.js +58 -0
- package/esm/index.js.map +1 -0
- package/esm/kmb.d.ts +10 -0
- package/esm/kmb.js +20 -0
- package/esm/kmb.js.map +1 -0
- package/esm/lightRail.d.ts +8 -0
- package/esm/lightRail.js +42 -0
- package/esm/lightRail.js.map +1 -0
- package/esm/lrtfeeder.d.ts +8 -0
- package/esm/lrtfeeder.js +31 -0
- package/esm/lrtfeeder.js.map +1 -0
- package/esm/mtr.d.ts +8 -0
- package/esm/mtr.js +21 -0
- package/esm/mtr.js.map +1 -0
- package/esm/nlb.d.ts +7 -0
- package/esm/nlb.js +27 -0
- package/esm/nlb.js.map +1 -0
- package/esm/type.d.ts +60 -0
- package/esm/type.js +2 -0
- package/esm/type.js.map +1 -0
- package/esm/utils.d.ts +1 -0
- package/esm/utils.js +13 -0
- package/esm/utils.js.map +1 -0
- package/package.json +30 -7
- package/src/ctb.ts +35 -0
- package/src/gmb.ts +34 -0
- package/src/index.ts +60 -0
- package/src/kmb.ts +35 -0
- package/{LightRail.js → src/lightRail.ts} +16 -11
- package/{Lrtfeeder.js → src/lrtfeeder.ts} +15 -10
- package/{Mtr.js → src/mtr.ts} +14 -9
- package/src/nlb.ts +37 -0
- package/{index.d.ts → src/type.ts} +1 -7
- package/src/utils.ts +15 -0
- package/.github/FUNDING.yml +0 -13
- package/Ctb.js +0 -48
- package/Gmb.js +0 -27
- package/Kmb.js +0 -49
- package/Nlb.js +0 -53
- package/index.js +0 -49
- package/utils.js +0 -17
package/dist/ctb.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
bound: RouteListEntry['bound']['ctb'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
seq: number;
|
|
7
|
+
}
|
|
8
|
+
export default function fetchEtas({ stopId, route, bound, seq }: fetchEtasProps): Promise<Eta[]>;
|
|
9
|
+
export {};
|
package/dist/ctb.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, route, bound, seq }) {
|
|
5
|
+
return (fetch(`https://rt.data.gov.hk//v2/transport/citybus/eta/CTB/${stopId}/${route}`, {
|
|
6
|
+
cache: utils_1.isSafari ? 'default' : 'no-store'
|
|
7
|
+
}).then(response => response.json()).then(({ data }) => (data
|
|
8
|
+
.filter((eta) => eta.eta && bound.includes(eta.dir))
|
|
9
|
+
// filter the eta by the stop sequence information
|
|
10
|
+
// as the route data may not 100% match
|
|
11
|
+
// use the nearest seq
|
|
12
|
+
.sort((a, b) => Math.abs(a.seq - seq) < Math.abs(b.seq - seq) ? -1 : 1)
|
|
13
|
+
.filter((eta, _, self) => eta.seq === self[0].seq)
|
|
14
|
+
.map((e) => ({
|
|
15
|
+
eta: e.eta,
|
|
16
|
+
remark: {
|
|
17
|
+
zh: e.rmk_tc,
|
|
18
|
+
en: e.rmk_en
|
|
19
|
+
},
|
|
20
|
+
co: 'ctb'
|
|
21
|
+
})))));
|
|
22
|
+
}
|
|
23
|
+
exports.default = fetchEtas;
|
|
24
|
+
//# sourceMappingURL=ctb.js.map
|
package/dist/ctb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctb.js","sourceRoot":"","sources":["../src/ctb.ts"],"names":[],"mappings":";;AAAA,mCAAmC;AAUnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAkB;IAC7E,OAAO,CACL,KAAK,CAAC,wDAAwD,MAAM,IAAI,KAAK,EAAE,EAAE;QAC/E,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CACL,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAC5B,CAAC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACjB,IAAI;SACD,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,mDAAmD;QACnD,uCAAuC;QACvC,sBAAsB;SACrB,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE;SACjF,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,EAAE,IAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SAC1E,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE;YACN,EAAE,EAAE,CAAC,CAAC,MAAM;YACZ,EAAE,EAAE,CAAC,CAAC,MAAM;SACb;QACD,EAAE,EAAE,KAAK;KACV,CAAC,CAAC,CACN,CAAC,CACH,CAAC;AACJ,CAAC;AAxBD,4BAwBC"}
|
package/dist/gmb.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
gtfsId: RouteListEntry['gtfsId'];
|
|
4
|
+
bound: RouteListEntry['bound']['gmb'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
seq: number;
|
|
7
|
+
}
|
|
8
|
+
export default function fetchEtas({ gtfsId, stopId, bound, seq }: fetchEtasProps): Promise<Eta[]>;
|
|
9
|
+
export {};
|
package/dist/gmb.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ gtfsId, stopId, bound, seq }) {
|
|
5
|
+
return (fetch(`https://data.etagmb.gov.hk/eta/route-stop/${gtfsId}/${stopId}`, {
|
|
6
|
+
cache: utils_1.isSafari ? 'default' : 'no-store'
|
|
7
|
+
}).then(response => response.json())
|
|
8
|
+
.then(({ data }) => (data
|
|
9
|
+
.filter(({ route_seq }) => (bound === 'O' && route_seq === 1) || (bound === 'I' && route_seq === 2))
|
|
10
|
+
.filter(({ stop_seq }) => stop_seq === seq + 1)
|
|
11
|
+
.reduce((acc, { eta }) => [
|
|
12
|
+
...acc,
|
|
13
|
+
...eta.map((data) => ({
|
|
14
|
+
eta: data.timestamp,
|
|
15
|
+
remark: {
|
|
16
|
+
zh: data.remarks_tc,
|
|
17
|
+
en: data.remarks_en
|
|
18
|
+
},
|
|
19
|
+
co: 'gmb'
|
|
20
|
+
}))
|
|
21
|
+
], []))));
|
|
22
|
+
}
|
|
23
|
+
exports.default = fetchEtas;
|
|
24
|
+
//# sourceMappingURL=gmb.js.map
|
package/dist/gmb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmb.js","sourceRoot":"","sources":["../src/gmb.ts"],"names":[],"mappings":";;AACA,mCAAmC;AASnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAiB;IAC7E,OAAO,CACL,KAAK,CAAC,6CAA6C,MAAM,IAAI,MAAM,EAAE,EAAE;QACrE,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACrC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CAChB,IAAI;SACD,MAAM,CAAC,CAAC,EAAC,SAAS,EAAM,EAAE,EAAE,CAAC,CAAE,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,CAAC,CAAE,IAAI,CAAE,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,CAAC,CAAE,CAAE;SAC3G,MAAM,CAAC,CAAC,EAAC,QAAQ,EAAM,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,GAAG,CAAC,CAAC;SACjD,MAAM,CAAE,CAAC,GAAU,EAAE,EAAC,GAAG,EAAM,EAAE,EAAE,CAAC;QACnC,GAAG,GAAG;QACN,GAAG,GAAG,CAAC,GAAG,CAAE,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,EAAE,IAAI,CAAC,SAAS;YACnB,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI,CAAC,UAAU;gBACnB,EAAE,EAAE,IAAI,CAAC,UAAU;aACpB;YACD,EAAE,EAAE,KAAK;SACV,CAAC,CAAC;KACJ,EAAE,EAAE,CAAE,CACV,CAAC,CACH,CAAC;AACJ,CAAC;AAtBD,4BAsBC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RouteListEntry, EtaDb, Eta } from './type';
|
|
2
|
+
interface fetchEtasProps extends RouteListEntry {
|
|
3
|
+
language: "zh" | "en";
|
|
4
|
+
seq: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function fetchEtas({ route, stops, bound, dest, seq, serviceType, co, nlbId, gtfsId, language }: fetchEtasProps): Promise<Eta[]>;
|
|
7
|
+
export declare function fetchEtaDb(): Promise<EtaDb>;
|
|
8
|
+
export declare function fetchEtaDbMd5(): Promise<string>;
|
|
9
|
+
export type * from "./type";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.fetchEtaDbMd5 = exports.fetchEtaDb = exports.fetchEtas = void 0;
|
|
16
|
+
const kmb_1 = __importDefault(require("./kmb"));
|
|
17
|
+
const ctb_1 = __importDefault(require("./ctb"));
|
|
18
|
+
const nlb_1 = __importDefault(require("./nlb"));
|
|
19
|
+
const lrtfeeder_1 = __importDefault(require("./lrtfeeder"));
|
|
20
|
+
const gmb_1 = __importDefault(require("./gmb"));
|
|
21
|
+
const lightRail_1 = __importDefault(require("./lightRail"));
|
|
22
|
+
const mtr_1 = __importDefault(require("./mtr"));
|
|
23
|
+
function fetchEtas({ route, stops, bound, dest, seq, serviceType, co, nlbId, gtfsId, language }) {
|
|
24
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
+
try {
|
|
26
|
+
let _etas = [];
|
|
27
|
+
for (const company_id of co) {
|
|
28
|
+
if (company_id === 'kmb' && stops.kmb) {
|
|
29
|
+
_etas = _etas.concat(yield (0, kmb_1.default)({
|
|
30
|
+
route,
|
|
31
|
+
stopId: stops.kmb[seq],
|
|
32
|
+
seq,
|
|
33
|
+
serviceType, bound: bound[company_id]
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
else if (company_id === 'ctb' && stops.ctb) {
|
|
37
|
+
_etas = _etas.concat(yield (0, ctb_1.default)({ stopId: stops.ctb[seq], route, bound: bound[company_id], seq }));
|
|
38
|
+
}
|
|
39
|
+
else if (company_id === 'nlb' && stops.nlb) {
|
|
40
|
+
_etas = _etas.concat(yield (0, nlb_1.default)({ stopId: stops.nlb[seq], nlbId }));
|
|
41
|
+
}
|
|
42
|
+
else if (company_id === 'lrtfeeder' && stops.lrtfeeder) {
|
|
43
|
+
_etas = _etas.concat(yield (0, lrtfeeder_1.default)({ stopId: stops.lrtfeeder[seq], route, language }));
|
|
44
|
+
}
|
|
45
|
+
else if (company_id === 'gmb' && stops.gmb) {
|
|
46
|
+
_etas = _etas.concat(yield (0, gmb_1.default)({ stopId: stops.gmb[seq], gtfsId, seq, bound: bound[company_id] }));
|
|
47
|
+
}
|
|
48
|
+
else if (company_id === 'lightRail' && stops.lightRail) {
|
|
49
|
+
_etas = _etas.concat(yield (0, lightRail_1.default)({ stopId: stops.lightRail[seq], route, dest }));
|
|
50
|
+
}
|
|
51
|
+
else if (company_id === 'mtr' && stops.mtr) {
|
|
52
|
+
_etas = _etas.concat(yield (0, mtr_1.default)({ stopId: stops.mtr[seq], route, bound: bound.mtr }));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return _etas.sort((a, b) => {
|
|
56
|
+
if (a.eta === '')
|
|
57
|
+
return 1;
|
|
58
|
+
else if (b.eta === '')
|
|
59
|
+
return -1;
|
|
60
|
+
return a.eta < b.eta ? -1 : 1;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.error(err);
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
exports.fetchEtas = fetchEtas;
|
|
70
|
+
function fetchEtaDb() {
|
|
71
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
+
return fetch("https://hkbus.github.io/hk-bus-crawling/routeFareList.min.json").then(r => r.json());
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
exports.fetchEtaDb = fetchEtaDb;
|
|
76
|
+
function fetchEtaDbMd5() {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
return fetch('https://hkbus.github.io/hk-bus-crawling/routeFareList.md5').then(r => r.text());
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
exports.fetchEtaDbMd5 = fetchEtaDbMd5;
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/kmb.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
serviceType: RouteListEntry['serviceType'];
|
|
5
|
+
bound: RouteListEntry['bound']['kmb'];
|
|
6
|
+
stopId: string;
|
|
7
|
+
seq: number;
|
|
8
|
+
}
|
|
9
|
+
export default function fetchEtas({ stopId, route, seq, serviceType, bound }: fetchEtasProps): Promise<Eta[]>;
|
|
10
|
+
export {};
|
package/dist/kmb.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, route, seq, serviceType, bound }) {
|
|
5
|
+
return (fetch(`https://data.etabus.gov.hk/v1/transport/kmb/eta/${stopId}/${route}/${serviceType}`, {
|
|
6
|
+
cache: utils_1.isSafari ? 'default' : 'no-store'
|
|
7
|
+
})
|
|
8
|
+
.then(response => response.json())
|
|
9
|
+
.then(({ data }) => (data.filter((e) => e.eta !== null
|
|
10
|
+
&& e.dir === bound)
|
|
11
|
+
.sort((a, b) => Math.abs(a.seq - seq) < Math.abs(b.seq - seq) ? -1 : 1)
|
|
12
|
+
.filter((eta, _, self) => eta.seq === self[0].seq)
|
|
13
|
+
.map((e) => ({
|
|
14
|
+
eta: e.eta,
|
|
15
|
+
remark: {
|
|
16
|
+
zh: e.rmk_tc,
|
|
17
|
+
en: e.rmk_en
|
|
18
|
+
},
|
|
19
|
+
co: 'kmb'
|
|
20
|
+
})))));
|
|
21
|
+
}
|
|
22
|
+
exports.default = fetchEtas;
|
|
23
|
+
//# sourceMappingURL=kmb.js.map
|
package/dist/kmb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kmb.js","sourceRoot":"","sources":["../src/kmb.ts"],"names":[],"mappings":";;AACA,mCAAmC;AAUnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAiB;IACzF,OAAO,CACL,KAAK,CAAC,mDAAmD,MAAM,IAAI,KAAK,IAAI,WAAW,EAAE,EAAC;QACxF,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC;SACD,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACnC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CAChB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CACrB,CAAC,CAAC,GAAG,KAAK,IAAI;WACX,CAAC,CAAC,GAAG,KAAK,KAAK,CACnB;SACA,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE;SACjF,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,EAAE,IAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SACrE,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE;YACN,EAAE,EAAE,CAAC,CAAC,MAAM;YACZ,EAAE,EAAE,CAAC,CAAC,MAAM;SACb;QACD,EAAE,EAAE,KAAK;KACV,CAAC,CAAC,CACJ,CAAC,CACH,CAAC;AACJ,CAAC;AAvBD,4BAuBC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
dest: RouteListEntry['dest'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
}
|
|
7
|
+
export default function fetchEtas({ stopId, route, dest }: fetchEtasProps): Promise<Eta[]>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, route, dest }) {
|
|
5
|
+
return (fetch(`https://rt.data.gov.hk/v1/transport/mtr/lrt/getSchedule?station_id=${stopId.slice(2)}`, {
|
|
6
|
+
cache: utils_1.isSafari ? 'default' : 'no-store',
|
|
7
|
+
}).then(response => response.json())
|
|
8
|
+
.then(({ platform_list }) => (platform_list
|
|
9
|
+
.reduce((acc, { route_list, platform_id }) => [
|
|
10
|
+
...acc,
|
|
11
|
+
...route_list
|
|
12
|
+
.filter(({ route_no, dest_ch, dest_en, stop }) => (route === route_no
|
|
13
|
+
&& (dest_ch === dest.zh || dest_en.includes('Circular'))
|
|
14
|
+
&& stop === 0))
|
|
15
|
+
.map(({ time_en }) => {
|
|
16
|
+
let waitTime = 0;
|
|
17
|
+
switch (time_en.toLowerCase()) {
|
|
18
|
+
case 'arriving':
|
|
19
|
+
case 'departing':
|
|
20
|
+
case '-':
|
|
21
|
+
waitTime = 0;
|
|
22
|
+
break;
|
|
23
|
+
default:
|
|
24
|
+
waitTime = parseInt(time_en, 10);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
const etaDate = new Date(Date.now() + waitTime * 60 * 1000 + 8 * 3600000);
|
|
28
|
+
return {
|
|
29
|
+
eta: `${etaDate.getUTCFullYear()}-${`0${etaDate.getUTCMonth() + 1}`.slice(-2)}-${`0${etaDate.getUTCDate()}`.slice(-2)}`
|
|
30
|
+
+ `T${`0${etaDate.getUTCHours()}`.slice(-2)}:${`0${etaDate.getMinutes()}`.slice(-2)}:${`0${etaDate.getSeconds()}`.slice(-2)}+08:00`,
|
|
31
|
+
remark: {
|
|
32
|
+
zh: `${platform_id}號月台`,
|
|
33
|
+
en: `Platform ${platform_id}`
|
|
34
|
+
},
|
|
35
|
+
co: 'lightRail'
|
|
36
|
+
};
|
|
37
|
+
}, [])
|
|
38
|
+
], [])))
|
|
39
|
+
.catch(e => {
|
|
40
|
+
console.error(e);
|
|
41
|
+
return [];
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
exports.default = fetchEtas;
|
|
45
|
+
//# sourceMappingURL=lightRail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightRail.js","sourceRoot":"","sources":["../src/lightRail.ts"],"names":[],"mappings":";;AACA,mCAAmC;AAQnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAkB;IACvE,OAAO,CACL,KAAK,CAAC,sEAAsE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7F,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KAEzC,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACrC,IAAI,CAAC,CAAC,EAAC,aAAa,EAAC,EAAE,EAAE,CAAC,CACzB,aAAa;SACV,MAAM,CAAC,CAAC,GAAU,EAAE,EAAC,UAAU,EAAE,WAAW,EAAM,EAAE,EAAE,CAAC;QACtD,GAAG,GAAG;QACN,GAAG,UAAU;aACV,MAAM,CAAC,CAAC,EAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAM,EAAE,EAAE,CAAC,CACnD,KAAK,KAAK,QAAQ;eACf,CAAE,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAE;eACvD,IAAI,KAAK,CAAC,CACd,CAAC;aACD,GAAG,CAAE,CAAC,EAAC,OAAO,EAAM,EAAE,EAAE;YACvB,IAAI,QAAQ,GAAG,CAAC,CAAA;YAChB,QAAS,OAAO,CAAC,WAAW,EAAE,EAAG;gBAC/B,KAAK,UAAU,CAAC;gBAChB,KAAK,WAAW,CAAC;gBACjB,KAAK,GAAG;oBACN,QAAQ,GAAG,CAAC,CAAC;oBACb,MAAM;gBACR;oBACE,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;oBAChC,MAAM;aACT;YACD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAC1E,OAAO;gBACL,GAAG,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;sBACpH,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;gBACpI,MAAM,EAAE;oBACN,EAAE,EAAE,GAAG,WAAW,KAAK;oBACvB,EAAE,EAAE,YAAY,WAAW,EAAE;iBAC9B;gBACD,EAAE,EAAE,WAAW;aAChB,CAAA;QACH,CAAC,EAAE,EAAE,CAAC;KACT,EAAE,EAAE,CAAC,CACT,CAAC;SACD,KAAK,CAAC,CAAC,CAAC,EAAE;QACT,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AA9CD,4BA8CC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
language: "zh" | "en";
|
|
5
|
+
stopId: string;
|
|
6
|
+
}
|
|
7
|
+
export default function fetchEtas({ stopId, route, language }: fetchEtasProps): Promise<Eta[]>;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, route, language }) {
|
|
5
|
+
return (fetch(`https://rt.data.gov.hk/v1/transport/mtr/bus/getSchedule`, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
cache: utils_1.isSafari ? 'default' : 'no-store',
|
|
8
|
+
headers: {
|
|
9
|
+
'Content-Type': 'application/json'
|
|
10
|
+
},
|
|
11
|
+
body: JSON.stringify({
|
|
12
|
+
'language': language,
|
|
13
|
+
'routeName': route
|
|
14
|
+
})
|
|
15
|
+
}).then(response => response.json())
|
|
16
|
+
.then(({ busStop }) => busStop.filter(({ busStopId }) => busStopId === stopId)
|
|
17
|
+
.reduce((ret, { bus: buses }) => ([...ret, ...buses.reduce((etas, bus) => {
|
|
18
|
+
// hackily use +8 hours and use UTC hour to resolve timezone issue
|
|
19
|
+
const etaDate = new Date(Date.now() + parseInt(bus.arrivalTimeInSecond === "108000" ? bus.departureTimeInSecond : bus.arrivalTimeInSecond, 10) * 1000 + 8 * 3600000);
|
|
20
|
+
return [
|
|
21
|
+
...etas,
|
|
22
|
+
{
|
|
23
|
+
eta: `${etaDate.getUTCFullYear()}-${`0${etaDate.getUTCMonth() + 1}`.slice(-2)}-${`0${etaDate.getUTCDate()}`.slice(-2)}`
|
|
24
|
+
+ `T${`0${etaDate.getUTCHours()}`.slice(-2)}:${`0${etaDate.getMinutes()}`.slice(-2)}:${`0${etaDate.getSeconds()}`.slice(-2)}+08:00`,
|
|
25
|
+
remark: {
|
|
26
|
+
[language]: bus.busRemark || (bus.isScheduled === "1" ? (language === "en" ? "Scheduled" : "預定班次") : "")
|
|
27
|
+
},
|
|
28
|
+
co: 'lrtfeeder'
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
}, [])]), [])));
|
|
32
|
+
}
|
|
33
|
+
exports.default = fetchEtas;
|
|
34
|
+
//# sourceMappingURL=lrtfeeder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lrtfeeder.js","sourceRoot":"","sources":["../src/lrtfeeder.ts"],"names":[],"mappings":";;AACA,mCAAmC;AAQnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAiB;IAC1E,OAAO,CACL,KAAK,CAAC,yDAAyD,EAAE;QAC/D,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;QACxC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,KAAK;SACnB,CAAC;KACH,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACrC,IAAI,CAAC,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAClB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAC,SAAS,EAAM,EAAE,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC;SACzD,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAC,GAAG,EAAE,KAAK,EAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC,IAAW,EAAE,GAAQ,EAAE,EAAE;YAC5F,kEAAkE;YAClE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YAErK,OAAO;gBACL,GAAG,IAAI;gBACP;oBACE,GAAG,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;0BAClH,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ;oBACtI,MAAM,EAAE;wBACN,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,SAAS,IAAI,CAAE,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAE,CAAC,CAAC,CAAC,EAAE,CAAE;qBAC7G;oBACD,EAAE,EAAE,WAAW;iBAChB;aACF,CAAA;QACH,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACd,CACF,CAAC;AACJ,CAAC;AAjCD,4BAiCC"}
|
package/dist/mtr.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
bound: RouteListEntry['bound']['mtr'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
}
|
|
7
|
+
export default function fetchEtas({ stopId, route, bound }: fetchEtasProps): Promise<Eta[]>;
|
|
8
|
+
export {};
|
package/dist/mtr.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, route, bound }) {
|
|
5
|
+
return (fetch(`https://rt.data.gov.hk/v1/transport/mtr/getSchedule.php?line=${route}&sta=${stopId}`, {
|
|
6
|
+
cache: utils_1.isSafari ? 'default' : 'no-store',
|
|
7
|
+
}).then(response => response.json())
|
|
8
|
+
.then(({ data, status }) => (status === 0
|
|
9
|
+
? []
|
|
10
|
+
: data[`${route}-${stopId}`][bound.slice(-2, 1) === 'U' ? 'UP' : 'DOWN']
|
|
11
|
+
.reduce((acc, { time, plat }) => [
|
|
12
|
+
...acc,
|
|
13
|
+
{
|
|
14
|
+
eta: time.replace(' ', 'T') + '+08:00',
|
|
15
|
+
remark: {
|
|
16
|
+
zh: `${plat}號月台`,
|
|
17
|
+
en: `Platform ${plat}`
|
|
18
|
+
},
|
|
19
|
+
co: 'mtr'
|
|
20
|
+
}
|
|
21
|
+
], []))));
|
|
22
|
+
}
|
|
23
|
+
exports.default = fetchEtas;
|
|
24
|
+
//# sourceMappingURL=mtr.js.map
|
package/dist/mtr.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mtr.js","sourceRoot":"","sources":["../src/mtr.ts"],"names":[],"mappings":";;AACA,mCAAmC;AAQnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAkB;IACxE,OAAO,CACL,KAAK,CAAC,gEAAgE,KAAK,QAAQ,MAAM,EAAE,EAAE;QAC3F,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACrC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAE,MAAM,EAAC,EAAE,EAAE,CAAC,CACxB,MAAM,KAAK,CAAC;QACV,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;aAClE,MAAM,CAAC,CAAC,GAAU,EAAE,EAAC,IAAI,EAAE,IAAI,EAAM,EAAE,EAAE,CAAC;YACzC,GAAG,GAAG;YACN;gBACE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAC,QAAQ;gBACpC,MAAM,EAAE;oBACN,EAAE,EAAE,GAAG,IAAI,KAAK;oBAChB,EAAE,EAAE,YAAY,IAAI,EAAE;iBACvB;gBACD,EAAE,EAAE,KAAK;aACV;SACF,EAAE,EAAE,CAAC,CACb,CAAC,CACH,CAAC;AACJ,CAAC;AAtBD,4BAsBC"}
|
package/dist/nlb.d.ts
ADDED
package/dist/nlb.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const utils_1 = require("./utils");
|
|
4
|
+
function fetchEtas({ stopId, nlbId }) {
|
|
5
|
+
return (fetch(`https://rt.data.gov.hk/v1/transport/nlb/stop.php?action=estimatedArrivals`, {
|
|
6
|
+
body: JSON.stringify({
|
|
7
|
+
routeId: nlbId,
|
|
8
|
+
stopId,
|
|
9
|
+
language: 'zh'
|
|
10
|
+
}),
|
|
11
|
+
headers: {
|
|
12
|
+
"Content-Type": "text/plain"
|
|
13
|
+
},
|
|
14
|
+
method: "POST",
|
|
15
|
+
cache: utils_1.isSafari ? 'default' : 'no-store'
|
|
16
|
+
}).then(response => response.json()).then(({ estimatedArrivals }) => {
|
|
17
|
+
if (!estimatedArrivals)
|
|
18
|
+
return [];
|
|
19
|
+
return estimatedArrivals.filter((eta) => eta.estimatedArrivalTime).map((e) => ({
|
|
20
|
+
eta: e.estimatedArrivalTime.replace(' ', 'T') + '.000+08:00',
|
|
21
|
+
remark: {
|
|
22
|
+
zh: '',
|
|
23
|
+
en: ''
|
|
24
|
+
},
|
|
25
|
+
co: 'nlb'
|
|
26
|
+
}));
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
exports.default = fetchEtas;
|
|
30
|
+
//# sourceMappingURL=nlb.js.map
|
package/dist/nlb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nlb.js","sourceRoot":"","sources":["../src/nlb.ts"],"names":[],"mappings":";;AACA,mCAAmC;AAOnC,SAAwB,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAkB;IACjE,OAAO,CACL,KAAK,CAAC,2EAA2E,EAAE;QACjF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,MAAM;YACN,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,OAAO,EAAE;YACP,cAAc,EAAE,YAAY;SAC7B;QACD,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,gBAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CACL,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAC5B,CAAC,IAAI,CAAC,CAAC,EAAC,iBAAiB,EAAC,EAAE,EAAE;QAC7B,IAAK,CAAC,iBAAiB;YAAG,OAAO,EAAE,CAAA;QAEnC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;YACvF,GAAG,EAAE,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY;YAC5D,MAAM,EAAE;gBACN,EAAE,EAAE,EAAE;gBACN,EAAE,EAAE,EAAE;aACP;YACD,EAAE,EAAE,KAAK;SACV,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AA5BD,4BA4BC"}
|
package/dist/type.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type Company = "kmb" | "nlb" | "ctb" | 'lrtfeeder' | 'gmb' | 'lightRail' | 'mtr';
|
|
2
|
+
export type Terminal = {
|
|
3
|
+
en: string;
|
|
4
|
+
zh: string;
|
|
5
|
+
};
|
|
6
|
+
export type FreqId = "31" | "287" | "415" | "63" | "319" | "447" | "416" | "480" | "266" | "271" | "272" | "288" | "320" | "448" | "511";
|
|
7
|
+
export type Freq = {
|
|
8
|
+
[key in FreqId]: {
|
|
9
|
+
[startTime: string]: [string, string] | null;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export type RouteListEntry = {
|
|
13
|
+
readonly route: string;
|
|
14
|
+
readonly co: Company[];
|
|
15
|
+
readonly orig: Terminal;
|
|
16
|
+
readonly dest: Terminal;
|
|
17
|
+
readonly fares: string[] | null;
|
|
18
|
+
readonly faresHoliday: string[] | null;
|
|
19
|
+
readonly freq: Freq | null;
|
|
20
|
+
readonly jt: string | null;
|
|
21
|
+
readonly seq: number;
|
|
22
|
+
readonly serviceType: string;
|
|
23
|
+
readonly stops: {
|
|
24
|
+
[co in Company]: string[];
|
|
25
|
+
};
|
|
26
|
+
readonly bound: {
|
|
27
|
+
[co in Company]: "O" | "I" | "OI" | "IO";
|
|
28
|
+
};
|
|
29
|
+
readonly gtfsId: string;
|
|
30
|
+
readonly nlbId: string;
|
|
31
|
+
};
|
|
32
|
+
export type Location = {
|
|
33
|
+
lat: number;
|
|
34
|
+
lng: number;
|
|
35
|
+
};
|
|
36
|
+
export type StopListEntry = {
|
|
37
|
+
readonly location: Location;
|
|
38
|
+
readonly name: {
|
|
39
|
+
en: string;
|
|
40
|
+
zh: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type StopTuple = [Company, string];
|
|
44
|
+
export type RouteList = Record<string, RouteListEntry>;
|
|
45
|
+
export type StopList = Record<string, StopListEntry>;
|
|
46
|
+
export type StopMap = Record<string, StopTuple[]>;
|
|
47
|
+
export type EtaDb = {
|
|
48
|
+
holidays: string[];
|
|
49
|
+
routeList: RouteList;
|
|
50
|
+
stopList: StopList;
|
|
51
|
+
stopMap: StopMap;
|
|
52
|
+
};
|
|
53
|
+
export type Eta = {
|
|
54
|
+
eta: string;
|
|
55
|
+
remark: {
|
|
56
|
+
zh: string;
|
|
57
|
+
en: string;
|
|
58
|
+
};
|
|
59
|
+
co: Company;
|
|
60
|
+
};
|
package/dist/type.js
ADDED
package/dist/type.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isSafari: boolean;
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSafari = void 0;
|
|
4
|
+
exports.isSafari = (() => {
|
|
5
|
+
try {
|
|
6
|
+
return Boolean(navigator &&
|
|
7
|
+
navigator.userAgent &&
|
|
8
|
+
navigator.userAgent.includes("Safari/") &&
|
|
9
|
+
!(navigator.userAgent.includes("Chrome/") ||
|
|
10
|
+
navigator.userAgent.includes("Chromium/")));
|
|
11
|
+
}
|
|
12
|
+
catch (_a) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
})();
|
|
16
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAa,QAAA,QAAQ,GAAG,CAAC,GAAG,EAAE;IAC5B,IAAI;QACF,OAAO,OAAO,CACZ,SAAS;YACP,SAAS,CAAC,SAAS;YACnB,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvC,CAAC,CACC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACvC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC1C,CACJ,CAAC;KACH;IAAC,WAAM;QACN,OAAO,KAAK,CAAC;KACd;AACH,CAAC,CAAC,EAAE,CAAC"}
|
package/esm/ctb.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
route: RouteListEntry['route'];
|
|
4
|
+
bound: RouteListEntry['bound']['ctb'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
seq: number;
|
|
7
|
+
}
|
|
8
|
+
export default function fetchEtas({ stopId, route, bound, seq }: fetchEtasProps): Promise<Eta[]>;
|
|
9
|
+
export {};
|
package/esm/ctb.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isSafari } from "./utils";
|
|
2
|
+
export default function fetchEtas({ stopId, route, bound, seq }) {
|
|
3
|
+
return (fetch(`https://rt.data.gov.hk//v2/transport/citybus/eta/CTB/${stopId}/${route}`, {
|
|
4
|
+
cache: isSafari ? 'default' : 'no-store'
|
|
5
|
+
}).then(response => response.json()).then(({ data }) => (data
|
|
6
|
+
.filter((eta) => eta.eta && bound.includes(eta.dir))
|
|
7
|
+
// filter the eta by the stop sequence information
|
|
8
|
+
// as the route data may not 100% match
|
|
9
|
+
// use the nearest seq
|
|
10
|
+
.sort((a, b) => Math.abs(a.seq - seq) < Math.abs(b.seq - seq) ? -1 : 1)
|
|
11
|
+
.filter((eta, _, self) => eta.seq === self[0].seq)
|
|
12
|
+
.map((e) => ({
|
|
13
|
+
eta: e.eta,
|
|
14
|
+
remark: {
|
|
15
|
+
zh: e.rmk_tc,
|
|
16
|
+
en: e.rmk_en
|
|
17
|
+
},
|
|
18
|
+
co: 'ctb'
|
|
19
|
+
})))));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ctb.js.map
|
package/esm/ctb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ctb.js","sourceRoot":"","sources":["../src/ctb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAUnC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAE,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAkB;IAC7E,OAAO,CACL,KAAK,CAAC,wDAAwD,MAAM,IAAI,KAAK,EAAE,EAAE;QAC/E,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CACL,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAC5B,CAAC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CACjB,IAAI;SACD,MAAM,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,mDAAmD;QACnD,uCAAuC;QACvC,sBAAsB;SACrB,IAAI,CAAC,CAAC,CAAM,EAAE,CAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE;SACjF,MAAM,CAAC,CAAC,GAAQ,EAAE,CAAS,EAAE,IAAgB,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;SAC1E,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAChB,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,MAAM,EAAE;YACN,EAAE,EAAE,CAAC,CAAC,MAAM;YACZ,EAAE,EAAE,CAAC,CAAC,MAAM;SACb;QACD,EAAE,EAAE,KAAK;KACV,CAAC,CAAC,CACN,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/esm/gmb.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Eta, RouteListEntry } from "./type";
|
|
2
|
+
interface fetchEtasProps {
|
|
3
|
+
gtfsId: RouteListEntry['gtfsId'];
|
|
4
|
+
bound: RouteListEntry['bound']['gmb'];
|
|
5
|
+
stopId: string;
|
|
6
|
+
seq: number;
|
|
7
|
+
}
|
|
8
|
+
export default function fetchEtas({ gtfsId, stopId, bound, seq }: fetchEtasProps): Promise<Eta[]>;
|
|
9
|
+
export {};
|
package/esm/gmb.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isSafari } from "./utils";
|
|
2
|
+
export default function fetchEtas({ gtfsId, stopId, bound, seq }) {
|
|
3
|
+
return (fetch(`https://data.etagmb.gov.hk/eta/route-stop/${gtfsId}/${stopId}`, {
|
|
4
|
+
cache: isSafari ? 'default' : 'no-store'
|
|
5
|
+
}).then(response => response.json())
|
|
6
|
+
.then(({ data }) => (data
|
|
7
|
+
.filter(({ route_seq }) => (bound === 'O' && route_seq === 1) || (bound === 'I' && route_seq === 2))
|
|
8
|
+
.filter(({ stop_seq }) => stop_seq === seq + 1)
|
|
9
|
+
.reduce((acc, { eta }) => [
|
|
10
|
+
...acc,
|
|
11
|
+
...eta.map((data) => ({
|
|
12
|
+
eta: data.timestamp,
|
|
13
|
+
remark: {
|
|
14
|
+
zh: data.remarks_tc,
|
|
15
|
+
en: data.remarks_en
|
|
16
|
+
},
|
|
17
|
+
co: 'gmb'
|
|
18
|
+
}))
|
|
19
|
+
], []))));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=gmb.js.map
|
package/esm/gmb.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmb.js","sourceRoot":"","sources":["../src/gmb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASnC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAE,EAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAiB;IAC7E,OAAO,CACL,KAAK,CAAC,6CAA6C,MAAM,IAAI,MAAM,EAAE,EAAE;QACrE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;KACzC,CAAC,CAAC,IAAI,CAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAE;SACrC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,CAChB,IAAI;SACD,MAAM,CAAC,CAAC,EAAC,SAAS,EAAM,EAAE,EAAE,CAAC,CAAE,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,CAAC,CAAE,IAAI,CAAE,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,CAAC,CAAE,CAAE;SAC3G,MAAM,CAAC,CAAC,EAAC,QAAQ,EAAM,EAAE,EAAE,CAAC,QAAQ,KAAK,GAAG,GAAG,CAAC,CAAC;SACjD,MAAM,CAAE,CAAC,GAAU,EAAE,EAAC,GAAG,EAAM,EAAE,EAAE,CAAC;QACnC,GAAG,GAAG;QACN,GAAG,GAAG,CAAC,GAAG,CAAE,CAAC,IAAS,EAAE,EAAE,CAAC,CAAC;YAC1B,GAAG,EAAE,IAAI,CAAC,SAAS;YACnB,MAAM,EAAE;gBACN,EAAE,EAAE,IAAI,CAAC,UAAU;gBACnB,EAAE,EAAE,IAAI,CAAC,UAAU;aACpB;YACD,EAAE,EAAE,KAAK;SACV,CAAC,CAAC;KACJ,EAAE,EAAE,CAAE,CACV,CAAC,CACH,CAAC;AACJ,CAAC"}
|
package/esm/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RouteListEntry, EtaDb, Eta } from './type';
|
|
2
|
+
interface fetchEtasProps extends RouteListEntry {
|
|
3
|
+
language: "zh" | "en";
|
|
4
|
+
seq: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function fetchEtas({ route, stops, bound, dest, seq, serviceType, co, nlbId, gtfsId, language }: fetchEtasProps): Promise<Eta[]>;
|
|
7
|
+
export declare function fetchEtaDb(): Promise<EtaDb>;
|
|
8
|
+
export declare function fetchEtaDbMd5(): Promise<string>;
|
|
9
|
+
export type * from "./type";
|