cbs-4px-merchant-cli 0.0.1

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 (76) hide show
  1. package/README.4px.md +90 -0
  2. package/README.cainiao.md +90 -0
  3. package/README.md +90 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +247 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/auth.d.ts +3 -0
  8. package/dist/commands/auth.js +39 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/claim.d.ts +10 -0
  11. package/dist/commands/claim.js +69 -0
  12. package/dist/commands/claim.js.map +1 -0
  13. package/dist/commands/config.d.ts +3 -0
  14. package/dist/commands/config.js +129 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/error-handler.d.ts +5 -0
  17. package/dist/commands/error-handler.js +57 -0
  18. package/dist/commands/error-handler.js.map +1 -0
  19. package/dist/commands/label.d.ts +2 -0
  20. package/dist/commands/label.js +54 -0
  21. package/dist/commands/label.js.map +1 -0
  22. package/dist/commands/order.d.ts +2 -0
  23. package/dist/commands/order.js +91 -0
  24. package/dist/commands/order.js.map +1 -0
  25. package/dist/commands/product.d.ts +10 -0
  26. package/dist/commands/product.js +74 -0
  27. package/dist/commands/product.js.map +1 -0
  28. package/dist/commands/track.d.ts +2 -0
  29. package/dist/commands/track.js +54 -0
  30. package/dist/commands/track.js.map +1 -0
  31. package/dist/commands/update.d.ts +27 -0
  32. package/dist/commands/update.js +304 -0
  33. package/dist/commands/update.js.map +1 -0
  34. package/dist/errors.d.ts +31 -0
  35. package/dist/errors.js +58 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/generated/site.d.ts +7 -0
  38. package/dist/generated/site.js +9 -0
  39. package/dist/generated/site.js.map +1 -0
  40. package/dist/index.d.ts +2 -0
  41. package/dist/index.js +5 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/services/api-client.d.ts +20 -0
  44. package/dist/services/api-client.js +141 -0
  45. package/dist/services/api-client.js.map +1 -0
  46. package/dist/services/config-manager.d.ts +10 -0
  47. package/dist/services/config-manager.js +49 -0
  48. package/dist/services/config-manager.js.map +1 -0
  49. package/dist/services/install-detector.d.ts +17 -0
  50. package/dist/services/install-detector.js +54 -0
  51. package/dist/services/install-detector.js.map +1 -0
  52. package/dist/services/update-checker.d.ts +56 -0
  53. package/dist/services/update-checker.js +242 -0
  54. package/dist/services/update-checker.js.map +1 -0
  55. package/dist/types/index.d.ts +153 -0
  56. package/dist/types/index.js +3 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/dist/utils/logger.d.ts +15 -0
  59. package/dist/utils/logger.js +47 -0
  60. package/dist/utils/logger.js.map +1 -0
  61. package/dist/utils/output.d.ts +13 -0
  62. package/dist/utils/output.js +19 -0
  63. package/dist/utils/output.js.map +1 -0
  64. package/package.json +54 -0
  65. package/scripts/postinstall.js +184 -0
  66. package/site-meta.json +9 -0
  67. package/skill/SKILL.md +167 -0
  68. package/skill/reference/auth.md +62 -0
  69. package/skill/reference/claim.md +66 -0
  70. package/skill/reference/config.md +71 -0
  71. package/skill/reference/index.md +51 -0
  72. package/skill/reference/label.md +51 -0
  73. package/skill/reference/order.md +68 -0
  74. package/skill/reference/product.md +70 -0
  75. package/skill/reference/track.md +57 -0
  76. package/skill/reference/update.md +102 -0
