affaan-m/ECC · error

No install profile, module IDs, included components, or…

Error message

No install profile, module IDs, included components, or legacy languages were provided

What it means

normalizeInstallRequest requires at least one selection to know what to install. When the caller neither selected a manifest base (profile/modules/with/without/exclusions) nor any legacy languages, and did not pass --help, there is nothing actionable, so the request is rejected.

Solutions

  1. Provide an install profile, e.g. --profile standard.
  2. Provide module IDs via --modules.
  3. Provide legacy language arguments if using the legacy syntax.
  4. Pass --help to see available options instead of attempting an empty install.

Example fix

// before
await request({})
// after
await request({ profile: 'standard' })
Defensive patterns

Strategy: validation

Validate before calling

const hasSelection = Boolean(opts.profile) || (opts.modules?.length > 0) || (opts.with?.length > 0) || (opts.without?.length > 0) || (opts.languages?.length > 0)
if (!opts.help && !hasSelection) throw new Error('Provide a profile, modules, components, or legacy languages')

Type guard

function hasInstallSelection(opts) {
  return Boolean(opts?.help) || Boolean(opts?.profile) ||
    (Array.isArray(opts?.modules) && opts.modules.length > 0) ||
    (Array.isArray(opts?.languages) && opts.languages.length > 0)
}

Try / catch

try {
  const req = normalizeInstallRequest(options)
} catch (err) {
  if (err.message.startsWith('No install profile')) {
    console.error('Nothing to install: pass --profile, --modules, or language args (see --help)')
  } else throw err
}

Prevention

When it happens

Trigger: Calling normalizeInstallRequest (or request()) with an options object that has no profile, no module IDs, no included/excluded component IDs, no legacy languages, and options.help is falsy.

Common situations: Running the install CLI with no arguments; programmatically building an empty options object; a script where all flags were conditionally dropped (e.g. empty variable expansion) leaving no selections.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/64a80d6735c12b3e. Report an issue: GitHub.

Appendix: source

Thrown at scripts/lib/install/request.js:147

  const hookConsent = resolveHookConsentFlags(options);
  if (hookConsent === 'declined' && moduleIds.includes('hooks-runtime')) {
    throw new Error('--no-hooks cannot be combined with an explicit hooks-runtime module selection');
  }
  const hasManifestBaseSelection = Boolean(profileId) || moduleIds.length > 0 || includeComponentIds.length > 0;
  const hasNonLocaleManifestSelection = Boolean(profileId)
    || moduleIds.length > 0
    || requestedIncludeComponentIds.length > 0
    || excludeComponentIds.length > 0;
  const usingManifestMode = hasManifestBaseSelection || excludeComponentIds.length > 0;

  if (hasNonLocaleManifestSelection && legacyLanguages.length > 0) {
    throw new Error(
      'Legacy language arguments cannot be combined with --profile, --modules, --with, --without, or manifest config selections'
    );
  }

  if (!options.help && !hasManifestBaseSelection && legacyLanguages.length === 0) {
    throw new Error('No install profile, module IDs, included components, or legacy languages were provided');
  }

  return {
    mode: legacyLanguages.length > 0
      ? 'legacy-compat'
      : (usingManifestMode ? 'manifest' : 'legacy-compat'),
    target,
    profileId,
    moduleIds,
    includeComponentIds,
    excludeComponentIds,
    legacyLanguages,
    hookConsent,
    configPath: config?.path || options.configPath || null,
  };
}

module.exports = {

View on GitHub (pinned to 8321021c54)