@dxos/test-utils 0.8.3 → 0.8.4-main.f9ba587

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/test-utils",
3
- "version": "0.8.3",
3
+ "version": "0.8.4-main.f9ba587",
4
4
  "description": "Test utilities",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -11,18 +11,12 @@
11
11
  ".": {
12
12
  "types": "./dist/types/src/index.d.ts",
13
13
  "browser": "./dist/lib/browser/index.mjs",
14
- "node": {
15
- "require": "./dist/lib/node/index.cjs",
16
- "default": "./dist/lib/node-esm/index.mjs"
17
- }
14
+ "node": "./dist/lib/node-esm/index.mjs"
18
15
  },
19
16
  "./playwright": {
20
17
  "types": "./dist/types/src/playwright.d.ts",
21
18
  "browser": "./dist/lib/browser/playwright.mjs",
22
- "node": {
23
- "require": "./dist/lib/node/playwright.cjs",
24
- "default": "./dist/lib/node-esm/playwright.mjs"
25
- }
19
+ "node": "./dist/lib/node-esm/playwright.mjs"
26
20
  }
27
21
  },
28
22
  "types": "dist/types/src/index.d.ts",
@@ -38,14 +32,13 @@
38
32
  "src"
39
33
  ],
40
34
  "dependencies": {
41
- "@nx/devkit": "19.7.2",
42
35
  "@playwright/test": "^1.46.0",
43
36
  "pkg-up": "^3.1.0",
44
- "@dxos/async": "0.8.3",
45
- "@dxos/node-std": "0.8.3"
37
+ "@dxos/async": "0.8.4-main.f9ba587",
38
+ "@dxos/node-std": "0.8.4-main.f9ba587"
46
39
  },
47
40
  "peerDependencies": {
48
- "vitest": "^3.0.8"
41
+ "vitest": "^3.2.4"
49
42
  },
