UNPKG

@sap/generator-fiori

Version:

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

1 lines 21.3 kB
"use strict";exports.id=3491,exports.ids=[3491],exports.modules={92229(e,a,n){n.d(a,{a:()=>i});const i="mainService"},55550(e,a,n){n.r(a),n.d(a,{OdataVersion:()=>w,ServiceType:()=>S,generate:()=>generate,getAnnotationNamespaces:()=>getAnnotationNamespaces,getExternalServiceReferences:()=>getExternalServiceReferences,remove:()=>remove,update:()=>update,writeExternalServiceMetadata:()=>writeExternalServiceMetadata});var i=n(76760),o=n(73136),r=n(64812),s=n(90718),c=n(7083),l=n(2307),d=n(32939);if(/^(1006|1889|3524|4776|5055|6221|7007|900|9754)$/.test(n.j))var u=n(24319);var m=n(68801);const p=JSON.parse('{"error":{"requiredProjectFileNotFound":"Invalid project structure. Cannot find the required file: {{-path}}.","requiredProjectPropertyNotFound":"The required project property: {{-property}} was not found in the file: {{-path}}.","requiredServiceAlreadyExists":"A service with the {{-uri}} URI already exists. Choose another service.","unparseableXML":"Unparseable XML was specified: {{-error}}."}}'),f="odata-service-writer",v=m.createInstance();function t(e,a){return v.t(e,a)}(async function initI18n(){await v.init({resources:{en:{[f]:p}},lng:"en",fallbackLng:"en",defaultNS:f,ns:[f],showSupportNotice:!1})})().catch(()=>{});var w,S,h=n(93407);async function updateCdsIndexOrServiceFile(e,a){const n=(0,i.join)(a.projectName,c.Lm.Annotations),o=`\nusing from './${(0,i.normalize)(n).split(/[\\/]/g).join(i.posix.sep)}';`,r=(0,i.join)(a.projectPath,a.appPath??"","index.cds"),s=(0,i.join)(a.projectPath,a.appPath??"","services.cds");r&&e.exists(r)?e.append(r,o):e.exists(s)?e.append(s,o):e.write(s,o)}async function removeCdsIndexOrServiceFile(e,a){const n=(0,i.join)(a.projectName,c.Lm.Annotations),o=`\nusing from './${(0,i.normalize)(n).split(/[\\/]/g).join(i.posix.sep)}';`,r=(0,i.join)(a.projectPath,a.appPath??"","index.cds"),s=(0,i.join)(a.projectPath,a.appPath??"","services.cds");if(r&&e.exists(r)){const a=e.read(r).replace(o,"");e.write(r,a)}else if(e.exists(s)){const a=e.read(s).replace(o,"");e.write(s,a)}}async function writeMetadata(e,a,n){n.metadata&&e.write((0,i.join)(a,c.Lm.LocalService,n.name??"mainService","metadata.xml"),h(n.metadata,{indent:4}))}async function writeRemoteServiceAnnotationXmlFiles(e,a,n,o){const r=await(0,c.vv)(a,e);if(Array.isArray(o))for(const a in o){const s=o[a];s?.xml&&e.write((0,i.join)(r,c.Lm.LocalService,n,`${s.name}.xml`),h(s.xml,{indent:4}))}else o?.xml&&e.write((0,i.join)(r,c.Lm.LocalService,n,`${o.name}.xml`),h(o.xml,{indent:4}))}function getAnnotationNamespacesForSingleAnnotation(e,a){if(e?.xml){const n=xmlToJson(e.xml);return a.map(a=>{const i=e.xml&&a.namespace?function getAliasFromAnnotation(e,a){let n=e["edmx:Edmx"]?.["edmx:Reference"];Array.isArray(n)||(n=[n]);const i=n.find(e=>e["edmx:Include"]?.Namespace===a&&e["edmx:Include"]?.Alias);return i?i["edmx:Include"]?.Alias:""}(n,a.namespace):"";return i&&(a.alias=i),a})}return a}function getAnnotationNamespaces({metadata:e,annotations:a}){let n=e?function getNamespaces(e){const a=xmlToJson(e);let n=a["edmx:Edmx"]?.["edmx:DataServices"]?.Schema;if(!n)return[];Array.isArray(n)||(n=[n]);return n.map(e=>({namespace:e.Namespace,alias:e.Alias||""}))}(e):[];if(Array.isArray(a))for(const e in a){n=getAnnotationNamespacesForSingleAnnotation(a[e],n)}else{n=getAnnotationNamespacesForSingleAnnotation(a,n)}return n}function xmlToJson(e){const a={attributeNamePrefix:"",ignoreAttributes:!1,ignoreNameSpace:!0,parseAttributeValue:!0};try{return new u.XMLParser(a).parse(e,!0)}catch(e){throw new Error(t("error.unparseableXML",{error:e}))}}if(function(e){e.v2="2",e.v4="4"}(w||(w={})),function(e){e.EDMX="edmx",e.CDS="cds"}(S||(S={})),/^(1889|3524|7007|900|9754)$/.test(n.j))var g=n(92229);function setDefaultAnnotationName(e,a){e?.technicalName&&!e.name&&(e.name=e?.technicalName?.replace(/\//g,"_")?.replace(/^_/,"")),e.name===a&&(e.name+="_Annotation")}async function enhanceData(e,a,n,o=!1){o||function setDefaultServicePath(e){e.path=e.path?.endsWith("/")?e.path:(e.path??"")+"/"}(a),await async function setDefaultServiceName(e,a,n,o){const r=(0,i.join)(await(0,c.vv)(e,n),c.o3.Manifest),s=n.readJSON(r),l=s?.["sap.app"]?.dataSources;l?0===Object.values(l).filter(e=>"OData"===e.type).length?a.name=g.a:a.name&&!o&&(a.name=function generateUniqueServiceName(e,a){let n=a,i=1,o=!0;do{e?.[n]?n=`${a}${i++}`:o=!1}while(o);return n}(l,a.name)):a.name=g.a}(e,a,n,o),await async function setDefaultServiceModel(e,a,n,o){const r=(0,i.join)(await(0,c.vv)(e,n),"manifest.json"),s=n.readJSON(r);if(!a.model){const e=s?.["sap.ui5"]?.models;if(e){const n=Object.values(e).filter(e=>e.dataSource);0===n.length||o&&n.find(e=>e.dataSource===g.a)&&a.name===g.a?a.model="":a.name&&(a.model=a.name)}else a.model=""}}(e,a,n,o),a.type=a.type??S.EDMX,a.type===S.EDMX&&function setDefaultAnnotationsName(e){if(Array.isArray(e.annotations)){const a=e.annotations;for(const n in a)setDefaultAnnotationName(a[n],e.name)}else e.annotations&&setDefaultAnnotationName(e.annotations,e.name)}(a),await async function setDefaultPreviewSettings(e,a,n,o=!1){const r=function getPreviewSettings(e){const a={path:e.previewSettings?.path??`/${e.path?.split("/").find(e=>""!==e)??""}`,url:e.previewSettings?.url??e.url??"http://localhost"};return e.client&&!e.previewSettings?.client&&(a.client=e.client),e.destination&&!e.previewSettings?.destination&&(a.destination=e.destination.name,e.destination.instance&&(a.destinationInstance=e.destination.instance)),a}(a),s=a.previewSettings?.path;a.previewSettings={...r,...a.previewSettings};const d=(0,i.join)(e,c.o3.Ui5Yaml);if(!n.exists(d))return;const u=n.read(d),m=(await l.io.newInstance(u)).getBackendConfigsFromFioriToolsProxyMiddleware();o?function preserveExistingBackendConfig(e,a,n){const i=a.find(a=>a.path===e.previewSettings?.path);i&&(i.pathPrefix&&(e.previewSettings.pathPrefix=i.pathPrefix),n||(e.previewSettings.path=e.path))}(a,m,s):m.find(e=>"/sap"===e.path)&&function adjustPreviewPathForNewService(e,a){a.find(e=>"/sap"===e.path)&&(e.previewSettings.path=e.path)}(a,m)}(e,a,n,o)}var x=n(53916),y=n(91125),M=n(39933);function writeExternalServiceMetadata(e,a,n,o=g.a,r){if(!n.length||!r)return;const s=new Set;for(const l of n){const n=getServiceRoot(r,l.path),d=[a,c.Lm.LocalService,o,n],u=l.path.split(";")[0];if(l.entityData&&!s.has(u)){for(const a of l.entityData){const n=(0,i.join)(...d,`${a.entitySetName}.json`);e.write(n,JSON.stringify(a.items,void 0,4))}s.add(u)}"value-list"===l.type&&d.push(l.target),d.push("metadata.xml");const m=(0,i.join)(...d);l.metadata&&e.write(m,h(l.metadata,{indent:4}))}}function getServiceRoot(e,a){const[n]=a.split(";"),i=n.split("/");let o="/",r=i.shift();for(;void 0!==r;){const a=(0,x.join)(o,r);if(!e.startsWith(a))break;o=a,r=i.shift()}return n.replace(o,"")}const j={valueListReferences:!0,codeLists:!0};function getExternalServiceReferences(e,a,n=[],i){const o=function getOptions(e){return e?{valueListReferences:e.valueListReferences??j.valueListReferences,codeLists:e.codeLists??j.codeLists}:{...j}}(i);if(!a)return[];const r=[a,...n.map(e=>e.Definitions)],s=[];for(const a of r){const n="string"==typeof a?(0,y.convert)((0,M.qg)(a)):a;for(const a of Object.values(n.annotations))for(const i of a){collectExternalServiceReferences(o,s,i.target.replace(n.namespace+".",""),i,e)}}return s}function collectExternalServiceReferences(e,a,n,i,o){for(const r of i.annotations)collectValueListReferences(e,a,n,r,o),collectCodeLists(e,a,r,o)}function collectValueListReferences(e,a,n,i,o){if(e.valueListReferences&&"com.sap.vocabularies.Common.v1.ValueListReferences"===i.term)for(const e of i.collection??[])if("String"===e.type){const i=e;a.push({type:"value-list",serviceRootPath:o,target:n,value:i.String})}}function collectCodeLists(e,a,n,i){if(e.codeLists&&("com.sap.vocabularies.CodeList.v1.CurrencyCodes"===n.term||"com.sap.vocabularies.CodeList.v1.UnitsOfMeasure"===n.term)&&n.record){const e=getPropertyValue(n.record,"CollectionPath"),o=getPropertyValue(n.record,"Url");o&&a.push({type:"code-list",serviceRootPath:i,value:o,collectionPath:e??void 0})}}function getPropertyValue(e,a){const n=e.propertyValues.find(e=>e.name===a);if("String"===n?.value?.type){return n.value.String}}async function generateMockserverMiddlewareBasedOnUi5MockYaml(e,a,n,o){const r=(0,i.join)((0,i.dirname)(a),c.o3.Ui5MockYaml),s=(await l.io.newInstance(e.read(r))).findCustomMiddleware("sap-fe-mockserver");n&&e.exists(n)&&o&&s&&o.updateCustomMiddleware(s)}function extendBackendMiddleware(e,a,n,i,o=!1){if(o)n.updateBackendToFioriToolsProxyMiddleware(a.previewSettings);else try{n.addBackendToFioriToolsProxyMiddleware(a.previewSettings,a.ignoreCertError)}catch(e){if(!(e instanceof l.IP&&e.code===l.jT.nodeNotFound||"Could not find fiori-tools-proxy"===e.message))throw e;n.addFioriToolsProxyMiddleware({backend:[a.previewSettings],ignoreCertError:a.ignoreCertError})}e.write(i,n.toString())}async function addServicesData(e,a,n,o,r){const{ui5Config:s,ui5LocalConfig:u}=await async function updateUI5YamlConfigs(e,a,n){let i,o;return n.ui5Yaml&&(i=await l.io.newInstance(e.read(n.ui5Yaml)),extendBackendMiddleware(e,a,i,n.ui5Yaml),n.ui5LocalYaml&&(o=await l.io.newInstance(e.read(n.ui5LocalYaml)),extendBackendMiddleware(e,a,o,n.ui5LocalYaml))),{ui5Config:i,ui5LocalConfig:o}}(r,o,a),m=await(0,c.vv)(e,r);o.metadata&&(a.ui5Yaml&&s&&await async function generateAndUpdateMockserverConfig(e,a,n,i,o,r){const s={webappPath:i,ui5MockYamlConfig:{}};if(s.ui5MockYamlConfig&&n.name&&n.externalServices?.length&&(s.ui5MockYamlConfig.resolveExternalServiceReferences={[n.name]:!0}),await(0,d.Ld)(e,s,r),await generateMockserverMiddlewareBasedOnUi5MockYaml(r,a.ui5Yaml,a.ui5LocalYaml,o),a.ui5MockYaml){const e=await l.io.newInstance(r.read(a.ui5MockYaml));extendBackendMiddleware(r,n,e,a.ui5MockYaml)}}(e,a,o,m,u,r),await async function writeLocalServiceAnnotationXMLFiles(e,a,n,o){if(await writeMetadata(e,a,o),o.localAnnotationsName){const r=getAnnotationNamespaces(o);e.copyTpl((0,i.join)(n,"add","annotation.xml"),(0,i.join)(a,c.Lm.Annotations,`${o.localAnnotationsName}.xml`),{...o,namespaces:r})}}(r,m,n,o)),a.packageJson&&a.ui5Yaml&&function updatePackageJson(e,a,n){const i=JSON.parse(a.read(e));i.devDependencies=i.devDependencies??{},(0,c.$9)(i.devDependencies)||(i.ui5=i.ui5??{},i.ui5.dependencies=i.ui5.dependencies??[],i.ui5.dependencies.includes("@sap/ux-ui5-tooling")||i.ui5.dependencies.push("@sap/ux-ui5-tooling"),!n||i.ui5.dependencies.includes("@sap/ux-ui5-fe-mockserver-middleware")||i.ui5.dependencies.includes("@sap-ux/ui5-middleware-fe-mockserver")||i.ui5.dependencies.push("@sap-ux/ui5-middleware-fe-mockserver")),i.devDependencies["@sap/ux-ui5-tooling"]||(i.devDependencies["@sap/ux-ui5-tooling"]="1"),n&&(i.devDependencies["@sap/ux-ui5-fe-mockserver-middleware"]||i.devDependencies["@sap-ux/ui5-middleware-fe-mockserver"]||(i.devDependencies["@sap-ux/ui5-middleware-fe-mockserver"]="2")),a.writeJSON(e,i)}(a.packageJson,r,!!o.metadata),a.ui5LocalYaml&&u&&r.write(a.ui5LocalYaml,u.toString()),await writeRemoteServiceAnnotationXmlFiles(r,e,o.name??"mainService",o.annotations),o.externalServices&&m&&writeExternalServiceMetadata(r,m,o.externalServices,o.name,o.path)}async function updateServicesData(e,a,n,i,o){let r,s;o&&(a.ui5Yaml&&(r=await l.io.newInstance(i.read(a.ui5Yaml)),extendBackendMiddleware(i,n,r,a.ui5Yaml,!0)),a.ui5LocalYaml&&(s=await l.io.newInstance(i.read(a.ui5LocalYaml)),extendBackendMiddleware(i,n,s,a.ui5LocalYaml,!0)));const u=await async function updateMetadata(e,a,n,i,o,r,s){if(!n.metadata)return;const u=await(0,c.vv)(e,r);if(a.ui5MockYaml&&a.ui5Yaml&&i&&s){const i={webappPath:u,packageJsonConfig:{skip:!0},ui5MockYamlConfig:{overwrite:!0}};if(i.ui5MockYamlConfig&&n.name&&n.externalServices?.length&&(i.ui5MockYamlConfig.resolveExternalServiceReferences={[n.name]:!0}),await(0,d.Ld)(e,i,r),await generateMockserverMiddlewareBasedOnUi5MockYaml(r,a.ui5Yaml,a.ui5LocalYaml,o),a.ui5MockYaml){const e=await l.io.newInstance(r.read(a.ui5MockYaml));extendBackendMiddleware(r,n,e,a.ui5MockYaml,!0)}}return await writeMetadata(r,u,n),u}(e,a,n,r,s,i,o);a.ui5LocalYaml&&s&&i.write(a.ui5LocalYaml,s.toString()),await writeRemoteServiceAnnotationXmlFiles(i,e,n.name??"mainService",n.annotations),n.externalServices&&u&&writeExternalServiceMetadata(i,u,n.externalServices,n.name,n.path)}var A=n(85263);function enhanceManifestDatasources(e,a,n){const{serviceName:o,servicePath:r,serviceVersion:s,manifest:c,forceServiceUpdate:l,serviceMetadata:d,serviceRemoteAnnotations:u,serviceLocalAnnotations:m}=n,p=c?.["sap.app"].dataSources??{},f=function addRemoteAnnotationDataSources(e,a,n,o,r,s){const c=[];Array.isArray(r)?r.forEach(e=>{e.name&&(n[e.name]={uri:`/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='${encodeURIComponent(e.technicalName)}',Version='0001')/$value/`,type:"ODataAnnotation",settings:{localUri:`localService/${o}/${e.name}.xml`}},c.push(e.name))}):r?.name&&(n[r.name]={uri:`/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='${encodeURIComponent(r.technicalName)}',Version='0001')/$value/`,type:"ODataAnnotation",settings:{localUri:`localService/${o}/${r.name}.xml`}},c.push(r.name));s&&function removeUnusedAnnotations(e,a,n,o,r){const s=n?.[o].settings?.annotations??[];s.forEach(o=>{const s=n[o];if("ODataAnnotation"===s?.type&&s.uri!==s.settings?.localUri&&!r.includes(o)){const r=s.settings?.localUri;r&&e.exists((0,i.join)(a,r))&&e.delete((0,i.join)(a,r)),delete n[o]}})}(e,a,n,o,c);return c}(e,a,p,o,u,l),v=function addLocalAnnotationDataSources(e,a,n,i){const o=[];if(i){(e?.[a]?.settings?.annotations??[]).forEach(a=>{const n=e[a];"ODataAnnotation"===n?.type&&n.uri===n.settings?.localUri&&o.push(a)})}else Array.isArray(n)?n.forEach(a=>{e[a]={type:"ODataAnnotation",uri:`annotations/${a}.xml`,settings:{localUri:`annotations/${a}.xml`}},o.push(a)}):n&&(e[n]={type:"ODataAnnotation",uri:`annotations/${n}.xml`,settings:{localUri:`annotations/${n}.xml`}},o.push(n));return o}(p,o,m,l),S={annotations:[...f,...v]};let h;d&&(S.localUri=`localService/${o}/metadata.xml`),s===w.v4?h=d&&function getOdataVersionFromMetadata(e){const a=/Version="([^"]+)"/.exec(e.slice(0,500));return"4.01"===a?.[1]?"4.01":void 0}(d)||"4.0":s===w.v2&&(h="2.0"),h&&(S.odataVersion=h),p[o]={uri:r,type:"OData",settings:S},c["sap.app"].dataSources=p}function enhanceManifest(e,a,n,i,o){const r=(0,c.qL)(a),s=Object.assign(e,function getModelSettings(e){let a=!1;return e&&(a=A.satisfies(e,"<=1.110")),{includeSynchronizationMode:a}}(r));s.name&&s.path&&void 0!==s.model&&(enhanceManifestDatasources(i,n,{serviceName:s.name,servicePath:s.path,serviceVersion:s.version,manifest:a,forceServiceUpdate:o,serviceMetadata:s.metadata,serviceRemoteAnnotations:s.annotations,serviceLocalAnnotations:s.localAnnotationsName}),function enhanceManifestModels(e,a,n,i,o){const r=o?.["sap.ui5"]?.models??{};let s={};a===w.v4&&(i&&(s.synchronizationMode="None"),s.operationMode="Server",s.autoExpandSelect=!0,s.earlyRequests=!0),r[n]?.settings?(s={...r[n].settings,...s},r[n]={...r[n],dataSource:e,preload:!0,settings:s}):r[n]={dataSource:e,preload:!0,settings:s},o["sap.ui5"]?o["sap.ui5"]={...o["sap.ui5"],models:r}:Object.assign(o,{"sap.ui5":{models:{...r}}})}(s.name,s.version,s.model,s.includeSynchronizationMode,a))}function convertSingleService(e,a,n,o){const r=n.settings;if(r){const n=r.localUri,s=n?n.split("/"):void 0;if(s?.[0]===c.Lm.LocalService&&2===s.length){const n=s[s.length-1];r.localUri=`${c.Lm.LocalService}/${a}/${n}`;const l=(0,i.join)(e,s.join(i.sep)),d=(0,i.join)(e,c.Lm.LocalService,a,n);o.exists(l)&&o.move(l,d)}}}function removeFileForDataSource(e,a,n){const o=n.settings??{};if(o?.localUri){const n=(0,i.join)((0,i.dirname)(a),o?.localUri);e.exists(n)&&e.delete(n)}}function deleteServiceFromManifest(e,a,n){const o=a.name??"mainService",r=(0,i.join)(e,"webapp","manifest.json"),s=n.readJSON(r),c="sap.app",l=s?.[c]?.id;if(!l)throw new Error(t("error.requiredProjectPropertyNotFound",{property:`'${c}'.id`,path:r}));const d=s?.[c]?.dataSources;d?.[o]&&removeFileForDataSource(n,r,d?.[o]);const u=d?.[o]?.settings;u?.annotations&&u.annotations.length>0&&function removeAnnotations(e,a,n,i){for(const o of n){const n=i?.[o];"ODataAnnotation"===n?.type&&(n.uri===n?.settings?.localUri||n&&(removeFileForDataSource(e,a,n),delete i?.[o]))}}(n,r,u.annotations,d),d?.[o]&&delete d[o];const m=s?.["sap.ui5"]?.models;if(m)for(const e of Object.keys(m)){const a=m[e];a?.dataSource===o&&delete m[e]}n.writeJSON(r,s)}async function updateManifest(e,a,n,o=!1){const r=await(0,c.vv)(e,n),s=(0,i.join)(r,"manifest.json"),l=n.readJSON(s),d="sap.app",u=l?.[d]?.id,m=l[d]?.dataSources??{};if(!u)throw new Error(t("error.requiredProjectPropertyNotFound",{property:`'${d}'.id`,path:s}));if(o&&a.name&&!m?.[a.name])throw new Error(t("error.requiredProjectPropertyNotFound",{property:`'${d}.dataSources.${a.name}'`,path:s}));if(!o&&a.path&&Object.values(m).find(e=>e.uri===a.path))throw new Error(t("error.requiredServiceAlreadyExists",{uri:a.path}));const p=await async function addMultipleServiceSupportToManifest(e,a,n){const i=a?.["sap.app"]?.dataSources;for(const a in i){const o=i[a];if("OData"===o?.type){convertSingleService(e,a,o,n);const r=o.settings?.annotations;r&&r.forEach(o=>{const r=i[o];r&&convertSingleService(e,a,r,n)})}}return a}(r,l,n);enhanceManifest(a,p,r,n,o),n.writeJSON(s,p)}async function deleteServiceData(e,a,n,o){if(deleteServiceFromManifest(e,n,o),n.path&&n.name){let r,s,d;a.ui5Yaml&&(r=await l.io.newInstance(o.read(a.ui5Yaml)),r.removeBackendFromFioriToolsProxyMiddleware(n.path),o.write(a.ui5Yaml,r.toString()));const u=function getEDMXAnnotationPaths(e){const a=[];if(Array.isArray(e))e.forEach(e=>{const n=encodeURIComponent(e.technicalName);a.push(`/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='${n}',Version='0001')/$value/`)});else{const n=encodeURIComponent(e.technicalName);a.push(`/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Annotations(TechnicalName='${n}',Version='0001')/$value/`)}return a}(n.annotations);a.ui5LocalYaml&&(s=await l.io.newInstance(o.read(a.ui5LocalYaml)),s.removeBackendFromFioriToolsProxyMiddleware(n.path),s.removeServiceFromMockServerMiddleware(n.path,u),o.write(a.ui5LocalYaml,s.toString())),a.ui5MockYaml&&(d=await l.io.newInstance(o.read(a.ui5MockYaml)),d.removeBackendFromFioriToolsProxyMiddleware(n.path),d.removeServiceFromMockServerMiddleware(n.path,u),o.write(a.ui5MockYaml,d.toString())),await async function removeRemoteServiceAnnotationXmlFiles(e,a,n,o){const r=await(0,c.vv)(a,e);if(Array.isArray(o))for(const a in o){const s=o[a],l=(0,i.join)(r,c.Lm.LocalService,n,`${s.technicalName}.xml`);e.exists(l)&&e.delete(l)}else if(o?.xml){const a=(0,i.join)(r,c.Lm.LocalService,n,`${o.technicalName}.xml`);e.exists(a)&&e.delete(a)}}(o,e,n.name,n.annotations)}}const L=(0,i.dirname)((0,o.fileURLToPath)(require("node:url").pathToFileURL(__filename).href));function ensureExists(e,a,n){a.forEach(a=>{if(!n.exists((0,i.join)(e,a)))throw new Error(t("error.requiredProjectFileNotFound",{path:a}))})}async function findProjectFiles(e,a){const n={},o=e.split(i.sep);for(;o.length>0&&(!n.packageJson||!n.ui5Yaml||!n.ui5LocalYaml||!n.ui5MockYaml);){const e=o.join(i.sep);!n.packageJson&&a.exists((0,i.join)(e,"package.json"))&&(n.packageJson=(0,i.join)(e,"package.json")),!n.ui5Yaml&&a.exists((0,i.join)(e,"ui5.yaml"))&&(n.ui5Yaml=(0,i.join)(e,"ui5.yaml")),!n.ui5LocalYaml&&a.exists((0,i.join)(e,"ui5-local.yaml"))&&(n.ui5LocalYaml=(0,i.join)(e,"ui5-local.yaml")),!n.ui5MockYaml&&a.exists((0,i.join)(e,"ui5-mock.yaml"))&&(n.ui5MockYaml=(0,i.join)(e,"ui5-mock.yaml")),o.pop()}return n}async function generate(e,a,n){n||(n=(0,s.v)((0,r.v)()));const o=await findProjectFiles(e,n);ensureExists(await(0,c.vv)(e,n),["manifest.json"],n),await enhanceData(e,a,n);const l=a.type===S.EDMX,d=(0,i.join)(L,"../templates");return await updateManifest(e,a,n),l?await addServicesData(e,o,d,a,n):!l&&a.annotations&&await async function updateCdsFilesWithAnnotations(e,a){if(Array.isArray(e))for(const n in e){const o=e[n],r=(0,i.join)(o.projectPath,o.appPath??"",o.projectName,"annotations.cds");a.exists(r)?a.append(r,o.cdsFileContents):a.write(r,o.cdsFileContents),await updateCdsIndexOrServiceFile(a,o)}else{const n=(0,i.join)(e.projectPath,e.appPath??"",e.projectName,"annotations.cds");a.write(n,e.cdsFileContents),await updateCdsIndexOrServiceFile(a,e)}}(a.annotations,n),n}async function update(e,a,n,i=!0){n||(n=(0,s.v)((0,r.v)()));const o=await findProjectFiles(e,n);ensureExists(await(0,c.vv)(e,n),["manifest.json"],n),await enhanceData(e,a,n,!0);const l=a.type===S.EDMX;return await updateManifest(e,a,n,!0),l&&await updateServicesData(e,o,a,n,i),n}async function remove(e,a,n){n||(n=(0,s.v)((0,r.v)()));const o=await findProjectFiles(e,n);return a.type===S.EDMX?await deleteServiceData(e,o,a,n):await async function removeAnnotationsFromCDSFiles(e,a){if(Array.isArray(e))for(const n in e){const o=e[n],r=(0,i.join)(o.projectPath,o.appPath??"",o.projectName,"annotations.cds");if(a.exists(r)){const e=a.read(r).replace(o.cdsFileContents,"");a.write(r,e)}await removeCdsIndexOrServiceFile(a,o)}else{const n=(0,i.join)(e.projectPath,e.appPath??"",e.projectName,"annotations.cds");if(a.exists(n)){const i=a.read(n).replace(e.cdsFileContents,"");a.write(n,i)}await removeCdsIndexOrServiceFile(a,e)}}(a.annotations,n),n}}};