189 lines
5.6 KiB
TypeScript
189 lines
5.6 KiB
TypeScript
import fs from 'fs'
|
|
import path from 'path'
|
|
import { ICepConfig, IPanel } from './types';
|
|
import { joinDebug } from './template/debug';
|
|
import { copyFolderSync } from './utils/fs';
|
|
import { getAdobeCepDir } from './utils/cepDir';
|
|
import { joinManifest } from './template/manifest';
|
|
import { joinHtml } from './template/html';
|
|
import open from 'open';
|
|
/**
|
|
* 复制插件壳到ps插件目录
|
|
*/
|
|
export function copyCepToDev(options: Omit<IOptions, 'outCepPath' | 'inputCepTemp'>, cepConfig: ICepConfig) {
|
|
cepConfig.panels[0].displayName = `[dev]${cepConfig.panels[0].displayName}`
|
|
const cep = new CEP(options, cepConfig)
|
|
cep.write()
|
|
console.log(`[CEP] 插件壳已就绪`);
|
|
console.log(`[CEP] PS调试地址: http://localhost:7090`);
|
|
open('http://localhost:7090')
|
|
}
|
|
|
|
export function copyCepToProd(options: Omit<IOptions, 'outCepPath' | 'inputCepTemp'>, cepConfig: ICepConfig) {
|
|
cepConfig.panels[0].displayName = `${cepConfig.panels[0].displayName}`
|
|
const cep = new CEP(options, cepConfig)
|
|
cep.write()
|
|
}
|
|
|
|
type IOptions = {
|
|
name: string
|
|
serverURL: string
|
|
outCepPath: string
|
|
inputCepTemp: string
|
|
isBuild: boolean
|
|
distDir?: string // Added dynamic dist path
|
|
}
|
|
|
|
export class CEP {
|
|
constructor(private readonly options: Omit<IOptions, 'outCepPath' | 'inputCepTemp'>, private readonly cepConfig: ICepConfig) {
|
|
this.createDist()
|
|
}
|
|
|
|
private get cepInput() {
|
|
return path.join(__dirname, "./template/cep")
|
|
}
|
|
|
|
private get dist() {
|
|
if (this.options.distDir) {
|
|
if (path.isAbsolute(this.options.distDir)) return this.options.distDir;
|
|
return path.resolve(process.cwd(), this.options.distDir);
|
|
}
|
|
return path.join(__dirname, '../../dist')
|
|
}
|
|
|
|
private get cepOutput() {
|
|
return path.join(this.dist, this.options.name)
|
|
}
|
|
|
|
private get cepLink() {
|
|
return path.join(getAdobeCepDir(), this.options.name)
|
|
}
|
|
|
|
private get debug() {
|
|
return path.join(this.cepOutput, '.debug')
|
|
}
|
|
|
|
private createDist() {
|
|
if (!fs.existsSync(this.dist)) {
|
|
fs.mkdirSync(this.dist)
|
|
}
|
|
}
|
|
|
|
public write() {
|
|
this.copyFolder()
|
|
if (!this.options.isBuild)
|
|
this.writeHtml()
|
|
this.writeCSXS()
|
|
if (!this.options.isBuild)
|
|
this.writeDebug()
|
|
this.copyJson2()
|
|
|
|
// 确保 CEP 扩展目录存在
|
|
const cepExtDir = getAdobeCepDir()
|
|
if (!fs.existsSync(cepExtDir)) {
|
|
fs.mkdirSync(cepExtDir, { recursive: true })
|
|
console.log('[CEP] 已创建 CEP 扩展目录:', cepExtDir)
|
|
}
|
|
|
|
// 创建符号链接或直接复制
|
|
if (!fs.existsSync(this.cepLink)) {
|
|
try {
|
|
fs.symlinkSync(this.cepOutput, this.cepLink, 'dir')
|
|
console.log('[CEP] 符号链接已创建')
|
|
} catch (error: any) {
|
|
// 权限不足时,改用复制
|
|
if (error.code === 'EPERM' || error.code === 'ENOENT') {
|
|
console.warn('[CEP] 符号链接创建失败,改用复制方式')
|
|
this.copyToCepDir()
|
|
} else {
|
|
throw error
|
|
}
|
|
}
|
|
} else {
|
|
// 目录已存在,需要更新文件
|
|
this.copyToCepDir()
|
|
}
|
|
|
|
if (this.options.isBuild) {
|
|
this.copyBuildFiles()
|
|
}
|
|
|
|
console.log('[cepPlugin] 安装目录:', getAdobeCepDir());
|
|
|
|
}
|
|
|
|
private copyToCepDir() {
|
|
// 删除旧目录
|
|
if (fs.existsSync(this.cepLink)) {
|
|
fs.rmSync(this.cepLink, { recursive: true, force: true })
|
|
}
|
|
// 复制目录
|
|
copyFolderSync(this.cepOutput, this.cepLink)
|
|
console.log('[CEP] 已复制到 CEP 目录')
|
|
}
|
|
|
|
private copyFolder() {
|
|
copyFolderSync(this.cepInput, this.cepOutput)
|
|
}
|
|
|
|
private writeHtml() {
|
|
const outhtml = path.join(this.cepOutput, 'index.html')
|
|
let content = joinHtml(this.cepConfig.name, this.options.serverURL || 'http://localhost:5173/')
|
|
fs.writeFileSync(outhtml, content)
|
|
}
|
|
|
|
private writeCSXS() {
|
|
const info = joinManifest(this.cepConfig)
|
|
const output = path.join(this.cepOutput, 'CSXS/manifest.xml')
|
|
fs.writeFileSync(output, info)
|
|
}
|
|
|
|
private writeDebug() {
|
|
const info = joinDebug(this.cepConfig.id, this.cepConfig.hosts)
|
|
fs.writeFileSync(this.debug, info)
|
|
}
|
|
|
|
private copyJson2() {
|
|
const input = path.join(__dirname, '../utils/json')
|
|
const out = path.join(this.cepOutput, 'js')
|
|
copyFolderSync(input, out)
|
|
}
|
|
|
|
private copyBuildFiles() {
|
|
// 1. 复制 assets 目录
|
|
const assetsInput = path.join(this.dist, 'assets')
|
|
const assetsOut = path.join(this.cepOutput, 'assets')
|
|
if (fs.existsSync(assetsInput)) {
|
|
copyFolderSync(assetsInput, assetsOut)
|
|
console.log('[CEP] ✓ 已复制 assets 目录')
|
|
}
|
|
|
|
// 2. 复制 CSInterface.js
|
|
const csInterfaceSrc = path.join(this.dist, 'CSInterface.js')
|
|
const csInterfaceDst = path.join(this.cepOutput, 'CSInterface.js')
|
|
if (fs.existsSync(csInterfaceSrc)) {
|
|
fs.copyFileSync(csInterfaceSrc, csInterfaceDst)
|
|
console.log('[CEP] ✓ 已复制 CSInterface.js')
|
|
}
|
|
|
|
// 3. 复制并修正 HTML 路径
|
|
const builtHtmlPath = path.join(this.dist, 'index.html')
|
|
const targetHtmlPath = path.join(this.cepOutput, 'index.html')
|
|
|
|
if (fs.existsSync(builtHtmlPath)) {
|
|
// 读取 HTML 内容并修正路径
|
|
let htmlContent = fs.readFileSync(builtHtmlPath, 'utf-8')
|
|
|
|
// 修正路径:把 ../../ 替换成 ./
|
|
htmlContent = htmlContent.replace(/\.\.\/\.\.\//g, './')
|
|
// 确保 CSInterface.js 路径正确
|
|
htmlContent = htmlContent.replace(/src="\.\/CSInterface\.js"/g, 'src="CSInterface.js"')
|
|
|
|
fs.writeFileSync(targetHtmlPath, htmlContent)
|
|
console.log('[CEP] ✓ 已复制并修正 HTML 路径')
|
|
} else {
|
|
console.warn('[CEP] ✗ 未找到构建的 HTML:', builtHtmlPath)
|
|
}
|
|
}
|
|
}
|