@empiricalrun/playwright-utils 0.48.5 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @empiricalrun/playwright-utils
2
2
 
3
+ ## 0.49.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6fb8170: feat: playwright utils upgraded to use new core
8
+ - aa78c40: fix: narrower request payloads to avoid body attachments hogging request size
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies [6fb8170]
13
+ - @empiricalrun/cua@0.4.0
14
+ - @empiricalrun/reporter@0.29.0
15
+ - @empiricalrun/dashboard-client@0.3.0
16
+ - @empiricalrun/llm@0.26.0
17
+
18
+ ## 0.48.6
19
+
20
+ ### Patch Changes
21
+
22
+ - 05df554: fix: turn down verbose logs
23
+
3
24
  ## 0.48.5
4
25
 
5
26
  ### Patch Changes
@@ -157,15 +157,20 @@ class AttachmentCleanup {
157
157
  }
158
158
  _logDiskStatus() {
159
159
  this._diskLogTick++;
160
- const artifactsSuffix = this._diskLogTick % 15 === 0 ? `, breakdown=${getDiskBreakdown()}` : "";
161
- logger_1.logger.info(`[AttachmentCleanup] Periodic: registered=${this._registeredCount}, pending=${this._pending.size}, uploaded=${this._uploadedCount}, evicted=${this._evictedCount} (${formatBytes(this._evictedBytes)}), totalSize=${formatBytes(this._totalSize)}, limit=${formatBytes(this._limitBytes)}, disk=${getDiskUsage()}${artifactsSuffix}`);
160
+ // const artifactsSuffix =
161
+ // this._diskLogTick % 15 === 0 ? `, breakdown=${getDiskBreakdown()}` : "";
162
+ // logger.info(
163
+ // `[AttachmentCleanup] Periodic: registered=${this._registeredCount}, pending=${this._pending.size}, uploaded=${this._uploadedCount}, evicted=${this._evictedCount} (${formatBytes(this._evictedBytes)}), totalSize=${formatBytes(this._totalSize)}, limit=${formatBytes(this._limitBytes)}, disk=${getDiskUsage()}${artifactsSuffix}`,
164
+ // );
162
165
  }
163
166
  logSummary() {
164
167
  if (this._diskLogTimer) {
165
168
  clearInterval(this._diskLogTimer);
166
169
  this._diskLogTimer = null;
167
170
  }
168
- logger_1.logger.info(`[AttachmentCleanup] Summary: registered=${this._registeredCount}, pending=${this._pending.size}, uploaded=${this._uploadedCount}, evicted=${this._evictedCount} (${formatBytes(this._evictedBytes)}), totalSize=${formatBytes(this._totalSize)}, disk=${getDiskUsage()}, breakdown=${getDiskBreakdown()}`);
171
+ // logger.info(
172
+ // `[AttachmentCleanup] Summary: registered=${this._registeredCount}, pending=${this._pending.size}, uploaded=${this._uploadedCount}, evicted=${this._evictedCount} (${formatBytes(this._evictedBytes)}), totalSize=${formatBytes(this._totalSize)}, disk=${getDiskUsage()}, breakdown=${getDiskBreakdown()}`,
173
+ // );
169
174
  }
