| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #!/usr/bin/env node
- import { cp, mkdir, readdir, rm } from 'node:fs/promises'
- import { existsSync } from 'node:fs'
- import { dirname, resolve } from 'node:path'
- import { fileURLToPath, pathToFileURL } from 'node:url'
- const scriptFile = fileURLToPath(import.meta.url)
- const packageDir = resolve(dirname(scriptFile), '..')
- const sourceDir = resolve(packageDir, 'viewer')
- const isPostinstall = process.argv.includes('--postinstall')
- const explicitTarget = process.argv.slice(2).find(arg => !arg.startsWith('--'))
- const targetDir = resolve(
- process.env.FILE_VIEWER_PUBLIC_DIR ||
- explicitTarget ||
- resolve(process.env.INIT_CWD || process.cwd(), 'public/file-viewer')
- )
- const skip = process.env.FILE_VIEWER_SKIP_ASSET_COPY === '1' ||
- process.env.FILE_VIEWER_SKIP_ASSET_COPY === 'true'
- if (skip) {
- process.exit(0)
- }
- // Workspace installs should not mutate the repository automatically.
- if (isPostinstall && !packageDir.includes('node_modules')) {
- process.exit(0)
- }
- if (!existsSync(sourceDir)) {
- const message = `[file-viewer-web] 缺少 viewer assets 产物: ${sourceDir}`
- if (isPostinstall) {
- console.warn(message)
- process.exit(0)
- }
- console.error(message)
- process.exit(1)
- }
- const removeMacMetadata = async dir => {
- const entries = await readdir(dir, { withFileTypes: true })
- await Promise.all(entries.map(entry => {
- const path = resolve(dir, entry.name)
- if (entry.name === '.DS_Store') {
- return rm(path, { force: true })
- }
- if (entry.isDirectory()) {
- return removeMacMetadata(path)
- }
- return undefined
- }))
- }
- const copyWithBuiltHelper = async () => {
- const helperPath = resolve(packageDir, 'dist/node.js')
- if (!existsSync(helperPath)) {
- return false
- }
- const { copyViewerAssets } = await import(pathToFileURL(helperPath).href)
- const result = await copyViewerAssets({ sourceDir, targetDir })
- if (result.validation?.missingOptional?.length) {
- console.warn(
- `[file-viewer-web] optional viewer assets missing: ${
- result.validation.missingOptional.map(asset => asset.relativePath).join(', ')
- }`
- )
- }
- console.log(`[file-viewer-web] viewer assets copied to ${result.targetDir}`)
- console.log(`[file-viewer-web] viewer asset manifest written to ${result.assetManifestPath}`)
- return true
- }
- const copyWithFallback = async () => {
- await rm(targetDir, { force: true, recursive: true })
- await mkdir(targetDir, { recursive: true })
- await cp(sourceDir, targetDir, { recursive: true })
- await removeMacMetadata(targetDir)
- console.log(`[file-viewer-web] viewer assets copied to ${targetDir}`)
- }
- try {
- if (!await copyWithBuiltHelper()) {
- await copyWithFallback()
- }
- } catch (reason) {
- const message = reason instanceof Error ? reason.message : String(reason)
- if (isPostinstall) {
- console.warn(`[file-viewer-web] viewer asset copy skipped: ${message}`)
- process.exit(0)
- }
- console.error(`[file-viewer-web] viewer asset copy failed: ${message}`)
- process.exit(1)
- }
|