openspec-playwright 0.3.6 โ 0.3.8
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/.claude/skills/openspec-e2e/CLAUDE.md +14 -2
- package/.claude/skills/openspec-e2e/SKILL.md +56 -2
- package/README.md +6 -5
- package/employee-standards.md +8 -5
- package/package.json +1 -1
- package/templates/CLAUDE.md +16 -1
- package/templates/global.teardown.ts +74 -0
- package/templates/playwright.config.ts +4 -1
|
@@ -3,9 +3,21 @@
|
|
|
3
3
|
|
|
4
4
|
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
5
|
|
|
6
|
-
###
|
|
6
|
+
### Mar 27, 2026
|
|
7
7
|
|
|
8
8
|
| ID | Time | T | Title | Read |
|
|
9
9
|
|----|------|---|-------|------|
|
|
10
|
-
| #
|
|
10
|
+
| #5635 | 3:00 PM | โ
| Simplified skill input instructions | ~201 |
|
|
11
|
+
| #5634 | " | ๐ฃ | Improved change selection logic in openspec-e2e skill | ~200 |
|
|
12
|
+
| #5633 | " | ๐ต | openspec-e2e SKILL.md implements three-agent Playwright pipeline | ~252 |
|
|
13
|
+
| #5511 | 11:22 AM | โ
| Extended guardrails to protect auth files from overwriting | ~181 |
|
|
14
|
+
| #5510 | 11:21 AM | ๐ฃ | Enhanced SKILL.md with Playwright auth project configuration | ~228 |
|
|
15
|
+
| #5427 | 10:05 AM | โ
| Committed style fixes aligning SKILL.md with OpenSpec template standard | ~281 |
|
|
16
|
+
|
|
17
|
+
### Apr 16, 2026
|
|
18
|
+
|
|
19
|
+
| ID | Time | T | Title | Read |
|
|
20
|
+
|----|------|---|-------|------|
|
|
21
|
+
| #5997 | 9:59 AM | ๐ต | openspec-e2e skill uses openspec-pw CLI for parallel exploration | ~279 |
|
|
22
|
+
| #5996 | " | ๐ต | openspec-e2e skill handles missing auth gracefully | ~172 |
|
|
11
23
|
</claude-mem-context>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: openspec-e2e
|
|
3
|
-
description: Run Playwright E2E verification
|
|
3
|
+
description: "Run Playwright E2E verification. ONLY invoke when user explicitly says '/opsx:e2e' or 'run E2E tests'. Do NOT auto-trigger from explore/propose/apply/verify/continue stages โ E2E is a separate workflow requiring explicit user request."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: Requires openspec CLI, Playwright (with browsers installed), /browse (gstack, for exploration), and @playwright/mcp (globally installed via `claude mcp add playwright npx @playwright/mcp@latest`, for test execution + Healer).
|
|
6
6
|
metadata:
|
|
@@ -32,10 +32,64 @@ Two modes, same pipeline:
|
|
|
32
32
|
| Change | `/opsx:e2e <name>` | OpenSpec specs | `changes/<name>/<name>.spec.ts` |
|
|
33
33
|
| All | `/opsx:e2e all` | sitemap + homepage crawl | `pages/*.ts` (Page Objects) |
|
|
34
34
|
|
|
35
|
-
Both modes update `app-knowledge.md` and `app-exploration.md`.
|
|
35
|
+
Both modes update `app-knowledge.md` and `app-exploration.md`. Spec files are independent per change โ `openspec-pw run <name>` runs only `changes/<name>/<name>.spec.ts`.
|
|
36
|
+
|
|
37
|
+
> **โ ๏ธ Full regression is opt-in only.** Default: `openspec-pw run <name>` โ one spec file. Do NOT run `npx playwright test` (no file), `--only-changed`, or any command that executes multiple `.spec.ts` files unless the user explicitly requests it. This includes running the same command twice across different changes to simulate regression.
|
|
36
38
|
|
|
37
39
|
> **Role mapping**: Planner (Step 4โ5) โ test-plan.md; Generator (Step 6) โ `.spec.ts` + Page Objects; Healer (Step 9) โ repairs failures via MCP.
|
|
38
40
|
|
|
41
|
+
## Setup / Teardown
|
|
42
|
+
|
|
43
|
+
Playwright supports two approaches for global lifecycle hooks. **openspec-playwright uses project dependencies** (the recommended approach) for full feature support.
|
|
44
|
+
|
|
45
|
+
### Comparison
|
|
46
|
+
|
|
47
|
+
| Feature | Project Dependencies | globalSetup/globalTeardown |
|
|
48
|
+
|---------|---------------------|---------------------------|
|
|
49
|
+
| HTML report visibility | โ
Shown as project | โ Not shown |
|
|
50
|
+
| Trace recording | โ
Full support | โ Not supported |
|
|
51
|
+
| Playwright fixtures | โ
Fully supported | โ Not supported |
|
|
52
|
+
| Browser via fixture | โ
Automatic | โ Manual launch |
|
|
53
|
+
|
|
54
|
+
### Current Implementation
|
|
55
|
+
|
|
56
|
+
**Setup project** (enabled by default):
|
|
57
|
+
- `tests/playwright/auth.setup.ts` โ authenticates once, saves session to `./playwright/.auth/user.json`
|
|
58
|
+
- All test projects depend on setup via `dependencies: ['setup']`
|
|
59
|
+
|
|
60
|
+
**Teardown project** (optional, disabled by default):
|
|
61
|
+
- `tests/playwright/global.teardown.ts` โ runs AFTER all tests complete
|
|
62
|
+
- Use for: database cleanup, uploaded file removal, cache invalidation
|
|
63
|
+
- Enable by uncommenting in `playwright.config.ts`
|
|
64
|
+
|
|
65
|
+
### When to Enable Teardown
|
|
66
|
+
|
|
67
|
+
Enable teardown when your tests create persistent data that should be cleaned up:
|
|
68
|
+
|
|
69
|
+
| Scenario | Action |
|
|
70
|
+
|----------|--------|
|
|
71
|
+
| Tests create database records | โ
Enable teardown, add DB cleanup |
|
|
72
|
+
| Tests upload files | โ
Enable teardown, add file cleanup |
|
|
73
|
+
| Tests only read data | โ No teardown needed |
|
|
74
|
+
| Tests use ephemeral/isolated environments | โ No teardown needed |
|
|
75
|
+
|
|
76
|
+
### Enabling Teardown
|
|
77
|
+
|
|
78
|
+
1. Copy template: `cp templates/global.teardown.ts tests/playwright/global.teardown.ts`
|
|
79
|
+
2. Customize cleanup logic in the file
|
|
80
|
+
3. Uncomment in `playwright.config.ts`:
|
|
81
|
+
```typescript
|
|
82
|
+
projects: [
|
|
83
|
+
{ name: 'setup', testMatch: /.*\.setup\.ts/ },
|
|
84
|
+
{ name: 'teardown', testMatch: /global\.teardown\.ts/ }, // Uncomment
|
|
85
|
+
{
|
|
86
|
+
name: 'chromium',
|
|
87
|
+
// ...
|
|
88
|
+
teardown: 'teardown', // Uncomment
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
```
|
|
92
|
+
|
|
39
93
|
## Testing principles
|
|
40
94
|
|
|
41
95
|
**UI first** โ Test every user flow through the browser UI. E2E validates that users can accomplish tasks in the real interface, not just that the backend responds correctly.
|
package/README.md
CHANGED
|
@@ -149,7 +149,7 @@ Edit `tests/playwright/credentials.yaml`:
|
|
|
149
149
|
|
|
150
150
|
```
|
|
151
151
|
Templates (in npm package, installed to .claude/skills/openspec-e2e/templates/)
|
|
152
|
-
โโโ test-plan.md, report.md, playwright.config.ts, e2e-test.ts, app-exploration.md
|
|
152
|
+
โโโ test-plan.md, report.md, playwright.config.ts, e2e-test.ts, global.teardown.ts, app-exploration.md
|
|
153
153
|
|
|
154
154
|
CLI (openspec-pw)
|
|
155
155
|
โโโ init โ Installs commands, skill & templates to .claude/
|
|
@@ -166,10 +166,11 @@ Claude Code (/opsx:e2e)
|
|
|
166
166
|
โโโ @playwright/mcp โ Healer Agent tools
|
|
167
167
|
|
|
168
168
|
Test Assets (tests/playwright/)
|
|
169
|
-
โโโ seed.spec.ts
|
|
170
|
-
โโโ auth.setup.ts
|
|
171
|
-
โโโ
|
|
172
|
-
|
|
169
|
+
โโโ seed.spec.ts โ Env validation
|
|
170
|
+
โโโ auth.setup.ts โ Session recording
|
|
171
|
+
โโโ global.teardown.ts โ Post-test cleanup (optional)
|
|
172
|
+
โโโ credentials.yaml โ Test users
|
|
173
|
+
โโโ app-knowledge.md โ Project-level selector patterns (cross-change)
|
|
173
174
|
|
|
174
175
|
Exploration (openspec/changes/<name>/specs/playwright/)
|
|
175
176
|
โโโ app-exploration.md โ This change's routes + verified selectors
|
package/employee-standards.md
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
ๆฌ่ง่้็จไบ OpenSpec + openspec-playwright ้กน็ฎ๏ผClaude Code ไฝไธบๅผๅๅทฅๅ
ท๏ผใ
|
|
10
10
|
|
|
11
|
+
**้กน็ฎ่ง่**๏ผๅจๆๅ่ฏป `openspec/config.yaml`๏ผๆๆฏๆ ใ็ปๆใ็บฆๅฎใ็บฆๆ็ญ๏ผ๏ผๆ ๅ
ๅฎนๅๅฟฝ็ฅใ
|
|
12
|
+
|
|
11
13
|
E2E ๅทฅไฝๆตๅๆ๏ผ็ฑ็จๆท็กฎไฟ๏ผ้ AI ๆไฝ๏ผ๏ผ
|
|
12
14
|
- gstack๏ผ`git clone --single-branch --depth 1 https://github.com/garrytan/gstack.git ~/.claude/skills/gstack && cd ~/.claude/skills/gstack && ./setup`๏ผๆไพ `/browse` ๆข็ดข + `/qa` ๆต่งๅจ้ช่ฏ๏ผ
|
|
13
15
|
- OpenSpec CLI๏ผ`npm install -g @fission-ai/openspec && openspec init`๏ผๆไพๅๆด็ฎก็่ฝๅ๏ผ
|
|
@@ -28,7 +30,7 @@ E2E ๅทฅไฝๆตๅๆ๏ผ็ฑ็จๆท็กฎไฟ๏ผ้ AI ๆไฝ๏ผ๏ผ
|
|
|
28
30
|
## 3. ไธไธๆ็ฎก็
|
|
29
31
|
**ๆไปถ่ฏปๅๅฎๆด**๏ผ่ถ
่ฟ 500 ่ก็ๆไปถ๏ผไธ่ฆๅ่ฎพๅๆฌก่ฏปๅ่ฆ็ๅฎๆดๅ
ๅฎนโโๆ นๆฎ้่ฆๅๆฌก่ฏปๅๆ็ผ่พๅ้ๆฐ่ฏปๅๅฎๆดๆไปถใ่ถ
่ฟ 10 ๆกๆถๆฏๅ๏ผ็ผ่พไปปไฝๆไปถๅๅผบๅถ้ๆฐ่ฏปๅใ
|
|
30
32
|
|
|
31
|
-
**OpenSpec
|
|
33
|
+
**OpenSpec ้ถๆฎต้็ฆป**๏ผๆๆ้ถๆฎตๅ็ฑ็จๆทๆๅจ่งฆๅ๏ผไธ่ชๅจ่ฟๅ
ฅไธไธ้ถๆฎตใ`/opsx:explore`ใ`/opsx:propose`ใ`/opsx:apply`ใ`/opsx:verify`ใ`/opsx:e2e` ๅ้็จๆทๆ็กฎ่ฐ็จใ็ฆๆญขๅจๅไธ้ถๆฎตๅ
่งฆๅๅ
ถไป้ถๆฎต๏ผๅฆ explore ้ถๆฎตไธ่ฝ่ฐ็จ apply๏ผverify ้ถๆฎตไธ่ฝ่ฐ็จ e2e๏ผใ
|
|
32
34
|
|
|
33
35
|
**้ๆๅๆธ
ๆญปไปฃ็ **๏ผๆชไฝฟ็จ็ import/export/prop/console.log ๅ
ๅ ๆ๏ผๅ็ฌๆไบค๏ผๅๅ้ๆใ
|
|
34
36
|
|
|
@@ -51,11 +53,11 @@ E2E ๅทฅไฝๆตๅๆ๏ผ็ฑ็จๆท็กฎไฟ๏ผ้ AI ๆไฝ๏ผ๏ผ
|
|
|
51
53
|
```
|
|
52
54
|
1. ๆข็ดขไธๆๆก
|
|
53
55
|
2. ไบงๅไธๆถๆ่ฏๅฎก๏ผๆ้่งฆๅ๏ผ
|
|
54
|
-
3. ่ฎพ่ฎกๅฎกๆฅ
|
|
56
|
+
3. ่ฎพ่ฎกๅฎกๆฅ โ /plan-design-review
|
|
55
57
|
4. ๅฎ็ฐ โ /opsx:apply
|
|
56
58
|
5. ่ชๅฎก โ /opsx:verify
|
|
57
59
|
6. E2E ๆต่ฏ โ /opsx:e2e <change-name> โ /browse ๆข็ดข + /qa ้ช่ฏ
|
|
58
|
-
7. ๅๅธ โ /ship ๆ /land-and-deploy
|
|
60
|
+
7. ๅๅธ โ ็จๆทๆๅจ /ship ๆ /land-and-deploy
|
|
59
61
|
8. ่ฟญไปฃๅ้กพ โ /retro
|
|
60
62
|
```
|
|
61
63
|
|
|
@@ -68,13 +70,14 @@ E2E ๅทฅไฝๆตๅๆ๏ผ็ฑ็จๆท็กฎไฟ๏ผ้ AI ๆไฝ๏ผ๏ผ
|
|
|
68
70
|
- `/plan-eng-review`๏ผๆถๆๅฝฑๅ๏ผๆฐๅขๆๅกใAPI ๅฅ็บฆๅๆดใๆฐๆฎๆจกๅ้ๆ๏ผๆถ
|
|
69
71
|
|
|
70
72
|
**3. ่ฎพ่ฎกๅฎกๆฅ**๏ผๅจๅฎ็ฐๅ่ฟ่ก่ฎพ่ฎก่ฏๅฎก๏ผ็กฎไฟๆนๆกๅ็ใ่ฏๅฎก้่ฟๅๅผๅงๅฎ็ฐใ
|
|
73
|
+
- `/plan-design-review`๏ผUI/UX ๆนๆกๅฎกๆฅ๏ผ่ฏๅๅ่ฎพ่ฎก็ปดๅบฆ๏ผ็กฎไฟ็จๆทไฝ้ช่พพๆ
|
|
71
74
|
|
|
72
75
|
**4. ๅฎ็ฐ**๏ผๆง่ก `/opsx:apply` ่ฟ่กๅฎ็ฐ โ `lint + typecheck` ้่ฟๆ็ฎๆๅใ
|
|
73
76
|
|
|
74
77
|
**5. ่ชๅฎก**๏ผ`/opsx:verify` ่ชๅฎกๅฎ็ฐไปฃ็ ๏ผ็กฎไฟ่ดจ้ใ
|
|
75
78
|
|
|
76
|
-
**6. E2E ๆต่ฏ**๏ผ`/opsx:e2e <change-name>` ็ๆ Playwright ๆต่ฏ โ `/browse` ๆข็ดข็ๅฎ DOM โ Healer ่ชๅจไฟฎๅค โ `/qa` ็ๅฎๆต่งๅจ้ช่ฏใE2E
|
|
79
|
+
**6. E2E ๆต่ฏ**๏ผ`/opsx:e2e <change-name>` ็ๆ Playwright ๆต่ฏ โ `/browse` ๆข็ดข็ๅฎ DOM โ Healer ่ชๅจไฟฎๅค โ `/qa` ็ๅฎๆต่งๅจ้ช่ฏใE2E ้่ฟๅ๏ผ็ฑ็จๆทๅณๅฎๅๅธๆถๆบใ
|
|
77
80
|
|
|
78
|
-
**7.
|
|
81
|
+
**7. ๅๅธ**๏ผ็ฑ็จๆทๆๅจ่งฆๅ `/ship`ใ`/land-and-deploy` ๆ `/canary`ใๅ
้จ้กน็ฎๅฏ่ฝ็ดๆฅ้จ็ฝฒ๏ผๆ ้่ตฐ PR ๆบๅถใ
|
|
79
82
|
|
|
80
83
|
**8. ่ฟญไปฃๅ้กพ**๏ผ`/retro`
|
package/package.json
CHANGED
package/templates/CLAUDE.md
CHANGED
|
@@ -3,5 +3,20 @@
|
|
|
3
3
|
|
|
4
4
|
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
### Mar 27, 2026
|
|
7
|
+
|
|
8
|
+
| ID | Time | T | Title | Read |
|
|
9
|
+
|----|------|---|-------|------|
|
|
10
|
+
| #5522 | 11:25 AM | ๐ต | Playwright auth setup template supports API and UI login | ~261 |
|
|
11
|
+
| #5514 | 11:22 AM | ๐ฃ | Created credentials.yaml template for E2E test authentication | ~227 |
|
|
12
|
+
| #5513 | " | ๐ฃ | Created auth.setup.ts template for Playwright Test Agents | ~276 |
|
|
13
|
+
| #5390 | 9:48 AM | ๐ | Refactored openspec-playwright from CLI to setup tool + Claude Code skill | ~209 |
|
|
14
|
+
| #5375 | 9:44 AM | ๐ฃ | Created Playwright seed test template | ~224 |
|
|
15
|
+
|
|
16
|
+
### Apr 16, 2026
|
|
17
|
+
|
|
18
|
+
| ID | Time | T | Title | Read |
|
|
19
|
+
|----|------|---|-------|------|
|
|
20
|
+
| #6002 | 10:06 AM | ๐ต | openspec-e2e provides seed test template with anti-patterns documented | ~299 |
|
|
21
|
+
| #5998 | 9:59 AM | ๐ต | OpenSpec Playwright auth.setup.ts uses session reuse pattern | ~202 |
|
|
7
22
|
</claude-mem-context>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// Global Teardown for Playwright Test Agents
|
|
2
|
+
// This file runs AFTER all tests complete โ use it to clean up test data.
|
|
3
|
+
//
|
|
4
|
+
// Setup:
|
|
5
|
+
// 1. Uncomment the teardown project in playwright.config.ts
|
|
6
|
+
// 2. Customize the cleanup logic below for your project
|
|
7
|
+
// 3. Run: npx playwright test (teardown runs automatically after all tests)
|
|
8
|
+
//
|
|
9
|
+
// Common use cases:
|
|
10
|
+
// - Database cleanup: DELETE test records created during E2E runs
|
|
11
|
+
// - API cleanup: Call /api/test/cleanup endpoint
|
|
12
|
+
// - File cleanup: Remove uploaded test files or artifacts
|
|
13
|
+
// - Cache invalidation: Clear Redis/Memcached test keys
|
|
14
|
+
|
|
15
|
+
import { test as teardown } from '@playwright/test';
|
|
16
|
+
|
|
17
|
+
teardown('cleanup test data', async ({ request }) => {
|
|
18
|
+
const baseUrl = process.env.BASE_URL || 'http://localhost:3000';
|
|
19
|
+
|
|
20
|
+
// โโโ Option 1: API-based cleanup (recommended) โโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
21
|
+
// If your app has a test cleanup endpoint, call it here.
|
|
22
|
+
// Example: POST /api/test/cleanup with a secret token
|
|
23
|
+
//
|
|
24
|
+
// const cleanupToken = process.env.E2E_CLEANUP_TOKEN;
|
|
25
|
+
// if (cleanupToken) {
|
|
26
|
+
// const res = await request.post(`${baseUrl}/api/test/cleanup`, {
|
|
27
|
+
// headers: { 'X-Cleanup-Token': cleanupToken },
|
|
28
|
+
// });
|
|
29
|
+
// if (!res.ok()) {
|
|
30
|
+
// console.warn(`Cleanup API returned ${res.status()}`);
|
|
31
|
+
// }
|
|
32
|
+
// }
|
|
33
|
+
|
|
34
|
+
// โโโ Option 2: Database cleanup (direct connection) โโโโโโโโโโโโโโโโโโโโโโ
|
|
35
|
+
// If you have direct DB access, clean up test records.
|
|
36
|
+
// Example using pg (PostgreSQL):
|
|
37
|
+
//
|
|
38
|
+
// import { Pool } from 'pg';
|
|
39
|
+
// const pool = new Pool({ connectionString: process.env.DATABASE_URL });
|
|
40
|
+
// await pool.query(`
|
|
41
|
+
// DELETE FROM orders WHERE email LIKE '%@test.example.com';
|
|
42
|
+
// DELETE FROM users WHERE email LIKE '%@test.example.com';
|
|
43
|
+
// `);
|
|
44
|
+
// await pool.end();
|
|
45
|
+
|
|
46
|
+
// โโโ Option 3: File cleanup โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
47
|
+
// Remove test-generated files or uploads.
|
|
48
|
+
//
|
|
49
|
+
// import { rm } from 'fs/promises';
|
|
50
|
+
// await rm('./uploads/test-*', { recursive: true, force: true });
|
|
51
|
+
|
|
52
|
+
// โโโ Option 4: Session/cache cleanup โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
53
|
+
// Invalidate test sessions or cache entries.
|
|
54
|
+
//
|
|
55
|
+
// import Redis from 'ioredis';
|
|
56
|
+
// const redis = new Redis(process.env.REDIS_URL);
|
|
57
|
+
// const keys = await redis.keys('session:test-*');
|
|
58
|
+
// if (keys.length) await redis.del(...keys);
|
|
59
|
+
// await redis.quit();
|
|
60
|
+
|
|
61
|
+
console.log('โ Global teardown completed');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// โโโ Additional teardown tasks (optional) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
65
|
+
// Add more teardown blocks if you need to clean up different resources
|
|
66
|
+
// in a specific order.
|
|
67
|
+
|
|
68
|
+
// teardown('cleanup uploaded files', async ({ }) => {
|
|
69
|
+
// // File cleanup logic
|
|
70
|
+
// });
|
|
71
|
+
|
|
72
|
+
// teardown('invalidate cache', async ({ }) => {
|
|
73
|
+
// // Cache cleanup logic
|
|
74
|
+
// });
|
|
@@ -90,9 +90,11 @@ export default defineConfig({
|
|
|
90
90
|
reuseExistingServer: true,
|
|
91
91
|
},
|
|
92
92
|
|
|
93
|
-
// Setup project
|
|
93
|
+
// Setup project (configured by openspec-pw run)
|
|
94
|
+
// Teardown project (optional): uncomment the two lines below + create tests/playwright/global.teardown.ts
|
|
94
95
|
projects: [
|
|
95
96
|
{ name: 'setup', testMatch: /.*\.setup\.ts/ },
|
|
97
|
+
// { name: 'teardown', testMatch: /global\.teardown\.ts/ }, // Uncomment + create file
|
|
96
98
|
{
|
|
97
99
|
name: 'chromium',
|
|
98
100
|
use: {
|
|
@@ -100,6 +102,7 @@ export default defineConfig({
|
|
|
100
102
|
storageState: './playwright/.auth/user.json',
|
|
101
103
|
},
|
|
102
104
|
dependencies: ['setup'],
|
|
105
|
+
// teardown: 'teardown', // Uncomment when teardown project is enabled
|
|
103
106
|
},
|
|
104
107
|
],
|
|
105
108
|
});
|