@skrillex1224/playwright-toolkit 2.1.49 → 2.1.51

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/browser.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './index.d.ts';
2
+
3
+ export declare function usePlaywrightToolKit(): BrowserModule;
package/dist/browser.js CHANGED
@@ -1,4 +1,10 @@
1
- // src/logger.js
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ // src/internals/logger.js
2
8
  var formatLine = (prefix, icon, message) => {
3
9
  const parts = [];
4
10
  if (prefix) parts.push(`[${prefix}]`);
@@ -12,22 +18,22 @@ var fallbackLog = {
12
18
  error: (...args) => console.error(...args),
13
19
  debug: (...args) => console.debug ? console.debug(...args) : console.log(...args)
14
20
  };
15
- var resolveLogMethod = (logger, name) => {
16
- if (logger && typeof logger[name] === "function") {
17
- return logger[name].bind(logger);
21
+ var resolveLogMethod = (logger2, name) => {
22
+ if (logger2 && typeof logger2[name] === "function") {
23
+ return logger2[name].bind(logger2);
18
24
  }
19
- if (name === "warning" && logger && typeof logger.warn === "function") {
20
- return logger.warn.bind(logger);
25
+ if (name === "warning" && logger2 && typeof logger2.warn === "function") {
26
+ return logger2.warn.bind(logger2);
21
27
  }
22
28
  return fallbackLog[name];
23
29
  };
24
30
  var defaultLogger = null;
25
- var setDefaultLogger = (logger) => {
26
- defaultLogger = logger;
31
+ var setDefaultLogger = (logger2) => {
32
+ defaultLogger = logger2;
27
33
  };
28
- var resolveLogger = (logger) => {
29
- if (logger && typeof logger.info === "function") {
30
- return logger;
34
+ var resolveLogger = (explicitLogger) => {
35
+ if (explicitLogger && typeof explicitLogger.info === "function") {
36
+ return explicitLogger;
31
37
  }
32
38
  if (defaultLogger && typeof defaultLogger.info === "function") {
33
39
  return defaultLogger;
@@ -43,31 +49,62 @@ var ANSI = {
43
49
  blue: "\x1B[34m",
44
50
  cyan: "\x1B[36m"
45
51
  };
46
- var stripAnsi = (input) => {
47
- if (!input) return "";
48
- return String(input).replace(/\x1b\[[0-9;]*m/g, "");
49
- };
50
52
  var colorize = (text, color) => {
51
53
  if (!text || !color) return text;
52
54
  return `${color}${text}${ANSI.reset}`;
53
55
  };
54
- var createBaseLogger = (prefix = "", logger) => {
56
+ var createBaseLogger = (prefix = "", explicitLogger) => {
55
57
  const name = prefix ? String(prefix) : "";
56
- const targetLogger = resolveLogger(logger);
57
- const info = resolveLogMethod(targetLogger, "info");
58
- const warning = resolveLogMethod(targetLogger, "warning");
59
- const error = resolveLogMethod(targetLogger, "error");
60
- const debug = resolveLogMethod(targetLogger, "debug");
58
+ const dispatch = (methodName, icon, message, color) => {
59
+ const logger2 = resolveLogger(explicitLogger);
60
+ const logFn = resolveLogMethod(logger2, methodName);
61
+ logFn(colorize(formatLine(name, icon, message), color));
62
+ };
61
63
  return {
62
- info: (message) => info(colorize(formatLine(name, "\u{1F4D6}", message), ANSI.cyan)),
63
- success: (message) => info(colorize(formatLine(name, "\u2705", message), ANSI.green)),
64
- warning: (message) => warning(colorize(formatLine(name, "\u26A0\uFE0F", message), ANSI.yellow)),
65
- warn: (message) => warning(colorize(formatLine(name, "\u26A0\uFE0F", message), ANSI.yellow)),
66
- error: (message) => error(colorize(formatLine(name, "\u274C", message), ANSI.red)),
67
- debug: (message) => debug(colorize(formatLine(name, "\u{1F539}", message), ANSI.gray)),
68
- start: (message) => info(colorize(formatLine(name, "\u{1F537}", message), ANSI.blue))
64
+ info: (message) => dispatch("info", "\u{1F4D6}", message, ANSI.cyan),
65
+ success: (message) => dispatch("info", "\u2705", message, ANSI.green),
66
+ warning: (message) => dispatch("warning", "\u26A0\uFE0F", message, ANSI.yellow),
67
+ warn: (message) => dispatch("warning", "\u26A0\uFE0F", message, ANSI.yellow),
68
+ error: (message) => dispatch("error", "\u274C", message, ANSI.red),
69
+ debug: (message) => dispatch("debug", "\u{1F539}", message, ANSI.gray),
70
+ start: (message) => dispatch("info", "\u{1F537}", message, ANSI.blue)
69
71
  };
70
72
  };
73
+ function createInternalLogger(moduleName, explicitLogger) {
74
+ const baseLogger = createBaseLogger(moduleName, explicitLogger);
75
+ return {
76
+ start(methodName, params = "") {
77
+ const paramStr = params ? ` (${params})` : "";
78
+ baseLogger.start(`${methodName} \u5F00\u59CB${paramStr}`);
79
+ },
80
+ success(methodName, result = "") {
81
+ const resultStr = result ? ` (${result})` : "";
82
+ baseLogger.success(`${methodName} \u5B8C\u6210${resultStr}`);
83
+ },
84
+ fail(methodName, error) {
85
+ const message = error instanceof Error ? error.message : error;
86
+ baseLogger.error(`${methodName} \u5931\u8D25: ${message}`);
87
+ },
88
+ debug(message) {
89
+ baseLogger.debug(message);
90
+ },
91
+ warn(message) {
92
+ baseLogger.warning(message);
93
+ },
94
+ warning(message) {
95
+ baseLogger.warning(message);
96
+ },
97
+ info(message) {
98
+ baseLogger.info(message);
99
+ }
100
+ };
101
+ }
102
+
103
+ // src/logger.js
104
+ var stripAnsi = (input) => {
105
+ if (!input) return "";
106
+ return String(input).replace(/\x1b\[[0-9;]*m/g, "");
107
+ };
71
108
  var STEP_PREFIX = "\u6B65\u9AA4:";
72
109
  var STEP_SEPARATOR = " | ";
73
110
  var STEP_EMOJIS = [
@@ -762,9 +799,9 @@ var createTemplateLogger = (baseLogger = createBaseLogger()) => {
762
799
  ...definitionMethods
763
800
  };
764
801
  };
765
- var getDefaultBaseLogger = () => createBaseLogger("", defaultLogger);
802
+ var getDefaultBaseLogger = () => createBaseLogger("");
766
803
  var Logger = {
767
- setLogger: (logger) => setDefaultLogger(logger),
804
+ setLogger: (logger2) => setDefaultLogger(logger2),
768
805
  info: (message) => getDefaultBaseLogger().info(message),
769
806
  success: (message) => getDefaultBaseLogger().success(message),
770
807
  warning: (message) => getDefaultBaseLogger().warning(message),
@@ -772,19 +809,272 @@ var Logger = {
772
809
  error: (message) => getDefaultBaseLogger().error(message),
773
810
  debug: (message) => getDefaultBaseLogger().debug(message),
774
811
  start: (message) => getDefaultBaseLogger().start(message),
775
- useTemplate: (logger) => createTemplateLogger(createBaseLogger("", logger || defaultLogger))
812
+ useTemplate: (logger2) => {
813
+ if (logger2) return createTemplateLogger(createBaseLogger("", logger2));
814
+ return createTemplateLogger();
815
+ }
816
+ };
817
+
818
+ // src/browser-onlys/index.js
819
+ var browser_onlys_exports = {};
820
+ __export(browser_onlys_exports, {
821
+ PLATFORM_CONFIG: () => PLATFORM_CONFIG,
822
+ TokenForm: () => TokenForm
823
+ });
824
+
825
+ // src/utils.js
826
+ import delay from "delay";
827
+ var logger = createInternalLogger("Utils");
828
+ var Utils = {
829
+ /**
830
+ * 解析 Cookie 字符串为 Playwright 格式的 Cookie 数组
831
+ * @param {string} cookieString - Cookie 字符串
832
+ * @param {string} [domain] - Cookie 域名 (可选)
833
+ * @returns {Array} Cookie 数组
834
+ */
835
+ parseCookies(cookieString, domain) {
836
+ const cookies = [];
837
+ const pairs = cookieString.split(";").map((c) => c.trim());
838
+ for (const pair of pairs) {
839
+ const [name, ...valueParts] = pair.split("=");
840
+ if (name && valueParts.length > 0) {
841
+ const cookie = {
842
+ name: name.trim(),
843
+ value: valueParts.join("=").trim(),
844
+ path: "/"
845
+ };
846
+ if (domain) {
847
+ cookie.domain = domain;
848
+ }
849
+ cookies.push(cookie);
850
+ }
851
+ }
852
+ logger.success("parseCookies", `parsed ${cookies.length} cookies`);
853
+ return cookies;
854
+ },
855
+ /**
856
+ * 全页面滚动截图
857
+ * 自动检测页面所有可滚动元素,取最大高度,强制展开后截图
858
+ *
859
+ * @param {import('playwright').Page} page - Playwright page 对象
860
+ * @param {Object} [options] - 配置选项
861
+ * @param {number} [options.buffer] - 额外缓冲高度 (默认: 视口高度的一半)
862
+ * @param {boolean} [options.restore] - 截图后是否恢复页面高度和样式 (默认: false)
863
+ * @param {number} [options.maxHeight] - 最大截图高度 (默认: 8000px)
864
+ * @returns {Promise<string>} - base64 编码的 PNG 图片
865
+ */
866
+ async fullPageScreenshot(page, options = {}) {
867
+ var _a, _b, _c;
868
+ logger.start("fullPageScreenshot", "detecting scrollable elements");
869
+ const originalViewport = page.viewportSize();
870
+ const defaultBuffer = Math.round(((originalViewport == null ? void 0 : originalViewport.height) || 1080) / 2);
871
+ const buffer = (_a = options.buffer) != null ? _a : defaultBuffer;
872
+ const restore = (_b = options.restore) != null ? _b : false;
873
+ const maxHeight = (_c = options.maxHeight) != null ? _c : 8e3;
874
+ try {
875
+ const maxScrollHeight = await page.evaluate(() => {
876
+ let maxHeight2 = document.body.scrollHeight;
877
+ document.querySelectorAll("*").forEach((el) => {
878
+ const style = window.getComputedStyle(el);
879
+ const overflowY = style.overflowY;
880
+ if ((overflowY === "auto" || overflowY === "scroll") && el.scrollHeight > el.clientHeight) {
881
+ if (el.scrollHeight > maxHeight2) {
882
+ maxHeight2 = el.scrollHeight;
883
+ }
884
+ el.dataset.pkOrigOverflow = el.style.overflow;
885
+ el.dataset.pkOrigHeight = el.style.height;
886
+ el.dataset.pkOrigMaxHeight = el.style.maxHeight;
887
+ el.classList.add("__pk_expanded__");
888
+ el.style.overflow = "visible";
889
+ el.style.height = "auto";
890
+ el.style.maxHeight = "none";
891
+ }
892
+ });
893
+ return maxHeight2;
894
+ });
895
+ const targetHeight = Math.min(maxScrollHeight + buffer, maxHeight);
896
+ await page.setViewportSize({
897
+ width: (originalViewport == null ? void 0 : originalViewport.width) || 1280,
898
+ height: targetHeight
899
+ });
900
+ await delay(1e3);
901
+ const buffer_ = await page.screenshot({
902
+ fullPage: true,
903
+ type: "png"
904
+ });
905
+ logger.success("fullPageScreenshot", `captured ${Math.round(buffer_.length / 1024)} KB`);
906
+ return buffer_.toString("base64");
907
+ } finally {
908
+ if (restore) {
909
+ await page.evaluate(() => {
910
+ document.querySelectorAll(".__pk_expanded__").forEach((el) => {
911
+ el.style.overflow = el.dataset.pkOrigOverflow || "";
912
+ el.style.height = el.dataset.pkOrigHeight || "";
913
+ el.style.maxHeight = el.dataset.pkOrigMaxHeight || "";
914
+ delete el.dataset.pkOrigOverflow;
915
+ delete el.dataset.pkOrigHeight;
916
+ delete el.dataset.pkOrigMaxHeight;
917
+ el.classList.remove("__pk_expanded__");
918
+ });
919
+ });
920
+ if (originalViewport) {
921
+ await page.setViewportSize(originalViewport);
922
+ }
923
+ }
924
+ }
925
+ }
926
+ };
927
+
928
+ // src/browser-onlys/token-form.js
929
+ var PLATFORM_CONFIG = {
930
+ kimi: {
931
+ name: "Kimi (Moonshot)",
932
+ tokenName: "kimi_auth",
933
+ serviceUrl: "https://kimi.moonshot.cn/",
934
+ tokenFields: ["kimi_auth"],
935
+ parse: (token) => {
936
+ const val = token ? token.trim() : "";
937
+ return val ? { kimi_auth: val } : {};
938
+ },
939
+ format: (values) => {
940
+ const val = values.kimi_auth;
941
+ return val === void 0 || val === null ? "" : String(val).trim();
942
+ }
943
+ },
944
+ doubao: {
945
+ name: "\u8C46\u5305 (Doubao)",
946
+ tokenName: "sessionid",
947
+ serviceUrl: "https://www.doubao.com/",
948
+ tokenFields: ["sessionid"],
949
+ parse: (token) => {
950
+ const val = token ? token.trim() : "";
951
+ return val ? { sessionid: val } : {};
952
+ },
953
+ format: (values) => {
954
+ const val = values.sessionid;
955
+ return val === void 0 || val === null ? "" : String(val).trim();
956
+ }
957
+ },
958
+ deepseek: {
959
+ name: "DeepSeek",
960
+ tokenName: "userToken",
961
+ serviceUrl: "https://chat.deepseek.com/",
962
+ guide: '\u8BF7\u8F93\u5165\u5B8C\u6574 JSON\uFF0C\u4F8B\u5982 {"value":"xxxxx"}\uFF0C\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u63D0\u53D6 value\u3002',
963
+ tokenFields: ["userToken"],
964
+ parse: (token) => {
965
+ const val = token ? token.trim() : "";
966
+ return val ? { userToken: val } : {};
967
+ },
968
+ format: (values) => {
969
+ const raw = values.userToken ? String(values.userToken).trim() : "";
970
+ if (!raw) return "";
971
+ if (raw.startsWith("{")) {
972
+ try {
973
+ const parsed = JSON.parse(raw);
974
+ if (parsed && typeof parsed.value === "string") return parsed.value.trim();
975
+ } catch (e) {
976
+ return "";
977
+ }
978
+ return "";
979
+ }
980
+ return raw;
981
+ }
982
+ },
983
+ yuanbao: {
984
+ name: "\u5143\u5B9D (Tencent)",
985
+ tokenName: "hy_user, hy_token",
986
+ serviceUrl: "https://yuanbao.tencent.com/",
987
+ guide: "\u5206\u522B\u586B\u5165\u4ECE\u6D4F\u89C8\u5668\u83B7\u53D6\u7684 hy_user \u548C hy_token\uFF0C\u7CFB\u7EDF\u5C06\u81EA\u52A8\u62FC\u63A5\u3002",
988
+ tokenFields: ["hy_user", "hy_token"],
989
+ parse: (token) => {
990
+ const cookieList = Utils.parseCookies(token || "");
991
+ const pairs = {};
992
+ cookieList.forEach((c) => {
993
+ pairs[c.name] = c.value;
994
+ });
995
+ return {
996
+ hy_user: pairs["hy_user"] || "",
997
+ hy_token: pairs["hy_token"] || ""
998
+ };
999
+ },
1000
+ format: (values) => {
1001
+ const u = values.hy_user ? String(values.hy_user).trim() : "";
1002
+ const t = values.hy_token ? String(values.hy_token).trim() : "";
1003
+ if (!u || !t) return "";
1004
+ return `hy_user=${u}; hy_token=${t}`;
1005
+ }
1006
+ },
1007
+ qwen: {
1008
+ name: "\u901A\u4E49\u5343\u95EE (Qwen)",
1009
+ tokenName: "tongyi_sso_ticket",
1010
+ serviceUrl: "https://tongyi.aliyun.com/",
1011
+ tokenFields: ["tongyi_sso_ticket"],
1012
+ parse: (token) => {
1013
+ const val = token ? token.trim() : "";
1014
+ return val ? { tongyi_sso_ticket: val } : {};
1015
+ },
1016
+ format: (values) => {
1017
+ const val = values.tongyi_sso_ticket;
1018
+ return val === void 0 || val === null ? "" : String(val).trim();
1019
+ }
1020
+ },
1021
+ erine: {
1022
+ name: "\u6587\u5FC3\u4E00\u8A00 (Erine)",
1023
+ tokenName: "BDUSS",
1024
+ serviceUrl: "https://yiyan.baidu.com/",
1025
+ tokenFields: ["BDUSS"],
1026
+ parse: (token) => {
1027
+ const val = token ? token.trim() : "";
1028
+ return val ? { BDUSS: val } : {};
1029
+ },
1030
+ format: (values) => {
1031
+ const val = values.BDUSS;
1032
+ return val === void 0 || val === null ? "" : String(val).trim();
1033
+ }
1034
+ }
1035
+ };
1036
+ function createTokenForm() {
1037
+ return {
1038
+ getPlatformConfig(actor) {
1039
+ if (!actor) throw new Error("Actor parameter is required to get platform config");
1040
+ if (PLATFORM_CONFIG[actor]) return PLATFORM_CONFIG[actor];
1041
+ const key = Object.keys(PLATFORM_CONFIG).find((k) => actor.includes(k));
1042
+ if (key) return PLATFORM_CONFIG[key];
1043
+ throw new Error(`\u672A\u627E\u5230\u5E73\u53F0\u914D\u7F6E: ${actor}. \u8BF7\u786E\u4FDD playwright-toolkit/browser-onlys/token-form.js \u4E2D\u5DF2\u5B9A\u4E49\u8BE5\u5E73\u53F0\u3002`);
1044
+ },
1045
+ parseToken(token, config) {
1046
+ if (!config) return {};
1047
+ return config.parse(token);
1048
+ },
1049
+ formatToken(values, config) {
1050
+ if (!config) return "";
1051
+ return config.format(values);
1052
+ }
1053
+ };
1054
+ }
1055
+ var instance = null;
1056
+ async function useTokenForm() {
1057
+ if (!instance) {
1058
+ instance = createTokenForm();
1059
+ }
1060
+ return instance;
1061
+ }
1062
+ var TokenForm = {
1063
+ useTokenForm
776
1064
  };
777
1065
 
778
1066
  // entrys/browser.js
779
1067
  var usePlaywrightToolKit = () => {
780
- throw new Error("usePlaywrightToolKit \u4EC5\u652F\u6301\u5728 Node \u73AF\u5883\u4E2D\u4F7F\u7528\u3002");
1068
+ return {
1069
+ Logger,
1070
+ ...browser_onlys_exports,
1071
+ $Internals: {
1072
+ LOG_TEMPLATES,
1073
+ stripAnsi
1074
+ }
1075
+ };
781
1076
  };
782
- var browser = { Logger, LOG_TEMPLATES, stripAnsi };
783
1077
  export {
784
- LOG_TEMPLATES,
785
- Logger,
786
- browser,
787
- stripAnsi,
788
1078
  usePlaywrightToolKit
789
1079
  };
790
1080
  //# sourceMappingURL=browser.js.map