universo-platform-2d
143 строки · 3.4 Кб
1import { spawn } from 'node:child_process';
2import { existsSync } from 'node:fs';
3import { join } from 'node:path';
4
5import * as p from '@clack/prompts';
6import { config } from 'dotenv';
7import webpack from 'webpack';
8import WebpackDevServer from 'webpack-dev-server';
9
10import { getCwdFromDistribution, projectRoot } from '../config/cwd.cjs';
11import type { BuildFlags } from '../config/index.js';
12import { createWebpackConfig } from '../webpack/webpack.config.js';
13
14const flags: BuildFlags = {
15distribution:
16(process.env.DISTRIBUTION as BuildFlags['distribution']) ?? 'web',
17mode: 'development',
18static: false,
19channel: 'canary',
20coverage: process.env.COVERAGE === 'true',
21};
22
23const files = ['.env', '.env.local'];
24
25for (const file of files) {
26if (existsSync(join(projectRoot, file))) {
27config({
28path: join(projectRoot, file),
29});
30console.log(`${file} loaded`);
31break;
32}
33}
34
35const buildFlags = process.argv.includes('--static')
36? { ...flags, static: true }
37: ((await p.group(
38{
39distribution: () =>
40p.select({
41message: 'Distribution',
42options: [
43{
44value: 'web',
45},
46{
47value: 'desktop',
48},
49{
50value: 'admin',
51},
52{
53value: 'mobile',
54},
55],
56initialValue: 'web',
57}),
58mode: () =>
59p.select({
60message: 'Mode',
61options: [
62{
63value: 'development',
64},
65{
66value: 'production',
67},
68],
69initialValue: 'development',
70}),
71channel: () =>
72p.select({
73message: 'Channel',
74options: [
75{
76value: 'canary',
77},
78{
79value: 'beta',
80},
81{
82value: 'stable',
83},
84],
85initialValue: 'canary',
86}),
87coverage: () =>
88p.confirm({
89message: 'Enable coverage',
90initialValue: process.env.COVERAGE === 'true',
91}),
92},
93{
94onCancel: () => {
95p.cancel('Operation cancelled.');
96process.exit(0);
97},
98}
99)) as BuildFlags);
100
101flags.distribution = buildFlags.distribution;
102flags.mode = buildFlags.mode;
103flags.channel = buildFlags.channel;
104flags.coverage = buildFlags.coverage;
105flags.static = buildFlags.static;
106flags.entry = undefined;
107
108const cwd = getCwdFromDistribution(flags.distribution);
109
110process.env.DISTRIBUTION = flags.distribution;
111
112if (flags.distribution === 'desktop') {
113flags.entry = {
114app: join(cwd, 'index.tsx'),
115shell: join(cwd, 'shell/index.tsx'),
116};
117}
118
119console.info(flags);
120
121if (!flags.static) {
122spawn('yarn', ['workspace', '@affine/i18n', 'dev'], {
123stdio: 'inherit',
124shell: true,
125});
126}
127
128try {
129// @ts-expect-error no types
130await import('@affine/templates/build-edgeless');
131const config = createWebpackConfig(cwd, flags);
132if (flags.static) {
133config.watch = false;
134}
135const compiler = webpack(config);
136// Start webpack
137const devServer = new WebpackDevServer(config.devServer, compiler);
138
139await devServer.start();
140} catch (error) {
141console.error('Error during build:', error);
142process.exit(1);
143}
144