import assert from 'node:assert/strict'; import fs from 'node:fs'; import vm from 'node:vm'; import test from 'node:test'; import ts from 'typescript'; const modules = new Map(); function load(name) { if(modules.has(name))return modules.get(name); if(name.endsWith('.json'))return JSON.parse(fs.readFileSync(new URL(`../src/${name.slice(2)}`,import.meta.url),'utf8')); const source=fs.readFileSync(new URL(`../src/${name.slice(2).replace(/\.js$/,'.ts')}`,import.meta.url),'utf8'); const code=ts.transpileModule(source,{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,esModuleInterop:true}}).outputText; const module={exports:{}};modules.set(name,module.exports); vm.runInNewContext(`(function(exports,require,module){${code}})`,{AbortController})(module.exports,load,module); return module.exports; } const facade=load('./part-view-facade.js'); const {validWindowHostResult}=load('./web-window-contract.js'); const envelope=load('./facade-envelope.js'); function payload(owner='PartBox',command='Std_DockViewMenu') { return {schema:'freecad-web/document-view/v1',owner,document:'workbench-document',command, parameters:{host:{toolbar:'window-commands',panels:[{objectName:'modules',title:'Modules',visible:true}]}}}; } test('only window-host commands accept a non-native workspace identifier',()=>{ for(const owner of ['PartBox','DocumentProbe']) { const p=payload(owner); assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),p)),true); assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,command:'Std_DrawStyle'})),false); assert.equal(facade.isDocumentViewRequest(envelope.createRequest('test',facade.viewEndpoint(owner),{...p,document:''})),false); } }); test('native window replies retain owner identity and command-specific shape',async()=>{ const p=payload(), result={command:p.command,documentId:p.document,items:[{objectName:'modules',title:'Modules',visible:true,enabled:true}]}; const reply={ok:true,schema:p.schema,owner:p.owner,document:p.document,command:p.command,result}; const call=value=>facade.handleDocumentView(p,new AbortController().signal,{ccall:()=>JSON.stringify(value)}); assert.equal(JSON.stringify(await call(reply)),JSON.stringify(result)); for(const mutation of [{owner:'DocumentProbe'},{document:'Another'}, {result:{...result,items:[]}}, {result:{...result,items:[result.items[0],result.items[0]]}}, {result:{...result,documentId:'Another'}}]) await assert.rejects(call({...reply,...mutation}),/Invalid native window/); assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:false},'Std_ToggleToolBarLock',p.document),true); assert.equal(validWindowHostResult({command:'Std_ToggleToolBarLock',documentId:p.document,locked:'false'},'Std_ToggleToolBarLock',p.document),false); });