Files
SGF/scripts/ledger-ui-check.mjs
2026-11-04 09:37:20 +02:00

15 lines
2.5 KiB
JavaScript

import fs from 'node:fs';import path from 'node:path';import {pathToFileURL} from 'node:url';import assert from 'node:assert/strict';
import React from 'react';import {renderToStaticMarkup} from 'react-dom/server';import {transformWithOxc,build} from 'vite';
const state=JSON.parse(fs.readFileSync('C:/laragon/data/sgf-tempo/run/modular-regression-current.json','utf8')),tag=process.argv[2];
if(state.port!==55439||!/^[a-f0-9]{12}$/.test(tag??''))throw Error('Owned QA context required');
const root=path.join(state.root,'private/ledger-'+tag),storage=path.join(root,'storage'),output=path.join(root,'ledger-ui.json');if(fs.existsSync(output))throw Error('Completed UI proof preserved');
const source=path.resolve('resources/js/AccountingMenuWorkspace.jsx');let {code}=await transformWithOxc(fs.readFileSync(source,'utf8'),source,{jsx:{runtime:'classic'}});
for(const name of ['react','react/jsx-runtime'])code=code.replaceAll('from "'+name+'"','from '+JSON.stringify(import.meta.resolve(name))).replaceAll("from '"+name+"'",'from '+JSON.stringify(import.meta.resolve(name)));
code=code.replaceAll("'./accounting-menu.js'",JSON.stringify(pathToFileURL(path.resolve('resources/js/accounting-menu.js')).href)).replaceAll('"./accounting-menu.js"',JSON.stringify(pathToFileURL(path.resolve('resources/js/accounting-menu.js')).href));
const compiled=path.join(root,'accounting-workspace-compiled.mjs');fs.writeFileSync(compiled,code);const {default:Workspace}=await import(pathToFileURL(compiled).href);
const context={token:'qa',company:{name:'QA'},unit:{id:1}},render=allowed=>renderToStaticMarkup(React.createElement(Workspace,{section:'accounting_daily',context,can:(p,u)=>p==='company.view'||(allowed&&p==='general_ledger.view'&&u===1),navigate(){}}));
const permitted=render(true),denied=render(false);assert(permitted.includes('href="/general-ledger"'));assert(permitted.includes('Primeiro percurso sintético'));assert(!denied.includes('href="/general-ledger"'));
await build({root:process.cwd(),cacheDir:path.join(storage,'cache/vite-ledger'),build:{outDir:path.join(storage,'public/build'),emptyOutDir:false}});
const manifest=path.join(storage,'public/build/manifest.json');assert(fs.existsSync(manifest));
fs.writeFileSync(output,JSON.stringify({passed:true,targeted_static_checks:3,production_build:true,private_build:true,public_demo_manifest_untouched:true,visual_review:false,browser_interactions_tested:false,general_navigation_check:'interrupted_after_no_completion; not counted as passed'},null,2)+'\n');console.log('Ledger menu permission checks and private production build passed.');