{"record":{"id":"b5d7edccc4439e20","repo":"quasarframework/quasar","slug":"render-cannot-locate-templatepath-skipping","errorCode":null,"errorMessage":"render() - cannot locate ${templatePath}. Skipping...","messagePattern":"render\\(\\) - cannot locate (.+?)\\. Skipping\\.\\.\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"app-vite/lib/app-extension/api-classes/InstallAPI.js","lineNumber":252,"sourceCode":"        warn()\n      }\n    }\n  }\n\n  /**\n   * Render a folder from extension templates into devland.\n   * Needs a path (to a folder) relative to the path of the file where render() is called\n   *\n   * @param {string} templatePath (relative path to folder to render in app)\n   * @param {object} scope (optional; rendering scope variables)\n   */\n  render(templatePath, scope) {\n    const dir = getCallerPath(1)\n    const source = path.resolve(dir, templatePath)\n    const rawCopy = !scope || Object.keys(scope).length === 0\n\n    if (!fs.existsSync(source)) {\n      this.logger.warn(`render() - cannot locate ${templatePath}. Skipping...`)\n      return\n    }\n    if (!fs.lstatSync(source).isDirectory()) {\n      this.logger.warn(\n        `render() - \"${templatePath}\" is a file instead of folder. Skipping...`\n      )\n      return\n    }\n\n    this.#hooks.renderFolders.push({\n      source,\n      rawCopy,\n      scope\n    })\n  }\n\n  /**\n   * Render a file from extension template into devland","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/quasarframework/quasar/blob/4841521b5f635a971eb9e2710e5542efd194691b/app-vite/lib/app-extension/api-classes/InstallAPI.js#L234-L270","documentation":"api.render(templatePath, scope) copies a template FOLDER from the extension into the app. This warning means the resolved path (relative to the file calling render()) does not exist on disk, so the render is skipped. Paths are resolved against the caller's directory, not the app root or extension package root.","triggerScenarios":"api.render('src/template', scope) where path.resolve(getCallerPath(), templatePath) doesn't exist — typo in the folder name, template folder missing from the published extension package, or path given as app-relative instead of caller-relative.","commonSituations":"Extension published without the template folder (missing from package.json files list / npmignore), renamed template directory, or author assuming paths resolve from the extension root instead of the install-script file location.","solutions":["Fix the templatePath so it is relative to the file that calls api.render() (use './'-style relative paths).","Verify the template folder exists in the installed extension under node_modules and is included in the package files.","If the extension is yours, add the template folder to package.json 'files' and republish.","Re-run 'quasar ext' after fixing; check the resolved location with getCallerPath semantics."],"exampleFix":"// before: assumes app-root-relative path\napi.render('src/quasar/templates', { someVar: 1 })\n// after: relative to the install script file\napi.render('./template', { someVar: 1 })","handlingStrategy":"validation","validationCode":"const fs = require('fs');\nconst path = require('path');\nconst src = path.resolve(__dirname, templatePath);\nif (!fs.existsSync(src)) throw new Error(`template folder missing: ${src}`);\nif (!fs.statSync(src).isDirectory()) throw new Error(`not a folder: ${src}`);\napi.render(templatePath, scope);","typeGuard":"function isTemplateFolder(baseDir, p) {\n  const fs = require('fs');\n  const full = require('path').resolve(baseDir, p);\n  return fs.existsSync(full) && fs.statSync(full).isDirectory();\n}","tryCatchPattern":null,"preventionTips":["Always pass paths relative to the file calling api.render(), not the app root.","Include template folders in package.json 'files' before publishing an extension.","Test the extension install in a fresh app before publishing."],"tags":["app-extension","render","missing-file","path-resolution"],"backgroundTag":"missing-template-path","analyzedSha":"4841521b5f635a971eb9e2710e5542efd194691b","analyzedAt":"2026-08-30T01:13:14.944Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}