mirror of
https://github.com/VirtualDrivers/Virtual-Display-Driver.git
synced 2026-10-23 07:02:35 -05:00
82 lines
3.3 KiB
JavaScript
82 lines
3.3 KiB
JavaScript
// Dev-only helper: renders the InstallerService PowerShell templates to temp
|
|
// files so their syntax can be validated without running Electron.
|
|
import { readFileSync, writeFileSync, mkdirSync } from 'fs'
|
|
import { join, dirname } from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url))
|
|
const source = readFileSync(join(here, '..', 'src', 'main', 'services', 'installer-service.ts'), 'utf8').replace(/\r\n/g, '\n')
|
|
|
|
// Driver specs mirrored from the service (keep in sync when validating).
|
|
const SPECS = {
|
|
display: {
|
|
title: 'Virtual Display Driver',
|
|
infName: 'MttVDD.inf',
|
|
signedBinary: 'MttVDD.dll',
|
|
hardwareId: 'Root\\MttVDD',
|
|
hardwareIdPattern: '^Root\\\\MttVDD$',
|
|
className: 'Display',
|
|
classGuid: '4D36E968-E325-11CE-BFC1-08002BE10318',
|
|
copyToBaseDir: true,
|
|
preserveFiles: ['vdd_settings.xml'],
|
|
maxInstances: 1
|
|
},
|
|
audio: {
|
|
title: 'Virtual Audio Driver',
|
|
infName: 'VirtualAudioDriver.inf',
|
|
signedBinary: 'VirtualAudioDriver.sys',
|
|
hardwareId: 'Root\\VirtualAudioDriver',
|
|
hardwareIdPattern: '^Root\\\\VirtualAudioDriver$',
|
|
className: 'MEDIA',
|
|
classGuid: '4D36E96C-E325-11CE-BFC1-08002BE10318',
|
|
copyToBaseDir: false,
|
|
preserveFiles: [],
|
|
maxInstances: 4
|
|
}
|
|
}
|
|
|
|
function extractTemplate(afterMarker, openMarker = 'return `') {
|
|
const start = source.indexOf(afterMarker)
|
|
if (start === -1) throw new Error(`marker not found: ${afterMarker}`)
|
|
const open = source.indexOf(openMarker, start) + openMarker.length
|
|
const close = source.indexOf('`\n }', open)
|
|
return source.slice(open, close)
|
|
}
|
|
|
|
function render(template, vars) {
|
|
const cleaned = template.replaceAll('this.getBaseDir()', 'getBaseDir()')
|
|
const keys = Object.keys(vars)
|
|
// eslint-disable-next-line no-new-func
|
|
return new Function(...keys, `return \`${cleaned}\``)(...keys.map((k) => vars[k]))
|
|
}
|
|
|
|
const outDir = join(here, '..', 'out-ps-check')
|
|
mkdirSync(outDir, { recursive: true })
|
|
|
|
const installTemplate = extractTemplate('private buildInstallScript(')
|
|
const copyBlockTemplate = extractTemplate('const copyBlock = spec.copyToBaseDir', '? `')
|
|
const uninstallTemplate = extractTemplate('private buildUninstallScript(')
|
|
const restartTemplate = extractTemplate('private buildRestartScript(')
|
|
const instancesTemplate = extractTemplate('private buildSetInstancesScript(')
|
|
|
|
for (const [id, spec] of Object.entries(SPECS)) {
|
|
const copyBlock = spec.copyToBaseDir
|
|
? render(copyBlockTemplate.slice(0, copyBlockTemplate.indexOf('`\n : ')), {
|
|
spec,
|
|
getBaseDir: () => 'C:\\VirtualDisplayDriver'
|
|
})
|
|
: ''
|
|
const nefconPath = 'C:\\Tools\\nefcon\\nefconc.exe'
|
|
const installFlags = spec.maxInstances === 1 ? '--no-duplicates --remove-duplicates' : '--no-duplicates'
|
|
const common = { spec, nefconPath, getBaseDir: () => 'C:\\VirtualDisplayDriver' }
|
|
writeFileSync(
|
|
join(outDir, `install-${id}.ps1`),
|
|
render(installTemplate, { ...common, packageDir: 'C:\\Temp\\pkg', instances: 2, copyBlock, installFlags })
|
|
)
|
|
writeFileSync(join(outDir, `uninstall-${id}.ps1`), render(uninstallTemplate, common))
|
|
writeFileSync(join(outDir, `restart-${id}.ps1`), render(restartTemplate, common))
|
|
writeFileSync(join(outDir, `instances-${id}.ps1`), render(instancesTemplate, { ...common, target: 2 }))
|
|
}
|
|
|
|
console.log('rendered to', outDir)
|