@pwtap/create 0.1.0 → 0.3.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/README.md +86 -0
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +14 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +159 -19
- package/dist/commands/create.js.map +1 -1
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -1
- package/dist/injectors/assets.d.ts +1 -1
- package/dist/injectors/assets.d.ts.map +1 -1
- package/dist/injectors/assets.js +12 -2
- package/dist/injectors/assets.js.map +1 -1
- package/dist/plugin-apply.d.ts +3 -1
- package/dist/plugin-apply.d.ts.map +1 -1
- package/dist/plugin-apply.js +4 -4
- package/dist/plugin-apply.js.map +1 -1
- package/dist/registry.js +1 -1
- package/dist/registry.js.map +1 -1
- package/package.json +2 -2
- package/template/tests/{example → ui}/authSession.spec.ts +1 -1
- /package/template/tests/{example → ui}/login.spec.ts +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @pwtap/create
|
|
2
|
+
|
|
3
|
+
Scaffold a **Playwright Test Automation Platform** project — an editable UI + API testing core with opt-in, separately-published plugins.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@pwtap/create)
|
|
6
|
+
[](https://github.com/caslanqa/test-automation-platform/blob/main/LICENSE)
|
|
7
|
+
[](https://nodejs.org)
|
|
8
|
+
|
|
9
|
+
> **This is a scaffolder (`create-*`), not a library.** The `npm i …` box npm shows at the top of this page is auto-generated — **don't use it.** Create a ready-to-run project with `npm init` / `npm create`:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm init @pwtap@latest my-tests
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What you get
|
|
16
|
+
|
|
17
|
+
The core is **copied into your project as editable source** (not imported from `node_modules`):
|
|
18
|
+
|
|
19
|
+
- **UI testing** — Chromium + Page Object Model (`BasePage`, `LoginPage`).
|
|
20
|
+
- **API testing** — layered `ApiClient` → service → test in a browser-free `api` project (Petstore v3 example).
|
|
21
|
+
- **Lazy session auth** — named sessions logged in once and cached per worker; opt in per test or per suite.
|
|
22
|
+
- **One fixtures barrel** (`@fixtures`) composed with `mergeTests`/`mergeExpects` — plugins merge into it.
|
|
23
|
+
- **Tooling out of the box** — ESLint, Prettier, husky + lint-staged, commitlint.
|
|
24
|
+
|
|
25
|
+
## After scaffolding
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
cd my-tests
|
|
29
|
+
cp env/environments.example.json env/environments.json # BASE_URL (UI) + API_BASE_URL (API)
|
|
30
|
+
cp testData/users.example.json testData/users.json # named login sessions (optional)
|
|
31
|
+
npm test
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Auth — per suite or per test
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { test, expect } from '@fixtures';
|
|
38
|
+
|
|
39
|
+
test.use({ session: 'admin' }); // whole file / describe
|
|
40
|
+
test('dashboard', async ({ page }) => {
|
|
41
|
+
/* signed in as admin */
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test.as('customer')('checkout', async ({ page }) => {
|
|
45
|
+
/* just this test */
|
|
46
|
+
});
|
|
47
|
+
test.as('admin').skip('wip', async () => {}); // .skip/.only/.fixme/.fail supported
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Plugins (opt-in)
|
|
51
|
+
|
|
52
|
+
Add or remove engines any time — real npm packages, wired via a typed manifest:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
npx create-pwtap add ai-judge # installs @pwtap/plugin-ai-judge + wires expect / env / example
|
|
56
|
+
npx create-pwtap remove ai-judge
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Plugin | Package | Status |
|
|
60
|
+
| ---------------- | ------------------------ | -------------- |
|
|
61
|
+
| AI Judge | `@pwtap/plugin-ai-judge` | ✅ stable |
|
|
62
|
+
| Maestro (mobile) | `@pwtap/plugin-maestro` | 🚧 coming soon |
|
|
63
|
+
| Appium (mobile) | `@pwtap/plugin-appium` | 🚧 coming soon |
|
|
64
|
+
|
|
65
|
+
You can also preselect at scaffold time: `npm init @pwtap@latest my-tests --ai-judge`.
|
|
66
|
+
|
|
67
|
+
## CLI reference
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
npm init @pwtap@latest [dir] [flags] # scaffold (dir defaults to ".")
|
|
71
|
+
npx create-pwtap add <plugin...> # add plugins to an existing project
|
|
72
|
+
npx create-pwtap remove <plugin...> # remove plugins
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Flags: `-y` / `--yes` (accept defaults, skip the menu), `--no-install` (skip `npm install`), `--no-browsers` (skip the Playwright browser download), `--tests-dir <name>` (tests folder), `--gha` (add a GitHub Actions workflow), `--ai-judge` (preselect a plugin).
|
|
76
|
+
|
|
77
|
+
Interactively (no `-y`), `create` first collects **package.json metadata** — name, version, description, author (defaulted from your git identity), keywords, repository URL, license — then the platform questions: tests-folder name, plugins, GitHub Actions workflow, install browsers, and (on Linux) OS dependencies. Press Enter to accept any default.
|
|
78
|
+
|
|
79
|
+
## Requirements
|
|
80
|
+
|
|
81
|
+
- **Node.js ≥ 20.19**
|
|
82
|
+
- macOS-first; other OSes are additive (mobile/desktop engines are macOS today).
|
|
83
|
+
|
|
84
|
+
## License
|
|
85
|
+
|
|
86
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,oGAAoG;AACpG,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE"}
|
package/dist/commands/add.js
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
1
3
|
import { addPlugins } from '../plugin-apply.js';
|
|
2
4
|
/** `create-pwtap add <plugin…>` — install and wire one or more plugins into an existing project. */
|
|
3
5
|
export async function addCommand(opts) {
|
|
4
6
|
if (opts.pluginIds.length === 0) {
|
|
5
7
|
throw new Error('add: name at least one plugin, e.g. `npx create-pwtap add maestro`');
|
|
6
8
|
}
|
|
7
|
-
await addPlugins(opts);
|
|
9
|
+
await addPlugins({ ...opts, testsDir: readTestsDir(opts.clientDir) });
|
|
10
|
+
}
|
|
11
|
+
/** Read the project's tests folder recorded at scaffold time (`pwtap.testsDir`); defaults to 'tests'. */
|
|
12
|
+
function readTestsDir(clientDir) {
|
|
13
|
+
try {
|
|
14
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(clientDir, 'package.json'), 'utf8'));
|
|
15
|
+
const dir = pkg.pwtap?.testsDir;
|
|
16
|
+
return typeof dir === 'string' && dir.length > 0 ? dir : 'tests';
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return 'tests';
|
|
20
|
+
}
|
|
8
21
|
}
|
|
9
22
|
//# sourceMappingURL=add.js.map
|
package/dist/commands/add.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAuB;IACtD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,UAAU,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,yGAAyG;AACzG,SAAS,YAAY,CAAC,SAAiB;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAEnF,CAAC;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;QAChC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,+FAA+F;AAC/F,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAsGtE"}
|
package/dist/commands/create.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
1
2
|
import fs from 'node:fs';
|
|
2
3
|
import path from 'node:path';
|
|
3
4
|
import { loadCoreManifest } from '../manifest.js';
|
|
4
5
|
import { addPlugins } from '../plugin-apply.js';
|
|
5
6
|
import { Prompter } from '../prompts.js';
|
|
6
7
|
import { KNOWN_PLUGINS } from '../registry.js';
|
|
7
|
-
import { copyDir, exists, isEmptyDir, sortObject, writeJson } from '../util/fs.js';
|
|
8
|
+
import { copyDir, ensureDir, exists, isEmptyDir, sortObject, writeJson } from '../util/fs.js';
|
|
8
9
|
import { log } from '../util/log.js';
|
|
9
10
|
import { run } from '../util/run.js';
|
|
10
11
|
/** Scaffold a new core project (UI + API), then optionally install/inject selected plugins. */
|
|
@@ -22,51 +23,163 @@ export async function createProject(opts) {
|
|
|
22
23
|
fs.renameSync(shippedGitignore, path.join(targetDir, '.gitignore'));
|
|
23
24
|
fs.rmSync(path.join(targetDir, 'templates'), { recursive: true, force: true });
|
|
24
25
|
}
|
|
25
|
-
// 2. Gather
|
|
26
|
+
// 2. Gather answers — package.json metadata (npm-init style) + the `npm init playwright`-style
|
|
27
|
+
// platform questions (minus TS/JS: this platform is TypeScript-only). Non-interactive (`-y` or
|
|
28
|
+
// no TTY) takes every default; Enter accepts a shown default interactively.
|
|
26
29
|
const prompter = new Prompter(opts.yes);
|
|
27
30
|
let name;
|
|
31
|
+
let meta;
|
|
32
|
+
let testsDir;
|
|
28
33
|
let selectedIds;
|
|
34
|
+
let addGha;
|
|
35
|
+
let installBrowsers;
|
|
36
|
+
let installOsDeps;
|
|
29
37
|
try {
|
|
30
38
|
name = await prompter.text('Project name', path.basename(targetDir));
|
|
39
|
+
meta = {
|
|
40
|
+
version: await prompter.text('Version', '0.1.0'),
|
|
41
|
+
description: await prompter.text('Description', ''),
|
|
42
|
+
author: await prompter.text('Author', defaultAuthor()),
|
|
43
|
+
keywords: parseKeywords(await prompter.text('Keywords (comma-separated)', '')),
|
|
44
|
+
repository: (await prompter.text('Repository URL', '')).trim(),
|
|
45
|
+
license: await prompter.text('License', 'MIT'),
|
|
46
|
+
};
|
|
47
|
+
testsDir = sanitizeDir(await prompter.text('Where to put your tests?', opts.testsDirDefault));
|
|
31
48
|
selectedIds =
|
|
32
49
|
opts.selectedPluginIds.length > 0
|
|
33
50
|
? opts.selectedPluginIds
|
|
34
51
|
: await prompter.selectPlugins(KNOWN_PLUGINS);
|
|
52
|
+
addGha = await prompter.confirm('Add a GitHub Actions workflow?', opts.gha);
|
|
53
|
+
installBrowsers = await prompter.confirm('Install Playwright browsers?', opts.browsers);
|
|
54
|
+
installOsDeps =
|
|
55
|
+
process.platform === 'linux'
|
|
56
|
+
? await prompter.confirm('Install Playwright operating system dependencies (requires sudo)?', false)
|
|
57
|
+
: false;
|
|
35
58
|
}
|
|
36
59
|
finally {
|
|
37
60
|
prompter.close();
|
|
38
61
|
}
|
|
39
|
-
// 3.
|
|
40
|
-
|
|
41
|
-
|
|
62
|
+
// 3. Relocate the tests folder if the user renamed it (repoints config + tsconfig + eslint globs).
|
|
63
|
+
if (testsDir !== 'tests') {
|
|
64
|
+
relocateTestsDir(targetDir, testsDir);
|
|
65
|
+
}
|
|
66
|
+
// 4. Write the base package.json from the core manifest (records testsDir so `add` places plugin
|
|
67
|
+
// examples in the right folder later).
|
|
68
|
+
writeBasePackageJson(targetDir, name, meta, coreManifestPath, testsDir);
|
|
69
|
+
// 5. Optional GitHub Actions workflow for the scaffolded project.
|
|
70
|
+
if (addGha) {
|
|
71
|
+
writeGithubWorkflow(targetDir);
|
|
72
|
+
}
|
|
73
|
+
// 6. git init + husky hooks so commit hygiene (lint-staged + commitlint) activates on install.
|
|
42
74
|
await initGit(targetDir);
|
|
43
75
|
writeHuskyHooks(targetDir);
|
|
44
|
-
//
|
|
76
|
+
// 7. Install core deps, then plugins (install + inject), then browsers / OS dependencies.
|
|
45
77
|
if (opts.install) {
|
|
46
78
|
log.step('Installing dependencies');
|
|
47
79
|
await run('npm', ['install'], { cwd: targetDir });
|
|
48
80
|
}
|
|
49
81
|
if (selectedIds.length > 0) {
|
|
50
|
-
await addPlugins({
|
|
82
|
+
await addPlugins({
|
|
83
|
+
clientDir: targetDir,
|
|
84
|
+
pluginIds: selectedIds,
|
|
85
|
+
install: opts.install,
|
|
86
|
+
testsDir,
|
|
87
|
+
});
|
|
51
88
|
}
|
|
52
|
-
if (
|
|
89
|
+
if (installBrowsers) {
|
|
53
90
|
const core = loadCoreManifest(coreManifestPath);
|
|
54
91
|
log.step(`Installing Playwright browsers: ${core.browsers.join(', ')}`);
|
|
55
92
|
await run('npx', ['playwright', 'install', ...core.browsers], { cwd: targetDir }).catch(err => log.warn(`playwright install skipped: ${err instanceof Error ? err.message : String(err)}`));
|
|
56
93
|
}
|
|
57
|
-
|
|
94
|
+
if (installOsDeps) {
|
|
95
|
+
log.step('Installing Playwright operating system dependencies');
|
|
96
|
+
await run('npx', ['playwright', 'install-deps'], { cwd: targetDir }).catch(err => log.warn(`install-deps skipped: ${err instanceof Error ? err.message : String(err)}`));
|
|
97
|
+
}
|
|
98
|
+
printNextSteps(targetDir, name, testsDir);
|
|
99
|
+
}
|
|
100
|
+
/** Normalize a tests-folder answer to a safe relative dir; empty/invalid falls back to 'tests'. */
|
|
101
|
+
function sanitizeDir(input) {
|
|
102
|
+
const cleaned = input
|
|
103
|
+
.trim()
|
|
104
|
+
.replace(/^[./]+/, '')
|
|
105
|
+
.replace(/\/+$/, '');
|
|
106
|
+
return cleaned === '' || cleaned.includes('..') ? 'tests' : cleaned;
|
|
107
|
+
}
|
|
108
|
+
/** Rename tests/ → <testsDir>/ and repoint the Playwright config, tsconfig alias, and eslint glob. */
|
|
109
|
+
function relocateTestsDir(targetDir, testsDir) {
|
|
110
|
+
const from = path.join(targetDir, 'tests');
|
|
111
|
+
const to = path.join(targetDir, testsDir);
|
|
112
|
+
if (exists(from)) {
|
|
113
|
+
ensureDir(path.dirname(to));
|
|
114
|
+
fs.renameSync(from, to);
|
|
115
|
+
}
|
|
116
|
+
patchFile(path.join(targetDir, 'playwright.config.ts'), s => s.replaceAll('./tests', `./${testsDir}`));
|
|
117
|
+
patchFile(path.join(targetDir, 'tsconfig.json'), s => s.replace('"tests/*"', `"${testsDir}/*"`));
|
|
118
|
+
patchFile(path.join(targetDir, 'eslint.config.js'), s => s.replace("'tests/**/*.ts'", `'${testsDir}/**/*.ts'`));
|
|
119
|
+
}
|
|
120
|
+
function patchFile(file, replacer) {
|
|
121
|
+
if (exists(file)) {
|
|
122
|
+
fs.writeFileSync(file, replacer(fs.readFileSync(file, 'utf8')));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Split a comma-separated keywords answer into a trimmed, empty-free list. */
|
|
126
|
+
function parseKeywords(input) {
|
|
127
|
+
return input
|
|
128
|
+
.split(',')
|
|
129
|
+
.map(keyword => keyword.trim())
|
|
130
|
+
.filter(Boolean);
|
|
131
|
+
}
|
|
132
|
+
/** A sensible default `author` from the user's git identity (`Name <email>`), or '' if unset. */
|
|
133
|
+
function defaultAuthor() {
|
|
134
|
+
const name = gitConfig('user.name');
|
|
135
|
+
const email = gitConfig('user.email');
|
|
136
|
+
return name ? (email ? `${name} <${email}>` : name) : '';
|
|
137
|
+
}
|
|
138
|
+
/** Read a global git config value, or '' when git isn't available / the key is unset. */
|
|
139
|
+
function gitConfig(key) {
|
|
140
|
+
try {
|
|
141
|
+
return execFileSync('git', ['config', '--get', key], {
|
|
142
|
+
encoding: 'utf8',
|
|
143
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
144
|
+
}).trim();
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return '';
|
|
148
|
+
}
|
|
58
149
|
}
|
|
59
|
-
function writeBasePackageJson(targetDir, name, coreManifestPath) {
|
|
150
|
+
function writeBasePackageJson(targetDir, name, meta, coreManifestPath, testsDir) {
|
|
60
151
|
const core = loadCoreManifest(coreManifestPath);
|
|
61
|
-
|
|
152
|
+
// Build in npm-conventional order; optional metadata is included only when the user provided it.
|
|
153
|
+
const pkg = {
|
|
62
154
|
name,
|
|
63
|
-
version: '0.1.0',
|
|
155
|
+
version: meta.version || '0.1.0',
|
|
64
156
|
private: true,
|
|
65
157
|
type: 'module',
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
158
|
+
};
|
|
159
|
+
if (meta.description) {
|
|
160
|
+
pkg.description = meta.description;
|
|
161
|
+
}
|
|
162
|
+
if (meta.author) {
|
|
163
|
+
pkg.author = meta.author;
|
|
164
|
+
}
|
|
165
|
+
pkg.license = meta.license || 'MIT';
|
|
166
|
+
if (meta.keywords.length > 0) {
|
|
167
|
+
pkg.keywords = meta.keywords;
|
|
168
|
+
}
|
|
169
|
+
if (meta.repository) {
|
|
170
|
+
pkg.repository = { type: 'git', url: meta.repository };
|
|
171
|
+
}
|
|
172
|
+
pkg.scripts = sortObject(core.scripts);
|
|
173
|
+
pkg.devDependencies = sortObject(core.devDependencies);
|
|
174
|
+
Object.assign(pkg, core.packageJson ?? {});
|
|
175
|
+
pkg.pwtap = { testsDir };
|
|
176
|
+
writeJson(path.join(targetDir, 'package.json'), pkg);
|
|
177
|
+
}
|
|
178
|
+
/** Standard Playwright CI — mirrors the workflow `npm init playwright` generates. */
|
|
179
|
+
function writeGithubWorkflow(targetDir) {
|
|
180
|
+
const dir = path.join(targetDir, '.github', 'workflows');
|
|
181
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
182
|
+
fs.writeFileSync(path.join(dir, 'playwright.yml'), GITHUB_WORKFLOW);
|
|
70
183
|
}
|
|
71
184
|
async function initGit(targetDir) {
|
|
72
185
|
// git init so husky's `prepare` can wire hooks during npm install (husky needs a .git dir).
|
|
@@ -97,7 +210,7 @@ function writeHuskyHooks(targetDir) {
|
|
|
97
210
|
}
|
|
98
211
|
}
|
|
99
212
|
}
|
|
100
|
-
function printNextSteps(targetDir, name) {
|
|
213
|
+
function printNextSteps(targetDir, name, testsDir) {
|
|
101
214
|
const rel = path.relative(process.cwd(), targetDir) || '.';
|
|
102
215
|
log.done(`Created ${name}`);
|
|
103
216
|
log.info([
|
|
@@ -106,9 +219,36 @@ function printNextSteps(targetDir, name) {
|
|
|
106
219
|
` cd ${rel}`,
|
|
107
220
|
' cp env/environments.example.json env/environments.json # set BASE_URL / API_BASE_URL',
|
|
108
221
|
' cp testData/users.example.json testData/users.json # add login sessions (optional)',
|
|
109
|
-
|
|
222
|
+
` npm test # chromium + api (in ${testsDir}/)`,
|
|
110
223
|
'',
|
|
111
|
-
'Add a plugin later: npx create-pwtap add <maestro|appium
|
|
224
|
+
'Add a plugin later: npx create-pwtap add <maestro|appium|ai-judge>',
|
|
112
225
|
].join('\n'));
|
|
113
226
|
}
|
|
227
|
+
const GITHUB_WORKFLOW = `name: Playwright Tests
|
|
228
|
+
on:
|
|
229
|
+
push:
|
|
230
|
+
branches: [main, master]
|
|
231
|
+
pull_request:
|
|
232
|
+
jobs:
|
|
233
|
+
test:
|
|
234
|
+
timeout-minutes: 60
|
|
235
|
+
runs-on: ubuntu-latest
|
|
236
|
+
steps:
|
|
237
|
+
- uses: actions/checkout@v4
|
|
238
|
+
- uses: actions/setup-node@v4
|
|
239
|
+
with:
|
|
240
|
+
node-version: 20
|
|
241
|
+
- name: Install dependencies
|
|
242
|
+
run: npm ci
|
|
243
|
+
- name: Install Playwright browsers
|
|
244
|
+
run: npx playwright install --with-deps
|
|
245
|
+
- name: Run tests
|
|
246
|
+
run: npm test
|
|
247
|
+
- uses: actions/upload-artifact@v4
|
|
248
|
+
if: \${{ !cancelled() }}
|
|
249
|
+
with:
|
|
250
|
+
name: playwright-report
|
|
251
|
+
path: playwright-report/
|
|
252
|
+
retention-days: 30
|
|
253
|
+
`;
|
|
114
254
|
//# sourceMappingURL=create.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -20,6 +20,20 @@ function flagPresent(argv, flag) {
|
|
|
20
20
|
const value = process.env[key];
|
|
21
21
|
return value !== undefined && value !== '' && value !== 'false';
|
|
22
22
|
}
|
|
23
|
+
/** Value of `--flag=x` / `--flag x`, or npm's `npm_config_<flag>`; undefined when absent. */
|
|
24
|
+
function flagValue(argv, flag) {
|
|
25
|
+
const eq = argv.find(a => a.startsWith(`${flag}=`));
|
|
26
|
+
if (eq !== undefined) {
|
|
27
|
+
return eq.slice(flag.length + 1);
|
|
28
|
+
}
|
|
29
|
+
const i = argv.indexOf(flag);
|
|
30
|
+
if (i !== -1 && argv[i + 1] !== undefined && !argv[i + 1].startsWith('-')) {
|
|
31
|
+
return argv[i + 1];
|
|
32
|
+
}
|
|
33
|
+
const key = `npm_config_${flag.replace(/^--/, '').replace(/-/g, '_')}`;
|
|
34
|
+
const value = process.env[key];
|
|
35
|
+
return value !== undefined && value !== '' && value !== 'false' ? value : undefined;
|
|
36
|
+
}
|
|
23
37
|
async function main() {
|
|
24
38
|
const argv = process.argv.slice(2);
|
|
25
39
|
const positional = argv.filter(a => !a.startsWith('-'));
|
|
@@ -27,6 +41,8 @@ async function main() {
|
|
|
27
41
|
const yes = flagPresent(argv, '--yes') || argv.includes('-y');
|
|
28
42
|
const install = !flagPresent(argv, '--no-install');
|
|
29
43
|
const browsers = !flagPresent(argv, '--no-browsers');
|
|
44
|
+
const gha = flagPresent(argv, '--gha');
|
|
45
|
+
const testsDirDefault = flagValue(argv, '--tests-dir') ?? 'tests';
|
|
30
46
|
const pluginIdsFromFlags = KNOWN_PLUGINS.filter(p => flagPresent(argv, p.flag)).map(p => p.id);
|
|
31
47
|
if (command === 'add') {
|
|
32
48
|
const ids = positional.slice(1).length > 0 ? positional.slice(1) : pluginIdsFromFlags;
|
|
@@ -43,6 +59,8 @@ async function main() {
|
|
|
43
59
|
yes,
|
|
44
60
|
install,
|
|
45
61
|
browsers,
|
|
62
|
+
gha,
|
|
63
|
+
testsDirDefault,
|
|
46
64
|
selectedPluginIds: pluginIdsFromFlags,
|
|
47
65
|
templateDir,
|
|
48
66
|
coreManifestPath,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PluginManifest } from '../manifest.js';
|
|
2
2
|
/** Copy a plugin's example tests/flows into the client once — never overwriting existing files. */
|
|
3
|
-
export declare function copyExamples(clientDir: string, m: PluginManifest): void;
|
|
3
|
+
export declare function copyExamples(clientDir: string, m: PluginManifest, testsDir?: string): void;
|
|
4
4
|
/** Copy a plugin's docs into the client (e.g. docs/MAESTRO.md). */
|
|
5
5
|
export declare function copyDocs(clientDir: string, m: PluginManifest): void;
|
|
6
6
|
//# sourceMappingURL=assets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/injectors/assets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0BrD,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/injectors/assets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0BrD,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,SAAU,GAAG,IAAI,CAM3F;AAUD,mEAAmE;AACnE,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,CAEnE"}
|
package/dist/injectors/assets.js
CHANGED
|
@@ -25,8 +25,18 @@ function packageRoot(clientDir, pkg) {
|
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
/** Copy a plugin's example tests/flows into the client once — never overwriting existing files. */
|
|
28
|
-
export function copyExamples(clientDir, m) {
|
|
29
|
-
|
|
28
|
+
export function copyExamples(clientDir, m, testsDir = 'tests') {
|
|
29
|
+
const examples = testsDir === 'tests'
|
|
30
|
+
? m.examples
|
|
31
|
+
: m.examples?.map(a => ({ ...a, dest: remapTestsDir(a.dest, testsDir) }));
|
|
32
|
+
copyAssets(clientDir, m, examples);
|
|
33
|
+
}
|
|
34
|
+
/** Rewrite a `tests/...` example destination onto the project's chosen tests folder. */
|
|
35
|
+
function remapTestsDir(dest, testsDir) {
|
|
36
|
+
if (dest === 'tests') {
|
|
37
|
+
return testsDir;
|
|
38
|
+
}
|
|
39
|
+
return dest.startsWith('tests/') ? `${testsDir}${dest.slice('tests'.length)}` : dest;
|
|
30
40
|
}
|
|
31
41
|
/** Copy a plugin's docs into the client (e.g. docs/MAESTRO.md). */
|
|
32
42
|
export function copyDocs(clientDir, m) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/injectors/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE3D,gGAAgG;AAChG,SAAS,WAAW,CAAC,SAAiB,EAAE,GAAW;IACjD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/C,oGAAoG;QACpG,kGAAkG;QAClG,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBAC3C,OAAO,GAAG,CAAC;YACb,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,GAAG,GAAG,MAAM,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,CAAiB;
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/injectors/assets.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin-apply.d.ts
CHANGED
|
@@ -2,8 +2,10 @@ export interface AddOptions {
|
|
|
2
2
|
clientDir: string;
|
|
3
3
|
pluginIds: string[];
|
|
4
4
|
install: boolean;
|
|
5
|
+
/** The project's tests folder (default 'tests') — where plugin example specs are copied. */
|
|
6
|
+
testsDir?: string;
|
|
5
7
|
}
|
|
6
|
-
export declare function addPlugins({ clientDir, pluginIds, install }: AddOptions): Promise<void>;
|
|
8
|
+
export declare function addPlugins({ clientDir, pluginIds, install, testsDir, }: AddOptions): Promise<void>;
|
|
7
9
|
export interface RemoveOptions {
|
|
8
10
|
clientDir: string;
|
|
9
11
|
pluginIds: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-apply.d.ts","sourceRoot":"","sources":["../src/plugin-apply.ts"],"names":[],"mappings":"AAwDA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-apply.d.ts","sourceRoot":"","sources":["../src/plugin-apply.ts"],"names":[],"mappings":"AAwDA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,UAAU,CAAC,EAC/B,SAAS,EACT,SAAS,EACT,OAAO,EACP,QAAkB,GACnB,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,aAAa,CAAC,EAClC,SAAS,EACT,SAAS,EACT,SAAgB,GACjB,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/B"}
|
package/dist/plugin-apply.js
CHANGED
|
@@ -14,10 +14,10 @@ function toPackages(pluginIds) {
|
|
|
14
14
|
.filter((p) => Boolean(p));
|
|
15
15
|
}
|
|
16
16
|
/** Run all injectors for one plugin manifest. Warns (does not throw) when a marker is missing. */
|
|
17
|
-
function injectManifest(clientDir, m) {
|
|
17
|
+
function injectManifest(clientDir, m, testsDir) {
|
|
18
18
|
mergePluginPackageJson(clientDir, m);
|
|
19
19
|
mergePluginEnv(clientDir, m);
|
|
20
|
-
copyExamples(clientDir, m);
|
|
20
|
+
copyExamples(clientDir, m, testsDir);
|
|
21
21
|
copyDocs(clientDir, m);
|
|
22
22
|
if (applyFixture(clientDir, m) === false) {
|
|
23
23
|
log.warn(`fixtures/index.ts is missing a pwtap marker — wire ${m.name} into the barrel manually ` +
|
|
@@ -44,7 +44,7 @@ async function runEnsure(clientDir, m) {
|
|
|
44
44
|
log.warn(`${m.name} ensure() check skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
export async function addPlugins({ clientDir, pluginIds, install }) {
|
|
47
|
+
export async function addPlugins({ clientDir, pluginIds, install, testsDir = 'tests', }) {
|
|
48
48
|
const packages = toPackages(pluginIds);
|
|
49
49
|
if (packages.length === 0) {
|
|
50
50
|
return;
|
|
@@ -59,7 +59,7 @@ export async function addPlugins({ clientDir, pluginIds, install }) {
|
|
|
59
59
|
log.warn(`Could not load manifest for ${pkg} — is it installed? Skipping.`);
|
|
60
60
|
continue;
|
|
61
61
|
}
|
|
62
|
-
injectManifest(clientDir, m);
|
|
62
|
+
injectManifest(clientDir, m, testsDir);
|
|
63
63
|
await runEnsure(clientDir, m);
|
|
64
64
|
log.done(`Added ${pkg}`);
|
|
65
65
|
}
|
package/dist/plugin-apply.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-apply.js","sourceRoot":"","sources":["../src/plugin-apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAuB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,uFAAuF;AACvF,SAAS,UAAU,CAAC,SAAmB;IACrC,OAAO,SAAS;SACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAChF,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,kGAAkG;AAClG,SAAS,cAAc,CAAC,SAAiB,EAAE,CAAiB;
|
|
1
|
+
{"version":3,"file":"plugin-apply.js","sourceRoot":"","sources":["../src/plugin-apply.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAuB,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,uFAAuF;AACvF,SAAS,UAAU,CAAC,SAAmB;IACrC,OAAO,SAAS;SACb,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SAChF,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,kGAAkG;AAClG,SAAS,cAAc,CAAC,SAAiB,EAAE,CAAiB,EAAE,QAAgB;IAC5E,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACrC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7B,YAAY,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IAEvB,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CACN,sDAAsD,CAAC,CAAC,IAAI,4BAA4B;YACtF,iBAAiB,CAAC,CAAC,OAAO,EAAE,UAAU,wCAAwC,CACjF,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CACN,kFAAkF,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAC9G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,KAAK,UAAU,SAAS,CAAC,SAAiB,EAAE,CAAiB;IAC3D,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAqC,CAAC;QAC7F,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;IACvB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,CAAC,IAAI,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAC/B,SAAS,EACT,SAAS,EACT,OAAO,EACP,QAAQ,GAAG,OAAO,GACP;IACX,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,CAAC,oBAAoB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvF,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,+BAA+B,GAAG,+BAA+B,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QACD,cAAc,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,qFAAqF;IACrF,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAClC,SAAS,EACT,SAAS,EACT,SAAS,GAAG,IAAI,GACF;IACd,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,IAAI,CAAC,+BAA+B,GAAG,iCAAiC,CAAC,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5B,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5B,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9B,uBAAuB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,SAAS,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
package/dist/registry.js
CHANGED
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,mDAAmD;QAChE,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C;QACE,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,mDAAmD;QAChE,IAAI,EAAE,WAAW;QACjB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,QAAQ;KACjB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,OAAO,EAAE,sBAAsB;QAC/B,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,iEAAiE;QAC9E,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,aAAa;KACtB;IACD;QACE,EAAE,EAAE,UAAU;QACd,OAAO,EAAE,wBAAwB;QACjC,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,oEAAoE;QACjF,IAAI,EAAE,YAAY;QAClB,eAAe,EAAE,KAAK;QACtB,MAAM,EAAE,QAAQ;KACjB;CACF,CAAC;AAEF,iDAAiD;AACjD,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC;AACpF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pwtap/create",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Scaffold a Playwright Test Automation Platform project — UI + API core with opt-in plugins (npm init @pwtap)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/caslanqa/
|
|
9
|
+
"url": "git+https://github.com/caslanqa/test-automation-platform.git",
|
|
10
10
|
"directory": "packages/create"
|
|
11
11
|
},
|
|
12
12
|
"engines": {
|
|
@@ -7,7 +7,7 @@ import { expect, test } from '@fixtures';
|
|
|
7
7
|
* fixtures/auth.ts → ensureSession) which caches `.auth/demoUser.json`; every later test and run
|
|
8
8
|
* reuses that file — no repeated logins, no setup project.
|
|
9
9
|
*
|
|
10
|
-
* Run: `npx playwright test tests/
|
|
10
|
+
* Run: `npx playwright test tests/ui/authSession.spec.ts --project=chromium`
|
|
11
11
|
*
|
|
12
12
|
* NOTE: each session needs its own describe with a single `test.use({ session })` — two `test.use`
|
|
13
13
|
* calls in one describe do not create two scopes; the last one wins for every test in that describe.
|
|
File without changes
|