hk-bus-eta 2.0.1 → 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.
Files changed (78) hide show
  1. package/dist/ctb.d.ts +9 -0
  2. package/dist/ctb.js +24 -0
  3. package/dist/ctb.js.map +1 -0
  4. package/dist/gmb.d.ts +9 -0
  5. package/dist/gmb.js +24 -0
  6. package/dist/gmb.js.map +1 -0
  7. package/dist/index.d.ts +9 -0
  8. package/dist/index.js +82 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/kmb.d.ts +10 -0
  11. package/dist/kmb.js +23 -0
  12. package/dist/kmb.js.map +1 -0
  13. package/dist/lightRail.d.ts +8 -0
  14. package/dist/lightRail.js +45 -0
  15. package/dist/lightRail.js.map +1 -0
  16. package/dist/lrtfeeder.d.ts +8 -0
  17. package/dist/lrtfeeder.js +34 -0
  18. package/dist/lrtfeeder.js.map +1 -0
  19. package/dist/mtr.d.ts +8 -0
  20. package/dist/mtr.js +24 -0
  21. package/dist/mtr.js.map +1 -0
  22. package/dist/nlb.d.ts +7 -0
  23. package/dist/nlb.js +30 -0
  24. package/dist/nlb.js.map +1 -0
  25. package/dist/type.d.ts +60 -0
  26. package/dist/type.js +3 -0
  27. package/dist/type.js.map +1 -0
  28. package/dist/utils.d.ts +1 -0
  29. package/dist/utils.js +16 -0
  30. package/dist/utils.js.map +1 -0
  31. package/esm/ctb.d.ts +9 -0
  32. package/esm/ctb.js +21 -0
  33. package/esm/ctb.js.map +1 -0
  34. package/esm/gmb.d.ts +9 -0
  35. package/esm/gmb.js +21 -0
  36. package/esm/gmb.js.map +1 -0
  37. package/esm/index.d.ts +9 -0
  38. package/esm/index.js +58 -0
  39. package/esm/index.js.map +1 -0
  40. package/esm/kmb.d.ts +10 -0
  41. package/esm/kmb.js +20 -0
  42. package/esm/kmb.js.map +1 -0
  43. package/esm/lightRail.d.ts +8 -0
  44. package/esm/lightRail.js +42 -0
  45. package/esm/lightRail.js.map +1 -0
  46. package/esm/lrtfeeder.d.ts +8 -0
  47. package/esm/lrtfeeder.js +31 -0
  48. package/esm/lrtfeeder.js.map +1 -0
  49. package/esm/mtr.d.ts +8 -0
  50. package/esm/mtr.js +21 -0
  51. package/esm/mtr.js.map +1 -0
  52. package/esm/nlb.d.ts +7 -0
  53. package/esm/nlb.js +27 -0
  54. package/esm/nlb.js.map +1 -0
  55. package/esm/type.d.ts +60 -0
  56. package/esm/type.js +2 -0
  57. package/esm/type.js.map +1 -0
  58. package/esm/utils.d.ts +1 -0
  59. package/esm/utils.js +13 -0
  60. package/esm/utils.js.map +1 -0
  61. package/package.json +24 -5
  62. package/src/ctb.ts +35 -0
  63. package/src/gmb.ts +34 -0
  64. package/src/index.ts +60 -0
  65. package/src/kmb.ts +35 -0
  66. package/{LightRail.js → src/lightRail.ts} +16 -11
  67. package/{Lrtfeeder.js → src/lrtfeeder.ts} +15 -10
  68. package/{Mtr.js → src/mtr.ts} +14 -9
  69. package/src/nlb.ts +37 -0
  70. package/{index.d.ts → src/type.ts} +1 -7
  71. package/src/utils.ts +15 -0
  72. package/.github/FUNDING.yml +0 -13
  73. package/Ctb.js +0 -48
  74. package/Gmb.js +0 -27
  75. package/Kmb.js +0 -49
  76. package/Nlb.js +0 -53
  77. package/index.js +0 -49
  78. 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
@@ -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
@@ -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"}
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,7 @@
1
+ import type { Eta, RouteListEntry } from "./type";
2
+ interface fetchEtasProps {
3
+ stopId: string;
4
+ nlbId: RouteListEntry['nlbId'];
5
+ }
6
+ export default function fetchEtas({ stopId, nlbId }: fetchEtasProps): Promise<Eta[]>;
7
+ export {};
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
@@ -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
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.js","sourceRoot":"","sources":["../src/type.ts"],"names":[],"mappings":""}
@@ -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";