itamatrix 1.0.0 → 1.0.2

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 (73) hide show
  1. package/dist/browser/batch.js +0 -1
  2. package/dist/browser/forms.js +0 -1
  3. package/dist/browser/session.js +0 -1
  4. package/dist/cache.js +0 -1
  5. package/dist/cli.js +20 -3
  6. package/dist/commands/calendar.js +0 -1
  7. package/dist/commands/multicity.js +0 -1
  8. package/dist/commands/search.js +0 -1
  9. package/dist/commands/shared.js +0 -1
  10. package/dist/model/spec.js +0 -1
  11. package/dist/model/types.js +0 -1
  12. package/dist/render/calendar.js +0 -1
  13. package/dist/render/json.js +0 -1
  14. package/dist/render/normalize.js +0 -1
  15. package/dist/render/table.js +0 -1
  16. package/package.json +3 -2
  17. package/dist/browser/batch.d.ts +0 -8
  18. package/dist/browser/batch.js.map +0 -1
  19. package/dist/browser/batch.test.d.ts +0 -1
  20. package/dist/browser/batch.test.js +0 -38
  21. package/dist/browser/batch.test.js.map +0 -1
  22. package/dist/browser/forms.d.ts +0 -26
  23. package/dist/browser/forms.js.map +0 -1
  24. package/dist/browser/session.d.ts +0 -20
  25. package/dist/browser/session.js.map +0 -1
  26. package/dist/cache.d.ts +0 -21
  27. package/dist/cache.js.map +0 -1
  28. package/dist/cache.test.d.ts +0 -1
  29. package/dist/cache.test.js +0 -79
  30. package/dist/cache.test.js.map +0 -1
  31. package/dist/cli.d.ts +0 -3
  32. package/dist/cli.js.map +0 -1
  33. package/dist/commands/calendar.d.ts +0 -19
  34. package/dist/commands/calendar.js.map +0 -1
  35. package/dist/commands/calendar.test.d.ts +0 -1
  36. package/dist/commands/calendar.test.js +0 -58
  37. package/dist/commands/calendar.test.js.map +0 -1
  38. package/dist/commands/multicity.d.ts +0 -17
  39. package/dist/commands/multicity.js.map +0 -1
  40. package/dist/commands/multicity.test.d.ts +0 -1
  41. package/dist/commands/multicity.test.js +0 -54
  42. package/dist/commands/multicity.test.js.map +0 -1
  43. package/dist/commands/search.d.ts +0 -20
  44. package/dist/commands/search.js.map +0 -1
  45. package/dist/commands/search.test.d.ts +0 -1
  46. package/dist/commands/search.test.js +0 -124
  47. package/dist/commands/search.test.js.map +0 -1
  48. package/dist/commands/shared.d.ts +0 -44
  49. package/dist/commands/shared.js.map +0 -1
  50. package/dist/model/spec.d.ts +0 -63
  51. package/dist/model/spec.js.map +0 -1
  52. package/dist/model/spec.test.d.ts +0 -1
  53. package/dist/model/spec.test.js +0 -55
  54. package/dist/model/spec.test.js.map +0 -1
  55. package/dist/model/types.d.ts +0 -22080
  56. package/dist/model/types.js.map +0 -1
  57. package/dist/model/types.test.d.ts +0 -1
  58. package/dist/model/types.test.js +0 -35
  59. package/dist/model/types.test.js.map +0 -1
  60. package/dist/render/calendar.d.ts +0 -21
  61. package/dist/render/calendar.js.map +0 -1
  62. package/dist/render/calendar.render.test.d.ts +0 -1
  63. package/dist/render/calendar.render.test.js +0 -66
  64. package/dist/render/calendar.render.test.js.map +0 -1
  65. package/dist/render/json.d.ts +0 -2
  66. package/dist/render/json.js.map +0 -1
  67. package/dist/render/normalize.d.ts +0 -32
  68. package/dist/render/normalize.js.map +0 -1
  69. package/dist/render/render.test.d.ts +0 -1
  70. package/dist/render/render.test.js +0 -129
  71. package/dist/render/render.test.js.map +0 -1
  72. package/dist/render/table.d.ts +0 -2
  73. package/dist/render/table.js.map +0 -1
@@ -84,4 +84,3 @@ function matchBrace(text, start) {
84
84
  }
