{"record":{"id":"62aed8c650f9945b","repo":"denoland/deno","slug":"prefix-linter-plugin-name-must-be-a-string","errorCode":null,"errorMessage":"${prefix}Linter plugin name must be a string","messagePattern":"(.+?)Linter plugin name must be a string","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/js/40_lint.js","lineNumber":486,"sourceCode":"  return plugins.map((plugin, i) => installPlugin(plugin, specifiers?.[i]));\n}\n\n/**\n * @param {Deno.lint.Plugin} plugin\n * @param {string} [specifier] The specifier the plugin was loaded from, if any.\n */\nfunction installPlugin(plugin, specifier) {\n  // When the plugin was loaded from a specifier (i.e. `lint.plugins` in the\n  // config), prefix validation errors with it so the user knows which plugin\n  // is misbehaving instead of getting an anonymous error.\n  const prefix = typeof specifier === \"string\"\n    ? `Failed to load lint plugin '${specifier}': `\n    : \"\";\n  if (typeof plugin !== \"object\") {\n    throw new Error(`${prefix}Linter plugin must be an object`);\n  }\n  if (typeof plugin.name !== \"string\") {\n    throw new Error(`${prefix}Linter plugin name must be a string`);\n  }\n  if (!/^[a-z-]+$/.test(plugin.name)) {\n    throw new Error(\n      `${prefix}Linter plugin name must only contain lowercase letters (a-z) or hyphens (-).`,\n    );\n  }\n  if (plugin.name.startsWith(\"-\") || plugin.name.endsWith(\"-\")) {\n    throw new Error(\n      `${prefix}Linter plugin name must start and end with a lowercase letter.`,\n    );\n  }\n  if (plugin.name.includes(\"--\")) {\n    throw new Error(\n      `${prefix}Linter plugin name must not have consequtive hyphens.`,\n    );\n  }\n  if (typeof plugin.rules !== \"object\") {\n    throw new Error(`${prefix}Linter plugin rules must be an object`);","sourceCodeStart":468,"sourceCodeEnd":504,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/cli/js/40_lint.js#L468-L504","documentation":"During bundle-identifier rewriting on macOS, each helper application's Info.plist is read to derive a new `CFBundleIdentifier` from the existing value's `helper` suffix. This error means a helper plist is missing that key entirely (or holds a non-string value), so no new id can be computed.","triggerScenarios":"Helper Info.plist files that were manually edited, stripped, or replaced in the bundle; or a laufey archive revision whose helper plists renamed/removed the key (version skew with this Deno).","commonSituations":"Users customizing generated app bundles (renaming helpers, minifying plists); a backend archive from a newer laufey than the Deno build expects.","solutions":["Restore the original helper Info.plist by rebuilding or re-downloading the bundle (clear the laufey cache)","If you edited plists yourself, re-add `CFBundleIdentifier` with the original value","Update Deno / clear the cache if the shipped archive is the likely cause","Report a bug if untouched, freshly downloaded bundles trigger it"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const dict = parsePlist(await Deno.readTextFile(helperPlistPath));\nif (typeof dict['CFBundleIdentifier'] !== 'string') {\n  throw new Error('helper plist lacks CFBundleIdentifier — rebuild or re-download the bundle');\n}","typeGuard":"interface HelperPlist { CFBundleIdentifier?: string }\nfunction hasBundleId(p: HelperPlist): p is HelperPlist & { CFBundleIdentifier: string } {\n  return typeof p.CFBundleIdentifier === 'string' && p.CFBundleIdentifier.length > 0;\n}","tryCatchPattern":null,"preventionTips":["Do not hand-edit generated helper Info.plist files; keep originals backed up","After regenerating bundles, verify every helper plist still has CFBundleIdentifier","Keep Deno updated so plist expectations match the shipped laufey archives"],"tags":["desktop","macos","plist","bundle","code-signing"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}