@sap-ux/generator-odata-downloader 0.3.27 → 0.3.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2344,7 +2344,7 @@ specVersion: "2.5"`);return s.setMetadata({name:t}),s.setType("application"),s.a
2344
2344
  ${i}`);let s=[" getReferentialConstraints: function (navigationProperty) {",`${i}`," return undefined;"," }"].join(`
2345
2345
  `),o=t.lastIndexOf(`
2346
2346
  };`);return o!==-1?`${t.slice(0,o)},
2347
- ${s}${t.slice(o)}`:t}var uZr=require("node:fs/promises"),lZr=require("node:path");var tZr=require("node:crypto"),rZr=Pe(Lpe());var eZr={name:"@sap-ux/generator-odata-downloader",displayName:"Fiori Elements Data Downloader",description:"Yeoman generator that supports download of app data, typically for mock data server use.",version:"0.3.27",repository:{type:"git",url:"https://github.com/SAP/open-ux-tools.git",directory:"packages/generator-odata-downloader"},bugs:{url:"https://github.com/SAP/open-ux-tools/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3Aodata-download"},license:"Apache-2.0",main:"generators/app/index.js",keywords:["yeoman-generator"],scripts:{build:"npm-run-all clean bundle:prod",compile:"tsc --build",clean:"rimraf --glob generators prebuilds test/test-output coverage *.tsbuildinfo",watch:"tsc --watch",lint:"eslint","lint:fix":"eslint --fix",test:"cross-env NODE_OPTIONS='--experimental-vm-modules' jest --ci --forceExit --detectOpenHandles --colors","test-u":"cross-env NODE_OPTIONS='--experimental-vm-modules' jest --ci --forceExit --detectOpenHandles --colors -u",link:"pnpm link --global",unlink:"pnpm unlink --global",bundle:"node esbuild.mjs","bundle:dev":"pnpm clean && node esbuild.mjs --development && pnpm pack","bundle:prod":"node esbuild.mjs --production"},files:["LICENSE","generators","!generators/*.map","!generators/**/*.map","prebuilds","yeoman.png"],devDependencies:{"@jest/globals":"30.4.1"},dependencies:{"@sap-devx/yeoman-ui-types":"1.25.0","@sap-ux/annotation-converter":"0.10.21","@sap-ux/axios-extension":"workspace:*","@sap-ux/btp-utils":"workspace:*","@sap-ux/edmx-parser":"0.10.0","@sap-ux/fiori-generator-shared":"workspace:*","@sap-ux/inquirer-common":"workspace:*","@sap-ux/logger":"workspace:*","@sap-ux/mockserver-config-writer":"workspace:*","@sap-ux/odata-service-inquirer":"workspace:*","@sap-ux/odata-service-writer":"workspace:*","@sap-ux/project-access":"workspace:*","@sap-ux/store":"workspace:*","@sap-ux/telemetry":"workspace:*","@sap-ux/ui5-config":"workspace:*","@sap-ux/vocabularies-types":"0.15.0","@sap/ux-specification":"1.144.5","@types/inquirer":"8.2.6","@types/yeoman-generator":"5.2.14","@vscode-logging/logger":"2.0.9",deepmerge:"4.3.1",i18next:"25.10.10",inquirer:"8.2.7","odata-query":"8.0.5","os-name":"4.0.1",rimraf:"6.1.3","xml-formatter":"3.7.0","yeoman-generator":"5.10.0"},engines:{node:">=22.x"}};var Yto="@sap-ux/odata-download-sub-generator",Xto="0a65e45d-6bf4-421d-b845-61e888c50e9e",Sl=class{static _telemetryData;static _sessionId;static async initTelemetrySettings(e){this._sessionId=(0,tZr.randomUUID)(),qr.logger.info(`Telemetry session initialized with ID: ${this._sessionId}`);let r={consumerModule:{name:Yto,version:eZr.version},watchTelemetrySettingStore:!1,internalFeature:!0,resourceId:Xto,...e};try{await g4(r)}catch(n){qr.logger.error(`Error initializing telemetry settings: ${n}`)}}static createTelemetryData(e){if(!this._telemetryData){let r=tr("telemetry.unknownOs");try{r=(0,rZr.default)()}catch{}this._telemetryData={Platform:kn()?"SBAS":"VSCode",OperatingSystem:r,SessionId:this._sessionId}}return this._telemetryData=Object.assign(this._telemetryData,e),this._telemetryData}static prepareTelemetryEvent(e,r){return{eventName:e,properties:r,measurements:{}}}static async sendTelemetry(e,r){let n=this.createTelemetryData(r),i=this.prepareTelemetryEvent(e,n);await Hf.getTelemetryClient().reportEvent(i,ho.NoSampling)}};var Jto=["eq","ne","gt","ge","lt","le"],qye=["and","or","not"],Qto=["any","all"],Zto=["startswith","endswith","contains","matchespattern"],ero=["expand","levels","select","skip","top","count","orderby","filter"],nZr=/\((.*)\)/,iZr=/(?!indexof)\((\w+)\)/;var Tb="";function set({select:t,search:e,skiptoken:r,format:n,top:i,skip:s,filter:o,transform:a,orderBy:c,key:u,count:l,expand:p,action:f,func:h}={}){let d="",m=[],_={};if(u!=null&&(d+=`(${U_(u,m)})`),(o||typeof l=="object")&&(_.$filter=jye(typeof l=="object"?l:o,m)),a&&(_.$apply=oZr(a)),p&&(_.$expand=Uye(p)),c&&(_.$orderby=oet(c)),l&&(typeof l=="boolean"?_.$count=!0:d+="/$count"),typeof i=="number"&&(_.$top=i),typeof s=="number"&&(_.$skip=s),f&&(d+=`/${f}`),h){if(typeof h=="string")d+=`/${h}`;else if(typeof h=="object"){let[b]=Object.keys(h),T=U_(h[b],m);d+=`/${b}`,T!==""&&(d+=`(${T})`)}}return m.length>0&&Object.assign(_,m.reduce((b,T)=>Object.assign(b,{[`@${T.name}`]:U_(T.value)}),{})),sro(d,{$select:t,$search:e,$skiptoken:r,$format:n,..._})}function iet(t,e,r=[]){return`${t} eq ${U_(e,r)}`}function jye(t={},e=[],r=""){return(Array.isArray(t)?t:[t]).reduce((s,o)=>{if(o){let a=n(o,e,r);a&&s.push(a)}return s},[]).join(" and ");function n(s={},o=[],a=""){let c="";return typeof s=="string"?c=s:s&&typeof s=="object"&&(c=Object.keys(s).reduce((u,l)=>{let p=s[l];if(p===void 0)return u;let f="";if(a?l===Tb?f=a:iZr.test(l)?f=l.replace(iZr,(h,d)=>d.trim()===Tb?`(${a})`:`(${a}/${d.trim()})`):nZr.test(l)?f=l.replace(nZr,(h,d)=>d.trim()===Tb?`(${a})`:`(${a}/${d.trim()})`):f=`${a}/${l}`:f=l,l===Tb&&Array.isArray(p))return u.concat(p.map(h=>iet(f,h)));if(["number","string","boolean"].indexOf(typeof p)!==-1||p instanceof Date||p===null)u.push(iet(f,p,o));else if(Array.isArray(p)){let h=l,d=p.map(m=>jye(m,o,a)).filter(m=>m).map(m=>qye.indexOf(h)!==-1?`(${m})`:m);d.length&&(qye.indexOf(h)!==-1?d.length&&(h==="not"?u.push(sZr(d)):u.push(`(${d.join(` ${h} `)})`)):u.push(d.join(` ${h} `)))}else if(qye.indexOf(f)!==-1){let h=f,d=Object.keys(p).map(m=>n({[m]:p[m]}));d.length&&(h==="not"?u.push(sZr(d)):u.push(`(${d.join(` ${h} `)})`))}else if(typeof p=="object")"type"in p?u.push(iet(f,p,o)):Object.keys(p).forEach(h=>{if(p[h]!==void 0)if(Jto.indexOf(h)!==-1)u.push(`${f} ${h} ${U_(p[h],o)}`);else if(qye.indexOf(h)!==-1)Array.isArray(p[h])?u.push(p[h].map(d=>"("+n(d,o,f)+")").join(` ${h} `)):u.push("("+n(p[h],o,f)+")");else if(Qto.indexOf(h)!==-1){let d=i(l.toLowerCase(),p[h],h,f);d&&u.push(d)}else if(h==="has")u.push(`${f} ${h} ${U_(p[h],o)}`);else if(h==="in"){let d=Array.isArray(p[h])?p[h]:p[h].value.map(m=>({type:p[h].type,value:m}));u.push(f+" in ("+d.map(m=>U_(m,o)).join(",")+")")}else if(Zto.indexOf(h)!==-1)u.push(`${h}(${f},${U_(p[h],o)})`);else{let d=n({[h]:p[h]},o,f);d&&u.push(d)}});else throw new Error(`Unexpected value type: ${p}`);return u},[]).join(" and ")),c}function i(s,o,a,c){let u="";if(typeof o=="string"||o instanceof String)u=tro(s,o,a,c);else if(o){let l=Array.isArray(o)?o.reduce((f,h)=>h.hasOwnProperty(Tb)?(f.hasOwnProperty(Tb)||(f[Tb]=[]),f[Tb].push(h[Tb]),f):{...f,...h},{}):o,p=n(l,e,s);u=`${c}/${a}(${p?`${s}:${p}`:""})`}return u}}function tro(t,e,r,n){let i=r=="all"?"ne":"eq";return`${n}/${r}(${t}: ${t} ${i} '${e}')`}function rro(t){return t=t.replace(/%/g,"%25"),t=t.replace(/\+/g,"%2B"),t=t.replace(/\//g,"%2F"),t=t.replace(/\?/g,"%3F"),t=t.replace(/#/g,"%23"),t=t.replace(/&/g,"%26"),t=t.replace(/'/g,"''"),t}function U_(t,e){if(typeof t=="string")return`'${rro(t)}'`;if(t instanceof Date)return t.toISOString();if(typeof t=="number")return t;if(Array.isArray(t))return`[${t.map(r=>U_(r)).join(",")}]`;if(t===null)return t;if(typeof t=="object")switch(t.type){case"raw":case"guid":return t.value;case"duration":return`duration'${t.value}'`;case"binary":return`binary'${t.value}'`;case"alias":return Array.isArray(e)&&e.push(t),`@${t.name}`;case"json":return escape(JSON.stringify(t.value));case"decimal":return`${t.value}M`;default:return Object.entries(t).filter(([,r])=>r!==void 0).map(([r,n])=>`${r}=${U_(n,e)}`).join(",")}return t}function Uye(t){if(typeof t=="number")return t;if(typeof t=="string")return t.indexOf("/")===-1?t:t.split("/").reverse().reduce((e,r,n,i)=>n===0?`$expand=${r}`:n===i.length-1?`${r}(${e})`:`$expand=${r}(${e})`,"");if(Array.isArray(t))return`${t.map(e=>Uye(e)).join(",")}`;if(typeof t=="object"){let e=Object.keys(t);return e.some(r=>ero.indexOf(r.toLowerCase())!==-1)?e.map(r=>{let n;switch(r){case"filter":n=jye(t[r]);break;case"orderBy":n=oet(t[r]);break;case"levels":case"count":case"skip":case"top":n=`${t[r]}`;break;default:n=Uye(t[r])}return`$${r.toLowerCase()}=${n}`}).join(";"):e.map(r=>{let n=Uye(t[r]);return n?`${r}(${n})`:r}).join(",")}return""}function oZr(t){return(Array.isArray(t)?t:[t]).reduce((e,r)=>{for(let n of Object.keys(r))switch(n){case"aggregate":{let i=r[n];i&&e.push(`aggregate(${nro(i)})`);break}case"filter":{let i=r[n];if(i){let s=jye(i);s&&e.push(`filter(${s})`)}break}case"groupBy":{let i=r[n];i&&e.push(`groupby(${iro(i)})`);break}default:throw new Error(`Unsupported transform: ${n}`)}return e},[]).join("/")||void 0}function nro(t){return(Array.isArray(t)?t:[t]).map(e=>typeof e=="string"?e:Object.keys(e).map(r=>{let n=e[r];if(!n.with&&n.as)return`${r} as ${n.as}`;if(!n.with)throw new Error(`'with' property required for '${r}'`);if(!n.as)throw new Error(`'as' property required for '${r}'`);return`${r} with ${n.with} as ${n.as}`})).join(",")}function iro(t){if(!t.properties)throw new Error("'properties' property required for groupBy");let e=`(${t.properties.join(",")})`;return t.transform&&(e+=`,${oZr(t.transform)}`),e}function oet(t,e=""){return Array.isArray(t)?t.map(r=>Array.isArray(r)&&r.length===2&&["asc","desc"].indexOf(r[1])!==-1?r.join(" "):r).map(r=>`${e}${String(r)}`).join(","):typeof t=="object"?Object.entries(t).map(([r,n])=>oet(n,`${r}/`)).map(r=>`${e}${r}`).join(","):`${e}${String(t)}`}function sro(t,e){let r=Object.getOwnPropertyNames(e).filter(n=>e[n]!==void 0&&e[n]!=="").map(n=>`${n}=${e[n]}`);return r.length?`${t}?${r.join("&")}`:t}function sZr(t){return`not (${t.join(" and ")})`}function oro(t){let e=[];return{expands:t.reduce((n,{entityPath:i})=>{let s=i.split("/"),o=n;return s.forEach((a,c)=>{o.expand||(o.expand={}),o.expand[a]??=c===s.length-1?{}:{expand:{}},o=o.expand[a],e.includes(a)||e.push(a)}),n},{expand:{}}),entityPathParts:e}}function aro(t,e,r=1,n){let i=e?.map(h=>({entityPath:h.fullPath,entitySetName:h.entity.entitySetName})),{expands:s,entityPathParts:o}=oro(i),a=o.map(h=>e.find(m=>h===m.entity.entityPath?m.entity.entitySetName:void 0)?.entity.entitySetName).filter(h=>h!==void 0);qr.logger.info(tr("info.entityFilesToBeGenerated",{entities:a.join(", ")}));let c=t;if(n){let h=[];c.semanticKeys.forEach(x=>{if(x.value!==void 0&&x.value!=="")if(x.type==="Edm.Boolean")h.push(`${x.name} eq ${x.value}`);else{let R=String(x.value).split(","),M=["Edm.UUID","Edm.Guid"].includes(x.type),O=F=>M?F.trim():`'${F.trim()}'`;if(R.length===1)h.push(`${x.name} eq ${O(R[0])}`);else{let F=R.map(V=>`${x.name} eq ${O(V)}`);h.push(`(${F.join(" or ")})`)}}});let d=h.length>0?`,filter(${h.join(" and ")})`:"",m=`$root/${c.entitySetName},${n.qualifier},${n.nodeProperty}`,_=`com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/${c.entitySetName},HierarchyQualifier='${n.qualifier}',NodeProperty='${n.nodeProperty}')`,b=n.isDraft?`$apply=ancestors(${m}${d},keep start)/${_}`:`$apply=${_}`,T=s?set(s):"",S=T?`&${T.substring(1)}`:"",A=`${c.entitySetName}?${b}${S}`;return qr.logger.debug(`Query for odata: ${A}`),{query:A}}let u=[];c.semanticKeys.forEach(h=>{if(h.value!==void 0&&h.value!=="")if(["Edm.UUID","Edm.Guid"].includes(h.type)){let m=String(h.value).split(",").map(_=>({[h.name]:{type:"guid",value:_.trim()}}));u.push(m.length===1?m[0]:{or:m})}else if(h.type==="Edm.Boolean")u.push({[h.name]:String(h.value)==="true"});else if(h.type==="Edm.String"){let d=String(h.value).split(","),m=[];d.forEach(_=>{let b=_.trim().split("-");b.length===1?m.push({[h.name]:_.trim()}):b.length===2&&m.push({[h.name]:{ge:b[0].trim(),le:b[1].trim()}})}),u.push(m.length==1?m[0]:{or:m})}else u.push({[h.name]:h.value})});let l={};s&&Object.assign(l,s),u.length>0?Object.assign(l,{filter:u.length===1?u[0]:u,count:!0}):r&&Object.assign(l,{top:r});let p=set(l),f=`${c.entitySetName}${p}`;return qr.logger.debug(`Query for odata: ${f}`),{query:f}}function cro(t,e,r){let n=new Set(["DraftUUID","IsActiveEntity"]),i=[];for(let p of t.semanticKeys){if(p.value===void 0||p.value===""||n.has(p.name))continue;let f=p.keyName??p.name,h=String(p.value).split(",")[0].trim(),d=["Edm.UUID","Edm.Guid"].includes(p.type),m=p.type==="Edm.Boolean";i.push(`${f}=${d||m?h:`'${h}'`}`)}if(i.length===0){qr.logger.debug(`buildNavPropHierarchyQuery: no key values available for '${t.entitySetName}', skipping nav-prop hierarchy query for '${e}'`);return}let s={DraftUUID:"00000000-0000-0000-0000-000000000000",IsActiveEntity:"true"};t.entityType?.keys?.filter(p=>p.name in s).forEach(p=>i.push(`${p.name}=${s[p.name]}`)),qr.logger.debug(`buildNavPropHierarchyQuery: key segment for '${t.entitySetName}': (${i.join(",")})`);let a=`${`${t.entitySetName}(${i.join(",")})`}/${e}`,u=`com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=${`$root/${a}`},HierarchyQualifier='${r.qualifier}',NodeProperty='${r.nodeProperty}')`,l=`${a}?$apply=${u}`;return qr.logger.debug(`Nav-prop hierarchy query: ${l}`),l}async function cZr(t,e,r,n,i,s=[]){let o=aro(t,r,n,i),a=await aZr(e,o.query);for(let c of s){let u=r.find(_=>_.entity.entitySetName===c.entitySetName);if(!u){qr.logger.debug(`fetchData: no selected entity matched hierarchy entity '${c.entitySetName}', skipping`);continue}let l=cro(t,u.entity.entityPath,c);if(!l){qr.logger.debug(`fetchData: could not build nav-prop hierarchy query for '${c.entitySetName}', skipping`);continue}let p=await aZr(e,l);if(!p.entityData||!a.entityData){qr.logger.debug(`fetchData: no data returned for nav-prop hierarchy query '${c.entitySetName}', skipping merge`);continue}qr.logger.debug(`fetchData: merging ${p.entityData.length} hierarchy records into '${u.entity.entityPath}' expanded items`);let f=u.entity.entityPath,h=c.nodeProperty.split("/")[0],d=p.entityData,m=0;for(let _ of a.entityData){let b=_[f];if(Array.isArray(b))for(let T of b){let S=d.find(A=>c.entityTypeKeys.every(x=>A[x]===T[x]));S&&(T[h]=S[h],m++)}}qr.logger.debug(`fetchData: patched '${h}' onto ${m} expanded '${f}' records`)}return{odataResult:a}}async function aZr(t,e){try{qr.logger.info(`OData query request: ${encodeURI(t.defaults.baseURL+e).replaceAll("'","%27")}`),qr.logger.debug(`OData query request headers: ${JSON.stringify(t.defaults.headers)}`);let r=await t.get(e),n=r?.data?.match(/"@odata\.count":(\d+)/)?.[1];return qr.logger.info(`OData query records count: ${n}`),{entityData:r?.odata()}}catch(r){let n=tr("errors.odataQueryError",{error:r});return qr.logger.error(n),{error:n}}}var Wp=class t{static externalServiceRequestCache={};static entityTypeRefFacetCache={};static resetExternalServiceCache(e){if(e){delete t.externalServiceRequestCache[e];return}t.externalServiceRequestCache={}}static resetRefFacetCache(){t.entityTypeRefFacetCache={}}static resetServiceCaches(){t.resetExternalServiceCache(),t.resetRefFacetCache()}};async function pZr(t,e,r){if(t.metadata&&e.appAccess&&t.connectedSystem&&t.servicePath&&e.appAccess&&e.referencedEntities){t.connectedSystem.serviceProvider.log=qr.logger;let n=t.connectedSystem?.serviceProvider.service(t.servicePath);if(n){let i=Date.now();Sl.sendTelemetry("ODATA_DOWNLOAD_SEND_QUERY",{time:Date()});let s=e.referencedEntities.hierarchyEntities?.find(c=>c.entitySetName===e.referencedEntities.listEntity.entitySetName),o=e.referencedEntities.hierarchyEntities?.filter(c=>c.entitySetName!==e.referencedEntities.listEntity.entitySetName&&r.some(u=>u.entity.entitySetName===c.entitySetName))??[],{odataResult:a}=await cZr(e.referencedEntities.listEntity,n,r,s?void 0:1,s,o);if(a.entityData)return Sl.sendTelemetry("ODATA_DOWNLOAD_RECEIVED_QUERY_RESULT",{duration:`${Date.now()-i} ms`,resultSize:`${a.entityData.length} rows`}),qr.logger.debug(`Got result rows: ${a.entityData.length}`),{odataQueryResult:a.entityData};if(a.error)return Sl.sendTelemetry("ODATA_DOWNLOAD_QUERY_ERRORED",{duration:`${Date.now()-i} ms`}),`${a.error}`}}return tr("errors.dataNotFetched")}function fZr(t){let e=[];return t.Facets.forEach(r=>{if(r.$Type==="com.sap.vocabularies.UI.v1.ReferenceFacet"&&r.Target.type==="AnnotationPath"){let n=r.Target.value;n.lastIndexOf("/")>-1&&e.push(n.substring(0,n.lastIndexOf("/")))}else r.$Type==="com.sap.vocabularies.UI.v1.CollectionFacet"&&e.push(...fZr(r))}),e}function uro(t){if(Wp.entityTypeRefFacetCache[t.name])return Wp.entityTypeRefFacetCache[t.name];let e=[];return t.annotations?.UI?.Facets?.forEach(r=>{if(r.$Type==="com.sap.vocabularies.UI.v1.ReferenceFacet"&&r.Target?.type==="AnnotationPath"){let n=r.Target.value;n?.lastIndexOf("/")>-1&&e.push(n.substring(0,n.lastIndexOf("/")))}r.$Type==="com.sap.vocabularies.UI.v1.CollectionFacet"&&e.push(...fZr(r))}),Wp.entityTypeRefFacetCache[t.name]=e,e??[]}function dZr(t,e="",r=[],n,i){let s={},o=t.navPropEntities;if(o&&o.length>0){let a=t.entityType?uro(t.entityType):[];for(let c of o){let u=c.entityPath,l=i??t;if(c.entityType?.name===l?.entityType?.name||e.includes(u))continue;let p=e.concat(`${e?"/":""}${u}`);c.navPropEntities&&c.navPropEntities.length>0&&Object.assign(s,dZr(c,p,r,n,i??t).entitySetsFlat);let f={fullPath:p,entity:{entityPath:c.entityPath,entitySetName:c.entitySetName,defaultSelected:a.includes(c.entityPath)||!!n?.includes(p)}},h=`${p}`;r||(r=[]),r.push({name:h,value:f,checked:f.entity.defaultSelected}),s[p]=c.entitySetName}}return{entitySetsFlat:s,choices:r}}function hZr(t,e){let r=e?.map(n=>{let i=n.page?.contextPath??n.page?.routePattern?.replace(":?query:","").replaceAll(/\(\{[^}]*\}\)/g,"");return i?.startsWith(`/${t.entityPath}/`)?i.replace(`/${t.entityPath}/`,""):i}).filter(n=>n!==void 0);if(t.navPropEntities){let n=dZr(t,void 0,void 0,r);return n.choices.sort((i,s)=>(i.name??"").localeCompare(s.name??"")),n}}async function mZr(t,e){let n=(await hu.newInstance(await(0,uZr.readFile)((0,lZr.join)(t,qt.Ui5Yaml),"utf-8"))).getBackendConfigsFromFioriToolsProxyMiddleware()[0],i;if(n){let s=n.url;if(n.connectPath){let o=n.connectPath.startsWith("/")?n.connectPath:`/${n.connectPath}`;s=new URL(o,n.url).href}i=kn()?n?.destination:await YQr(s,n?.client)}return{servicePath:e.uri,systemName:i}}async function gZr(t){let e=await i4(t.app.appRoot),r=e.getApiVersion(),n=typeof r?.version=="string"?Number.parseInt(r.version,10):0;return n<24?(qr.logger.debug(`@sap/ux-specification from module cache API version is: ${n}. API version '24' at least is required.`),tr("prompts.appSelection.validation.specficationApiVersionOutdated",{specApiVersion:n})):e}var yZr,lro=(...t)=>new Promise(e=>{clearTimeout(yZr),yZr=setTimeout(async()=>e(await pZr(...t)),1e3)}),Bh={appSelection:"appSelection",toggleSelection:"toggleSelection",relatedEntitySelection:"relatedEntitySelection",skipDataDownload:"skipDataDownload",updateMainServiceMetadata:"updateMainServiceMetadata"},pro=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,_Zr=["."];async function vZr(t,e,r){let n=!1;if(!r.referencedEntities?.listEntity.semanticKeys.every((a,c)=>(a.name!=="IsActiveEntity"&&!n&&(n=!!a.value),a.value!==void 0&&a.value!==""||!t[`entityKeyIdx:${c}`]))||!n)return tr("prompts.skipDataDownload.validation.keyRequired");let s=[];r.relatedEntityChoices?.choices?.length&&(s=t[Bh.relatedEntitySelection]);let o=await lro(e,r,s);return o}function fro(t){return Wp.resetServiceCaches(),t.appAccess=void 0,t.referencedEntities=void 0,t.servicePath=void 0,t.systemName&&(t.systemName.value=void 0),t.relatedEntityChoices.choices=[],t.relatedEntityChoices.entitySetsFlat={},t}async function EZr(t){let e=[],r={appAccess:void 0,referencedEntities:void 0,servicePath:void 0,systemName:{value:void 0},connectPath:{value:void 0},relatedEntityChoices:{choices:[],entitySetsFlat:{}}},n=[],i=dro(r,n,t?.appPath),s=await iYr({datasourceType:{includeNone:!1},systemSelection:{includeCloudFoundryAbapEnvChoice:!1,defaultChoice:r.systemName,connectPath:r.connectPath,hideNewSystem:!0},serviceSelection:{serviceFilter:n,requiredOdataVersion:Ps.v4}},Ad()!==gi.cli,qr.logger);s.prompts=Ya(s.prompts,()=>!!r.appAccess);let o={odata:[]},a=mro(r,r.relatedEntityChoices),c=gro(5,r,s.answers,o),u=hro(r.relatedEntityChoices,s.answers,r,o);return e.push(i,...s.prompts,_ro(s.answers,r),yro(s.answers,r),...c,a,u),{questions:e,answers:{application:r,odataQueryResult:o,odataServiceAnswers:s.answers}}}function dro(t,e,r){return{type:"input",guiType:"folder-browser",name:Bh.appSelection,message:tr("prompts.appSelection.message"),default:n=>r??n.appSelection??t.appAccess?.app.appRoot,guiOptions:{mandatory:!0,breadcrumb:tr("prompts.appSelection.breadcrumb")},validate:async n=>{if(!n)return!1;if(n===t.appAccess?.app.appRoot)return!0;e.length=0,fro(t);let i;try{i=await Kle(n)}catch(u){let l=u;return u instanceof Error&&(l=u.message),qr.logger.error(tr("prompts.appSelection.validation.selectedPathDoesNotContainValidApp",{error:l})),`${tr("prompts.appSelection.validation.selectedPathDoesNotContainValidApp")}${tr("texts.seeLogForDetails")}`}let s=i.app.services[i.app.mainService??"mainService"];if(!s?.odataVersion?.startsWith("4."))return tr("prompts.appSelection.validation.appMainServiceOdataVersionNotSupported",{serviceOdataVersion:s.odataVersion});let o=await gZr(i);if(typeof o=="string")return o;t.appAccess=i,t.specification=o;let{servicePath:a,systemName:c}=await mZr(i.app.appRoot,s);return a&&(t.servicePath=a,e.push(a)),t.systemName&&(t.systemName.value=c),t.connectPath&&(t.connectPath.value=a),!0}}}function hro(t,e,r,n){let i;return{when:async s=>t.choices.length>0,name:Bh.relatedEntitySelection,type:"checkbox",guiOptions:{applyDefaultWhenDirty:!0},message:tr("prompts.relatedEntitySelection.message"),choices:()=>t.choices,validate:async(s,o)=>{if(t.choices.forEach(a=>{a.disabled||(a.checked=s.some(c=>c.fullPath===a.value.fullPath))}),o&&!o[Bh.skipDataDownload]?.[0]){if(i=await vZr(o,e,r),typeof i=="string")return i;n.odata=i.odataQueryResult}return!0},additionalMessages:()=>{if(i&&typeof i!="string")return{message:tr("prompts.skipDataDownload.querySuccess",{count:i.odataQueryResult.length}),severity:aet.Severity.information}},showOutputTabLink:()=>({show:!!i,linkMessage:tr("prompts.relatedEntitySelection.openLogs")})}}function mro(t,e){let r,n,i;return{when:()=>{if((n!==t.systemName?.value||t.servicePath!==r)&&t.referencedEntities?.listEntity){let o=hZr(t.referencedEntities.listEntity,t.referencedEntities.pageObjectEntities);o&&(e.choices=o.choices,Object.assign(e.entitySetsFlat,o.entitySetsFlat)),r=t.servicePath,n=t.systemName?.value}return e.choices.length>0},name:Bh.toggleSelection,type:"confirm",message:tr("prompts.toggleSelection.message"),labelTrue:tr("prompts.toggleSelection.labelTrue"),labelFalse:tr("prompts.toggleSelection.labelFalse"),default:!1,validate:o=>(o!==i&&(e.choices.forEach(a=>{if(a.disabled)return;let c=a.value;a.checked=o===!1?c.entity.defaultSelected:!1}),i=o),!0)}}function gro(t,e,r,n){let i=[],s,o=0,a=c=>({when:async()=>{let u=e.referencedEntities?.listEntity.semanticKeys[c],l=!!u?.name&&u.name!=="IsActiveEntity";return l&&c>o&&(o=c),l},name:`entityKeyIdx:${c}`,message:()=>tr("prompts.entityKey.message",{keyName:`${e.referencedEntities?.listEntity.semanticKeys[c]?.name} (${e.referencedEntities?.listEntity.entitySetName})`}),type:"input",guiOptions:{hint:tr("prompts.entityKey.hint")},validate:async(u,l)=>{let p=e.referencedEntities?.listEntity.semanticKeys[c];if(p&&delete p.value,_Zr.includes(u))return tr("prompts.entityKey.validation.invalidKeyValueChars",{chars:_Zr.join()});if(u&&p)if(p.type==="Edm.Boolean")try{p.value=JSON.parse(u)}catch{return tr("prompts.entityKey.validation.invalidBooleanValue")}else if(["Edm.UUID","Edm.Guid"].includes(p.type)){let h=u.split(",");for(let d of h)if(!pro.test(d.trim()))return tr("prompts.entityKey.validation.invalidGuidValue");p.value=u.trim()}else p.value=u.trim();let f=u.split(",");if(p?.type&&!["Edm.UUID","Edm.Guid"].includes(p.type)){for(let h of f)if(h.split("-").length>2)return p&&delete p.value,tr("prompts.entityKey.validation.invalidRangeSpecified")}if(l&&!e.relatedEntityChoices?.choices?.length&&c===o&&!l[Bh.skipDataDownload]?.[0]&&e.referencedEntities?.listEntity.semanticKeys[c]?.name){if(s=await vZr(l,r,e),typeof s=="string")return s;n.odata=s.odataQueryResult}return!0}});for(let c=0;c<t;c++)i.push(a(c));return i}function yro(t,e){return{when:()=>!!t.metadata&&!!e.servicePath,name:Bh.skipDataDownload,type:"checkbox",message:tr("prompts.skipDataDownload.message"),guiOptions:{hint:tr("prompts.skipDataDownload.hint")},default:!1,choices:[{name:tr("prompts.skipDataDownload.choiceLabel"),value:"skipDownload",checked:!1}]}}function _ro(t,e){let r;return{when:async()=>e.appAccess&&e.specification&&t?.metadata?(r=await JQr(e.appAccess,e.specification,t.metadata),typeof r=="object"&&(e.referencedEntities=r),!0):!1,name:Bh.updateMainServiceMetadata,type:"confirm",message:tr("prompts.updateMainServiceMetadata.message"),default:!1,additionalMessages:async()=>{if(typeof r=="string")return{message:r,severity:aet.Severity.error}}}}function bZr(t){let e=[],r=n=>[{name:`${n.entitySetName}/${n.nodeProperty}/source`,type:"list",message:`Source: ${n.entitySetName} > ${n.missingReferentialConstraints?.navPropName}`,default:!1,choices:n.entityProperties.map(i=>({name:i,value:i}))},{name:`${n.entitySetName}/${n.nodeProperty}/target`,type:"list",message:`Target: ${n.entitySetName} > ${n.missingReferentialConstraints?.navPropName}`,default:!1,choices:n.entityProperties.map(i=>({name:i,value:i}))}];return t.forEach(n=>{!n.parentProperty&&n.missingReferentialConstraints?.navPropName&&e.push(...r(n))}),e}var xZr=Pe(LT()),PZr=Pe(kT());var OZr=Pe(wZr()),CZr=require("node:path");function RZr(t,e,r){Wp.resetExternalServiceCache();let n=Lro(t,e),i=[];return{questions:[{name:"valueHelpSelection",type:"checkbox",message:tr("prompts.valueHelpSelection.message"),choices:()=>n,validate:async o=>{if(!o||o.length===0)return Wp.resetExternalServiceCache(),!0;let a=await Iro(o,r),c=(0,OZr.default)(i,a);return i.length=0,i.push(...c),await Dro(i,r),!0}}],valueHelpData:i}}async function Dro(t,e){let r=[],n={transformResponse:s=>typeof s=="string"?JSON.parse(s):s},i=t.map(async s=>{let o=s,[a]=o.path.split(";");Wp.externalServiceRequestCache[a]??=[];let l=(0,xZr.convert)((0,PZr.parse)(s.metadata)).entitySets.map(async p=>{let f=p.name;if(Wp.externalServiceRequestCache[a].includes(f))return;Wp.externalServiceRequestCache[a].push(f);let h=await e.get((0,CZr.join)(o.path,f),n);o.entityData=o.entityData??[],o.entityData?.push({entitySetName:f,items:h.data.value})});await Promise.allSettled(l),o.entityData&&r.push(o)});return await Promise.allSettled(i),r}async function Iro(t,e){let r=t.flat();return await e.fetchExternalServices(r)}function Lro(t,e){let r=n8(t,e,[]),n={};for(let s of r)if(s.type==="value-list"){if(GQr.includes(s.target))continue;let[o]=s.value.split(";"),a=s.target.split("/").pop();a&&(n[o]??={},n[o][a]??=[],n[o][a].push(s))}else s.type==="code-list"&&(n[s.value]??={},n[s.value]["Code list"]??=[],n[s.value]["Code list"].push(s));let i=[];for(let s of Object.values(n))for(let[o,a]of Object.entries(s)){let c=a.map(u=>{if(u.type==="value-list")return u.target.replace(/\/[^/]*$/,"");if(u.type==="code-list"&&u.collectionPath)return u.collectionPath}).filter(u=>u!==void 0);i.push({name:`${o} (${c.join()})`,value:a})}return i.sort((s,o)=>s.name.localeCompare(o.name))}var qr=class t extends DZr.default{vscode;appWizard;static _logger=ufe;generatorVersion=this.rootGeneratorVersion();prompts;setPromptsCallback;state={};constructor(e,r){super(e,{...r,skipInstall:!0},{unique:"namespace"}),I7e(this.env,!0),this.options.force=!0,this.prompts=new Bye.Prompts([{description:tr("steps.odataDownloader.description"),name:tr("steps.odataDownloader.name")},{description:tr("steps.valueHelpSelection.description"),name:tr("steps.valueHelpSelection.name")}]),this.setPromptsCallback=n=>{this.prompts&&this.prompts.setCallback(n)},typeof r.appWizard?.setHeaderTitle=="function"&&r.appWizard.setHeaderTitle(tr("texts.generatorTitle"),`${this.rootGeneratorName()}@${this.rootGeneratorVersion()}`)}static get logger(){return t._logger}async initializing(){await lXe(),t._logger=this._configureLogging(this.options.logLevel,this.options.logger,this.options.vscode),await Sl.initTelemetrySettings(),Sl.sendTelemetry("ODATA_DOWNLOADER_STARTED",{startUpTime:Date()})}async prompting(){try{let{answers:{application:e,odataQueryResult:r,odataServiceAnswers:n},questions:i}=await EZr(this.options?.data),s=await this.prompt(i);if(this.state.entityOData=r.odata,this.state.entityPropertyToEntitySet=e.relatedEntityChoices.entitySetsFlat,this.state.appRootPath=e.appAccess?.getAppRoot(),this.state.mainServicePath=n.servicePath,this.state.mainServiceName=e.appAccess?.app.mainService,this.state.appEntities=e.referencedEntities,this.state.appRootPath){this.state.mockServerConfig=await jM(this.state.appRootPath);let o;this.state.mockServerConfig?.services&&(t.logger.debug(`Mock config: ${JSON.stringify(this.state.mockServerConfig)}`),o=this.state.mockServerConfig.services.find(a=>a.urlPath.replaceAll(/(^\/)|(\/$)/g,"")===this.state.mainServicePath?.replaceAll(/(^\/)|(\/$)/g,""))),this.state.mockDataRootPath=o?.mockdataPath??(0,pC.join)($s.Webapp,$s.LocalService,$s.Mockdata)}if(this.state.updateMainServiceMetadata=s[Bh.updateMainServiceMetadata],this.state.mainServiceMetadata=n.metadata,s[Bh.skipDataDownload]?.[0]||await this._promptMissingReferentialConstraints(e,s),n.servicePath&&n.metadata&&n.connectedSystem?.serviceProvider instanceof Hl){let{questions:o,valueHelpData:a}=RZr(n.servicePath,n.metadata,n.connectedSystem?.serviceProvider);await this.prompt(o),this.state.valueHelpData=a}}catch(e){t.logger.error(e),this._exitOnError(e)}}async writing(){if(this.state.appRootPath){if(this.state.entityOData&&this.state.entityPropertyToEntitySet&&this.state.appEntities)try{let e=Date.now();Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_DATA_FILES_START",{time:Date()}),this.destinationRoot((0,pC.join)(this.state.appRootPath));let r=net(this.state.entityOData,this.state.entityPropertyToEntitySet,this.state.appEntities.listEntity.entitySetName,this.state.appEntities.hierarchyEntities);t.logger.info(tr("info.entityFilesToBeGenerated",{entities:Object.keys(r).join(", ")}));let n=Object.entries(r);n.forEach(([i,s])=>{this.writeDestinationJSON((0,pC.join)(this.state.mockDataRootPath,`${i}.json`),s)}),this.state.appEntities.hierarchyEntities?.filter(i=>i.missingReferentialConstraints&&n.some(([s])=>s===i.entitySetName))?.forEach(i=>{let s=(0,pC.join)(this.state.mockDataRootPath,`${i.entitySetName}.js`),o=this.destinationPath(s),{navPropName:a,constraints:c}=i.missingReferentialConstraints;if(this.fs.exists(o)){let u=this.fs.read(o),l=ZQr(u,a,c);l!==u?(this.writeDestination(s,l),t.logger.info(`Updated referential constraint file: ${i.entitySetName}.js`)):t.logger.debug(`Referential constraint for '${a}' already present in ${i.entitySetName}.js \u2014 skipping`)}else{let u=QQr(a,c);this.writeDestination(s,u),t.logger.info(`Written referential constraint file: ${i.entitySetName}.js`)}}),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_DATA_FILES_END",{writeFileDuration:`${Date.now()-e} ms`,numberOfFiles:`${n.length}`})}catch(e){t.logger.error(e),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITING_DATA_ERROR",{writeFileErrorTime:Date()})}else t.logger.info(tr("info.noServiceEntityData"));if(this.state.valueHelpData?.length)try{let e=Date.now();Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_VALUE_HELP_FILES_START",{time:Date()});let r=(0,pC.join)(this.state.appRootPath,$s.Webapp);if(await Dfe(this.fs,r,this.state.valueHelpData,this.state.mainServiceName,this.state.mainServicePath),this.state.mockServerConfig){let n={webappPath:r,packageJsonConfig:{skip:!0},ui5MockYamlConfig:{overwrite:!0}};n.ui5MockYamlConfig&&this.state.mainServiceName&&(n.ui5MockYamlConfig.resolveExternalServiceReferences={[this.state.mainServiceName]:!0},await pfe(this.state.appRootPath,n,this.fs))}Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_VALUE_HELP_DATA_FILES_END",{writeFileDuration:`${Date.now()-e} ms`,numberOfExternalServices:`${this.state.valueHelpData.length}`})}catch(e){t.logger.error(e),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITING_BALUE_HELP_DATA_ERROR",{writeFileErrorTime:Date()})}else t.logger.info(tr("info.noValueHelpData"));if(this.state.updateMainServiceMetadata&&this.state.mainServiceMetadata&&this.state.mainServiceName){let e=(0,pC.join)(this.state.appRootPath,$s.Webapp,$s.LocalService,this.state.mainServiceName,"metadata.xml");this.writeDestination(e,(0,NZr.default)(this.state.mainServiceMetadata,{indentation:" ",lineSeparator:`
2347
+ ${s}${t.slice(o)}`:t}var uZr=require("node:fs/promises"),lZr=require("node:path");var tZr=require("node:crypto"),rZr=Pe(Lpe());var eZr={name:"@sap-ux/generator-odata-downloader",displayName:"Fiori Elements Data Downloader",description:"Yeoman generator that supports download of app data, typically for mock data server use.",version:"0.3.28",repository:{type:"git",url:"https://github.com/SAP/open-ux-tools.git",directory:"packages/generator-odata-downloader"},bugs:{url:"https://github.com/SAP/open-ux-tools/issues?q=is%3Aopen+is%3Aissue+label%3Abug+label%3Aodata-download"},license:"Apache-2.0",main:"generators/app/index.js",keywords:["yeoman-generator"],scripts:{build:"npm-run-all clean bundle:prod",compile:"tsc --build",clean:"rimraf --glob generators prebuilds test/test-output coverage *.tsbuildinfo",watch:"tsc --watch",lint:"eslint","lint:fix":"eslint --fix",test:"cross-env NODE_OPTIONS='--experimental-vm-modules' jest --ci --forceExit --detectOpenHandles --colors","test-u":"cross-env NODE_OPTIONS='--experimental-vm-modules' jest --ci --forceExit --detectOpenHandles --colors -u",link:"pnpm link --global",unlink:"pnpm unlink --global",bundle:"node esbuild.mjs","bundle:dev":"pnpm clean && node esbuild.mjs --development && pnpm pack","bundle:prod":"node esbuild.mjs --production"},files:["LICENSE","generators","!generators/*.map","!generators/**/*.map","prebuilds","yeoman.png"],devDependencies:{"@jest/globals":"30.4.1"},dependencies:{"@sap-devx/yeoman-ui-types":"1.25.0","@sap-ux/annotation-converter":"0.10.21","@sap-ux/axios-extension":"workspace:*","@sap-ux/btp-utils":"workspace:*","@sap-ux/edmx-parser":"0.10.0","@sap-ux/fiori-generator-shared":"workspace:*","@sap-ux/inquirer-common":"workspace:*","@sap-ux/logger":"workspace:*","@sap-ux/mockserver-config-writer":"workspace:*","@sap-ux/odata-service-inquirer":"workspace:*","@sap-ux/odata-service-writer":"workspace:*","@sap-ux/project-access":"workspace:*","@sap-ux/store":"workspace:*","@sap-ux/telemetry":"workspace:*","@sap-ux/ui5-config":"workspace:*","@sap-ux/vocabularies-types":"0.15.0","@sap/ux-specification":"1.144.5","@types/inquirer":"8.2.6","@types/yeoman-generator":"5.2.14","@vscode-logging/logger":"2.0.9",deepmerge:"4.3.1",i18next:"25.10.10",inquirer:"8.2.7","odata-query":"8.0.5","os-name":"4.0.1",rimraf:"6.1.3","xml-formatter":"3.7.0","yeoman-generator":"5.10.0"},engines:{node:">=22.x"}};var Yto="@sap-ux/odata-download-sub-generator",Xto="0a65e45d-6bf4-421d-b845-61e888c50e9e",Sl=class{static _telemetryData;static _sessionId;static async initTelemetrySettings(e){this._sessionId=(0,tZr.randomUUID)(),qr.logger.info(`Telemetry session initialized with ID: ${this._sessionId}`);let r={consumerModule:{name:Yto,version:eZr.version},watchTelemetrySettingStore:!1,internalFeature:!0,resourceId:Xto,...e};try{await g4(r)}catch(n){qr.logger.error(`Error initializing telemetry settings: ${n}`)}}static createTelemetryData(e){if(!this._telemetryData){let r=tr("telemetry.unknownOs");try{r=(0,rZr.default)()}catch{}this._telemetryData={Platform:kn()?"SBAS":"VSCode",OperatingSystem:r,SessionId:this._sessionId}}return this._telemetryData=Object.assign(this._telemetryData,e),this._telemetryData}static prepareTelemetryEvent(e,r){return{eventName:e,properties:r,measurements:{}}}static async sendTelemetry(e,r){let n=this.createTelemetryData(r),i=this.prepareTelemetryEvent(e,n);await Hf.getTelemetryClient().reportEvent(i,ho.NoSampling)}};var Jto=["eq","ne","gt","ge","lt","le"],qye=["and","or","not"],Qto=["any","all"],Zto=["startswith","endswith","contains","matchespattern"],ero=["expand","levels","select","skip","top","count","orderby","filter"],nZr=/\((.*)\)/,iZr=/(?!indexof)\((\w+)\)/;var Tb="";function set({select:t,search:e,skiptoken:r,format:n,top:i,skip:s,filter:o,transform:a,orderBy:c,key:u,count:l,expand:p,action:f,func:h}={}){let d="",m=[],_={};if(u!=null&&(d+=`(${U_(u,m)})`),(o||typeof l=="object")&&(_.$filter=jye(typeof l=="object"?l:o,m)),a&&(_.$apply=oZr(a)),p&&(_.$expand=Uye(p)),c&&(_.$orderby=oet(c)),l&&(typeof l=="boolean"?_.$count=!0:d+="/$count"),typeof i=="number"&&(_.$top=i),typeof s=="number"&&(_.$skip=s),f&&(d+=`/${f}`),h){if(typeof h=="string")d+=`/${h}`;else if(typeof h=="object"){let[b]=Object.keys(h),T=U_(h[b],m);d+=`/${b}`,T!==""&&(d+=`(${T})`)}}return m.length>0&&Object.assign(_,m.reduce((b,T)=>Object.assign(b,{[`@${T.name}`]:U_(T.value)}),{})),sro(d,{$select:t,$search:e,$skiptoken:r,$format:n,..._})}function iet(t,e,r=[]){return`${t} eq ${U_(e,r)}`}function jye(t={},e=[],r=""){return(Array.isArray(t)?t:[t]).reduce((s,o)=>{if(o){let a=n(o,e,r);a&&s.push(a)}return s},[]).join(" and ");function n(s={},o=[],a=""){let c="";return typeof s=="string"?c=s:s&&typeof s=="object"&&(c=Object.keys(s).reduce((u,l)=>{let p=s[l];if(p===void 0)return u;let f="";if(a?l===Tb?f=a:iZr.test(l)?f=l.replace(iZr,(h,d)=>d.trim()===Tb?`(${a})`:`(${a}/${d.trim()})`):nZr.test(l)?f=l.replace(nZr,(h,d)=>d.trim()===Tb?`(${a})`:`(${a}/${d.trim()})`):f=`${a}/${l}`:f=l,l===Tb&&Array.isArray(p))return u.concat(p.map(h=>iet(f,h)));if(["number","string","boolean"].indexOf(typeof p)!==-1||p instanceof Date||p===null)u.push(iet(f,p,o));else if(Array.isArray(p)){let h=l,d=p.map(m=>jye(m,o,a)).filter(m=>m).map(m=>qye.indexOf(h)!==-1?`(${m})`:m);d.length&&(qye.indexOf(h)!==-1?d.length&&(h==="not"?u.push(sZr(d)):u.push(`(${d.join(` ${h} `)})`)):u.push(d.join(` ${h} `)))}else if(qye.indexOf(f)!==-1){let h=f,d=Object.keys(p).map(m=>n({[m]:p[m]}));d.length&&(h==="not"?u.push(sZr(d)):u.push(`(${d.join(` ${h} `)})`))}else if(typeof p=="object")"type"in p?u.push(iet(f,p,o)):Object.keys(p).forEach(h=>{if(p[h]!==void 0)if(Jto.indexOf(h)!==-1)u.push(`${f} ${h} ${U_(p[h],o)}`);else if(qye.indexOf(h)!==-1)Array.isArray(p[h])?u.push(p[h].map(d=>"("+n(d,o,f)+")").join(` ${h} `)):u.push("("+n(p[h],o,f)+")");else if(Qto.indexOf(h)!==-1){let d=i(l.toLowerCase(),p[h],h,f);d&&u.push(d)}else if(h==="has")u.push(`${f} ${h} ${U_(p[h],o)}`);else if(h==="in"){let d=Array.isArray(p[h])?p[h]:p[h].value.map(m=>({type:p[h].type,value:m}));u.push(f+" in ("+d.map(m=>U_(m,o)).join(",")+")")}else if(Zto.indexOf(h)!==-1)u.push(`${h}(${f},${U_(p[h],o)})`);else{let d=n({[h]:p[h]},o,f);d&&u.push(d)}});else throw new Error(`Unexpected value type: ${p}`);return u},[]).join(" and ")),c}function i(s,o,a,c){let u="";if(typeof o=="string"||o instanceof String)u=tro(s,o,a,c);else if(o){let l=Array.isArray(o)?o.reduce((f,h)=>h.hasOwnProperty(Tb)?(f.hasOwnProperty(Tb)||(f[Tb]=[]),f[Tb].push(h[Tb]),f):{...f,...h},{}):o,p=n(l,e,s);u=`${c}/${a}(${p?`${s}:${p}`:""})`}return u}}function tro(t,e,r,n){let i=r=="all"?"ne":"eq";return`${n}/${r}(${t}: ${t} ${i} '${e}')`}function rro(t){return t=t.replace(/%/g,"%25"),t=t.replace(/\+/g,"%2B"),t=t.replace(/\//g,"%2F"),t=t.replace(/\?/g,"%3F"),t=t.replace(/#/g,"%23"),t=t.replace(/&/g,"%26"),t=t.replace(/'/g,"''"),t}function U_(t,e){if(typeof t=="string")return`'${rro(t)}'`;if(t instanceof Date)return t.toISOString();if(typeof t=="number")return t;if(Array.isArray(t))return`[${t.map(r=>U_(r)).join(",")}]`;if(t===null)return t;if(typeof t=="object")switch(t.type){case"raw":case"guid":return t.value;case"duration":return`duration'${t.value}'`;case"binary":return`binary'${t.value}'`;case"alias":return Array.isArray(e)&&e.push(t),`@${t.name}`;case"json":return escape(JSON.stringify(t.value));case"decimal":return`${t.value}M`;default:return Object.entries(t).filter(([,r])=>r!==void 0).map(([r,n])=>`${r}=${U_(n,e)}`).join(",")}return t}function Uye(t){if(typeof t=="number")return t;if(typeof t=="string")return t.indexOf("/")===-1?t:t.split("/").reverse().reduce((e,r,n,i)=>n===0?`$expand=${r}`:n===i.length-1?`${r}(${e})`:`$expand=${r}(${e})`,"");if(Array.isArray(t))return`${t.map(e=>Uye(e)).join(",")}`;if(typeof t=="object"){let e=Object.keys(t);return e.some(r=>ero.indexOf(r.toLowerCase())!==-1)?e.map(r=>{let n;switch(r){case"filter":n=jye(t[r]);break;case"orderBy":n=oet(t[r]);break;case"levels":case"count":case"skip":case"top":n=`${t[r]}`;break;default:n=Uye(t[r])}return`$${r.toLowerCase()}=${n}`}).join(";"):e.map(r=>{let n=Uye(t[r]);return n?`${r}(${n})`:r}).join(",")}return""}function oZr(t){return(Array.isArray(t)?t:[t]).reduce((e,r)=>{for(let n of Object.keys(r))switch(n){case"aggregate":{let i=r[n];i&&e.push(`aggregate(${nro(i)})`);break}case"filter":{let i=r[n];if(i){let s=jye(i);s&&e.push(`filter(${s})`)}break}case"groupBy":{let i=r[n];i&&e.push(`groupby(${iro(i)})`);break}default:throw new Error(`Unsupported transform: ${n}`)}return e},[]).join("/")||void 0}function nro(t){return(Array.isArray(t)?t:[t]).map(e=>typeof e=="string"?e:Object.keys(e).map(r=>{let n=e[r];if(!n.with&&n.as)return`${r} as ${n.as}`;if(!n.with)throw new Error(`'with' property required for '${r}'`);if(!n.as)throw new Error(`'as' property required for '${r}'`);return`${r} with ${n.with} as ${n.as}`})).join(",")}function iro(t){if(!t.properties)throw new Error("'properties' property required for groupBy");let e=`(${t.properties.join(",")})`;return t.transform&&(e+=`,${oZr(t.transform)}`),e}function oet(t,e=""){return Array.isArray(t)?t.map(r=>Array.isArray(r)&&r.length===2&&["asc","desc"].indexOf(r[1])!==-1?r.join(" "):r).map(r=>`${e}${String(r)}`).join(","):typeof t=="object"?Object.entries(t).map(([r,n])=>oet(n,`${r}/`)).map(r=>`${e}${r}`).join(","):`${e}${String(t)}`}function sro(t,e){let r=Object.getOwnPropertyNames(e).filter(n=>e[n]!==void 0&&e[n]!=="").map(n=>`${n}=${e[n]}`);return r.length?`${t}?${r.join("&")}`:t}function sZr(t){return`not (${t.join(" and ")})`}function oro(t){let e=[];return{expands:t.reduce((n,{entityPath:i})=>{let s=i.split("/"),o=n;return s.forEach((a,c)=>{o.expand||(o.expand={}),o.expand[a]??=c===s.length-1?{}:{expand:{}},o=o.expand[a],e.includes(a)||e.push(a)}),n},{expand:{}}),entityPathParts:e}}function aro(t,e,r=1,n){let i=e?.map(h=>({entityPath:h.fullPath,entitySetName:h.entity.entitySetName})),{expands:s,entityPathParts:o}=oro(i),a=o.map(h=>e.find(m=>h===m.entity.entityPath?m.entity.entitySetName:void 0)?.entity.entitySetName).filter(h=>h!==void 0);qr.logger.info(tr("info.entityFilesToBeGenerated",{entities:a.join(", ")}));let c=t;if(n){let h=[];c.semanticKeys.forEach(x=>{if(x.value!==void 0&&x.value!=="")if(x.type==="Edm.Boolean")h.push(`${x.name} eq ${x.value}`);else{let R=String(x.value).split(","),M=["Edm.UUID","Edm.Guid"].includes(x.type),O=F=>M?F.trim():`'${F.trim()}'`;if(R.length===1)h.push(`${x.name} eq ${O(R[0])}`);else{let F=R.map(V=>`${x.name} eq ${O(V)}`);h.push(`(${F.join(" or ")})`)}}});let d=h.length>0?`,filter(${h.join(" and ")})`:"",m=`$root/${c.entitySetName},${n.qualifier},${n.nodeProperty}`,_=`com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=$root/${c.entitySetName},HierarchyQualifier='${n.qualifier}',NodeProperty='${n.nodeProperty}')`,b=n.isDraft?`$apply=ancestors(${m}${d},keep start)/${_}`:`$apply=${_}`,T=s?set(s):"",S=T?`&${T.substring(1)}`:"",A=`${c.entitySetName}?${b}${S}`;return qr.logger.debug(`Query for odata: ${A}`),{query:A}}let u=[];c.semanticKeys.forEach(h=>{if(h.value!==void 0&&h.value!=="")if(["Edm.UUID","Edm.Guid"].includes(h.type)){let m=String(h.value).split(",").map(_=>({[h.name]:{type:"guid",value:_.trim()}}));u.push(m.length===1?m[0]:{or:m})}else if(h.type==="Edm.Boolean")u.push({[h.name]:String(h.value)==="true"});else if(h.type==="Edm.String"){let d=String(h.value).split(","),m=[];d.forEach(_=>{let b=_.trim().split("-");b.length===1?m.push({[h.name]:_.trim()}):b.length===2&&m.push({[h.name]:{ge:b[0].trim(),le:b[1].trim()}})}),u.push(m.length==1?m[0]:{or:m})}else u.push({[h.name]:h.value})});let l={};s&&Object.assign(l,s),u.length>0?Object.assign(l,{filter:u.length===1?u[0]:u,count:!0}):r&&Object.assign(l,{top:r});let p=set(l),f=`${c.entitySetName}${p}`;return qr.logger.debug(`Query for odata: ${f}`),{query:f}}function cro(t,e,r){let n=new Set(["DraftUUID","IsActiveEntity"]),i=[];for(let p of t.semanticKeys){if(p.value===void 0||p.value===""||n.has(p.name))continue;let f=p.keyName??p.name,h=String(p.value).split(",")[0].trim(),d=["Edm.UUID","Edm.Guid"].includes(p.type),m=p.type==="Edm.Boolean";i.push(`${f}=${d||m?h:`'${h}'`}`)}if(i.length===0){qr.logger.debug(`buildNavPropHierarchyQuery: no key values available for '${t.entitySetName}', skipping nav-prop hierarchy query for '${e}'`);return}let s={DraftUUID:"00000000-0000-0000-0000-000000000000",IsActiveEntity:"true"};t.entityType?.keys?.filter(p=>p.name in s).forEach(p=>i.push(`${p.name}=${s[p.name]}`)),qr.logger.debug(`buildNavPropHierarchyQuery: key segment for '${t.entitySetName}': (${i.join(",")})`);let a=`${`${t.entitySetName}(${i.join(",")})`}/${e}`,u=`com.sap.vocabularies.Hierarchy.v1.TopLevels(HierarchyNodes=${`$root/${a}`},HierarchyQualifier='${r.qualifier}',NodeProperty='${r.nodeProperty}')`,l=`${a}?$apply=${u}`;return qr.logger.debug(`Nav-prop hierarchy query: ${l}`),l}async function cZr(t,e,r,n,i,s=[]){let o=aro(t,r,n,i),a=await aZr(e,o.query);for(let c of s){let u=r.find(_=>_.entity.entitySetName===c.entitySetName);if(!u){qr.logger.debug(`fetchData: no selected entity matched hierarchy entity '${c.entitySetName}', skipping`);continue}let l=cro(t,u.entity.entityPath,c);if(!l){qr.logger.debug(`fetchData: could not build nav-prop hierarchy query for '${c.entitySetName}', skipping`);continue}let p=await aZr(e,l);if(!p.entityData||!a.entityData){qr.logger.debug(`fetchData: no data returned for nav-prop hierarchy query '${c.entitySetName}', skipping merge`);continue}qr.logger.debug(`fetchData: merging ${p.entityData.length} hierarchy records into '${u.entity.entityPath}' expanded items`);let f=u.entity.entityPath,h=c.nodeProperty.split("/")[0],d=p.entityData,m=0;for(let _ of a.entityData){let b=_[f];if(Array.isArray(b))for(let T of b){let S=d.find(A=>c.entityTypeKeys.every(x=>A[x]===T[x]));S&&(T[h]=S[h],m++)}}qr.logger.debug(`fetchData: patched '${h}' onto ${m} expanded '${f}' records`)}return{odataResult:a}}async function aZr(t,e){try{qr.logger.info(`OData query request: ${encodeURI(t.defaults.baseURL+e).replaceAll("'","%27")}`),qr.logger.debug(`OData query request headers: ${JSON.stringify(t.defaults.headers)}`);let r=await t.get(e),n=r?.data?.match(/"@odata\.count":(\d+)/)?.[1];return qr.logger.info(`OData query records count: ${n}`),{entityData:r?.odata()}}catch(r){let n=tr("errors.odataQueryError",{error:r});return qr.logger.error(n),{error:n}}}var Wp=class t{static externalServiceRequestCache={};static entityTypeRefFacetCache={};static resetExternalServiceCache(e){if(e){delete t.externalServiceRequestCache[e];return}t.externalServiceRequestCache={}}static resetRefFacetCache(){t.entityTypeRefFacetCache={}}static resetServiceCaches(){t.resetExternalServiceCache(),t.resetRefFacetCache()}};async function pZr(t,e,r){if(t.metadata&&e.appAccess&&t.connectedSystem&&t.servicePath&&e.appAccess&&e.referencedEntities){t.connectedSystem.serviceProvider.log=qr.logger;let n=t.connectedSystem?.serviceProvider.service(t.servicePath);if(n){let i=Date.now();Sl.sendTelemetry("ODATA_DOWNLOAD_SEND_QUERY",{time:Date()});let s=e.referencedEntities.hierarchyEntities?.find(c=>c.entitySetName===e.referencedEntities.listEntity.entitySetName),o=e.referencedEntities.hierarchyEntities?.filter(c=>c.entitySetName!==e.referencedEntities.listEntity.entitySetName&&r.some(u=>u.entity.entitySetName===c.entitySetName))??[],{odataResult:a}=await cZr(e.referencedEntities.listEntity,n,r,s?void 0:1,s,o);if(a.entityData)return Sl.sendTelemetry("ODATA_DOWNLOAD_RECEIVED_QUERY_RESULT",{duration:`${Date.now()-i} ms`,resultSize:`${a.entityData.length} rows`}),qr.logger.debug(`Got result rows: ${a.entityData.length}`),{odataQueryResult:a.entityData};if(a.error)return Sl.sendTelemetry("ODATA_DOWNLOAD_QUERY_ERRORED",{duration:`${Date.now()-i} ms`}),`${a.error}`}}return tr("errors.dataNotFetched")}function fZr(t){let e=[];return t.Facets.forEach(r=>{if(r.$Type==="com.sap.vocabularies.UI.v1.ReferenceFacet"&&r.Target.type==="AnnotationPath"){let n=r.Target.value;n.lastIndexOf("/")>-1&&e.push(n.substring(0,n.lastIndexOf("/")))}else r.$Type==="com.sap.vocabularies.UI.v1.CollectionFacet"&&e.push(...fZr(r))}),e}function uro(t){if(Wp.entityTypeRefFacetCache[t.name])return Wp.entityTypeRefFacetCache[t.name];let e=[];return t.annotations?.UI?.Facets?.forEach(r=>{if(r.$Type==="com.sap.vocabularies.UI.v1.ReferenceFacet"&&r.Target?.type==="AnnotationPath"){let n=r.Target.value;n?.lastIndexOf("/")>-1&&e.push(n.substring(0,n.lastIndexOf("/")))}r.$Type==="com.sap.vocabularies.UI.v1.CollectionFacet"&&e.push(...fZr(r))}),Wp.entityTypeRefFacetCache[t.name]=e,e??[]}function dZr(t,e="",r=[],n,i){let s={},o=t.navPropEntities;if(o&&o.length>0){let a=t.entityType?uro(t.entityType):[];for(let c of o){let u=c.entityPath,l=i??t;if(c.entityType?.name===l?.entityType?.name||e.includes(u))continue;let p=e.concat(`${e?"/":""}${u}`);c.navPropEntities&&c.navPropEntities.length>0&&Object.assign(s,dZr(c,p,r,n,i??t).entitySetsFlat);let f={fullPath:p,entity:{entityPath:c.entityPath,entitySetName:c.entitySetName,defaultSelected:a.includes(c.entityPath)||!!n?.includes(p)}},h=`${p}`;r||(r=[]),r.push({name:h,value:f,checked:f.entity.defaultSelected}),s[p]=c.entitySetName}}return{entitySetsFlat:s,choices:r}}function hZr(t,e){let r=e?.map(n=>{let i=n.page?.contextPath??n.page?.routePattern?.replace(":?query:","").replaceAll(/\(\{[^}]*\}\)/g,"");return i?.startsWith(`/${t.entityPath}/`)?i.replace(`/${t.entityPath}/`,""):i}).filter(n=>n!==void 0);if(t.navPropEntities){let n=dZr(t,void 0,void 0,r);return n.choices.sort((i,s)=>(i.name??"").localeCompare(s.name??"")),n}}async function mZr(t,e){let n=(await hu.newInstance(await(0,uZr.readFile)((0,lZr.join)(t,qt.Ui5Yaml),"utf-8"))).getBackendConfigsFromFioriToolsProxyMiddleware()[0],i;if(n){let s=n.url;if(n.connectPath){let o=n.connectPath.startsWith("/")?n.connectPath:`/${n.connectPath}`;s=new URL(o,n.url).href}i=kn()?n?.destination:await YQr(s,n?.client)}return{servicePath:e.uri,systemName:i}}async function gZr(t){let e=await i4(t.app.appRoot),r=e.getApiVersion(),n=typeof r?.version=="string"?Number.parseInt(r.version,10):0;return n<24?(qr.logger.debug(`@sap/ux-specification from module cache API version is: ${n}. API version '24' at least is required.`),tr("prompts.appSelection.validation.specficationApiVersionOutdated",{specApiVersion:n})):e}var yZr,lro=(...t)=>new Promise(e=>{clearTimeout(yZr),yZr=setTimeout(async()=>e(await pZr(...t)),1e3)}),Bh={appSelection:"appSelection",toggleSelection:"toggleSelection",relatedEntitySelection:"relatedEntitySelection",skipDataDownload:"skipDataDownload",updateMainServiceMetadata:"updateMainServiceMetadata"},pro=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,_Zr=["."];async function vZr(t,e,r){let n=!1;if(!r.referencedEntities?.listEntity.semanticKeys.every((a,c)=>(a.name!=="IsActiveEntity"&&!n&&(n=!!a.value),a.value!==void 0&&a.value!==""||!t[`entityKeyIdx:${c}`]))||!n)return tr("prompts.skipDataDownload.validation.keyRequired");let s=[];r.relatedEntityChoices?.choices?.length&&(s=t[Bh.relatedEntitySelection]);let o=await lro(e,r,s);return o}function fro(t){return Wp.resetServiceCaches(),t.appAccess=void 0,t.referencedEntities=void 0,t.servicePath=void 0,t.systemName&&(t.systemName.value=void 0),t.relatedEntityChoices.choices=[],t.relatedEntityChoices.entitySetsFlat={},t}async function EZr(t){let e=[],r={appAccess:void 0,referencedEntities:void 0,servicePath:void 0,systemName:{value:void 0},connectPath:{value:void 0},relatedEntityChoices:{choices:[],entitySetsFlat:{}}},n=[],i=dro(r,n,t?.appPath),s=await iYr({datasourceType:{includeNone:!1},systemSelection:{includeCloudFoundryAbapEnvChoice:!1,defaultChoice:r.systemName,connectPath:r.connectPath,hideNewSystem:!0},serviceSelection:{serviceFilter:n,requiredOdataVersion:Ps.v4}},Ad()!==gi.cli,qr.logger);s.prompts=Ya(s.prompts,()=>!!r.appAccess);let o={odata:[]},a=mro(r,r.relatedEntityChoices),c=gro(5,r,s.answers,o),u=hro(r.relatedEntityChoices,s.answers,r,o);return e.push(i,...s.prompts,_ro(s.answers,r),yro(s.answers,r),...c,a,u),{questions:e,answers:{application:r,odataQueryResult:o,odataServiceAnswers:s.answers}}}function dro(t,e,r){return{type:"input",guiType:"folder-browser",name:Bh.appSelection,message:tr("prompts.appSelection.message"),default:n=>r??n.appSelection??t.appAccess?.app.appRoot,guiOptions:{mandatory:!0,breadcrumb:tr("prompts.appSelection.breadcrumb")},validate:async n=>{if(!n)return!1;if(n===t.appAccess?.app.appRoot)return!0;e.length=0,fro(t);let i;try{i=await Kle(n)}catch(u){let l=u;return u instanceof Error&&(l=u.message),qr.logger.error(tr("prompts.appSelection.validation.selectedPathDoesNotContainValidApp",{error:l})),`${tr("prompts.appSelection.validation.selectedPathDoesNotContainValidApp")}${tr("texts.seeLogForDetails")}`}let s=i.app.services[i.app.mainService??"mainService"];if(!s?.odataVersion?.startsWith("4."))return tr("prompts.appSelection.validation.appMainServiceOdataVersionNotSupported",{serviceOdataVersion:s.odataVersion});let o=await gZr(i);if(typeof o=="string")return o;t.appAccess=i,t.specification=o;let{servicePath:a,systemName:c}=await mZr(i.app.appRoot,s);return a&&(t.servicePath=a,e.push(a)),t.systemName&&(t.systemName.value=c),t.connectPath&&(t.connectPath.value=a),!0}}}function hro(t,e,r,n){let i;return{when:async s=>t.choices.length>0,name:Bh.relatedEntitySelection,type:"checkbox",guiOptions:{applyDefaultWhenDirty:!0},message:tr("prompts.relatedEntitySelection.message"),choices:()=>t.choices,validate:async(s,o)=>{if(t.choices.forEach(a=>{a.disabled||(a.checked=s.some(c=>c.fullPath===a.value.fullPath))}),o&&!o[Bh.skipDataDownload]?.[0]){if(i=await vZr(o,e,r),typeof i=="string")return i;n.odata=i.odataQueryResult}return!0},additionalMessages:()=>{if(i&&typeof i!="string")return{message:tr("prompts.skipDataDownload.querySuccess",{count:i.odataQueryResult.length}),severity:aet.Severity.information}},showOutputTabLink:()=>({show:!!i,linkMessage:tr("prompts.relatedEntitySelection.openLogs")})}}function mro(t,e){let r,n,i;return{when:()=>{if((n!==t.systemName?.value||t.servicePath!==r)&&t.referencedEntities?.listEntity){let o=hZr(t.referencedEntities.listEntity,t.referencedEntities.pageObjectEntities);o&&(e.choices=o.choices,Object.assign(e.entitySetsFlat,o.entitySetsFlat)),r=t.servicePath,n=t.systemName?.value}return e.choices.length>0},name:Bh.toggleSelection,type:"confirm",message:tr("prompts.toggleSelection.message"),labelTrue:tr("prompts.toggleSelection.labelTrue"),labelFalse:tr("prompts.toggleSelection.labelFalse"),default:!1,validate:o=>(o!==i&&(e.choices.forEach(a=>{if(a.disabled)return;let c=a.value;a.checked=o===!1?c.entity.defaultSelected:!1}),i=o),!0)}}function gro(t,e,r,n){let i=[],s,o=0,a=c=>({when:async()=>{let u=e.referencedEntities?.listEntity.semanticKeys[c],l=!!u?.name&&u.name!=="IsActiveEntity";return l&&c>o&&(o=c),l},name:`entityKeyIdx:${c}`,message:()=>tr("prompts.entityKey.message",{keyName:`${e.referencedEntities?.listEntity.semanticKeys[c]?.name} (${e.referencedEntities?.listEntity.entitySetName})`}),type:"input",guiOptions:{hint:tr("prompts.entityKey.hint")},validate:async(u,l)=>{let p=e.referencedEntities?.listEntity.semanticKeys[c];if(p&&delete p.value,_Zr.includes(u))return tr("prompts.entityKey.validation.invalidKeyValueChars",{chars:_Zr.join()});if(u&&p)if(p.type==="Edm.Boolean")try{p.value=JSON.parse(u)}catch{return tr("prompts.entityKey.validation.invalidBooleanValue")}else if(["Edm.UUID","Edm.Guid"].includes(p.type)){let h=u.split(",");for(let d of h)if(!pro.test(d.trim()))return tr("prompts.entityKey.validation.invalidGuidValue");p.value=u.trim()}else p.value=u.trim();let f=u.split(",");if(p?.type&&!["Edm.UUID","Edm.Guid"].includes(p.type)){for(let h of f)if(h.split("-").length>2)return p&&delete p.value,tr("prompts.entityKey.validation.invalidRangeSpecified")}if(l&&!e.relatedEntityChoices?.choices?.length&&c===o&&!l[Bh.skipDataDownload]?.[0]&&e.referencedEntities?.listEntity.semanticKeys[c]?.name){if(s=await vZr(l,r,e),typeof s=="string")return s;n.odata=s.odataQueryResult}return!0}});for(let c=0;c<t;c++)i.push(a(c));return i}function yro(t,e){return{when:()=>!!t.metadata&&!!e.servicePath,name:Bh.skipDataDownload,type:"checkbox",message:tr("prompts.skipDataDownload.message"),guiOptions:{hint:tr("prompts.skipDataDownload.hint")},default:!1,choices:[{name:tr("prompts.skipDataDownload.choiceLabel"),value:"skipDownload",checked:!1}]}}function _ro(t,e){let r;return{when:async()=>e.appAccess&&e.specification&&t?.metadata?(r=await JQr(e.appAccess,e.specification,t.metadata),typeof r=="object"&&(e.referencedEntities=r),!0):!1,name:Bh.updateMainServiceMetadata,type:"confirm",message:tr("prompts.updateMainServiceMetadata.message"),default:!1,additionalMessages:async()=>{if(typeof r=="string")return{message:r,severity:aet.Severity.error}}}}function bZr(t){let e=[],r=n=>[{name:`${n.entitySetName}/${n.nodeProperty}/source`,type:"list",message:`Source: ${n.entitySetName} > ${n.missingReferentialConstraints?.navPropName}`,default:!1,choices:n.entityProperties.map(i=>({name:i,value:i}))},{name:`${n.entitySetName}/${n.nodeProperty}/target`,type:"list",message:`Target: ${n.entitySetName} > ${n.missingReferentialConstraints?.navPropName}`,default:!1,choices:n.entityProperties.map(i=>({name:i,value:i}))}];return t.forEach(n=>{!n.parentProperty&&n.missingReferentialConstraints?.navPropName&&e.push(...r(n))}),e}var xZr=Pe(LT()),PZr=Pe(kT());var OZr=Pe(wZr()),CZr=require("node:path");function RZr(t,e,r){Wp.resetExternalServiceCache();let n=Lro(t,e),i=[];return{questions:[{name:"valueHelpSelection",type:"checkbox",message:tr("prompts.valueHelpSelection.message"),choices:()=>n,validate:async o=>{if(!o||o.length===0)return Wp.resetExternalServiceCache(),!0;let a=await Iro(o,r),c=(0,OZr.default)(i,a);return i.length=0,i.push(...c),await Dro(i,r),!0}}],valueHelpData:i}}async function Dro(t,e){let r=[],n={transformResponse:s=>typeof s=="string"?JSON.parse(s):s},i=t.map(async s=>{let o=s,[a]=o.path.split(";");Wp.externalServiceRequestCache[a]??=[];let l=(0,xZr.convert)((0,PZr.parse)(s.metadata)).entitySets.map(async p=>{let f=p.name;if(Wp.externalServiceRequestCache[a].includes(f))return;Wp.externalServiceRequestCache[a].push(f);let h=await e.get((0,CZr.join)(o.path,f),n);o.entityData=o.entityData??[],o.entityData?.push({entitySetName:f,items:h.data.value})});await Promise.allSettled(l),o.entityData&&r.push(o)});return await Promise.allSettled(i),r}async function Iro(t,e){let r=t.flat();return await e.fetchExternalServices(r)}function Lro(t,e){let r=n8(t,e,[]),n={};for(let s of r)if(s.type==="value-list"){if(GQr.includes(s.target))continue;let[o]=s.value.split(";"),a=s.target.split("/").pop();a&&(n[o]??={},n[o][a]??=[],n[o][a].push(s))}else s.type==="code-list"&&(n[s.value]??={},n[s.value]["Code list"]??=[],n[s.value]["Code list"].push(s));let i=[];for(let s of Object.values(n))for(let[o,a]of Object.entries(s)){let c=a.map(u=>{if(u.type==="value-list")return u.target.replace(/\/[^/]*$/,"");if(u.type==="code-list"&&u.collectionPath)return u.collectionPath}).filter(u=>u!==void 0);i.push({name:`${o} (${c.join()})`,value:a})}return i.sort((s,o)=>s.name.localeCompare(o.name))}var qr=class t extends DZr.default{vscode;appWizard;static _logger=ufe;generatorVersion=this.rootGeneratorVersion();prompts;setPromptsCallback;state={};constructor(e,r){super(e,{...r,skipInstall:!0},{unique:"namespace"}),I7e(this.env,!0),this.options.force=!0,this.prompts=new Bye.Prompts([{description:tr("steps.odataDownloader.description"),name:tr("steps.odataDownloader.name")},{description:tr("steps.valueHelpSelection.description"),name:tr("steps.valueHelpSelection.name")}]),this.setPromptsCallback=n=>{this.prompts&&this.prompts.setCallback(n)},typeof r.appWizard?.setHeaderTitle=="function"&&r.appWizard.setHeaderTitle(tr("texts.generatorTitle"),`${this.rootGeneratorName()}@${this.rootGeneratorVersion()}`)}static get logger(){return t._logger}async initializing(){await lXe(),t._logger=this._configureLogging(this.options.logLevel,this.options.logger,this.options.vscode),await Sl.initTelemetrySettings(),Sl.sendTelemetry("ODATA_DOWNLOADER_STARTED",{startUpTime:Date()})}async prompting(){try{let{answers:{application:e,odataQueryResult:r,odataServiceAnswers:n},questions:i}=await EZr(this.options?.data),s=await this.prompt(i);if(this.state.entityOData=r.odata,this.state.entityPropertyToEntitySet=e.relatedEntityChoices.entitySetsFlat,this.state.appRootPath=e.appAccess?.getAppRoot(),this.state.mainServicePath=n.servicePath,this.state.mainServiceName=e.appAccess?.app.mainService,this.state.appEntities=e.referencedEntities,this.state.appRootPath){this.state.mockServerConfig=await jM(this.state.appRootPath);let o;this.state.mockServerConfig?.services&&(t.logger.debug(`Mock config: ${JSON.stringify(this.state.mockServerConfig)}`),o=this.state.mockServerConfig.services.find(a=>a.urlPath.replaceAll(/(^\/)|(\/$)/g,"")===this.state.mainServicePath?.replaceAll(/(^\/)|(\/$)/g,""))),this.state.mockDataRootPath=o?.mockdataPath??(0,pC.join)($s.Webapp,$s.LocalService,$s.Mockdata)}if(this.state.updateMainServiceMetadata=s[Bh.updateMainServiceMetadata],this.state.mainServiceMetadata=n.metadata,s[Bh.skipDataDownload]?.[0]||await this._promptMissingReferentialConstraints(e,s),n.servicePath&&n.metadata&&n.connectedSystem?.serviceProvider instanceof Hl){let{questions:o,valueHelpData:a}=RZr(n.servicePath,n.metadata,n.connectedSystem?.serviceProvider);await this.prompt(o),this.state.valueHelpData=a}}catch(e){t.logger.error(e),this._exitOnError(e)}}async writing(){if(this.state.appRootPath){if(this.state.entityOData&&this.state.entityPropertyToEntitySet&&this.state.appEntities)try{let e=Date.now();Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_DATA_FILES_START",{time:Date()}),this.destinationRoot((0,pC.join)(this.state.appRootPath));let r=net(this.state.entityOData,this.state.entityPropertyToEntitySet,this.state.appEntities.listEntity.entitySetName,this.state.appEntities.hierarchyEntities);t.logger.info(tr("info.entityFilesToBeGenerated",{entities:Object.keys(r).join(", ")}));let n=Object.entries(r);n.forEach(([i,s])=>{this.writeDestinationJSON((0,pC.join)(this.state.mockDataRootPath,`${i}.json`),s)}),this.state.appEntities.hierarchyEntities?.filter(i=>i.missingReferentialConstraints&&n.some(([s])=>s===i.entitySetName))?.forEach(i=>{let s=(0,pC.join)(this.state.mockDataRootPath,`${i.entitySetName}.js`),o=this.destinationPath(s),{navPropName:a,constraints:c}=i.missingReferentialConstraints;if(this.fs.exists(o)){let u=this.fs.read(o),l=ZQr(u,a,c);l!==u?(this.writeDestination(s,l),t.logger.info(`Updated referential constraint file: ${i.entitySetName}.js`)):t.logger.debug(`Referential constraint for '${a}' already present in ${i.entitySetName}.js \u2014 skipping`)}else{let u=QQr(a,c);this.writeDestination(s,u),t.logger.info(`Written referential constraint file: ${i.entitySetName}.js`)}}),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_DATA_FILES_END",{writeFileDuration:`${Date.now()-e} ms`,numberOfFiles:`${n.length}`})}catch(e){t.logger.error(e),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITING_DATA_ERROR",{writeFileErrorTime:Date()})}else t.logger.info(tr("info.noServiceEntityData"));if(this.state.valueHelpData?.length)try{let e=Date.now();Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_VALUE_HELP_FILES_START",{time:Date()});let r=(0,pC.join)(this.state.appRootPath,$s.Webapp);if(await Dfe(this.fs,r,this.state.valueHelpData,this.state.mainServiceName,this.state.mainServicePath),this.state.mockServerConfig){let n={webappPath:r,packageJsonConfig:{skip:!0},ui5MockYamlConfig:{overwrite:!0}};n.ui5MockYamlConfig&&this.state.mainServiceName&&(n.ui5MockYamlConfig.resolveExternalServiceReferences={[this.state.mainServiceName]:!0},await pfe(this.state.appRootPath,n,this.fs))}Sl.sendTelemetry("ODATA_DOWNLOADER_WRITE_VALUE_HELP_DATA_FILES_END",{writeFileDuration:`${Date.now()-e} ms`,numberOfExternalServices:`${this.state.valueHelpData.length}`})}catch(e){t.logger.error(e),Sl.sendTelemetry("ODATA_DOWNLOADER_WRITING_BALUE_HELP_DATA_ERROR",{writeFileErrorTime:Date()})}else t.logger.info(tr("info.noValueHelpData"));if(this.state.updateMainServiceMetadata&&this.state.mainServiceMetadata&&this.state.mainServiceName){let e=(0,pC.join)(this.state.appRootPath,$s.Webapp,$s.LocalService,this.state.mainServiceName,"metadata.xml");this.writeDestination(e,(0,NZr.default)(this.state.mainServiceMetadata,{indentation:" ",lineSeparator:`
2348
2348
  `,collapseContent:!0,throwOnFailure:!1}))}}}async _promptMissingReferentialConstraints(e,r){let n=e.referencedEntities?.listEntity.entitySetName,i=new Set([...n?[n]:[],...(r[Bh.relatedEntitySelection]??[]).map(o=>o.entity.entitySetName)]),s=e.referencedEntities?.hierarchyEntities?.filter(o=>!o.parentProperty&&o.missingReferentialConstraints&&i.has(o.entitySetName))??[];if(s.length>0){this.prompts.splice(1,0,[{name:tr("steps.addConstraints.name"),description:tr("steps.addConstraints.description")}]);let o=bZr(s),a=await this.prompt(o),c=[e.referencedEntities?.listEntity,...e.referencedEntities?.pageObjectEntities??[]];s.forEach(u=>{let l=a[`${u.entitySetName}/${u.nodeProperty}/source`],p=a[`${u.entitySetName}/${u.nodeProperty}/target`];if(l&&p){u.missingReferentialConstraints.constraints=[{sourceProperty:l,targetProperty:p}],u.parentProperty=l;let f=c.find(h=>h?.entitySetName===u.entitySetName)?.entityType;u.parentPropertyType=f?.entityProperties.find(h=>h.name===l)?.type??"Edm.String"}})}}_exitOnError(e){throw Ad()!==gi.cli&&this.appWizard?.showError(e,Bye.MessageType.notification),new Error(e)}_configureLogging(e,r,n){let i=new cfe(this.rootGeneratorName(),this.log,e,r,n);return i.info(tr("info.loggingInitialised",{logLevel:i.getLogLevel()})),i}};
2349
2349
  /*! Bundled license information:
2350
2350
 
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@sap-ux/generator-odata-downloader",
3
3
  "displayName": "Fiori Elements Data Downloader",
4
4
  "description": "Yeoman generator that supports download of app data, typically for mock data server use.",
5
- "version": "0.3.27",
5
+ "version": "0.3.28",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/SAP/open-ux-tools.git",
@@ -50,7 +50,7 @@
50
50
  "@sap-ux/inquirer-common": "1.0.22",
51
51
  "@sap-ux/logger": "1.0.3",
52
52
  "@sap-ux/mockserver-config-writer": "1.0.10",
53
- "@sap-ux/odata-service-inquirer": "3.0.24",
53
+ "@sap-ux/odata-service-inquirer": "3.0.25",
54
54
  "@sap-ux/odata-service-writer": "1.0.12",
55
55
  "@sap-ux/project-access": "2.1.6",
56
56
  "@sap-ux/store": "2.0.4",