85
85
  return -1;
86
86
  }
87
- //# sourceMappingURL=batch.js.map
@@ -230,4 +230,3 @@ async function setAdults(page, adults) {
230
230
  async function clickSearch(page) {
231
231
  await page.getByRole("button", { name: /search/i }).last().click();
232
232
  }
233
- //# sourceMappingURL=forms.js.map
@@ -123,4 +123,3 @@ function waitForResponse(page, match, timeoutMs) {
123
123
  });
124
124
  return { promise, cancel: () => cancel() };
125
125
  }
126
- //# sourceMappingURL=session.js.map
package/dist/cache.js CHANGED
@@ -68,4 +68,3 @@ export async function withCache(namespace, keyParts, opts, produce) {
68
68
  writeEntry(key, value, now);
69
69
  return value;
70
70
  }
71
- //# sourceMappingURL=cache.js.map
package/dist/cli.js CHANGED
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { realpathSync } from "node:fs";
2
4
  import { pathToFileURL } from "node:url";
3
5
  import { Command, InvalidArgumentError } from "commander";
4
6
  import { runSearchCommand, } from "./commands/search.js";
@@ -35,11 +37,14 @@ function resolveFormat(json, table) {
35
37
  // Auto-detect: TTY → table, piped → json.
36
38
  return process.stdout.isTTY ? "table" : "json";
37
39
  }
40
+ // Read version from package.json so it tracks semantic-release bumps (which only
41
+ // update package.json, never this file). dist/cli.js sits one dir below package root.
42
+ const { version } = createRequire(import.meta.url)("../package.json");
38
43
  export const program = new Command();
39
44
  program
40
45
  .name("itamatrix")
41
46
  .description("CLI for ITA Matrix flight search")
42
- .version("0.1.0")
47
+ .version(version)
43
48
  .option("--json", "force JSON output")
44
49
  .option("--table", "force table output")
45
50
  .option("--no-cache", "bypass the result cache (always query live)")
@@ -148,7 +153,19 @@ program
148
153
  });
149
154
  // Parse only when run as the CLI entrypoint, so tools can import `program` to
150
155
  // introspect commands/options (see scripts/gen-skill.ts) without triggering a run.
151
- if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
156
+ // argv[1] is realpath'd because npm/npx invoke the bin via a symlink, whose path
157
+ // would otherwise never match this module's resolved import.meta.url.
158
+ function isCliEntrypoint() {
159
+ const entry = process.argv[1];
160
+ if (!entry)
161
+ return false;
162
+ try {
163
+ return import.meta.url === pathToFileURL(realpathSync(entry)).href;
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ }
169
+ if (isCliEntrypoint()) {
152
170
  program.parseAsync(process.argv);
153
171
  }
154
- //# sourceMappingURL=cli.js.map
@@ -44,4 +44,3 @@ function validate(origin, dest, opts, from, to) {
44
44
  }
45
45
  validateTripControls(opts);
46
46
  }
47
- //# sourceMappingURL=calendar.js.map
@@ -47,4 +47,3 @@ function toSlice(raw, index, opts) {
47
47
  ext: opts.ext,
48
48
  };
49
49
  }
50
- //# sourceMappingURL=multicity.js.map
@@ -40,4 +40,3 @@ function validate(origin, dest, opts) {
40
40
  validateTripControls(opts);
41
41
  requirePageLimit(opts.limit);
42
42
  }
43
- //# sourceMappingURL=search.js.map
@@ -74,4 +74,3 @@ function isRealCalendarDate(value) {
74
74
  date.getUTCMonth() === m - 1 &&
75
75
  date.getUTCDate() === d);
76
76
  }
77
- //# sourceMappingURL=shared.js.map
@@ -26,4 +26,3 @@ export function isRoundTrip(spec) {
26
26
  export function hasAdvancedControls(spec) {
27
27
  return Boolean(spec.cabin || spec.stops || spec.extraStops || spec.routing || spec.ext);
28
28
  }
29
- //# sourceMappingURL=spec.js.map
@@ -97,4 +97,3 @@ function unwrapResponse(raw) {
97
97
  ? raw.response
98
98
  : raw;
99
99
  }
100
- //# sourceMappingURL=types.js.map
@@ -86,4 +86,3 @@ export function renderCalendarTable(cal) {
86
86
  (cal.minPrice ? ` · cheapest ${cal.minPrice} on ${cal.minDate}` : ""));
87
87
  return `${header}\n${table.toString()}`;
88
88
  }
