/**
* `impeccable live` (boot) and `live-inject` corpus: root resolution
* (roots.json + repo pointer), config checks, framework injection.
* Boot cases stop at config_missing so no helper server is spawned; the one
* full boot (`live-boot-full-cycle`) stops its server in a final step.
*/
import { LIVE_FILES, fakeGit, rm, write } from '../live-helpers.mjs';
const CFG = '.impeccable/live/config.json';
const F = LIVE_FILES;
const PORT_NORM = [
['localhost:\\d{4,5}', 'g', 'localhost:
', commentSyntax: 'vue' })), files: F }, { id: 'live-boot-sveltekit-config-missing', verb: 'live', workspace: 'live-sveltekit', setup: (ws) => rm(ws, CFG), files: F }, { id: 'live-boot-astro-config-missing', verb: 'live', workspace: 'live-astro', setup: (ws) => rm(ws, CFG), files: F }, { id: 'live-boot-monorepo-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, { id: 'live-boot-monorepo-from-child', verb: 'live', workspace: 'live-monorepo', cwd: 'website', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, { id: 'live-boot-monorepo-target-file', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'website/src/App.jsx'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, { id: 'live-boot-monorepo-target-eq', verb: 'live', workspace: 'live-monorepo', args: ['--target=website'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] }, { id: 'live-boot-monorepo-no-git-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => rm(ws, 'website/' + CFG), files: [...F, 'website/.impeccable/**'] }, { id: 'live-boot-multi-app-selection', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); }, }, { id: 'live-boot-multi-app-target', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'admin'], files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], setup: (ws) => { fakeGit(ws); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); }, }, { id: 'live-boot-workspaces-selection', verb: 'live', workspace: 'live-workspaces', setup: (ws) => fakeGit(ws), files: F }, { id: 'live-boot-workspaces-target', verb: 'live', workspace: 'live-workspaces', args: ['--target', 'apps/web'], setup: (ws) => fakeGit(ws), files: [...F, 'apps/web/.impeccable/**'] }, { id: 'live-boot-workspaces-from-child', verb: 'live', workspace: 'live-workspaces', cwd: 'apps/admin', setup: (ws) => fakeGit(ws), files: [...F, 'apps/admin/.impeccable/**'] }, { id: 'live-boot-pointer-accumulates', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); }, steps: [{ args: ['--target', 'website'] }, { args: ['--target', 'admin'] }, { args: ['--target', 'website'] }], }, { // Real boot: background server + inject + drift scan, then stop. Port is // dynamic (first free from 8400), masked per-case. id: 'live-boot-full-cycle', verb: 'live', workspace: 'live-html', files: [...F, 'index.html', 'public/**'], normalize: PORT_NORM, steps: [{ verb: 'live' }, { verb: 'live-inject', args: ['--check'] }, { verb: 'live-server', args: ['stop'] }], }, // --- live-inject.mjs --- { id: 'live-inject-help', verb: 'live-inject', workspace: 'live-html', args: ['--help'] }, { id: 'live-inject-check-ok', verb: 'live-inject', workspace: 'live-html', args: ['--check'] }, { id: 'live-inject-check-missing', verb: 'live-inject', workspace: 'live-vite', args: ['--check'], setup: (ws) => rm(ws, CFG) }, { id: 'live-inject-check-invalid-json', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, '[1') }, { id: 'live-inject-check-invalid-files', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: [], insertBefore: '', commentSyntax: 'html' })) }, { id: 'live-inject-check-invalid-anchor', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], commentSyntax: 'html' })) }, { id: 'live-inject-check-env-config', verb: 'live-inject', workspace: 'live-html', args: ['--check'], env: { IMPECCABLE_LIVE_CONFIG: 'alt.json' }, setup: (ws) => write(ws, 'alt.json', JSON.stringify({ files: ['public/docs/guide.html'], insertAfter: '
', commentSyntax: 'html' })), files: [...F, 'index.html'] }, { id: 'live-inject-anchor-missing-all', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html'] }, { id: 'live-inject-insert-after', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], exclude: ['public/**'], insertAfter: '
', commentSyntax: 'html' })), files: [...F, 'index.html', 'public/**', 'dist/**', 'src/**'] }, { id: 'live-inject-vite-csp-meta', verb: 'live-inject', workspace: 'live-vite', files: [...F, 'index.html'], setup: (ws) => write(ws, 'index.html', '\n\n
\n \n \n
\n \n
\n