1688-cli 0.1.40 → 0.1.42
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/AGENTS.md +112 -318
- package/ARCHITECTURE.md +106 -0
- package/CHANGELOG.md +107 -0
- package/README.md +100 -10
- package/dist/cli.js +165 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/cart-add.js +15 -11
- package/dist/commands/cart-add.js.map +1 -1
- package/dist/commands/cart-list.js +13 -11
- package/dist/commands/cart-list.js.map +1 -1
- package/dist/commands/compare.js +107 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/debug.js +101 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/doctor.js +107 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/image-search.js +2 -6
- package/dist/commands/image-search.js.map +1 -1
- package/dist/commands/inbox.js +16 -32
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/offer.js +7 -5
- package/dist/commands/offer.js.map +1 -1
- package/dist/commands/order-list.js +4 -2
- package/dist/commands/order-list.js.map +1 -1
- package/dist/commands/order-logistics.js +4 -2
- package/dist/commands/order-logistics.js.map +1 -1
- package/dist/commands/profile.js +84 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/research.js +142 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/search.js +157 -111
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/seller-messages.js +7 -4
- package/dist/commands/seller-messages.js.map +1 -1
- package/dist/commands/similar.js +2 -6
- package/dist/commands/similar.js.map +1 -1
- package/dist/commands/sourcing-utils.js +438 -0
- package/dist/commands/sourcing-utils.js.map +1 -0
- package/dist/commands/supplier-inspect.js +559 -0
- package/dist/commands/supplier-inspect.js.map +1 -0
- package/dist/commands/supplier-search.js +522 -0
- package/dist/commands/supplier-search.js.map +1 -0
- package/dist/daemon/client.js +2 -2
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/protocol.js +2 -1
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/io/output.js +31 -2
- package/dist/io/output.js.map +1 -1
- package/dist/session/config.js +82 -0
- package/dist/session/config.js.map +1 -0
- package/dist/session/dispatch.js +26 -3
- package/dist/session/dispatch.js.map +1 -1
- package/dist/session/events.js +151 -0
- package/dist/session/events.js.map +1 -0
- package/dist/session/im-cards.js +183 -0
- package/dist/session/im-cards.js.map +1 -0
- package/dist/session/im-ws.js +8 -5
- package/dist/session/im-ws.js.map +1 -1
- package/dist/session/navigation-guard.js +65 -0
- package/dist/session/navigation-guard.js.map +1 -0
- package/dist/session/paths.js +23 -4
- package/dist/session/paths.js.map +1 -1
- package/dist/session/search-capture.js +56 -6
- package/dist/session/search-capture.js.map +1 -1
- package/dist/session/search-mtop.js +53 -0
- package/dist/session/search-mtop.js.map +1 -1
- package/dist/session/supplier-search.js +403 -0
- package/dist/session/supplier-search.js.map +1 -0
- package/dist/util/encoding.js +8 -0
- package/dist/util/encoding.js.map +1 -0
- package/dist/util/temp.js +6 -0
- package/dist/util/temp.js.map +1 -0
- package/docs/AGENT_MAPS_PLAN.md +171 -0
- package/docs/AGENT_WORKING_PRINCIPLES.md +143 -0
- package/docs/COMMANDS.md +199 -0
- package/docs/FEATURES.md +45 -0
- package/docs/JSON_CONTRACTS.md +390 -0
- package/docs/QUALITY_SCORE.md +60 -0
- package/docs/README.md +35 -0
- package/docs/RELIABILITY.md +61 -0
- package/docs/SAFETY.md +100 -0
- package/docs/WORKFLOW.md +82 -0
- package/docs/exec-plans/README.md +9 -0
- package/docs/exec-plans/active/README.md +4 -0
- package/docs/exec-plans/completed/2026-05-28-sourcing-research-v1.md +125 -0
- package/docs/exec-plans/completed/2026-05-31-supplier-inspect-v1.md +113 -0
- package/docs/exec-plans/completed/2026-06-04-supplier-search-v1.md +81 -0
- package/docs/exec-plans/completed/2026-06-07-windows-cli-compatibility.md +138 -0
- package/docs/exec-plans/completed/README.md +4 -0
- package/docs/exec-plans/tech-debt-tracker.md +5 -0
- package/docs/generated/command-index.md +54 -0
- package/docs/generated/json-shapes.md +111 -0
- package/docs/generated/module-map.md +13 -0
- package/docs/generated/test-index.md +34 -0
- package/docs/playbooks/add-command.md +15 -0
- package/docs/playbooks/add-mtop-capture.md +13 -0
- package/docs/playbooks/change-json-output.md +11 -0
- package/docs/playbooks/debug-risk-control.md +12 -0
- package/docs/playbooks/update-cli-release.md +11 -0
- package/docs/specs/checkout-and-orders.md +30 -0
- package/docs/specs/seller-im.md +28 -0
- package/docs/specs/sourcing-research.md +186 -0
- package/docs/specs/supplier-inspect.md +144 -0
- package/docs/specs/supplier-search.md +179 -0
- package/docs/specs/windows-cli-compatibility.md +123 -0
- package/package.json +12 -2
- package/scripts/check_agent_map.mjs +86 -0
- package/scripts/fix_bin_mode.mjs +18 -0
- package/scripts/generate_agent_context.mjs +253 -0
- package/scripts/postinstall.mjs +12 -4
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { CliError } from '../io/errors.js';
|
|
2
|
+
const ALLOWED_1688_HOST_RE = /(^|\.)1688\.com$/i;
|
|
3
|
+
const ALLOWED_ALI_HOST_RE = /(^|\.)(taobao\.com|tmall\.com|alibaba\.com|alicdn\.com)$/i;
|
|
4
|
+
export function classifyNavigation(url) {
|
|
5
|
+
let parsed;
|
|
6
|
+
try {
|
|
7
|
+
parsed = new URL(url);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return { kind: 'unknown', url, host: null };
|
|
11
|
+
}
|
|
12
|
+
const host = parsed.hostname;
|
|
13
|
+
if (/punish|x5secdata/i.test(url) || /punish/i.test(host)) {
|
|
14
|
+
return { kind: 'risk_control', url, host };
|
|
15
|
+
}
|
|
16
|
+
if (/login\.(1688|taobao)\.com$/i.test(host)) {
|
|
17
|
+
return { kind: 'login', url, host };
|
|
18
|
+
}
|
|
19
|
+
if (/cashier|pay|payment|alipay/i.test(host + parsed.pathname)) {
|
|
20
|
+
return { kind: 'payment', url, host };
|
|
21
|
+
}
|
|
22
|
+
if (ALLOWED_1688_HOST_RE.test(host) || ALLOWED_ALI_HOST_RE.test(host)) {
|
|
23
|
+
return { kind: '1688', url, host };
|
|
24
|
+
}
|
|
25
|
+
return { kind: 'external', url, host };
|
|
26
|
+
}
|
|
27
|
+
export function navigationWarning(url) {
|
|
28
|
+
const details = classifyNavigation(url);
|
|
29
|
+
if (details.kind === '1688')
|
|
30
|
+
return null;
|
|
31
|
+
return {
|
|
32
|
+
code: `NAVIGATION_${details.kind.toUpperCase()}`,
|
|
33
|
+
message: messageForKind(details.kind),
|
|
34
|
+
details,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function assertSafeNavigation(url, opts) {
|
|
38
|
+
const details = classifyNavigation(url);
|
|
39
|
+
if (details.kind === '1688')
|
|
40
|
+
return;
|
|
41
|
+
if (!opts.write && details.kind !== 'payment')
|
|
42
|
+
return;
|
|
43
|
+
throw new CliError(details.kind === 'payment' ? 24 : 23, details.kind === 'payment' ? 'PAYMENT_BLOCKED' : 'UNEXPECTED_NAVIGATION', messageForKind(details.kind), {
|
|
44
|
+
currentUrl: url,
|
|
45
|
+
navigationKind: details.kind,
|
|
46
|
+
recoverHint: 'Run with --headed to inspect the page before continuing.',
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function messageForKind(kind) {
|
|
50
|
+
switch (kind) {
|
|
51
|
+
case 'login':
|
|
52
|
+
return 'Navigation reached a login page.';
|
|
53
|
+
case 'risk_control':
|
|
54
|
+
return 'Navigation reached a 1688 risk-control page.';
|
|
55
|
+
case 'payment':
|
|
56
|
+
return 'Navigation reached a payment page and was blocked.';
|
|
57
|
+
case 'external':
|
|
58
|
+
return 'Navigation reached an unexpected external domain.';
|
|
59
|
+
case 'unknown':
|
|
60
|
+
return 'Navigation target could not be parsed.';
|
|
61
|
+
case '1688':
|
|
62
|
+
return 'Navigation is within the allowed 1688 domain set.';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=navigation-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation-guard.js","sourceRoot":"","sources":["../../src/session/navigation-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/session/paths.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
4
5
|
export function root() {
|
|
5
6
|
return process.env.BB1688_HOME ?? path.join(os.homedir(), '.1688');
|
|
6
7
|
}
|
|
@@ -14,12 +15,24 @@ export function lockFile() {
|
|
|
14
15
|
return path.join(root(), '.lock');
|
|
15
16
|
}
|
|
16
17
|
export function socketPath() {
|
|
18
|
+
return socketPathForPlatform(process.platform, root());
|
|
19
|
+
}
|
|
20
|
+
export function socketPathForPlatform(platform, rootPath) {
|
|
17
21
|
// Windows: Node's net.listen()/createConnection() can't bind a Unix-style
|
|
18
|
-
// filesystem path on win32 (EACCES). Use a named pipe instead.
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
// filesystem path on win32 (EACCES). Use a named pipe instead. Include a
|
|
23
|
+
// stable root hash so different users, BB1688_HOME values, and tests do not
|
|
24
|
+
// collide on one global pipe name.
|
|
25
|
+
if (platform === 'win32') {
|
|
26
|
+
return `\\\\.\\pipe\\1688-cli-daemon-${rootHash(rootPath)}`;
|
|
21
27
|
}
|
|
22
|
-
return path.join(
|
|
28
|
+
return path.join(rootPath, 'daemon.sock');
|
|
29
|
+
}
|
|
30
|
+
export function rootHash(rootPath) {
|
|
31
|
+
return crypto
|
|
32
|
+
.createHash('sha1')
|
|
33
|
+
.update(path.resolve(rootPath).toLowerCase())
|
|
34
|
+
.digest('hex')
|
|
35
|
+
.slice(0, 12);
|
|
23
36
|
}
|
|
24
37
|
export function pidFile() {
|
|
25
38
|
return path.join(root(), 'daemon.pid');
|
|
@@ -33,6 +46,12 @@ export function daemonLogFile() {
|
|
|
33
46
|
export function runsDir() {
|
|
34
47
|
return path.join(root(), 'runs');
|
|
35
48
|
}
|
|
49
|
+
export function eventsFile() {
|
|
50
|
+
return path.join(root(), 'events.jsonl');
|
|
51
|
+
}
|
|
52
|
+
export function configFile() {
|
|
53
|
+
return path.join(root(), 'config.json');
|
|
54
|
+
}
|
|
36
55
|
export function loginQrFile() {
|
|
37
56
|
return path.join(root(), 'login-qr.png');
|
|
38
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/session/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/session/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,IAAI;IAClB,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAE,QAAgB;IAC/E,0EAA0E;IAC1E,yEAAyE;IACzE,4EAA4E;IAC5E,mCAAmC;IACnC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,gCAAgC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,OAAO,MAAM;SACV,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;SAC5C,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,YAAY,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAI,GAAG,SAAS;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -1,33 +1,72 @@
|
|
|
1
1
|
import { waitWithDeadline } from './wait.js';
|
|
2
2
|
import { SEARCH_APP_ID, parseOfferItemsFromMtopText, readSearchMtopRequestMeta, } from './search-mtop.js';
|
|
3
|
+
export async function captureSearchOffersForAction(opts, action, waitOptions) {
|
|
4
|
+
const capture = startSearchOfferCapture(opts);
|
|
5
|
+
return capture.waitForAction(action, waitOptions);
|
|
6
|
+
}
|
|
3
7
|
export function startSearchOfferCapture(opts) {
|
|
8
|
+
const maxDiagnosticsEntries = 5;
|
|
9
|
+
const startedAt = new Date().toISOString();
|
|
10
|
+
let endedAt;
|
|
4
11
|
let disposed = false;
|
|
12
|
+
let pageClosed = false;
|
|
13
|
+
let finalStatus;
|
|
14
|
+
let timedOut = false;
|
|
5
15
|
let offers = [];
|
|
6
16
|
let seenCount = 0;
|
|
7
17
|
let matchedCount = 0;
|
|
8
18
|
let parsedCount = 0;
|
|
9
|
-
let failureCount = 0;
|
|
10
19
|
let lastSeenUrl;
|
|
11
20
|
let lastMatchedUrl;
|
|
12
21
|
let lastParsedUrl;
|
|
22
|
+
let lastError;
|
|
23
|
+
const failures = [];
|
|
24
|
+
const errorInfo = (error) => {
|
|
25
|
+
if (error instanceof Error) {
|
|
26
|
+
return { name: error.name, message: error.message };
|
|
27
|
+
}
|
|
28
|
+
return { message: String(error) };
|
|
29
|
+
};
|
|
30
|
+
const recordFailure = (url, error) => {
|
|
31
|
+
const info = errorInfo(error);
|
|
32
|
+
lastError = info;
|
|
33
|
+
failures.push({
|
|
34
|
+
at: new Date().toISOString(),
|
|
35
|
+
url,
|
|
36
|
+
...info,
|
|
37
|
+
});
|
|
38
|
+
if (failures.length > maxDiagnosticsEntries)
|
|
39
|
+
failures.shift();
|
|
40
|
+
};
|
|
13
41
|
const diagnostics = () => ({
|
|
42
|
+
startedAt,
|
|
43
|
+
endedAt,
|
|
44
|
+
disposed,
|
|
45
|
+
finalStatus,
|
|
46
|
+
timedOut,
|
|
14
47
|
seenCount,
|
|
15
48
|
matchedCount,
|
|
16
49
|
parsedCount,
|
|
17
|
-
failureCount,
|
|
50
|
+
failureCount: failures.length,
|
|
18
51
|
lastSeenUrl,
|
|
19
52
|
lastMatchedUrl,
|
|
20
53
|
lastParsedUrl,
|
|
54
|
+
lastError,
|
|
55
|
+
failures: [...failures],
|
|
21
56
|
});
|
|
22
57
|
const reset = () => {
|
|
58
|
+
endedAt = undefined;
|
|
59
|
+
finalStatus = undefined;
|
|
60
|
+
timedOut = false;
|
|
23
61
|
offers = [];
|
|
24
62
|
seenCount = 0;
|
|
25
63
|
matchedCount = 0;
|
|
26
64
|
parsedCount = 0;
|
|
27
|
-
failureCount = 0;
|
|
28
65
|
lastSeenUrl = undefined;
|
|
29
66
|
lastMatchedUrl = undefined;
|
|
30
67
|
lastParsedUrl = undefined;
|
|
68
|
+
lastError = undefined;
|
|
69
|
+
failures.length = 0;
|
|
31
70
|
};
|
|
32
71
|
const onResponse = async (resp) => {
|
|
33
72
|
if (disposed)
|
|
@@ -59,19 +98,26 @@ export function startSearchOfferCapture(opts) {
|
|
|
59
98
|
parsedCount++;
|
|
60
99
|
lastParsedUrl = url;
|
|
61
100
|
}
|
|
62
|
-
catch {
|
|
63
|
-
|
|
101
|
+
catch (error) {
|
|
102
|
+
recordFailure(url, error);
|
|
64
103
|
}
|
|
65
104
|
};
|
|
105
|
+
const onClose = () => {
|
|
106
|
+
pageClosed = true;
|
|
107
|
+
finalStatus ??= 'browser_closed';
|
|
108
|
+
endedAt ??= new Date().toISOString();
|
|
109
|
+
};
|
|
66
110
|
const dispose = () => {
|
|
67
111
|
if (disposed)
|
|
68
112
|
return;
|
|
69
113
|
disposed = true;
|
|
114
|
+
endedAt ??= new Date().toISOString();
|
|
70
115
|
opts.page.off('response', onResponse);
|
|
116
|
+
opts.page.off('close', onClose);
|
|
71
117
|
};
|
|
72
118
|
const wait = async (optsWait) => {
|
|
73
119
|
const result = await waitWithDeadline(async () => {
|
|
74
|
-
if (optsWait.isClosed?.())
|
|
120
|
+
if (pageClosed || optsWait.isClosed?.())
|
|
75
121
|
return 'browser_closed';
|
|
76
122
|
if (offers.length > 0)
|
|
77
123
|
return 'captured';
|
|
@@ -85,6 +131,9 @@ export function startSearchOfferCapture(opts) {
|
|
|
85
131
|
intervalMs: optsWait.intervalMs ?? 300,
|
|
86
132
|
onTimeout: () => (offers.length > 0 ? 'captured' : 'timeout'),
|
|
87
133
|
});
|
|
134
|
+
finalStatus = result;
|
|
135
|
+
timedOut = result === 'timeout';
|
|
136
|
+
endedAt ??= new Date().toISOString();
|
|
88
137
|
return { status: result, offers, diagnostics: diagnostics() };
|
|
89
138
|
};
|
|
90
139
|
const waitForAction = async (action, optsWait) => {
|
|
@@ -103,6 +152,7 @@ export function startSearchOfferCapture(opts) {
|
|
|
103
152
|
}
|
|
104
153
|
};
|
|
105
154
|
opts.page.on('response', onResponse);
|
|
155
|
+
opts.page.on('close', onClose);
|
|
106
156
|
return {
|
|
107
157
|
reset,
|
|
108
158
|
wait,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-capture.js","sourceRoot":"","sources":["../../src/session/search-capture.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,aAAa,EACb,2BAA2B,EAC3B,yBAAyB,GAE1B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-capture.js","sourceRoot":"","sources":["../../src/session/search-capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,42 @@ export const SEARCH_APP_ID = '32517';
|
|
|
4
4
|
function bool(s) {
|
|
5
5
|
return s === 'true';
|
|
6
6
|
}
|
|
7
|
+
function parseCountText(text) {
|
|
8
|
+
if (typeof text === 'number')
|
|
9
|
+
return Number.isFinite(text) ? text : null;
|
|
10
|
+
if (!text)
|
|
11
|
+
return null;
|
|
12
|
+
const compact = text.replace(/,/g, '').replace(/\s+/g, '');
|
|
13
|
+
const match = compact.match(/(\d+(?:\.\d+)?)(万|w|W|亿|k|K)?/);
|
|
14
|
+
if (!match?.[1])
|
|
15
|
+
return null;
|
|
16
|
+
const value = Number(match[1]);
|
|
17
|
+
if (!Number.isFinite(value))
|
|
18
|
+
return null;
|
|
19
|
+
const unit = match[2] ?? '';
|
|
20
|
+
const multiplier = unit === '亿'
|
|
21
|
+
? 100000000
|
|
22
|
+
: unit === '万' || unit === 'w' || unit === 'W'
|
|
23
|
+
? 10000
|
|
24
|
+
: unit === 'k' || unit === 'K'
|
|
25
|
+
? 1000
|
|
26
|
+
: 1;
|
|
27
|
+
return Math.round(value * multiplier);
|
|
28
|
+
}
|
|
29
|
+
function parsePercentText(text) {
|
|
30
|
+
if (!text)
|
|
31
|
+
return null;
|
|
32
|
+
const match = text.match(/(\d+(?:\.\d+)?)\s*%/);
|
|
33
|
+
if (!match?.[1])
|
|
34
|
+
return null;
|
|
35
|
+
const n = Number(match[1]);
|
|
36
|
+
return Number.isFinite(n) ? n : null;
|
|
37
|
+
}
|
|
38
|
+
function textList(items) {
|
|
39
|
+
return (items ?? [])
|
|
40
|
+
.map((t) => t?.text?.trim() ?? '')
|
|
41
|
+
.filter((s) => !!s);
|
|
42
|
+
}
|
|
7
43
|
export function mapOffer(item) {
|
|
8
44
|
const d = item.data;
|
|
9
45
|
if (!d?.offerId)
|
|
@@ -16,6 +52,13 @@ export function mapOffer(item) {
|
|
|
16
52
|
const tags = (d.tags ?? [])
|
|
17
53
|
.map((t) => t?.text?.trim() ?? '')
|
|
18
54
|
.filter((s) => !!s);
|
|
55
|
+
const serviceTags = textList(d.serviceTags);
|
|
56
|
+
const productBadges = textList(d.productBadges);
|
|
57
|
+
const orderCountText = d.orderCountText ??
|
|
58
|
+
(typeof d.orderCount === 'string' ? d.orderCount : undefined) ??
|
|
59
|
+
d.bookedCount ??
|
|
60
|
+
null;
|
|
61
|
+
const repurchaseRateText = d.repurchaseRateText ?? d.repurchaseRate ?? null;
|
|
19
62
|
return {
|
|
20
63
|
offerId: d.offerId,
|
|
21
64
|
title,
|
|
@@ -40,6 +83,16 @@ export function mapOffer(item) {
|
|
|
40
83
|
superFactory: bool(d.superFactory),
|
|
41
84
|
},
|
|
42
85
|
tags,
|
|
86
|
+
...(serviceTags.length ? { serviceTags } : {}),
|
|
87
|
+
...(productBadges.length ? { productBadges } : {}),
|
|
88
|
+
demand: {
|
|
89
|
+
orderCountText,
|
|
90
|
+
orderCount: typeof d.orderCount === 'number'
|
|
91
|
+
? d.orderCount
|
|
92
|
+
: parseCountText(orderCountText),
|
|
93
|
+
repurchaseRateText,
|
|
94
|
+
repurchaseRate: parsePercentText(repurchaseRateText),
|
|
95
|
+
},
|
|
43
96
|
isP4P: bool(d.isP4P),
|
|
44
97
|
turnover: d.bookedCount ?? null,
|
|
45
98
|
url: `https://detail.1688.com/offer/${d.offerId}.html`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-mtop.js","sourceRoot":"","sources":["../../src/session/search-mtop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,oDAAoD,CAAC;AACpF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"search-mtop.js","sourceRoot":"","sources":["../../src/session/search-mtop.ts"],"names":[],"mappings":"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"}
|