{"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  });\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","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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"}