170
175
  set onEvict(callback) {
171
176
  this._onEvict = callback;
@@ -1 +1 @@
1
- {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAuBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,kBAAkB,CAA2B;;IAMrD,OAAO,CAAC,6BAA6B,CAqCnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAwGtC,KAAK,CAAC,MAAM,EAAE,UAAU;IAmG9B,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAOhB,iBAAiB;CAmChC;AAED,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"empirical-reporter.d.ts","sourceRoot":"","sources":["../../src/reporter/empirical-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,UAAU,EACX,MAAM,2BAA2B,CAAC;AAuBnC,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,oBAAoB,CAG1B;IACF,OAAO,CAAC,sBAAsB,CAAuB;IACrD,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,gBAAgB,CAAkC;IAC1D,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,kBAAkB,CAA2B;;IAMrD,OAAO,CAAC,6BAA6B,CAqCnC;IAEF,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IA+HtC,KAAK,CAAC,MAAM,EAAE,UAAU;IAmG9B,OAAO,CAAC,qBAAqB;YAkBf,gBAAgB;YAOhB,iBAAiB;CAmChC;AAED,eAAe,iBAAiB,CAAC"}
@@ -109,9 +109,32 @@ class EmpiricalReporter {
109
109
  ? parseInt(process.env.SHARD_INDEX, 10)
110
110
  : undefined;
111
111
  const params = {
112
- test,
112
+ test: {
113
+ id: test.id,
114
+ title: test.title,
115
+ location: test.location,
116
+ expectedStatus: test.expectedStatus,
117
+ retries: test.retries,
118
+ },
113
119
  suites,
114
- result,
120
+ result: {
121
+ retry: result.retry,
122
+ status: result.status,
123
+ duration: result.duration,
124
+ startTime: result.startTime,
125
+ error: result.error
126
+ ? {
127
+ message: result.error.message,
128
+ stack: result.error.stack,
129
+ location: result.error.location,
130
+ }
131
+ : undefined,
132
+ errors: result.errors?.map((e) => ({
133
+ message: e.message,
134
+ stack: e.stack,
135
+ location: e.location,
136
+ })),
137
+ },
115
138
  projectName,
116
139
  attachments: successfulAttachments,
117
140
  runId: process.env.TEST_RUN_GITHUB_ACTION_ID,
@@ -1,6 +1,6 @@
1
1
  import { StorageCredentials } from "@empiricalrun/r2-uploader";
2
2
  export interface UploaderConfig {
3
- projectName: string;
3
+ projectSlug: string;
4
4
  runId: string;
5
5
  baseUrl: string;
6
6
  uploadBucket: string;
@@ -16,7 +16,7 @@ class Uploader {
16
16
  constructor(config) {
17
17
  this._baseUrl = config.baseUrl;
18
18
  this._uploadBucket = config.uploadBucket;
19
- this._destinationDir = `${config.projectName}/${config.runId}`;
19
+ this._destinationDir = `${config.projectSlug}/${config.runId}`;
20
20
  this._credentials = config.credentials;
21
21
  logger_1.logger.debug(`[Uploader] Initialized with destination: ${this._destinationDir}, provider: ${this._credentials.provider}`);
22
22
  }
@@ -146,7 +146,7 @@ function createUploader() {
146
146
  uploadBucket = bucket;
147
147
  }
148
148
  return new Uploader({
149
- projectName: process.env.PROJECT_NAME,
149
+ projectSlug: process.env.PROJECT_NAME,
150
150
  runId: process.env.TEST_RUN_GITHUB_ACTION_ID,
151
151
  baseUrl,
152
152
  uploadBucket,
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/reporter/util.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EACL,UAAU,IAAI,oBAAoB,EAElC,QAAQ,EACT,MAAM,2BAA2B,CAAC;AAmBnC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAmB7D;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,UAMhC;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5E,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAyCD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ;;;EAwBrD;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAyDf;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GACnC,GAAG,CAIL;AAED,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,iBAuGjB;AAED;;;;;;;;;;GAUG;AACH;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,OAAe,GAC9B,iBAAiB,CAcnB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,6CA+BlB"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/reporter/util.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAMhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACpF,OAAO,EACL,UAAU,IAAI,oBAAoB,EAElC,QAAQ,EACT,MAAM,2BAA2B,CAAC;AA0BnC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAmB7D;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,SAAS,UAMhC;AAED,wBAAsB,0BAA0B,CAC9C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5E,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC,CAyCD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ;;;EAwBrD;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAiDf;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,GAAG,EACR,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GACnC,GAAG,CAIL;AAED,wBAAsB,gCAAgC,CACpD,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,iBAuGjB;AAED;;;;;;;;;;GAUG;AACH;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAC/C,mBAAmB,EAAE,MAAM,EAC3B,QAAQ,EAAE,MAAM,EAChB,cAAc,GAAE,OAAe,GAC9B,iBAAiB,CAcnB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7E;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,6CA+BlB"}
@@ -16,11 +16,25 @@ exports.updateSummaryJsonAttachmentPaths = updateSummaryJsonAttachmentPaths;
16
16
  const zip_1 = require("@empiricalrun/r2-uploader/zip");
17
17
  const reporter_1 = require("@empiricalrun/reporter");
18
18
  const async_retry_1 = __importDefault(require("async-retry"));
19
+ const crypto_1 = __importDefault(require("crypto"));
19
20
  const fs_1 = __importDefault(require("fs"));
21
+ const mime_1 = __importDefault(require("mime"));
20
22
  const path_1 = __importDefault(require("path"));
21
- const utils_1 = require("playwright-core/lib/utils");
22
- const utilsBundle_1 = require("playwright-core/lib/utilsBundle");
23
23
  const logger_1 = require("../logger");
24
+ // Mirrors https://github.com/microsoft/playwright/blob/main/packages/playwright-core/src/tools/cli-client/program.ts#L440
25
+ function calculateSha1(buffer) {
26
+ const hash = crypto_1.default.createHash("sha1");
27
+ hash.update(buffer);
28
+ return hash.digest("hex");
29
+ }
30
+ // Mirrors https://github.com/microsoft/playwright/blob/main/packages/isomorphic/stringUtils.ts#L37
31
+ function isString(obj) {
32
+ return typeof obj === "string" || obj instanceof String;
33
+ }
34
+ // Mirrors https://github.com/microsoft/playwright/blob/main/packages/utils/fileUtils.ts#L77
35
+ function sanitizeForFilePath(s) {
36
+ return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, "-");
37
+ }
24
38
  const folderToPackageJsonPath = new Map();
25
39
  function getPackageJsonPath(folderPath) {
26
40
  const cached = folderToPackageJsonPath.get(folderPath);
@@ -55,15 +69,15 @@ async function normalizeAndSaveAttachment(outputPath, name, options = {}) {
55
69
  1)
56
70
  throw new Error(`Exactly one of "path" and "body" must be specified`);
57
71
  if (options.path !== undefined) {
58
- const hash = (0, utils_1.calculateSha1)(options.path);
59
- if (!(0, utils_1.isString)(name))
72
+ const hash = calculateSha1(options.path);
73
+ if (!isString(name))
60
74
  throw new Error('"name" should be string.');
61
- const sanitizedNamePrefix = (0, utils_1.sanitizeForFilePath)(name) + "-";
75
+ const sanitizedNamePrefix = sanitizeForFilePath(name) + "-";
62
76
  const dest = path_1.default.join(outputPath, "attachments", sanitizedNamePrefix + hash + path_1.default.extname(options.path));
63
77
  await fs_1.default.promises.mkdir(path_1.default.dirname(dest), { recursive: true });
64
78
  await fs_1.default.promises.copyFile(options.path, dest);
65
79
  const contentType = options.contentType ??
66
- (utilsBundle_1.mime.getType(path_1.default.basename(options.path)) || "application/octet-stream");
80
+ (mime_1.default.getType(path_1.default.basename(options.path)) || "application/octet-stream");
67
81
  return { name, contentType, path: dest };
68
82
  }
69
83
  else {
@@ -108,16 +122,10 @@ function suitesAndProjectForTest(test) {
108
122
  async function sendTestCaseUpdateToDashboard(params) {
109
123
  const DOMAIN = process.env.DASHBOARD_DOMAIN || "https://dash.empirical.run";
110
124
  try {
111
- const keyFilter = (key) => key === "parent";
112
- const payload = {
113
- ...params,
114
- test: safelySerialiseJSON(params.test, keyFilter),
115
- result: safelySerialiseJSON(params.result, keyFilter),
116
- };
117
125
  const requestBody = {
118
126
  name: "test_case_run_end",
119
127
  data: {
120
- ...payload,
128
+ ...params,
121
129
  },
122
130
  };
123
131
  if (!DOMAIN) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empiricalrun/playwright-utils",
3
- "version": "0.48.5",
3
+ "version": "0.49.0",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -22,7 +22,7 @@
22
22
  },
23
23
  "author": "Empirical Team <hey@empirical.run>",
24
24
  "devDependencies": {
25
- "@playwright/test": "1.58.2",
25
+ "@playwright/test": "1.60.0",
26
26
  "@types/async-retry": "^1.4.8",
27
27
  "@types/authenticator": "^1.1.4",
28
28
  "@types/babel__code-frame": "^7.0.6",
@@ -30,9 +30,10 @@
30
30
  "@types/node": "^20.14.9",
31
31
  "@types/serve-handler": "^6.1.4",
32
32
  "@types/pg": "^8.11.6",
33
- "playwright-core": "1.58.2",
33
+ "@types/mime": "3.0.0",
34
+ "playwright-core": "1.60.0",
34
35
  "serve-handler": "^6.1.6",
35
- "@empiricalrun/shared-types": "0.12.1"
36
+ "@empiricalrun/shared-types": "0.13.0"
36
37
  },
37
38
  "dependencies": {
38
39
  "@babel/code-frame": "^7.24.7",
@@ -43,11 +44,12 @@
43
44
  "puppeteer-extra-plugin-recaptcha": "^3.6.8",
44
45
  "rimraf": "^6.0.1",
45
46
  "ts-morph": "^23.0.0",
46
- "@empiricalrun/cua": "^0.3.0",
47
+ "mime": "3.0.0",
48
+ "@empiricalrun/cua": "^0.4.0",
47
49
  "@empiricalrun/dashboard-client": "^0.3.0",
48
50
  "@empiricalrun/llm": "^0.26.0",
49
51
  "@empiricalrun/r2-uploader": "^0.9.1",
50
- "@empiricalrun/reporter": "^0.28.1"
52
+ "@empiricalrun/reporter": "^0.29.0"
51
53
  },
52
54
  "scripts": {
53
55
  "dev": "tsc --build --watch",