|
1 | 1 | // @ts-ignore |
2 | 2 | import createJITI from 'jiti' |
3 | 3 | import { JSDOM } from 'jsdom' |
4 | | -import { getBrowser, startServer, url, useTestContext } from './utils' |
| 4 | +import { getBrowser, TestContext, url, useTestContext } from './utils' |
5 | 5 | import { snakeCase } from 'scule' |
6 | 6 | import { resolveAlias } from '@nuxt/kit' |
| 7 | +import { onTestFinished } from 'vitest' |
7 | 8 |
|
8 | 9 | import { errors, type BrowserContextOptions, type Page } from 'playwright-core' |
9 | 10 |
|
@@ -149,42 +150,42 @@ export async function waitForURL(page: Page, path: string) { |
149 | 150 | } |
150 | 151 | } |
151 | 152 |
|
152 | | -function flattenObject(obj: Record<string, unknown> = {}) { |
153 | | - const flattened: Record<string, unknown> = {} |
154 | | - |
155 | | - for (const key of Object.keys(obj)) { |
156 | | - const entry = obj[key] |
157 | | - |
158 | | - if (typeof entry !== 'object' || entry == null) { |
159 | | - flattened[key] = obj[key] |
160 | | - continue |
| 153 | +async function updateProcessRuntimeConfig(ctx: TestContext, config: unknown) { |
| 154 | + const updated = new Promise<unknown>(resolve => { |
| 155 | + const handler = (msg: { type: string; value: unknown }) => { |
| 156 | + if (msg.type === 'confirm:runtime-config') { |
| 157 | + ctx.serverProcess!.process?.off('message', handler) |
| 158 | + resolve(msg.value) |
| 159 | + } |
161 | 160 | } |
| 161 | + ctx.serverProcess!.process?.on('message', handler) |
| 162 | + }) |
162 | 163 |
|
163 | | - const flatObject = flattenObject(entry as Record<string, unknown>) |
164 | | - for (const x of Object.keys(flatObject)) { |
165 | | - flattened[key + '_' + x] = flatObject[x] |
166 | | - } |
167 | | - } |
| 164 | + ctx.serverProcess!.process?.send({ type: 'update:runtime-config', value: config }, undefined, { |
| 165 | + keepOpen: true |
| 166 | + }) |
168 | 167 |
|
169 | | - return flattened |
| 168 | + return await updated |
170 | 169 | } |
171 | 170 |
|
172 | | -function convertObjectToConfig(obj: Record<string, unknown>) { |
173 | | - const makeEnvKey = (str: string) => `NUXT_${snakeCase(str).toUpperCase()}` |
| 171 | +export async function startServerWithRuntimeConfig(env: Record<string, unknown>, skipRestore = false) { |
| 172 | + const ctx = useTestContext() |
| 173 | + |
| 174 | + const stored = await updateProcessRuntimeConfig(ctx, env) |
174 | 175 |
|
175 | | - const env: Record<string, unknown> = {} |
176 | | - const flattened = flattenObject(obj) |
177 | | - for (const key in flattened) { |
178 | | - env[makeEnvKey(key)] = flattened[key] |
| 176 | + let restored = false |
| 177 | + const restoreFn = async () => { |
| 178 | + if (restored) return |
| 179 | + |
| 180 | + restored = true |
| 181 | + await await updateProcessRuntimeConfig(ctx, stored) |
179 | 182 | } |
180 | 183 |
|
181 | | - return env |
182 | | -} |
| 184 | + if (!skipRestore) { |
| 185 | + onTestFinished(restoreFn) |
| 186 | + } |
183 | 187 |
|
184 | | -export async function startServerWithRuntimeConfig(env: Record<string, unknown>) { |
185 | | - const converted = convertObjectToConfig(env) |
186 | | - await startServer(converted) |
187 | | - return async () => startServer() |
| 188 | + return restoreFn |
188 | 189 | } |
189 | 190 |
|
190 | 191 | export async function localeLoaderHelpers() { |
|
0 commit comments