electron-vite-vue/script/plugins/index.ts
2021-05-16 20:14:05 +08:00

107 lines
3.2 KiB
TypeScript

import path from 'path'
import acorn from 'acorn'
import { Plugin as RollupPlugin } from 'rollup'
import { Plugin as VitePlugin } from 'vite'
import { vue_js_ts_extensions } from './utils'
/**
* cjs2esm
* @deprecated
*/
export function cjs2esm() {
return {
name: '@rollup/plugin-cjs2esm',
transform(code: string, filename: string) {
if (filename.includes(`${path.sep}node_modules${path.sep}`)) {
return code
}
const cjsRegexp = /(const|let|var)[\n\s]+(\w+)[\n\s]*=[\n\s]*require\(["|'](.+)["|']\)/g
const res = code.match(cjsRegexp)
if (res) {
// const Store = require('electron-store') -> import Store from 'electron-store'
code = code.replace(cjsRegexp, `import $2 from '$3'`)
}
return code
},
}
}
/** esm2cjs */
export function esm2cjs(moduleList: string[]): VitePlugin {
const filter = {
include: (id: string) => vue_js_ts_extensions.includes(path.parse(id).ext)
}
return {
name: 'cxmh:esm2cjs',
transform(code, id) {
if (filter.include(id)) {
const node: any = acorn.parse(code, {
ecmaVersion: 'latest',
sourceType: 'module',
})
const parsed = path.parse(id)
let codeRet = code
node.body.reverse().forEach((item) => {
if (item.type !== 'ImportDeclaration') return
if (!moduleList.includes(item.source.value)) return // 跳过不要转换的模块
const statr = codeRet.substring(0, item.start)
const end = codeRet.substring(item.end)
const deft = item.specifiers.find(({ type }) => type === 'ImportDefaultSpecifier')
const deftModule = deft ? deft.local.name : ''
const nameAs = item.specifiers.find(({ type }) => type === 'ImportNamespaceSpecifier')
const nameAsModule = nameAs ? nameAs.local.name : ''
const modules = item.
specifiers
.filter((({ type }) => type === 'ImportSpecifier'))
.reduce((acc, cur) => acc.concat(cur.imported.name), [])
// console.log(deftModule, '|', nameAsModule, '|', modules, '\n----')
if (nameAsModule) {
// import * as name from
codeRet = `${statr}const ${nameAsModule} = require(${item.source.raw})${end}`
} else if (deftModule && !modules.length) {
// import name from 'mod'
codeRet = `${statr}const ${deftModule} = require(${item.source.raw})${end}`
} else if (deftModule && modules.length) {
// import name, { name2, name3 } from 'mod'
codeRet = `${statr}const ${deftModule} = require(${item.source.raw})
const { ${modules.join(', ')} } = ${deftModule}${end}`
} else {
// import { name1, name2 } from 'mod'
codeRet = `${statr}const { ${modules.join(', ')} } = require(${item.source.raw})${end}`
}
})
return codeRet
}
},
}
}
/**
* ensure cwd crrect
* TODO: __dirname 会被编译成字符串
* @deprecated
*/
export function ensureCwdCrrect(filename: string): RollupPlugin {
return {
name: 'cxmh:ensure-cwd-crrect',
transform(code, id) {
if (id === filename) {
return `
// !!! ensure cwd crrect
process.chdir(__dirname)
${code}
`
}
},
}
}