1const fs = require('fs')
2const path = require('path')
3
4import type {Plugin, ResolvedConfig} from "vite";
5import replace from "@rollup/plugin-replace";
6
7// @ts-ignore
8import cli from "@tauri-apps/cli"
9
10
11function copyFolder(copiedPath, resultPath, direct) {
12    if (!direct) {
13        copiedPath = path.join(__dirname, copiedPath)
14        resultPath = path.join(__dirname, resultPath)
15    }
16
17    function createDir(dirPath) {
18        fs.mkdirSync(dirPath)
19    }
20
21    if (fs.existsSync(copiedPath)) {
22        createDir(resultPath)
23        /**
24         * @des 方式一:利用子进程操作命令行方式
25         */
26        // child_process.spawn('cp', ['-r', copiedPath, resultPath])
27
28        /**
29         * @des 方式二:
30         */
31        const files = fs.readdirSync(copiedPath, {withFileTypes: true});
32        for (let i = 0; i < files.length; i++) {
33            const cf = files[i]
34            const ccp = path.join(copiedPath, cf.name)
35            const crp = path.join(resultPath, cf.name)
36            if (cf.isFile()) {
37                /**
38                 * @des 创建文件,使用流的形式可以读写大文件
39                 */
40                const readStream = fs.createReadStream(ccp)
41                const writeStream = fs.createWriteStream(crp)
42                readStream.pipe(writeStream)
43            } else {
44                try {
45                    /**
46                     * @des 判断读(R_OK | W_OK)写权限
47                     */
48                    fs.accessSync(path.join(crp, '..'), fs.constants.W_OK)
49                    copyFolder(ccp, crp, true)
50                } catch (error) {
51                    console.log('folder write error:', error);
52                }
53
54            }
55        }
56    } else {
57        console.log('do not exist path: ', copiedPath);
58    }
59}
60
61
62export default (): Plugin => {
63    let viteConfig: ResolvedConfig;
64
65    const tauri = (mode: "dev" | "build"): Promise<any> => {
66        try {
67            return cli.run([mode], 'tauri')
68        } catch (err) {
69            console.error(err)
70            return Promise.reject(err)
71        }
72    }
73
74    return {
75        ...replace({
76            "process.env.IS_TAURI": "true",
77            preventAssignment: false
78        }),
79        name: "tauri-plugin",
80        configureServer(server) {
81            server?.httpServer?.on("listening", () => {
82                if (!process.env.TAURI_SERVE) {
83                    process.env.TAURI_SERVE = "true";
84                    tauri('dev').finally()
85                }
86            });
87        },
88        closeBundle() {
89            if (!process.env.TAURI_BUILD) {
90                process.env.TAURI_BUILD = "true";
91                copyFolder('../thirdLib', '../build/thirdLib', false)
92                tauri('build').finally()
93            }
94        },
95        config(viteConfig, env) {
96            process.env.IS_TAURI = "true";
97        },
98        configResolved(resolvedConfig) {
99            viteConfig = resolvedConfig;
100        },
101    };
102};