161847f8eSopenharmony_ci/*
261847f8eSopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
361847f8eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
461847f8eSopenharmony_ci * you may not use this file except in compliance with the License.
561847f8eSopenharmony_ci * You may obtain a copy of the License at
661847f8eSopenharmony_ci *
761847f8eSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
861847f8eSopenharmony_ci *
961847f8eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1061847f8eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1161847f8eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1261847f8eSopenharmony_ci * See the License for the specific language governing permissions and
1361847f8eSopenharmony_ci * limitations under the License.
1461847f8eSopenharmony_ci */
1561847f8eSopenharmony_ci
1661847f8eSopenharmony_ciconst path = require('path');
1761847f8eSopenharmony_ciconst fs = require('fs');
1861847f8eSopenharmony_ciconst TerserPlugin = require('terser-webpack-plugin');
1961847f8eSopenharmony_ciconst webpack = require('webpack');
2061847f8eSopenharmony_ciconst packageInfo = require('./package.json');
2161847f8eSopenharmony_ciconst archiver = require('archiver');
2261847f8eSopenharmony_ciconst { copyESLibs } = require('./scripts/copylibs');
2361847f8eSopenharmony_ci
2461847f8eSopenharmony_ciclass PackPlugin {
2561847f8eSopenharmony_ci  apply(compiler) {
2661847f8eSopenharmony_ci    compiler.hooks.done.tap('PackPlugin', (stats) => {
2761847f8eSopenharmony_ci      const bundleName = `${packageInfo.name}.js`;
2861847f8eSopenharmony_ci      const bundlejsPath = path.resolve(__dirname, 'package', bundleName);
2961847f8eSopenharmony_ci      if (!fs.existsSync(bundlejsPath)) {
3061847f8eSopenharmony_ci        console.error(`${bundleName} not found`);
3161847f8eSopenharmony_ci        return;
3261847f8eSopenharmony_ci      }
3361847f8eSopenharmony_ci      copyESLibs();
3461847f8eSopenharmony_ci      const libsPath = path.resolve(__dirname, 'libs');
3561847f8eSopenharmony_ci      const readme = path.resolve(__dirname, 'README_zh.md');
3661847f8eSopenharmony_ci      const outputName = path.resolve(__dirname, 'package', `${packageInfo.name}-${packageInfo.version}.zip`);
3761847f8eSopenharmony_ci      const outputZipStream = fs.createWriteStream(outputName);
3861847f8eSopenharmony_ci      const archive = archiver('zip');
3961847f8eSopenharmony_ci      archive.pipe(outputZipStream);
4061847f8eSopenharmony_ci      archive.file(bundlejsPath, { name: bundleName });
4161847f8eSopenharmony_ci      archive.file(readme, { name: 'README.md' });
4261847f8eSopenharmony_ci      archive.directory(libsPath, 'libs');
4361847f8eSopenharmony_ci      archive.finalize();
4461847f8eSopenharmony_ci    });
4561847f8eSopenharmony_ci  }
4661847f8eSopenharmony_ci}
4761847f8eSopenharmony_ci
4861847f8eSopenharmony_cimodule.exports = (env, argv) => {
4961847f8eSopenharmony_ci  const config = {
5061847f8eSopenharmony_ci    name: 'JSDoc formatter plugin',
5161847f8eSopenharmony_ci    target: 'node',
5261847f8eSopenharmony_ci    mode: 'none',
5361847f8eSopenharmony_ci    entry: './src/main.ts',
5461847f8eSopenharmony_ci    module: {
5561847f8eSopenharmony_ci      rules: [
5661847f8eSopenharmony_ci        {
5761847f8eSopenharmony_ci          test: /\.ts$/,
5861847f8eSopenharmony_ci          include: path.resolve(__dirname, 'src'),
5961847f8eSopenharmony_ci          exclude: [/node_modules/, /test/],
6061847f8eSopenharmony_ci          loader: 'ts-loader',
6161847f8eSopenharmony_ci          options: {
6261847f8eSopenharmony_ci            onlyCompileBundledFiles: true,
6361847f8eSopenharmony_ci          },
6461847f8eSopenharmony_ci        },
6561847f8eSopenharmony_ci        {
6661847f8eSopenharmony_ci          test: /build\.json$/,
6761847f8eSopenharmony_ci          use: [
6861847f8eSopenharmony_ci            {
6961847f8eSopenharmony_ci              loader: path.resolve(__dirname, 'loader/flavor.js'),
7061847f8eSopenharmony_ci            },
7161847f8eSopenharmony_ci          ],
7261847f8eSopenharmony_ci        },
7361847f8eSopenharmony_ci      ],
7461847f8eSopenharmony_ci    },
7561847f8eSopenharmony_ci    resolve: {
7661847f8eSopenharmony_ci      extensions: ['.js', '.ts', '.json'],
7761847f8eSopenharmony_ci    },
7861847f8eSopenharmony_ci    output: {
7961847f8eSopenharmony_ci      filename: `${packageInfo.name}.js`,
8061847f8eSopenharmony_ci      path: path.resolve(__dirname, './package'),
8161847f8eSopenharmony_ci    },
8261847f8eSopenharmony_ci    optimization: {
8361847f8eSopenharmony_ci      minimize: true,
8461847f8eSopenharmony_ci      minimizer: [new TerserPlugin({ extractComments: false })],
8561847f8eSopenharmony_ci    },
8661847f8eSopenharmony_ci    plugins: [
8761847f8eSopenharmony_ci      new webpack.BannerPlugin({
8861847f8eSopenharmony_ci        banner: `version:${packageInfo.version}`,
8961847f8eSopenharmony_ci        raw: false,
9061847f8eSopenharmony_ci        entryOnly: true,
9161847f8eSopenharmony_ci      }),
9261847f8eSopenharmony_ci      new PackPlugin(),
9361847f8eSopenharmony_ci    ],
9461847f8eSopenharmony_ci  };
9561847f8eSopenharmony_ci  return config;
9661847f8eSopenharmony_ci};
97