28 lines
3.0 KiB
JavaScript
28 lines
3.0 KiB
JavaScript
import test from 'node:test';
|
|||
|
|
import assert from 'node:assert/strict';
|
||
|
|
import {createRequire} from 'node:module';
|
||
|
|
import {readFile,writeFile,mkdir,mkdtemp,rm} from 'node:fs/promises';
|
||
|
|
import path from 'node:path';
|
||
|
|
import os from 'node:os';
|
||
|
|
import {spawn} from 'node:child_process';
|
||
|
|
const require=createRequire(import.meta.url),asar=require('@electron/asar');
|
||
|
|
const {getFileMatchers,copyFiles}=require('app-builder-lib/out/fileMatcher.js');
|
||
|
|
test('actual builder file matching puts only fixed framing dependency in ASAR and isolated adapter loads',async t=>{
|
||
|
|
const repo=process.cwd(),root=await mkdtemp(path.join(os.tmpdir(),'safetynet-service-package-'));t.after(()=>rm(root,{recursive:true,force:true}));
|
||
|
|
const source=path.join(root,'source'),app=path.join(root,'app'),extracted=path.join(root,'isolated');
|
||
|
|
for(const file of ['apps/browser/broker-service-supervisor.cjs','apps/browser/broker-supervisor.cjs','apps/network-broker/framed-channel.cjs']){const target=path.join(source,file);await mkdir(path.dirname(target),{recursive:true});await writeFile(target,await readFile(path.join(repo,file)));}
|
||
|
|
await writeFile(path.join(source,'apps/network-broker/unreviewed-extra.cjs'),'throw Error("must not ship inside browser");');
|
||
|
|
const pkg=JSON.parse(await readFile(path.join(repo,'package.json'),'utf8'));
|
||
|
|
assert.equal(pkg.build.files.filter(value=>value==='apps/network-broker/framed-channel.cjs').length,1);
|
||
|
|
assert.ok(!pkg.build.files.some(value=>typeof value==='string'&&value.startsWith('apps/network-broker/')&&value.includes('*')));
|
||
|
|
const matchers=getFileMatchers(pkg.build,'files',app,{defaultSrc:source,globalOutDir:path.join(root,'out'),macroExpander:value=>value,customBuildOptions:{}});
|
||
|
|
const normal=matchers.filter(matcher=>matcher.from===source);assert.equal(normal.length,1);await copyFiles(normal,null,false);
|
||
|
|
const archive=path.join(root,'app.asar');await asar.createPackage(app,archive);
|
||
|
|
assert.deepEqual(asar.extractFile(archive,path.normalize('apps/network-broker/framed-channel.cjs')),await readFile(path.join(repo,'apps/network-broker/framed-channel.cjs')));
|
||
|
|
assert.ok(!asar.listPackage(archive).some(value=>value.endsWith('unreviewed-extra.cjs')));
|
||
|
|
asar.extractAll(archive,extracted);
|
||
|
|
const script="const value=require('./apps/browser/broker-service-supervisor.cjs');process.stdout.write(JSON.stringify({loaded:typeof value.createServiceBrokerSupervisor==='function'}));";
|
||
|
|
const env={};for(const key of ['SystemRoot','WINDIR','TEMP','TMP'])if(process.env[key])env[key]=process.env[key];
|
||
|
|
const output=await new Promise((resolve,reject)=>{const child=spawn(process.execPath,['-e',script],{cwd:extracted,env,windowsHide:true,timeout:5000});let bytes=0,stdout='';child.stdout.on('data',chunk=>{bytes+=chunk.length;if(bytes>4096){child.kill();reject(Error('package-probe-output-limit'));}else stdout+=chunk;});child.stderr.on('data',()=>{});child.once('error',reject);child.once('close',code=>code===0?resolve(stdout):reject(Error('package-probe-failed')));});
|
||
|
|
assert.deepEqual(JSON.parse(output),{loaded:true});
|
||
|
|
});
|