@strapi/strapi 5.46.1 → 5.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,33 @@
1
1
  import os from 'node:os';
2
2
  import fs from 'node:fs/promises';
3
3
  import path from 'node:path';
4
+ import crypto from 'node:crypto';
4
5
  import semver from 'semver';
5
6
  import resolveFrom from 'resolve-from';
6
7
  import execa from 'execa';
7
8
  import readPkgUp from 'read-pkg-up';
8
9
  import { getPackageManager } from './managers.mjs';
9
10
 
11
+ const CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');
12
+ const hashPackageJson = async (cwd)=>{
13
+ try {
14
+ const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');
15
+ return crypto.createHash('sha1').update(content).digest('hex');
16
+ } catch {
17
+ return null;
18
+ }
19
+ };
20
+ const readCachedHash = (cwd)=>fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(()=>null);
21
+ const writeCachedHash = async (cwd, hash)=>{
22
+ try {
23
+ await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), {
24
+ recursive: true
25
+ });
26
+ await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');
27
+ } catch {
28
+ // best-effort cache write — silently ignore
29
+ }
30
+ };
10
31
  /**
11
32
  * From V5 this will be imported from the package.json of `@strapi/strapi`.
12
33
  */ const PEER_DEPS = {
@@ -33,6 +54,18 @@ import { getPackageManager } from './managers.mjs';
33
54
  didInstall: false
34
55
  };
35
56
  }
57
+ // Hash-cache: skip the full check when package.json hasn't changed since
58
+ // the last successful pass. The cache lives under node_modules so it's
59
+ // already gitignored and disposable (a `yarn install` wipe re-runs it).
60
+ const currentHash = await hashPackageJson(cwd);
61
+ if (currentHash) {
62
+ const cachedHash = await readCachedHash(cwd);
63
+ if (cachedHash === currentHash) {
64
+ return {
65
+ didInstall: false
66
+ };
67
+ }
68
+ }
36
69
  const pkg = await readPkgUp({
37
70
  cwd
38
71
  });
@@ -120,6 +153,9 @@ import { getPackageManager } from './managers.mjs';
120
153
  throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);
121
154
  }
122
155
  }
