Files
easy-slides/scripts/init.ts
T
2026-08-29 18:59:33 +08:00

135 lines
3.6 KiB
TypeScript

import { mkdir, writeFile } from 'node:fs/promises'
import { createRequire } from 'node:module'
import path from 'node:path'
const require = createRequire(import.meta.url)
const engineVersion = String(require('../package.json').version)
const args = process.argv.slice(2)
const engineIndex = args.indexOf('--engine')
const engineSpec = engineIndex >= 0 ? args[engineIndex + 1] : `^${engineVersion}`
if (!engineSpec)
throw new Error('--engine 需要 npm 版本、Git URL 或本地路径')
const targetInput = args.find((argument, index) => !argument.startsWith('-') && index !== engineIndex + 1) ?? '.'
const target = path.resolve(targetInput)
await mkdir(path.join(target, 'slides', 'welcome', 'assets'), { recursive: true })
await mkdir(path.join(target, '.github', 'workflows'), { recursive: true })
await writeNew('package.json', `${JSON.stringify({
name: path.basename(target),
private: true,
scripts: {
dev: 'easy-slides dev',
present: 'easy-slides present',
build: 'easy-slides build',
check: 'easy-slides check',
export: 'easy-slides export',
},
devDependencies: {
'@easy-slides/cli': engineSpec,
},
}, null, 2)}\n`)
await writeNew('easy-slides.config.mjs', `export default {
title: '${escapeJavaScript(path.basename(target))}',
description: 'Markdown presentations',
slidesDir: 'slides',
outDir: 'dist',
}
`)
await writeNew(path.join('slides', 'welcome', 'slides.md'), `---
title: Welcome
description: Your first easy-slides deck
date: ${new Date().toISOString().slice(0, 10)}
tags: [Markdown]
---
# Welcome
> Edit slides/welcome/slides.md and push to deploy.
<!--
Speaker notes are written in HTML comments.
-->
---
## Content lives here
- The engine is an npm dependency
- This repository owns slides and assets
- The static build can deploy anywhere
`)
await writeNew('.gitignore', `node_modules/
dist/
exports/
.env
.DS_Store
`)
await writeNew('pnpm-workspace.yaml', `allowBuilds:
playwright-chromium: false
`)
await writeNew(path.join('.github', 'workflows', 'deploy-pages.yml'), `name: Deploy slides
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
url: \${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 11.19.0
- uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm check
env:
PRESENTER_TOKEN: \${{ secrets.PRESENTER_TOKEN }}
- run: pnpm build
env:
SITE_BASE: /\${{ github.event.repository.name }}/
PRESENTER_TOKEN: \${{ secrets.PRESENTER_TOKEN }}
- uses: actions/configure-pages@v5
- uses: actions/upload-pages-artifact@v4
with:
path: dist
- id: deployment
uses: actions/deploy-pages@v4
`)
console.log(`内容项目已创建:${target}`)
console.log('下一步:pnpm install && pnpm dev -- welcome')
async function writeNew(relative: string, content: string) {
const filename = path.join(target, relative)
await mkdir(path.dirname(filename), { recursive: true })
await writeFile(filename, content, { encoding: 'utf8', flag: 'wx' }).catch((error: NodeJS.ErrnoException) => {
if (error.code === 'EEXIST')
throw new Error(`拒绝覆盖已有文件:${filename}`)
throw error
})
}
function escapeJavaScript(value: string) {
return value.replaceAll('\\', '\\\\').replaceAll("'", "\\'")
}