@strapi/strapi 5.47.0 → 5.48.0

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.
Files changed (46) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/develop.d.ts.map +1 -1
  3. package/dist/cli/utils/data-transfer.d.ts.map +1 -1
  4. package/dist/node/build.d.ts +7 -1
  5. package/dist/node/build.d.ts.map +1 -1
  6. package/dist/node/core/dependencies.d.ts +35 -13
  7. package/dist/node/core/dependencies.d.ts.map +1 -1
  8. package/dist/node/core/ensure-admin-dependencies.d.ts +25 -0
  9. package/dist/node/core/ensure-admin-dependencies.d.ts.map +1 -0
  10. package/dist/node/develop.d.ts +7 -1
  11. package/dist/node/develop.d.ts.map +1 -1
  12. package/dist/package.json.js +1 -1
  13. package/dist/package.json.mjs +1 -1
  14. package/dist/src/cli/commands/build.js +1 -1
  15. package/dist/src/cli/commands/build.js.map +1 -1
  16. package/dist/src/cli/commands/build.mjs +1 -1
  17. package/dist/src/cli/commands/build.mjs.map +1 -1
  18. package/dist/src/cli/commands/develop.js +1 -1
  19. package/dist/src/cli/commands/develop.js.map +1 -1
  20. package/dist/src/cli/commands/develop.mjs +1 -1
  21. package/dist/src/cli/commands/develop.mjs.map +1 -1
  22. package/dist/src/cli/utils/data-transfer.js +7 -2
  23. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  24. package/dist/src/cli/utils/data-transfer.mjs +7 -2
  25. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  26. package/dist/src/node/build.js +6 -8
  27. package/dist/src/node/build.js.map +1 -1
  28. package/dist/src/node/build.mjs +6 -8
  29. package/dist/src/node/build.mjs.map +1 -1
  30. package/dist/src/node/core/dependencies.js +136 -103
  31. package/dist/src/node/core/dependencies.js.map +1 -1
  32. package/dist/src/node/core/dependencies.mjs +126 -103
  33. package/dist/src/node/core/dependencies.mjs.map +1 -1
  34. package/dist/src/node/core/ensure-admin-dependencies.js +70 -0
  35. package/dist/src/node/core/ensure-admin-dependencies.js.map +1 -0
  36. package/dist/src/node/core/ensure-admin-dependencies.mjs +67 -0
  37. package/dist/src/node/core/ensure-admin-dependencies.mjs.map +1 -0
  38. package/dist/src/node/create-build-context.js +1 -1
  39. package/dist/src/node/create-build-context.js.map +1 -1
  40. package/dist/src/node/create-build-context.mjs +1 -1
  41. package/dist/src/node/create-build-context.mjs.map +1 -1
  42. package/dist/src/node/develop.js +36 -46
  43. package/dist/src/node/develop.js.map +1 -1
  44. package/dist/src/node/develop.mjs +36 -27
  45. package/dist/src/node/develop.mjs.map +1 -1
  46. package/package.json +22 -22
