{"record":{"id":"71f270846c56a78b","repo":"quasarframework/quasar","slug":"app-product-name-cannot-start-with-a-number-pleas","errorCode":null,"errorMessage":"App product name cannot start with a number. Please change the \"productName\" prop in your /package.json then try again.","messagePattern":"App product name cannot start with a number\\. Please change the \"productName\" prop in your /package\\.json then try again\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app-vite/lib/modes/cordova/cordova-installation.js","lineNumber":52,"sourceCode":"      )\n      warn()\n      process.exit(1)\n    }\n\n    if (target) {\n      await ensureModeDeps('cordova', ctx)\n      await addPlatform(appPaths, target)\n    } else if (silent !== true) {\n      warn('Cordova support detected already. Aborting.')\n    }\n\n    return\n  }\n\n  const appName = appPkg.productName || appPkg.name || 'Quasar App'\n\n  if (/^[0-9]/.test(appName)) {\n    warn(\n      'App product name cannot start with a number. ' +\n        'Please change the \"productName\" prop in your /package.json then try again.'\n    )\n    return\n  }\n\n  const promptSession = await createPromptSession('Installing Cordova Mode...')\n\n  const answer = {\n    appId: await resolvePromptAnswer({\n      promptSession,\n      value: appId,\n      validate: val => {\n        if (!val) return 'The app id cannot be empty'\n      },\n      fallback: defaultAppId,\n      fallbackNote: `Using \"${defaultAppId}\" as the app id.`,\n      question: () =>","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/quasarframework/quasar/blob/4841521b5f635a971eb9e2710e5542efd194691b/app-vite/lib/modes/cordova/cordova-installation.js#L34-L70","documentation":"Cordova/iOS app identifiers and display names can't safely start with a digit, so before scaffolding Cordova mode Quasar validates the app name (productName, falling back to package.json name). A name starting with [0-9] aborts the add with this warning.","triggerScenarios":"addMode in cordova-installation.js: /^[0-9]/.test(appName) is true where appName = appPkg.productName || appPkg.name || 'Quasar App', when running quasar mode add cordova.","commonSituations":"package.json \"name\" like \"4cast-app\" or \"3dviewer\" without a productName set; productName accidentally numeric after a rename; auto-generated npm packages with digit-leading names.","solutions":["Add or change \"productName\" in your /package.json to a name starting with a letter (productName overrides name for display purposes).","If you can't change productName, rename the package \"name\" field to start with a letter before running quasar mode add cordova.","Remember productName is also used in capacitor/electron modes — keep it a valid app display name (letters first, no leading digits)."],"exampleFix":"// package.json — before\n{ \"name\": \"4cast-app\" }\n// after\n{ \"name\": \"4cast-app\", \"productName\": \"Forecast App\" }","handlingStrategy":"validation","validationCode":"const pkg = require(process.cwd() + '/package.json');\nconst appName = pkg.productName || pkg.name || '';\nif (/^[0-9]/.test(appName)) {\n  throw new Error(`productName \"${appName}\" starts with a digit — fix /package.json before quasar mode add cordova`);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always set an explicit productName in package.json that starts with a letter.","Validate package.json name/productName in CI before running mode-add commands.","Keep the npm `name` lowercase/URL-safe and the productName human-friendly, both letter-initial."],"tags":["cordova","naming","validation","package-json"],"backgroundTag":"invalid-product-name","analyzedSha":"4841521b5f635a971eb9e2710e5542efd194691b","analyzedAt":"2026-08-30T01:13:14.944Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}