UNPKG

@strapi/strapi

Version:

An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MySQL, MariaDB, PostgreSQL, SQLite

1 lines • 21.2 kB
{"version":3,"file":"develop.mjs","sources":["../../../src/node/develop.ts"],"sourcesContent":["import * as tsUtils from '@strapi/typescript-utils';\nimport { strings } from '@strapi/utils';\nimport chokidar from 'chokidar';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport cluster from 'node:cluster';\nimport { createStrapi } from '@strapi/core';\n\nimport type { CLIContext } from '../cli/types';\nimport { checkRequiredDependencies } from './core/dependencies';\nimport { getTimer, prettyTime, type TimeMeasurer } from './core/timer';\nimport { createBuildContext } from './create-build-context';\nimport type { WebpackWatcher } from './webpack/watch';\nimport type { ViteWatcher } from './vite/watch';\n\nimport { writeStaticClientFiles } from './staticFiles';\n\ninterface DevelopOptions extends CLIContext {\n /**\n * Which bundler to use for building.\n *\n * @default webpack\n */\n bundler?: 'webpack' | 'vite';\n polling?: boolean;\n open?: boolean;\n watchAdmin?: boolean;\n}\n\n// This method removes all non-admin build files from the dist directory\nconst cleanupDistDirectory = async ({\n tsconfig,\n logger,\n timer,\n}: Pick<DevelopOptions, 'tsconfig' | 'logger'> & { timer: TimeMeasurer }) => {\n const distDir = tsconfig?.config?.options?.outDir;\n\n if (\n !distDir || // we don't have a dist dir\n (await fs\n .access(distDir)\n .then(() => false)\n .catch(() => true)) // it doesn't exist -- if it does but no access, that will be caught later\n ) {\n return;\n }\n\n const timerName = `cleaningDist${Date.now()}`;\n timer.start(timerName);\n const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start();\n\n try {\n const dirContent = await fs.readdir(distDir);\n const validFilenames = dirContent\n // Ignore the admin build folder\n .filter((filename) => filename !== 'build');\n for (const filename of validFilenames) {\n await fs.rm(path.resolve(distDir, filename), { recursive: true });\n }\n } catch (err: unknown) {\n const generatingDuration = timer.end(timerName);\n cleaningSpinner.text = `Error cleaning dist dir: ${err} (${prettyTime(generatingDuration)})`;\n cleaningSpinner?.fail();\n return;\n }\n\n const generatingDuration = timer.end(timerName);\n cleaningSpinner.text = `Cleaning dist dir (${prettyTime(generatingDuration)})`;\n cleaningSpinner?.succeed();\n};\n\nconst develop = async ({\n cwd,\n polling,\n logger,\n tsconfig,\n watchAdmin,\n ...options\n}: DevelopOptions) => {\n const timer = getTimer();\n\n if (cluster.isPrimary) {\n const { didInstall } = await checkRequiredDependencies({ cwd, logger }).catch((err) => {\n logger.error(err.message);\n process.exit(1);\n });\n\n if (didInstall) {\n return;\n }\n\n if (tsconfig?.config) {\n // Build without diagnostics in case schemas have changed\n await cleanupDistDirectory({ tsconfig, logger, timer });\n await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n }\n\n /**\n * IF we're not watching the admin we're going to build it, this makes\n * sure that at least the admin is built for users & they can interact\n * with the application.\n */\n if (!watchAdmin) {\n timer.start('createBuildContext');\n const contextSpinner = logger.spinner(`Building build context`).start();\n console.log('');\n\n const ctx = await createBuildContext({\n cwd,\n logger,\n tsconfig,\n options,\n });\n const contextDuration = timer.end('createBuildContext');\n contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;\n contextSpinner.succeed();\n\n timer.start('creatingAdmin');\n const adminSpinner = logger.spinner(`Creating admin`).start();\n\n await writeStaticClientFiles(ctx);\n\n if (ctx.bundler === 'webpack') {\n const { build: buildWebpack } = await import('./webpack/build');\n await buildWebpack(ctx);\n } else if (ctx.bundler === 'vite') {\n const { build: buildVite } = await import('./vite/build');\n await buildVite(ctx);\n }\n\n const adminDuration = timer.end('creatingAdmin');\n adminSpinner.text = `Creating admin (${prettyTime(adminDuration)})`;\n adminSpinner.succeed();\n }\n\n cluster.on('message', async (worker, message) => {\n switch (message) {\n case 'reload': {\n if (tsconfig?.config) {\n // Build without diagnostics in case schemas have changed\n await cleanupDistDirectory({ tsconfig, logger, timer });\n await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n }\n logger.debug('cluster has the reload message, sending the worker kill message');\n worker.send('kill');\n break;\n }\n case 'killed': {\n logger.debug('cluster has the killed message, forking the cluster');\n cluster.fork();\n break;\n }\n case 'stop': {\n process.exit(1);\n break;\n }\n default:\n break;\n }\n });\n\n cluster.fork();\n }\n\n if (cluster.isWorker) {\n timer.start('loadStrapi');\n const loadStrapiSpinner = logger.spinner(`Loading Strapi`).start();\n\n const strapi = createStrapi({\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n autoReload: true,\n serveAdminPanel: !watchAdmin,\n });\n\n /**\n * If we're watching the admin panel then we're going to attach the watcher\n * as a strapi middleware.\n */\n let bundleWatcher: WebpackWatcher | ViteWatcher | undefined;\n\n const strapiInstance = await strapi.load();\n\n if (watchAdmin) {\n timer.start('createBuildContext');\n const contextSpinner = logger.spinner(`Building build context`).start();\n console.log('');\n\n const ctx = await createBuildContext({\n cwd,\n logger,\n strapi,\n tsconfig,\n options,\n });\n const contextDuration = timer.end('createBuildContext');\n contextSpinner.text = `Building build context (${prettyTime(contextDuration)})`;\n contextSpinner.succeed();\n\n timer.start('creatingAdmin');\n const adminSpinner = logger.spinner(`Creating admin`).start();\n\n await writeStaticClientFiles(ctx);\n\n if (ctx.bundler === 'webpack') {\n const { watch: watchWebpack } = await import('./webpack/watch');\n bundleWatcher = await watchWebpack(ctx);\n } else if (ctx.bundler === 'vite') {\n const { watch: watchVite } = await import('./vite/watch');\n bundleWatcher = await watchVite(ctx);\n }\n\n const adminDuration = timer.end('creatingAdmin');\n adminSpinner.text = `Creating admin (${prettyTime(adminDuration)})`;\n adminSpinner.succeed();\n }\n\n const loadStrapiDuration = timer.end('loadStrapi');\n loadStrapiSpinner.text = `Loading Strapi (${prettyTime(loadStrapiDuration)})`;\n loadStrapiSpinner.succeed();\n\n // For TS projects, type generation is a requirement for the develop command so that the server can restart\n // For JS projects, we respect the experimental autogenerate setting\n if (tsconfig?.config || strapi.config.get('typescript.autogenerate') !== false) {\n timer.start('generatingTS');\n const generatingTsSpinner = logger.spinner(`Generating types`).start();\n\n await tsUtils.generators.generate({\n strapi: strapiInstance,\n pwd: cwd,\n rootDir: undefined,\n logger: { silent: true, debug: false },\n artifacts: { contentTypes: true, components: true },\n });\n\n const generatingDuration = timer.end('generatingTS');\n generatingTsSpinner.text = `Generating types (${prettyTime(generatingDuration)})`;\n generatingTsSpinner.succeed();\n }\n\n if (tsconfig?.config) {\n timer.start('compilingTS');\n const compilingTsSpinner = logger.spinner(`Compiling TS`).start();\n\n await cleanupDistDirectory({ tsconfig, logger, timer });\n await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: false } });\n\n const compilingDuration = timer.end('compilingTS');\n compilingTsSpinner.text = `Compiling TS (${prettyTime(compilingDuration)})`;\n compilingTsSpinner.succeed();\n }\n\n const restart = async () => {\n if (strapiInstance.reload.isWatching && !strapiInstance.reload.isReloading) {\n strapiInstance.reload.isReloading = true;\n strapiInstance.reload();\n }\n };\n\n const watcher = chokidar\n .watch(cwd, {\n ignoreInitial: true,\n usePolling: polling,\n ignored: [\n /(^|[/\\\\])\\../, // dot files\n /tmp/,\n '**/src/admin/**',\n '**/src/plugins/**/admin/**',\n '**/dist/src/plugins/test/admin/**',\n '**/documentation',\n '**/documentation/**',\n '**/node_modules',\n '**/node_modules/**',\n '**/plugins.json',\n '**/build',\n '**/build/**',\n '**/log',\n '**/log/**',\n '**/logs',\n '**/logs/**',\n '**/*.log',\n '**/index.html',\n '**/public',\n '**/public/**',\n strapiInstance.dirs.static.public,\n strings.joinBy('/', strapiInstance.dirs.static.public, '**'),\n '**/*.db*',\n '**/exports/**',\n '**/dist/**',\n '**/*.d.ts',\n '**/.yalc/**',\n '**/yalc.lock',\n // TODO v6: watch only src folder by default, and flip this to watchIncludeFiles\n ...strapiInstance.config.get('admin.watchIgnoreFiles', []),\n ],\n })\n .on('add', (path) => {\n strapiInstance.log.info(`File created: ${path}`);\n restart();\n })\n .on('change', (path) => {\n strapiInstance.log.info(`File changed: ${path}`);\n restart();\n })\n .on('unlink', (path) => {\n strapiInstance.log.info(`File deleted: ${path}`);\n restart();\n });\n\n process.on('message', async (message) => {\n switch (message) {\n case 'kill': {\n logger.debug(\n 'child process has the kill message, destroying the strapi instance and sending the killed process message'\n );\n await watcher.close();\n\n await strapiInstance.destroy();\n\n if (bundleWatcher) {\n bundleWatcher.close();\n }\n process.send?.('killed');\n break;\n }\n default:\n break;\n }\n });\n\n strapiInstance.start();\n }\n};\n\nexport { develop };\nexport type { DevelopOptions };\n"],"names":["cleanupDistDirectory","tsconfig","logger","timer","distDir","config","options","outDir","fs","access","then","catch","timerName","Date","now","start","cleaningSpinner","spinner","dirContent","readdir","validFilenames","filter","filename","rm","path","resolve","recursive","err","generatingDuration","end","text","prettyTime","fail","succeed","develop","cwd","polling","watchAdmin","getTimer","cluster","isPrimary","didInstall","checkRequiredDependencies","error","message","process","exit","tsUtils","compile","configOptions","ignoreDiagnostics","contextSpinner","console","log","ctx","createBuildContext","contextDuration","adminSpinner","writeStaticClientFiles","bundler","build","buildWebpack","buildVite","adminDuration","on","worker","debug","send","fork","isWorker","loadStrapiSpinner","strapi","createStrapi","appDir","autoReload","serveAdminPanel","bundleWatcher","strapiInstance","load","watch","watchWebpack","watchVite","loadStrapiDuration","get","generatingTsSpinner","generators","generate","pwd","rootDir","undefined","silent","artifacts","contentTypes","components","compilingTsSpinner","compilingDuration","restart","reload","isWatching","isReloading","watcher","chokidar","ignoreInitial","usePolling","ignored","dirs","static","public","strings","joinBy","info","close","destroy"],"mappings":"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"}