mirror of
https://github.com/strapi/strapi.git
synced 2025-11-12 08:08:05 +00:00
fix: clean and build without diagnostics
This commit is contained in:
parent
da634b0951
commit
ef68047284
@ -1,13 +1,12 @@
|
|||||||
|
import type { CLIContext } from '@strapi/strapi';
|
||||||
|
import EE from '@strapi/strapi/dist/utils/ee';
|
||||||
import * as tsUtils from '@strapi/typescript-utils';
|
import * as tsUtils from '@strapi/typescript-utils';
|
||||||
import { checkRequiredDependencies } from './core/dependencies';
|
import { checkRequiredDependencies } from './core/dependencies';
|
||||||
import { writeStaticClientFiles } from './staticFiles';
|
|
||||||
import { build as buildWebpack } from './webpack/build';
|
|
||||||
import { createBuildContext } from './createBuildContext';
|
|
||||||
|
|
||||||
import EE from '@strapi/strapi/dist/utils/ee';
|
|
||||||
import { getTimer } from './core/timer';
|
import { getTimer } from './core/timer';
|
||||||
|
import { createBuildContext } from './createBuildContext';
|
||||||
import type { CLIContext } from '@strapi/strapi';
|
import { writeStaticClientFiles } from './staticFiles';
|
||||||
|
import { prettyTime } from './utils';
|
||||||
|
import { build as buildWebpack } from './webpack/build';
|
||||||
|
|
||||||
interface BuildOptions extends CLIContext {
|
interface BuildOptions extends CLIContext {
|
||||||
/**
|
/**
|
||||||
@ -56,7 +55,7 @@ const build = async ({ logger, cwd, tsconfig, ignorePrompts, ...options }: Build
|
|||||||
tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });
|
tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });
|
||||||
|
|
||||||
const compilingDuration = timer.end('compilingTS');
|
const compilingDuration = timer.end('compilingTS');
|
||||||
compilingTsSpinner.text = `Compiling TS (${compilingDuration}ms)`;
|
compilingTsSpinner.text = `Compiling TS (${prettyTime(compilingDuration)})`;
|
||||||
compilingTsSpinner.succeed();
|
compilingTsSpinner.succeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +70,7 @@ const build = async ({ logger, cwd, tsconfig, ignorePrompts, ...options }: Build
|
|||||||
options,
|
options,
|
||||||
});
|
});
|
||||||
const contextDuration = timer.end('createBuildContext');
|
const contextDuration = timer.end('createBuildContext');
|
||||||
contextSpinner.text = `Building build context (${contextDuration}ms)`;
|
contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;
|
||||||
contextSpinner.succeed();
|
contextSpinner.succeed();
|
||||||
|
|
||||||
timer.start('buildAdmin');
|
timer.start('buildAdmin');
|
||||||
@ -85,7 +84,7 @@ const build = async ({ logger, cwd, tsconfig, ignorePrompts, ...options }: Build
|
|||||||
await buildWebpack(ctx);
|
await buildWebpack(ctx);
|
||||||
|
|
||||||
const buildDuration = timer.end('buildAdmin');
|
const buildDuration = timer.end('buildAdmin');
|
||||||
buildingSpinner.text = `Building admin panel (${buildDuration}ms)`;
|
buildingSpinner.text = `Building admin panel (${prettyTime(buildDuration)})`;
|
||||||
buildingSpinner.succeed();
|
buildingSpinner.succeed();
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
buildingSpinner.fail();
|
buildingSpinner.fail();
|
||||||
|
|||||||
@ -2,17 +2,21 @@ import type { CLIContext } from '@strapi/strapi';
|
|||||||
import * as tsUtils from '@strapi/typescript-utils';
|
import * as tsUtils from '@strapi/typescript-utils';
|
||||||
import { joinBy } from '@strapi/utils';
|
import { joinBy } from '@strapi/utils';
|
||||||
import chokidar from 'chokidar';
|
import chokidar from 'chokidar';
|
||||||
|
import * as fs from 'fs-extra';
|
||||||
|
import path from 'path';
|
||||||
|
|
||||||
import cluster from 'node:cluster';
|
import cluster from 'node:cluster';
|
||||||
|
|
||||||
import { getTimer } from './core/timer';
|
|
||||||
import { checkRequiredDependencies } from './core/dependencies';
|
import { checkRequiredDependencies } from './core/dependencies';
|
||||||
|
import { getTimer, type TimeMeasurer } from './core/timer';
|
||||||
import { createBuildContext } from './createBuildContext';
|
import { createBuildContext } from './createBuildContext';
|
||||||
import { WebpackWatcher, watch as watchWebpack } from './webpack/watch';
|
|
||||||
import { build as buildWebpack } from './webpack/build';
|
import { build as buildWebpack } from './webpack/build';
|
||||||
|
import { watch as watchWebpack, WebpackWatcher } from './webpack/watch';
|
||||||
|
|
||||||
|
import strapiFactory from '@strapi/strapi';
|
||||||
import EE from '@strapi/strapi/dist/utils/ee';
|
import EE from '@strapi/strapi/dist/utils/ee';
|
||||||
import { writeStaticClientFiles } from './staticFiles';
|
import { writeStaticClientFiles } from './staticFiles';
|
||||||
import strapiFactory from '@strapi/strapi';
|
import { prettyTime } from './utils';
|
||||||
|
|
||||||
interface DevelopOptions extends CLIContext {
|
interface DevelopOptions extends CLIContext {
|
||||||
/**
|
/**
|
||||||
@ -24,6 +28,33 @@ interface DevelopOptions extends CLIContext {
|
|||||||
watchAdmin?: boolean;
|
watchAdmin?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const cleanupDistDirectory = async ({
|
||||||
|
tsconfig,
|
||||||
|
logger,
|
||||||
|
timer,
|
||||||
|
}: Pick<DevelopOptions, 'tsconfig' | 'logger'> & { timer: TimeMeasurer }) => {
|
||||||
|
const distDir = tsconfig?.config?.options?.outDir;
|
||||||
|
|
||||||
|
if (!distDir || !(await fs.pathExists(distDir))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const timerName = 'cleaningDist' + Date.now();
|
||||||
|
timer.start(timerName);
|
||||||
|
const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start();
|
||||||
|
|
||||||
|
const dirContent = await fs.readdir(distDir);
|
||||||
|
const validFilenames = dirContent
|
||||||
|
// Ignore the admin build folder
|
||||||
|
.filter((filename) => filename !== 'build');
|
||||||
|
for (const filename of validFilenames) {
|
||||||
|
await fs.remove(path.resolve(distDir, filename));
|
||||||
|
}
|
||||||
|
|
||||||
|
const generatingDuration = timer.end(timerName);
|
||||||
|
cleaningSpinner.text = `Cleaning dist dir (${prettyTime(generatingDuration)})`;
|
||||||
|
cleaningSpinner?.succeed();
|
||||||
|
};
|
||||||
|
|
||||||
const develop = async ({
|
const develop = async ({
|
||||||
cwd,
|
cwd,
|
||||||
polling,
|
polling,
|
||||||
@ -35,6 +66,8 @@ const develop = async ({
|
|||||||
}: DevelopOptions) => {
|
}: DevelopOptions) => {
|
||||||
const timer = getTimer();
|
const timer = getTimer();
|
||||||
|
|
||||||
|
const distDir = tsconfig?.config?.options?.outDir;
|
||||||
|
|
||||||
if (cluster.isPrimary) {
|
if (cluster.isPrimary) {
|
||||||
const { didInstall } = await checkRequiredDependencies({ cwd, logger, ignorePrompts }).catch(
|
const { didInstall } = await checkRequiredDependencies({ cwd, logger, ignorePrompts }).catch(
|
||||||
(err) => {
|
(err) => {
|
||||||
@ -47,6 +80,12 @@ const develop = async ({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Build without diagnostics in case schemas have changed
|
||||||
|
if (distDir) {
|
||||||
|
await cleanupDistDirectory({ tsconfig, logger, timer });
|
||||||
|
await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IF we're not watching the admin we're going to build it, this makes
|
* IF we're not watching the admin we're going to build it, this makes
|
||||||
* sure that at least the admin is built for users & they can interact
|
* sure that at least the admin is built for users & they can interact
|
||||||
@ -64,7 +103,7 @@ const develop = async ({
|
|||||||
options,
|
options,
|
||||||
});
|
});
|
||||||
const contextDuration = timer.end('createBuildContext');
|
const contextDuration = timer.end('createBuildContext');
|
||||||
contextSpinner.text = `Building build context (${contextDuration}ms)`;
|
contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;
|
||||||
contextSpinner.succeed();
|
contextSpinner.succeed();
|
||||||
|
|
||||||
timer.start('creatingAdmin');
|
timer.start('creatingAdmin');
|
||||||
@ -75,13 +114,18 @@ const develop = async ({
|
|||||||
await buildWebpack(ctx);
|
await buildWebpack(ctx);
|
||||||
|
|
||||||
const adminDuration = timer.end('creatingAdmin');
|
const adminDuration = timer.end('creatingAdmin');
|
||||||
adminSpinner.text = `Creating admin (${adminDuration}ms)`;
|
adminSpinner.text = `Creating admin (${prettyTime(adminDuration)})`;
|
||||||
adminSpinner.succeed();
|
adminSpinner.succeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
cluster.on('message', async (worker, message) => {
|
cluster.on('message', async (worker, message) => {
|
||||||
switch (message) {
|
switch (message) {
|
||||||
case 'reload': {
|
case 'reload': {
|
||||||
|
if (distDir) {
|
||||||
|
// Build without diagnostics in case schemas have changed
|
||||||
|
await cleanupDistDirectory({ tsconfig, logger, timer });
|
||||||
|
await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });
|
||||||
|
}
|
||||||
logger.debug('cluster has the reload message, sending the worker kill message');
|
logger.debug('cluster has the reload message, sending the worker kill message');
|
||||||
worker.send('kill');
|
worker.send('kill');
|
||||||
break;
|
break;
|
||||||
@ -104,17 +148,6 @@ const develop = async ({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cluster.isWorker) {
|
if (cluster.isWorker) {
|
||||||
if (tsconfig?.config) {
|
|
||||||
timer.start('compilingTS');
|
|
||||||
const compilingTsSpinner = logger.spinner(`Compiling TS`).start();
|
|
||||||
|
|
||||||
tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });
|
|
||||||
|
|
||||||
const compilingDuration = timer.end('compilingTS');
|
|
||||||
compilingTsSpinner.text = `Compiling TS (${compilingDuration}ms)`;
|
|
||||||
compilingTsSpinner.succeed();
|
|
||||||
}
|
|
||||||
|
|
||||||
const strapi = strapiFactory({
|
const strapi = strapiFactory({
|
||||||
appDir: cwd,
|
appDir: cwd,
|
||||||
distDir: tsconfig?.config.options.outDir ?? '',
|
distDir: tsconfig?.config.options.outDir ?? '',
|
||||||
@ -122,6 +155,37 @@ const develop = async ({
|
|||||||
serveAdminPanel: !watchAdmin,
|
serveAdminPanel: !watchAdmin,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const strapiInstance = await strapi.load();
|
||||||
|
|
||||||
|
timer.start('generatingTS');
|
||||||
|
const generatingTsSpinner = logger.spinner(`Generating types`).start();
|
||||||
|
|
||||||
|
await tsUtils.generators.generate({
|
||||||
|
strapi: strapiInstance,
|
||||||
|
pwd: cwd,
|
||||||
|
rootDir: undefined,
|
||||||
|
logger: { silent: true, debug: false },
|
||||||
|
artifacts: { contentTypes: true, components: true },
|
||||||
|
});
|
||||||
|
|
||||||
|
const generatingDuration = timer.end('generatingTS');
|
||||||
|
generatingTsSpinner.text = `Generating types (${prettyTime(generatingDuration)})`;
|
||||||
|
generatingTsSpinner.succeed();
|
||||||
|
|
||||||
|
if (tsconfig?.config) {
|
||||||
|
timer.start('compilingTS');
|
||||||
|
const compilingTsSpinner = logger.spinner(`Compiling TS`).start();
|
||||||
|
|
||||||
|
if (distDir) {
|
||||||
|
await cleanupDistDirectory({ tsconfig, logger, timer });
|
||||||
|
await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });
|
||||||
|
}
|
||||||
|
|
||||||
|
const compilingDuration = timer.end('compilingTS');
|
||||||
|
compilingTsSpinner.text = `Compiling TS (${prettyTime(compilingDuration)})`;
|
||||||
|
compilingTsSpinner.succeed();
|
||||||
|
}
|
||||||
|
|
||||||
let webpackWatcher: WebpackWatcher | undefined;
|
let webpackWatcher: WebpackWatcher | undefined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -141,7 +205,7 @@ const develop = async ({
|
|||||||
options,
|
options,
|
||||||
});
|
});
|
||||||
const contextDuration = timer.end('createBuildContext');
|
const contextDuration = timer.end('createBuildContext');
|
||||||
contextSpinner.text = `Building build context (${contextDuration}ms)`;
|
contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;
|
||||||
contextSpinner.succeed();
|
contextSpinner.succeed();
|
||||||
|
|
||||||
timer.start('creatingAdmin');
|
timer.start('creatingAdmin');
|
||||||
@ -152,27 +216,10 @@ const develop = async ({
|
|||||||
webpackWatcher = await watchWebpack(ctx);
|
webpackWatcher = await watchWebpack(ctx);
|
||||||
|
|
||||||
const adminDuration = timer.end('creatingAdmin');
|
const adminDuration = timer.end('creatingAdmin');
|
||||||
adminSpinner.text = `Creating admin (${adminDuration}ms)`;
|
adminSpinner.text = `Creating admin (${prettyTime(adminDuration)})`;
|
||||||
adminSpinner.succeed();
|
adminSpinner.succeed();
|
||||||
}
|
}
|
||||||
|
|
||||||
const strapiInstance = await strapi.load();
|
|
||||||
|
|
||||||
timer.start('generatingTS');
|
|
||||||
const generatingTsSpinner = logger.spinner(`Generating types`).start();
|
|
||||||
|
|
||||||
await tsUtils.generators.generate({
|
|
||||||
strapi: strapiInstance,
|
|
||||||
pwd: cwd,
|
|
||||||
rootDir: undefined,
|
|
||||||
logger: { silent: true, debug: false },
|
|
||||||
artifacts: { contentTypes: true, components: true },
|
|
||||||
});
|
|
||||||
|
|
||||||
const generatingDuration = timer.end('generatingTS');
|
|
||||||
generatingTsSpinner.text = `Generating types (${generatingDuration}ms)`;
|
|
||||||
generatingTsSpinner.succeed();
|
|
||||||
|
|
||||||
const restart = async () => {
|
const restart = async () => {
|
||||||
if (strapiInstance.reload.isWatching && !strapiInstance.reload.isReloading) {
|
if (strapiInstance.reload.isWatching && !strapiInstance.reload.isReloading) {
|
||||||
strapiInstance.reload.isReloading = true;
|
strapiInstance.reload.isReloading = true;
|
||||||
|
|||||||
3
packages/core/admin/_internal/node/utils.ts
Normal file
3
packages/core/admin/_internal/node/utils.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export const prettyTime = (timeInMs: number): string => {
|
||||||
|
return Math.ceil(timeInMs) + 'ms';
|
||||||
|
};
|
||||||
Loading…
x
Reference in New Issue
Block a user