Connect all 27 source layouts to parameterized Studio pages and shared design storage
studio CI and deployment / verify-and-deploy (push) Successful in 5m55s
waterfall-wiki CI and deployment / verify-and-deploy (push) Failing after 18m23s

This commit is contained in:
2026-10-27 14:51:17 +08:00
parent 00e1b70398
commit 94932418ca
28 changed files with 374 additions and 4 deletions
+6
View File
@@ -0,0 +1,6 @@
/** CI-only isolated runtime checks, never a local preview workflow. */
import {spawn} from 'node:child_process';import {once} from 'node:events';import {createServer} from 'node:net';import assert from 'node:assert/strict';import {setTimeout} from 'node:timers/promises';
const socket=createServer();socket.listen(0,'127.0.0.1');await once(socket,'listening');const port=socket.address().port;await new Promise(r=>socket.close(r));const child=spawn(process.execPath,['.next/standalone/server.js'],{env:{...process.env,PORT:String(port),HOSTNAME:'127.0.0.1'},stdio:'inherit'}),base='http://127.0.0.1:'+port;
try{let ready=false;for(let i=0;i<60;i++){try{if((await fetch(base+'/studio/api/health')).ok){ready=true;break}}catch{}await setTimeout(250)}assert.ok(ready);const catalog=await fetch(base+'/studio/api/layouts').then(r=>r.json());assert.equal(catalog.layouts.length,27);
for(const l of catalog.layouts){const page=await fetch(base+l.url);assert.equal(page.status,200,l.id);assert.ok((await page.text()).includes(l.name));const schema=await fetch(base+l.api).then(r=>r.json());assert.equal(schema.id,l.id);const original=await fetch(base+l.api+'?format=svg').then(r=>r.text());assert.ok(original.includes('data-layout-id="'+l.id+'"'));const text=schema.elements.find(e=>e.kind==='text');const result=await fetch(base+l.api,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({texts:{[text.id]:{value:'API render <test>'}}})});assert.equal(result.status,200);const svg=await result.text();assert.ok(svg.includes('&lt;')&&svg.includes('&gt;')); }
assert.equal((await fetch(base+'/studio/api/layouts/ref-28')).status,404);assert.equal((await fetch(base+'/studio/api/layouts/ref-01',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({texts:{I01:{value:'bad'}}})})).status,400);console.log('All 27 Studio pages and render APIs passed');}finally{child.kill('SIGTERM');await once(child,'exit')}