@se-studio/site-check 1.5.2 → 2.1.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 +16 -0
- package/README.md +7 -4
- package/dist/smoke-test/index.d.ts +3 -3
- package/dist/smoke-test/index.d.ts.map +1 -1
- package/dist/smoke-test/index.js +2 -2
- package/dist/smoke-test/index.js.map +1 -1
- package/dist/smoke-test/runner.d.ts +6 -8
- package/dist/smoke-test/runner.d.ts.map +1 -1
- package/dist/smoke-test/runner.js +153 -35
- package/dist/smoke-test/runner.js.map +1 -1
- package/dist/smoke-test/static.d.ts +5 -0
- package/dist/smoke-test/static.d.ts.map +1 -0
- package/dist/smoke-test/static.js +59 -0
- package/dist/smoke-test/static.js.map +1 -0
- package/dist/smoke-test/types.d.ts +31 -89
- package/dist/smoke-test/types.d.ts.map +1 -1
- package/package.json +2 -3
- package/smoke-test-one.mjs +74 -27
- package/dist/smoke-test/planner.d.ts +0 -14
- package/dist/smoke-test/planner.d.ts.map +0 -1
- package/dist/smoke-test/planner.js +0 -214
- package/dist/smoke-test/planner.js.map +0 -1
- package/smoke-test-preload.cjs +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.1.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- `smoke-test-one` starts `pnpm dev:dev` by default (configurable via `SMOKE_TEST_SERVER_SCRIPT`; `start` still runs `pnpm build` first).
|
|
8
|
+
- Add cache verification: `SMOKE_TEST_VERIFY_CACHE=true` runs smoke twice and checks `x-nextjs-cache` on HTML responses.
|
|
9
|
+
- Smoke runner records per-case cache headers and timing; exports `runSmokeTestWithCacheVerify` and `parseNextJsCacheHeader`.
|
|
10
|
+
|
|
11
|
+
## 2.0.0
|
|
12
|
+
|
|
13
|
+
### Major Changes
|
|
14
|
+
|
|
15
|
+
- **Smoke tests are static and HTTP-only.** Apps commit `smoke.cases.json` (curated URLs from sitemap setup). Removed CMS-driven planner (`planSmokeTestUrls`, `buildSmokeConfig`, `resolveSmokeConfig`, `runFullSmokeTest`), link getters, and `smoke-test-preload.cjs`.
|
|
16
|
+
- Added `loadStaticSmokeConfig`, `runStaticSmokeTest`, and `joinSmokeBaseUrl` on `@se-studio/site-check/smoke-test`.
|
|
17
|
+
- `smoke-test-one` no longer injects a Node preload; `smoke-test:run` only needs a running server and `smoke.cases.json`.
|
|
18
|
+
|
|
3
19
|
## 1.5.2
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -94,11 +94,11 @@ Programmatic module for live production SEO audits (used by per-app `pnpm seo:au
|
|
|
94
94
|
|
|
95
95
|
## Smoke tests (`@se-studio/site-check/smoke-test`)
|
|
96
96
|
|
|
97
|
-
Curated local smoke tests for marketing sites:
|
|
97
|
+
Curated local smoke tests for marketing sites: verify HTML and `.md` for URLs listed in **`smoke.cases.json`** (generated once from a live sitemap — see skill `se-marketing-sites-smoke-test-setup`).
|
|
98
98
|
|
|
99
99
|
Import from `@se-studio/site-check/smoke-test`:
|
|
100
100
|
|
|
101
|
-
- `
|
|
101
|
+
- `loadStaticSmokeConfig`, `runStaticSmokeTest`, `runSmokeTest`
|
|
102
102
|
- `formatSmokeTestReport`, `getSmokeTestExitCode`
|
|
103
103
|
|
|
104
104
|
**Per-app usage** (see `apps/example-empty`):
|
|
@@ -106,10 +106,13 @@ Import from `@se-studio/site-check/smoke-test`:
|
|
|
106
106
|
```bash
|
|
107
107
|
pnpm build --filter @se-studio/site-check # once, or after package changes
|
|
108
108
|
cd apps/example-empty
|
|
109
|
-
pnpm smoke-test
|
|
109
|
+
pnpm smoke-test:run # dev server must be running on app port
|
|
110
|
+
pnpm smoke-test # dev server + smoke (default dev:dev) + stop
|
|
110
111
|
```
|
|
111
112
|
|
|
112
|
-
Add `smoke.
|
|
113
|
+
Add `smoke.cases.json` and `scripts/smoke-test-run.ts`. No Contentful or `cms-server` imports required. Set `SMOKE_TEST_IGNORE=true` in `.env.local` to skip the full `smoke-test` CI script.
|
|
114
|
+
|
|
115
|
+
**`smoke-test-one` env:** `SMOKE_TEST_SERVER_SCRIPT=dev:dev` (default) or `start` (runs `pnpm build` first). `SMOKE_TEST_VERIFY_CACHE=true` runs smoke twice and checks `x-nextjs-cache` headers (sets `LOG_CMS_FETCH=1` on the dev server). `SMOKE_TEST_READY_PATH=/` polls until the server responds.
|
|
113
116
|
|
|
114
117
|
## Exit codes
|
|
115
118
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export type {
|
|
1
|
+
export { formatSmokeTestReport, getSmokeTestExitCode, isSmokeTestCacheVerifyResult, parseNextJsCacheHeader, runSmokeTest, runSmokeTestWithCacheVerify, } from './runner.js';
|
|
2
|
+
export { joinSmokeBaseUrl, loadStaticSmokeConfig, runStaticSmokeTest } from './static.js';
|
|
3
|
+
export type { LoadStaticSmokeConfigOptions, NextJsCacheStatus, RunStaticSmokeTestOptions, SmokeFailureReason, SmokeTestCacheVerifyResult, SmokeTestCase, SmokeTestCaseResult, SmokeTestCategory, SmokeTestResult, SmokeTestRunnerConfig, StaticSmokeCaseDefinition, StaticSmokeConfigFile, } from './types.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smoke-test/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/smoke-test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC1F,YAAY,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,yBAAyB,EACzB,kBAAkB,EAClB,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
package/dist/smoke-test/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { formatSmokeTestReport, getSmokeTestExitCode, isSmokeTestCacheVerifyResult, parseNextJsCacheHeader, runSmokeTest, runSmokeTestWithCacheVerify, } from './runner.js';
|
|
2
|
+
export { joinSmokeBaseUrl, loadStaticSmokeConfig, runStaticSmokeTest } from './static.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/smoke-test/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/smoke-test/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,4BAA4B,EAC5B,sBAAsB,EACtB,YAAY,EACZ,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noConsole: CLI output is intentional */
|
|
2
|
-
import type { SmokeTestResult, SmokeTestRunnerConfig } from './types.js';
|
|
2
|
+
import type { NextJsCacheStatus, SmokeTestCacheVerifyResult, SmokeTestResult, SmokeTestRunnerConfig } from './types.js';
|
|
3
|
+
export declare function parseNextJsCacheHeader(value: string | null): NextJsCacheStatus | null;
|
|
3
4
|
export declare function runSmokeTest(config: SmokeTestRunnerConfig): Promise<SmokeTestResult>;
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
-
|
|
8
|
-
requestDelayMs?: number;
|
|
9
|
-
fetch?: typeof fetch;
|
|
10
|
-
}): Promise<SmokeTestResult>;
|
|
5
|
+
export declare function runSmokeTestWithCacheVerify(config: SmokeTestRunnerConfig): Promise<SmokeTestCacheVerifyResult>;
|
|
6
|
+
export declare function isSmokeTestCacheVerifyResult(result: SmokeTestResult | SmokeTestCacheVerifyResult): result is SmokeTestCacheVerifyResult;
|
|
7
|
+
export declare function getSmokeTestExitCode(result: SmokeTestResult | SmokeTestCacheVerifyResult): number;
|
|
8
|
+
export declare function formatSmokeTestReport(result: SmokeTestResult | SmokeTestCacheVerifyResult): string;
|
|
11
9
|
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/smoke-test/runner.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/smoke-test/runner.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,KAAK,EACV,iBAAiB,EAEjB,0BAA0B,EAG1B,eAAe,EACf,qBAAqB,EACtB,MAAM,YAAY,CAAC;AAapB,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB,GAAG,IAAI,CAOrF;AAuFD,wBAAsB,YAAY,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC,CAqC1F;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,0BAA0B,CAAC,CA2DrC;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,eAAe,GAAG,0BAA0B,GACnD,MAAM,IAAI,0BAA0B,CAEtC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,0BAA0B,GAAG,MAAM,CAQjG;AAuFD,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,GAAG,0BAA0B,GACnD,MAAM,CAiBR"}
|
|
@@ -9,16 +9,47 @@ function isMarkdownContentType(contentType) {
|
|
|
9
9
|
return false;
|
|
10
10
|
return contentType.toLowerCase().includes('text/markdown');
|
|
11
11
|
}
|
|
12
|
-
|
|
12
|
+
export function parseNextJsCacheHeader(value) {
|
|
13
|
+
if (!value)
|
|
14
|
+
return null;
|
|
15
|
+
const normalized = value.toUpperCase();
|
|
16
|
+
if (normalized === 'HIT' || normalized === 'MISS' || normalized === 'STALE') {
|
|
17
|
+
return normalized;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
function countCacheStatuses(cases) {
|
|
22
|
+
let hit = 0;
|
|
23
|
+
let stale = 0;
|
|
24
|
+
let miss = 0;
|
|
25
|
+
let absent = 0;
|
|
26
|
+
for (const row of cases) {
|
|
27
|
+
const status = row.htmlNextCache;
|
|
28
|
+
if (status === 'HIT')
|
|
29
|
+
hit++;
|
|
30
|
+
else if (status === 'STALE')
|
|
31
|
+
stale++;
|
|
32
|
+
else if (status === 'MISS')
|
|
33
|
+
miss++;
|
|
34
|
+
else
|
|
35
|
+
absent++;
|
|
36
|
+
}
|
|
37
|
+
return { hit, stale, miss, absent };
|
|
38
|
+
}
|
|
39
|
+
async function checkCase(testCase, minMarkdownLength, fetchFn) {
|
|
40
|
+
const started = Date.now();
|
|
13
41
|
const failures = [];
|
|
14
42
|
let htmlStatus = 0;
|
|
15
43
|
let markdownStatus = 0;
|
|
16
44
|
let markdownLength = 0;
|
|
17
45
|
let markdownContentType = null;
|
|
18
46
|
let markdownBodySnippet = null;
|
|
47
|
+
let htmlNextCache = null;
|
|
48
|
+
let markdownNextCache = null;
|
|
19
49
|
try {
|
|
20
50
|
const htmlRes = await fetchFn(testCase.pageUrl, { method: 'GET', redirect: 'follow' });
|
|
21
51
|
htmlStatus = htmlRes.status;
|
|
52
|
+
htmlNextCache = parseNextJsCacheHeader(htmlRes.headers.get('x-nextjs-cache'));
|
|
22
53
|
if (htmlStatus < 200 || htmlStatus >= 300) {
|
|
23
54
|
failures.push('html_non_2xx');
|
|
24
55
|
}
|
|
@@ -33,6 +64,7 @@ async function checkCase(testCase, baseUrl, minMarkdownLength, fetchFn) {
|
|
|
33
64
|
const mdRes = await fetchFn(mdUrl, { method: 'GET', redirect: 'follow' });
|
|
34
65
|
markdownStatus = mdRes.status;
|
|
35
66
|
markdownContentType = mdRes.headers.get('content-type');
|
|
67
|
+
markdownNextCache = parseNextJsCacheHeader(mdRes.headers.get('x-nextjs-cache'));
|
|
36
68
|
const body = await mdRes.text();
|
|
37
69
|
markdownLength = body.length;
|
|
38
70
|
markdownBodySnippet = body.slice(0, 120).replace(/\s+/g, ' ').trim();
|
|
@@ -59,6 +91,9 @@ async function checkCase(testCase, baseUrl, minMarkdownLength, fetchFn) {
|
|
|
59
91
|
markdownContentType,
|
|
60
92
|
failures,
|
|
61
93
|
markdownBodySnippet,
|
|
94
|
+
htmlNextCache,
|
|
95
|
+
markdownNextCache,
|
|
96
|
+
durationMs: Date.now() - started,
|
|
62
97
|
};
|
|
63
98
|
}
|
|
64
99
|
export async function runSmokeTest(config) {
|
|
@@ -69,7 +104,7 @@ export async function runSmokeTest(config) {
|
|
|
69
104
|
if (requestDelayMs > 0 && results.length > 0) {
|
|
70
105
|
await sleep(requestDelayMs);
|
|
71
106
|
}
|
|
72
|
-
results.push(await checkCase(testCase,
|
|
107
|
+
results.push(await checkCase(testCase, minMarkdownLength, fetchFn));
|
|
73
108
|
}
|
|
74
109
|
let errorCount = 0;
|
|
75
110
|
const warnCount = 0;
|
|
@@ -87,15 +122,93 @@ export async function runSmokeTest(config) {
|
|
|
87
122
|
warnCount,
|
|
88
123
|
};
|
|
89
124
|
}
|
|
125
|
+
export async function runSmokeTestWithCacheVerify(config) {
|
|
126
|
+
const pass1Started = Date.now();
|
|
127
|
+
const pass1 = await runSmokeTest(config);
|
|
128
|
+
const pass1DurationMs = Date.now() - pass1Started;
|
|
129
|
+
const pass2Started = Date.now();
|
|
130
|
+
const pass2 = await runSmokeTest(config);
|
|
131
|
+
const pass2DurationMs = Date.now() - pass2Started;
|
|
132
|
+
const cacheVerifyFailures = [];
|
|
133
|
+
if (pass1.errorCount > 0) {
|
|
134
|
+
cacheVerifyFailures.push(`pass 1 had ${pass1.errorCount} functional failure(s)`);
|
|
135
|
+
}
|
|
136
|
+
if (pass2.errorCount > 0) {
|
|
137
|
+
cacheVerifyFailures.push(`pass 2 had ${pass2.errorCount} functional failure(s)`);
|
|
138
|
+
}
|
|
139
|
+
const pass2Cache = countCacheStatuses(pass2.cases);
|
|
140
|
+
const pass1Cache = countCacheStatuses(pass1.cases);
|
|
141
|
+
const pass2WithHeader = pass2.cases.length - pass2Cache.absent;
|
|
142
|
+
if (pass2WithHeader > 0) {
|
|
143
|
+
const pass2Cached = pass2Cache.hit + pass2Cache.stale;
|
|
144
|
+
if (pass2Cached < pass2.cases.length) {
|
|
145
|
+
cacheVerifyFailures.push(`pass 2 HTML cache: expected all HIT/STALE, got HIT=${pass2Cache.hit} STALE=${pass2Cache.stale} MISS=${pass2Cache.miss} absent=${pass2Cache.absent}`);
|
|
146
|
+
}
|
|
147
|
+
const pass1Uncached = pass1Cache.miss + pass1Cache.absent;
|
|
148
|
+
if (pass1Uncached > 0 && pass2Cached < pass1Uncached) {
|
|
149
|
+
cacheVerifyFailures.push(`pass 2 did not improve on pass 1 (pass1 MISS/absent=${pass1Uncached}, pass2 HIT/STALE=${pass2Cached})`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
pass2.warnings.push('x-nextjs-cache header absent on all pass 2 HTML responses — cache verify used timing only');
|
|
154
|
+
if (pass2DurationMs >= pass1DurationMs) {
|
|
155
|
+
cacheVerifyFailures.push(`pass 2 (${pass2DurationMs}ms) not faster than pass 1 (${pass1DurationMs}ms) with no cache headers`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (pass2WithHeader > 0 && pass2DurationMs >= pass1DurationMs) {
|
|
159
|
+
pass2.warnings.push(`pass 2 (${pass2DurationMs}ms) not faster than pass 1 (${pass1DurationMs}ms) despite cache hits`);
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
pass1,
|
|
163
|
+
pass2,
|
|
164
|
+
pass1DurationMs,
|
|
165
|
+
pass2DurationMs,
|
|
166
|
+
cacheVerifyFailures,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export function isSmokeTestCacheVerifyResult(result) {
|
|
170
|
+
return 'pass1' in result;
|
|
171
|
+
}
|
|
90
172
|
export function getSmokeTestExitCode(result) {
|
|
91
|
-
|
|
92
|
-
|
|
173
|
+
if (isSmokeTestCacheVerifyResult(result)) {
|
|
174
|
+
if (result.pass2.errorCount > 0 || result.pass1.errorCount > 0)
|
|
175
|
+
return 1;
|
|
176
|
+
if (result.cacheVerifyFailures.length > 0)
|
|
177
|
+
return 1;
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
if (result.errorCount > 0)
|
|
93
181
|
return 1;
|
|
94
182
|
return 0;
|
|
95
183
|
}
|
|
96
|
-
|
|
184
|
+
function formatCacheLabel(status) {
|
|
185
|
+
return status ?? 'absent';
|
|
186
|
+
}
|
|
187
|
+
function formatCaseRows(rows, includeCache) {
|
|
97
188
|
const lines = [];
|
|
98
|
-
|
|
189
|
+
for (const row of rows) {
|
|
190
|
+
const status = row.failures.length === 0 ? 'ok' : `FAIL (${row.failures.join(', ')})`;
|
|
191
|
+
const cacheSuffix = includeCache
|
|
192
|
+
? `, x-nextjs-cache=${formatCacheLabel(row.htmlNextCache)}, ${row.durationMs}ms`
|
|
193
|
+
: '';
|
|
194
|
+
lines.push(` ${row.case.label}`);
|
|
195
|
+
lines.push(` page: ${row.case.pageUrl} → HTML ${row.htmlStatus} [${status}]${cacheSuffix}`);
|
|
196
|
+
if (row.case.expectMarkdown) {
|
|
197
|
+
const mdUrl = htmlUrlToMarkdownUrl(row.case.pageUrl);
|
|
198
|
+
const mdCacheSuffix = includeCache
|
|
199
|
+
? `, x-nextjs-cache=${formatCacheLabel(row.markdownNextCache)}`
|
|
200
|
+
: '';
|
|
201
|
+
lines.push(` md: ${mdUrl} → ${row.markdownStatus} (${row.markdownLength} chars) [${status}]${mdCacheSuffix}`);
|
|
202
|
+
if (row.failures.includes('markdown_missing') && row.markdownBodySnippet) {
|
|
203
|
+
lines.push(` md body: ${row.markdownBodySnippet}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return lines;
|
|
208
|
+
}
|
|
209
|
+
function formatSinglePass(result, label, includeCache) {
|
|
210
|
+
const lines = [];
|
|
211
|
+
lines.push(`### ${label}`);
|
|
99
212
|
lines.push('');
|
|
100
213
|
const byCategory = new Map();
|
|
101
214
|
for (const row of result.cases) {
|
|
@@ -106,18 +219,7 @@ export function formatSmokeTestReport(result) {
|
|
|
106
219
|
}
|
|
107
220
|
for (const [category, rows] of byCategory) {
|
|
108
221
|
lines.push(`## ${category}`);
|
|
109
|
-
|
|
110
|
-
const status = row.failures.length === 0 ? 'ok' : `FAIL (${row.failures.join(', ')})`;
|
|
111
|
-
lines.push(` ${row.case.label}`);
|
|
112
|
-
lines.push(` page: ${row.case.pageUrl} → HTML ${row.htmlStatus} [${status}]`);
|
|
113
|
-
if (row.case.expectMarkdown) {
|
|
114
|
-
const mdUrl = htmlUrlToMarkdownUrl(row.case.pageUrl);
|
|
115
|
-
lines.push(` md: ${mdUrl} → ${row.markdownStatus} (${row.markdownLength} chars) [${status}]`);
|
|
116
|
-
if (row.failures.includes('markdown_missing') && row.markdownBodySnippet) {
|
|
117
|
-
lines.push(` md body: ${row.markdownBodySnippet}`);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
222
|
+
lines.push(...formatCaseRows(rows, includeCache));
|
|
121
223
|
lines.push('');
|
|
122
224
|
}
|
|
123
225
|
if (result.warnings.length > 0) {
|
|
@@ -128,26 +230,42 @@ export function formatSmokeTestReport(result) {
|
|
|
128
230
|
lines.push('');
|
|
129
231
|
}
|
|
130
232
|
lines.push(`Summary: ${result.cases.length} cases, ${result.errorCount} failed, ${result.warnings.length} warnings`);
|
|
131
|
-
return lines
|
|
233
|
+
return lines;
|
|
132
234
|
}
|
|
133
|
-
|
|
134
|
-
const
|
|
135
|
-
const
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
if (plannerWarnings.some((w) => w.startsWith('ERROR:'))) {
|
|
146
|
-
result.warnCount += plannerWarnings.filter((w) => w.startsWith('ERROR:')).length;
|
|
235
|
+
function formatCacheVerifySummary(result) {
|
|
236
|
+
const pass1Cache = countCacheStatuses(result.pass1.cases);
|
|
237
|
+
const pass2Cache = countCacheStatuses(result.pass2.cases);
|
|
238
|
+
const lines = [];
|
|
239
|
+
lines.push('## cache-verify');
|
|
240
|
+
lines.push(` pass 1: ${result.pass1.cases.length} cases, ${result.pass1DurationMs}ms, x-nextjs-cache HIT=${pass1Cache.hit} STALE=${pass1Cache.stale} MISS=${pass1Cache.miss} absent=${pass1Cache.absent}`);
|
|
241
|
+
lines.push(` pass 2: ${result.pass2.cases.length} cases, ${result.pass2DurationMs}ms, x-nextjs-cache HIT=${pass2Cache.hit} STALE=${pass2Cache.stale} MISS=${pass2Cache.miss} absent=${pass2Cache.absent}`);
|
|
242
|
+
if (result.cacheVerifyFailures.length > 0) {
|
|
243
|
+
lines.push(' failures:');
|
|
244
|
+
for (const failure of result.cacheVerifyFailures) {
|
|
245
|
+
lines.push(` - ${failure}`);
|
|
246
|
+
}
|
|
147
247
|
}
|
|
148
248
|
else {
|
|
149
|
-
|
|
249
|
+
lines.push(' cache verify: ok');
|
|
150
250
|
}
|
|
151
|
-
|
|
251
|
+
lines.push('');
|
|
252
|
+
return lines;
|
|
253
|
+
}
|
|
254
|
+
export function formatSmokeTestReport(result) {
|
|
255
|
+
if (isSmokeTestCacheVerifyResult(result)) {
|
|
256
|
+
const lines = [];
|
|
257
|
+
lines.push(`Smoke test (cache verify): ${result.pass1.siteName} (${result.pass1.baseUrl})`);
|
|
258
|
+
lines.push('');
|
|
259
|
+
lines.push(...formatCacheVerifySummary(result));
|
|
260
|
+
lines.push(...formatSinglePass(result.pass1, 'Pass 1 (warm cache)', true));
|
|
261
|
+
lines.push('');
|
|
262
|
+
lines.push(...formatSinglePass(result.pass2, 'Pass 2 (expect cached)', true));
|
|
263
|
+
return lines.join('\n');
|
|
264
|
+
}
|
|
265
|
+
const lines = [];
|
|
266
|
+
lines.push(`Smoke test: ${result.siteName} (${result.baseUrl})`);
|
|
267
|
+
lines.push('');
|
|
268
|
+
lines.push(...formatSinglePass(result, 'Results', false));
|
|
269
|
+
return lines.join('\n');
|
|
152
270
|
}
|
|
153
271
|
//# sourceMappingURL=runner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/smoke-test/runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/smoke-test/runner.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAWpE,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAEvC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,WAA0B;IACvD,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAC/B,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QAC5E,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA4B;IAMtD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC;QACjC,IAAI,MAAM,KAAK,KAAK;YAAE,GAAG,EAAE,CAAC;aACvB,IAAI,MAAM,KAAK,OAAO;YAAE,KAAK,EAAE,CAAC;aAChC,IAAI,MAAM,KAAK,MAAM;YAAE,IAAI,EAAE,CAAC;;YAC9B,MAAM,EAAE,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,QAAuB,EACvB,iBAAyB,EACzB,OAAqB;IAErB,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,mBAAmB,GAAkB,IAAI,CAAC;IAC9C,IAAI,aAAa,GAA6B,IAAI,CAAC;IACnD,IAAI,iBAAiB,GAA6B,IAAI,CAAC;IAEvD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,aAAa,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC9E,IAAI,UAAU,GAAG,GAAG,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,CAAC,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;YAC9B,mBAAmB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACxD,iBAAiB,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAChF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7B,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAErE,IAAI,cAAc,GAAG,GAAG,IAAI,cAAc,IAAI,GAAG,EAAE,CAAC;gBAClD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACvD,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,cAAc,GAAG,iBAAiB,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,cAAc;QACd,cAAc;QACd,mBAAmB;QACnB,QAAQ;QACR,mBAAmB;QACnB,aAAa;QACb,iBAAiB;QACjB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAA6B;IAC9D,MAAM,EACJ,OAAO,EACP,QAAQ,EACR,KAAK,EACL,iBAAiB,GAAG,2BAA2B,EAC/C,cAAc,GAAG,CAAC,EAClB,KAAK,EAAE,OAAO,GAAG,KAAK,GACvB,GAAG,MAAM,CAAC;IAEX,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,cAAc,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,KAAK,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,MAAM,SAAS,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,OAAO;QACd,QAAQ;QACR,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAA6B;IAE7B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IAElD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IAElD,MAAM,mBAAmB,GAAa,EAAE,CAAC;IAEzC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACzB,mBAAmB,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,UAAU,wBAAwB,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QACzB,mBAAmB,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,UAAU,wBAAwB,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAE/D,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC;QACtD,IAAI,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACrC,mBAAmB,CAAC,IAAI,CACtB,sDAAsD,UAAU,CAAC,GAAG,UAAU,UAAU,CAAC,KAAK,SAAS,UAAU,CAAC,IAAI,WAAW,UAAU,CAAC,MAAM,EAAE,CACrJ,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;QAC1D,IAAI,aAAa,GAAG,CAAC,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;YACrD,mBAAmB,CAAC,IAAI,CACtB,uDAAuD,aAAa,qBAAqB,WAAW,GAAG,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,QAAQ,CAAC,IAAI,CACjB,2FAA2F,CAC5F,CAAC;QACF,IAAI,eAAe,IAAI,eAAe,EAAE,CAAC;YACvC,mBAAmB,CAAC,IAAI,CACtB,WAAW,eAAe,+BAA+B,eAAe,2BAA2B,CACpG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,eAAe,GAAG,CAAC,IAAI,eAAe,IAAI,eAAe,EAAE,CAAC;QAC9D,KAAK,CAAC,QAAQ,CAAC,IAAI,CACjB,WAAW,eAAe,+BAA+B,eAAe,wBAAwB,CACjG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK;QACL,KAAK;QACL,eAAe;QACf,eAAe;QACf,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAAoD;IAEpD,OAAO,OAAO,IAAI,MAAM,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAoD;IACvF,IAAI,4BAA4B,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACzE,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAgC;IACxD,OAAO,MAAM,IAAI,QAAQ,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,IAA2B,EAAE,YAAqB;IACxE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACtF,MAAM,WAAW,GAAG,YAAY;YAC9B,CAAC,CAAC,oBAAoB,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,UAAU,IAAI;YAChF,CAAC,CAAC,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,OAAO,WAAW,GAAG,CAAC,UAAU,KAAK,MAAM,IAAI,WAAW,EAAE,CAAC,CAAC;QAC/F,IAAI,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,aAAa,GAAG,YAAY;gBAChC,CAAC,CAAC,oBAAoB,gBAAgB,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;gBAC/D,CAAC,CAAC,EAAE,CAAC;YACP,KAAK,CAAC,IAAI,CACR,aAAa,KAAK,MAAM,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC,cAAc,YAAY,MAAM,IAAI,aAAa,EAAE,CACvG,CAAC;YACF,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC;gBACzE,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAuB,EAAE,KAAa,EAAE,YAAqB;IACrF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,YAAY,MAAM,CAAC,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,UAAU,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,CACzG,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAkC;IAClE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CACR,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,eAAe,0BAA0B,UAAU,CAAC,GAAG,UAAU,UAAU,CAAC,KAAK,SAAS,UAAU,CAAC,IAAI,WAAW,UAAU,CAAC,MAAM,EAAE,CAChM,CAAC;IACF,KAAK,CAAC,IAAI,CACR,aAAa,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,WAAW,MAAM,CAAC,eAAe,0BAA0B,UAAU,CAAC,GAAG,UAAU,UAAU,CAAC,KAAK,SAAS,UAAU,CAAC,IAAI,WAAW,UAAU,CAAC,MAAM,EAAE,CAChM,CAAC;IACF,IAAI,MAAM,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAAoD;IAEpD,IAAI,4BAA4B,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,EAAE,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { LoadStaticSmokeConfigOptions, RunStaticSmokeTestOptions, SmokeTestCacheVerifyResult, SmokeTestResult, SmokeTestRunnerConfig } from './types.js';
|
|
2
|
+
export declare function joinSmokeBaseUrl(baseUrl: string, path: string): string;
|
|
3
|
+
export declare function loadStaticSmokeConfig(filePath: string, options?: LoadStaticSmokeConfigOptions): SmokeTestRunnerConfig;
|
|
4
|
+
export declare function runStaticSmokeTest(filePath: string, options?: RunStaticSmokeTestOptions): Promise<SmokeTestResult | SmokeTestCacheVerifyResult>;
|
|
5
|
+
//# sourceMappingURL=static.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/smoke-test/static.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,EAE1B,eAAe,EACf,qBAAqB,EAEtB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAItE;AAaD,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,4BAA4B,GACrC,qBAAqB,CA0BvB;AASD,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,eAAe,GAAG,0BAA0B,CAAC,CAUvD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { runSmokeTest, runSmokeTestWithCacheVerify } from './runner.js';
|
|
4
|
+
export function joinSmokeBaseUrl(baseUrl, path) {
|
|
5
|
+
const normalizedBase = baseUrl.replace(/\/$/, '');
|
|
6
|
+
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
7
|
+
return `${normalizedBase}${normalizedPath}`;
|
|
8
|
+
}
|
|
9
|
+
function resolvePort(config, portOverride) {
|
|
10
|
+
const fromEnv = process.env.SMOKE_TEST_PORT;
|
|
11
|
+
if (portOverride !== undefined) {
|
|
12
|
+
return portOverride;
|
|
13
|
+
}
|
|
14
|
+
if (fromEnv && /^\d+$/.test(fromEnv)) {
|
|
15
|
+
return Number(fromEnv);
|
|
16
|
+
}
|
|
17
|
+
return config.port;
|
|
18
|
+
}
|
|
19
|
+
export function loadStaticSmokeConfig(filePath, options) {
|
|
20
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
21
|
+
const absolutePath = resolve(cwd, filePath);
|
|
22
|
+
const raw = JSON.parse(readFileSync(absolutePath, 'utf8'));
|
|
23
|
+
if (!raw.siteName || !raw.port || !Array.isArray(raw.cases)) {
|
|
24
|
+
throw new Error(`Invalid smoke config: ${absolutePath}`);
|
|
25
|
+
}
|
|
26
|
+
const port = resolvePort(raw, options?.portOverride);
|
|
27
|
+
const baseUrl = `http://localhost:${port}`;
|
|
28
|
+
const cases = raw.cases.map((entry) => ({
|
|
29
|
+
category: entry.category,
|
|
30
|
+
label: entry.label,
|
|
31
|
+
pageUrl: joinSmokeBaseUrl(baseUrl, entry.path),
|
|
32
|
+
expectMarkdown: entry.expectMarkdown,
|
|
33
|
+
}));
|
|
34
|
+
return {
|
|
35
|
+
siteName: raw.siteName,
|
|
36
|
+
baseUrl,
|
|
37
|
+
cases,
|
|
38
|
+
minMarkdownLength: raw.minMarkdownLength,
|
|
39
|
+
requestDelayMs: raw.requestDelayMs,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function resolveVerifyCache(options) {
|
|
43
|
+
if (options?.verifyCache !== undefined) {
|
|
44
|
+
return options.verifyCache;
|
|
45
|
+
}
|
|
46
|
+
return (process.env.SMOKE_TEST_VERIFY_CACHE ?? '').toLowerCase() === 'true';
|
|
47
|
+
}
|
|
48
|
+
export async function runStaticSmokeTest(filePath, options) {
|
|
49
|
+
const config = loadStaticSmokeConfig(filePath, options);
|
|
50
|
+
const runnerConfig = {
|
|
51
|
+
...config,
|
|
52
|
+
fetch: options?.fetch,
|
|
53
|
+
};
|
|
54
|
+
if (resolveVerifyCache(options)) {
|
|
55
|
+
return runSmokeTestWithCacheVerify(runnerConfig);
|
|
56
|
+
}
|
|
57
|
+
return runSmokeTest(runnerConfig);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/smoke-test/static.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,95 +5,23 @@ export interface SmokeTestCase {
|
|
|
5
5
|
pageUrl: string;
|
|
6
6
|
expectMarkdown: boolean;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
person: (slug: string) => string;
|
|
15
|
-
team: () => string;
|
|
16
|
-
customType: (slug: string) => string;
|
|
17
|
-
}
|
|
18
|
-
export interface SmokeLinkWithHref {
|
|
19
|
-
href?: string | null;
|
|
20
|
-
slug?: string | null;
|
|
21
|
-
indexed?: boolean | null;
|
|
22
|
-
hidden?: boolean | null;
|
|
23
|
-
}
|
|
24
|
-
export interface SmokeArticleTypeRef {
|
|
25
|
-
slug?: string;
|
|
26
|
-
indexed?: boolean | null;
|
|
27
|
-
hidden?: boolean | null;
|
|
28
|
-
}
|
|
29
|
-
export interface SmokeTagRef {
|
|
30
|
-
slug?: string;
|
|
31
|
-
indexed?: boolean | null;
|
|
32
|
-
hidden?: boolean | null;
|
|
33
|
-
}
|
|
34
|
-
export interface SmokeArticleLink extends SmokeLinkWithHref {
|
|
35
|
-
slug?: string | null;
|
|
36
|
-
articleType?: SmokeArticleTypeRef | null;
|
|
37
|
-
tags?: SmokeTagRef[] | null;
|
|
38
|
-
primaryTag?: SmokeTagRef | null;
|
|
39
|
-
hasBodyContent?: boolean;
|
|
40
|
-
download?: unknown;
|
|
41
|
-
}
|
|
42
|
-
export interface SmokeArticleTypeLink extends SmokeLinkWithHref {
|
|
43
|
-
slug: string;
|
|
44
|
-
}
|
|
45
|
-
export interface SmokePersonLink extends SmokeLinkWithHref {
|
|
46
|
-
slug: string;
|
|
47
|
-
}
|
|
48
|
-
export interface SmokeLinkGetters {
|
|
49
|
-
getAllPageLinks: () => Promise<{
|
|
50
|
-
data: SmokeLinkWithHref[];
|
|
51
|
-
}>;
|
|
52
|
-
getAllArticleLinks: () => Promise<{
|
|
53
|
-
data: SmokeArticleLink[];
|
|
54
|
-
}>;
|
|
55
|
-
getAllArticleTypeLinks: () => Promise<{
|
|
56
|
-
data: SmokeArticleTypeLink[];
|
|
57
|
-
}>;
|
|
58
|
-
getAllTagLinks: () => Promise<{
|
|
59
|
-
data: SmokeLinkWithHref[];
|
|
60
|
-
}>;
|
|
61
|
-
getAllPersonLinks: () => Promise<{
|
|
62
|
-
data: SmokePersonLink[];
|
|
63
|
-
}>;
|
|
64
|
-
}
|
|
65
|
-
export interface SmokeFeatureFlags {
|
|
66
|
-
articlesSlug?: string;
|
|
67
|
-
tagsSlug: string;
|
|
68
|
-
peopleSlug?: string;
|
|
69
|
-
enableArticleTypeIndex: boolean;
|
|
70
|
-
enableArticleTypeTagIndex: boolean;
|
|
71
|
-
enablePeopleIndex: boolean;
|
|
72
|
-
enablePerson: boolean;
|
|
73
|
-
enableTag: boolean;
|
|
74
|
-
enableTagsIndex: boolean;
|
|
75
|
-
}
|
|
76
|
-
export interface SmokeTestOverrides {
|
|
77
|
-
pages?: string[];
|
|
78
|
-
articleTypeTags?: Array<{
|
|
79
|
-
articleType: string;
|
|
80
|
-
tag: string;
|
|
81
|
-
}>;
|
|
82
|
-
customTypeListings?: string[];
|
|
83
|
-
skipCategories?: SmokeTestCategory[];
|
|
84
|
-
skipMarkdownPaths?: string[];
|
|
8
|
+
/** One row in app-level smoke.cases.json (path is site-relative). */
|
|
9
|
+
export interface StaticSmokeCaseDefinition {
|
|
10
|
+
category: SmokeTestCategory;
|
|
11
|
+
label: string;
|
|
12
|
+
path: string;
|
|
13
|
+
expectMarkdown: boolean;
|
|
85
14
|
}
|
|
86
|
-
|
|
15
|
+
/** Committed per app; regenerate via se-marketing-sites-smoke-test-setup skill. */
|
|
16
|
+
export interface StaticSmokeConfigFile {
|
|
87
17
|
siteName: string;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
overrides?: SmokeTestOverrides;
|
|
93
|
-
samplesPerCategory?: number;
|
|
94
|
-
insufficientSamples?: 'warn' | 'fail';
|
|
18
|
+
port: number;
|
|
19
|
+
cases: StaticSmokeCaseDefinition[];
|
|
20
|
+
minMarkdownLength?: number;
|
|
21
|
+
requestDelayMs?: number;
|
|
95
22
|
}
|
|
96
|
-
export type SmokeFailureReason = 'html_non_2xx' | 'markdown_missing' | 'markdown_wrong_content_type' | 'markdown_too_short'
|
|
23
|
+
export type SmokeFailureReason = 'html_non_2xx' | 'markdown_missing' | 'markdown_wrong_content_type' | 'markdown_too_short';
|
|
24
|
+
export type NextJsCacheStatus = 'HIT' | 'MISS' | 'STALE';
|
|
97
25
|
export interface SmokeTestCaseResult {
|
|
98
26
|
case: SmokeTestCase;
|
|
99
27
|
htmlStatus: number;
|
|
@@ -102,6 +30,9 @@ export interface SmokeTestCaseResult {
|
|
|
102
30
|
markdownContentType: string | null;
|
|
103
31
|
failures: SmokeFailureReason[];
|
|
104
32
|
markdownBodySnippet: string | null;
|
|
33
|
+
htmlNextCache: NextJsCacheStatus | null;
|
|
34
|
+
markdownNextCache: NextJsCacheStatus | null;
|
|
35
|
+
durationMs: number;
|
|
105
36
|
}
|
|
106
37
|
export interface SmokeTestResult {
|
|
107
38
|
siteName: string;
|
|
@@ -119,8 +50,19 @@ export interface SmokeTestRunnerConfig {
|
|
|
119
50
|
requestDelayMs?: number;
|
|
120
51
|
fetch?: typeof fetch;
|
|
121
52
|
}
|
|
122
|
-
export interface
|
|
123
|
-
|
|
124
|
-
|
|
53
|
+
export interface LoadStaticSmokeConfigOptions {
|
|
54
|
+
cwd?: string;
|
|
55
|
+
portOverride?: number;
|
|
56
|
+
}
|
|
57
|
+
export interface RunStaticSmokeTestOptions extends LoadStaticSmokeConfigOptions {
|
|
58
|
+
fetch?: typeof fetch;
|
|
59
|
+
verifyCache?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface SmokeTestCacheVerifyResult {
|
|
62
|
+
pass1: SmokeTestResult;
|
|
63
|
+
pass2: SmokeTestResult;
|
|
64
|
+
pass1DurationMs: number;
|
|
65
|
+
pass2DurationMs: number;
|
|
66
|
+
cacheVerifyFailures: string[];
|
|
125
67
|
}
|
|
126
68
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/smoke-test/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,GACN,oBAAoB,GACpB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,KAAK,GACL,0BAA0B,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/smoke-test/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,GACN,oBAAoB,GACpB,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,KAAK,GACL,0BAA0B,GAC1B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,qEAAqE;AACrE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,yBAAyB,EAAE,CAAC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,kBAAkB,GAClB,6BAA6B,GAC7B,oBAAoB,CAAC;AAEzB,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,iBAAiB,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B;IAC7E,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,EAAE,eAAe,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,EAAE,CAAC;CAC/B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@se-studio/site-check",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Validate SE marketing sites (sitemap, llms.txt) and download markdown files preserving structure",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,8 +41,7 @@
|
|
|
41
41
|
"files": [
|
|
42
42
|
"dist",
|
|
43
43
|
"*.md",
|
|
44
|
-
"smoke-test-one.mjs"
|
|
45
|
-
"smoke-test-preload.cjs"
|
|
44
|
+
"smoke-test-one.mjs"
|
|
46
45
|
],
|
|
47
46
|
"keywords": [
|
|
48
47
|
"sitemap",
|
package/smoke-test-one.mjs
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Start a dev (or production) server and smoke-test one marketing app.
|
|
5
5
|
* Usage: smoke-test-one <port> (from app directory)
|
|
6
|
-
*
|
|
6
|
+
*
|
|
7
|
+
* Env:
|
|
8
|
+
* SMOKE_TEST_IGNORE=true — skip entirely
|
|
9
|
+
* SMOKE_TEST_SERVER_SCRIPT=dev:dev — pnpm script to start server (default dev:dev; use "start" for prod)
|
|
10
|
+
* SMOKE_TEST_VERIFY_CACHE=true — run smoke twice and assert cache headers / timing
|
|
11
|
+
* SMOKE_TEST_READY_PATH=/ — path polled until server responds
|
|
12
|
+
* LOG_CMS_FETCH=1 — set automatically when SMOKE_TEST_VERIFY_CACHE=true
|
|
7
13
|
*/
|
|
8
14
|
|
|
9
15
|
import fs from 'node:fs';
|
|
10
16
|
import path from 'node:path';
|
|
11
17
|
import { spawn, spawnSync } from 'node:child_process';
|
|
12
|
-
import { fileURLToPath } from 'node:url';
|
|
13
|
-
|
|
14
|
-
const smokeTestPreload = fileURLToPath(new URL('./smoke-test-preload.cjs', import.meta.url));
|
|
15
18
|
|
|
16
19
|
const port = process.argv[2];
|
|
17
20
|
if (!port || !/^\d+$/.test(port)) {
|
|
@@ -21,7 +24,6 @@ if (!port || !/^\d+$/.test(port)) {
|
|
|
21
24
|
|
|
22
25
|
const appDir = process.cwd();
|
|
23
26
|
const baseUrl = `http://localhost:${port}`;
|
|
24
|
-
const startTimeoutMs = 120_000;
|
|
25
27
|
const pollIntervalMs = 1_000;
|
|
26
28
|
|
|
27
29
|
function parseEnvFile(filePath) {
|
|
@@ -44,12 +46,11 @@ function parseEnvFile(filePath) {
|
|
|
44
46
|
|
|
45
47
|
function loadEnv() {
|
|
46
48
|
const envLocal = parseEnvFile(path.join(appDir, '.env.local'));
|
|
47
|
-
|
|
48
|
-
return { ...process.env, ...envExample, ...envLocal, PORT: port };
|
|
49
|
+
return { ...process.env, ...envLocal, PORT: port };
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
async function waitForServer(url) {
|
|
52
|
-
const deadline = Date.now() +
|
|
52
|
+
async function waitForServer(url, timeoutMs) {
|
|
53
|
+
const deadline = Date.now() + timeoutMs;
|
|
53
54
|
while (Date.now() < deadline) {
|
|
54
55
|
try {
|
|
55
56
|
const res = await fetch(url, { method: 'GET', redirect: 'follow' });
|
|
@@ -61,7 +62,7 @@ async function waitForServer(url) {
|
|
|
61
62
|
}
|
|
62
63
|
await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));
|
|
63
64
|
}
|
|
64
|
-
throw new Error(`Server did not respond at ${url} within ${
|
|
65
|
+
throw new Error(`Server did not respond at ${url} within ${timeoutMs}ms`);
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
function killProcessTree(child) {
|
|
@@ -77,6 +78,21 @@ function killProcessTree(child) {
|
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
|
|
81
|
+
function createLogForwarder(onLine) {
|
|
82
|
+
let buffer = '';
|
|
83
|
+
return (chunk) => {
|
|
84
|
+
process.stdout.write(chunk);
|
|
85
|
+
buffer += chunk.toString();
|
|
86
|
+
let newlineIndex = buffer.indexOf('\n');
|
|
87
|
+
while (newlineIndex !== -1) {
|
|
88
|
+
const line = buffer.slice(0, newlineIndex);
|
|
89
|
+
buffer = buffer.slice(newlineIndex + 1);
|
|
90
|
+
onLine(line);
|
|
91
|
+
newlineIndex = buffer.indexOf('\n');
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
80
96
|
const env = loadEnv();
|
|
81
97
|
|
|
82
98
|
if ((env.SMOKE_TEST_IGNORE ?? '').toLowerCase() === 'true') {
|
|
@@ -84,37 +100,68 @@ if ((env.SMOKE_TEST_IGNORE ?? '').toLowerCase() === 'true') {
|
|
|
84
100
|
process.exit(0);
|
|
85
101
|
}
|
|
86
102
|
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
103
|
+
const serverScript = env.SMOKE_TEST_SERVER_SCRIPT ?? 'dev:dev';
|
|
104
|
+
const verifyCache = (env.SMOKE_TEST_VERIFY_CACHE ?? '').toLowerCase() === 'true';
|
|
105
|
+
const readyPath = env.SMOKE_TEST_READY_PATH ?? '/';
|
|
106
|
+
const readyUrl = `${baseUrl}${readyPath.startsWith('/') ? readyPath : `/${readyPath}`}`;
|
|
107
|
+
const isProductionStart = serverScript === 'start';
|
|
108
|
+
const startTimeoutMs = isProductionStart ? 120_000 : 300_000;
|
|
109
|
+
|
|
110
|
+
if (isProductionStart) {
|
|
111
|
+
console.log('Building app...');
|
|
112
|
+
const buildResult = spawnSync('pnpm', ['build'], {
|
|
113
|
+
cwd: appDir,
|
|
114
|
+
stdio: 'inherit',
|
|
115
|
+
env,
|
|
116
|
+
});
|
|
117
|
+
if (buildResult.status !== 0) {
|
|
118
|
+
process.exit(buildResult.status ?? 1);
|
|
119
|
+
}
|
|
95
120
|
}
|
|
96
121
|
|
|
97
|
-
|
|
98
|
-
|
|
122
|
+
let cmsFetchCount = 0;
|
|
123
|
+
|
|
124
|
+
const logForwarder = createLogForwarder((line) => {
|
|
125
|
+
if (!line.includes('[CMS fetch]')) return;
|
|
126
|
+
cmsFetchCount++;
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
const smokeEnv = {
|
|
130
|
+
...env,
|
|
131
|
+
SMOKE_TEST_PORT: port,
|
|
132
|
+
...(verifyCache ? { SMOKE_TEST_VERIFY_CACHE: 'true', LOG_CMS_FETCH: '1' } : {}),
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
console.log(`Starting server (${serverScript}) on ${baseUrl}...`);
|
|
136
|
+
const server = spawn('pnpm', [serverScript], {
|
|
99
137
|
cwd: appDir,
|
|
100
|
-
env,
|
|
101
|
-
stdio: 'inherit',
|
|
138
|
+
env: smokeEnv,
|
|
139
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
102
140
|
detached: true,
|
|
103
141
|
});
|
|
104
142
|
|
|
143
|
+
server.stdout?.on('data', logForwarder);
|
|
144
|
+
server.stderr?.on('data', logForwarder);
|
|
145
|
+
|
|
105
146
|
let exitCode = 1;
|
|
106
147
|
|
|
107
148
|
try {
|
|
108
|
-
await waitForServer(
|
|
109
|
-
console.log(
|
|
149
|
+
await waitForServer(readyUrl, startTimeoutMs);
|
|
150
|
+
console.log(`Server ready at ${readyUrl}. Running smoke tests...`);
|
|
110
151
|
|
|
111
|
-
const nodeOptions = [env.NODE_OPTIONS, `--require ${smokeTestPreload}`].filter(Boolean).join(' ');
|
|
112
152
|
const runResult = spawnSync('pnpm', ['smoke-test:run'], {
|
|
113
153
|
cwd: appDir,
|
|
114
154
|
stdio: 'inherit',
|
|
115
|
-
env:
|
|
155
|
+
env: smokeEnv,
|
|
116
156
|
});
|
|
117
157
|
exitCode = runResult.status ?? 1;
|
|
158
|
+
|
|
159
|
+
if (verifyCache) {
|
|
160
|
+
console.log('');
|
|
161
|
+
console.log('## CMS fetch log count (LOG_CMS_FETCH=1 on dev server)');
|
|
162
|
+
console.log(` total [CMS fetch] lines during smoke run: ${cmsFetchCount}`);
|
|
163
|
+
console.log(' (pass-level split is in x-nextjs-cache headers in the smoke report)');
|
|
164
|
+
}
|
|
118
165
|
} catch (error) {
|
|
119
166
|
console.error(error instanceof Error ? error.message : error);
|
|
120
167
|
exitCode = 1;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { SmokeTestCase, SmokeTestPlannerConfig } from './types.js';
|
|
2
|
-
export declare function planSmokeTestUrls(config: SmokeTestPlannerConfig): Promise<{
|
|
3
|
-
cases: SmokeTestCase[];
|
|
4
|
-
warnings: string[];
|
|
5
|
-
}>;
|
|
6
|
-
/** Assembles a planner config from app-specific deps (convenience for smoke.config.ts). */
|
|
7
|
-
export declare function buildSmokeConfig(config: Omit<SmokeTestPlannerConfig, 'baseUrl'> & {
|
|
8
|
-
port: number;
|
|
9
|
-
}): SmokeTestPlannerConfig;
|
|
10
|
-
/** Unwrap default export when tsx/CJS loads smoke.config.ts as `{ default: config }`. */
|
|
11
|
-
export declare function resolveSmokeConfig(moduleExport: SmokeTestPlannerConfig | {
|
|
12
|
-
default: SmokeTestPlannerConfig;
|
|
13
|
-
}): SmokeTestPlannerConfig;
|
|
14
|
-
//# sourceMappingURL=planner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/smoke-test/planner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,aAAa,EAEb,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAyGpB,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAC/E,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC,CA2ND;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACjE,sBAAsB,CAMxB;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,sBAAsB,GAAG;IAAE,OAAO,EAAE,sBAAsB,CAAA;CAAE,GACzE,sBAAsB,CAUxB"}
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
const DEFAULT_SAMPLES = 2;
|
|
2
|
-
function isIndexedLink(link) {
|
|
3
|
-
return link.indexed !== false && link.hidden !== true;
|
|
4
|
-
}
|
|
5
|
-
function isExternalUrl(href) {
|
|
6
|
-
if (!href)
|
|
7
|
-
return false;
|
|
8
|
-
return href.startsWith('http://') || href.startsWith('https://');
|
|
9
|
-
}
|
|
10
|
-
function shouldIncludeArticle(link) {
|
|
11
|
-
if (!isIndexedLink(link))
|
|
12
|
-
return false;
|
|
13
|
-
if (link.articleType?.indexed === false || link.articleType?.hidden === true)
|
|
14
|
-
return false;
|
|
15
|
-
if (link.hasBodyContent)
|
|
16
|
-
return true;
|
|
17
|
-
if (link.href && isExternalUrl(link.href))
|
|
18
|
-
return false;
|
|
19
|
-
if (link.download)
|
|
20
|
-
return false;
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
function resolveArticlePageUrl(link, urlCalculators) {
|
|
24
|
-
if (link.href && !isExternalUrl(link.href))
|
|
25
|
-
return link.href;
|
|
26
|
-
const articleTypeSlug = link.articleType?.slug;
|
|
27
|
-
if (!articleTypeSlug || !link.slug)
|
|
28
|
-
return null;
|
|
29
|
-
const primaryTagSlug = link.primaryTag?.slug ?? link.tags?.[0]?.slug;
|
|
30
|
-
return urlCalculators.article(articleTypeSlug, link.slug, primaryTagSlug);
|
|
31
|
-
}
|
|
32
|
-
function joinBaseUrl(baseUrl, path) {
|
|
33
|
-
const normalizedBase = baseUrl.replace(/\/$/, '');
|
|
34
|
-
const normalizedPath = path.startsWith('/') ? path : `/${path}`;
|
|
35
|
-
return `${normalizedBase}${normalizedPath}`;
|
|
36
|
-
}
|
|
37
|
-
function pickSamples(items, count, pick) {
|
|
38
|
-
return pick(items, count);
|
|
39
|
-
}
|
|
40
|
-
function pickFirst(items, count) {
|
|
41
|
-
return items.slice(0, count);
|
|
42
|
-
}
|
|
43
|
-
function pickPinnedOrFirst(items, count, pinnedSlugs, getSlug) {
|
|
44
|
-
if (!pinnedSlugs?.length)
|
|
45
|
-
return pickFirst(items, count);
|
|
46
|
-
const pinned = pinnedSlugs
|
|
47
|
-
.map((slug) => items.find((item) => getSlug(item) === slug))
|
|
48
|
-
.filter((item) => item != null);
|
|
49
|
-
const remaining = items.filter((item) => !pinnedSlugs.includes(getSlug(item) ?? ''));
|
|
50
|
-
return [...pinned, ...remaining].slice(0, count);
|
|
51
|
-
}
|
|
52
|
-
function addCase(cases, category, label, pageUrl, expectMarkdown, skipMarkdownPaths) {
|
|
53
|
-
const pathname = new URL(pageUrl).pathname;
|
|
54
|
-
const skipMarkdown = skipMarkdownPaths.some((prefix) => pathname.startsWith(prefix.startsWith('/') ? prefix : `/${prefix}`));
|
|
55
|
-
cases.push({
|
|
56
|
-
category,
|
|
57
|
-
label,
|
|
58
|
-
pageUrl,
|
|
59
|
-
expectMarkdown: expectMarkdown && !skipMarkdown,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
function collectArticleTypeTagPairs(articleLinks) {
|
|
63
|
-
const pairs = [];
|
|
64
|
-
const seen = new Set();
|
|
65
|
-
for (const link of articleLinks) {
|
|
66
|
-
if (!shouldIncludeArticle(link))
|
|
67
|
-
continue;
|
|
68
|
-
const typeSlug = link.articleType?.slug;
|
|
69
|
-
if (!typeSlug || isExternalUrl(link.href))
|
|
70
|
-
continue;
|
|
71
|
-
for (const tag of link.tags ?? []) {
|
|
72
|
-
const tagSlug = tag.slug;
|
|
73
|
-
if (!tagSlug || tag.indexed === false || tag.hidden === true)
|
|
74
|
-
continue;
|
|
75
|
-
const key = `${typeSlug}\0${tagSlug}`;
|
|
76
|
-
if (seen.has(key))
|
|
77
|
-
continue;
|
|
78
|
-
seen.add(key);
|
|
79
|
-
pairs.push({ articleType: typeSlug, tag: tagSlug });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return pairs;
|
|
83
|
-
}
|
|
84
|
-
export async function planSmokeTestUrls(config) {
|
|
85
|
-
const { baseUrl, urlCalculators, linkGetters, flags, overrides = {}, samplesPerCategory = DEFAULT_SAMPLES, insufficientSamples = 'warn', } = config;
|
|
86
|
-
const skipCategories = new Set(overrides.skipCategories ?? []);
|
|
87
|
-
const skipMarkdownPaths = overrides.skipMarkdownPaths ?? [];
|
|
88
|
-
const cases = [];
|
|
89
|
-
const warnings = [];
|
|
90
|
-
const [pageRes, articleRes, articleTypeRes, tagRes, personRes] = await Promise.all([
|
|
91
|
-
linkGetters.getAllPageLinks(),
|
|
92
|
-
linkGetters.getAllArticleLinks(),
|
|
93
|
-
linkGetters.getAllArticleTypeLinks(),
|
|
94
|
-
linkGetters.getAllTagLinks(),
|
|
95
|
-
linkGetters.getAllPersonLinks(),
|
|
96
|
-
]);
|
|
97
|
-
const warnInsufficient = (category, needed, found) => {
|
|
98
|
-
const message = `${category}: need ${needed} sample(s), found ${found}`;
|
|
99
|
-
if (insufficientSamples === 'fail') {
|
|
100
|
-
warnings.push(`ERROR: ${message}`);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
warnings.push(message);
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
if (!skipCategories.has('home')) {
|
|
107
|
-
addCase(cases, 'home', 'Home', joinBaseUrl(baseUrl, '/'), true, skipMarkdownPaths);
|
|
108
|
-
}
|
|
109
|
-
if (!skipCategories.has('page')) {
|
|
110
|
-
const pageLinks = pageRes.data.filter((link) => isIndexedLink(link) && !!link.href && link.href !== '/' && link.href !== '/index/');
|
|
111
|
-
const homeSlugCandidates = new Set(['', 'index', 'home']);
|
|
112
|
-
const nonHomePages = pageLinks.filter((link) => {
|
|
113
|
-
const slug = link.slug ?? link.href.replace(/^\/|\/$/g, '');
|
|
114
|
-
return !homeSlugCandidates.has(slug);
|
|
115
|
-
});
|
|
116
|
-
const selectedPages = pickSamples(nonHomePages, samplesPerCategory, (items, count) => pickPinnedOrFirst(items, count, overrides.pages, (link) => link.slug ?? link.href?.replace(/^\/|\/$/g, '')));
|
|
117
|
-
if (selectedPages.length < samplesPerCategory) {
|
|
118
|
-
warnInsufficient('page', samplesPerCategory, selectedPages.length);
|
|
119
|
-
}
|
|
120
|
-
for (const [index, link] of selectedPages.entries()) {
|
|
121
|
-
addCase(cases, 'page', `Page ${index + 1}`, joinBaseUrl(baseUrl, link.href), true, skipMarkdownPaths);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (!skipCategories.has('articles-index') && flags.enableArticleTypeIndex && flags.articlesSlug) {
|
|
125
|
-
addCase(cases, 'articles-index', 'Articles index', joinBaseUrl(baseUrl, urlCalculators.customType(flags.articlesSlug)), true, skipMarkdownPaths);
|
|
126
|
-
}
|
|
127
|
-
const articleTypeLinks = articleTypeRes.data.filter((type) => isIndexedLink(type) && !!type.slug);
|
|
128
|
-
for (const articleType of articleTypeLinks) {
|
|
129
|
-
const typeSlug = articleType.slug;
|
|
130
|
-
const typeLabel = articleType.slug;
|
|
131
|
-
if (!skipCategories.has('article-type-index')) {
|
|
132
|
-
const indexUrl = articleType.href ?? urlCalculators.articleType(typeSlug);
|
|
133
|
-
addCase(cases, 'article-type-index', `Article type index: ${typeLabel}`, joinBaseUrl(baseUrl, indexUrl), true, skipMarkdownPaths);
|
|
134
|
-
}
|
|
135
|
-
if (!skipCategories.has('article')) {
|
|
136
|
-
const articlesForType = articleRes.data.filter((link) => link.articleType?.slug === typeSlug && shouldIncludeArticle(link));
|
|
137
|
-
const articleUrls = articlesForType
|
|
138
|
-
.map((link) => resolveArticlePageUrl(link, urlCalculators))
|
|
139
|
-
.filter((url) => !!url);
|
|
140
|
-
const uniqueUrls = [...new Set(articleUrls)];
|
|
141
|
-
const selectedArticles = uniqueUrls.slice(0, samplesPerCategory);
|
|
142
|
-
if (selectedArticles.length < samplesPerCategory) {
|
|
143
|
-
warnInsufficient(`article (${typeLabel})`, samplesPerCategory, selectedArticles.length);
|
|
144
|
-
}
|
|
145
|
-
for (const [index, url] of selectedArticles.entries()) {
|
|
146
|
-
addCase(cases, 'article', `Article ${index + 1} (${typeLabel})`, joinBaseUrl(baseUrl, url), true, skipMarkdownPaths);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (!skipCategories.has('tags-index') && flags.enableTagsIndex) {
|
|
151
|
-
addCase(cases, 'tags-index', 'Tags index', joinBaseUrl(baseUrl, urlCalculators.customType(flags.tagsSlug)), true, skipMarkdownPaths);
|
|
152
|
-
}
|
|
153
|
-
if (!skipCategories.has('tag') && flags.enableTag) {
|
|
154
|
-
const tagLinks = tagRes.data.filter((link) => isIndexedLink(link) && !!link.href);
|
|
155
|
-
const selectedTags = pickFirst(tagLinks, samplesPerCategory);
|
|
156
|
-
if (selectedTags.length < samplesPerCategory) {
|
|
157
|
-
warnInsufficient('tag', samplesPerCategory, selectedTags.length);
|
|
158
|
-
}
|
|
159
|
-
for (const [index, link] of selectedTags.entries()) {
|
|
160
|
-
addCase(cases, 'tag', `Tag ${index + 1}`, joinBaseUrl(baseUrl, link.href), true, skipMarkdownPaths);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
if (!skipCategories.has('article-type-tag-listing') && flags.enableArticleTypeTagIndex) {
|
|
164
|
-
const pairs = collectArticleTypeTagPairs(articleRes.data);
|
|
165
|
-
const selectedPairs = overrides.articleTypeTags?.length
|
|
166
|
-
? overrides.articleTypeTags
|
|
167
|
-
: pairs.slice(0, samplesPerCategory);
|
|
168
|
-
if (selectedPairs.length < samplesPerCategory) {
|
|
169
|
-
warnInsufficient('article-type-tag-listing', samplesPerCategory, selectedPairs.length);
|
|
170
|
-
}
|
|
171
|
-
for (const [index, pair] of selectedPairs.entries()) {
|
|
172
|
-
const url = urlCalculators.articleTypeTag(pair.articleType, pair.tag);
|
|
173
|
-
addCase(cases, 'article-type-tag-listing', `Article-type tag listing ${index + 1} (${pair.articleType}/${pair.tag})`, joinBaseUrl(baseUrl, url), true, skipMarkdownPaths);
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
if (!skipCategories.has('people-listing') && flags.enablePeopleIndex) {
|
|
177
|
-
addCase(cases, 'people-listing', 'People listing', joinBaseUrl(baseUrl, urlCalculators.team()), true, skipMarkdownPaths);
|
|
178
|
-
}
|
|
179
|
-
if (!skipCategories.has('person') && flags.enablePerson) {
|
|
180
|
-
const people = personRes.data.filter((person) => isIndexedLink(person) && !!person.slug);
|
|
181
|
-
const selectedPeople = pickFirst(people, samplesPerCategory);
|
|
182
|
-
if (selectedPeople.length < samplesPerCategory) {
|
|
183
|
-
warnInsufficient('person', samplesPerCategory, selectedPeople.length);
|
|
184
|
-
}
|
|
185
|
-
for (const [index, person] of selectedPeople.entries()) {
|
|
186
|
-
addCase(cases, 'person', `Person ${index + 1}`, joinBaseUrl(baseUrl, urlCalculators.person(person.slug)), true, skipMarkdownPaths);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
if (!skipCategories.has('custom-type-listing') && overrides.customTypeListings?.length) {
|
|
190
|
-
for (const slug of overrides.customTypeListings) {
|
|
191
|
-
addCase(cases, 'custom-type-listing', `Custom type listing: ${slug}`, joinBaseUrl(baseUrl, urlCalculators.customType(slug)), true, skipMarkdownPaths);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
return { cases, warnings };
|
|
195
|
-
}
|
|
196
|
-
/** Assembles a planner config from app-specific deps (convenience for smoke.config.ts). */
|
|
197
|
-
export function buildSmokeConfig(config) {
|
|
198
|
-
const { port, ...rest } = config;
|
|
199
|
-
return {
|
|
200
|
-
...rest,
|
|
201
|
-
baseUrl: `http://localhost:${port}`,
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
/** Unwrap default export when tsx/CJS loads smoke.config.ts as `{ default: config }`. */
|
|
205
|
-
export function resolveSmokeConfig(moduleExport) {
|
|
206
|
-
if (moduleExport &&
|
|
207
|
-
typeof moduleExport === 'object' &&
|
|
208
|
-
'default' in moduleExport &&
|
|
209
|
-
moduleExport.default) {
|
|
210
|
-
return moduleExport.default;
|
|
211
|
-
}
|
|
212
|
-
return moduleExport;
|
|
213
|
-
}
|
|
214
|
-
//# sourceMappingURL=planner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/smoke-test/planner.ts"],"names":[],"mappings":"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"}
|
package/smoke-test-preload.cjs
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stub server-only so smoke-test:run (tsx CLI) can import cms-server.
|
|
3
|
-
*/
|
|
4
|
-
const Module = require('node:module');
|
|
5
|
-
|
|
6
|
-
const originalLoad = Module._load;
|
|
7
|
-
Module._load = function smokeTestLoad(request, parent, isMain) {
|
|
8
|
-
if (request === 'server-only') {
|
|
9
|
-
return {};
|
|
10
|
-
}
|
|
11
|
-
return originalLoad.call(this, request, parent, isMain);
|
|
12
|
-
};
|