1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci// Generated using webpack-cli https://github.com/webpack/webpack-cli
16fb726d48Sopenharmony_ci
17fb726d48Sopenharmony_ciconst path = require('path');
18fb726d48Sopenharmony_ciconst { CleanWebpackPlugin } = require('clean-webpack-plugin');
19fb726d48Sopenharmony_ciconst HtmlWebpackPlugin = require('html-webpack-plugin');
20fb726d48Sopenharmony_ciconst MiniCssExtractPlugin = require('mini-css-extract-plugin');
21fb726d48Sopenharmony_ciconst isProduction = process.env.NODE_ENV === 'production';
22fb726d48Sopenharmony_ciconst CopyWebpackPlugin = require('copy-webpack-plugin');
23fb726d48Sopenharmony_ciconst os = require('os');
24fb726d48Sopenharmony_ciconst childProcess = require('child_process');
25fb726d48Sopenharmony_ciconst { exec } = require('child_process');
26fb726d48Sopenharmony_ciconst fs = require('fs');
27fb726d48Sopenharmony_ci
28fb726d48Sopenharmony_ciconst supportPlatform = ['windows', 'linux', 'darwin'];
29fb726d48Sopenharmony_ci
30fb726d48Sopenharmony_cifunction runCommand(command) {
31fb726d48Sopenharmony_ci  return new Promise((resolve, reject) => {
32fb726d48Sopenharmony_ci    exec(command, (error, stdout, stderr) => {
33fb726d48Sopenharmony_ci      if (error) {
34fb726d48Sopenharmony_ci        reject(error);
35fb726d48Sopenharmony_ci      } else {
36fb726d48Sopenharmony_ci        resolve(stdout);
37fb726d48Sopenharmony_ci      }
38fb726d48Sopenharmony_ci    });
39fb726d48Sopenharmony_ci  });
40fb726d48Sopenharmony_ci}
41fb726d48Sopenharmony_ci
42fb726d48Sopenharmony_cifunction cpFile(sourcePath, targetPath) {
43fb726d48Sopenharmony_ci  fs.readdir(sourcePath, (err, files) => {
44fb726d48Sopenharmony_ci    if (err) {
45fb726d48Sopenharmony_ci      console.error('无法读取目录', err);
46fb726d48Sopenharmony_ci      return;
47fb726d48Sopenharmony_ci    }
48fb726d48Sopenharmony_ci    files.forEach((file) => {
49fb726d48Sopenharmony_ci      const source = `${sourcePath}/${file}`;
50fb726d48Sopenharmony_ci      const target = `${targetPath}/${file}`;
51fb726d48Sopenharmony_ci      if (fs.lstatSync(source).isFile()) {
52fb726d48Sopenharmony_ci        fs.copyFile(source, target, (err) => {
53fb726d48Sopenharmony_ci          if (err) {
54fb726d48Sopenharmony_ci            console.error('无法复制文件', err);
55fb726d48Sopenharmony_ci            return;
56fb726d48Sopenharmony_ci          }
57fb726d48Sopenharmony_ci        });
58fb726d48Sopenharmony_ci      }
59fb726d48Sopenharmony_ci    });
60fb726d48Sopenharmony_ci  });
61fb726d48Sopenharmony_ci}
62fb726d48Sopenharmony_ci
63fb726d48Sopenharmony_cifunction clearDirectory(directoryPath) {
64fb726d48Sopenharmony_ci  const isDirectoryExists = fs.existsSync(directoryPath);
65fb726d48Sopenharmony_ci
66fb726d48Sopenharmony_ci  if (!isDirectoryExists) {
67fb726d48Sopenharmony_ci    fs.mkdirSync(directoryPath);
68fb726d48Sopenharmony_ci  } else {
69fb726d48Sopenharmony_ci    fs.readdirSync(directoryPath).forEach((file) => {
70fb726d48Sopenharmony_ci      const filePath = path.join(directoryPath, file);
71fb726d48Sopenharmony_ci      if (fs.lstatSync(filePath).isDirectory()) {
72fb726d48Sopenharmony_ci        return;
73fb726d48Sopenharmony_ci      } else {
74fb726d48Sopenharmony_ci        try {
75fb726d48Sopenharmony_ci          fs.unlinkSync(filePath); // 删除文件
76fb726d48Sopenharmony_ci        } catch {
77fb726d48Sopenharmony_ci          console.log(`can't del file ${filePath}`);
78fb726d48Sopenharmony_ci        }
79fb726d48Sopenharmony_ci      }
80fb726d48Sopenharmony_ci    });
81fb726d48Sopenharmony_ci  }
82fb726d48Sopenharmony_ci}
83fb726d48Sopenharmony_ci
84fb726d48Sopenharmony_cifunction buildMultiPlatform() {
85fb726d48Sopenharmony_ci  const outPath = path.normalize(path.join(__dirname, '/', 'dist'));
86fb726d48Sopenharmony_ci  const serverSrc = path.normalize(path.join(__dirname, '/server/main.go'));
87fb726d48Sopenharmony_ci  for (const platform of supportPlatform) {
88fb726d48Sopenharmony_ci    const generateFile = platform === 'windows' ?
89fb726d48Sopenharmony_ci        path.normalize(path.join(outPath, '/', `main.exe`)) :
90fb726d48Sopenharmony_ci        path.normalize(path.join(outPath, '/', `main_${platform}`));
91fb726d48Sopenharmony_ci    const setEnv = `go env -w CGO_ENABLED=0 && go env -w GOOS=${platform} && go env -w GOARCH=amd64`;
92fb726d48Sopenharmony_ci    const buildCmd = `${setEnv} && go build -o ${generateFile} ${serverSrc}`;
93fb726d48Sopenharmony_ci    console.log(`compile ${platform} server ...`);
94fb726d48Sopenharmony_ci    childProcess.execSync(buildCmd);
95fb726d48Sopenharmony_ci  }
96fb726d48Sopenharmony_ci}
97fb726d48Sopenharmony_ci
98fb726d48Sopenharmony_ciconst stylesHandler = isProduction ? MiniCssExtractPlugin.loader : 'style-loader';
99fb726d48Sopenharmony_ci//compile server
100fb726d48Sopenharmony_ci((flag) => {
101fb726d48Sopenharmony_ci  if (!flag) {
102fb726d48Sopenharmony_ci    return;
103fb726d48Sopenharmony_ci  }
104fb726d48Sopenharmony_ci  console.log('start compile server');
105fb726d48Sopenharmony_ci  let outPath = path.normalize(path.join(__dirname, '/', 'dist'));
106fb726d48Sopenharmony_ci  let binPath = path.normalize(path.join(__dirname, '/', 'bin'));
107fb726d48Sopenharmony_ci  clearDirectory(outPath);
108fb726d48Sopenharmony_ci  cpFile(binPath, outPath);
109fb726d48Sopenharmony_ci  const protoPath = './src/trace/proto/';
110fb726d48Sopenharmony_ci  runCommand(`pbjs -t static-module -w commonjs -o ${protoPath}SphBaseData.js  ${protoPath}SphBaseData.proto`);
111fb726d48Sopenharmony_ci  buildMultiPlatform();
112fb726d48Sopenharmony_ci})(true);
113fb726d48Sopenharmony_ciconst config = {
114fb726d48Sopenharmony_ci  entry: './src/index.ts',
115fb726d48Sopenharmony_ci  output: {
116fb726d48Sopenharmony_ci    path: path.resolve(__dirname, 'dist'),
117fb726d48Sopenharmony_ci    filename: '[name].[chunkhash].bundle.js',
118fb726d48Sopenharmony_ci    clean: false,
119fb726d48Sopenharmony_ci  },
120fb726d48Sopenharmony_ci  devServer: {
121fb726d48Sopenharmony_ci    open: true,
122fb726d48Sopenharmony_ci    host: 'localhost',
123fb726d48Sopenharmony_ci  },
124fb726d48Sopenharmony_ci  plugins: [
125fb726d48Sopenharmony_ci    new HtmlWebpackPlugin({
126fb726d48Sopenharmony_ci      template: 'index.html',
127fb726d48Sopenharmony_ci    }),
128fb726d48Sopenharmony_ci    new CleanWebpackPlugin({
129fb726d48Sopenharmony_ci      verbose: true,
130fb726d48Sopenharmony_ci      cleanOnceBeforeBuildPatterns: ['!main'],
131fb726d48Sopenharmony_ci    }),
132fb726d48Sopenharmony_ci    new CopyWebpackPlugin({
133fb726d48Sopenharmony_ci      patterns: [
134fb726d48Sopenharmony_ci        {
135fb726d48Sopenharmony_ci          from: './src/figures',
136fb726d48Sopenharmony_ci          to: 'figures',
137fb726d48Sopenharmony_ci        },
138fb726d48Sopenharmony_ci        {
139fb726d48Sopenharmony_ci          from: './src/img',
140fb726d48Sopenharmony_ci          to: 'img',
141fb726d48Sopenharmony_ci        },
142fb726d48Sopenharmony_ci        {
143fb726d48Sopenharmony_ci          from: './src/doc',
144fb726d48Sopenharmony_ci          to: 'doc',
145fb726d48Sopenharmony_ci        },
146fb726d48Sopenharmony_ci        {
147fb726d48Sopenharmony_ci          from: './src/base-ui/icon.svg',
148fb726d48Sopenharmony_ci          to: 'base-ui/icon.svg',
149fb726d48Sopenharmony_ci        },
150fb726d48Sopenharmony_ci        {
151fb726d48Sopenharmony_ci          from: './src/trace/config/custom_temp_config.json',
152fb726d48Sopenharmony_ci          to: 'trace/config/custom_temp_config.json',
153fb726d48Sopenharmony_ci        },
154fb726d48Sopenharmony_ci        {
155fb726d48Sopenharmony_ci          from: './third-party/sql-wasm.js',
156fb726d48Sopenharmony_ci          to: 'sql-wasm.js',
157fb726d48Sopenharmony_ci        },
158fb726d48Sopenharmony_ci        {
159fb726d48Sopenharmony_ci          from: './third-party/sql-wasm.wasm',
160fb726d48Sopenharmony_ci          to: 'sql-wasm.wasm',
161fb726d48Sopenharmony_ci        },
162fb726d48Sopenharmony_ci        {
163fb726d48Sopenharmony_ci          from: './server/version.txt',
164fb726d48Sopenharmony_ci          to: 'version.txt',
165fb726d48Sopenharmony_ci        },
166fb726d48Sopenharmony_ci        {
167fb726d48Sopenharmony_ci          from: './server/wasm.json',
168fb726d48Sopenharmony_ci          to: 'wasm.json',
169fb726d48Sopenharmony_ci        },
170fb726d48Sopenharmony_ci        {
171fb726d48Sopenharmony_ci          from: './server/server-config.json',
172fb726d48Sopenharmony_ci          to: 'server-config.json',
173fb726d48Sopenharmony_ci        },
174fb726d48Sopenharmony_ci      ],
175fb726d48Sopenharmony_ci    }),
176fb726d48Sopenharmony_ci    // Add your plugins here
177fb726d48Sopenharmony_ci    // Learn more about plugins from https://webpack.js.org/configuration/plugins/
178fb726d48Sopenharmony_ci  ],
179fb726d48Sopenharmony_ci  module: {
180fb726d48Sopenharmony_ci    rules: [
181fb726d48Sopenharmony_ci      {
182fb726d48Sopenharmony_ci        test: /\.(ts|tsx)$/i,
183fb726d48Sopenharmony_ci        loader: 'ts-loader',
184fb726d48Sopenharmony_ci        exclude: ['/node_modules/'],
185fb726d48Sopenharmony_ci      },
186fb726d48Sopenharmony_ci      {
187fb726d48Sopenharmony_ci        test: /\.css$/i,
188fb726d48Sopenharmony_ci        use: [stylesHandler, 'css-loader', 'postcss-loader'],
189fb726d48Sopenharmony_ci      },
190fb726d48Sopenharmony_ci      {
191fb726d48Sopenharmony_ci        test: /\.(eot|svg|ttf|woff|woff2|png|jpg|gif)$/i,
192fb726d48Sopenharmony_ci        type: 'asset',
193fb726d48Sopenharmony_ci      },
194fb726d48Sopenharmony_ci
195fb726d48Sopenharmony_ci      // Add your rules for custom modules here
196fb726d48Sopenharmony_ci      // Learn more about loaders from https://webpack.js.org/loaders/
197fb726d48Sopenharmony_ci    ],
198fb726d48Sopenharmony_ci  },
199fb726d48Sopenharmony_ci  resolve: {
200fb726d48Sopenharmony_ci    extensions: ['.tsx', '.ts', '.jsx', '.js', '...'],
201fb726d48Sopenharmony_ci    fallback: {
202fb726d48Sopenharmony_ci      fs: false,
203fb726d48Sopenharmony_ci      tls: false,
204fb726d48Sopenharmony_ci      net: false,
205fb726d48Sopenharmony_ci      zlib: false,
206fb726d48Sopenharmony_ci      http: false,
207fb726d48Sopenharmony_ci      https: false,
208fb726d48Sopenharmony_ci      stream: false,
209fb726d48Sopenharmony_ci      crypto: false,
210fb726d48Sopenharmony_ci      path: false, //if you want to use this module also don't forget npm i crypto-browserify
211fb726d48Sopenharmony_ci    },
212fb726d48Sopenharmony_ci  },
213fb726d48Sopenharmony_ci};
214fb726d48Sopenharmony_ci
215fb726d48Sopenharmony_cimodule.exports = () => {
216fb726d48Sopenharmony_ci  if (isProduction) {
217fb726d48Sopenharmony_ci    config.mode = 'production';
218fb726d48Sopenharmony_ci
219fb726d48Sopenharmony_ci    config.plugins.push(new MiniCssExtractPlugin());
220fb726d48Sopenharmony_ci  } else {
221fb726d48Sopenharmony_ci    config.mode = 'development';
222fb726d48Sopenharmony_ci  }
223fb726d48Sopenharmony_ci  return config;
224fb726d48Sopenharmony_ci};
225