@sap/generator-fiori
Version:
Create an SAPUI5 application using SAP Fiori elements or a freestyle approach
1 lines • 39.3 kB
JavaScript
;exports.id=688,exports.ids=[688],exports.modules={1425:function(e,a,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.generateAppConfig=async function generateAppConfig(e,a,i){a||(a=(0,s.create)((0,r.create)()));i&&(g.default.logger=i);return(0,m.doesMTABinaryExist)(),await async function generateDeployConfig(e,a){const i=await async function getUpdatedConfig(e,a){const i=e.lcapMode??!1,{rootPath:n,isCap:r,mtaId:s,mtaPath:d,hasRoot:u,capRoot:p}=await async function getProjectProperties(e){let a,i,n,r=!1;const s=await(0,c.getMtaPath)(e.appPath);s&&(i=(0,o.dirname)(s.mtaPath),n=await(0,m.getMtaId)(i));const d=s?.hasRoot??!1,u=await(0,c.findCapProjectRoot)(e.appPath)??void 0;u?((0,m.doesCDSBinaryExist)(),r=!0,a=u):a=i??e.appPath;return{rootPath:a,isCap:r,mtaId:n,mtaPath:i,hasRoot:d,capRoot:u}}(e),{serviceHost:f,destination:M,firstServicePathSegmentUI5Config:y}=await async function processUI5Config(e,a){let i,n,o;try{const r=(await(0,c.readUi5Yaml)(e,c.FileName.Ui5Yaml,a)).findCustomMiddleware("fiori-tools-proxy");1===r?.configuration?.backend?.length&&(i=r?.configuration?.backend[0].destination,n=r?.configuration?.backend[0].url,o=r?.configuration?.backend[0].path)}catch(e){g.default.logger?.debug((0,h.t)("debug.ui5YamlDoesNotExist"))}return{destination:i,serviceHost:n,firstServicePathSegmentUI5Config:o}}(e.appPath,a),{servicePath:P,firstServicePathSegment:A,appId:v}=await async function processManifest(e,a){const i=await(0,l.readManifest)((0,o.join)(e,"webapp/manifest.json"),a),n=i?.["sap.app"]?.id?(0,m.toMtaModuleName)(i?.["sap.app"]?.id):void 0,r=i?.["sap.app"]?.dataSources?.mainService?.uri,s=r?.substring(0,r?.indexOf("/",1));return{servicePath:r,firstServicePathSegment:s,appId:n}}(e.appPath,a);if(!v)throw new Error("No SAP Fiori UI5 application found.");const{destinationIsFullUrl:S,destinationAuthentication:T}=await(0,l.getDestinationProperties)(e.destinationName??M);return{appPath:e.appPath.replace(/\/$/,""),destinationName:e.destinationName||M,addManagedAppRouter:e.addManagedAppRouter??!0,addMtaDestination:e.addMtaDestination??!1,cloudServiceName:e.cloudServiceName,lcapMode:!!r&&i,isMtaRoot:u??!1,serviceHost:e.serviceHost||f,rootPath:n.replace(/\/$/,""),destinationAuthentication:e.destinationAuthentication||T,isDestinationFullUrl:e.isDestinationFullUrl??S,apiHubConfig:e.apiHubConfig,firstServicePathSegment:y||A,mtaId:s,mtaPath:d,isCap:r,servicePath:P,appId:v,capRoot:p}}(e,a);g.default?.logger?.debug(`Generate app configuration using: \n ${JSON.stringify(i)}`),i.lcapMode||(generateMTAFile(i),await(0,l.generateSupportingConfig)(i,a),await async function updateMtaConfig(e,a){const i=await(0,m.getMtaConfig)(e.rootPath);if(i){await i.addRoutingModules({isManagedApp:e.addManagedAppRouter});const n=e.appId,r=(0,l.toPosixPath)((0,o.relative)(e.rootPath,e.appPath));await i.addApp(n,r??"."),await(0,m.addMtaDeployParameters)(i),(e.addMtaDestination&&e.isCap||e.destinationName===p.DefaultMTADestination)&&(e.destinationName=e.destinationName===p.DefaultMTADestination?i.getFormattedPrefix(p.ResourceMTADestination):e.destinationName,await i.appendInstanceBasedDestination(e.destinationName),i.hasManagedXsuaaResource()||(e.destinationAuthentication=u.Authentication.NO_AUTHENTICATION)),function cleanupStandaloneRoutes({rootPath:e,appId:a},i,n){const r=i.standaloneRouterPath;if(r)try{const i=(0,o.join)(r,p.XSAppFile),s=n.readJSON((0,o.join)(e,i));(s&&!s?.[p.WelcomeFile]||"/"===s?.[p.WelcomeFile])&&(s[p.WelcomeFile]=`/${a}`,n.writeJSON((0,o.join)(e,i),s))}catch(e){g.default.logger?.error((0,h.t)("error.cannotUpdateRouterXSApp",{error:e}))}}(e,i,a),await async function saveMta(e,a){try{await a.save(),g.default.logger?.debug((0,h.t)("debug.mtaSaved"))}catch(e){g.default.logger?.debug((0,h.t)("debug.mtaSavedFailed",{error:e}))}if("API_HUB_ENTERPRISE"===e.apiHubConfig?.apiHubType)try{await a.addMtaExtensionConfig(e.destinationName,e.serviceHost,{key:"ApiKey",value:e.apiHubConfig.apiHubKey})}catch(e){g.default.logger?.error((0,h.t)("error.mtaExtensionFailed",{error:e}))}}(e,i),e.cloudServiceName=i.cloudServiceName}}(i,a));await async function appendCloudFoundryConfigurations(e,a){e.destinationName&&e.destinationName!==p.EmptyDestination?a.copyTpl((0,l.getTemplatePath)("app/xs-app-destination.json"),(0,o.join)(e.appPath,p.XSAppFile),{destination:e.destinationName,servicePathSegment:`${e.firstServicePathSegment}${e.isDestinationFullUrl?"/.*":""}`,targetPath:`${e.isDestinationFullUrl?"":e.firstServicePathSegment}/$1`,authentication:e.destinationAuthentication===u.Authentication.NO_AUTHENTICATION?"none":"xsuaa"}):a.copyTpl((0,l.getTemplatePath)("app/xs-app-no-destination.json"),(0,o.join)(e.appPath,p.XSAppFile));await generateUI5DeployConfig(e,a)}(i,a),await async function updateManifest(e,a){const i=await(0,l.readManifest)((0,o.join)(e.appPath,"webapp/manifest.json"),a);if(i&&e.cloudServiceName){const n={...i["sap.cloud"]||{},public:!0,service:e.cloudServiceName};a.extendJSON((0,o.join)(e.appPath,"webapp/manifest.json"),{"sap.cloud":n})}}(i,a),await async function updateHTML5AppPackage(e,a){let i=[];a.exists((0,o.join)(e.appPath,p.MTAFileExtension))&&(i=["-e",p.MTAFileExtension]);await(0,c.updatePackageScript)(e.appPath,"build:cf",p.UI5DeployBuildScript,a),await(0,l.addCommonPackageDependencies)(e.appPath,a),e.mtaPath&&!e.isMtaRoot&&(await(0,c.updatePackageScript)(e.appPath,"build:mta",p.MTABuildScript,a),await(0,c.updatePackageScript)(e.appPath,"deploy",(0,p.appDeployMTAScript)(i),a),await(0,c.updatePackageScript)(e.appPath,"undeploy",(0,p.undeployMTAScript)(e.mtaId??e.appId),a),await(0,c.addPackageDevDependency)(e.appPath,p.Rimraf,p.RimrafVersion,a),await(0,c.addPackageDevDependency)(e.appPath,p.MbtPackage,p.MbtPackageVersion,a))}(i,a),i.isMtaRoot&&await(0,l.updateRootPackage)({mtaId:i.mtaId??i.appId,rootPath:i.rootPath},a)}(e,a),a},a.generateMTAFile=generateMTAFile,a.generateUI5DeployConfig=generateUI5DeployConfig;const o=i(16928),r=i(64812),s=i(90718),d=i(8231),c=i(20787),u=i(75199),p=i(54036),l=i(37736),m=i(79875),g=n(i(57470)),h=i(97649);function generateMTAFile(e){e.mtaId||(e.isCap?(0,m.createCAPMTA)(e.rootPath):(0,m.createMTA)({mtaId:e.appId,mtaPath:e.mtaPath??e.rootPath}),e.mtaId=e.appId,e.mtaPath=e.rootPath)}async function generateUI5DeployConfig(e,a){const i=await(0,c.readUi5Yaml)(e.appPath,c.FileName.Ui5Yaml,a),n=!!i.findCustomMiddleware("ui5-tooling-transpile-task"),r=!!i.findCustomMiddleware("ui5-tooling-modules-task"),s=i.removeConfig("server"),u=await d.UI5Config.newInstance(s.toString());u.addComment({comment:" yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json",location:"beginning"}),u.setConfiguration({propertiesFileSourceEncoding:"UTF-8"}),u.addCloudFoundryDeployTask(e.appId,r,n),a.write((0,o.join)(e.appPath,c.FileName.UI5DeployYaml),u.toString())}},9291:function(e,a,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.generateBaseConfig=async function generateBaseConfig(e,a,i){a||(a=(0,r.create)((0,o.create)()));i&&(d.default.logger=i);if(i?.debug(`Generate base configuration using: \n ${JSON.stringify(e)}`),(0,c.validateMtaConfig)(e),a.exists((0,u.join)(e.mtaPath,e.mtaId)))throw new Error((0,p.t)("error.mtaFolderAlreadyExists"));return(0,c.createMTA)(e),await(0,s.addRoutingConfig)(e,a),(0,s.addSupportingConfig)(e,a),d.default.logger?.debug(`CF Config ${JSON.stringify(e,null,2)}`),a};const o=i(64812),r=i(90718),s=i(37736),d=n(i(57470)),c=i(79875),u=i(16928),p=i(97649)},89416:function(e,a,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.generateCAPConfig=async function generateCAPConfig(e,a,i){a||(a=(0,r.create)((0,o.create)()));i&&(c.default.logger=i);return i?.debug(`Generate CAP configuration using: \n ${JSON.stringify(e)}`),await async function validateConfig(e){if((0,d.validateMtaConfig)(e),"CAPNodejs"!==await(0,l.getCapProjectType)(e.mtaPath))throw new Error((0,p.t)("error.doesNotContainACapApp"));if((0,d.isMTAFound)(e.mtaPath))throw new Error((0,p.t)("error.mtaAlreadyExists"))}(e),(0,d.createCAPMTA)(e.mtaPath,[u.CDSXSUAAService,u.CDSDestinationService,u.CDSHTML5RepoService]),await(0,s.addRoutingConfig)(e,a),await(0,s.updateRootPackage)({mtaId:e.mtaId,rootPath:e.mtaPath},a),c.default.logger?.debug((0,p.t)("debug.capMtaCreated")),a};const o=i(64812),r=i(90718),s=i(37736),d=i(79875),c=n(i(57470)),u=i(54036),p=i(97649),l=i(20787)},58445:(e,a,i)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.generateCAPConfig=a.generateBaseConfig=a.generateAppConfig=void 0;var n=i(1425);Object.defineProperty(a,"generateAppConfig",{enumerable:!0,get:function(){return n.generateAppConfig}});var o=i(9291);Object.defineProperty(a,"generateBaseConfig",{enumerable:!0,get:function(){return o.generateBaseConfig}});var r=i(89416);Object.defineProperty(a,"generateCAPConfig",{enumerable:!0,get:function(){return r.generateCAPConfig}})},54036:(e,a,i)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.appDeployMTAScript=a.MTABuildScript=a.UI5DeployBuildScript=a.HTMLAppBuildParams=a.ServiceAPIRequires=a.DestinationServiceConfig=a.UI5StandaloneModuleDestination=a.UI5ResourceDestination=a.UI5Destination=a.MTAAPIDestination=a.CDSDestinationService=a.CDSConnectivityService=a.CDSHTML5RepoService=a.CDSXSUAAService=a.CDSAddMtaParams=a.UI5PackageVersion=a.UI5Package=a.UI5TaskZipperPackageVersion=a.UI5TaskZipperPackage=a.UI5BuilderWebIdePackageVersion=a.UI5BuilderWebIdePackage=a.MbtPackageVersion=a.MbtPackage=a.Rimraf=a.RimrafVersion=a.MTAVersion=a.MTAPackageVersion=a.MTAPackage=a.MTAExecutable=a.CDSPackage=a.CDSExecutable=a.enableParallelDeployments=a.deployMode=a.CloudFoundry=a.RouterModule=a.MTADescription=a.MTAYamlFile=a.ResourceMTADestination=a.EmptyDestination=a.DefaultMTADestination=a.SRV_API=a.HTML5RepoHost=a.ManagedXSUAA=a.DefaultServiceURL=a.MTAFileExtension=a.MTABuildParams=a.MTABuildResult=a.XSSecurityFile=a.XSAppFile=a.WelcomeFile=void 0,a.MTABinNotFound=a.CDSBinNotFound=a.undeployMTAScript=a.rootDeployMTAScript=void 0;const n=i(97649);a.WelcomeFile="welcomeFile",a.XSAppFile="xs-app.json",a.XSSecurityFile="xs-security.json",a.MTABuildResult="build-result",a.MTABuildParams="build-parameters",a.MTAFileExtension="mta-ext.mtaext",a.DefaultServiceURL="${default-url}",a.ManagedXSUAA="managed:xsuaa",a.HTML5RepoHost="html5-apps-repo:app-host",a.SRV_API="srv-api",a.DefaultMTADestination="fiori-default-srv-api",a.EmptyDestination="NONE",a.ResourceMTADestination="%s-srv-api",a.MTAYamlFile="mta.yaml",a.MTADescription="Generated by Fiori Tools",a.RouterModule="router",a.CloudFoundry="cf",a.deployMode="deploy_mode",a.enableParallelDeployments="enable-parallel-deployments",a.CDSExecutable="cds",a.CDSPackage="@sap/cds-dk",a.MTAExecutable="mta",a.MTAPackage="mta",a.MTAPackageVersion="^1.2.27",a.MTAVersion="0.0.1",a.RimrafVersion="^5.0.5",a.Rimraf="rimraf",a.MbtPackage="mbt",a.MbtPackageVersion="^1.2.29",a.UI5BuilderWebIdePackage="@sap/ui5-builder-webide-extension",a.UI5BuilderWebIdePackageVersion="^1.1.9",a.UI5TaskZipperPackage="ui5-task-zipper",a.UI5TaskZipperPackageVersion="^3.1.3",a.UI5Package="@ui5/cli",a.UI5PackageVersion="^3.9.2",a.CDSAddMtaParams=["add","mta"],a.CDSXSUAAService="xsuaa",a.CDSHTML5RepoService="html5-repo",a.CDSConnectivityService="connectivity",a.CDSDestinationService="destination",a.MTAAPIDestination={Name:a.ResourceMTADestination,Type:"HTTP",URL:"~{srv-api/srv-url}",ProxyType:"Internet",Authentication:"NoAuthentication","HTML5.DynamicDestination":!0,"HTML5.ForwardAuthToken":!0},a.UI5Destination={Name:"ui5",Type:"HTTP",URL:"https://ui5.sap.com",ProxyType:"Internet",Authentication:"NoAuthentication"},a.UI5ResourceDestination={init_data:{instance:{existing_destinations_policy:"update",destinations:[{Name:"ui5",Type:"HTTP",URL:"https://ui5.sap.com",ProxyType:"Internet",Authentication:"NoAuthentication"}]}}},a.UI5StandaloneModuleDestination={group:"destinations",properties:{forwardAuthToken:!1,name:"ui5",url:"https://ui5.sap.com"}},a.DestinationServiceConfig={config:{HTML5Runtime_enabled:!0,version:"1.0.0",...a.UI5ResourceDestination}},a.ServiceAPIRequires={name:a.SRV_API,properties:{"srv-url":a.DefaultServiceURL}},a.HTMLAppBuildParams={builder:"custom","build-result":"dist",commands:["npm install","npm run build:cf"],"supported-platforms":[]},a.UI5DeployBuildScript="ui5 build preload --clean-dest --config ui5-deploy.yaml --include-task=generateCachebusterInfo",a.MTABuildScript="rimraf resources mta_archives && mbt build";a.appDeployMTAScript=e=>`fiori cfDeploy${e.length>0?` ${e.join(" ")}`:""}`;a.rootDeployMTAScript=e=>`cf deploy mta_archives/archive.mtar ${e.length>0?`${e.join(" ")} `:""}--retries 1`;a.undeployMTAScript=e=>`cf undeploy ${e} --delete-services --delete-service-keys --delete-service-brokers`;const cannotFindBinary=(e,a)=>(0,n.t)("error.cannotFindBinary",{bin:e,pkg:a});a.CDSBinNotFound=cannotFindBinary(a.CDSExecutable,a.CDSPackage),a.MTABinNotFound=cannotFindBinary(a.MTAExecutable,a.MTAPackage)},97649:function(e,a,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.initI18n=initI18n,a.t=function t(e,a){return o.default.t(e,a)};const o=n(i(86978)),r=n(i(54417)),s="cf-deploy-config-writer";async function initI18n(){await o.default.init({resources:{en:{[s]:r.default}},lng:"en",fallbackLng:"en",defaultNS:s,ns:[s]})}initI18n().catch((()=>{}))},13149:function(e,a,i){var n=this&&this.__createBinding||(Object.create?function(e,a,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(a,i);o&&!("get"in o?!a.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return a[i]}}),Object.defineProperty(e,n,o)}:function(e,a,i,n){void 0===n&&(n=i),e[n]=a[i]}),o=this&&this.__exportStar||function(e,a){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(a,i)||n(a,e,i)};Object.defineProperty(a,"__esModule",{value:!0}),a.RouterModuleType=a.DefaultMTADestination=void 0,o(i(79875),a),o(i(58445),a);var r=i(54036);Object.defineProperty(a,"DefaultMTADestination",{enumerable:!0,get:function(){return r.DefaultMTADestination}});var s=i(26011);Object.defineProperty(a,"RouterModuleType",{enumerable:!0,get:function(){return s.RouterModuleType}})},57470:(e,a,i)=>{Object.defineProperty(a,"__esModule",{value:!0});const n=i(76277);class LoggerHelper{static _logger=new n.ToolsLogger({logPrefix:"@sap-ux/cf-deploy-config-writer"});static get logger(){return LoggerHelper._logger}static set logger(e){LoggerHelper._logger=e}}a.default=LoggerHelper},79875:function(e,a,i){var n=this&&this.__createBinding||(Object.create?function(e,a,i,n){void 0===n&&(n=i);var o=Object.getOwnPropertyDescriptor(a,i);o&&!("get"in o?!a.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return a[i]}}),Object.defineProperty(e,n,o)}:function(e,a,i,n){void 0===n&&(n=i),e[n]=a[i]}),o=this&&this.__exportStar||function(e,a){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(a,i)||n(a,e,i)},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.getMtaId=async function getMtaId(e){return(await getMtaConfig(e))?.prefix},a.getMtaConfig=getMtaConfig,a.toMtaModuleName=function toMtaModuleName(e){return e.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>]/gi,"").slice(0,128)},a.createMTA=function createMTA(e){const a=(0,s.readFileSync)((0,p.getTemplatePath)(`app/${l.MTAYamlFile}`),"utf-8"),i=(0,c.render)(a,{id:`${e.mtaId.slice(0,128)}`,mtaDescription:e.mtaDescription??l.MTADescription,mtaVersion:e.mtaVersion??l.MTAVersion});(0,s.writeFileSync)((0,d.join)(e.mtaPath,l.MTAYamlFile),i),m.default.logger?.debug((0,f.t)("debug.mtaCreated",{mtaPath:e.mtaPath}))},a.addMtaBuildParams=async function addMtaBuildParams(e){let a=await e.getBuildParameters();a={...a||{}},a["before-all"]||=[];a["before-all"].push({builder:"custom",commands:["npm install"]}),await e.updateBuildParams(a)},a.addMtaDeployParameters=async function addMtaDeployParameters(e){let a=await e.getParameters();a={...a||{}},a[l.deployMode]="html5-repo",a[l.enableParallelDeployments]=!0,await e.updateParameters(a)},a.doesMTABinaryExist=doesMTABinaryExist,a.doesCDSBinaryExist=function doesCDSBinaryExist(){if(!(0,g.sync)(l.CDSExecutable))throw new Error(l.CDSBinNotFound)},a.createCAPMTA=function createCAPMTA(e,a){let i=(0,h.spawnSync)(l.CDSExecutable,[...l.CDSAddMtaParams,...a??[]],{cwd:e});if(i?.error)throw new Error(`Something went wrong creating mta.yaml! ${i.error}`);const n="win32"===process.platform?"npm.cmd":"npm";if(i=(0,h.spawnSync)(n,["install","--ignore-engines"],{cwd:e}),i?.error)throw new Error(`Something went wrong installing node modules! ${i.error}`);m.default.logger?.debug((0,f.t)("debug.capMtaCreated"))},a.validateMtaConfig=function validateMtaConfig(e){if(doesMTABinaryExist(),!e.routerType||!e.mtaId||!e.mtaPath)throw new Error((0,f.t)("error.missingMtaParameters"));if(e.mtaId.length>128||!/^[a-zA-Z_]/.test(e.mtaId))throw new Error((0,f.t)("error.invalidMtaId"));if(!/^[\w\-.]*$/.test(e.mtaId))throw new Error((0,f.t)("error.invalidMtaIdWithChars"));if((0,p.validateVersion)(e.mtaVersion),e.abapServiceProvider&&(!e.abapServiceProvider.abapService||!e.abapServiceProvider.abapServiceName))throw new Error((0,f.t)("error.missingABAPServiceBindingDetails"));(0,p.setMtaDefaults)(e)};const s=i(79896),d=i(16928),c=i(29473),u=i(22495),p=i(37736),l=i(54036),m=r(i(57470)),g=i(44425),h=i(35317),f=i(97649);async function getMtaConfig(e){let a;for(let i=5;i>=0;i--)try{if(a=await u.MtaConfig.newInstance(e,m.default.logger),a?.prefix)break}catch(e){await new Promise((e=>setTimeout(e,300)))}return m.default.logger?.info(`Read mta.yaml with prefix ${a?.prefix}`),a}function doesMTABinaryExist(){if(!(0,g.sync)(l.MTAExecutable))throw new Error(l.MTABinNotFound)}o(i(22495),a)},22495:(e,a,i)=>{Object.defineProperty(a,"__esModule",{value:!0}),a.MtaConfig=void 0,a.isMTAFound=function isMTAFound(e){return(0,r.existsSync)((0,o.join)(e,l.MTAYamlFile))},a.useAbapDirectServiceBinding=async function useAbapDirectServiceBinding(e,a,i="",n){try{let r;if(a){const a=await(0,p.getMtaPath)(e);a&&(r=(0,o.dirname)(a.mtaPath))}else i&&(r=(0,o.dirname)(i));if(r){return(await MtaConfig.newInstance(r,n)).isABAPServiceFound}return!1}catch(e){return n?.debug((0,m.t)("debug.logError",{error:e,method:"useAbapDirectServiceBinding"})),!1}};const n=i(39023),o=i(16928),r=i(79896),s=i(29473),d=i(87827),c=i(75199),u=i(55968),p=i(20787),l=i(54036),m=i(97649),g=i(26011);class MtaConfig{mta;apps=new Map;modules=new Map;resources=new Map;log;mtaDir;dirty=!1;mtaId;static async newInstance(e,a){return new MtaConfig(e,a).init()}constructor(e,a){this.mta=new d.Mta(e,!1),this.log=a,this.mtaDir=e}async init(){try{await this.loadMTAResources(),await this.loadMTAModules(),this.mtaId=await this.mta.getMtaID()}catch(e){this.log?.error((0,m.t)("error.unableToLoadMTA",{error:e,mtaDir:this.mtaDir}))}return this}targetExists(e,a){return e&&-1!==e.findIndex((e=>!0===e.parameters?.["content-target"]&&this.resources.get(a)?.name===e.name))}async loadMTAResources(){(await this.mta.getResources()||[]).forEach((e=>{e.parameters?.service&&("html5-apps-repo"===e.parameters?.service?this.resources.set("app-host"===e.parameters["service-plan"]?l.HTML5RepoHost:"html5-apps-repo:app-runtime",e):"xsuaa"===e.parameters?.service?this.resources.set(l.ManagedXSUAA,e):e.type===g.CloudFoundryServiceType.Existing?this.resources.set(e.name,e):this.resources.set(e.parameters.service,e))})),this.log?.debug((0,m.t)("debug.mtaLoaded",{type:"resources"}))}async loadMTAModules(){(await this.mta.getModules()||[]).forEach((e=>{e.type&&("html5"===e.type?this.apps.set(e.name,e):this.targetExists(e.requires??[],"destination")?this.modules.set("com.sap.application.content:destination",e):this.targetExists(e.requires??[],l.HTML5RepoHost)?this.modules.set("com.sap.application.content:resource",e):this.modules.set(e.type,e))})),this.log?.debug((0,m.t)("debug.mtaLoaded",{type:"modules"}))}async addAppContent(){this.resources.has(l.HTML5RepoHost)||await this.addHtml5Host();const e=this.resources.get(l.HTML5RepoHost)?.name;if(e){const a={name:`${this.prefix.slice(0,100)}-app-content`,type:"com.sap.application.content",path:".",requires:[{name:e,parameters:{"content-target":!0}}],"build-parameters":{"build-result":"resources",requires:[]}};await this.mta.addModule(a),this.modules.set("com.sap.application.content:resource",a),this.dirty=!0}}async addUaa(){const e={name:`${this.prefix.slice(0,100)}-uaa`,type:"org.cloudfoundry.managed-service",parameters:{"service-plan":"application",service:"xsuaa",config:{xsappname:`${this.prefix.slice(0,100)}-\${space-guid}`,"tenant-mode":"dedicated"}}};await this.mta.addResource(e),this.resources.set("xsuaa",e),this.dirty=!0}async addHtml5Runtime(){const e={name:`${this.prefix.slice(0,100)}-html5-repo-runtime`,type:"org.cloudfoundry.managed-service",parameters:{"service-plan":"app-runtime",service:"html5-apps-repo"}};await this.mta.addResource(e),this.resources.set("html5-apps-repo:app-runtime",e),this.dirty=!0}async updateServiceName(e,a){const i=this.resources.get(a);i&&!i.parameters?.["service-name"]&&(i.parameters={...i.parameters??{},"service-name":`${this.prefix.slice(0,100)}-${e}-service`},await this.mta.updateResource(i),this.resources.set(a,i),this.dirty=!0)}async addHtml5Host(){const e={name:`${this.prefix.slice(0,100)}-repo-host`,type:"org.cloudfoundry.managed-service",parameters:{"service-name":`${this.prefix.slice(0,100)}-html5-service`,"service-plan":"app-host",service:"html5-apps-repo"}};await this.mta.addResource(e),this.resources.set(l.HTML5RepoHost,e),this.dirty=!0}async addDestinationResource(e=!1){const a=`${this.prefix.slice(0,100)}-destination-service`,i={name:a,type:"org.cloudfoundry.managed-service",parameters:{service:"destination","service-name":a,"service-plan":"lite",config:{...l.DestinationServiceConfig.config,HTML5Runtime_enabled:e}}};await this.mta.addResource(i),this.resources.set("destination",i),this.dirty=!0}async updateDestinationResource(e=!1){const a=this.resources.get("destination");a&&(a.parameters={...a.parameters??{},config:{...a.parameters?.config??{},HTML5Runtime_enabled:e}},a.parameters?.config?.init_data?.instance?.destinations||(a.parameters.config={...a.parameters.config,...l.UI5ResourceDestination}),a.parameters?.config?.init_data?.instance?.destinations?.some((e=>e.Name===l.UI5Destination.Name))||a.parameters.config.init_data.instance.destinations.push(l.UI5Destination),await this.mta.updateResource(a),this.resources.set("destination",a),this.dirty=!0)}async updateServerModule(e){const a=this.resources.get(l.ManagedXSUAA),i=this.modules.get(e);i&&(i.provides?.some((e=>e.name===l.SRV_API))||(i.provides=[...i.provides??[],l.ServiceAPIRequires]),a&&!i.requires?.some((e=>e.name===a.name))&&(i.requires=[...i.requires??[],{name:a.name}]),await this.mta.updateModule(i),this.modules.set(e,i),this.dirty=!0)}async addManagedUaa(){const e={name:`${this.prefix.slice(0,100)}-uaa`,type:"org.cloudfoundry.managed-service",parameters:{path:"./xs-security.json",service:"xsuaa","service-name":`${this.prefix.slice(0,100)}-xsuaa-service`,"service-plan":"application"}};await this.mta.addResource(e),this.resources.set(l.ManagedXSUAA,e),this.dirty=!0}isODataDestination(e){return(0,c.isGenericODataDestination)(e)||(0,c.isAbapEnvironmentOnBtp)(e)}async cleanupMissingResources(){this.modules.has("com.sap.application.content:resource")||await this.addAppContent(),this.resources.get("destination")?await this.updateDestinationResource(this.modules.has("com.sap.application.content:destination")):await this.addDestinationResource(this.modules.has("com.sap.application.content:destination"))}get prefix(){return this.mtaId}get standaloneRouterPath(){return this.modules.get("approuter.nodejs")?.path}get cloudServiceName(){let e;return this.modules.forEach((a=>{const i=a.parameters?.content?.instance?.destinations||[];"com.sap.application.content"===a.type&&i.length&&i.some((a=>{if(e=a["sap.cloud.service"]||void 0,e)return!0}))})),e}async getParameters(){return this.mta.getParameters()}async getBuildParameters(){return this.mta.getBuildParameters()}async updateParameters(e){await this.mta.updateParameters(e)}async updateBuildParams(e){await this.mta.updateBuildParameters(e)}async addApp(e,a){const i=this.modules.get("com.sap.application.content:resource");let n=!1;if(i){i[l.MTABuildParams]=i[l.MTABuildParams]??{},i[l.MTABuildParams][l.MTABuildResult]=i[l.MTABuildParams]?.[l.MTABuildResult]??"resources",i[l.MTABuildParams].requires=i[l.MTABuildParams].requires??[];const a=`${e.slice(0,128)}.zip`;-1!==i[l.MTABuildParams].requires?.findIndex((e=>e.artifacts?.includes?.(a)))?n=!0:i[l.MTABuildParams].requires.push({name:e.slice(0,128),artifacts:[a],"target-path":`${i[l.MTABuildParams][l.MTABuildResult]}/`.replace(/\/{2,}/g,"/")}),await this.mta.updateModule(i),this.dirty=!0}const o=await this.mta.getModules();for(const a of o)"html5"===a.type&&a.name.endsWith(e)&&n&&(a["build-parameters"]=l.HTMLAppBuildParams,await this.mta.updateModule(a),this.dirty=!0);if(!n&&!this.apps.get(e)){const i={name:e.slice(0,128),type:"html5",path:a,"build-parameters":l.HTMLAppBuildParams};await this.mta.addModule(i),this.apps.set(e,i),this.dirty=!0}}async addConnectivityResource(){const e="connectivity",a=g.CloudFoundryServiceType.Managed,i=`${this.prefix.slice(0,100)}-connectivity`,n=this.modules.get("approuter.nodejs");n&&-1===n.requires?.findIndex((e=>e.name===i))&&(n.requires.push({name:i}),await this.mta.updateModule(n));const o={name:i,type:a,parameters:{service:e,"service-plan":"lite"}};this.resources.has(e)||(await this.mta.addResource(o),this.resources.set(e,o)),this.dirty=!0}async addRoutingModules({isManagedApp:e=!1,addMissingModules:a=!0}={}){e&&await this.addManagedAppRouter(),a&&await this.cleanupMissingResources();for(const e of[this.modules.get("com.sap.application.content:destination"),this.modules.get("approuter.nodejs")].filter((e=>void 0!==e))){const a=this.resources.get("destination")?.name??`${this.prefix.slice(0,100)}-destination-service`;-1===e?.requires?.findIndex((e=>e.name===a))&&("approuter.nodejs"===e.type&&e.requires.push({name:a,...l.UI5StandaloneModuleDestination}),"com.sap.application.content"===e.type&&e.requires.push({name:a,parameters:{"content-target":!0}}),await this.mta.updateModule(e),this.dirty=!0)}}async addAbapService(e,a){const i=`${this.prefix.slice(0,24)}-abap-${e.slice(0,20)}`,n=this.modules.get("approuter.nodejs");n&&-1===n.requires?.findIndex((e=>e.name===i))&&(n.requires.push({name:i}),await this.mta.updateModule(n));const o={name:i,type:g.CloudFoundryServiceType.Existing,parameters:{"service-name":e,protocol:["ODataV2"],service:a,"service-plan":"16_abap_64_db"}};this.resources.has(i)||(await this.mta.addResource(o),this.resources.set(i,o)),this.dirty=!0}get isABAPServiceFound(){let e=!1;const a=Array.from(this.resources.keys());for(const i of a)if(i.includes(`${this.prefix}-abap-`)){e=!0;break}return e}async addStandaloneRouter(e=!1){this.resources.has("xsuaa")||await this.addUaa(),this.resources.has("html5-apps-repo:app-runtime")||await this.addHtml5Runtime(),this.resources.has("destination")||await this.addDestinationResource();const a=this.resources.get("html5-apps-repo:app-runtime")?.name,i=this.resources.get("xsuaa")?.name,n=this.resources.get("destination")?.name;if(n&&i&&a){const o={name:`${this.prefix.slice(0,100)}-router`,type:"approuter.nodejs",path:e?`${l.RouterModule}`:`${l.CloudFoundry}/${l.RouterModule}`,parameters:{"disk-quota":"256M",memory:"256M"},requires:[{name:a},{name:i},{name:n,group:"destinations",properties:{name:"ui5",url:"https://ui5.sap.com",forwardAuthToken:!1}}]};await this.mta.addModule(o),this.modules.set("approuter.nodejs",o),this.dirty=!0}}hasManagedXsuaaResource(){return this.resources.has(l.ManagedXSUAA)}async addMtaExtensionConfig(e,a,i){let n=this.resources.get("destination")?.name;n||(this.log?.info((0,m.t)("info.existingDestinationNotFound")),n=`${this.prefix.slice(0,100)}-destination-service`);const d=this.mtaId,c=(0,o.join)(this.mta.mtaDirPath,l.MTAFileExtension);let p;try{const e=(0,r.readFileSync)(c,"utf-8");p=await u.YamlDocument.newInstance(e)}catch(e){this.log?.info((0,m.t)("info.existingMTAExtensionNotFound"))}if(p){const o=p.getSequence({path:"resources"}).items.findIndex((e=>e.get("name")===n));if(o>-1){const n={Authentication:"NoAuthentication",Name:e,ProxyType:"Internet",Type:"HTTP",URL:a,[`URL.headers.${i.key}`]:i.value};p.appendTo({path:`resources.${o}.parameters.config.init_data.instance.destinations`,value:n}),(0,r.writeFileSync)(c,p.toString()),this.log?.info((0,m.t)("info.mtaExtensionUpdated",{mtaExtFile:l.MTAFileExtension}))}else this.log?.error((0,m.t)("error.updatingMTAExtensionFailed",{mtaExtFilePath:c}))}else{const u={appMtaId:d,mtaExtensionId:`${d}-ext`,destinationName:e,destinationUrl:a,headerKey:i.key,headerValue:i.value,destinationServiceName:n,mtaVersion:"1.0.0"},p=(0,r.readFileSync)((0,o.join)(__dirname,`../../templates/app/${l.MTAFileExtension}`),"utf-8");(0,r.writeFileSync)(c,(0,s.render)(p,u)),this.log?.info((0,m.t)("info.mtaExtensionCreated",{appMtaId:d,mtaExtFile:l.MTAFileExtension}))}}async appendInstanceBasedDestination(e){const a=this.resources.get("destination");if(a){a.requires?.some((e=>e.name===l.SRV_API))||(a.requires=[...a.requires??[],{name:l.SRV_API}]);const i=e===l.DefaultMTADestination?this.getFormattedPrefix(l.ResourceMTADestination):e;a.parameters?.config?.init_data?.instance?.destinations?.some((e=>e.Name===i))||a.parameters?.config?.init_data?.instance?.destinations?.push({...l.MTAAPIDestination,Name:i}),await this.mta.updateResource(a),this.resources.set("destination",a),await this.updateServerModule(this.modules.has("nodejs")?"nodejs":"java"),this.dirty=!0}}async save(){return this.dirty&&await this.mta.save(),this.dirty}async addManagedAppRouter(){if(this.resources.has("destination")||await this.addDestinationResource(!0),this.resources.has(l.ManagedXSUAA)||await this.addManagedUaa(),this.resources.has(l.HTML5RepoHost)||await this.addHtml5Host(),await this.updateServiceName("html5",l.HTML5RepoHost),await this.updateServiceName("xsuaa",l.ManagedXSUAA),!this.modules.has("com.sap.application.content:destination")){const e=this.resources.get("destination")?.name,a=this.resources.get(l.HTML5RepoHost)?.name,i=this.resources.get(l.HTML5RepoHost)?.parameters?.["service-name"],n=this.resources.get(l.ManagedXSUAA)?.name,o=this.resources.get(l.ManagedXSUAA)?.parameters?.["service-name"];if(e&&a&&n&&o){const r={name:`${this.prefix.slice(0,100)}-destination-content`,type:"com.sap.application.content",requires:[{name:e,parameters:{"content-target":!0}},{name:a,parameters:{"service-key":{name:`${a}-key`}}},{name:n,parameters:{"service-key":{name:`${n}-key`}}}],parameters:{content:{instance:{destinations:[{Name:`${this.prefix.slice(0,100)}_html_repo_host`,ServiceInstanceName:i,ServiceKeyName:`${a}-key`,"sap.cloud.service":`${this.prefix.slice(0,100)}`},{Authentication:"OAuth2UserTokenExchange",Name:`${this.prefix.slice(0,100)}_uaa`,ServiceInstanceName:o,ServiceKeyName:`${n}-key`,"sap.cloud.service":`${this.prefix.slice(0,100)}`}],existing_destinations_policy:"update"}}},"build-parameters":{"no-source":!0}};await this.mta.addModule(r),this.modules.set("com.sap.application.content:destination",r),this.dirty=!0}}}getExposedDestinations(e=!1){const a=[],i=this.resources.get("destination");i&&(i.parameters?.config?.init_data?.instance?.destinations?.forEach((i=>(!e||this.isODataDestination(i))&&a.push(i.Name))),i.parameters?.config?.init_data?.subaccount?.destinations?.forEach((i=>(!e||this.isODataDestination(i))&&a.push(i.Name))));const n=this.modules.get("com.sap.application.content:destination");return n&&n.parameters?.content?.instance?.destinations?.map((i=>(!e||this.isODataDestination(i))&&a.push(i.Name))),a}getFormattedPrefix(e){return(0,n.format)(e,this.prefix).replace(/[^\w-]/g,"_")}}a.MtaConfig=MtaConfig},26011:(e,a)=>{var i;Object.defineProperty(a,"__esModule",{value:!0}),a.RouterModuleType=a.CloudFoundryServiceType=void 0,function(e){e.Existing="org.cloudfoundry.existing-service",e.Managed="org.cloudfoundry.managed-service"}(i||(a.CloudFoundryServiceType=i={})),a.RouterModuleType={Standard:"standard",Managed:"managed"}},37736:function(e,a,i){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(a,"__esModule",{value:!0}),a.readManifest=async function readManifest(e,a){return a.readJSON(e)},a.getTemplatePath=getTemplatePath,a.toMtaModuleName=toMtaModuleName,a.toPosixPath=function toPosixPath(e){return(0,o.normalize)(e).split(/[\\/]/g).join(o.posix.sep)},a.getDestinationProperties=async function getDestinationProperties(e){let a,i=!1;if((0,s.isAppStudio)()&&e){const n=await getBTPDestinations();n[e]&&(i=(0,s.isFullUrlDestination)(n[e]),a=n[e].Authentication)}return{destinationIsFullUrl:i,destinationAuthentication:a}},a.getBTPDestinations=getBTPDestinations,a.validateVersion=function validateVersion(e){const a=(0,r.coerce)(e);if(e&&!a||a&&!(0,r.satisfies)(a,`>=${c.MTAVersion}`))throw new Error("Invalid MTA version specified. Please use version 0.0.1 or higher.");return!0},a.addXSSecurityConfig=addXSSecurityConfig,a.addGitIgnore=addGitIgnore,a.addRootPackage=addRootPackage,a.addCommonPackageDependencies=async function addCommonPackageDependencies(e,a){await(0,d.addPackageDevDependency)(e,c.UI5BuilderWebIdePackage,c.UI5BuilderWebIdePackageVersion,a),await(0,d.addPackageDevDependency)(e,c.UI5TaskZipperPackage,c.UI5TaskZipperPackageVersion,a),await(0,d.addPackageDevDependency)(e,c.UI5Package,c.UI5PackageVersion,a)},a.generateSupportingConfig=async function generateSupportingConfig(e,a){const i=e.mtaId??await(0,p.getMtaId)(e.rootPath),n={mtaId:i,mtaPath:e.rootPath};i&&!a.exists((0,o.join)(e.rootPath,"package.json"))&&addRootPackage(n,a);e.addManagedAppRouter&&!a.exists((0,o.join)(e.rootPath,c.XSSecurityFile))&&addXSSecurityConfig(n,a);a.exists((0,o.join)(e.rootPath,".gitignore"))||addGitIgnore(e.rootPath,a)},a.addSupportingConfig=function addSupportingConfig(e,a){addRootPackage(e,a),addGitIgnore(e.mtaPath,a),addXSSecurityConfig(e,a)},a.addRoutingConfig=async function addRoutingConfig(e,a){const i=await p.MtaConfig.newInstance(e.mtaPath);e.routerType===u.RouterModuleType.Standard?await async function addStandaloneRouter(e,a,i){await a.addStandaloneRouter(!0),e.addConnectivityService&&await a.addConnectivityResource();const{abapServiceName:n,abapService:r}=e.abapServiceProvider??{};n&&r&&await a.addAbapService(n,r);if(i.copyTpl(getTemplatePath("router/package.json"),(0,o.join)(e.mtaPath,`${c.RouterModule}/${d.FileName.Package}`)),n){let a;try{a=(await(0,l.apiGetInstanceCredentials)(n))?.credentials}catch{m.default.logger?.error((0,g.t)("error.serviceKeyFailed"))}const r=a?.endpoints?Object.keys(a.endpoints):[""],s=a?a["sap.cloud.service"]:"";i.copyTpl(getTemplatePath("router/xs-app-abapservice.json"),(0,o.join)(e.mtaPath,`${c.RouterModule}/${c.XSAppFile}`),{servicekeyService:s,servicekeyEndpoint:r[0]})}else i.copyTpl(getTemplatePath("router/xs-app-server.json"),(0,o.join)(e.mtaPath,`${c.RouterModule}/${c.XSAppFile}`))}(e,i,a):await i.addRoutingModules({isManagedApp:!0,addMissingModules:!1});await(0,p.addMtaDeployParameters)(i),await i.save()},a.setMtaDefaults=function setMtaDefaults(e){e.mtaPath=e.mtaPath.replace(/\/$/,""),e.addConnectivityService||=!1,e.mtaId=toMtaModuleName(e.mtaId)},a.updateRootPackage=async function updateRootPackage({mtaId:e,rootPath:a},i){if(i.exists((0,o.join)(a,d.FileName.Package))){await(0,d.addPackageDevDependency)(a,c.Rimraf,c.RimrafVersion,i),await(0,d.addPackageDevDependency)(a,c.MbtPackage,c.MbtPackageVersion,i);let n=[];i.exists((0,o.join)(a,c.MTAFileExtension))&&(n=["-e",c.MTAFileExtension]);for(const o of[{name:"undeploy",run:(0,c.undeployMTAScript)(e)},{name:"build",run:`${c.MTABuildScript} --mtar archive`},{name:"deploy",run:(0,c.rootDeployMTAScript)(n)}])await(0,d.updatePackageScript)(a,o.name,o.run,i)}};const o=i(16928),r=i(85263),s=i(75199),d=i(20787),c=i(54036),u=i(26011),p=i(79875),l=i(14501),m=n(i(57470)),g=i(97649);let h={};function getTemplatePath(e){return(0,o.join)(__dirname,"../templates",e)}function toMtaModuleName(e){return e.replace(/[`~!@#$%^&*£()|+=?;:'",.<>]/gi,"")}async function getBTPDestinations(){return 0===Object.keys(h).length&&(h=await(0,s.listDestinations)({stripS4HCApiHosts:!0})),h}function addXSSecurityConfig({mtaPath:e,mtaId:a},i){i.copyTpl(getTemplatePath(`common/${c.XSSecurityFile}`),(0,o.join)(e,c.XSSecurityFile),{id:a.slice(0,100)})}function addGitIgnore(e,a){a.copyTpl(getTemplatePath("gitignore.tmpl"),(0,o.join)(e,".gitignore"),{})}function addRootPackage({mtaPath:e,mtaId:a},i){i.copyTpl(getTemplatePath("package.json"),(0,o.join)(e,d.FileName.Package),{mtaId:a})}},54417:e=>{e.exports=JSON.parse('{"debug":{"logError":"{{method}} error found {{ error }}","mtaLoaded":"MTA {{ type }} loaded","ui5YamlDoesNotExist":"File ui5.yaml does not exist in the project","capMtaCreated":"CAP MTA Configuration created","mtaCreated":"MTA Configuration created {{mtaPath}}.","mtaSaved":"MTA Configuration has been saved.","mtaSavedFailed":"MTA saved failed with error {{- error }}"},"error":{"unableToLoadMTA":"Unable to load mta.yaml configuration {{- mtaDir }}, error thrown {{- error }}.","updatingMTAExtensionFailed":"Unable to add mta extension configuration to file: {{mtaExtFilePath}}.","cannotFindBinary":"Cannot find the \\"{{bin}}\\" executable. Please add it to the path or use \\"npm i -g {{- pkg}}\\" to install it.","mtaExtensionFailed":"Unable to create or update the mta extension file for Api Hub Enterprise destination configuration: {{error}}.","serviceKeyFailed":"Failed to fetch service key.","missingMtaParameters":"Missing required parameters, MTA path, MTA ID or router type is missing.","invalidMtaIdWithChars":"The MTA ID can only contain letters, numbers, dashes, periods, underscores.","invalidMtaId":"The MTA ID must start with a letter or underscore and be less than 128 characters long.","missingABAPServiceBindingDetails":"Missing ABAP service details for direct service binding.","mtaFolderAlreadyExists":"A folder with same name already exists in the target directory.","mtaAlreadyExists":"An mta.yaml already exists in the target directory.","cannotUpdateRouterXSApp":"Unable to update router xs-app.json welcome location.","targetFolderDoesNotExist":"Target folder does not exist, {{targetFolder}}.","doesNotContainACapApp":"Target folder does not contain a Node.js CAP project."},"info":{"existingMTAExtensionNotFound":"Cannot find a valid existing mta extension file, a new one will be created.","existingDestinationNotFound":"A destination service resource cannot be found in the mta.yaml. An mta extension destination instance cannot be added.","mtaExtensionCreated":"Created file: {{mtaExtFile}} to extend mta module {{appMtaId}} with destination configuration.","mtaExtensionUpdated":"Updated file: {{mtaExtFile}} with module destination configuration."}}')}};