UNPKG

@sap/generator-fiori

Version:

Create an SAPUI5 application using SAP Fiori elements or a freestyle approach

9 lines 111 kB
const __esmImportMetaUrl = require('node:url').pathToFileURL(__filename).href; var li=Object.create;var Pe=Object.defineProperty;var pi=Object.getOwnPropertyDescriptor;var ui=Object.getOwnPropertyNames;var fi=Object.getPrototypeOf,di=Object.prototype.hasOwnProperty;var c=(t,e)=>Pe(t,"name",{value:e,configurable:!0});var Vr=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(r){throw e=0,r}},hi=(t,e)=>{for(var r in e)Pe(t,r,{get:e[r],enumerable:!0})},Jr=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of ui(e))!di.call(t,i)&&i!==r&&Pe(t,i,{get:()=>e[i],enumerable:!(n=pi(e,i))||n.enumerable});return t};var _t=(t,e,r)=>(r=t!=null?li(fi(t)):{},Jr(e||!t||!t.__esModule?Pe(r,"default",{value:t,enumerable:!0}):r,t)),gi=t=>Jr(Pe({},"__esModule",{value:!0}),t);var zr=Vr((Po,Dr)=>{"use strict";var mi=Symbol.for("indent"),yi=Symbol.for("newline"),wi=` `,bi=" ",Ei=/^\uFEFF/,xi=/^\s*[{[]((?:\r?\n)+)([\s\t]*)/,Ci=/^(?:\{\}|\[\])((?:\r?\n)+)?$/,qr=/^Unexpected token '?(.)'?(,)? /i,vi=c(t=>{let e=t.charCodeAt(0).toString(16).toUpperCase();return`0x${e.length%2?"0":""}${e}`},"hexify"),Yr=c(t=>String(t).replace(Ei,""),"stripBOM"),$t=c((t,e,r=0)=>({message:`${t} while parsing ${e}`,position:r}),"makeParsedError"),Ai=c((t,e,r=20)=>{let n=t.message;if(!e)return $t(n,"empty string");let i=n.match(qr),s=n.match(/ position\s+(\d+)/i);i&&(n=n.replace(qr,`Unexpected token ${JSON.stringify(i[1])} (${vi(i[1])})$2 `));let o;if(s?o=+s[1]:n.match(/^Unexpected end of JSON.*/i)&&(o=e.length-1),o==null)return $t(n,`'${e.slice(0,r*2)}'`);let a=o<=r?0:o-r,l=o+r>=e.length?e.length:o+r,u=`${a?"...":""}${e.slice(a,l)}${l===e.length?"":"..."}`;return $t(n,`${e===u?"":"near "}${JSON.stringify(u)}`,o)},"parseError"),et=class extends SyntaxError{static{c(this,"JSONParseError")}constructor(e,r,n,i){let s=Ai(e,r,n);super(s.message),Object.assign(this,s),this.code="EJSONPARSE",this.systemError=e,Error.captureStackTrace(this,i||this.constructor)}get name(){return this.constructor.name}set name(e){}get[Symbol.toStringTag](){return this.constructor.name}},Hr=c((t,e)=>{let r=JSON.parse(t,e);if(r&&typeof r=="object"){let n=t.match(Ci)||t.match(xi)||[null,"",""];r[yi]=n[1]??wi,r[mi]=n[2]??bi}return r},"parseJson"),tt=c((t,e,r)=>{let n=Yr(t);try{return Hr(n,e)}catch(i){if(typeof t!="string"&&!Buffer.isBuffer(t)){let s=Array.isArray(t)&&t.length===0?"an empty array":String(t);throw Object.assign(new TypeError(`Cannot parse ${s}`),{code:"EJSONPARSE",systemError:i})}throw new et(i,n,r,tt)}},"parseJsonError");Dr.exports=tt;tt.JSONParseError=et;tt.noExceptions=(t,e)=>{try{return Hr(Yr(t),e)}catch{}}});var Kr=Vr((Mo,Zr)=>{var Si=require("events").EventEmitter,Ni=require("fs"),nt=require("path");Zr.exports=Pi;function Pi(t,e){e=e||{};var r=!!e.followSymlinks,n=e.fs||Ni,i=new Si,s=!1,o=0,a={};return i.stop=f,u(t),i;function l(g,x){m(),n.readdir(g,function(v,C){if(!s){if(v){h(v,g),b();return}C.forEach(function(ee){var fe=nt.join(g,ee),de=x&&nt.join(x,ee);u(fe,de)}),b()}})}c(l,"recursiveReadDir");function u(g,x){m(),n.lstat(g,function(v,C){if(s)return;if(v){h(v,g),b();return}i.emit("path",g,C,x);var ee=!1;if(C.isDirectory()){if(a[g]){v=new Error("file system loop detected"),v.code="ELOOP",h(v,g),b();return}a[g]=!0,i.emit("directory",g,C,fe,x),ee||l(g,x)}else C.isFile()?a[g]||(a[g]=!0,i.emit("file",g,C,x)):C.isSymbolicLink()&&(i.emit("link",g,C,x),r&&p(g));b();function fe(){ee=!0}c(fe,"stopDir")})}c(u,"walkPath");function p(g){m(),n.readlink(g,function(x,v){if(!s){if(x){h(x,g),b();return}var C=nt.resolve(nt.dirname(g),v);i.emit("readlink",g,C),u(C,g),b()}})}c(p,"recursiveReadLink");function f(){s||(s=!0,i.emit("stop"))}c(f,"stop");function h(g,x){!g||s||(g.path=x,i.emit("error",g))}c(h,"handleError");function m(){o+=1}c(m,"pendStart");function b(){if(!s){if(o-=1,o===0)i.emit("end");else if(o<0)throw new Error("pendEnd called too many times")}}c(b,"pendEnd")}c(Pi,"findit")});var Ao={};hi(Ao,{DirName:()=>z,FileName:()=>d,FioriToolsSettings:()=>Ot,MinCdsPluginUi5Version:()=>Wr,MinCdsVersion:()=>ge,ReuseLibType:()=>Ne,addPackageDevDependency:()=>Jt,checkCdsUi5PluginEnabled:()=>er,checkDependencies:()=>$r,clearCdsModuleCache:()=>Gt,createApplicationAccess:()=>dr,createProjectAccess:()=>hr,default:()=>vo,deleteCapApp:()=>Qt,execNpmCommand:()=>Z,filterDataSourcesByType:()=>tr,findAllApps:()=>se,findCapProjectRoot:()=>ie,findCapProjects:()=>Yt,findFilesByExtension:()=>G,findFioriArtifacts:()=>me,findProjectRoot:()=>$e,findRecursiveHierarchyKey:()=>kt,findRootsForPath:()=>ct,fioriToolsDirectory:()=>te,getAllUi5YamlFileNames:()=>Bt,getAppProgrammingLanguage:()=>cr,getAppRootFromWebappPath:()=>qt,getAppType:()=>wt,getCapCustomPaths:()=>V,getCapEnvironment:()=>H,getCapI18nFolderNames:()=>gt,getCapModelAndServices:()=>Re,getCapProjectType:()=>L,getCapServiceName:()=>Kt,getCdsFiles:()=>Ue,getCdsRoots:()=>Le,getCdsServices:()=>Xt,getFilePaths:()=>it,getGlobalCdsHomePath:()=>ft,getI18nBundles:()=>we,getI18nPropertiesPaths:()=>J,getMainService:()=>ye,getMinUI5VersionAsArray:()=>Et,getMinUI5VersionFromManifest:()=>bt,getMinimumUI5Version:()=>Be,getMockDataPath:()=>Wt,getMockServerConfig:()=>at,getMtaPath:()=>pr,getNodeModulesPath:()=>Me,getPathMappings:()=>ot,getProject:()=>Ee,getProjectType:()=>lr,getReuseLibs:()=>Or,getSpecification:()=>Ye,getSpecificationModuleFromCache:()=>qe,getSpecificationPath:()=>ur,getTableCapabilitiesByEntitySet:()=>Ur,getUsedEntitiesFromManifest:()=>rr,getWebappPath:()=>$,getWorkspaceInfo:()=>dt,hasDependency:()=>ne,hasMinCdsVersion:()=>ht,hasUI5CliV3:()=>yr,isCapJavaProject:()=>pt,isCapNodeJsProject:()=>lt,isCapProject:()=>zt,isUI5IdUnique:()=>_r,loadModuleFromProject:()=>U,normalizePath:()=>ke,processServices:()=>ut,readCapServiceMetadataEdmx:()=>Ve,readFlexChanges:()=>He,readUi5Yaml:()=>Oe,refreshSpecificationDistTags:()=>We,toReferenceUri:()=>Zt,updatePackageScript:()=>mr});module.exports=gi(Ao);var Br=require("node:os"),jt=require("node:path"),d={AdaptationConfig:"config.json",CapJavaApplicationYaml:"application.yaml",ExtConfigJson:".extconfig.json",IndexCds:"index.cds",Library:".library",Manifest:"manifest.json",ManifestAppDescrVar:"manifest.appdescr_variant",MtaYaml:"mta.yaml",Package:"package.json",Pom:"pom.xml",SpecificationDistTags:"specification-dist-tags.json",ServiceCds:"services.cds",Tsconfig:"tsconfig.json",Ui5Yaml:"ui5.yaml",Ui5LocalYaml:"ui5-local.yaml",Ui5MockYaml:"ui5-mock.yaml",UI5DeployYaml:"ui5-deploy.yaml",PackageLock:"package-lock.json",XSAppJson:"xs-app.json",XSSecurityJson:"xs-security.json",DotGitIgnore:".gitignore",MtaExtYaml:"mta-ext.mtaext"},z={Changes:"changes",ModuleCache:"module-cache",Schemas:".schemas",Pages:"pages",Webapp:"webapp",Temp:".tmp",LocalService:"localService",Controller:"controller",View:"view",Fragment:"fragment",Fragments:"fragments",Ext:"ext",VSCode:".vscode",AppConfig:"appconfig",Db:"db",Csv:"csv",Data:"data",Mockdata:"mockdata",Dist:"dist",Coding:"coding",Manifest:"manifest",Annotations:"annotations"},Ot={dir:".fioritools",migrationSettingsFile:"migrationSettings.json"};var te=(0,jt.join)((0,Br.homedir)(),Ot.dir),he=(0,jt.join)(te,z.ModuleCache),Wr="0.17.0",ge="6.8.2";var re=require("node:fs"),Xr=_t(zr(),1);async function j(t,e){return e?e.read(t):re.promises.readFile(t,{encoding:"utf8"})}c(j,"readFile");async function w(t,e){return e?e.readJSON(t):JSON.parse(await j(t))}c(w,"readJSON");async function X(t,e,r){return r?r.write(t,e):re.promises.writeFile(t,e,{encoding:"utf8"})}c(X,"writeFile");async function S(t,e){try{return e?e.exists(t):(await re.promises.access(t),!0)}catch{return!1}}c(S,"fileExists");async function q(t,e,r){await Gr(t,e,r)}c(q,"updatePackageJSON");async function Rt(t,e,r){await Gr(t,e,r)}c(Rt,"updateManifestJSON");async function Gr(t,e,r){let n=await j(t,r),i=(0,Xr.default)(n),o=JSON.stringify(e,null,i[Symbol.for("indent")])+` `;await X(t,o,r)}c(Gr,"updateJSON");async function Ut(t,e){return e?e.delete(t):re.promises.unlink(t)}c(Ut,"deleteFile");async function Te(t){return re.promises.readdir(t,{encoding:"utf8"})}c(Te,"readDirectory");async function rt(t,e){return e?e.delete(t):re.promises.rm(t,{recursive:!0,force:!0})}c(rt,"deleteDirectory");var N=require("node:path"),Qr=_t(Kr(),1);var Lt=require("node:fs");function Ti(t,e,r,n){let i=[],s=[],o=Object.keys(t).filter(a=>a.startsWith(n.replaceAll(N.sep,N.posix.sep))&&(e.includes((0,N.basename)(a))||r.includes((0,N.extname)(a))||e.length===0&&r.length===0));for(let a of o)t[a].state==="deleted"&&i.push((0,N.join)(a)),t[a].state==="modified"&&s.push((0,N.join)(a));return{deleted:i,modified:s}}c(Ti,"getMemFsChanges");function Ii(t,e,r,n,i,s){let o=t,a=i;if(s){let{modified:l,deleted:u}=Ti(s.dump(""),e,r,n);o=Array.from(new Set([...t,...l])).filter(f=>!u.includes(f)),a=i.filter(f=>f.code!=="ENOENT"||typeof f.path=="string"&&!l.some(h=>h.startsWith(f.path)))}return{searchResult:o,fatalErrors:a}}c(Ii,"getFindResultOnEnd");function Y(t){return new Promise((e,r)=>{let n=[],i=Array.isArray(t.fileNames)?t.fileNames:[],s=Array.isArray(t.extensionNames)?t.extensionNames:[],o=Array.isArray(t.excludeFolders)?t.excludeFolders:[],a=t.noTraversal??!1,l=[],u=(0,Qr.default)(t.root);u.on("directory",(p,f,h)=>{let m=(0,N.basename)(p);(o.includes(m)||a&&p!==t.root)&&h()}),u.on("file",p=>{(s.includes((0,N.extname)(p))||i.includes((0,N.basename)(p))||i.length===0&&s.length===0)&&n.push(p)}),u.on("end",()=>{let{searchResult:p,fatalErrors:f}=Ii(n,i,s,t.root,l,t.memFs);f.length===0?e(p):r(f)}),u.on("error",p=>{l.push(p)})})}c(Y,"findBy");async function Ie(t,e,r,n){return(await Y({fileNames:[t],root:e,excludeFolders:r,memFs:n})).map(s=>(0,N.dirname)(s))}c(Ie,"findFiles");function G(t,e,r,n,i){return Y({extensionNames:[t],root:e,excludeFolders:r,noTraversal:i,memFs:n})}c(G,"findFilesByExtension");async function _(t,e,r){let n=(0,N.join)(e,t);return await S(n,r)?n:(0,N.dirname)(e)!==e?_(t,(0,N.dirname)(e),r):void 0}c(_,"findFileUp");async function it(t){let r=(await Lt.promises.readdir(t)).map(async i=>{let s=(0,N.join)(t,i);return(await Lt.promises.stat(s)).isDirectory()?it(s):s}),n=await Promise.all(r);return[].concat(...n)}c(it,"getFilePaths");var en=require("node:fs");var Vt;function ke(t){if(process.platform==="win32"){if(Vt===void 0){let r=en.realpathSync.native("\\")[0];Vt=r===r.toUpperCase()}return(Vt?t.charAt(0).toUpperCase():t.charAt(0).toLowerCase())+t.slice(1)}return t}c(ke,"normalizePath");var yn=require("node:child_process"),E=require("node:path");var Fe=require("node:fs"),je=require("node:fs/promises"),_e=require("node:path"),nn=require("node:module");var tn=require("node:fs"),R=require("node:path");var ne=c((t,e)=>!!(t.dependencies?.[e]??t.devDependencies?.[e]),"hasDependency");function Me(t,e){if(!(0,R.isAbsolute)(t))return;let{root:r}=(0,R.parse)(t),n=t,i;for(;n!==r;){let s=(0,R.join)(n,"node_modules");if(e&&(s=(0,R.join)(s,e,d.Package)),(0,tn.existsSync)(s)){i=n;break}n=(0,R.dirname)(n)}return i}c(Me,"getNodeModulesPath");async function Jt(t,e,r,n){let i=(0,R.join)(t,d.Package),s=await w(i,n);s.devDependencies=s.devDependencies??{},s.devDependencies[e]||(s.devDependencies[e]=r),await q(i,s,n)}c(Jt,"addPackageDevDependency");var rn=require("node:child_process");async function Z(t,e){return new Promise((r,n)=>{let i=process.platform.startsWith("win"),s=i?"npm.cmd":"npm",o=i?{windowsVerbatimArguments:!0,shell:!0}:{},a=e?.logger,l=e?.cwd,u=typeof l=="string"?{...o,cwd:l}:o,p=(0,rn.spawn)(s,t,u),f="",h="";p.stdout.on("data",b=>{f+=b.toString()}),p.stderr.on("data",b=>{h+=b.toString()});let m=`${s} ${t.join(" ")}`;p.on("exit",(b,g)=>{if(b===null)a?.warn(`Command '${m}' was killed by signal: ${g}`);else if(b===0){let x=[f,h].filter(Boolean).join(` `),v=x?`: ${x}`:"";a?.info(`Command '${m}' successful${v}`)}else if(e?.throwOnError){f&&a?.info(f),n(new Error(`Command '${m}' failed with exit code ${b}. Stderr: ${h}`));return}else a?.error(`Command '${m}' not successful, stderr: ${h}`);r(f)}),p.on("error",b=>{a?.error(`Error executing npm command '${m}': ${b}`),n(b)})})}c(Z,"execNpmCommand");var sn=require("node:url");var ki=(0,nn.createRequire)(__esmImportMetaUrl);async function st(t,e){if(!Me(t,e))throw Error("Path to module not found.");return ki.resolve(e,{paths:[t]})}c(st,"getModulePath");async function U(t,e){let r;try{let n=await st(t,e);r=await import((0,sn.pathToFileURL)(n).href)}catch(n){throw Error(`Module '${e}' not installed in project '${t}'. ${n.toString()}`)}return r}c(U,"loadModuleFromProject");async function on(t,e,r){let n=r?.logger,i=(0,_e.join)(he,t,e),s=(0,_e.join)(i,d.Package),o=["install","--prefix",i,`${t}@${e}`];(0,Fe.existsSync)(s)||((0,Fe.existsSync)(i)&&await(0,je.rm)(i,{recursive:!0}),await(0,je.mkdir)(i,{recursive:!0}),await Z(o,{cwd:i,logger:n}));let a;try{a=await U(i,t)}catch{n?.error(`Failed to load module: ${t}. Attempting to fix installation.`);let u=(0,_e.join)(i,d.PackageLock),p=(0,Fe.existsSync)(u)?["ci"]:o;await Z(p,{cwd:i,logger:n}),a=await U(i,t)}return a}c(on,"getModule");async function an(t,e){let r=(0,_e.join)(he,t,e);(0,Fe.existsSync)(r)&&await(0,je.rm)(r,{recursive:!0})}c(an,"deleteModule");var y=require("node:path");var K=require("node:path"),ln=require("../../open-ux-shared/ui5-config/index.js");var cn={application:{webapp:z.Webapp},library:{src:"src",test:"test"},"theme-library":{src:"src",test:"test"},module:{}};async function Mi(t,e){let r=await _(d.Package,t,e);return r?(0,K.dirname)(r):t}c(Mi,"getBaseDir");async function $(t,e){let r;try{r=await ot(t,e)}catch{r={}}return"webapp"in r?r.webapp:(0,K.join)(t,z.Webapp)}c($,"getWebappPath");async function ot(t,e,r=d.Ui5Yaml){let n,i,s;try{n=await Oe(t,r,e),i=n.getConfiguration(),s=n.getType()}catch{throw new Error(`Could not read 'type' from ${r} in project root: ${t}`)}if(!(s in cn))throw new Error(`Unsupported project type for path mappings: ${s}`);let o=await Mi(t,e),a={},l=i?.paths||{},u=cn[s];for(let p in u){let f=l[p]??u[p];a[p]=(0,K.join)(o,f)}return a}c(ot,"getPathMappings");async function Oe(t,e,r,n){let i=(0,K.join)(t,e);if(await S(i,r)){let s=await j(i,r);return await ln.UI5Config.newInstance(s,{validateSchema:n?.validateSchema})}throw Error(`File '${e}' not found in project '${t}'`)}c(Oe,"readUi5Yaml");async function Bt(t,e){try{return(await G(".yaml",t,[],e,!0)).map(n=>(0,K.basename)(n))}catch(r){throw new Error(`There was an error reading files from the directory '${t}': ${r}`)}}c(Bt,"getAllUi5YamlFileNames");async function at(t,e=d.Ui5MockYaml){let n=(await Oe(t,e)).findCustomMiddleware("sap-fe-mockserver");if(!n)throw new Error("Could not find sap-fe-mockserver");return n.configuration}c(at,"getMockServerConfig");async function Wt(t,e=d.Ui5MockYaml){let r=await at(t,e);if(!r)return"";let n=Fi(r);return n?n.find(s=>!!s.mockdataPath)?.mockdataPath??"":""}c(Wt,"getMockDataPath");function Fi(t){if("services"in t&&t.services)return Array.isArray(t.services)?t.services:[t.services]}c(Fi,"extractServices");var pn={applications:[d.Manifest],adaptations:[d.ManifestAppDescrVar],components:[d.Manifest],extensions:[d.ExtConfigJson],libraries:[d.Library,d.Manifest]},un=[".git","node_modules","dist",".adp"];function _i(t){return t&&t.length>0&&t[0].uri!==void 0}c(_i,"isWorkspaceFolder");function fn(t){let e;return t&&_i(t)?(e=[],t.filter(r=>r.uri.scheme==="file").forEach(r=>{e.push(r.uri.fsPath)})):e=t??[],e}c(fn,"wsFoldersToRootPaths");async function $e(t,e=!0,r=!1,n){let i=await _(d.Package,t,n);if(!i){if(r)return"";throw new Error(`Could not find any project root for '${t}'. Search was done for ${e?"Fiori elements":"All"} projects.`)}let s=(0,y.dirname)(i);return e&&((await w(i,n)).sapux||(s=await $e((0,y.dirname)(s),e,r,n))),s}c($e,"findProjectRoot");function ji(t,e,r){if(typeof t=="boolean"&&t===!0)return{appRoot:r,projectRoot:r};if(Array.isArray(t)){let n=e.endsWith(y.sep)?e:e+y.sep,s=t.map(o=>(0,y.join)(...o.split(/[\\/]/))).find(o=>n.startsWith((0,y.join)(r,o)+y.sep));if(s)return{appRoot:(0,y.join)(r,s),projectRoot:r}}return null}c(ji,"findRootsWithSapux");async function qt(t){let e=await _(d.Ui5Yaml,t),r=(0,y.dirname)(t);if(e){let n=(0,y.dirname)(e);await $(n)===t&&(r=n)}return r}c(qt,"getAppRootFromWebappPath");function Oi(t){return t.commit!==void 0}c(Oi,"isEditor");function dn(t){let e,r={files:{},capProjectType:new Map};return t&&(Oi(t)?e=t:(e=t.memFs,r=t.cache??r)),{memFs:e,cache:r}}c(dn,"getFindOptions");async function ct(t,e){try{let{memFs:r,cache:n}=dn(e),i=await $e(t,!1,!1,r);if(!i)return null;n.files[t]??=await w((0,y.join)(i,d.Package),r);let s=n.files[t];if(s.sapux)return ji(s.sapux,t,i);let o=await ie(i,void 0,{memFs:r,cache:n});if(o)return{appRoot:i,projectRoot:o};if(await S((0,y.join)(i,d.Ui5LocalYaml),r)&&ne(s,"@sap/ux-ui5-tooling"))return{appRoot:i,projectRoot:i}}catch{}return null}c(ct,"findRootsForPath");async function ie(t,e=!0,r){try{if(!(0,y.isAbsolute)(t))return null;let{memFs:n,cache:i}=dn(r),{root:s}=(0,y.parse)(t),o=(0,y.dirname)(t);for(;o!==s;){if(i.capProjectType.has(o)||i.capProjectType.set(o,await L(o,n)),i.capProjectType.get(o)&&(e&&(0,y.join)(o,"app")!==t||!e))return o;o=(0,y.dirname)(o)}}catch{}return null}c(ie,"findCapProjectRoot");async function se(t,e){return(await me({wsFolders:t,artifacts:["applications"],memFs:e})).applications??[]}c(se,"findAllApps");async function $i(t,e){let r=[],n=Object.keys(t.files).filter(i=>(0,y.basename)(i)===d.Manifest);for(let i of n)try{t.files[i]??=await w(i,e);let s=t.files[i];if(!s["sap.app"]?.id||s["sap.app"].type!=="application")continue;let o=await ct((0,y.dirname)(i),{memFs:e,cache:t});o&&!await S((0,y.join)(o.appRoot,".adp",d.AdaptationConfig),e)&&r.push({appRoot:o.appRoot,projectRoot:o.projectRoot,manifest:s,manifestPath:i})}catch{}return r}c($i,"filterApplications");async function Ri(t,e){let r=[],n=Object.keys(t.files).filter(i=>i.endsWith(d.ManifestAppDescrVar));for(let i of n){let s=await _(d.Package,(0,y.dirname)(i),e),o=s?(0,y.dirname)(s):null,a=await $(o??"",e);o&&await S((0,y.join)(a,d.ManifestAppDescrVar),e)&&r.push({appRoot:o,manifestAppdescrVariantPath:i})}return r}c(Ri,"filterAdaptations");async function Ui(t,e){let r=[],n=Object.keys(t.files).filter(i=>(0,y.basename)(i)===d.ExtConfigJson);for(let i of n)try{let s=null,o=Object.keys(t).find(a=>a.startsWith((0,y.dirname)(i)+y.sep)&&(0,y.basename)(a)===d.Manifest);if(o)t.files[o]??=await w(o,e),s=t.files[o];else{let a=await Y({fileNames:[d.Manifest],root:(0,y.dirname)(i),excludeFolders:un,memFs:e});a.length===1&&([o]=a,s=await w(o,e))}o&&s&&r.push({appRoot:(0,y.dirname)(i),manifest:s,manifestPath:o})}catch{}return r}c(Ui,"filterExtensions");async function Li(t,e,r){let n=[],i=Object.keys(t.files).filter(s=>(0,y.basename)(s)===d.Library).map(s=>(0,y.dirname)(s)).filter(s=>!e.map(o=>(0,y.dirname)(o)).includes(s));if(i)for(let s of i){let o=(0,y.dirname)(await _(d.Package,(0,y.dirname)(s),r)??s);n.push({projectRoot:o,libraryPath:s})}return n}c(Li,"filterDotLibraries");async function Vi(t,e){let r=[],n=Object.keys(t.files).filter(i=>(0,y.basename)(i)===d.Manifest);r.push(...await Li(t,n,e));for(let i of n)try{t.files[i]??=await w(i,e);let s=t.files[i];if(s["sap.app"]?.type==="library"){let o=await _(d.Package,(0,y.dirname)(i),e),a=o?(0,y.dirname)(o):null;a&&await S((0,y.join)(a,d.Ui5Yaml),e)&&r.push({projectRoot:a,manifestPath:i,manifest:s})}}catch{}return r}c(Vi,"filterLibraries");async function Ji(t,e){let r=[],n=Object.keys(t.files).filter(i=>(0,y.basename)(i)===d.Manifest);for(let i of n)try{t.files[i]??=await w(i,e);let s=t.files[i];if(s["sap.app"]?.type==="component"){let o=await _(d.Package,(0,y.dirname)(i),e),a=o?(0,y.dirname)(o):null;a&&r.push({projectRoot:a,manifestPath:i,manifest:s})}}catch{}return r}c(Ji,"filterComponents");function Bi(t){let e=new Set;for(let r of t)pn[r]&&pn[r].forEach(n=>e.add(n));return Array.from(e)}c(Bi,"getFilterFileNames");async function me(t){let e={},r=Bi(t.artifacts),n=fn(t.wsFolders),i={files:{},capProjectType:new Map};for(let s of n)try{(await Y({fileNames:r,root:s,excludeFolders:un,memFs:t.memFs})).forEach(a=>i.files[a]=null)}catch{}return t.artifacts.includes("applications")&&(e.applications=await $i(i,t.memFs)),t.artifacts.includes("adaptations")&&(e.adaptations=await Ri(i,t.memFs)),t.artifacts.includes("extensions")&&(e.extensions=await Ui(i,t.memFs)),t.artifacts.includes("libraries")&&(e.libraries=await Vi(i,t.memFs)),t.artifacts.includes("components")&&(e.components=await Ji(i,t.memFs)),e}c(me,"findFioriArtifacts");async function Yt(t){let e=new Set,r=["node_modules","dist","webapp","MDKModule","gen"],n=[d.Pom,d.Package,d.CapJavaApplicationYaml],i=fn(t.wsFolders),s=t.noTraversal??!1;for(let o of i){let a=await Y({fileNames:n,root:o,excludeFolders:r,noTraversal:s}),l=Array.from(new Set(a.filter(p=>(0,y.basename)(p)===d.CapJavaApplicationYaml).map(p=>(0,y.dirname)(p)))),u=Array.from(new Set(a.filter(p=>(0,y.basename)(p)!==d.CapJavaApplicationYaml).map(p=>(0,y.dirname)(p))));for(let p of l){let f=await ie(p);f&&e.add(f)}for(let p of u)await L(p)!==void 0&&e.add(p)}return Array.from(e)}c(Yt,"findCapProjects");var oe=require("../../commonlibs/semver/index.js"),wn=require("../../commonlibs/mem-fs/index.js"),bn=require("../../commonlibs/mem-fs-editor/index.js");function lt(t){return!!(t.cds??t.dependencies?.["@sap/cds"])}c(lt,"isCapNodeJsProject");async function pt(t,e,r){let n=e?.srv??(await V(t)).srv;return S((0,E.join)(t,n,"src","main","resources",d.CapJavaApplicationYaml),r)}c(pt,"isCapJavaProject");async function Wi(t,e){try{return(await Y({root:t,memFs:e})).length>0}catch{return!1}}c(Wi,"checkFilesInSrvFolder");async function L(t,e){let r=await V(t);if(!await Wi((0,E.join)(t,r.srv),e))return;if(await pt(t,r,e))return"CAPJava";let n;try{n=await w((0,E.join)(t,d.Package),e)}catch{}if(n&&lt(n))return"CAPNodejs"}c(L,"getCapProjectType");async function zt(t){return!!await L(t)}c(zt,"isCapProject");async function V(t){let e={app:"app/",db:"db/",srv:"srv/"};try{let r=await H(t);r.folders&&(e.app=r.folders.app,e.db=r.folders.db,e.srv=r.folders.srv)}catch{}return e}c(V,"getCapCustomPaths");function hn(t){return t.kind==="odata"||t.kind==="odata-v4"}c(hn,"filterCapServiceEndpoints");async function Re(t){let e,r,n,i=new Set(["app","srv","db"]);typeof t=="object"?(e=t.projectRoot,r=t.logger,n=t.pathSelection?t.pathSelection:i):(n=i,e=t);let s=await ae(e,!0),o=await V(e),a=[];n?.forEach(p=>{a.push((0,E.join)(e,o[p]))});let l=await s.load(a,{root:e});r?.info(`@sap-ux/project-access:getCapModelAndServices - Using 'cds.home': ${s.home}`),r?.info(`@sap-ux/project-access:getCapModelAndServices - Using 'cds.version': ${s.version}`),r?.info(`@sap-ux/project-access:getCapModelAndServices - Using 'cds.root': ${s.root}`),r?.info(`@sap-ux/project-access:getCapModelAndServices - Using 'projectRoot': ${e}`);let u=s.compile.to.serviceinfo(l,{root:e})??[];return u=ut(u),{model:l,services:u,cdsVersionInfo:{home:s.home,version:s.version,root:s.root}}}c(Re,"getCapModelAndServices");function ut(t){return t&&Array.isArray(t)?t.filter(e=>e.urlPath&&e.endpoints===void 0||e.endpoints?.find(hn)).map(e=>{let{endpoints:r,urlPath:n}=e,s=r?.find(hn)?.path??n;return{name:e.name,urlPath:En(s),runtime:e.runtime}}):[]}c(ut,"processServices");async function Ue(t,e=!1,r){let n=[];try{let i;r??=await Le(t);try{i=await(await ae(t)).load(r,{root:t}),n=[...i.$sources??[]]}catch(s){if(e&&s.model?.sources&&typeof s.model.sources=="object")n.push(...qi(s.model.sources));else throw s}}catch(i){throw Error(`Error while retrieving the list of cds files for project ${t}, envRoot ${r}. Error was: ${i}`)}return n}c(Ue,"getCdsFiles");async function Le(t,e=!1){let r=[],n=await V(t),i=[n.db,n.srv,n.app,"schema","services"],s=await ae(t);e&&Cn(s);for(let o of i){let a=s.resolve((0,E.join)(t,o),{skipModelCache:!0})||[];for(let l of a)r.push(l)}return r}c(Le,"getCdsRoots");async function Xt(t,e=!0){let r=[];try{let n=await ae(t),i=await Le(t),s;try{s=await n.load(i,{root:t})}catch(a){if(e&&a.model)s=a.model;else throw a}let o=n.linked(s);Array.isArray(o.services)?r=o.services:Object.keys(o.services).forEach(a=>{r.push(o.services[a])})}catch(n){throw Error(`Error while resolving cds roots for '${t}'. ${n}`)}return r}c(Xt,"getCdsServices");function qi(t){let e=[];for(let r in t){let n=t[r].filename;typeof n=="string"&&!n.startsWith(E.sep)&&(n=(0,E.join)(E.sep,n)),n&&e.push(n)}return e}c(qi,"extractCdsFilesFromMessage");function En(t){return t?t.replace(/\\/g,"/").replace(/\/\//g,"/").replace(/(?:^\/)/g,""):""}c(En,"uniformUrl");async function Ve(t,e,r="v4"){try{let{model:n,services:i}=await Re(t),s=xn(i,e);if(!s)throw Error(`Service for uri: '${e}' not found. Available services: ${JSON.stringify(i)}`);return(await ae(t)).compile.to.edmx(n,{service:s.name,version:r})}catch(n){throw Error(`Error while reading CAP service metadata. Path: '${t}', service uri: '${e}', error: '${n.toString()}'}`)}}c(Ve,"readCapServiceMetadataEdmx");function Ht(t){return t.replaceAll(/(?:^\/)|(?:\/$)/g,"")}c(Ht,"normalizeServiceUrlPath");function Yi(t,e){let r=t.startsWith("/")?t:`/${t}`,n=e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);return[String.raw`^/ui/[^/]+/v\d+/${n}$`,String.raw`^/[^/]+\.[^/]+/external-ui/[^/]+/v\d+/${n}$`].some(s=>new RegExp(s).test(r))}c(Yi,"isMatchingServiceUri");function xn(t,e){let r=Ht(En(e)),n=t.find(i=>Ht(i.urlPath)===r);return n??=t.find(i=>{let s=Ht(i.urlPath);return Yi(r,s)}),n}c(xn,"findServiceByUri");async function H(t){return(await ae(t)).env.for("cds",t)}c(H,"getCapEnvironment");async function ae(t,e=!1){let r,n,i;try{r=await U(t,"@sap/cds")}catch(o){n=o}if(!r)try{r=await zi()}catch(o){i=o}if(!r)throw Error(`Could not load cds module. Attempt to load module @sap/cds from project threw error '${n}', attempt to load module @sap/cds from @sap/cds-dk threw error '${i}'`);let s="default"in r?r.default:r;if(e&&n){let o=await Gi((0,E.join)(t,d.Package));if(typeof o=="string"){let a=s.version;if(mn(o)!==mn(a)){let l=new Error(`The @sap/cds major version (${o}) specified in your CAP project is different to the @sap/cds version you have installed globally (${a}). Please run 'npm install' on your CAP project to ensure that the correct CDS version is loaded.`);throw l.code="CDS_VERSION_MISMATCH",l}}}return global&&(global.cds=s),s.env=s.env.for("cds",t),s}c(ae,"loadCdsModuleFromProject");async function Gt(t){let e=!1;try{let r=await ae(t);r&&(Cn(r),e=!0)}catch{}return e}c(Gt,"clearCdsModuleCache");function Cn(t){t.resolve.cache={}}c(Cn,"clearCdsResolveCache");var gn=c((t,e)=>(0,E.join)(t,e),"toAbsoluteUri"),Zt=c(async(t,e,r)=>{let n="",i=r.lastIndexOf("node_modules");if(i>=0){let o=r.lastIndexOf(".");o>i+13?n=r.slice(i+13,o):n=r.slice(i+13)}else if(r.startsWith("../")||r.startsWith("..\\")){let o=await Hi(t,r);o.packageName&&(n=o.packageName+r.slice(o.packageFolder.length))}if(!n){let o=(0,E.dirname)(gn(t,e));n=(0,E.relative)(o,gn(t,r)),n.startsWith(".")||(n="./"+n)}let s=n.lastIndexOf(".")>0?n.slice(n.lastIndexOf(".")+1):"";return["CDS","JSON"].includes(s.toUpperCase())&&(n=n.slice(0,n.length-s.length-1)),n.split(E.sep).join("/")},"toReferenceUri");async function Hi(t,e){let r=e.split(E.sep),n={packageName:"",packageFolder:e};for(let i=r.length-1;i>=0&&!n.packageName;i--){let s=r.slice(0,i).join(E.sep);n.packageName=await Di(t,s),n.packageName&&(n.packageFolder=s)}return n}c(Hi,"getPackageNameInFolder");async function Di(t,e){let r="";try{let n=(0,E.normalize)(t+"/"+e+"/"+d.Package),i=await w(n);typeof i?.name=="string"&&(r=i.name)}catch{r=""}return r}c(Di,"readPackageNameForFolder");var Dt;async function zi(){return Dt=Dt??new Promise((t,e)=>ft().then(r=>{r?t(U((0,E.join)(r,"node_modules","@sap","cds"),"@sap/cds")):e(new Error("Can not find global installation of module @sap/cds, which should be part of @sap/cds-dk"))},e)),Dt}c(zi,"loadGlobalCdsModule");async function Xi(t){return new Promise((e,r)=>{let n="",i=(0,yn.spawn)("cds",["env","--json"],{cwd:t,shell:!0});i.stdout.on("data",s=>{n+=s.toString()}),i.on("close",()=>{if(n)try{e(JSON.parse(n))}catch(s){r(new Error(`Unexpected output of "cds env --json": ${s.message}`))}else r(new Error("Module path not found"))}),i.on("error",s=>{r(s)})})}c(Xi,"getCdsEnvData");async function ft(){return(await Xi())["_home_cds-dk"]}c(ft,"getGlobalCdsHomePath");async function Gi(t){let e;try{await S(t)&&(e=(await w(t))?.dependencies?.["@sap/cds"])}catch{}return e}c(Gi,"getCdsVersionFromPackageJson");function mn(t){return Number.parseInt(/\d+/.exec(t.split(".")[0])?.[0]??"0",10)}c(mn,"getMajorVersion");async function Kt(t,e){let r=(await Re(t)).services,n=xn(r,e);if(!n?.name){let i=`Service for uri: '${e}' not found. Available services: ${JSON.stringify(r)}`;throw Error(i)}return n.name}c(Kt,"getCapServiceName");async function Zi(t,e,r,n){let i=`using from './${e}/annotations';`;for(let s of t)if(await S(s,r))try{let o=await j(s,r);o.indexOf(i)!==-1&&(n?.info(`Removing using statement for './${e}/annotations' from '${s}'.`),o=o.replace(i,""),o.replace(/\n/g,"").trim()===""?(n?.info(`File '${s}' is now empty, removing it.`),await Ut(s,r)):await X(s,o,r))}catch{n?.error(`Could not modify file '${s}'. Skipping this file.`)}}c(Zi,"cleanupCdsFiles");async function Qt(t,e,r){let n=(0,E.basename)(t),i=await ie(t);if(!i){let l=`Project root was not found for CAP application with path '${t}'`;throw r?.error(l),Error(l)}let s=(0,E.join)(i,d.Package),o=await w(s,e),a=[(0,E.join)((0,E.dirname)(t),d.ServiceCds),(0,E.join)((0,E.dirname)(t),d.IndexCds)];if(r?.info(`Deleting app '${n}' from CAP project '${i}'.`),Array.isArray(o.sapux)){let l=t.replace(/\\/g,"/");o.sapux=o.sapux.filter(u=>!l.endsWith(u.replace(/\\/g,"/"))),o.sapux.length===0&&(r?.info(`This was the last app in this CAP project. Deleting property 'sapux' from '${s}'.`),delete o.sapux)}o.scripts?.[`watch-${n}`]&&delete o.scripts[`watch-${n}`],await q(s,o,e),r?.info(`File '${s}' updated.`),await rt(t,e),r?.info(`Directory '${t}' deleted.`),await Zi(a,n,e,r),(await Te((0,E.dirname)(t))).length===0&&(r?.info(`Directory '${(0,E.dirname)(t)}' is now empty. Deleting it.`),await rt((0,E.dirname)(t),e))}c(Qt,"deleteCapApp");async function er(t,e,r,n){e||(e=(0,bn.create)((0,wn.create)()));let i=(0,E.join)(t,"package.json");if(!e.exists(i))return!1;let s=e.readJSON(i),{workspaceEnabled:o}=await dt(t,s),a={hasMinCdsVersion:n?.version?(0,oe.satisfies)(n?.version,`>=${ge}`):Qi(s),isWorkspaceEnabled:o,hasCdsUi5Plugin:ne(s,"cds-plugin-ui5"),isCdsUi5PluginEnabled:!1};return a.isCdsUi5PluginEnabled=a.hasMinCdsVersion&&a.isWorkspaceEnabled&&a.hasCdsUi5Plugin,r?a:a.isCdsUi5PluginEnabled}c(er,"checkCdsUi5PluginEnabled");async function dt(t,e){let r=await V(t),n=r.app.endsWith("/")?`${r.app}*`:`${r.app}/*`,i=Ki(e)??[],s=i.includes(n);return{appWorkspace:n,workspaceEnabled:s,workspacePackages:i}}c(dt,"getWorkspaceInfo");function Ki(t){let e;return Array.isArray(t.workspaces)?e=t.workspaces:Array.isArray(t.workspaces?.packages)&&(e=t.workspaces?.packages),e}c(Ki,"getWorkspacePackages");function Qi(t){return ht(t)||(0,oe.satisfies)(ge,t.dependencies?.["@sap/cds"]??"0.0.0")}c(Qi,"satisfiesMinCdsVersion");function ht(t){return(0,oe.gte)((0,oe.coerce)(t.dependencies?.["@sap/cds"])??"0.0.0",ge)}c(ht,"hasMinCdsVersion");var Je=require("node:path");function ye(t){let e=typeof t?.["sap.ovp"]?.globalFilterModel=="string"?t["sap.ovp"].globalFilterModel:"";return typeof t?.["sap.ui5"]?.models?.[e]?.dataSource=="string"?t["sap.ui5"].models[e].dataSource:void 0}c(ye,"getMainService");async function vn(t,e,r){let n=e??await w(t,r),i=(0,Je.dirname)(t),s={},o=n?.["sap.app"]?.dataSources??{};for(let a in o)o[a].type==="OData"&&(s[a]=es(i,a,o));return s}c(vn,"getServicesAndAnnotations");function es(t,e,r){let n=r[e],i=n.uri,s=typeof n.settings?.localUri=="string"?(0,Je.join)(t,n.settings.localUri):"",o=n.settings?.odataVersion??"2.0",a=[],l=n.settings?.annotations;if(Array.isArray(l))for(let u of l){let p=r[u];p&&a.push({uri:p.uri,local:p.settings?.localUri?(0,Je.join)(t,p.settings.localUri):void 0})}return{uri:i,local:s,odataVersion:o,annotations:a}}c(es,"getServiceSpecification");function tr(t,e){return Object.fromEntries(Object.entries(t).filter(([,r])=>r.type===e))}c(tr,"filterDataSourcesByType");function ts(t){return"views"in t&&t.views&&typeof t.views=="object"&&"paths"in t.views&&Array.isArray(t.views.paths)?t.views.paths:[]}c(ts,"getViewPaths");function rr(t){let e=t["sap.ui5"]?.routing?.targets;if(!e||typeof e!="object")return[];let r=ye(t)??"",n=t["sap.app"]?.dataSources?.[r]?.uri??"",i=new Set,s=[],o=c(a=>{if(typeof a!="string")return;let l=`${n}${a}`;i.has(l)||(i.add(l),s.push({service:n,entity:a}))},"addEntity");for(let a in e){let l=e[a],u=l.options&&typeof l.options=="object"&&"settings"in l.options?l.options.settings:void 0;if(!u||typeof u!="object")continue;"entitySet"in u&&o(u.entitySet);let p=ts(u);for(let f of p)f&&typeof f=="object"&&"entitySet"in f&&o(f.entitySet)}return s}c(rr,"getUsedEntitiesFromManifest");var I=require("node:path");async function J(t,e,r){let n=e??await w(t,r),i=(0,I.dirname)(t),s=rs(n),o={"sap.app":(0,I.join)(i,s["sap.app"]),models:{}};for(let a in s.models)o.models[a]={path:(0,I.join)(i,s.models[a].path)};return o}c(J,"getI18nPropertiesPaths");function rs(t){return{"sap.app":ns(t),models:is(t)}}c(rs,"getRelativeI18nPropertiesPaths");function ns(t){let e=(0,I.join)("i18n/i18n.properties");if(typeof t?.["sap.app"]?.i18n=="string")return(0,I.join)(t["sap.app"].i18n);if(typeof t?.["sap.app"]?.i18n=="object"){if("bundleName"in t["sap.app"].i18n){let r=t["sap.app"].i18n.bundleName.replace(t["sap.app"].id,""),n=`${(0,I.join)(...r.split("."))}.properties`;return(0,I.join)(n)}if("bundleUrl"in t["sap.app"].i18n)return(0,I.join)(t["sap.app"].i18n.bundleUrl)}return e}c(ns,"getI18nAppPath");function is(t){let e={},r=t?.["sap.ui5"]?.models??{},n=Object.keys(r).filter(i=>r[i].type==="sap.ui.model.resource.ResourceModel");for(let i of n){let s=r[i];if(s.settings){if(s.settings.bundleName){let o=t["sap.app"]?.id??"";if(!o)continue;let a=s.settings.bundleName.replace(o,""),l=`${(0,I.join)(...a.split("."))}.properties`;e[i]={path:(0,I.join)(l)};continue}if(s.settings.bundleUrl){e[i]={path:(0,I.join)(s.settings.bundleUrl)};continue}}s.uri&&(e[i]={path:(0,I.join)(s.uri)})}return e}c(is,"getI18nModelPaths");var ce=require("../../open-ux-shared/i18n/index.js");function nr(t,e,r){t.errors||(t.errors={}),t.errors[e]=r}c(nr,"addToErrors");async function we(t,e,r,n){let i={"sap.app":{},models:{},service:{}};try{i["sap.app"]=await(0,ce.getPropertiesI18nBundle)(e["sap.app"],n)}catch(s){nr(i,"sap.app",s)}for(let s of Object.keys(e.models))try{i.models[s]=await(0,ce.getPropertiesI18nBundle)(e.models[s].path,n)}catch(o){i.models[s]={},nr(i,`models.${s}`,o)}if(r==="CAPJava"||r==="CAPNodejs")try{let s=await H(t),o=await Ue(t,!0);i.service=await(0,ce.getCapI18nBundle)(t,s,o,n)}catch(s){nr(i,"service",s)}return i}c(we,"getI18nBundles");async function gt(t){let e=await H(t);return(0,ce.getI18nFolderNames)(e)}c(gt,"getCapI18nFolderNames");var be=require("../../open-ux-shared/i18n/index.js");var D=require("node:path");var mt=require("node:fs/promises");async function ir(t,e,r,n){let i=await H(t);return(0,be.createCapI18nEntries)(t,e,r,i,n)}c(ir,"createCapI18nEntries");async function An(t,e,r,n,i,s){let o="i18n/i18n.properties",a=r.models[i]?.path;if(a){let h=(0,D.dirname)(a);return s||await(0,mt.mkdir)(h,{recursive:!0}),(0,be.createPropertiesI18nEntries)(a,n,t,s)}let l=await w(e),u={...l["sap.ui5"]?.models};u[i]={type:"sap.ui.model.resource.ResourceModel",uri:o};let p={...l,"sap.ui5":{...l["sap.ui5"],models:u}};await X(e,JSON.stringify(p,void 0,4),s);let f=(0,D.dirname)(o);return s||await(0,mt.mkdir)((0,D.join)((0,D.dirname)(e),f),{recursive:!0}),(0,be.createPropertiesI18nEntries)((0,D.join)((0,D.dirname)(e),o),n,t,s)}c(An,"createUI5I18nEntriesBase");async function sr(t,e,r,n,i,s){return An(t,e,r,n,i,s)}c(sr,"createUI5I18nEntries");async function or(t,e,r,n,i){return An(t,e,r,n,"@i18n",i)}c(or,"createAnnotationI18nEntries");async function ar(t,e,r,n){let i=e["sap.app"],s=(0,D.dirname)(i);return n||await(0,mt.mkdir)(s,{recursive:!0}),(0,be.createPropertiesI18nEntries)(i,r,t,n)}c(ar,"createManifestI18nEntries");var B=require("node:path");var yt=require("../../commonlibs/semver/index.js");async function Ee(t,e){if(!await S((0,B.join)(t,d.Package),e))throw new Error(`The project root folder '${t}' is not a Fiori project. No 'package.json' found.`);let n=await L(t)??"EDMXBackend",i=n==="EDMXBackend"?void 0:await V(t),s=await ss(t,e),o=await os(t,s,e);return{root:ke(t),projectType:n,apps:o,capCustomPaths:i}}c(Ee,"getProject");async function ss(t,e){let r=await se([t],e);return r.length>0?r.map(n=>(0,B.relative)(t,n.appRoot)):[""]}c(ss,"getAppFolders");async function os(t,e,r){let n={};for(let i of e){let s=await as(t,i,r);s&&(n[i]=s)}return n}c(os,"getApps");async function as(t,e,r){let n=(0,B.join)(t,e),i=await $(n,r),s=await wt(n,r),o=(0,B.join)(i,d.Manifest);if(!await S(o,r))return;let a=await w(o,r),l=(0,B.join)(i,z.Changes),u=await J(o,a,r),p=ye(a),f=await vn(o,a,r);return{appRoot:n,appType:s,manifest:o,changes:l,i18n:u,mainService:p,services:f}}c(as,"getApplicationStructure");async function cr(t,e){let r=["node_modules",".git"],n="";try{let i=await $(t,e);await S(i,e)&&(await S((0,B.join)(t,d.Tsconfig),e)&&(await G(".ts",i,r,e)).length>0?n="TypeScript":(await G(".js",i,r,e)).length>0&&(n="JavaScript"))}catch{}return n}c(cr,"getAppProgrammingLanguage");async function wt(t,e){let r;try{let n=await me({wsFolders:[t],artifacts:["adaptations","applications","extensions","libraries"],memFs:e});(n.applications?.length??0)+(n.adaptations?.length??0)+(n.extensions?.length??0)+(n.libraries?.length??0)===1&&(n.applications?.length===1?r=await cs(n.applications[0],e):n.adaptations?.length===1?r="Fiori Adaptation":n.extensions?.length===1?r="SAPUI5 Extension":n.libraries?.length===1&&(r="Fiori Reuse"))}catch{}return r}c(wt,"getAppType");async function cs(t,e){let r,n=(0,B.join)(t.projectRoot,d.Package),i=await S(n,e)?await w(n,e):null;return t.projectRoot===t.appRoot?r=i?.sapux?"SAP Fiori elements":"SAPUI5 freestyle":i?r=Array.isArray(i.sapux)&&i.sapux.find(s=>(0,B.join)(t.projectRoot,...s.split(/[/\\]/))===t.appRoot)?"SAP Fiori elements":"SAPUI5 freestyle":r="SAPUI5 freestyle",r}c(cs,"getApplicationType");async function lr(t){let e=await L(t);return e===void 0?"EDMXBackend":e}c(lr,"getProjectType");function bt(t){let e=t["sap.ui5"]?.dependencies;if(e)return e.minUI5Version}c(bt,"getMinUI5VersionFromManifest");function Et(t,e=!1){let r=[],n=bt(t);return n&&(Array.isArray(n)?n:[n]).forEach(s=>{(e||(0,yt.valid)(s))&&r.push(s)}),r}c(Et,"getMinUI5VersionAsArray");function Be(t){let e,r=Et(t);return r.length>0&&r.forEach(n=>{(!e||(0,yt.gte)(e,n))&&(e=n)}),e}c(Be,"getMinimumUI5Version");var Sn=require("node:path");async function pr(t,e){let r=await _(d.MtaYaml,t,e);if(r){let n=(0,Sn.dirname)(r);return{mtaPath:r,hasRoot:n!==t}}else return}c(pr,"getMtaPath");var At=require("node:path");var xt=require("node:fs"),Ct=require("node:fs/promises"),W=require("node:path"),Nn=require("../../commonlibs/semver/index.js");var xe=(0,W.join)(te,d.SpecificationDistTags);async function ls(t,e){let r="latest";try{let n=await $(t),i=await w((0,W.join)(n,d.Manifest)),s=Be(i);if(s&&(0,Nn.valid)(s)){let[o,a]=s.split(".");r=`UI5-${o}.${a}`}}catch(n){e?.logger?.error(`Failed to get minimum UI5 version from manifest: ${n} using 'latest'`)}return r}c(ls,"getProjectDistTag");async function Pn(t){return!!(await w((0,W.join)(t,d.Package))).devDependencies?.["@sap/ux-specification"]}c(Pn,"hasSpecificationDevDependency");async function qe(t,e){let r=e?.logger,n,i=await Tn(t,{logger:r});try{n=await ps(i,{logger:r}),r?.debug(`Specification loaded from cache using version '${i}'`)}catch(s){throw r?.error(`Failed to load specification: ${s}`),new Error(`Failed to load specification: ${s}`)}return n}c(qe,"getSpecificationModuleFromCache");async function Ye(t,e){let r=e?.logger;try{if(await Pn(t))return r?.debug(`Specification found in devDependencies of project '${t}', trying to load`),U(t,"@sap/ux-specification")}catch{r?.debug(`Specification not found in project '${t}', trying to load from cache`)}return await qe(t,{logger:r})}c(Ye,"getSpecification");async function We(t){let e=t?.logger;try{let r=await Z(["view","@sap/ux-specification","dist-tags","--json"],{logger:e}),n=JSON.parse(r);if("error"in n)throw new Error(r);(0,xt.existsSync)(te)||await(0,Ct.mkdir)(te,{recursive:!0}),await X(xe,JSON.stringify(n,null,4));let i=new Set(Object.values(n)),s=(0,W.join)(he,"@sap/ux-specification"),o=(0,xt.existsSync)(s)?(await(0,Ct.readdir)(s,{withFileTypes:!0})).filter(a=>a.isDirectory()).filter(a=>!i.has(a.name)).map(a=>a.name):[];for(let a of o)await an("@sap/ux-specification",a),e?.debug(`Deleted unused specification module '@sap/ux-specification@${a}' from cache`)}catch(r){e?.error(`Error refreshing specification dist-tags: ${r}`)}}c(We,"refreshSpecificationDistTags");async function ps(t,e){let r=e?.logger;return await on("@sap/ux-specification",t,{logger:r})}c(ps,"getSpecificationByVersion");async function us(t,e){let r=e?.logger;(0,xt.existsSync)(xe)||(r?.debug(`Specification dist-tags not found at '${xe}'. Trying to refresh.`),await We({logger:r}));let n=await w(xe);return"error"in n&&!(t in n)&&!("latest"in n)&&(r?.debug(`Specification dist-tags file has error at '${xe}'. Trying to refresh.`),await We({logger:r}),n=await w(xe)),n[t]??n.latest}c(us,"convertDistTagToVersion");async function Tn(t,e){let r=e?.logger,n=await ls(t,{logger:r});return await us(n,{logger:r})}c(Tn,"getSpecificationVersion");async function ur(t,e){let r=e?.logger,n="@sap/ux-specification";if(await Pn(t)){let a=await st(t,n);return r?.debug(`Specification root found in project '${t}'`),a.slice(0,a.lastIndexOf((0,W.join)(n))+(0,W.join)(n).length)}await qe(t,{logger:r});let i=await Tn(t,{logger:r});r?.debug(`Specification not found in project '${t}', using path from cache with version '${i}'`);let s=(0,W.join)(he,n,i),o=await st(s,n);return o.slice(0,o.lastIndexOf((0,W.join)(n))+(0,W.join)(n).length)}c(ur,"getSpecificationPath");var In=require("node:path");var kn=require("node:fs");async function He(t,e){let r={};if((0,kn.existsSync)(t)){let n=await Te(t);for(let i of n)r[i]=await j((0,In.join)(t,i),e)}return r}c(He,"readFlexChanges");var vt=class{static{c(this,"ApplicationAccessImp")}_project;appId;options;constructor(e,r,n){this._project=e,this.appId=r,this.options=n}get app(){return this.project.apps[this.appId]}createAnnotationI18nEntries(e){return or(this.project.root,this.app.manifest,this.app.i18n,e,this.options?.fs)}createUI5I18nEntries(e,r="i18n"){return sr(this.project.root,this.app.manifest,this.app.i18n,e,r,this.options?.fs)}createManifestI18nEntries(e){return ar(this.project.root,this.app.i18n,e,this.options?.fs)}createCapI18nEntries(e,r){return ir(this.project.root,e,r,this.options?.fs)}getAppId(){return this.appId}getAppRoot(){return this.app.appRoot}getI18nBundles(){return we(this.project.root,this.app.i18n,this.project.projectType,this.options?.fs)}getI18nPropertiesPaths(){return J(this.app.manifest)}async getSpecification(){return Ye(this.app.appRoot)}async updatePackageJSON(e,r){await q((0,At.join)(this.app.appRoot,d.Package),e,r??this.options?.fs)}async updateManifestJSON(e,r){await Rt(this.app.manifest,e,r??this.options?.fs)}async readManifest(e){return w(this.app.manifest,e??this.options?.fs)}async readFlexChanges(e){return He(this.app.changes,e??this.options?.fs)}async readAnnotationFiles(e){let r=[],n=this.app.mainService??"mainService",i=this.app?.services?.[n];if(!i)return[];if(i.uri&&(this.projectType==="CAPJava"||this.projectType==="CAPNodejs")){let s=i?.uri??"";if(s){let o=await Ve(this.root,s);r.push({fileContent:o,dataSourceUri:s})}}else{if(i.local){let o=await j(i.local,e??this.options?.fs);r.push({dataSourceUri:i.local,fileContent:o.toString()})}let{annotations:s=[]}=i;for(let o of s)if(o.local){let a=await j(o.local,e??this.options?.fs);r.push({dataSourceUri:o.local,fileContent:a.toString()})}}return r}get project(){return this._project}get projectType(){return this.project.projectType}get root(){return this.project.root}},fr=class{static{c(this,"ProjectAccessImp")}_project;options;constructor(e,r){this._project=e,this.options=r}getApplicationIds(){return Object.keys(this._project.apps)}async getApplicationIdByManifestAppId(e){for(let[r,{manifest:n}]of Object.entries(this._project.apps))if((await w(n,this.options?.memFs))["sap.app"]?.id===e)return r}getApplication(e){if(!this.project.apps[e])throw new Error(`Could not find app with id ${e}`);return new vt(this.project,e,this.options)}get project(){return this._project}get projectType(){return this.project.projectType}get root(){return this.project.root}};function fs(t){return t.commit!==void 0}c(fs,"isEditor");async function dr(t,e){try{let r;e&&(r=fs(e)?{fs:e}:e);let i=(await se([t],r?.fs)).find(a=>a.appRoot===t);if(!i)throw new Error(`Could not find app with root ${t}`);let s=await Ee(i.projectRoot,r?.fs),o=(0,At.relative)(s.root,t);return new vt(s,o,r)}catch(r){throw Error(`Error when creating application access for ${t}: ${r}`)}}c(dr,"createApplicationAccess");async function hr(t,e){try{let r=await Ee(t,e?.memFs);return new fr(r,e)}catch(r){throw Error(`Error when creating project access for ${t}: ${r}`)}}c(hr,"createProjectAccess");var Mn=require("node:path");var gr=_t(require("../../commonlibs/semver/index.js"),1);async function mr(t,e,r,n){let i=(0,Mn.join)(t,d.Package),s=await w(i,n);s.scripts||(s.scripts={}),s.scripts[e]=r,await q(i,s,n)}c(mr,"updatePackageScript");function yr(t){let e=!1,r=gr.default.coerce(t["@ui5/cli"]);return r&&gr.default.gte(r,"3.0.0")&&(e=!0),e}c(yr,"hasUI5CliV3");var Fn=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",ds=Fn+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040",hs="["+Fn+"]["+ds+"]*",gs=new RegExp("^"+hs+"$");function St(t,e){let r=[],n=e.exec(t);for(;n;){let i=[];i.startIndex=e.lastIndex-n[0].length;let s=n.length;for(let o=0;o<s;o++)i.push(n[o]);r.push(i),n=e.exec(t)}return r}c(St,"getAllMatches");var wr=c(function(t){let e=gs.exec(t);return!(e===null||typeof e>"u")},"isName");function _n(t){return typeof t<"u"}c(_n,"isExist");var De=["hasOwnProperty","toString","valueOf","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"],Nt=["__proto__","constructor","prototype"];var ms={allowBooleanAttributes:!1,unpairedTags:[]};function Un(t,e){e=Object.assign({},ms,e);let r=[],n=!1,i=!1;t[0]==="\uFEFF"&&(t=t.substr(1));for(let s=0;s<t.length;s++)if(t[s]==="<"&&t[s+1]==="?"){if(s+=2,s=On(t,s),s.err)return s}else if(t[s]==="<"){let o=s;if(s++,t[s]==="!"){s=$n(t,s);continue}else{let a=!1;t[s]==="/"&&(a=!0,s++);let l="";for(;s<t.length&&t[s]!==">"&&t[s]!==" "&&t[s]!==" "&&t[s]!==` `&&t[s]!=="\r";s++)l+=t[s];if(l=l.trim(),l[l.length-1]==="/"&&(l=l.substring(0,l.length-1),s--),!As(l)){let f;return l.trim().length===0?f="Invalid space after '<'.":f="Tag '"+l+"' is an invalid name.",A("InvalidTag",f,P(t,s))}let u=bs(t,s);if(u===!1)return A("InvalidAttr","Attributes for '"+l+"' have open quote.",P(t,s));let p=u.value;if(s=u.index,p[p.length-1]==="/"){let f=s-p.length;p=p.substring(0,p.length-1);let h=Rn(p,e);if(h===!0)n=!0;else return A(h.err.code,h.err.msg,P(t,f+h.err.line))}else if(a)if(u.tagClosed){if(p.trim().length>0)return A("InvalidTag","Closing tag '"+l+"' can't have attributes or invalid starting.",P(t,o));if(r.length===0)return A("InvalidTag","Closing tag '"+l+"' has not been opened.",P(t,o));{let f=r.pop();if(l!==f.tagName){let h=P(t,f.tagStartPos);return A("InvalidTag","Expected closing tag '"+f.tagName+"' (opened in line "+h.line+", col "+h.col+") instead of closing tag '"+l+"'.",P(t,o))}r.length==0&&(i=!0)}}else return A("InvalidTag","Closing tag '"+l+"' doesn't have proper closing.",P(t,s));else{let f=Rn(p,e);if(f!==!0)return A(f.err.code,f.err.msg,P(t,s-p.length+f.err.line));if(i===!0)return A("InvalidXml","Multiple possible root nodes found.",P(t,s));e.unpairedTags.indexOf(l)!==-1||r.push({tagName:l,tagStartPos:o}),n=!0}for(s++;s<t.length;s++)if(t[s]==="<")if(t[s+1]==="!"){s++,s=$n(t,s);continue}else if(t[s+1]==="?"){if(s=On(t,++s),s.err)return s}else break;else if(t[s]==="&"){let f=Cs(t,s);if(f==-1)return A("InvalidChar","char '&' is not expected.",P(t,s));s=f}else if(i===!0&&!jn(t[s]))return A("InvalidXml","Extra text at the end",P(t,s));t[s]==="<"&&s--}}else{if(jn(t[s]))continue;return A("InvalidChar","char '"+t[s]+"' is not expected.",P(t,s))}if(n){if(r.length==1)return A("InvalidTag","Unclosed tag '"+r[0].tagName+"'.",P(t,r[0].tagStartPos));if(r.length>0)return A("InvalidXml","Invalid '"+JSON.stringify(r.map(s=>s.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1})}else return A("InvalidXml","Start tag expected.",1);return!0}c(Un,"validate");function jn(t){return t===" "||t===" "||t===` `||t==="\r"}c(jn,"isWhiteSpace");function On(t,e){let r=e;for(;e<t.length;e++)if(t[e]=="?"||t[e]==" "){let n=t.substr(r,e-r);if(e>5&&n==="xml")return A("InvalidXml","XML declaration allowed only at the start of the document.",P(t,e));if(t[e]=="?"&&t[e+1]==">"){e++;break}else continue}return e}c(On,"readPI");function $n(t,e){if(t.length>e+5&&t[e+1]==="-"&&t[e+2]==="-"){for(e+=3;e<t.length;e++)if(t[e]==="-"&&t[e+1]==="-"&&t[e+2]===">"){e+=2;break}}else if(t.length>e+8&&t[e+1]==="D"&&t[e+2]==="O"&&t[e+3]==="C"&&t[e+4]==="T"&&t[e+5]==="Y"&&t[e+6]==="P"&&t[e+7]==="E"){let r=1;for(e+=8;e<t.length;e++)if(t[e]==="<")r++;else if(t[e]===">"&&(r--,r===0))break}else if(t.length>e+9&&t[e+1]==="["&&t[e+2]==="C"&&t[e+3]==="D"&&t[e+4]==="A"&&t[e+5]==="T"&&t[e+6]==="A"&&t[e+7]==="["){for(e+=8;e<t.length;e++)if(t[e]==="]"&&t[e+1]==="]"&&t[e+2]===">"){e+=2;break}}return e}c($n,"readCommentAndCDATA");var ys='"',ws="'";function bs(t,e){let r="",n="",i=!1;for(;e<t.length;e++){if(t[e]===ys||t[e]===ws)n===""?n=t[e]:n!==t[e]||(n="");else if(t[e]===">"&&n===""){i=!0;break}r+=t[e]}return n!==""?!1:{value:r