@@ -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
- var dependencies = require('./core/dependencies.js');
6
+ var ensureAdminDependencies = require('./core/ensure-admin-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
@@ -61,17 +53,15 @@ const cleanupDistDirectory = async ({ tsconfig, logger, timer: timer$1 })=>{
61
53
  cleaningSpinner.text = `Cleaning dist dir (${timer.prettyTime(generatingDuration)})`;
62
54
  cleaningSpinner?.succeed();
63
55
  };
64
- const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin, ...options })=>{
56
+ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin, installDeps = true, ...options })=>{
65
57
  const timer$1 = timer.getTimer();
66
58
  if (cluster.isPrimary) {
67
- const { didInstall } = await dependencies.checkRequiredDependencies({
59
+ const shouldContinue = await ensureAdminDependencies.handleAdminDependencies({
68
60
  cwd,
69
- logger
70
- }).catch((err)=>{
71
- logger.error(err.message);
72
- process.exit(1);
61
+ logger,
62
+ installIfMissing: installDeps
73
63
  });
74
- if (didInstall) {
64
+ if (!shouldContinue) {
75
65
  return;
76
66
  }
77
67
  if (tsconfig?.config) {
@@ -82,7 +72,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
82
72
  timer: timer$1
83
73
  });
84
74
  try {
85
- await tsUtils__namespace.compile(cwd, {
75
+ await tsUtils().compile(cwd, {
86
76
  configOptions: {
87
77
  ignoreDiagnostics: true
88
78
  }
@@ -100,7 +90,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
100
90
  timer$1.start('createBuildContext');
101
91
  const contextSpinner = logger.spinner(`Building build context`).start();
102
92
  console.log('');
103
- const ctx = await createBuildContext.createBuildContext({
93
+ const ctx = await buildCtx().createBuildContext({
104
94
  cwd,
105
95
  logger,
106
96
  tsconfig,
@@ -111,7 +101,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
111
101
  contextSpinner.succeed();
112
102
  timer$1.start('creatingAdmin');
113
103
  const adminSpinner = logger.spinner(`Creating admin`).start();
114
- await staticFiles.writeStaticClientFiles(ctx);
104
+ await staticFs().writeStaticClientFiles(ctx);
115
105
  if (ctx.bundler === 'webpack') {
116
106
  const { build: buildWebpack } = await Promise.resolve().then(function () { return require('./webpack/build.js'); });
117
107
  await buildWebpack(ctx);
@@ -135,7 +125,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
135
125
  logger,
136
126
  timer: timer$1
137
127
  });
138
- await tsUtils__namespace.compile(cwd, {
128
+ await tsUtils().compile(cwd, {
139
129
  configOptions: {
140
130
  ignoreDiagnostics: true
141
131
  }
@@ -168,7 +158,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
168
158
  if (cluster.isWorker) {
169
159
  timer$1.start('loadStrapi');
170
160
  const loadStrapiSpinner = logger.spinner(`Loading Strapi`).start();
171
- const strapi = core.createStrapi({
161
+ const strapi = core().createStrapi({
172
162
  appDir: cwd,
173
163
  distDir: tsconfig?.config.options.outDir ?? '',
174
164
  autoReload: true,
@@ -194,7 +184,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
194
184
  if (watchAdmin) {
195
185
  timer$1.start('createBuildContext');
196
186
  contextSpinner.start();
197
- const ctx = await createBuildContext.createBuildContext({
187
+ const ctx = await buildCtx().createBuildContext({
198
188
  cwd,
199
189
  logger,
200
190
  strapi,
@@ -206,7 +196,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
206
196
  contextSpinner.succeed();
207
197
  timer$1.start('creatingAdmin');
208
198
  adminSpinner.start();
209
- await staticFiles.writeStaticClientFiles(ctx);
199
+ await staticFs().writeStaticClientFiles(ctx);
210
200
  if (ctx.bundler === 'webpack') {
211
201
  const { watch: watchWebpack } = await Promise.resolve().then(function () { return require('./webpack/watch.js'); });
212
202
  bundleWatcher = await watchWebpack(ctx);
@@ -226,7 +216,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
226
216
  if (tsconfig?.config || strapi.config.get('typescript.autogenerate') !== false) {
227
217
  timer$1.start('generatingTS');
228
218
  generatingTsSpinner.start();
229
- await tsUtils__namespace.generators.generate({
219
+ await tsUtils().generators.generate({
230
220
  strapi: strapiInstance,
231
221
  pwd: cwd,
232
222
  rootDir: undefined,
@@ -251,7 +241,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
251
241
  logger,
252
242
  timer: timer$1
253
243
  });
254
- await tsUtils__namespace.compile(cwd, {
244
+ await tsUtils().compile(cwd, {
255
245
  configOptions: {
256
246
  ignoreDiagnostics: false
257
247
  }
@@ -292,7 +282,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
292
282
  strapiInstance.reload();
293
283
  }
294
284
  };
295
- const watcher = chokidar.watch(cwd, {
285
+ const watcher = chokidar().watch(cwd, {
296
286
  ignoreInitial: true,
297
287
  usePolling: polling,
298
288
  ignored: [
@@ -317,7 +307,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
317
307
  '**/public',
318
308
  '**/public/**',
319
309
  strapiInstance.dirs.static.public,
320
- utils.strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
310
+ utils().strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
321
311
  '**/*.db*',
322
312
  '**/exports/**',
323
313
  '**/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 { handleAdminDependencies } from './core/ensure-admin-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 * Auto-install missing admin dependencies\n *\n * @default true\n */\n installDeps?: 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 installDeps = true,\n ...options\n}: DevelopOptions) => {\n const timer = getTimer();\n\n if (cluster.isPrimary) {\n const shouldContinue = await handleAdminDependencies({\n cwd,\n logger,\n installIfMissing: installDeps,\n });\n\n if (!shouldContinue) {\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","installDeps","getTimer","cluster","isPrimary","shouldContinue","handleAdminDependencies","installIfMissing","compile","configOptions","ignoreDiagnostics","error","message","contextSpinner","console","log","ctx","createBuildContext","contextDuration","adminSpinner","writeStaticClientFiles","bundler","build","buildWebpack","buildVite","adminDuration","on","worker","Error","String","process","exit","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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"}
@@ -1,15 +1,26 @@
1
- import * as tsUtils from '@strapi/typescript-utils';
2
- import { strings } from '@strapi/utils';
3
- import chokidar from 'chokidar';
4
1
  import fs from 'node:fs/promises';
5
2
  import path from 'node:path';
6
3
  import cluster from 'node:cluster';
7
- import { createStrapi } from '@strapi/core';
8
- import { checkRequiredDependencies } from './core/dependencies.mjs';
4
+ import { handleAdminDependencies } from './core/ensure-admin-dependencies.mjs';
9
5
  import { prettyTime, getTimer } from './core/timer.mjs';
10
- import { createBuildContext } from './create-build-context.mjs';
11
- import { writeStaticClientFiles } from './staticFiles.mjs';
12
6
 
7
+ // Lazy: worker-only deps; primary cluster process should not pay for them
8
+ const lazy = (spec)=>{
9
+ let cached;
10
+ return ()=>{
11
+ if (cached === undefined) {
12
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
13
+ cached = require(spec);
14
+ }
15
+ return cached;
16
+ };
17
+ };
18
+ const tsUtils = lazy('@strapi/typescript-utils');
19
+ const utils = lazy('@strapi/utils');
20
+ const chokidar = lazy('chokidar');
21
+ const core = lazy('@strapi/core');
22
+ const buildCtx = lazy('./create-build-context');
23
+ const staticFs = lazy('./staticFiles');
13
24
  // This method removes all non-admin build files from the dist directory
14
25
  const cleanupDistDirectory = async ({ tsconfig, logger, timer })=>{
15
26
  const distDir = tsconfig?.config?.options?.outDir;
@@ -23,8 +34,8 @@ const cleanupDistDirectory = async ({ tsconfig, logger, timer })=>{
23
34
  const cleaningSpinner = logger.spinner(`Cleaning dist dir ${distDir}`).start();
24
35
  try {
25
36
  const dirContent = await fs.readdir(distDir);
26
- const validFilenames = dirContent// Ignore the admin build folder
27
- .filter((filename)=>filename !== 'build');
37
+ const validFilenames = dirContent// Ignore the admin build folder and the TypeScript incremental cache
38
+ .filter((filename)=>filename !== 'build' && !filename.endsWith('.tsbuildinfo'));
28
39
  for (const filename of validFilenames){
29
40
  await fs.rm(path.resolve(distDir, filename), {
30
41
  recursive: true
@@ -40,17 +51,15 @@ const cleanupDistDirectory = async ({ tsconfig, logger, timer })=>{
40
51
  cleaningSpinner.text = `Cleaning dist dir (${prettyTime(generatingDuration)})`;
41
52
  cleaningSpinner?.succeed();
42
53
  };
43
- const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin, ...options })=>{
54
+ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin, installDeps = true, ...options })=>{
44
55
  const timer = getTimer();
45
56
  if (cluster.isPrimary) {
46
- const { didInstall } = await checkRequiredDependencies({
57
+ const shouldContinue = await handleAdminDependencies({
47
58
  cwd,
48
- logger
49
- }).catch((err)=>{
50
- logger.error(err.message);
51
- process.exit(1);
59
+ logger,
60
+ installIfMissing: installDeps
52
61
  });
53
- if (didInstall) {
62
+ if (!shouldContinue) {
54
63
  return;
55
64
  }
56
65
  if (tsconfig?.config) {
@@ -61,7 +70,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
61
70
  timer
62
71
  });
63
72
  try {
64
- await tsUtils.compile(cwd, {
73
+ await tsUtils().compile(cwd, {
65
74
  configOptions: {
66
75
  ignoreDiagnostics: true
67
76
  }
@@ -79,7 +88,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
79
88
  timer.start('createBuildContext');
80
89
  const contextSpinner = logger.spinner(`Building build context`).start();
81
90
  console.log('');
82
- const ctx = await createBuildContext({
91
+ const ctx = await buildCtx().createBuildContext({
83
92
  cwd,
84
93
  logger,
85
94
  tsconfig,
@@ -90,7 +99,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
90
99
  contextSpinner.succeed();
91
100
  timer.start('creatingAdmin');
92
101
  const adminSpinner = logger.spinner(`Creating admin`).start();
93
- await writeStaticClientFiles(ctx);
102
+ await staticFs().writeStaticClientFiles(ctx);
94
103
  if (ctx.bundler === 'webpack') {
95
104
  const { build: buildWebpack } = await import('./webpack/build.mjs');
96
105
  await buildWebpack(ctx);
@@ -114,7 +123,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
114
123
  logger,
115
124
  timer
116
125
  });
117
- await tsUtils.compile(cwd, {
126
+ await tsUtils().compile(cwd, {
118
127
  configOptions: {
119
128
  ignoreDiagnostics: true
120
129
  }
@@ -147,7 +156,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
147
156
  if (cluster.isWorker) {
148
157
  timer.start('loadStrapi');
149
158
  const loadStrapiSpinner = logger.spinner(`Loading Strapi`).start();
150
- const strapi = createStrapi({
159
+ const strapi = core().createStrapi({
151
160
  appDir: cwd,
152
161
  distDir: tsconfig?.config.options.outDir ?? '',
153
162
  autoReload: true,
@@ -173,7 +182,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
173
182
  if (watchAdmin) {
174
183
  timer.start('createBuildContext');
175
184
  contextSpinner.start();
176
- const ctx = await createBuildContext({
185
+ const ctx = await buildCtx().createBuildContext({
177
186
  cwd,
178
187
  logger,
179
188
  strapi,
@@ -185,7 +194,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
185
194
  contextSpinner.succeed();
186
195
  timer.start('creatingAdmin');
187
196
  adminSpinner.start();
188
- await writeStaticClientFiles(ctx);
197
+ await staticFs().writeStaticClientFiles(ctx);
189
198
  if (ctx.bundler === 'webpack') {
190
199
  const { watch: watchWebpack } = await import('./webpack/watch.mjs');
191
200
  bundleWatcher = await watchWebpack(ctx);
@@ -205,7 +214,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
205
214
  if (tsconfig?.config || strapi.config.get('typescript.autogenerate') !== false) {
206
215
  timer.start('generatingTS');
207
216
  generatingTsSpinner.start();
208
- await tsUtils.generators.generate({
217
+ await tsUtils().generators.generate({
209
218
  strapi: strapiInstance,
210
219
  pwd: cwd,
211
220
  rootDir: undefined,
@@ -230,7 +239,7 @@ const develop = async ({ cwd, polling, logger, tsconfig, watchAdmin, buildAdmin,
230
239
  logger,
231
240
  timer
232
241
  });
233
- await tsUtils.compile(cwd, {
242
+ await tsUtils().compile(cwd, {
234
243
  configOptions: {
235
244
  ignoreDiagnostics: false
236
245
  }
@@ -271,7 +280,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
271
280
  strapiInstance.reload();
272
281
  }
273
282
  };
274
- const watcher = chokidar.watch(cwd, {
283
+ const watcher = chokidar().watch(cwd, {
275
284
  ignoreInitial: true,
276
285
  usePolling: polling,
277
286
  ignored: [
@@ -296,7 +305,7 @@ function startWatcher(strapiInstance, cwd, polling, logger, bundleWatcher) {
296
305
  '**/public',
297
306
  '**/public/**',
298
307
  strapiInstance.dirs.static.public,
299
- strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
308
+ utils().strings.joinBy('/', strapiInstance.dirs.static.public, '**'),
300
309
  '**/*.db*',
301
310
  '**/exports/**',
302
311
  '**/dist/**',