@@ -0,0 +1,49 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import { AuthRequiredError } from '../errors.js';
5
+ import { BASE_URL } from '../generated/site.js';
6
+ const CONFIG_DIR = path.join(os.homedir(), '.bportal');
7
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
8
+ const DEFAULT_BASE_URL = BASE_URL;
9
+ export class ConfigManager {
10
+ async load() {
11
+ try {
12
+ const content = await fs.readFile(CONFIG_FILE, 'utf-8');
13
+ return JSON.parse(content);
14
+ }
15
+ catch {
16
+ return {};
17
+ }
18
+ }
19
+ async save(config) {
20
+ await fs.mkdir(CONFIG_DIR, { recursive: true, mode: 0o700 });
21
+ await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), {
22
+ encoding: 'utf-8',
23
+ mode: 0o600,
24
+ });
25
+ }
26
+ async set(key, value) {
27
+ const config = await this.load();
28
+ config[key] = value;
29
+ await this.save(config);
30
+ }
31
+ async get(key) {
32
+ const config = await this.load();
33
+ return config[key];
34
+ }
35
+ async resolveBaseUrl() {
36
+ return process.env['BPORTAL_BASE_URL'] || (await this.get('baseUrl')) || DEFAULT_BASE_URL;
37
+ }
38
+ async resolveApiKey() {
39
+ return process.env['BPORTAL_API_KEY'] ?? (await this.get('apiKey'));
40
+ }
41
+ async requireApiKey() {
42
+ const key = await this.resolveApiKey();
43
+ if (!key) {
44
+ throw new AuthRequiredError();
45
+ }
46
+ return key;
47
+ }
48
+ }
49
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/services/config-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,gBAAgB,GAAG,QAAQ,CAAC;AAElC,MAAM,OAAO,aAAa;IACxB,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAqB;QAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC/D,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAgC,GAAM,EAAE,KAAuB;QACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,GAAG,CAAgC,GAAM;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,gBAAgB,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Detect how the CLI was installed and whether `npm` is callable.
3
+ *
4
+ * The result drives `mc update`'s strategy:
5
+ * - method='npm' → run `npm install -g <pkg>@<version>`
6
+ * - method='manual' → print install hint, do not auto-execute
7
+ * - method='unknown' → fall back to manual flow with a softer message
8
+ */
9
+ export type InstallMethod = 'npm' | 'manual' | 'unknown';
10
+ export interface InstallInfo {
11
+ method: InstallMethod;
12
+ /** Whether `npm` is on PATH and runnable. */
13
+ npmAvailable: boolean;
14
+ /** Resolved real path of the running CLI binary (after symlinks). */
15
+ resolvedExecutable?: string;
16
+ }
17
+ export declare function detectInstall(): Promise<InstallInfo>;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Detect how the CLI was installed and whether `npm` is callable.
3
+ *
4
+ * The result drives `mc update`'s strategy:
5
+ * - method='npm' → run `npm install -g <pkg>@<version>`
6
+ * - method='manual' → print install hint, do not auto-execute
7
+ * - method='unknown' → fall back to manual flow with a softer message
8
+ */
9
+ import { execFile } from 'node:child_process';
10
+ import { realpath } from 'node:fs/promises';
11
+ import path from 'node:path';
12
+ export async function detectInstall() {
13
+ const [resolved, npmAvailable] = await Promise.all([
14
+ resolveExecutable(),
15
+ isNpmAvailable(),
16
+ ]);
17
+ let method = 'unknown';
18
+ if (resolved) {
19
+ const sep = path.sep;
20
+ if (resolved.includes(`${sep}node_modules${sep}`) ||
21
+ resolved.includes(`${sep}.npm${sep}`) ||
22
+ resolved.includes(`${sep}lib${sep}node_modules${sep}`) ||
23
+ resolved.includes(`${sep}npm-global${sep}`)) {
24
+ method = 'npm';
25
+ }
26
+ else {
27
+ method = 'manual';
28
+ }
29
+ }
30
+ const info = { method, npmAvailable };
31
+ if (resolved)
32
+ info.resolvedExecutable = resolved;
33
+ return info;
34
+ }
35
+ async function resolveExecutable() {
36
+ const exe = process.argv[1];
37
+ if (!exe)
38
+ return undefined;
39
+ try {
40
+ return await realpath(exe);
41
+ }
42
+ catch {
43
+ return exe;
44
+ }
45
+ }
46
+ function isNpmAvailable() {
47
+ return new Promise((resolve) => {
48
+ const cmd = process.platform === 'win32' ? 'npm.cmd' : 'npm';
49
+ execFile(cmd, ['--version'], { timeout: 3000 }, (err) => {
50
+ resolve(!err);
51
+ });
52
+ });
53
+ }
54
+ //# sourceMappingURL=install-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-detector.js","sourceRoot":"","sources":["../../src/services/install-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,iBAAiB,EAAE;QACnB,cAAc,EAAE;KACjB,CAAC,CAAC;IAEH,IAAI,MAAM,GAAkB,SAAS,CAAC;IACtC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IACE,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,eAAe,GAAG,EAAE,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC;YACrC,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,MAAM,GAAG,eAAe,GAAG,EAAE,CAAC;YACtD,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,aAAa,GAAG,EAAE,CAAC,EAC3C,CAAC;YACD,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACnD,IAAI,QAAQ;QAAE,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,iBAAiB;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,QAAQ,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YACtD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Update checker — talks to the npm registry to discover new CLI versions.
3
+ *
4
+ * Two-tier API (modeled after lark-cli):
5
+ * - checkCachedSync(): zero-latency, returns cached newer version if any
6
+ * - refreshCache(): fire-and-forget, refreshes cache on TTL miss
7
+ *
8
+ * Network strategy:
9
+ * - Always axios.get(<registry>/<pkg>) directly. Do NOT shell out to
10
+ * `npm view`, because users may have .npmrc pinned to a registry that
11
+ * differs from our build-time registry.
12
+ * - Registry source priority: BPORTAL_REGISTRY env > generated REGISTRY const.
13
+ */
14
+ export interface UpdateState {
15
+ registry: string;
16
+ package: string;
17
+ tag: string;
18
+ lastChecked: number;
19
+ latestVersion?: string;
20
+ /** The version we ran before the most recent successful upgrade — used by --rollback. */
21
+ previousVersion?: string;
22
+ /** The version that was current at the time of the last cache write. */
23
+ currentVersion?: string;
24
+ }
25
+ export declare function getRegistry(): string;
26
+ export declare function getPackageName(): string;
27
+ export declare function readStateSync(): UpdateState | null;
28
+ export declare function writeStateSync(state: UpdateState): void;
29
+ /**
30
+ * Returns true if `a` is strictly newer than `b`. Supports prerelease tags.
31
+ * Accepts both "1.2.3" and "v1.2.3".
32
+ */
33
+ export declare function isNewer(a: string, b: string): boolean;
34
+ export declare function semverCompare(a: string, b: string): number;
35
+ /**
36
+ * Fetch the version associated with a dist-tag from the npm registry.
37
+ * Returns null on any failure (network, 404, malformed body).
38
+ */
39
+ export declare function fetchTagVersion(tag?: string, timeoutMs?: number): Promise<string | null>;
40
+ export declare function shouldSkipPassiveCheck(currentVersion: string): boolean;
41
+ /**
42
+ * Synchronously check the cache for a newer version. Zero network calls.
43
+ * Returns the newer version string, or null when up-to-date / cache invalid.
44
+ */
45
+ export declare function checkCachedSync(currentVersion: string): string | null;
46
+ /**
47
+ * Fire-and-forget background refresh. Safe to call from preAction hook —
48
+ * never awaits, never throws, never blocks the user's command.
49
+ */
50
+ export declare function refreshCache(currentVersion: string, tag?: string): void;
51
+ /**
52
+ * Persist the result of a successful explicit upgrade so that:
53
+ * 1. The next session's banner sees current cache as up-to-date.
54
+ * 2. `--rollback` (future) knows what the previous version was.
55
+ */
56
+ export declare function recordUpgrade(fromVersion: string, toVersion: string, tag: string): void;
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Update checker — talks to the npm registry to discover new CLI versions.
3
+ *
4
+ * Two-tier API (modeled after lark-cli):
5
+ * - checkCachedSync(): zero-latency, returns cached newer version if any
6
+ * - refreshCache(): fire-and-forget, refreshes cache on TTL miss
7
+ *
8
+ * Network strategy:
9
+ * - Always axios.get(<registry>/<pkg>) directly. Do NOT shell out to
10
+ * `npm view`, because users may have .npmrc pinned to a registry that
11
+ * differs from our build-time registry.
12
+ * - Registry source priority: BPORTAL_REGISTRY env > generated REGISTRY const.
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
15
+ import { homedir } from 'node:os';
16
+ import path from 'node:path';
17
+ import axios from 'axios';
18
+ import { PACKAGE_NAME, REGISTRY } from '../generated/site.js';
19
+ const STATE_DIR = path.join(homedir(), '.bportal');
20
+ const STATE_FILE = path.join(STATE_DIR, 'update-state.json');
21
+ const TTL_MS = 24 * 60 * 60 * 1000; // 24h
22
+ const FETCH_TIMEOUT_MS = 5000;
23
+ const PASSIVE_FETCH_TIMEOUT_MS = 3000;
24
+ export function getRegistry() {
25
+ const env = process.env['BPORTAL_REGISTRY'];
26
+ return (env && env.trim()) || REGISTRY;
27
+ }
28
+ export function getPackageName() {
29
+ return PACKAGE_NAME;
30
+ }
31
+ // ────────────────────────── State persistence ──────────────────────────
32
+ export function readStateSync() {
33
+ try {
34
+ if (!existsSync(STATE_FILE))
35
+ return null;
36
+ const raw = readFileSync(STATE_FILE, 'utf-8');
37
+ return JSON.parse(raw);
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ export function writeStateSync(state) {
44
+ try {
45
+ mkdirSync(STATE_DIR, { recursive: true, mode: 0o700 });
46
+ writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), {
47
+ encoding: 'utf-8',
48
+ mode: 0o600,
49
+ });
50
+ }
51
+ catch {
52
+ /* best-effort, never throw from cache writer */
53
+ }
54
+ }
55
+ // ────────────────────────── SemVer comparison ──────────────────────────
56
+ /**
57
+ * Returns true if `a` is strictly newer than `b`. Supports prerelease tags.
58
+ * Accepts both "1.2.3" and "v1.2.3".
59
+ */
60
+ export function isNewer(a, b) {
61
+ return semverCompare(a, b) > 0;
62
+ }
63
+ export function semverCompare(a, b) {
64
+ const pa = parseSemver(a);
65
+ const pb = parseSemver(b);
66
+ if (!pa || !pb)
67
+ return 0;
68
+ for (let i = 0; i < 3; i++) {
69
+ const da = pa.main[i];
70
+ const db = pb.main[i];
71
+ if (da !== db)
72
+ return da - db;
73
+ }
74
+ // No prerelease > has prerelease (1.0.0 > 1.0.0-rc.1)
75
+ if (!pa.pre && pb.pre)
76
+ return 1;
77
+ if (pa.pre && !pb.pre)
78
+ return -1;
79
+ if (!pa.pre && !pb.pre)
80
+ return 0;
81
+ const ap = pa.pre.split('.');
82
+ const bp = pb.pre.split('.');
83
+ const len = Math.max(ap.length, bp.length);
84
+ for (let i = 0; i < len; i++) {
85
+ const x = ap[i];
86
+ const y = bp[i];
87
+ if (x === undefined)
88
+ return -1;
89
+ if (y === undefined)
90
+ return 1;
91
+ const xn = /^\d+$/.test(x) ? parseInt(x, 10) : NaN;
92
+ const yn = /^\d+$/.test(y) ? parseInt(y, 10) : NaN;
93
+ if (!isNaN(xn) && !isNaN(yn)) {
94
+ if (xn !== yn)
95
+ return xn - yn;
96
+ }
97
+ else if (!isNaN(xn)) {
98
+ return -1; // numeric < alphanumeric
99
+ }
100
+ else if (!isNaN(yn)) {
101
+ return 1;
102
+ }
103
+ else if (x !== y) {
104
+ return x < y ? -1 : 1;
105
+ }
106
+ }
107
+ return 0;
108
+ }
109
+ function parseSemver(v) {
110
+ const cleaned = v.replace(/^v/, '').trim();
111
+ const m = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(cleaned);
112
+ if (!m)
113
+ return null;
114
+ return {
115
+ main: [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)],
116
+ pre: m[4],
117
+ };
118
+ }
119
+ // ────────────────────────── Network fetch ──────────────────────────
120
+ /**
121
+ * Fetch the version associated with a dist-tag from the npm registry.
122
+ * Returns null on any failure (network, 404, malformed body).
123
+ */
124
+ export async function fetchTagVersion(tag = 'latest', timeoutMs = FETCH_TIMEOUT_MS) {
125
+ const registry = getRegistry().replace(/\/$/, '');
126
+ // Use the per-version endpoint when possible — far cheaper than the full
127
+ // packument endpoint that returns ALL versions and dist-tags.
128
+ // npm registry honors GET /<pkg>/<tag-or-version> and returns just that view.
129
+ const url = `${registry}/${encodeNpmName(PACKAGE_NAME)}/${encodeURIComponent(tag)}`;
130
+ try {
131
+ const res = await axios.get(url, {
132
+ timeout: timeoutMs,
133
+ headers: { Accept: 'application/json' },
134
+ validateStatus: () => true,
135
+ });
136
+ if (res.status !== 200 || !res.data)
137
+ return null;
138
+ const data = res.data;
139
+ return typeof data.version === 'string' ? data.version : null;
140
+ }
141
+ catch {
142
+ return null;
143
+ }
144
+ }
145
+ /**
146
+ * `@scope/name` must be encoded as `@scope%2Fname` for the registry path,
147
+ * but the leading `@` should NOT be percent-encoded.
148
+ */
149
+ function encodeNpmName(name) {
150
+ if (name.startsWith('@')) {
151
+ const slash = name.indexOf('/');
152
+ if (slash > 0) {
153
+ return name.slice(0, slash) + '%2F' + name.slice(slash + 1);
154
+ }
155
+ }
156
+ return name;
157
+ }
158
+ // ────────────────────────── Passive check (banner) ──────────────────────────
159
+ export function shouldSkipPassiveCheck(currentVersion) {
160
+ if (process.env['BPORTAL_NO_UPDATE_NOTIFIER'])
161
+ return true;
162
+ if (process.env['CI'])
163
+ return true;
164
+ if (process.env['NODE_ENV'] === 'test')
165
+ return true;
166
+ if (!process.stderr.isTTY)
167
+ return true;
168
+ // Skip when running from source / unreleased builds (e.g. "0.0.0-dev" or git sha)
169
+ if (!/^\d+\.\d+\.\d+/.test(currentVersion))
170
+ return true;
171
+ return false;
172
+ }
173
+ /**
174
+ * Synchronously check the cache for a newer version. Zero network calls.
175
+ * Returns the newer version string, or null when up-to-date / cache invalid.
176
+ */
177
+ export function checkCachedSync(currentVersion) {
178
+ const state = readStateSync();
179
+ if (!state || !state.latestVersion)
180
+ return null;
181
+ // Cache invalidated when registry / tag / package changed
182
+ if (state.registry !== getRegistry())
183
+ return null;
184
+ if (state.package !== PACKAGE_NAME)
185
+ return null;
186
+ if (!isNewer(state.latestVersion, currentVersion))
187
+ return null;
188
+ return state.latestVersion;
189
+ }
190
+ /**
191
+ * Fire-and-forget background refresh. Safe to call from preAction hook —
192
+ * never awaits, never throws, never blocks the user's command.
193
+ */
194
+ export function refreshCache(currentVersion, tag = 'latest') {
195
+ if (shouldSkipPassiveCheck(currentVersion))
196
+ return;
197
+ const state = readStateSync();
198
+ const fresh = state &&
199
+ state.registry === getRegistry() &&
200
+ state.package === PACKAGE_NAME &&
201
+ state.tag === tag &&
202
+ Date.now() - state.lastChecked < TTL_MS;
203
+ if (fresh)
204
+ return;
205
+ // fire-and-forget; unhandled rejections are swallowed
206
+ void (async () => {
207
+ try {
208
+ const latest = await fetchTagVersion(tag, PASSIVE_FETCH_TIMEOUT_MS);
209
+ if (!latest)
210
+ return;
211
+ writeStateSync({
212
+ registry: getRegistry(),
213
+ package: PACKAGE_NAME,
214
+ tag,
215
+ lastChecked: Date.now(),
216
+ latestVersion: latest,
217
+ currentVersion,
218
+ previousVersion: state?.previousVersion,
219
+ });
220
+ }
221
+ catch {
222
+ /* swallow */
223
+ }
224
+ })();
225
+ }
226
+ /**
227
+ * Persist the result of a successful explicit upgrade so that:
228
+ * 1. The next session's banner sees current cache as up-to-date.
229
+ * 2. `--rollback` (future) knows what the previous version was.
230
+ */
231
+ export function recordUpgrade(fromVersion, toVersion, tag) {
232
+ writeStateSync({
233
+ registry: getRegistry(),
234
+ package: PACKAGE_NAME,
235
+ tag,
236
+ lastChecked: Date.now(),
237
+ latestVersion: toVersion,
238
+ currentVersion: toVersion,
239
+ previousVersion: fromVersion,
240
+ });
241
+ }
242
+ //# sourceMappingURL=update-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACnD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;AAC7D,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,MAAM;AAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,wBAAwB,GAAG,IAAI,CAAC;AActC,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,0EAA0E;AAE1E,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAkB;IAC/C,IAAI,CAAC;QACH,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YACxD,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,gDAAgD;IAClD,CAAC;AACH,CAAC;AAED,0EAA0E;AAE1E;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,CAAS,EAAE,CAAS;IAC1C,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC;IAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,sDAAsD;IACtD,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,EAAE,CAAC,GAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,IAAI,EAAE,KAAK,EAAE;gBAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,CAAC,CAAC,yBAAyB;QACtC,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,CAAC,GAAG,4CAA4C,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;QACrE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KACV,CAAC;AACJ,CAAC;AAED,sEAAsE;AAEtE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAG,GAAG,QAAQ,EACd,SAAS,GAAG,gBAAgB;IAE5B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAClD,yEAAyE;IACzE,8DAA8D;IAC9D,8EAA8E;IAC9E,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;IACpF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YAC/B,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI;SAC3B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACjD,MAAM,IAAI,GAAG,GAAG,CAAC,IAA4B,CAAC;QAC9C,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+EAA+E;AAE/E,MAAM,UAAU,sBAAsB,CAAC,cAAsB;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACpD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACvC,kFAAkF;IAClF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,cAAsB;IACpD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,IAAI,CAAC;IAChD,0DAA0D;IAC1D,IAAI,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,KAAK,CAAC,aAAa,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,cAAsB,EAAE,GAAG,GAAG,QAAQ;IACjE,IAAI,sBAAsB,CAAC,cAAc,CAAC;QAAE,OAAO;IAEnD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GACT,KAAK;QACL,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE;QAChC,KAAK,CAAC,OAAO,KAAK,YAAY;QAC9B,KAAK,CAAC,GAAG,KAAK,GAAG;QACjB,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC;IAC1C,IAAI,KAAK;QAAE,OAAO;IAElB,sDAAsD;IACtD,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC;YACpE,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,cAAc,CAAC;gBACb,QAAQ,EAAE,WAAW,EAAE;gBACvB,OAAO,EAAE,YAAY;gBACrB,GAAG;gBACH,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,aAAa,EAAE,MAAM;gBACrB,cAAc;gBACd,eAAe,EAAE,KAAK,EAAE,eAAe;aACxC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,WAAmB,EACnB,SAAiB,EACjB,GAAW;IAEX,cAAc,CAAC;QACb,QAAQ,EAAE,WAAW,EAAE;QACvB,OAAO,EAAE,YAAY;QACrB,GAAG;QACH,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;QACvB,aAAa,EAAE,SAAS;QACxB,cAAc,EAAE,SAAS;QACzB,eAAe,EAAE,WAAW;KAC7B,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,153 @@
1
+ export interface GlobalOptions {
2
+ output?: string;
3
+ verbose?: boolean;
4
+ dryRun?: boolean;
5
+ }
6
+ export interface BportalConfig {
7
+ baseUrl?: string;
8
+ apiKey?: string;
9
+ }
10
+ export interface StandardResponse<T> {
11
+ success: boolean;
12
+ errCode: string;
13
+ errMsg: string;
14
+ data: T | null;
15
+ }
16
+ export interface TrackData {
17
+ tkLocation: string;
18
+ tkDesc: string;
19
+ tkDate: string;
20
+ sort: number;
21
+ }
22
+ export interface TrackDetailDTO {
23
+ orderNo: string;
24
+ ctEndName: string;
25
+ ctStartName: string;
26
+ lastTrack: TrackData | null;
27
+ trackList: TrackData[];
28
+ chatReplay: string | null;
29
+ }
30
+ export interface OrderVO {
31
+ id: number;
32
+ serverOrderNo: string;
33
+ changedOrderNo: string | null;
34
+ coFpxTrackNo: string | null;
35
+ productCode: string;
36
+ originCountry: string;
37
+ destinationCountry: string;
38
+ status: string;
39
+ createdTime: string | null;
40
+ grossWeight: number | null;
41
+ chargeWeight: number | null;
42
+ }
43
+ export interface LabelPrintDTO {
44
+ orderDTO: OrderVO | null;
45
+ pdfUrl: string | null;
46
+ chatReplay: string | null;
47
+ }
48
+ export interface ShipperConsigneeVO {
49
+ orderId: number;
50
+ consigneeName: string | null;
51
+ consigneeAddress1: string | null;
52
+ consigneeAddress2: string | null;
53
+ consigneePostcode: string | null;
54
+ consigneeTelephone: string | null;
55
+ consigneeMobile: string | null;
56
+ consigneeCountry: string | null;
57
+ consigneeCity: string | null;
58
+ consigneeProvince: string | null;
59
+ shipperName: string | null;
60
+ shipperCountry: string | null;
61
+ }
62
+ export interface DeclareInvoiceVO {
63
+ orderId: number;
64
+ invoiceId: number;
65
+ ename: string | null;
66
+ cname: string | null;
67
+ totalPrice: number | null;
68
+ currency: string | null;
69
+ }
70
+ export interface BillingFeeItemDetailVO {
71
+ feeName: string | null;
72
+ billingNumber: string | null;
73
+ originalPrice: string | null;
74
+ couponAmount: string | null;
75
+ calculateAmount: string | null;
76
+ billingStatus: string | null;
77
+ currencyCode: string | null;
78
+ billingSuccessDateStr: string | null;
79
+ }
80
+ export interface OrderDetailResp {
81
+ orderDTO: OrderVO | null;
82
+ shipperConsigneeDTO: ShipperConsigneeVO | null;
83
+ declareList: DeclareInvoiceVO[];
84
+ feeDetailList: BillingFeeItemDetailVO[];
85
+ totalFee: string | null;
86
+ weightFee: number | null;
87
+ chatReplay: string | null;
88
+ }
89
+ export interface ProductRecommendRequest {
90
+ country: string;
91
+ startCity?: string;
92
+ weight?: number;
93
+ postCode?: string;
94
+ isBattery?: string;
95
+ declareValue?: number;
96
+ }
97
+ export interface RecommendProductItem {
98
+ productName: string;
99
+ productCode: string;
100
+ productCategory: string | null;
101
+ productIntroduce: string | null;
102
+ trackingType: string | null;
103
+ isBattery: string | null;
104
+ serviceLevel: string | null;
105
+ deliveryPeriod: string | null;
106
+ totalRmbAmount: string | null;
107
+ freightRmbAmount: string | null;
108
+ freightOilRmbAmount: string | null;
109
+ incidentalRmbAmount: string | null;
110
+ chargeWeight: string | null;
111
+ volumeWeight: string | null;
112
+ recommendTag: string | null;
113
+ isRecommend: boolean;
114
+ maxWeight: string | null;
115
+ minWeight: string | null;
116
+ }
117
+ export interface ProductRecommendDTO {
118
+ recommendProducts: RecommendProductItem[];
119
+ country: string;
120
+ countryName: string | null;
121
+ chatReplay: string | null;
122
+ }
123
+ export interface ClaimListRequest {
124
+ createdStartTime?: string;
125
+ createdEndTime?: string;
126
+ claimStatus?: string;
127
+ bizNoList?: string;
128
+ pageNum?: number;
129
+ pageSize?: number;
130
+ }
131
+ export interface ClaimResp {
132
+ claimId: string;
133
+ claimNo: string;
134
+ bizNo: string;
135
+ bizType: string | null;
136
+ claimReason: string | null;
137
+ claimReasonName: string | null;
138
+ cargoPaymentCompensationAmount: string | null;
139
+ servicePaymentCompensationAmount: string | null;
140
+ currency: string | null;
141
+ claimStatus: string | null;
142
+ claimStatusName: string | null;
143
+ latestFeedback: string | null;
144
+ createdTime: string | null;
145
+ lastModifiedTime: string | null;
146
+ servicePaymentInfo: string | null;
147
+ }
148
+ export interface ClaimListResp {
149
+ pageNum: number;
150
+ pageSize: number;
151
+ total: number;
152
+ list: ClaimResp[];
153
+ }
@@ -0,0 +1,3 @@
1
+ // ==================== Global CLI Options ====================
2
+ export {};
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,+DAA+D"}
@@ -0,0 +1,15 @@
1
+ import { type Ora } from 'ora';
2
+ /**
3
+ * All non-data output goes to stderr.
4
+ * stdout is reserved exclusively for JSON data envelopes.
5
+ */
6
+ export declare function createSpinner(text: string): Ora;
7
+ export declare function info(message: string): void;
8
+ export declare function success(message: string): void;
9
+ export declare function warn(message: string): void;
10
+ export declare function error(message: string): void;
11
+ /**
12
+ * Print JSON data to stdout — the ONLY function allowed to write to stdout.
13
+ * Syntax highlighting is applied only in TTY mode; pipes get raw JSON.
14
+ */
15
+ export declare function logJson(data: unknown): void;
@@ -0,0 +1,47 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ /**
4
+ * All non-data output goes to stderr.
5
+ * stdout is reserved exclusively for JSON data envelopes.
6
+ */
7
+ export function createSpinner(text) {
8
+ return ora({ text, color: 'cyan', stream: process.stderr });
9
+ }
10
+ export function info(message) {
11
+ process.stderr.write(chalk.cyan('ℹ') + ' ' + message + '\n');
12
+ }
13
+ export function success(message) {
14
+ process.stderr.write(chalk.green('✔') + ' ' + message + '\n');
15
+ }
16
+ export function warn(message) {
17
+ process.stderr.write(chalk.yellow('⚠') + ' ' + message + '\n');
18
+ }
19
+ export function error(message) {
20
+ process.stderr.write(chalk.red('✖') + ' ' + message + '\n');
21
+ }
22
+ /**
23
+ * Print JSON data to stdout — the ONLY function allowed to write to stdout.
24
+ * Syntax highlighting is applied only in TTY mode; pipes get raw JSON.
25
+ */
26
+ export function logJson(data) {
27
+ const str = JSON.stringify(data, null, 2);
28
+ if (!process.stdout.isTTY) {
29
+ process.stdout.write(str + '\n');
30
+ return;
31
+ }
32
+ // Simple syntax highlighting for human consumption in TTY
33
+ const highlighted = str.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, (match) => {
34
+ if (/^"/.test(match)) {
35
+ if (/:$/.test(match))
36
+ return chalk.cyan(match);
37
+ return chalk.green(match);
38
+ }
39
+ if (/true|false/.test(match))
40
+ return chalk.yellow(match);
41
+ if (/null/.test(match))
42
+ return chalk.gray(match);
43
+ return chalk.yellow(match);
44
+ });
45
+ process.stdout.write(highlighted + '\n');
46
+ }
47
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC;;;GAGG;AAEH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,OAAe;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe;IACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,IAAa;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACjC,OAAO;IACT,CAAC;IACD,0DAA0D;IAC1D,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAC7B,wGAAwG,EACxG,CAAC,KAAK,EAAE,EAAE;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC"}