156
+ if (currentHash) {
157
+ await writeCachedHash(cwd, currentHash);
158
+ }
123
159
  return {
124
160
  didInstall: false
125
161
  };
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.mjs","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\nimport type { BuildOptions } from '../build';\nimport { getPackageManager } from './managers';\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n};\n\ninterface CheckRequiredDependenciesResult {\n didInstall: boolean;\n}\n\ninterface DepToInstall {\n name: string;\n wantedVersion: string;\n declaredVersion?: never;\n}\n\n/**\n * Checks the user's project that it has declared and installed the required dependencies\n * needed by the Strapi admin project. Whilst generally speaking most modules will be\n * declared by the actual packages there are some packages where you only really want one of\n * and thus they are declared as peer dependencies – react / styled-components / etc.\n *\n * If these deps are not installed or declared, then we prompt the user to correct this. In\n * V4 this is not a hard requirement, but in V5 it will be. Might as well get people started now.\n */\nconst checkRequiredDependencies = async ({\n cwd,\n logger,\n}: Pick<BuildOptions, 'cwd' | 'logger'>): Promise<CheckRequiredDependenciesResult> => {\n /**\n * This enables us to use experimental deps for libraries like\n * react or styled-components. This is useful for testing against.\n */\n if (process.env.USE_EXPERIMENTAL_DEPENDENCIES === 'true') {\n logger.warn('You are using experimental dependencies that may not be compatible with Strapi.');\n return { didInstall: false };\n }\n\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n interface DepToReview {\n name: string;\n wantedVersion: string;\n declaredVersion: string;\n }\n\n /**\n * Run through each of the peer deps and figure out if they need to be\n * installed or they need their version checked against.\n */\n const { install, review } = Object.entries(PEER_DEPS).reduce<{\n install: DepToInstall[];\n review: DepToReview[];\n }>(\n (acc, [name, version]) => {\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n const declaredVersion =\n pkg.packageJson.dependencies[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n acc.install.push({\n name,\n wantedVersion: version,\n });\n } else {\n acc.review.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return acc;\n },\n {\n install: [],\n review: [],\n }\n );\n\n if (install.length > 0) {\n logger.info(\n 'The Strapi admin needs to install the following dependencies:',\n os.EOL,\n install.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n\n await installDependencies(install, {\n cwd,\n logger,\n });\n\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n return { didInstall: true };\n }\n\n if (review.length) {\n const errors: string[] = [];\n\n for (const dep of review) {\n // The version specified in package.json could be incorrect, eg `foo`\n let minDeclaredVersion: SemVer | null = null;\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n /**\n * The delcared version should be semver compatible with our required version\n * of the dependency. If it's not, we should advise the user to change it.\n */\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n /**\n * TODO: when we know the packageManager we can advise the actual install command.\n */\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n }\n\n return { didInstall: false };\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nconst installDependencies = async (\n install: DepToInstall[],\n { cwd, logger }: Pick<BuildOptions, 'cwd' | 'logger'>\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = install.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nexport { checkRequiredDependencies, getModule };\nexport type { CheckRequiredDependenciesResult, PackageJson };\n"],"names":["PEER_DEPS","react","checkRequiredDependencies","cwd","logger","process","env","USE_EXPERIMENTAL_DEPENDENCIES","warn","didInstall","pkg","readPkgUp","Error","debug","os","EOL","packageJson","install","review","Object","entries","reduce","acc","name","version","dependencies","declaredVersion","devDependencies","push","wantedVersion","length","info","map","join","installDependencies","file","args","argv","execa","stdio","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","installedVersion","getModuleVersion","NODE_ENV","getModule","modulePackagePath","resolveFrom","silent","path","fs","readFile","then","res","JSON","parse","packageManager","getPackageManager","error","exit","execOptions","encoding","packages","result","npmArgs","yarnArgs","pnpmArgs","exitCode","failed"],"mappings":"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"}
1
+ {"version":3,"file":"dependencies.mjs","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\nimport type { BuildOptions } from '../build';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n try {\n const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n return crypto.createHash('sha1').update(content).digest('hex');\n } catch {\n return null;\n }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n try {\n await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n } catch {\n // best-effort cache write — silently ignore\n }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst PEER_DEPS = {\n react: '^18.0.0',\n 'react-dom': '^18.0.0',\n 'react-router-dom': '^6.0.0',\n 'styled-components': '^6.0.0',\n};\n\ninterface CheckRequiredDependenciesResult {\n didInstall: boolean;\n}\n\ninterface DepToInstall {\n name: string;\n wantedVersion: string;\n declaredVersion?: never;\n}\n\n/**\n * Checks the user's project that it has declared and installed the required dependencies\n * needed by the Strapi admin project. Whilst generally speaking most modules will be\n * declared by the actual packages there are some packages where you only really want one of\n * and thus they are declared as peer dependencies – react / styled-components / etc.\n *\n * If these deps are not installed or declared, then we prompt the user to correct this. In\n * V4 this is not a hard requirement, but in V5 it will be. Might as well get people started now.\n */\nconst checkRequiredDependencies = async ({\n cwd,\n logger,\n}: Pick<BuildOptions, 'cwd' | 'logger'>): Promise<CheckRequiredDependenciesResult> => {\n /**\n * This enables us to use experimental deps for libraries like\n * react or styled-components. This is useful for testing against.\n */\n if (process.env.USE_EXPERIMENTAL_DEPENDENCIES === 'true') {\n logger.warn('You are using experimental dependencies that may not be compatible with Strapi.');\n return { didInstall: false };\n }\n\n // Hash-cache: skip the full check when package.json hasn't changed since\n // the last successful pass. The cache lives under node_modules so it's\n // already gitignored and disposable (a `yarn install` wipe re-runs it).\n const currentHash = await hashPackageJson(cwd);\n if (currentHash) {\n const cachedHash = await readCachedHash(cwd);\n if (cachedHash === currentHash) {\n return { didInstall: false };\n }\n }\n\n const pkg = await readPkgUp({ cwd });\n\n if (!pkg) {\n throw new Error(`Could not find package.json at path: ${cwd}`);\n }\n\n logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n interface DepToReview {\n name: string;\n wantedVersion: string;\n declaredVersion: string;\n }\n\n /**\n * Run through each of the peer deps and figure out if they need to be\n * installed or they need their version checked against.\n */\n const { install, review } = Object.entries(PEER_DEPS).reduce<{\n install: DepToInstall[];\n review: DepToReview[];\n }>(\n (acc, [name, version]) => {\n if (!pkg.packageJson.dependencies) {\n throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n }\n\n const declaredVersion =\n pkg.packageJson.dependencies[name] ?? pkg.packageJson.devDependencies?.[name];\n\n if (!declaredVersion) {\n acc.install.push({\n name,\n wantedVersion: version,\n });\n } else {\n acc.review.push({\n name,\n wantedVersion: version,\n declaredVersion,\n });\n }\n\n return acc;\n },\n {\n install: [],\n review: [],\n }\n );\n\n if (install.length > 0) {\n logger.info(\n 'The Strapi admin needs to install the following dependencies:',\n os.EOL,\n install.map(({ name, wantedVersion }) => ` - ${name}@${wantedVersion}`).join(os.EOL)\n );\n\n await installDependencies(install, {\n cwd,\n logger,\n });\n\n const [file, ...args] = process.argv;\n\n /**\n * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n * not be the same and could break installations. It's not the best solution, but it works.\n */\n await execa(file, args, { cwd, stdio: 'inherit' });\n return { didInstall: true };\n }\n\n if (review.length) {\n const errors: string[] = [];\n\n for (const dep of review) {\n // The version specified in package.json could be incorrect, eg `foo`\n let minDeclaredVersion: SemVer | null = null;\n try {\n minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n } catch (err) {\n // Intentional fall-through (variable will be left as null, throwing below)\n }\n\n if (!minDeclaredVersion) {\n errors.push(\n `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n );\n } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n /**\n * The delcared version should be semver compatible with our required version\n * of the dependency. If it's not, we should advise the user to change it.\n */\n logger.warn(\n [\n `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n\n const installedVersion = await getModuleVersion(dep.name, cwd);\n\n if (!installedVersion) {\n /**\n * TODO: when we know the packageManager we can advise the actual install command.\n */\n errors.push(\n `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n );\n } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n logger.warn(\n [\n `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n 'You may experience issues, we recommend you change this.',\n ].join(os.EOL)\n );\n }\n }\n\n if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n }\n }\n\n if (currentHash) {\n await writeCachedHash(cwd, currentHash);\n }\n\n return { didInstall: false };\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n if (!modulePackagePath) {\n return null;\n }\n const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n const pkg = await getModule(name, cwd);\n\n return pkg?.version || null;\n};\n\nconst installDependencies = async (\n install: DepToInstall[],\n { cwd, logger }: Pick<BuildOptions, 'cwd' | 'logger'>\n) => {\n const packageManager = getPackageManager();\n\n if (!packageManager) {\n logger.error(\n 'Could not find a supported package manager, please install the dependencies manually.'\n );\n process.exit(1);\n }\n\n const execOptions: CommonOptions<'utf8'> = {\n encoding: 'utf8',\n cwd,\n stdio: 'inherit',\n };\n\n const packages = install.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n let result: ExecaReturnValue<string> | undefined;\n\n if (packageManager === 'npm') {\n const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n result = await execa('npm', npmArgs, execOptions);\n } else if (packageManager === 'yarn') {\n const yarnArgs = ['add', ...packages];\n logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n result = await execa('yarn', yarnArgs, execOptions);\n } else if (packageManager === 'pnpm') {\n const pnpmArgs = ['add', '--save-prod', ...packages];\n logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n result = await execa('pnpm', pnpmArgs, execOptions);\n }\n\n if (result?.exitCode || result?.failed) {\n throw new Error('Package installation failed');\n }\n};\n\nexport { checkRequiredDependencies, getModule };\nexport type { CheckRequiredDependenciesResult, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","PEER_DEPS","react","checkRequiredDependencies","logger","process","env","USE_EXPERIMENTAL_DEPENDENCIES","warn","didInstall","currentHash","cachedHash","pkg","readPkgUp","Error","debug","os","EOL","packageJson","install","review","Object","entries","reduce","acc","name","version","dependencies","declaredVersion","devDependencies","push","wantedVersion","length","info","map","installDependencies","file","args","argv","execa","stdio","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","installedVersion","getModuleVersion","NODE_ENV","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse","packageManager","getPackageManager","error","exit","execOptions","encoding","packages","result","npmArgs","yarnArgs","pnpmArgs","exitCode","failed"],"mappings":"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"}
@@ -47,7 +47,7 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {}
47
47
  });
48
48
  const envKeys = Object.keys(env$1);
49
49
  if (envKeys.length > 0) {
50
- logger.info([
50
+ logger.debug([
51
51
  'Including the following ENV variables as part of the JS bundle:',
52
52
  ...envKeys.map((key)=>` - ${key}`)
53
53
  ].join(os.EOL));
@@ -1 +1 @@
1
- {"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\nimport type { Server } from 'node:http';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n hmrServer?: Server;\n hmrClientPort?: number;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.info(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","envKeys","Object","keys","length","info","map","key","join","os","EOL","distPath","path","dist","relative","debug","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
1
+ {"version":3,"file":"create-build-context.js","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\nimport type { Server } from 'node:http';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n hmrServer?: Server;\n hmrClientPort?: number;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","envKeys","Object","keys","length","debug","map","key","join","os","EOL","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
@@ -45,7 +45,7 @@ const createBuildContext = async ({ cwd, logger, tsconfig, strapi, options = {}
45
45
  });
46
46
  const envKeys = Object.keys(env);
47
47
  if (envKeys.length > 0) {
48
- logger.info([
48
+ logger.debug([
49
49
  'Including the following ENV variables as part of the JS bundle:',
50
50
  ...envKeys.map((key)=>` - ${key}`)
51
51
  ].join(os.EOL));
@@ -1 +1 @@
1
- {"version":3,"file":"create-build-context.mjs","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\nimport type { Server } from 'node:http';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n hmrServer?: Server;\n hmrClientPort?: number;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.info(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","envKeys","Object","keys","length","info","map","key","join","os","EOL","distPath","path","dist","relative","debug","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
1
+ {"version":3,"file":"create-build-context.mjs","sources":["../../../src/node/create-build-context.ts"],"sourcesContent":["import os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport browserslist from 'browserslist';\nimport { createStrapi } from '@strapi/core';\nimport type { Core, Modules } from '@strapi/types';\nimport type { Server } from 'node:http';\n\nimport type { CLIContext } from '../cli/types';\nimport { getStrapiAdminEnvVars, loadEnv } from './core/env';\n\nimport { PluginMeta, getEnabledPlugins, getMapOfPluginsWithAdmin } from './core/plugins';\nimport { AppFile, loadUserAppFile } from './core/admin-customisations';\nimport type { BaseContext } from './types';\n\ninterface BaseOptions {\n stats?: boolean;\n minify?: boolean;\n sourcemaps?: boolean;\n bundler?: 'webpack' | 'vite';\n open?: boolean;\n hmrServer?: Server;\n hmrClientPort?: number;\n}\n\ninterface BuildContext<TOptions = unknown> extends BaseContext {\n /**\n * The customisations defined by the user in their app.js file\n */\n customisations?: AppFile;\n /**\n * Features object with future flags\n */\n features?: Modules.Features.FeaturesService['config'];\n /**\n * The build options\n */\n options: BaseOptions & TOptions;\n /**\n * The plugins to be included in the JS bundle\n * incl. internal plugins, third party plugins & local plugins\n */\n plugins: PluginMeta[];\n}\n\ninterface CreateBuildContextArgs<TOptions = unknown> extends CLIContext {\n strapi?: Core.Strapi;\n options?: TOptions;\n}\n\nconst DEFAULT_BROWSERSLIST = [\n 'last 3 major versions',\n 'Firefox ESR',\n 'last 2 Opera versions',\n 'not dead',\n];\n\nconst createBuildContext = async <TOptions extends BaseOptions>({\n cwd,\n logger,\n tsconfig,\n strapi,\n options = {} as TOptions,\n}: CreateBuildContextArgs<TOptions>): Promise<BuildContext<TOptions>> => {\n /**\n * If you make a new strapi instance when one already exists,\n * you will overwrite the global and the app will _most likely_\n * crash and die.\n */\n const strapiInstance =\n strapi ??\n createStrapi({\n // Directories\n appDir: cwd,\n distDir: tsconfig?.config.options.outDir ?? '',\n // Options\n autoReload: true,\n serveAdminPanel: false,\n });\n\n const serverAbsoluteUrl = strapiInstance.config.get<string>('server.absoluteUrl');\n const adminAbsoluteUrl = strapiInstance.config.get<string>('admin.absoluteUrl');\n const adminPath = strapiInstance.config.get<string>('admin.path');\n\n // NOTE: Checks that both the server and admin will be served from the same origin (protocol, host, port)\n const sameOrigin = new URL(adminAbsoluteUrl).origin === new URL(serverAbsoluteUrl).origin;\n\n const adminPublicPath = new URL(adminAbsoluteUrl).pathname;\n const serverPublicPath = new URL(serverAbsoluteUrl).pathname;\n\n const appDir = strapiInstance.dirs.app.root;\n\n await loadEnv(cwd);\n\n const env = getStrapiAdminEnvVars({\n ADMIN_PATH: adminPublicPath,\n STRAPI_ADMIN_BACKEND_URL: sameOrigin ? serverPublicPath : serverAbsoluteUrl,\n STRAPI_TELEMETRY_DISABLED: String(strapiInstance.telemetry.isDisabled),\n // TODO: Get this url from a utility/consts rather than duplicating it in AIChat constants.ts\n STRAPI_AI_URL:\n process.env.STRAPI_AI_URL?.replace(/\\/+$/, '') ?? 'https://strapi-ai.apps.strapi.io',\n STRAPI_ANALYTICS_URL: process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io',\n });\n\n const envKeys = Object.keys(env);\n\n if (envKeys.length > 0) {\n logger.debug(\n [\n 'Including the following ENV variables as part of the JS bundle:',\n ...envKeys.map((key) => ` - ${key}`),\n ].join(os.EOL)\n );\n }\n\n const distPath = path.join(strapiInstance.dirs.dist.root, 'build');\n const distDir = path.relative(cwd, distPath);\n\n /**\n * If the distPath already exists, clean it\n */\n try {\n logger.debug(`Cleaning dist folder: ${distPath}`);\n await fs.rm(distPath, { recursive: true, force: true });\n logger.debug('Cleaned dist folder');\n } catch {\n // do nothing, it will fail if the folder does not exist\n logger.debug('There was no dist folder to clean');\n }\n\n const runtimeDir = path.join(cwd, '.strapi', 'client');\n const entry = path.relative(cwd, path.join(runtimeDir, 'app.js'));\n\n const plugins = await getEnabledPlugins({ cwd, logger, runtimeDir, strapi: strapiInstance });\n\n logger.debug('Enabled plugins', os.EOL, plugins);\n\n const pluginsWithFront = getMapOfPluginsWithAdmin(plugins);\n\n logger.debug('Enabled plugins with FE', os.EOL, pluginsWithFront);\n\n const target = browserslist.loadConfig({ path: cwd }) ?? DEFAULT_BROWSERSLIST;\n\n const customisations = await loadUserAppFile({ appDir, runtimeDir });\n\n const features = strapiInstance.config.get('features', undefined);\n\n const { bundler = 'vite', ...restOptions } = options;\n\n const buildContext = {\n appDir,\n adminPath,\n basePath: adminPublicPath,\n bundler,\n customisations,\n cwd,\n distDir,\n distPath,\n entry,\n env,\n features,\n logger,\n options: restOptions as BaseOptions & TOptions,\n plugins: pluginsWithFront,\n runtimeDir,\n strapi: strapiInstance,\n target,\n tsconfig,\n } satisfies BuildContext<TOptions>;\n\n return buildContext;\n};\n\nexport { createBuildContext };\nexport type { BuildContext, CreateBuildContextArgs };\n"],"names":["DEFAULT_BROWSERSLIST","createBuildContext","cwd","logger","tsconfig","strapi","options","strapiInstance","createStrapi","appDir","distDir","config","outDir","autoReload","serveAdminPanel","serverAbsoluteUrl","get","adminAbsoluteUrl","adminPath","sameOrigin","URL","origin","adminPublicPath","pathname","serverPublicPath","dirs","app","root","loadEnv","env","getStrapiAdminEnvVars","ADMIN_PATH","STRAPI_ADMIN_BACKEND_URL","STRAPI_TELEMETRY_DISABLED","String","telemetry","isDisabled","STRAPI_AI_URL","process","replace","STRAPI_ANALYTICS_URL","envKeys","Object","keys","length","debug","map","key","join","os","EOL","distPath","path","dist","relative","fs","rm","recursive","force","runtimeDir","entry","plugins","getEnabledPlugins","pluginsWithFront","getMapOfPluginsWithAdmin","target","browserslist","loadConfig","customisations","loadUserAppFile","features","undefined","bundler","restOptions","buildContext","basePath"],"mappings":"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"}
@@ -1,36 +1,28 @@
1
1
  'use strict';
2
2
 
3
- var tsUtils = require('@strapi/typescript-utils');
4
- var utils = require('@strapi/utils');
5
- var chokidar = require('chokidar');
6
3
  var fs = require('node:fs/promises');
7
4
  var path = require('node:path');
8
5
  var cluster = require('node:cluster');
9
- var core = require('@strapi/core');
10
6
  var dependencies = require('./core/dependencies.js');
11
7
  var timer = require('./core/timer.js');
12
- var createBuildContext = require('./create-build-context.js');
13
- var staticFiles = require('./staticFiles.js');
14
-
15
- function _interopNamespaceDefault(e) {
16
- var n = Object.create(null);
17
- if (e) {
18
- Object.keys(e).forEach(function (k) {
19
- if (k !== 'default') {
20
- var d = Object.getOwnPropertyDescriptor(e, k);
21
- Object.defineProperty(n, k, d.get ? d : {
22
- enumerable: true,
23
- get: function () { return e[k]; }
24
- });
25
- }
26
- });
27
- }
28
- n.default = e;
29
- return Object.freeze(n);
30
- }
31
-
32
- var tsUtils__namespace = /*#__PURE__*/_interopNamespaceDefault(tsUtils);
33
8
 
9
+ // Lazy: worker-only deps; primary cluster process should not pay for them
10
+ const lazy = (spec)=>{
11
+ let cached;
12
+ return ()=>{
13
+ if (cached === undefined) {
14
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
15
+ cached = require(spec);
16
+ }
17
+ return cached;
18
+ };
19
+ };
20
+ const tsUtils = lazy('@strapi/typescript-utils');
21
+ const utils = lazy('@strapi/utils');
22
+ const chokidar = lazy('chokidar');
23
+ const core = lazy('@strapi/core');
24
+ const buildCtx = lazy('./create-build-context');
25
+ const staticFs = lazy('./staticFiles');
34
26
  // This method removes all non-admin build files from the dist directory
35
27
  const cleanupDistDirectory = async ({ tsconfig, logger, timer: timer$1 })=>{
36
28
  const distDir = tsconfig?.config?.options?.outDir;
@@ -44,8 +36,8 @@ const cleanupDistDirectory = async ({ tsconfig, logger, timer: timer$1 })=>{
44
36
  const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start();
45
37
  try {
46
38
  const dirContent = await fs.readdir(distDir);
47
- const validFilenames = dirContent// Ignore the admin build folder
48
- .filter((filename)=>filename !== 'build');
39
+ const validFilenames = dirContent// Ignore the admin build folder and the TypeScript incremental cache
40
+ .filter((filename)=>filename !== 'build' && !filename.endsWith('.tsbuildinfo'));
49
41
  for (const filename of validFilenames){
50
42
  await fs.rm(path.resolve(distDir, filename), {
51
43
  recursive: true
@@ -82,7 +74,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
82
74
  timer: timer$1
83
75
  });
84
76
  try {
85
- await tsUtils__namespace.compile(cwd, {
77
+ await tsUtils().compile(cwd, {
86
78
  configOptions: {
87
79
  ignoreDiagnostics: true
88
80
  }
@@ -100,7 +92,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
100
92
  timer$1.start('createBuildContext');
101
93
  const contextSpinner = logger.spinner(`Building build context`).start();
102
94
  console.log('');
103
- const ctx = await createBuildContext.createBuildContext({
95
+ const ctx = await buildCtx().createBuildContext({
104
96
  cwd,
105
97
  logger,
106
98
  tsconfig,
@@ -111,7 +103,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
111
103
  contextSpinner.succeed();
112
104
  timer$1.start('creatingAdmin');
113
105
  const adminSpinner = logger.spinner(`Creating admin`).start();
114
- await staticFiles.writeStaticClientFiles(ctx);
106
+ await staticFs().writeStaticClientFiles(ctx);
115
107
  if (ctx.bundler === 'webpack') {
116
108
  const { build: buildWebpack } = await Promise.resolve().then(function () { return require('./webpack/build.js'); });
117
109
  await buildWebpack(ctx);
@@ -135,7 +127,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
135
127
  logger,
136
128
  timer: timer$1
137
129
  });
138
- await tsUtils__namespace.compile(cwd, {
130
+ await tsUtils().compile(cwd, {
139
131
  configOptions: {
140
132
  ignoreDiagnostics: true
141
133
  }
@@ -168,7 +160,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
168
160
  if (cluster.isWorker) {
169
161
  timer$1.start('loadStrapi');
170
162
  const loadStrapiSpinner = logger.spinner(`Loading Strapi`).start();
171
- const strapi = core.createStrapi({
163
+ const strapi = core().createStrapi({
172
164
  appDir: cwd,
173
165
  distDir: tsconfig?.config.options.outDir ?? '',
174
166
  autoReload: true,
@@ -194,7 +186,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
194
186
  if (watchAdmin) {
195
187
  timer$1.start('createBuildContext');
196
188
  contextSpinner.start();
197
- const ctx = await createBuildContext.createBuildContext({
189
+ const ctx = await buildCtx().createBuildContext({
198
190
  cwd,
199
191
  logger,
200
192
  strapi,
@@ -206,7 +198,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
206
198
  contextSpinner.succeed();
207
199
  timer$1.start('creatingAdmin');
208
200
  adminSpinner.start();
209
- await staticFiles.writeStaticClientFiles(ctx);
201
+ await staticFs().writeStaticClientFiles(ctx);
210
202
  if (ctx.bundler === 'webpack') {
211
203
  const { watch: watchWebpack } = await Promise.resolve().then(function () { return require('./webpack/watch.js'); });
212
204
  bundleWatcher = await watchWebpack(ctx);
@@ -226,7 +218,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
226
218
  if (tsconfig?.config || strapi.config.get('typescript.autogenerate') !== false) {
227
219
  timer$1.start('generatingTS');
228
220
  generatingTsSpinner.start();
229
- await tsUtils__namespace.generators.generate({
221
+ await tsUtils().generators.generate({
230
222
  strapi: strapiInstance,
231
223
  pwd: cwd,
232
224
  rootDir: undefined,
@@ -251,7 +243,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
251
243
  logger,
252
244
  timer: timer$1
253
245
  });
254
- await tsUtils__namespace.compile(cwd, {
246
+ await tsUtils().compile(cwd, {
255
247
  configOptions: {
256
248
  ignoreDiagnostics: false
257
249
  }
@@ -292,7 +284,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
292
284
  strapiInstance.reload();
293
285
  }
294
286
  };
295
- const watcher = chokidar.watch(cwd, {
287
+ const watcher = chokidar().watch(cwd, {
296
288
  ignoreInitial: true,
297
289
  usePolling: polling,
298
290
  ignored: [
@@ -317,7 +309,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
317
309
  '**/public',
318
310
  '**/public/**',
319
311
  strapiInstance.dirs.static.public,
320
- utils.strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
312
+ utils().strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
321
313
  '**/*.db*',
322
314
  '**/exports/**',
323
315
  '**/dist/**',
@@ -1 +1 @@
1
- {"version":3,"file":"develop.js","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';\nimport { Logger } from '../cli/utils/logger';\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 buildAdmin?: 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 buildAdmin,\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 try {\n await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n } catch (err: unknown) {\n logger.error(`Error during initial TypeScript compilation: ${(err as Error).message}`);\n // We don't return here because we want to attempt to start the server even if the initial compilation fails, as it can be fixed while the server is running\n }\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 && buildAdmin) {\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 try {\n // Build without diagnostics in case schemas have changed\n await cleanupDistDirectory({ tsconfig, logger, timer });\n await tsUtils.compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`Error during TypeScript compilation on reload: ${message}`);\n process.exit(1);\n }\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 const contextSpinner = logger.spinner(`Building build context`);\n const adminSpinner = logger.spinner(`Creating admin`);\n const generatingTsSpinner = logger.spinner(`Generating types`);\n const compilingTsSpinner = logger.spinner(`Compiling TS`);\n\n let watcherStarted = false;\n const ensureWatcher = () => {\n if (!watcherStarted) {\n watcherStarted = true;\n startWatcher(strapiInstance, cwd, polling ?? false, logger, bundleWatcher);\n }\n };\n\n try {\n if (watchAdmin) {\n timer.start('createBuildContext');\n contextSpinner.start();\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 adminSpinner.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 generatingTsSpinner.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 compilingTsSpinner.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 ensureWatcher();\n\n strapiInstance.start();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`Error during development: ${message}`);\n\n if (loadStrapiSpinner.isSpinning) {\n loadStrapiSpinner.fail();\n }\n // Fail any spinners that were left running.\n if (contextSpinner.isSpinning) {\n contextSpinner.fail();\n }\n if (compilingTsSpinner.isSpinning) {\n compilingTsSpinner.fail();\n }\n if (adminSpinner.isSpinning) {\n adminSpinner.fail();\n }\n if (generatingTsSpinner.isSpinning) {\n generatingTsSpinner.fail();\n }\n\n ensureWatcher();\n }\n }\n};\n\nfunction startWatcher(\n strapiInstance: Awaited<ReturnType<typeof createStrapi>>,\n cwd: string,\n polling: boolean,\n logger: Logger,\n bundleWatcher?: WebpackWatcher | ViteWatcher\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\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","buildAdmin","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","Error","String","debug","send","fork","isWorker","loadStrapiSpinner","strapi","createStrapi","appDir","autoReload","serveAdminPanel","bundleWatcher","strapiInstance","load","generatingTsSpinner","compilingTsSpinner","watcherStarted","ensureWatcher","startWatcher","watch","watchWebpack","watchVite","loadStrapiDuration","get","generators","generate","pwd","rootDir","undefined","silent","artifacts","contentTypes","components","compilingDuration","isSpinning","restart","reload","isWatching","isReloading","watcher","chokidar","ignoreInitial","usePolling","ignored","dirs","static","public","strings","joinBy","info","close","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"develop.js","sources":["../../../src/node/develop.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport cluster from 'node:cluster';\n\nimport type chokidarType from 'chokidar';\nimport type { createStrapi as CreateStrapi } from '@strapi/core';\nimport type { CLIContext } from '../cli/types';\nimport { checkRequiredDependencies } from './core/dependencies';\nimport { getTimer, prettyTime, type TimeMeasurer } from './core/timer';\nimport type { WebpackWatcher } from './webpack/watch';\nimport type { ViteWatcher } from './vite/watch';\nimport type { Logger } from '../cli/utils/logger';\n\n// Lazy: worker-only deps; primary cluster process should not pay for them\nconst lazy = <T>(spec: string): (() => T) => {\n let cached: T | undefined;\n return (): T => {\n if (cached === undefined) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n cached = require(spec);\n }\n return cached as T;\n };\n};\nconst tsUtils = lazy<typeof import('@strapi/typescript-utils')>('@strapi/typescript-utils');\nconst utils = lazy<typeof import('@strapi/utils')>('@strapi/utils');\nconst chokidar = lazy<typeof chokidarType>('chokidar');\nconst core = lazy<typeof import('@strapi/core')>('@strapi/core');\nconst buildCtx = lazy<typeof import('./create-build-context')>('./create-build-context');\nconst staticFs = lazy<typeof import('./staticFiles')>('./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 buildAdmin?: 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 and the TypeScript incremental cache\n .filter((filename) => filename !== 'build' && !filename.endsWith('.tsbuildinfo'));\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 buildAdmin,\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 try {\n await tsUtils().compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n } catch (err: unknown) {\n logger.error(`Error during initial TypeScript compilation: ${(err as Error).message}`);\n // We don't return here because we want to attempt to start the server even if the initial compilation fails, as it can be fixed while the server is running\n }\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 && buildAdmin) {\n timer.start('createBuildContext');\n const contextSpinner = logger.spinner(`Building build context`).start();\n console.log('');\n\n const ctx = await buildCtx().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 staticFs().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 try {\n // Build without diagnostics in case schemas have changed\n await cleanupDistDirectory({ tsconfig, logger, timer });\n await tsUtils().compile(cwd, { configOptions: { ignoreDiagnostics: true } });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`Error during TypeScript compilation on reload: ${message}`);\n process.exit(1);\n }\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 = core().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 const contextSpinner = logger.spinner(`Building build context`);\n const adminSpinner = logger.spinner(`Creating admin`);\n const generatingTsSpinner = logger.spinner(`Generating types`);\n const compilingTsSpinner = logger.spinner(`Compiling TS`);\n\n let watcherStarted = false;\n const ensureWatcher = () => {\n if (!watcherStarted) {\n watcherStarted = true;\n startWatcher(strapiInstance, cwd, polling ?? false, logger, bundleWatcher);\n }\n };\n\n try {\n if (watchAdmin) {\n timer.start('createBuildContext');\n contextSpinner.start();\n\n const ctx = await buildCtx().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 adminSpinner.start();\n\n await staticFs().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 generatingTsSpinner.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 compilingTsSpinner.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 ensureWatcher();\n\n strapiInstance.start();\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(`Error during development: ${message}`);\n\n if (loadStrapiSpinner.isSpinning) {\n loadStrapiSpinner.fail();\n }\n // Fail any spinners that were left running.\n if (contextSpinner.isSpinning) {\n contextSpinner.fail();\n }\n if (compilingTsSpinner.isSpinning) {\n compilingTsSpinner.fail();\n }\n if (adminSpinner.isSpinning) {\n adminSpinner.fail();\n }\n if (generatingTsSpinner.isSpinning) {\n generatingTsSpinner.fail();\n }\n\n ensureWatcher();\n }\n }\n};\n\nfunction startWatcher(\n strapiInstance: Awaited<ReturnType<typeof CreateStrapi>>,\n cwd: string,\n polling: boolean,\n logger: Logger,\n bundleWatcher?: WebpackWatcher | ViteWatcher\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 utils().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\nexport { develop };\nexport type { DevelopOptions };\n"],"names":["lazy","spec","cached","undefined","require","tsUtils","utils","chokidar","core","buildCtx","staticFs","cleanupDistDirectory","tsconfig","logger","timer","distDir","config","options","outDir","fs","access","then","catch","timerName","Date","now","start","cleaningSpinner","spinner","dirContent","readdir","validFilenames","filter","filename","endsWith","rm","path","resolve","recursive","err","generatingDuration","end","text","prettyTime","fail","succeed","develop","cwd","polling","watchAdmin","buildAdmin","getTimer","cluster","isPrimary","didInstall","checkRequiredDependencies","error","message","process","exit","compile","configOptions","ignoreDiagnostics","contextSpinner","console","log","ctx","createBuildContext","contextDuration","adminSpinner","writeStaticClientFiles","bundler","build","buildWebpack","buildVite","adminDuration","on","worker","Error","String","debug","send","fork","isWorker","loadStrapiSpinner","strapi","createStrapi","appDir","autoReload","serveAdminPanel","bundleWatcher","strapiInstance","load","generatingTsSpinner","compilingTsSpinner","watcherStarted","ensureWatcher","startWatcher","watch","watchWebpack","watchVite","loadStrapiDuration","get","generators","generate","pwd","rootDir","silent","artifacts","contentTypes","components","compilingDuration","isSpinning","restart","reload","isWatching","isReloading","watcher","ignoreInitial","usePolling","ignored","dirs","static","public","strings","joinBy","info","close","destroy"],"mappings":"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"}