45 lines
1.4 KiB
TypeScript
45 lines
1.4 KiB
TypeScript
import 'dotenv/config'
|
|
import { networkInterfaces } from 'node:os'
|
|
import qrcode from 'qrcode-terminal'
|
|
import { loadProjectConfig } from './lib/config.ts'
|
|
import { resolveDeck } from './lib/content.ts'
|
|
import { runSlidev } from './lib/run-slidev.ts'
|
|
import { resolveTheme } from './lib/theme.ts'
|
|
|
|
const input = process.argv.slice(2).find(argument => !argument.startsWith('-'))
|
|
const config = await loadProjectConfig()
|
|
const deck = await resolveDeck(input, process.cwd(), config.slidesDir)
|
|
const port = process.env.PORT || '3030'
|
|
const address = firstLanAddress()
|
|
const remoteToken = process.env.SLIDEV_REMOTE_TOKEN || 'easy-slides-local'
|
|
const remotePassword = encodeURIComponent(remoteToken)
|
|
const presenterUrl = `http://${address}:${port}/presenter/?password=${remotePassword}`
|
|
const remoteUrl = `http://${address}:${port}/entry?password=${remotePassword}`
|
|
|
|
console.log(`\n观众视图:http://${address}:${port}/`)
|
|
console.log(`演示者视图:${presenterUrl}`)
|
|
console.log(`手机遥控器:${remoteUrl}`)
|
|
qrcode.generate(presenterUrl, { small: true })
|
|
|
|
await runSlidev([
|
|
deck.entry,
|
|
'--theme',
|
|
resolveTheme(config.theme),
|
|
'--port',
|
|
port,
|
|
'--remote',
|
|
remoteToken,
|
|
'--bind',
|
|
'0.0.0.0',
|
|
])
|
|
|
|
function firstLanAddress() {
|
|
for (const entries of Object.values(networkInterfaces())) {
|
|
for (const entry of entries ?? []) {
|
|
if (entry.family === 'IPv4' && !entry.internal)
|
|
return entry.address
|
|
}
|
|
}
|
|
return 'localhost'
|
|
}
|