89
- //# sourceMappingURL=calendar.js.map
@@ -1,4 +1,3 @@
1
1
  export function renderJson(result) {
2
2
  return JSON.stringify(result, null, 2);
3
3
  }
4
- //# sourceMappingURL=json.js.map
@@ -41,4 +41,3 @@ export function normalize(resp, limit) {
41
41
  solutions,
42
42
  };
43
43
  }
44
- //# sourceMappingURL=normalize.js.map
@@ -46,4 +46,3 @@ export function renderTable(result) {
46
46
  (result.minPrice ? ` · from ${result.minPrice}` : ""));
47
47
  return `${header}\n${table.toString()}`;
48
48
  }
49
- //# sourceMappingURL=table.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "itamatrix",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "CLI for ITA Matrix flight search",
5
5
  "type": "module",
6
6
  "bin": {
@@ -34,11 +34,12 @@
34
34
  "access": "public"
35
35
  },
36
36
  "scripts": {
37
- "build": "tsc -p tsconfig.json",
37
+ "build": "tsc -p tsconfig.build.json",
38
38
  "dev": "tsx src/cli.ts",
39
39
  "gen:skill": "tsx scripts/gen-skill.ts",
40
40
  "gen:skill:check": "tsx scripts/gen-skill.ts --check",
41
41
  "lint:md": "markdownlint-cli2 \"**/*.md\"",
42
+ "fix:changelog": "tsx scripts/fix-changelog.ts",
42
43
  "prepare": "pre-commit install || true",
43
44
  "test": "vitest run",
44
45
  "typecheck": "tsc -p tsconfig.json --noEmit",
@@ -1,8 +0,0 @@
1
- /**
2
- * Matrix returns search results inside a `multipart/mixed` `/batch` response:
3
- * each part is an `application/http` wrapper around a JSON body. Rather than
4
- * parse MIME framing, scan the raw text for balanced top-level JSON objects and
5
- * return the first one that looks like a search result (`solutionList`).
6
- */
7
- export declare function extractSearchPayload(batchBody: string): unknown | null;
8
- export declare function extractCalendarPayload(batchBody: string): unknown | null;
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/browser/batch.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,38 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { readFileSync } from "node:fs";
3
- import { fileURLToPath } from "node:url";
4
- import { extractCalendarPayload, extractSearchPayload } from "./batch.js";
5
- import { parseSearchResponse } from "../model/types.js";
6
- const batchBody = readFileSync(fileURLToPath(new URL("../../fixtures/batch_multipart.txt", import.meta.url)), "utf8");
7
- describe("extractSearchPayload", () => {
8
- it("pulls the solutionList payload out of a multipart /batch body", () => {
9
- const payload = extractSearchPayload(batchBody);
10
- expect(payload).not.toBeNull();
11
- const resp = parseSearchResponse(payload);
12
- expect(resp.solutionList.solutions.length).toBeGreaterThan(0);
13
- });
14
- it("returns null when no part carries a solutionList", () => {
15
- expect(extractSearchPayload('--b\r\n\r\n{"foo":1}\r\n--b--')).toBeNull();
16
- });
17
- it("skips earlier non-result parts and finds a later solutionList", () => {
18
- const body = '--b\r\n\r\n{"airports":["a"]}\r\n' +
19
- '--b\r\n\r\n{"solutionList":{"solutions":[{"id":"X","displayTotal":"USD1","itinerary":{"slices":[]}}]}}\r\n--b--';
20
- const payload = extractSearchPayload(body);
21
- expect(payload.solutionList.solutions).toHaveLength(1);
22
- });
23
- it("ignores a brace inside a JSON string without misparsing", () => {
24
- const body = '--b\r\n\r\n{"note":"a } brace","solutionList":{"solutions":[]}}\r\n--b--';
25
- expect(extractSearchPayload(body)).not.toBeNull();
26
- });
27
- });
28
- describe("extractCalendarPayload", () => {
29
- it("pulls a part carrying a calendar key out of a /batch body", () => {
30
- const body = '--b\r\n\r\n{"solutionList":{"solutions":[]}}\r\n' +
31
- '--b\r\n\r\n{"response":{"calendarSliceList":{"days":[]}}}\r\n--b--';
32
- expect(extractCalendarPayload(body)).not.toBeNull();
33
- });
34
- it("returns null when no part has a calendar-shaped payload", () => {
35
- expect(extractCalendarPayload('--b\r\n\r\n{"solutionList":{}}\r\n--b--')).toBeNull();
36
- });
37
- });
38
- //# sourceMappingURL=batch.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"batch.test.js","sourceRoot":"","sources":["../../src/browser/batch.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,SAAS,GAAG,YAAY,CAC5B,aAAa,CAAC,IAAI,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAC7E,MAAM,CACP,CAAC;AAEF,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,oBAAoB,CAAC,+BAA+B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GACR,mCAAmC;YACnC,iHAAiH,CAAC;QACpH,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAA+C,CAAC;QACzF,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,0EAA0E,CAAC;QACxF,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GACR,kDAAkD;YAClD,oEAAoE,CAAC;QACvE,MAAM,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,sBAAsB,CAAC,yCAAyC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,26 +0,0 @@
1
- import type { Page } from "playwright";
2
- import type { CalendarSpec, MultiCitySpec, SearchSpec } from "../model/spec.js";
3
- /**
4
- * Drives the Matrix search form and clicks Search.
5
- *
6
- * NOTE: this layer is intentionally thin and is the part most coupled to the
7
- * live DOM (DESIGN.md "Trade-offs"). Selectors target the Angular Material
8
- * markup observed on matrix.itasoftware.com/search. If Matrix restructures the
9
- * form, failures surface here with a clear message.
10
- */
11
- export declare function driveSearchForm(page: Page, spec: SearchSpec): Promise<void>;
12
- /**
13
- * Drives the multi-city form: selects the Multi-City tab, materialises one row
14
- * per leg, fills each leg's origin/destination/date, then applies the shared
15
- * cabin/stops controls and clicks Search. The response is the same
16
- * `solutionList` shape as a normal search (N slices instead of 1–2).
17
- */
18
- export declare function driveMultiCityForm(page: Page, spec: MultiCitySpec): Promise<void>;
19
- /**
20
- * Drives the price-calendar form: "See calendar of lowest fares" over a
21
- * departure-date range. With `tripLength` it's a round-trip calendar; without,
22
- * one-way. Selectors here are provisional — the calendar UI/response could not
23
- * be captured for P3 (DESIGN), so this is the thinnest, most likely-to-drift
24
- * layer; failures surface with a clear message.
25
- */
26
- export declare function driveCalendarForm(page: Page, spec: CalendarSpec): Promise<void>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"forms.js","sourceRoot":"","sources":["../../src/browser/forms.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import type { CalendarSpec, MultiCitySpec, SearchSpec } from "../model/spec.js";
2
- import { type CalendarResponse, type SearchResponse } from "../model/types.js";
3
- export interface SessionOptions {
4
- /** Show the browser window (debugging). Default headless. */
5
- headful?: boolean;
6
- /** Max time to wait for the /v1/search response. Matrix is slow (40–60s). */
7
- timeoutMs?: number;
8
- }
9
- /**
10
- * One-shot Matrix search: launch Chromium, drive the form, intercept the
11
- * `/v1/search` response, and return the parsed payload.
12
- *
13
- * Bundled headless Chromium works with light stealth (real Chrome UA, hide
14
- * navigator.webdriver) — Google's BotGuard JS still runs and mints the token.
15
- */
16
- export declare function runSearch(spec: SearchSpec, opts?: SessionOptions): Promise<SearchResponse>;
17
- /** Multi-city search (DESIGN P3): same `solutionList` response as `runSearch`. */
18
- export declare function runMultiCity(spec: MultiCitySpec, opts?: SessionOptions): Promise<SearchResponse>;
19
- /** Price-calendar search (DESIGN P3): lowest fare per departure date. */
20
- export declare function runCalendar(spec: CalendarSpec, opts?: SessionOptions): Promise<CalendarResponse>;
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/browser/session.ts"],"names":[],"mappings":"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"}
package/dist/cache.d.ts DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * File-based result cache. Matrix queries take 30–60 s and are driven by a
3
- * browser, so repeat queries for the same spec are expensive; caching the raw
4
- * parsed response makes them instant (DESIGN P4). The cache key is the spec, so
5
- * output format is irrelevant — render happens after the cache layer.
6
- */
7
- export interface CacheOptions {
8
- /** When false, `withCache` always calls the producer and skips read/write. */
9
- enabled: boolean;
10
- /** Entries older than this are treated as misses. */
11
- ttlMs: number;
12
- }
13
- export declare const DEFAULT_CACHE_TTL_MINUTES = 60;
14
- /** `$XDG_CACHE_HOME/itamatrix` → `~/.cache/itamatrix` → `$TMPDIR/itamatrix`. */
15
- export declare function cacheDir(): string;
16
- /**
17
- * Return a cached response for `keyParts` if present and fresh, otherwise call
18
- * `produce`, cache its result, and return it. Caching is best-effort: any I/O
19
- * error degrades to calling `produce` directly.
20
- */
21
- export declare function withCache<T>(namespace: string, keyParts: unknown, opts: CacheOptions, produce: () => Promise<T>): Promise<T>;
package/dist/cache.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,79 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
3
- import { createHash } from "node:crypto";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { withCache, cacheDir, DEFAULT_CACHE_TTL_MINUTES } from "./cache.js";
7
- let dir;
8
- let prevXdg;
9
- beforeEach(() => {
10
- dir = mkdtempSync(join(tmpdir(), "itamatrix-cache-"));
11
- prevXdg = process.env.XDG_CACHE_HOME;
12
- process.env.XDG_CACHE_HOME = dir;
13
- });
14
- afterEach(() => {
15
- if (prevXdg === undefined)
16
- delete process.env.XDG_CACHE_HOME;
17
- else
18
- process.env.XDG_CACHE_HOME = prevXdg;
19
- rmSync(dir, { recursive: true, force: true });
20
- });
21
- const opts = { enabled: true, ttlMs: DEFAULT_CACHE_TTL_MINUTES * 60_000 };
22
- describe("withCache", () => {
23
- it("returns the cache dir under XDG_CACHE_HOME", () => {
24
- expect(cacheDir()).toBe(join(dir, "itamatrix"));
25
- });
26
- it("calls the producer once and serves the second call from cache", async () => {
27
- const produce = vi.fn().mockResolvedValue({ price: 100 });
28
- const first = await withCache("search", { o: "BOS" }, opts, produce);
29
- const second = await withCache("search", { o: "BOS" }, opts, produce);
30
- expect(first).toEqual({ price: 100 });
31
- expect(second).toEqual({ price: 100 });
32
- expect(produce).toHaveBeenCalledTimes(1);
33
- });
34
- it("treats a different key as a miss", async () => {
35
- const produce = vi.fn().mockResolvedValue({ price: 100 });
36
- await withCache("search", { o: "BOS" }, opts, produce);
37
- await withCache("search", { o: "JFK" }, opts, produce);
38
- expect(produce).toHaveBeenCalledTimes(2);
39
- });
40
- it("separates entries by namespace", async () => {
41
- const produce = vi.fn().mockResolvedValue({ price: 100 });
42
- await withCache("search", { x: 1 }, opts, produce);
43
- await withCache("calendar", { x: 1 }, opts, produce);
44
- expect(produce).toHaveBeenCalledTimes(2);
45
- });
46
- it("bypasses cache entirely when disabled", async () => {
47
- const produce = vi.fn().mockResolvedValue({ price: 100 });
48
- const off = { enabled: false, ttlMs: 60_000 };
49
- await withCache("search", { o: "BOS" }, off, produce);
50
- await withCache("search", { o: "BOS" }, off, produce);
51
- expect(produce).toHaveBeenCalledTimes(2);
52
- });
53
- it("treats a JSON file of the wrong shape as a miss", async () => {
54
- const produce = vi.fn().mockResolvedValue({ price: 100 });
55
- mkdirSync(join(dir, "itamatrix"), { recursive: true });
56
- // Mirror the key derivation: namespace + sha256(namespace \0 JSON(parts)).
57
- const parts = { o: "BOS" };
58
- const digest = createHash("sha256")
59
- .update("search")
60
- .update("\0")
61
- .update(JSON.stringify(parts))
62
- .digest("hex");
63
- writeFileSync(join(dir, "itamatrix", `search-${digest}.json`), "{}");
64
- const result = await withCache("search", parts, opts, produce);
65
- expect(result).toEqual({ price: 100 });
66
- expect(produce).toHaveBeenCalledTimes(1);
67
- });
68
- it("re-fetches once the entry is older than the TTL", async () => {
69
- const produce = vi.fn().mockResolvedValue({ price: 100 });
70
- const base = 1_000_000;
71
- vi.spyOn(Date, "now").mockReturnValue(base);
72
- await withCache("search", { o: "BOS" }, { enabled: true, ttlMs: 1000 }, produce);
73
- vi.spyOn(Date, "now").mockReturnValue(base + 2000);
74
- await withCache("search", { o: "BOS" }, { enabled: true, ttlMs: 1000 }, produce);
75
- expect(produce).toHaveBeenCalledTimes(2);
76
- vi.restoreAllMocks();
77
- });
78
- });
79
- //# sourceMappingURL=cache.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.test.js","sourceRoot":"","sources":["../src/cache.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command } from "commander";
3
- export declare const program: Command;
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EACL,gBAAgB,GAGjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,SAAS,OAAO,CAAC,KAAa,EAAE,IAAc;IAC5C,OAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC;AAED,iFAAiF;AACjF,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,oBAAoB,CAAC,GAAG,IAAI,6BAA6B,KAAK,GAAG,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,GAAG,CAAC,MAA6B;IACxC,OAAO,MAAM,EAAE;SACZ,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC/D,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,IAAc,EAAE,KAAe;IACpD,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IACxB,IAAI,KAAK;QAAE,OAAO,OAAO,CAAC;IAC1B,0CAA0C;IAC1C,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC;KACrC,MAAM,CAAC,SAAS,EAAE,oBAAoB,CAAC;KACvC,MAAM,CAAC,YAAY,EAAE,6CAA6C,CAAC;KACnE,MAAM,CACL,uBAAuB,EACvB,oDAAoD,EACpD,MAAM,CAAC,aAAa,CAAC,CACtB,CAAC;AAEJ,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sCAAsC,CAAC;KACnD,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAChD,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;KACnD,cAAc,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;KAChE,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACtD,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;KACnF,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,4DAA4D,CAAC;KACzF,MAAM,CAAC,mBAAmB,EAAE,sDAAsD,CAAC;KACnF,MAAM,CAAC,eAAe,EAAE,kEAAkE,CAAC;KAC3F,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,IAAI,GAAyB;QACjC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;QAClD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,eAAe,EAAE,OAAO,CAAC,QAAQ;KAClC,CAAC;IACF,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,wCAAwC,CAAC;KACrD,cAAc,CACb,0BAA0B,EAC1B,mDAAmD,EACnD,OAAO,EACP,EAAE,CACH;KACA,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,qCAAqC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;KACnF,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,4DAA4D,CAAC;KACzF,MAAM,CAAC,mBAAmB,EAAE,wCAAwC,CAAC;KACrE,MAAM,CAAC,eAAe,EAAE,0CAA0C,CAAC;KACnE,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,CAAC,GAAG,EAAE,CACb,mBAAmB,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC,GAAG;QACjB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC/D,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;QAClD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,eAAe,EAAE,OAAO,CAAC,QAAQ;KAClC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,6DAA6D,CAAC;KAC1E,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAChD,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;KACnD,cAAc,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;KACrE,MAAM,CACL,wBAAwB,EACxB,qCAAqC,EACrC,MAAM,CAAC,eAAe,CAAC,CACxB;KACA,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KACjE,MAAM,CAAC,aAAa,EAAE,gCAAgC,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;KAC9E,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,uBAAuB,EAAE,oBAAoB,CAAC;KACrD,MAAM,CAAC,mBAAmB,EAAE,4DAA4D,CAAC;KACzF,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;KAChD,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;KAC9C,MAAM,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,IAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAC/D,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,GAAG,CAAC,GAAG,EAAE,CACb,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE;QAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC/D,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;QAClD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,eAAe,EAAE,OAAO,CAAC,QAAQ;KAClC,CAAC,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,8EAA8E;AAC9E,mFAAmF;AACnF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC"}
@@ -1,19 +0,0 @@
1
- import { type CacheControlOptions, type OutputFormat } from "./shared.js";
2
- export interface CalendarCommandOptions extends CacheControlOptions {
3
- departRange: string;
4
- tripLength?: number;
5
- adults: number;
6
- limit: number;
7
- cabin?: string;
8
- stops?: string;
9
- extraStops?: string;
10
- routing?: string;
11
- ext?: string;
12
- format: OutputFormat;
13
- headful?: boolean;
14
- }
15
- export declare function runCalendarCommand(origin: string, dest: string, opts: CalendarCommandOptions): Promise<string>;
16
- export declare function parseDepartRange(range: string): {
17
- from: string;
18
- to: string;
19
- };
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/commands/calendar.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,58 +0,0 @@
1
- import { describe, it, expect, vi } from "vitest";
2
- import { parseDepartRange, runCalendarCommand, } from "./calendar.js";
3
- const captured = [];
4
- vi.mock("../browser/session.js", () => ({
5
- runCalendar: (spec) => {
6
- captured.push(spec);
7
- return Promise.resolve({ calendarSliceList: { days: [] } });
8
- },
9
- }));
10
- const opts = (over = {}) => ({
11
- departRange: "2026-08-01:2026-08-31",
12
- tripLength: 7,
13
- adults: 1,
14
- limit: 25,
15
- format: "json",
16
- cache: false,
17
- ...over,
18
- });
19
- describe("parseDepartRange", () => {
20
- it("splits START:END into trimmed dates", () => {
21
- expect(parseDepartRange("2026-08-01:2026-08-31")).toEqual({
22
- from: "2026-08-01",
23
- to: "2026-08-31",
24
- });
25
- });
26
- it("rejects a range without exactly two parts", () => {
27
- expect(() => parseDepartRange("2026-08-01")).toThrow(/START:END/);
28
- });
29
- it("rejects a malformed date in the range", () => {
30
- expect(() => parseDepartRange("2026/08/01:2026-08-31")).toThrow(/must be a valid date/);
31
- });
32
- });
33
- describe("runCalendarCommand validation/wiring", () => {
34
- it("builds a calendar spec and uppercases airports", async () => {
35
- captured.length = 0;
36
- await runCalendarCommand("bos", "lax", opts({ tripLength: 5 }));
37
- expect(captured[0]).toMatchObject({
38
- origin: "BOS",
39
- dest: "LAX",
40
- departFrom: "2026-08-01",
41
- departTo: "2026-08-31",
42
- tripLength: 5,
43
- });
44
- });
45
- it("rejects a start after the end", async () => {
46
- await expect(runCalendarCommand("BOS", "LAX", opts({ departRange: "2026-08-31:2026-08-01" }))).rejects.toThrow(/start must be on or before end/);
47
- });
48
- it("rejects a negative --trip-length", async () => {
49
- await expect(runCalendarCommand("BOS", "LAX", opts({ tripLength: -1 }))).rejects.toThrow(/--trip-length must be an integer >= 0/);
50
- });
51
- it("rejects a non-numeric --trip-length (NaN)", async () => {
52
- await expect(runCalendarCommand("BOS", "LAX", opts({ tripLength: NaN }))).rejects.toThrow(/--trip-length must be an integer >= 0/);
53
- });
54
- it("rejects an invalid --limit", async () => {
55
- await expect(runCalendarCommand("BOS", "LAX", opts({ limit: 0 }))).rejects.toThrow(/--limit must be an integer >= 1/);
56
- });
57
- });
58
- //# sourceMappingURL=calendar.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calendar.test.js","sourceRoot":"","sources":["../../src/commands/calendar.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import { type Slice } from "../model/spec.js";
2
- import { type CacheControlOptions, type OutputFormat } from "./shared.js";
3
- export interface MultiCityCommandOptions extends CacheControlOptions {
4
- legs: string[];
5
- adults: number;
6
- limit: number;
7
- cabin?: string;
8
- stops?: string;
9
- extraStops?: string;
10
- routing?: string;
11
- ext?: string;
12
- format: OutputFormat;
13
- headful?: boolean;
14
- }
15
- export declare function runMultiCityCommand(opts: MultiCityCommandOptions): Promise<string>;
16
- /** Parses `--leg ORIGIN:DEST:DATE` flags into slices; `--routing`/`--ext` apply to all. */
17
- export declare function parseLegs(opts: MultiCityCommandOptions): Slice[];
@@ -1 +0,0 @@
1
- {"version":3,"file":"multicity.js","sourceRoot":"","sources":["../../src/commands/multicity.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};