appsmithorg/appsmith · warning · Error

Unable to generate a unique accessor

Error message

Unable to generate a unique accessor

What it means

Thrown as a plain Error('Unable to generate a unique accessor') by generateUniqueAccessor. After deriving a validVar (the URL's filename with non-alphabetic chars replaced by '_' and trailing underscores stripped), the function tries validVar, then validVar_1 ... validVar_100 against takenAccessors and takenNamesMap. If all 101 candidates are taken, it gives up. In practice this is nearly unreachable: it requires 100+ libraries whose derived names collide to exactly the same validVar.

Source

Thrown at app/client/src/workers/Evaluation/handlers/jsLibrary.ts:418

    return validVar;
  }

  let index = 0;

  /**
   * If the accessor is already taken, generate a unique name by appending an index to the accessor.
   * The index is incremented until a unique name is found.
   * 100 is a very large number and this loop should never run more than a few times.
   */
  while (index++ < 100) {
    const name = `${validVar}_${index}`;

    if (!takenAccessors.includes(name) && !takenNamesMap.hasOwnProperty(name)) {
      return name;
    }
  }

  throw new Error("Unable to generate a unique accessor");
}

// TODO: Fix this the next time the file is edited
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function flattenModule(module: Record<string, any>) {
  const keys = Object.keys(module);

  // If there are no keys other than default, return default.
  if (keys.length === 1 && keys[0] === "default") return module.default;

  // If there are keys other than default, return a new object with all the keys
  // and set its prototype of default export.
  const libModule = Object.create(module.default || {});

  for (const key of Object.keys(module)) {
    if (key === "default") continue;

    libModule[key] = module[key];

View on GitHub (pinned to 8cd9021c24)

Solutions

  1. Reduce the number of installed libraries that share the same derived name; remove duplicates.
  2. Install from URLs whose path produces a distinct alphabetic name (distinct package/path segments).
  3. If reproducing consistently, report it: the 100-cap is a safety ceiling, not expected behavior, and indicates a name-deriation collision worth fixing upstream.

Example fix

// before (many libs collapse to the same accessor)
https://cdn.jsdelivr.net/npm/x@1/+esm
https://cdn.jsdelivr.net/npm/x@2/+esm
... (100+ times)

// after
keep only the one version actually used:
https://cdn.jsdelivr.net/npm/x@2.0.0/+esm
Defensive patterns

Strategy: validation

Validate before calling

// Before installing, ensure the derived accessor name is unique enough.
function derivedAccessor(url) {
  let name = url;
  try { name = new URL(url).pathname.split('/').pop() ?? url; } catch {}
  return name.replace(/[^a-zA-Z]/g, '_').replace(/_+$/, '');
}
// warn if many installed URLs collapse to the same derivedAccessor

Type guard

const isUniqueAccessor = (url, taken) => {
  let name = url;
  try { name = new URL(url).pathname.split('/').pop() ?? url; } catch {}
  const v = name.replace(/[^a-zA-Z]/g, '_').replace(/_+$/, '');
  return v && !taken.has(v);
};

Try / catch

try {
  await installLibrary(url);
} catch (e) {
  if (/unique accessor/i.test(e?.message ?? '')) {
    showToast('Accessor collision. Remove duplicate libraries or pick a distinct URL.');
  } else throw e;
}

Prevention

When it happens

Trigger: Installing a very large number of libraries whose URLs all collapse to the same valid variable name (e.g. dozens of '+esm' URLs from the same package path, or many URLs whose only alphabetic residue is identical); an accessor namespace already saturated by data-tree entity names.

Common situations: Programmatic/bulk import of many similarly-named modules; a naming pattern (all-numeric or all-symbol URLs) that reduces to a near-empty validVar like '_'.

Related errors


AI-assisted analysis of appsmithorg/appsmith@8cd9021c24 (2026-08-12). Data as JSON: /api/errors/4adb0a8d524768e9. Report an issue: GitHub.