50
43
  "publishConfig": {
51
44
  "access": "public"
package/src/playwright.ts CHANGED
@@ -4,21 +4,75 @@
4
4
 
5
5
  /* eslint-disable no-console */
6
6
 
7
- import { workspaceRoot } from '@nx/devkit';
8
7
  import { type Browser, type BrowserContext, type PlaywrightTestConfig, type Page } from '@playwright/test';
9
- import { join, relative } from 'node:path';
8
+ import { existsSync, readFileSync } from 'node:fs';
9
+ import { dirname, join, resolve } from 'node:path';
10
10
  import pkgUp from 'pkg-up';
11
11
 
12
12
  import { Lock } from './lock';
13
13
 
14
- export const e2ePreset = (cwd: string): PlaywrightTestConfig => {
15
- const packageJson = pkgUp.sync({ cwd });
14
+ const findWorkspaceRoot = (startDir: string): string => {
15
+ let dir = resolve(startDir);
16
+ while (dir !== '/') {
17
+ try {
18
+ // Check for pnpm-workspace.yaml first (modern pnpm approach)
19
+ const workspaceYamlPath = join(dir, 'pnpm-workspace.yaml');
20
+ if (existsSync(workspaceYamlPath)) {
21
+ return dir;
22
+ }
23
+
24
+ // Check for package.json with workspaces field (legacy approach)
25
+ const pkgPath = join(dir, 'package.json');
26
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
27
+ if (pkg.workspaces) {
28
+ return dir;
29
+ }
30
+ } catch {}
31
+ const parent = dirname(dir);
32
+ if (parent === dir) {
33
+ break;
34
+ }
35
+ dir = parent;
36
+ }
37
+
38
+ throw new Error('Could not find pnpm workspace root');
39
+ };
40
+
41
+ export const e2ePreset = (testDir: string): PlaywrightTestConfig => {
42
+ const packageJson = pkgUp.sync({ cwd: testDir });
16
43
  const packageDir = packageJson!.split('/').slice(0, -1).join('/');
17
- const packageDirRelative = relative(workspaceRoot, packageDir);
18
- const testResultsDir = join(workspaceRoot, 'test-results', packageDirRelative, 'results.xml');
44
+ const packageDirName = packageDir.split('/').pop();
45
+ if (!packageDirName) {
46
+ throw new Error('packageDirName not found');
47
+ }
48
+
49
+ const workspaceRoot = findWorkspaceRoot(packageDir);
50
+ const testResultOuputDir = join(workspaceRoot, 'test-results/playwright/output', packageDirName);
51
+ const reporterOutputFile = join(workspaceRoot, 'test-results/playwright/report', `${packageDirName}.json`);
19
52
 
20
53
  return {
21
- reporter: process.env.CI ? [['list'], ['junit', { outputFile: testResultsDir }]] : [['list']],
54
+ testDir,
55
+ outputDir: testResultOuputDir,
56
+ // Run tests in files in parallel.
57
+ fullyParallel: true,
58
+ // Fail the build on CI if you accidentally left test.only in the source code.
59
+ forbidOnly: !!process.env.CI,
60
+ // Retry on CI only.
61
+ retries: process.env.CI ? 2 : 0,
62
+ // Opt out of parallel tests on CI.
63
+ workers: process.env.CI ? 1 : undefined,
64
+ // Reporter to use. See https://playwright.dev/docs/test-reporters.
65
+ reporter: process.env.CI
66
+ ? [
67
+ ['list'],
68
+ [
69
+ 'json',
70
+ {
71
+ outputFile: reporterOutputFile,
72
+ },
73
+ ],
74
+ ]
75
+ : [['list']],
22
76
  use: {
23
77
  trace: 'retain-on-failure',
24
78
  },
@@ -77,4 +131,5 @@ export const setupPage = async (browser: Browser | BrowserContext, options: Setu
77
131
  return { context, page };
78
132
  };
79
133
 
80
- export const storybookUrl = (storyId: string) => `http://localhost:9009/iframe.html?id=${storyId}&viewMode=story`;
134
+ export const storybookUrl = (storyId: string, port = 9009) =>
135
+ `http://localhost:${port}/iframe.html?id=${storyId}&viewMode=story`;
@@ -1,35 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var node_exports = {};
20
- __export(node_exports, {
21
- openAndClose: () => openAndClose
22
- });
23
- module.exports = __toCommonJS(node_exports);
24
- var import_vitest = require("vitest");
25
- var openAndClose = async (...resources) => {
26
- for (const resourceLike of resources) {
27
- await resourceLike.open();
28
- (0, import_vitest.onTestFinished)(() => resourceLike.close());
29
- }
30
- };
31
- // Annotate the CommonJS export names for ESM import in node:
32
- 0 && (module.exports = {
33
- openAndClose
34
- });
35
- //# sourceMappingURL=index.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/resource.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { onTestFinished } from 'vitest';\n\ninterface ResourceLike {\n open(): Promise<any>;\n close(): Promise<any>;\n}\n\n// TODO(burdon): Replace with abstraction relating to Context object?\nexport const openAndClose = async (...resources: ResourceLike[]) => {\n for (const resourceLike of resources) {\n await resourceLike.open();\n onTestFinished(() => resourceLike.close());\n }\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAIA,oBAA+B;AAQxB,IAAMA,eAAe,UAAUC,cAAAA;AACpC,aAAWC,gBAAgBD,WAAW;AACpC,UAAMC,aAAaC,KAAI;AACvBC,sCAAe,MAAMF,aAAaG,MAAK,CAAA;EACzC;AACF;",
6
- "names": ["openAndClose", "resources", "resourceLike", "open", "onTestFinished", "close"]
7
- }
@@ -1 +0,0 @@
1
- {"inputs":{"packages/common/test-utils/src/resource.ts":{"bytes":1545,"imports":[{"path":"vitest","kind":"import-statement","external":true}],"format":"esm"},"packages/common/test-utils/src/index.ts":{"bytes":466,"imports":[{"path":"packages/common/test-utils/src/resource.ts","kind":"import-statement","original":"./resource"}],"format":"esm"},"packages/common/test-utils/src/lock.ts":{"bytes":2031,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true}],"format":"esm"},"packages/common/test-utils/src/playwright.ts":{"bytes":8379,"imports":[{"path":"@nx/devkit","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"packages/common/test-utils/src/lock.ts","kind":"import-statement","original":"./lock"}],"format":"esm"}},"outputs":{"packages/common/test-utils/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":798},"packages/common/test-utils/dist/lib/node/index.cjs":{"imports":[{"path":"vitest","kind":"import-statement","external":true}],"exports":["openAndClose"],"entryPoint":"packages/common/test-utils/src/index.ts","inputs":{"packages/common/test-utils/src/resource.ts":{"bytesInOutput":214},"packages/common/test-utils/src/index.ts":{"bytesInOutput":0}},"bytes":322},"packages/common/test-utils/dist/lib/node/playwright.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":5324},"packages/common/test-utils/dist/lib/node/playwright.cjs":{"imports":[{"path":"@nx/devkit","kind":"import-statement","external":true},{"path":"node:path","kind":"import-statement","external":true},{"path":"pkg-up","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true}],"exports":["e2ePreset","setupPage","storybookUrl"],"entryPoint":"packages/common/test-utils/src/playwright.ts","inputs":{"packages/common/test-utils/src/playwright.ts":{"bytesInOutput":1828},"packages/common/test-utils/src/lock.ts":{"bytesInOutput":416}},"bytes":2477}}}
@@ -1,130 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var playwright_exports = {};
30
- __export(playwright_exports, {
31
- e2ePreset: () => e2ePreset,
32
- setupPage: () => setupPage,
33
- storybookUrl: () => storybookUrl
34
- });
35
- module.exports = __toCommonJS(playwright_exports);
36
- var import_devkit = require("@nx/devkit");
37
- var import_node_path = require("node:path");
38
- var import_pkg_up = __toESM(require("pkg-up"));
39
- var import_async = require("@dxos/async");
40
- var Lock = class {
41
- constructor() {
42
- this._lastPromise = Promise.resolve();
43
- }
44
- async executeSynchronized(fun) {
45
- const prevPromise = this._lastPromise;
46
- const [getPromise, resolve] = (0, import_async.trigger)();
47
- this._lastPromise = getPromise();
48
- await prevPromise;
49
- try {
50
- const value = await fun();
51
- return value;
52
- } finally {
53
- resolve();
54
- }
55
- }
56
- };
57
- var e2ePreset = (cwd) => {
58
- const packageJson = import_pkg_up.default.sync({
59
- cwd
60
- });
61
- const packageDir = packageJson.split("/").slice(0, -1).join("/");
62
- const packageDirRelative = (0, import_node_path.relative)(import_devkit.workspaceRoot, packageDir);
63
- const testResultsDir = (0, import_node_path.join)(import_devkit.workspaceRoot, "test-results", packageDirRelative, "results.xml");
64
- return {
65
- reporter: process.env.CI ? [
66
- [
67
- "list"
68
- ],
69
- [
70
- "junit",
71
- {
72
- outputFile: testResultsDir
73
- }
74
- ]
75
- ] : [
76
- [
77
- "list"
78
- ]
79
- ],
80
- use: {
81
- trace: "retain-on-failure"
82
- }
83
- };
84
- };
85
- var setupPage = async (browser, options = {}) => {
86
- const { url, bridgeLogs, viewportSize } = options;
87
- const context = "newContext" in browser ? await browser.newContext() : browser;
88
- const page = await context.newPage();
89
- if (viewportSize) {
90
- await page.setViewportSize(viewportSize);
91
- }
92
- if (bridgeLogs) {
93
- const lock = new Lock();
94
- page.on("pageerror", async (error) => {
95
- await lock.executeSynchronized(async () => {
96
- console.log(error);
97
- });
98
- });
99
- page.on("console", async (msg) => {
100
- try {
101
- const argsPromise = Promise.all(msg.args().map((x) => x.jsonValue()));
102
- await lock.executeSynchronized(async () => {
103
- const args = await argsPromise;
104
- if (args.length > 0) {
105
- console.log(...args);
106
- } else {
107
- console.log(msg);
108
- }
109
- });
110
- } catch (err) {
111
- console.error("Failed to parse message", err);
112
- }
113
- });
114
- }
115
- if (url) {
116
- await page.goto(url);
117
- }
118
- return {
119
- context,
120
- page
121
- };
122
- };
123
- var storybookUrl = (storyId) => `http://localhost:9009/iframe.html?id=${storyId}&viewMode=story`;
124
- // Annotate the CommonJS export names for ESM import in node:
125
- 0 && (module.exports = {
126
- e2ePreset,
127
- setupPage,
128
- storybookUrl
129
- });
130
- //# sourceMappingURL=playwright.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/playwright.ts", "../../../src/lock.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\n/* eslint-disable no-console */\n\nimport { workspaceRoot } from '@nx/devkit';\nimport { type Browser, type BrowserContext, type PlaywrightTestConfig, type Page } from '@playwright/test';\nimport { join, relative } from 'node:path';\nimport pkgUp from 'pkg-up';\n\nimport { Lock } from './lock';\n\nexport const e2ePreset = (cwd: string): PlaywrightTestConfig => {\n const packageJson = pkgUp.sync({ cwd });\n const packageDir = packageJson!.split('/').slice(0, -1).join('/');\n const packageDirRelative = relative(workspaceRoot, packageDir);\n const testResultsDir = join(workspaceRoot, 'test-results', packageDirRelative, 'results.xml');\n\n return {\n reporter: process.env.CI ? [['list'], ['junit', { outputFile: testResultsDir }]] : [['list']],\n use: {\n trace: 'retain-on-failure',\n },\n };\n};\n\nexport type SetupOptions = {\n url?: string;\n bridgeLogs?: boolean;\n viewportSize?: Parameters<Page['setViewportSize']>[0];\n};\n\nexport const setupPage = async (browser: Browser | BrowserContext, options: SetupOptions = {}) => {\n const { url, bridgeLogs, viewportSize } = options;\n\n const context = 'newContext' in browser ? await browser.newContext() : browser;\n const page = await context.newPage();\n\n if (viewportSize) {\n await page.setViewportSize(viewportSize);\n }\n\n // TODO(wittjosiah): Remove?\n if (bridgeLogs) {\n const lock = new Lock();\n\n page.on('pageerror', async (error) => {\n await lock.executeSynchronized(async () => {\n // eslint-disable-next-line no-console\n console.log(error);\n });\n });\n\n page.on('console', async (msg) => {\n try {\n const argsPromise = Promise.all(msg.args().map((x) => x.jsonValue()));\n await lock.executeSynchronized(async () => {\n const args = await argsPromise;\n\n if (args.length > 0) {\n console.log(...args);\n } else {\n console.log(msg);\n }\n });\n } catch (err) {\n console.error('Failed to parse message', err);\n }\n });\n }\n\n if (url) {\n await page.goto(url);\n }\n\n return { context, page };\n};\n\nexport const storybookUrl = (storyId: string) => `http://localhost:9009/iframe.html?id=${storyId}&viewMode=story`;\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { trigger } from '@dxos/async';\n\n// Copied from @dxos/async.\nexport class Lock {\n private _lastPromise = Promise.resolve();\n\n async executeSynchronized<T>(fun: () => Promise<T>): Promise<T> {\n const prevPromise = this._lastPromise;\n const [getPromise, resolve] = trigger();\n this._lastPromise = getPromise();\n\n await prevPromise;\n try {\n const value = await fun();\n return value;\n } finally {\n resolve();\n }\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,oBAA8B;AAE9B,uBAA+B;AAC/B,oBAAkB;ACLlB,mBAAwB;AAGjB,IAAMA,OAAN,MAAMA;EAAN,cAAA;AACGC,SAAAA,eAAeC,QAAQC,QAAO;;EAEtC,MAAMC,oBAAuBC,KAAmC;AAC9D,UAAMC,cAAc,KAAKL;AACzB,UAAM,CAACM,YAAYJ,OAAAA,QAAWK,sBAAAA;AAC9B,SAAKP,eAAeM,WAAAA;AAEpB,UAAMD;AACN,QAAI;AACF,YAAMG,QAAQ,MAAMJ,IAAAA;AACpB,aAAOI;IACT,UAAA;AACEN,cAAAA;IACF;EACF;AACF;ADVO,IAAMO,YAAY,CAACC,QAAAA;AACxB,QAAMC,cAAcC,cAAAA,QAAMC,KAAK;IAAEH;EAAI,CAAA;AACrC,QAAMI,aAAaH,YAAaI,MAAM,GAAA,EAAKC,MAAM,GAAG,EAAC,EAAGC,KAAK,GAAA;AAC7D,QAAMC,yBAAqBC,2BAASC,6BAAeN,UAAAA;AACnD,QAAMO,qBAAiBJ,uBAAKG,6BAAe,gBAAgBF,oBAAoB,aAAA;AAE/E,SAAO;IACLI,UAAUC,QAAQC,IAAIC,KAAK;MAAC;QAAC;;MAAS;QAAC;QAAS;UAAEC,YAAYL;QAAe;;QAAM;MAAC;QAAC;;;IACrFM,KAAK;MACHC,OAAO;IACT;EACF;AACF;AAQO,IAAMC,YAAY,OAAOC,SAAmCC,UAAwB,CAAC,MAAC;AAC3F,QAAM,EAAEC,KAAKC,YAAYC,aAAY,IAAKH;AAE1C,QAAMI,UAAU,gBAAgBL,UAAU,MAAMA,QAAQM,WAAU,IAAKN;AACvE,QAAMO,OAAO,MAAMF,QAAQG,QAAO;AAElC,MAAIJ,cAAc;AAChB,UAAMG,KAAKE,gBAAgBL,YAAAA;EAC7B;AAGA,MAAID,YAAY;AACd,UAAMO,OAAO,IAAIzC,KAAAA;AAEjBsC,SAAKI,GAAG,aAAa,OAAOC,UAAAA;AAC1B,YAAMF,KAAKrC,oBAAoB,YAAA;AAE7BwC,gBAAQC,IAAIF,KAAAA;MACd,CAAA;IACF,CAAA;AAEAL,SAAKI,GAAG,WAAW,OAAOI,QAAAA;AACxB,UAAI;AACF,cAAMC,cAAc7C,QAAQ8C,IAAIF,IAAIG,KAAI,EAAGC,IAAI,CAACC,MAAMA,EAAEC,UAAS,CAAA,CAAA;AACjE,cAAMX,KAAKrC,oBAAoB,YAAA;AAC7B,gBAAM6C,OAAO,MAAMF;AAEnB,cAAIE,KAAKI,SAAS,GAAG;AACnBT,oBAAQC,IAAG,GAAII,IAAAA;UACjB,OAAO;AACLL,oBAAQC,IAAIC,GAAAA;UACd;QACF,CAAA;MACF,SAASQ,KAAK;AACZV,gBAAQD,MAAM,2BAA2BW,GAAAA;MAC3C;IACF,CAAA;EACF;AAEA,MAAIrB,KAAK;AACP,UAAMK,KAAKiB,KAAKtB,GAAAA;EAClB;AAEA,SAAO;IAAEG;IAASE;EAAK;AACzB;AAEO,IAAMkB,eAAe,CAACC,YAAoB,wCAAwCA,OAAAA;",
6
- "names": ["Lock", "_lastPromise", "Promise", "resolve", "executeSynchronized", "fun", "prevPromise", "getPromise", "trigger", "value", "e2ePreset", "cwd", "packageJson", "pkgUp", "sync", "packageDir", "split", "slice", "join", "packageDirRelative", "relative", "workspaceRoot", "testResultsDir", "reporter", "process", "env", "CI", "outputFile", "use", "trace", "setupPage", "browser", "options", "url", "bridgeLogs", "viewportSize", "context", "newContext", "page", "newPage", "setViewportSize", "lock", "on", "error", "console", "log", "msg", "argsPromise", "all", "args", "map", "x", "jsonValue", "length", "err", "goto", "storybookUrl", "storyId"]
7
- }