@gojinko/cli 2.19.1 → 2.20.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/commands/travel-demand/demand-shared.d.ts +10 -1
- package/dist/commands/travel-demand/demand-shared.d.ts.map +1 -1
- package/dist/commands/travel-demand/demand-shared.js +14 -12
- package/dist/commands/travel-demand/demand-shared.js.map +1 -1
- package/dist/commands/travel-demand/evolution-shared.d.ts +67 -0
- package/dist/commands/travel-demand/evolution-shared.d.ts.map +1 -0
- package/dist/commands/travel-demand/evolution-shared.js +188 -0
- package/dist/commands/travel-demand/evolution-shared.js.map +1 -0
- package/dist/commands/travel-demand/index.d.ts +8 -6
- package/dist/commands/travel-demand/index.d.ts.map +1 -1
- package/dist/commands/travel-demand/index.js +53 -9
- package/dist/commands/travel-demand/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/** Shared option registration + request building for the three travel-demand commands. */
|
|
2
2
|
import type { Command } from 'commander';
|
|
3
|
-
import { type DemandQuery, type JinkoClient } from '@gojinko/api-client';
|
|
3
|
+
import { type DemandQuery, type JinkoClient, type TravelPeriod, type TravelerType, type TripType } from '@gojinko/api-client';
|
|
4
|
+
export declare const TRAVEL_PERIODS: readonly TravelPeriod[];
|
|
5
|
+
export declare const TRAVELER_TYPES: readonly TravelerType[];
|
|
6
|
+
export declare const TRIP_TYPES: readonly TripType[];
|
|
7
|
+
export declare const LEVELS: string[];
|
|
4
8
|
/** Raw option bag as parsed by Commander (camelCased flags). */
|
|
5
9
|
export interface DemandCliOpts {
|
|
6
10
|
analysis?: string;
|
|
@@ -23,6 +27,11 @@ export interface BuildOpts {
|
|
|
23
27
|
requireDestination?: boolean;
|
|
24
28
|
allowTravelerType?: boolean;
|
|
25
29
|
}
|
|
30
|
+
export declare function checkEnum<T extends string>(value: string | undefined, allowed: readonly T[], flag: string): T | undefined;
|
|
31
|
+
export declare function checkLocation(value: string | undefined, flag: string): string | undefined;
|
|
32
|
+
export declare function checkDate(value: string | undefined, flag: string): string | undefined;
|
|
33
|
+
export declare function checkNonNegInt(value: string | undefined, flag: string): number | undefined;
|
|
34
|
+
export declare function checkRangeInt(value: string | undefined, flag: string, min: number, max: number, oneDayReason?: string): number | undefined;
|
|
26
35
|
/** Validate CLI options and build the wire query. Throws UsageError (exit 3) on bad input. */
|
|
27
36
|
export declare function buildDemandQuery(opts: DemandCliOpts, build?: BuildOpts): DemandQuery;
|
|
28
37
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demand-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/travel-demand/demand-shared.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,WAAW,
|
|
1
|
+
{"version":3,"file":"demand-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/travel-demand/demand-shared.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAK7B,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAQjD,CAAC;AACF,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAA0C,CAAC;AAC7F,eAAO,MAAM,UAAU,EAAE,SAAS,QAAQ,EAA8B,CAAC;AACzE,eAAO,MAAM,MAAM,UAAsB,CAAC;AAG1C,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EACxC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,SAAS,CAMf;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUzF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWrF;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO1F;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EAIX,YAAY,SAAoF,GAC/F,MAAM,GAAG,SAAS,CAUpB;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,GAAE,SAAc,GAAG,WAAW,CAiFxF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,IAE5C,MAAM,OAAO,EAAE,GAAG,MAAM,OAAO,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA8B5D"}
|
|
@@ -2,7 +2,7 @@ import { createJinkoClient, } from '@gojinko/api-client';
|
|
|
2
2
|
import { getGlobalOptions } from '../../config/config.js';
|
|
3
3
|
import { exitWithError, output, UsageError } from '../shared.js';
|
|
4
4
|
const ANALYSIS = ['snapshot', 'trend'];
|
|
5
|
-
const TRAVEL_PERIODS = [
|
|
5
|
+
export const TRAVEL_PERIODS = [
|
|
6
6
|
'Summer',
|
|
7
7
|
'Winter',
|
|
8
8
|
'Christmas',
|
|
@@ -11,11 +11,11 @@ const TRAVEL_PERIODS = [
|
|
|
11
11
|
'Next90Days',
|
|
12
12
|
'Custom',
|
|
13
13
|
];
|
|
14
|
-
const TRAVELER_TYPES = ['Solo', 'Couple', 'Group', 'Family'];
|
|
15
|
-
const TRIP_TYPES = ['One-Way', 'Round-Trip'];
|
|
16
|
-
const LEVELS = ['City', 'Country'];
|
|
14
|
+
export const TRAVELER_TYPES = ['Solo', 'Couple', 'Group', 'Family'];
|
|
15
|
+
export const TRIP_TYPES = ['One-Way', 'Round-Trip'];
|
|
16
|
+
export const LEVELS = ['City', 'Country'];
|
|
17
17
|
const DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
|
|
18
|
-
function checkEnum(value, allowed, flag) {
|
|
18
|
+
export function checkEnum(value, allowed, flag) {
|
|
19
19
|
if (value === undefined)
|
|
20
20
|
return undefined;
|
|
21
21
|
if (!allowed.includes(value)) {
|
|
@@ -23,7 +23,7 @@ function checkEnum(value, allowed, flag) {
|
|
|
23
23
|
}
|
|
24
24
|
return value;
|
|
25
25
|
}
|
|
26
|
-
function checkLocation(value, flag) {
|
|
26
|
+
export function checkLocation(value, flag) {
|
|
27
27
|
if (value === undefined)
|
|
28
28
|
return undefined;
|
|
29
29
|
const parts = value.split(':');
|
|
@@ -35,7 +35,7 @@ function checkLocation(value, flag) {
|
|
|
35
35
|
}
|
|
36
36
|
return value;
|
|
37
37
|
}
|
|
38
|
-
function checkDate(value, flag) {
|
|
38
|
+
export function checkDate(value, flag) {
|
|
39
39
|
if (value === undefined)
|
|
40
40
|
return undefined;
|
|
41
41
|
if (DATE_RE.test(value)) {
|
|
@@ -57,7 +57,7 @@ function checkLimit(value) {
|
|
|
57
57
|
}
|
|
58
58
|
return n;
|
|
59
59
|
}
|
|
60
|
-
function checkNonNegInt(value, flag) {
|
|
60
|
+
export function checkNonNegInt(value, flag) {
|
|
61
61
|
if (value === undefined)
|
|
62
62
|
return undefined;
|
|
63
63
|
const n = Number(value);
|
|
@@ -66,14 +66,16 @@ function checkNonNegInt(value, flag) {
|
|
|
66
66
|
}
|
|
67
67
|
return n;
|
|
68
68
|
}
|
|
69
|
-
function checkRangeInt(value, flag, min, max
|
|
69
|
+
export function checkRangeInt(value, flag, min, max,
|
|
70
|
+
// Why "1" specifically is rejected. The snapshot/trend windows include the
|
|
71
|
+
// current (incomplete) day, hence the default; evolution windows end yesterday,
|
|
72
|
+
// so they pass their own reason. `1` looks like a reasonable input either way.
|
|
73
|
+
oneDayReason = 'a 1-day window relies on the current day, whose search data is not yet complete') {
|
|
70
74
|
if (value === undefined)
|
|
71
75
|
return undefined;
|
|
72
76
|
const n = Number(value);
|
|
73
77
|
if (!Number.isInteger(n) || n < min || n > max) {
|
|
74
|
-
|
|
75
|
-
// call that out specifically since "1" looks like a reasonable input.
|
|
76
|
-
const why = n === 1 ? ' — a 1-day window relies on the current day, whose search data is not yet complete' : '';
|
|
78
|
+
const why = n === 1 ? ` — ${oneDayReason}` : '';
|
|
77
79
|
throw new UsageError(`${flag} must be an integer between ${min} and ${max}${why} (got "${value}")`);
|
|
78
80
|
}
|
|
79
81
|
return n;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"demand-shared.js","sourceRoot":"","sources":["../../../src/commands/travel-demand/demand-shared.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,GAOlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjE,MAAM,QAAQ,GAA4B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAChE,MAAM,cAAc,GAA4B;
|
|
1
|
+
{"version":3,"file":"demand-shared.js","sourceRoot":"","sources":["../../../src/commands/travel-demand/demand-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared option registration + request building for the four travel-demand
|
|
3
|
+
* EVOLUTION (daily time-series) commands (JIN-1471):
|
|
4
|
+
*
|
|
5
|
+
* evolution — deep dive over explicit origin×destination pairs
|
|
6
|
+
* destination-evolution — top-N destinations, one series each
|
|
7
|
+
* market-evolution — top-N source markets (destination required)
|
|
8
|
+
* audience-evolution — per traveler-type segment (destination required)
|
|
9
|
+
*
|
|
10
|
+
* Evolution shares the demand filter vocabulary but drops `analysis` (a series is
|
|
11
|
+
* always a series — never snapshot/trend) and `snapshot_window_days`. The single
|
|
12
|
+
* window is `trend_window_days` (2-45, default 7); the series spans the last N
|
|
13
|
+
* complete days ending yesterday. The reusable validators live in
|
|
14
|
+
* ./demand-shared.ts to avoid duplicating the rules.
|
|
15
|
+
*/
|
|
16
|
+
import type { Command } from 'commander';
|
|
17
|
+
import { type DemandEvolutionQuery, type JinkoClient } from '@gojinko/api-client';
|
|
18
|
+
/** Raw option bag as parsed by Commander (camelCased flags). */
|
|
19
|
+
export interface EvolutionCliOpts {
|
|
20
|
+
origin?: string[];
|
|
21
|
+
destination?: string | string[];
|
|
22
|
+
originMarket?: string;
|
|
23
|
+
limit?: string;
|
|
24
|
+
travelPeriod?: string;
|
|
25
|
+
departureDateFrom?: string;
|
|
26
|
+
departureDateTo?: string;
|
|
27
|
+
travelerType?: string;
|
|
28
|
+
tripType?: string;
|
|
29
|
+
tripDurationMin?: string;
|
|
30
|
+
tripDurationMax?: string;
|
|
31
|
+
searchWindowMin?: string;
|
|
32
|
+
searchWindowMax?: string;
|
|
33
|
+
trendWindowDays?: string;
|
|
34
|
+
granularity?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface EvolutionBuildOpts {
|
|
37
|
+
/** Ranked commands where --destination must be supplied (market / audience). */
|
|
38
|
+
requireDestination?: boolean;
|
|
39
|
+
/** Whether --traveler-type is a valid filter (false for the audience endpoint, which buckets by it). */
|
|
40
|
+
allowTravelerType?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Commander collector for the repeatable, comma-splittable `--origin` /
|
|
44
|
+
* `--destination` flags on the pairs command: `--origin A --origin B` and
|
|
45
|
+
* `--origin A,B` both accumulate into the same array.
|
|
46
|
+
*/
|
|
47
|
+
export declare function collectLocations(value: string, previous?: string[]): string[];
|
|
48
|
+
/**
|
|
49
|
+
* Build the query for the `evolution` deep-dive (explicit pairs). v1 requires at
|
|
50
|
+
* least one origin and one destination, caps each list, and allows a list on only
|
|
51
|
+
* one side (the other must be a single location). The wire forwards
|
|
52
|
+
* comma-separated strings — the BFF splits them.
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildPairsEvolutionQuery(opts: EvolutionCliOpts): DemandEvolutionQuery;
|
|
55
|
+
/** Build the query for a ranked evolution command (destination / market / audience). */
|
|
56
|
+
export declare function buildRankedEvolutionQuery(opts: EvolutionCliOpts, build: EvolutionBuildOpts): DemandEvolutionQuery;
|
|
57
|
+
/**
|
|
58
|
+
* Build a Commander action for an evolution command. Same ordering contract as
|
|
59
|
+
* the snapshot/trend commands: validate input FIRST (UsageError -> exit 3), THEN
|
|
60
|
+
* construct the client (AuthError -> exit 2), THEN call the API.
|
|
61
|
+
*/
|
|
62
|
+
export declare function evolutionAction(buildQuery: (opts: EvolutionCliOpts) => DemandEvolutionQuery, call: (client: JinkoClient, query: DemandEvolutionQuery) => Promise<unknown>): (this: Command, ...args: unknown[]) => Promise<void>;
|
|
63
|
+
/** Register the filter options shared by all four evolution commands. */
|
|
64
|
+
export declare function addCommonEvolutionOptions(cmd: Command): Command;
|
|
65
|
+
/** Register the options common to the three RANKED evolution commands (origin-market + top-N limit). */
|
|
66
|
+
export declare function addRankedEvolutionOptions(cmd: Command): Command;
|
|
67
|
+
//# sourceMappingURL=evolution-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolution-shared.d.ts","sourceRoot":"","sources":["../../../src/commands/travel-demand/evolution-shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAEL,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAmB7B,gEAAgE;AAChE,MAAM,WAAW,gBAAgB;IAE/B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAEhC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAOjF;AAqFD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,oBAAoB,CAoCrF;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,kBAAkB,GACxB,oBAAoB,CAiBtB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,oBAAoB,EAC5D,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,OAAO,CAAC,IAErD,MAAM,OAAO,EAAE,GAAG,MAAM,OAAO,EAAE,KAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,yEAAyE;AACzE,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAwB/D;AAED,wGAAwG;AACxG,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAI/D"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createJinkoClient, } from '@gojinko/api-client';
|
|
2
|
+
import { getGlobalOptions } from '../../config/config.js';
|
|
3
|
+
import { exitWithError, output, UsageError } from '../shared.js';
|
|
4
|
+
import { checkDate, checkEnum, checkLocation, checkNonNegInt, checkRangeInt, TRAVEL_PERIODS, TRAVELER_TYPES, TRIP_TYPES, } from './demand-shared.js';
|
|
5
|
+
const GRANULARITIES = ['day', 'week', 'month'];
|
|
6
|
+
/** v1 caps the pairs deep-dive to a handful of locations per side to avoid an explosion of series. */
|
|
7
|
+
const MAX_PAIR_LOCATIONS = 10;
|
|
8
|
+
/**
|
|
9
|
+
* Commander collector for the repeatable, comma-splittable `--origin` /
|
|
10
|
+
* `--destination` flags on the pairs command: `--origin A --origin B` and
|
|
11
|
+
* `--origin A,B` both accumulate into the same array.
|
|
12
|
+
*/
|
|
13
|
+
export function collectLocations(value, previous = []) {
|
|
14
|
+
return previous.concat(value
|
|
15
|
+
.split(',')
|
|
16
|
+
.map((s) => s.trim())
|
|
17
|
+
.filter((s) => s.length > 0));
|
|
18
|
+
}
|
|
19
|
+
function checkEvolutionLimit(value) {
|
|
20
|
+
if (value === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
const n = Number(value);
|
|
23
|
+
if (!Number.isInteger(n) || n < 1 || n > 50) {
|
|
24
|
+
throw new UsageError(`--limit must be an integer between 1 and 50 (got "${value}")`);
|
|
25
|
+
}
|
|
26
|
+
return n;
|
|
27
|
+
}
|
|
28
|
+
/** Validate the filters shared by all four evolution commands and build the common query slice. */
|
|
29
|
+
function buildCommonEvolution(opts, build) {
|
|
30
|
+
const travelPeriod = checkEnum(opts.travelPeriod, TRAVEL_PERIODS, '--travel-period');
|
|
31
|
+
const from = checkDate(opts.departureDateFrom, '--departure-date-from');
|
|
32
|
+
const to = checkDate(opts.departureDateTo, '--departure-date-to');
|
|
33
|
+
if (travelPeriod === 'Custom') {
|
|
34
|
+
if (!from || !to) {
|
|
35
|
+
throw new UsageError('--travel-period Custom requires both --departure-date-from and --departure-date-to');
|
|
36
|
+
}
|
|
37
|
+
if (to < from) {
|
|
38
|
+
throw new UsageError('--departure-date-to must be on or after --departure-date-from');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (from || to) {
|
|
42
|
+
throw new UsageError('--departure-date-from/--departure-date-to are only valid with --travel-period Custom');
|
|
43
|
+
}
|
|
44
|
+
const travelerType = build.allowTravelerType
|
|
45
|
+
? checkEnum(opts.travelerType, TRAVELER_TYPES, '--traveler-type')
|
|
46
|
+
: undefined;
|
|
47
|
+
const tripType = checkEnum(opts.tripType, TRIP_TYPES, '--trip-type');
|
|
48
|
+
const tripDurationMin = checkNonNegInt(opts.tripDurationMin, '--trip-duration-min');
|
|
49
|
+
const tripDurationMax = checkNonNegInt(opts.tripDurationMax, '--trip-duration-max');
|
|
50
|
+
if (tripDurationMin !== undefined &&
|
|
51
|
+
tripDurationMax !== undefined &&
|
|
52
|
+
tripDurationMax < tripDurationMin) {
|
|
53
|
+
throw new UsageError('--trip-duration-max must be >= --trip-duration-min');
|
|
54
|
+
}
|
|
55
|
+
const searchWindowMin = checkNonNegInt(opts.searchWindowMin, '--search-window-min');
|
|
56
|
+
const searchWindowMax = checkNonNegInt(opts.searchWindowMax, '--search-window-max');
|
|
57
|
+
if (searchWindowMin !== undefined &&
|
|
58
|
+
searchWindowMax !== undefined &&
|
|
59
|
+
searchWindowMax < searchWindowMin) {
|
|
60
|
+
throw new UsageError('--search-window-max must be >= --search-window-min');
|
|
61
|
+
}
|
|
62
|
+
// The evolution window reuses the wire field `trend_window_days` (2-45). Here it
|
|
63
|
+
// is not tied to an analysis mode — it is simply the span of the series, which
|
|
64
|
+
// ends yesterday (the current, incomplete day is excluded). A single day is not
|
|
65
|
+
// a series, so 1 is rejected for its own reason, not the snapshot/trend one.
|
|
66
|
+
const trendWindowDays = checkRangeInt(opts.trendWindowDays, '--trend-window-days', 2, 45, 'an evolution series needs at least 2 days');
|
|
67
|
+
const granularity = checkEnum(opts.granularity, GRANULARITIES, '--granularity');
|
|
68
|
+
const query = {};
|
|
69
|
+
if (travelPeriod)
|
|
70
|
+
query.travel_period = travelPeriod;
|
|
71
|
+
if (from)
|
|
72
|
+
query.departure_date_from = from;
|
|
73
|
+
if (to)
|
|
74
|
+
query.departure_date_to = to;
|
|
75
|
+
if (travelerType)
|
|
76
|
+
query.traveler_type = travelerType;
|
|
77
|
+
if (tripType)
|
|
78
|
+
query.trip_type = tripType;
|
|
79
|
+
if (tripDurationMin !== undefined)
|
|
80
|
+
query.trip_duration_min = tripDurationMin;
|
|
81
|
+
if (tripDurationMax !== undefined)
|
|
82
|
+
query.trip_duration_max = tripDurationMax;
|
|
83
|
+
if (searchWindowMin !== undefined)
|
|
84
|
+
query.search_window_min = searchWindowMin;
|
|
85
|
+
if (searchWindowMax !== undefined)
|
|
86
|
+
query.search_window_max = searchWindowMax;
|
|
87
|
+
if (trendWindowDays !== undefined)
|
|
88
|
+
query.trend_window_days = trendWindowDays;
|
|
89
|
+
if (granularity)
|
|
90
|
+
query.granularity = granularity;
|
|
91
|
+
return query;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Build the query for the `evolution` deep-dive (explicit pairs). v1 requires at
|
|
95
|
+
* least one origin and one destination, caps each list, and allows a list on only
|
|
96
|
+
* one side (the other must be a single location). The wire forwards
|
|
97
|
+
* comma-separated strings — the BFF splits them.
|
|
98
|
+
*/
|
|
99
|
+
export function buildPairsEvolutionQuery(opts) {
|
|
100
|
+
const query = buildCommonEvolution(opts, { allowTravelerType: true });
|
|
101
|
+
const origins = Array.isArray(opts.origin) ? opts.origin : opts.origin ? [opts.origin] : [];
|
|
102
|
+
const destinations = Array.isArray(opts.destination)
|
|
103
|
+
? opts.destination
|
|
104
|
+
: opts.destination
|
|
105
|
+
? [opts.destination]
|
|
106
|
+
: [];
|
|
107
|
+
if (origins.length === 0) {
|
|
108
|
+
throw new UsageError('--origin is required (at least one), e.g. --origin Country:US');
|
|
109
|
+
}
|
|
110
|
+
if (destinations.length === 0) {
|
|
111
|
+
throw new UsageError('--destination is required (at least one), e.g. --destination Country:FR');
|
|
112
|
+
}
|
|
113
|
+
origins.forEach((o) => checkLocation(o, '--origin'));
|
|
114
|
+
destinations.forEach((d) => checkLocation(d, '--destination'));
|
|
115
|
+
if (origins.length > MAX_PAIR_LOCATIONS) {
|
|
116
|
+
throw new UsageError(`--origin accepts at most ${MAX_PAIR_LOCATIONS} locations (got ${origins.length})`);
|
|
117
|
+
}
|
|
118
|
+
if (destinations.length > MAX_PAIR_LOCATIONS) {
|
|
119
|
+
throw new UsageError(`--destination accepts at most ${MAX_PAIR_LOCATIONS} locations (got ${destinations.length})`);
|
|
120
|
+
}
|
|
121
|
+
if (origins.length > 1 && destinations.length > 1) {
|
|
122
|
+
throw new UsageError('v1: at most one of --origin / --destination may have more than one value — keep the other side a single location');
|
|
123
|
+
}
|
|
124
|
+
query.origins = origins.join(',');
|
|
125
|
+
query.destinations = destinations.join(',');
|
|
126
|
+
return query;
|
|
127
|
+
}
|
|
128
|
+
/** Build the query for a ranked evolution command (destination / market / audience). */
|
|
129
|
+
export function buildRankedEvolutionQuery(opts, build) {
|
|
130
|
+
const query = buildCommonEvolution(opts, build);
|
|
131
|
+
const destination = checkLocation(Array.isArray(opts.destination) ? opts.destination[0] : opts.destination, '--destination');
|
|
132
|
+
if (build.requireDestination && !destination) {
|
|
133
|
+
throw new UsageError('--destination is required for this command (e.g. --destination Country:TH)');
|
|
134
|
+
}
|
|
135
|
+
const originMarket = checkLocation(opts.originMarket, '--origin-market');
|
|
136
|
+
const limit = checkEvolutionLimit(opts.limit);
|
|
137
|
+
if (destination)
|
|
138
|
+
query.destination = destination;
|
|
139
|
+
if (originMarket)
|
|
140
|
+
query.origin_market = originMarket;
|
|
141
|
+
if (limit !== undefined)
|
|
142
|
+
query.limit = limit;
|
|
143
|
+
return query;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Build a Commander action for an evolution command. Same ordering contract as
|
|
147
|
+
* the snapshot/trend commands: validate input FIRST (UsageError -> exit 3), THEN
|
|
148
|
+
* construct the client (AuthError -> exit 2), THEN call the API.
|
|
149
|
+
*/
|
|
150
|
+
export function evolutionAction(buildQuery, call) {
|
|
151
|
+
return async function (...args) {
|
|
152
|
+
const command = args[args.length - 1];
|
|
153
|
+
const opts = args[args.length - 2] ?? {};
|
|
154
|
+
const globals = getGlobalOptions(command);
|
|
155
|
+
try {
|
|
156
|
+
const query = buildQuery(opts);
|
|
157
|
+
const client = await createJinkoClient({
|
|
158
|
+
apiKey: globals.apiKey,
|
|
159
|
+
environment: globals.environment,
|
|
160
|
+
});
|
|
161
|
+
output(await call(client, query), { format: globals.format });
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
exitWithError(err, globals);
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/** Register the filter options shared by all four evolution commands. */
|
|
169
|
+
export function addCommonEvolutionOptions(cmd) {
|
|
170
|
+
return cmd
|
|
171
|
+
.option('--travel-period <period>', 'Summer|Winter|Christmas|Easter|Next30Days|Next90Days|Custom (default Next90Days)')
|
|
172
|
+
.option('--departure-date-from <YYYY-MM-DD>', 'start of departure window (requires --travel-period Custom)')
|
|
173
|
+
.option('--departure-date-to <YYYY-MM-DD>', 'end of departure window (requires --travel-period Custom)')
|
|
174
|
+
.option('--trip-type <type>', 'One-Way|Round-Trip')
|
|
175
|
+
.option('--trip-duration-min <n>', 'minimum trip length in nights (round-trips only, >= 0)')
|
|
176
|
+
.option('--trip-duration-max <n>', 'maximum trip length in nights (>= --trip-duration-min)')
|
|
177
|
+
.option('--search-window-min <n>', 'minimum advance-purchase window in days before departure (>= 0)')
|
|
178
|
+
.option('--search-window-max <n>', 'maximum advance-purchase window in days (>= --search-window-min)')
|
|
179
|
+
.option('--trend-window-days <n>', 'evolution window: number of days the series spans, ending yesterday (2-45, default 7)')
|
|
180
|
+
.option('--granularity <bucket>', 'series bucket size: day (default) | week | month');
|
|
181
|
+
}
|
|
182
|
+
/** Register the options common to the three RANKED evolution commands (origin-market + top-N limit). */
|
|
183
|
+
export function addRankedEvolutionOptions(cmd) {
|
|
184
|
+
return addCommonEvolutionOptions(cmd)
|
|
185
|
+
.option('--origin-market <level:code>', 'origin market filter/scope, e.g. Country:US or City:NYC')
|
|
186
|
+
.option('--limit <n>', 'max number of series (top-N), 1-50 (default 10)');
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=evolution-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolution-shared.js","sourceRoot":"","sources":["../../../src/commands/travel-demand/evolution-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { Command } from 'commander';
|
|
2
2
|
/**
|
|
3
|
-
* `jinko travel-demand <operation>` — Travel Demand Intelligence (JIN-1378).
|
|
3
|
+
* `jinko travel-demand <operation>` — Travel Demand Intelligence (JIN-1378, JIN-1471).
|
|
4
4
|
*
|
|
5
|
-
* A second-level command group (like `auth`/`config`) with
|
|
6
|
-
* destination / market / audience
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* A second-level command group (like `auth`/`config`) with seven operations:
|
|
6
|
+
* three snapshot/trend rankings — destination / market / audience — and four
|
|
7
|
+
* daily time-series ("evolution") deep-dives — evolution / destination-evolution
|
|
8
|
+
* / market-evolution / audience-evolution (JIN-1471). ("demand-" is dropped — it
|
|
9
|
+
* is redundant under `travel-demand`.) The SDK keeps its flat demand* method
|
|
10
|
+
* names (demandDestination/…/demandEvolution/…). Registration is purely
|
|
11
|
+
* additive — see createProgram() in ../../index.ts.
|
|
10
12
|
*/
|
|
11
13
|
export declare function registerTravelDemandCommands(program: Command): void;
|
|
12
14
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/travel-demand/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/travel-demand/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDnE"}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { addCommonDemandOptions, demandAction } from './demand-shared.js';
|
|
2
|
+
import { addCommonEvolutionOptions, addRankedEvolutionOptions, buildPairsEvolutionQuery, buildRankedEvolutionQuery, collectLocations, evolutionAction, } from './evolution-shared.js';
|
|
2
3
|
/**
|
|
3
|
-
* `jinko travel-demand <operation>` — Travel Demand Intelligence (JIN-1378).
|
|
4
|
+
* `jinko travel-demand <operation>` — Travel Demand Intelligence (JIN-1378, JIN-1471).
|
|
4
5
|
*
|
|
5
|
-
* A second-level command group (like `auth`/`config`) with
|
|
6
|
-
* destination / market / audience
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* A second-level command group (like `auth`/`config`) with seven operations:
|
|
7
|
+
* three snapshot/trend rankings — destination / market / audience — and four
|
|
8
|
+
* daily time-series ("evolution") deep-dives — evolution / destination-evolution
|
|
9
|
+
* / market-evolution / audience-evolution (JIN-1471). ("demand-" is dropped — it
|
|
10
|
+
* is redundant under `travel-demand`.) The SDK keeps its flat demand* method
|
|
11
|
+
* names (demandDestination/…/demandEvolution/…). Registration is purely
|
|
12
|
+
* additive — see createProgram() in ../../index.ts.
|
|
10
13
|
*/
|
|
11
14
|
export function registerTravelDemandCommands(program) {
|
|
12
15
|
const td = program
|
|
13
16
|
.command('travel-demand')
|
|
14
|
-
.summary('Travel Demand Intelligence —
|
|
15
|
-
.description('Query de-sampled search-demand analytics (JIN-1378): the most-searched
|
|
16
|
-
'the source markets driving demand for a destination, and the traveler-type
|
|
17
|
+
.summary('Travel Demand Intelligence — rankings + daily evolution time series')
|
|
18
|
+
.description('Query de-sampled search-demand analytics (JIN-1378, JIN-1471): the most-searched ' +
|
|
19
|
+
'destinations, the source markets driving demand for a destination, and the traveler-type ' +
|
|
20
|
+
'mix — as point-in-time rankings (snapshot/trend) or as daily "evolution" time series you ' +
|
|
21
|
+
'can plot over a window.');
|
|
17
22
|
addCommonDemandOptions(td
|
|
18
23
|
.command('destination')
|
|
19
24
|
.summary('Top destinations by search demand')
|
|
@@ -33,5 +38,44 @@ export function registerTravelDemandCommands(program) {
|
|
|
33
38
|
.description('Traveler-type composition (Solo/Couple/Family/Group) of demand for a destination. ' +
|
|
34
39
|
'--destination is required. (traveler_type is not a filter here — it is the dimension.)')
|
|
35
40
|
.option('--destination <level:code>', 'destination, e.g. Country:JP (required)')).action(demandAction({ requireDestination: true }, (client, query) => client.demandAudience(query)));
|
|
41
|
+
registerEvolutionCommands(td);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The four EVOLUTION (daily time-series) commands (JIN-1471). A series is always
|
|
45
|
+
* a series, so there is no --analysis / --snapshot-window-days here; the window is
|
|
46
|
+
* --trend-window-days (2-45, default 7) and --granularity buckets it.
|
|
47
|
+
*/
|
|
48
|
+
function registerEvolutionCommands(td) {
|
|
49
|
+
// Deep dive over explicit pairs. --origin / --destination are repeatable and
|
|
50
|
+
// comma-splittable; v1 requires one side to be a single location.
|
|
51
|
+
addCommonEvolutionOptions(td
|
|
52
|
+
.command('evolution')
|
|
53
|
+
.summary('Daily demand time series for explicit origin/destination pairs')
|
|
54
|
+
.description('Deep dive: one daily de-sampled search-volume series per (origin, destination) pair. ' +
|
|
55
|
+
'--origin and --destination are repeatable (or comma-separated); v1 allows a list on ' +
|
|
56
|
+
'only one side (keep the other a single location).')
|
|
57
|
+
.option('--origin <level:code>', 'origin selector, e.g. Country:US (repeatable)', collectLocations, [])
|
|
58
|
+
.option('--destination <level:code>', 'destination selector, e.g. Country:FR (repeatable)', collectLocations, [])
|
|
59
|
+
.option('--traveler-type <type>', 'Solo|Couple|Group|Family')).action(evolutionAction(buildPairsEvolutionQuery, (client, query) => client.demandEvolution(query)));
|
|
60
|
+
addRankedEvolutionOptions(td
|
|
61
|
+
.command('destination-evolution')
|
|
62
|
+
.summary('Daily demand time series for the top-N destinations')
|
|
63
|
+
.description('Ranks destinations (optionally reachable from --origin-market) by within-window growth, ' +
|
|
64
|
+
'then returns each top-N destination’s daily series.')
|
|
65
|
+
.option('--destination <level:code>', 'optional destination filter, e.g. Country:TH')
|
|
66
|
+
.option('--traveler-type <type>', 'Solo|Couple|Group|Family')).action(evolutionAction((opts) => buildRankedEvolutionQuery(opts, { allowTravelerType: true }), (client, query) => client.demandDestinationEvolution(query)));
|
|
67
|
+
addRankedEvolutionOptions(td
|
|
68
|
+
.command('market-evolution')
|
|
69
|
+
.summary('Daily demand time series for the top-N source markets')
|
|
70
|
+
.description('Ranks source markets for a destination by within-window growth, then returns each ' +
|
|
71
|
+
'top-N market’s daily series. --destination is required.')
|
|
72
|
+
.option('--destination <level:code>', 'destination, e.g. Country:TH (required)')
|
|
73
|
+
.option('--traveler-type <type>', 'Solo|Couple|Group|Family')).action(evolutionAction((opts) => buildRankedEvolutionQuery(opts, { requireDestination: true, allowTravelerType: true }), (client, query) => client.demandMarketEvolution(query)));
|
|
74
|
+
addRankedEvolutionOptions(td
|
|
75
|
+
.command('audience-evolution')
|
|
76
|
+
.summary('Daily demand time series for the traveler-type mix')
|
|
77
|
+
.description('A daily series per traveler-type segment (Solo/Couple/Family/Group) of demand for a ' +
|
|
78
|
+
'destination. --destination is required. (traveler_type is not a filter here — it is the dimension.)')
|
|
79
|
+
.option('--destination <level:code>', 'destination, e.g. Country:JP (required)')).action(evolutionAction((opts) => buildRankedEvolutionQuery(opts, { requireDestination: true }), (client, query) => client.demandAudienceEvolution(query)));
|
|
36
80
|
}
|
|
37
81
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/travel-demand/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/travel-demand/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gojinko/cli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.20.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"jinko": "./dist/bin/jinko.js"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"docs:gen": "tsx scripts/gen-cli-docs.ts"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@gojinko/api-client": "2.
|
|
20
|
+
"@gojinko/api-client": "2.20.0",
|
|
21
21
|
"commander": "^12.1.0",
|
|
22
22
|
"chalk": "^5.4.1",
|
|
23
23
|
"open": "^10.0.0"
|