dcdx 1.2.0-next.6 → 1.2.0

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.
Files changed (75) hide show
  1. package/assets/versions.json +1 -1
  2. package/lib/commands/build.js +8510 -1
  3. package/lib/commands/database.js +8441 -1
  4. package/lib/commands/debug.js +9257 -0
  5. package/lib/commands/profile.js +2 -1
  6. package/lib/commands/reset.js +9194 -1
  7. package/lib/commands/run.js +9227 -1
  8. package/lib/commands/stop.js +9191 -1
  9. package/lib/index.js +93 -1
  10. package/lib/types/src/applications/bamboo.d.ts +4 -6
  11. package/lib/types/src/applications/base.d.ts +8 -12
  12. package/lib/types/src/applications/bitbucket.d.ts +4 -6
  13. package/lib/types/src/applications/confluence.d.ts +4 -6
  14. package/lib/types/src/applications/jira.d.ts +4 -6
  15. package/lib/types/src/databases/base.d.ts +7 -15
  16. package/lib/types/src/databases/mssql.d.ts +3 -12
  17. package/lib/types/src/databases/mysql.d.ts +3 -12
  18. package/lib/types/src/databases/postgres.d.ts +3 -12
  19. package/lib/types/src/helpers/ActionHandler.d.ts +39 -0
  20. package/lib/types/src/helpers/FileWatcher.d.ts +3 -0
  21. package/lib/types/src/helpers/amps.d.ts +22 -12
  22. package/lib/types/src/helpers/docker.d.ts +3 -5
  23. package/lib/types/src/helpers/getApplication.d.ts +2 -6
  24. package/lib/types/src/helpers/getDatabaseEngine.d.ts +2 -0
  25. package/lib/types/src/helpers/getZodDefaults.d.ts +3 -0
  26. package/lib/types/src/helpers/licences.d.ts +2 -2
  27. package/lib/types/src/helpers/showHelpWithDefaultCommandOptions.d.ts +2 -0
  28. package/lib/types/src/types/AMPS.d.ts +96 -0
  29. package/lib/types/src/types/Application.d.ts +65 -0
  30. package/lib/types/src/types/Database.d.ts +169 -0
  31. package/package.json +10 -5
  32. package/lib/commands/database/mssql.js +0 -2
  33. package/lib/commands/database/mysql.js +0 -2
  34. package/lib/commands/database/postgres.js +0 -2
  35. package/lib/commands/reset/bamboo.js +0 -2
  36. package/lib/commands/reset/bitbucket.js +0 -2
  37. package/lib/commands/reset/command.js +0 -2
  38. package/lib/commands/reset/confluence.js +0 -2
  39. package/lib/commands/reset/jira.js +0 -2
  40. package/lib/commands/run/bamboo.js +0 -2
  41. package/lib/commands/run/bitbucket.js +0 -2
  42. package/lib/commands/run/command.js +0 -2
  43. package/lib/commands/run/confluence.js +0 -2
  44. package/lib/commands/run/jira.js +0 -2
  45. package/lib/commands/start.js +0 -2
  46. package/lib/commands/stop/bamboo.js +0 -2
  47. package/lib/commands/stop/bitbucket.js +0 -2
  48. package/lib/commands/stop/command.js +0 -2
  49. package/lib/commands/stop/confluence.js +0 -2
  50. package/lib/commands/stop/jira.js +0 -2
  51. package/lib/types/src/commands/database/mysql.d.ts +0 -2
  52. package/lib/types/src/commands/database/postgres.d.ts +0 -2
  53. package/lib/types/src/commands/reset/bamboo.d.ts +0 -2
  54. package/lib/types/src/commands/reset/bitbucket.d.ts +0 -2
  55. package/lib/types/src/commands/reset/command.d.ts +0 -3
  56. package/lib/types/src/commands/reset/confluence.d.ts +0 -2
  57. package/lib/types/src/commands/reset/jira.d.ts +0 -2
  58. package/lib/types/src/commands/run/bamboo.d.ts +0 -2
  59. package/lib/types/src/commands/run/bitbucket.d.ts +0 -2
  60. package/lib/types/src/commands/run/command.d.ts +0 -3
  61. package/lib/types/src/commands/run/confluence.d.ts +0 -2
  62. package/lib/types/src/commands/run/jira.d.ts +0 -2
  63. package/lib/types/src/commands/start.d.ts +0 -2
  64. package/lib/types/src/commands/stop/bamboo.d.ts +0 -2
  65. package/lib/types/src/commands/stop/bitbucket.d.ts +0 -2
  66. package/lib/types/src/commands/stop/command.d.ts +0 -3
  67. package/lib/types/src/commands/stop/confluence.d.ts +0 -2
  68. package/lib/types/src/commands/stop/jira.d.ts +0 -2
  69. package/lib/types/src/types/ApplicationOptions.d.ts +0 -13
  70. package/lib/types/src/types/DatabaseEngine.d.ts +0 -17
  71. package/lib/types/src/types/DatabaseOptions.d.ts +0 -9
  72. package/lib/types/src/types/SupportedApplications.d.ts +0 -6
  73. package/lib/types/src/types/SupportedDatabaseDrivers.d.ts +0 -1
  74. package/lib/types/src/types/SupportedDatabaseEngines.d.ts +0 -1
  75. /package/lib/types/src/commands/{database/mssql.d.ts → debug.d.ts} +0 -0
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{watch as t}from"chokidar";import{program as e,Option as a}from"commander";import{gracefulExit as s,asyncExitHook as o}from"exit-hook";import{cwd as i}from"process";import{DOMParser as n,XMLSerializer as r}from"@xmldom/xmldom";import{spawn as c}from"child_process";import{XMLParser as l}from"fast-xml-parser";import{existsSync as d,readFileSync as p,mkdirSync as u}from"fs";import h from"xpath";import{hideBin as g}from"yargs/helpers";import m from"yargs/yargs";import b from"axios";import{dirname as A,join as v}from"path";import{stop as w,downAll as f,ps as S,execCompose as k,upAll as P}from"docker-compose/dist/v2.js";import R from"events";import{dump as E}from"js-yaml";import{homedir as C}from"os";import T from"simple-git";import{upAll as D}from"docker-compose";import{Sequelize as O,ConnectionError as y,TimeoutError as M,ConnectionTimedOutError as x,ConnectionRefusedError as U,ConnectionAcquireTimeoutError as q}from"sequelize";var L;!function(t){t.JIRA="jira",t.CONFLUENCE="confluence",t.BITBUCKET="bitbucket",t.BAMBOO="bamboo"}(L||(L={}));const{P:j,activeProfiles:B}=m(g(process.argv)).parseSync(),_=j||B||void 0;class AMPS{static maven;static stop(){AMPS.maven&&AMPS.maven.kill(0)}static async build(t){return new Promise(((e,a)=>{if(AMPS.maven){AMPS.maven.kill(0)||a(new Error("Failed to terminate existing Maven process"))}AMPS.maven=c("mvn",["package",...t],{cwd:i(),stdio:"inherit"}),AMPS.maven.on("exit",(t=>{AMPS.maven=null,0===t||130===t?e():a(new Error(`Maven exited with code ${t}`))}))}))}static isAtlassianPlugin=()=>{try{return AMPS.getNodes("//*[local-name()='packaging']").some((t=>"atlassian-plugin"===t.textContent))}catch(t){return!1}};static getApplicationVersion(){const t=_?AMPS.getNodes(`//*[local-name()='profile']/*[local-name()='id' and text()='${_}']/..//*[local-name()='groupId' and text()='com.atlassian.maven.plugins']`,!0):AMPS.getNodes("//*[local-name()='groupId' and text()='com.atlassian.maven.plugins']",!0);if(t){const e=t.parentNode;if(e){const{plugin:t}=AMPS.toObject(e),a=t?.configuration?.productVersion;return a?this.doPropertyReplacement(a):void 0}}}static getApplication(){const t=AMPS.getApplications();if(1===t.length)return t[0];if(_){const t=AMPS.getApplications(_);if(1===t.length)return t[0]}return null}static getApplications(t){const e=new Set;return(t?AMPS.getNodes(`//*[local-name()='profile']/*[local-name()='id' and text()='${t}']/..//*[local-name()='groupId' and text()='com.atlassian.maven.plugins']`):AMPS.getNodes("//*[local-name()='groupId' and text()='com.atlassian.maven.plugins']")).forEach((t=>{const a=t.parentNode;if(a){const{plugin:t}=AMPS.toObject(a);t?.artifactId?.includes(L.JIRA)?e.add(L.JIRA):t?.artifactId?.includes(L.CONFLUENCE)?e.add(L.CONFLUENCE):t?.artifactId?.includes(L.BAMBOO)?e.add(L.BAMBOO):t?.artifactId?.includes(L.BITBUCKET)&&e.add(L.BITBUCKET)}})),Array.from(e)}static doPropertyReplacement(t){let e=t;const a=_?AMPS.getProperties(_):{};Object.entries(a).forEach((([t,a])=>{e=e.replaceAll(`\${${t}}`,a)}));const s=AMPS.getProperties();return Object.entries(s).forEach((([t,a])=>{e=e.replaceAll(`\${${t}}`,a)})),e}static getProperties(t){const e={};return(t?AMPS.getNodes(`//*[local-name()='profile']/*[local-name()='id' and text()='${t}']/..//*[local-name()='properties']`):AMPS.getNodes("//*[local-name()='properties']")).forEach((t=>{const{properties:a}=AMPS.toObject(t);Object.entries(a).forEach((([t,a])=>e[t]=a))})),e}static getNodes(t,e){if(d("./pom.xml")){const a=p("./pom.xml","utf8"),s=(new n).parseFromString(a,"text/xml"),o=e?h.select(t,s,!0):h.select(t,s,!1);return Array.isArray(o)||e?o:[]}return[]}static toObject(t){try{return(new l).parse((new r).serializeToString(t))}catch(t){return null}}}const N="AAACBA0ODAoPeNp9kl1v2jAUhu/zK460OyQHSLuVIkUaTbwNVBKUhEnbugsTDuA2sSPbgbFfPxOC1i+4yEXO5+vnPR+yGiGSW/CuoXc7vBoMvT4ENAOv5/WctUIUG1lVqNx7nqPQSJfccCl8GmU0mSXjlDpRXS5Qxau5RqV90ncCKQzLTcRK9Eu944Ip/cQ/M1MwrTkTbi5LZ1arfMM0hsyg7/X6A9LvE89z2j3ZvsJmQBBPpzQJxqP7U4r+qbjaN32zG+/baR2dMl6c35ei2qIah/4dvaHkOvzpkU/x5IZ8vbodOI9cMbdSclnnxj38EC1XZscUunYy36JvVI3OxGZmbZXdzwIU5lVJWi90rnjVQGoi70B873GNhPOQO51OFGfkS5yQWRKH8yAbxxGZp9Qm/EChpbGExR7MBqGdAlTkcokK7MMeMTfwa2NM9TDsdtfSfQGnWxw7CB47frsQShDSwJJro/iiNmgncw1GQl5rI0trtetY4sKgYCJ/Y4qVFSR0lNGQ3P04aDxrTKvWOjMXT0LuxCU33txaSiPffuRjr3fsO/mC6og/VmsmuGYN0Ij93TFYcVXunQaaDb4+wJbFd7vg0OI5If53NENtoK2AlVQwGScjSFt5lrjdWymu8WEIgSwtppyzAsLgxRk8P5hG9PMA3bKiPspdsULjJRwX7ukf5/NX7TAtAhUAhQSHz9DgycOX7wcwERMJb3TLGb4CFGkB/xUWSRK3BZLrPF9Rn6ZmrUqJX02oc",I="AAACzg0ODAoPeNp9VO9v2jAQ/Z6/wtK+IYWGsEKHFGmQmJau/GgIm9iYJhMOYprYke1A4a+fSchGKtqPPvvevXv3zp/6gqLHLEb2HbKsTvNzp9lC98MA2ZbdNKYgdiAGntPDQ2z688HcdH/aM7P5o2kZTzQEJiE4pDAiCTgBngaD0b0RCr5f1S9uHfcUWXSQBzuIeQrCCDlb10mo6A4cJTLQSVlIlzFUggpI8ickMbAVEbI+ypIliPG6R5Il5z4kXEF3A0xJp1Gywa8pFQePKHAmDdt6+A9cJVQEK5yWmhMV8HGZLRWkwrF8PZMgpGPfGh7IUNBUUc6cAKRCcVEYrblAaZxtKEOrsqj8V/US85zxXd+fUGwD70ickRwyf7ARACziqUYo+8Irmt/jUYD9iT+YYmNIKFPACAuvyHIaQEUSHYgz0G8rorgC8rp5qvaEZVp3pt0u8sve3TiTCsSIr0A6llGr1VwfdwPsmb25PjjbVwq2EcZcm6nS6DKX+I3iT1yP/Cy42TBe4FAK0WhZVtu6azYbZeZlB0U2wrpnkQoqq40Uyst67RqB9zU8k64olYeqKnGmNCzWiseOUoKwhLLoK1ExkZISVg95cr3ZN/YqdueSYW649/mdrfJAZOQM3b3b96DRuhVk3261kkFvexwe41UQtJN12u5Gz6GcPT7Pn71H70t69CPcbx/a9rcj3rDuwlk4xprKCA5VN+oJjsaB2R/75sQfezM3GIxH5myKT6PN/QErtDwgFQE6E9VDCLUZtN8F30Ko0K9IqXTRubnZ8HpFlZtzAyYUGb/ryOOIcYVWVCpBl5kCjUwlUhyF2mY80WaoXxdzEhOWe2YsNoRRWWxMt6xX/hH6P5uxF8b3rLJIlz1LpQW95pQPvqfLq0kmwohIeLs2l9PMzfQ48LvvWTbfMY1AXDg9KJDLCV2C9HUMH+CaJfOfudi/v0kIGVswLAIUEMQ9X77gqGBdfH0HIzBaV8NadPUCFBn+RiUA4D+IqVQpTTouLVY66aCGX02121",J="AAABmg0ODAoPeNp9Ul1v0zAUfc+vsMRbJadJtjGpUiS2JJRONOlaB4SAB9e9W0xTu7JvCv33eImDOoR4vefe4/PhN59hR5bckPiWRNezKJ5FCZkvGUmiJA4yrZALLPkBUrHXotEnu5eBRW6b8KMUoCyw8xH6BVZs2KKce3TJpUJQXAkofh2lOeccIV1dfRhJC7fRXrJuwJzALPL0/qF+pI9XGaPz+uGGspvbkdRx8Awcr0nRdOCnlXnmSlqOUqv0DltureTKg6vOiIZb6J9PoviaRm9pHHs0M9Cf/Rv1Dv/SP5lMyorR99WartZVXmdsUZW03hQOSHtCF+n2TLAB4hlIoYTegSFHo3+AQPK1QTx+m02nzzrko+JQ6MO0HS4oDBffQ5JrojSSnbRo5LZDcMzSEtREdBb1AYwNRzsXff0JgjCwLjG/4mB5giE+JzhbF3esyOn9lxf1F2145a6OWu2V/qmC/2dVdoctmOqptk5PGid+XJx42w3NPPHWQuD9fXJbL8PktfLhU2Av+N2rYMY6uUEFpncY/AYCgfFAMCwCFHzkBlkGH/vRdTeeBSfUMzUDb4W2AhQyM893WPg2Q8oQAYRdBSyKeVUdog==X02jr",V="AAAB3w0ODAoPeNp9Ultr2zAYffevEOwtoMR10qYLGJbYWsno7GA7g90eZPlrotWWjCSnzX79FF8IYWkfDPJ3Oedwzvch2zdoWSvkzpF7v5jdLrwpCkiaIc/1POeRMxAasmMNEa3Az2xnHT04gQJquBQhNeB77vQGuzPs3jk5rXIpx5QZfgDfqAaGUtRUOaj4adX+PkpGy+UOhNE+vnGG5laDags9L3mtuToOJF5Pkja5ZorXJwEXHG+pJQdaNvS/cYtLAysBVFfu19ehvxXPQr4IJwV1AGULKzIneBb+8PBd/GWOH6Yf751No9ieaujleYMHKYl8++Fb13VGo1EUZ/hznOBNEofbIFvHEd6mxDb81kQoUH5EZg+op0dEMFmAQrWSf4AZ9HNvTP1rMZnsrLGmpFpzKsZMVpOy28DQbfweo1AiIQ0quDaK540Bi8w1MhKxRhtZWXvHTghn+zLQBvU46Ela1rLZcYEKOEApazvvfKXceiSoYG/kcTXhTUlFG+XVbgKVNHA+gF7BN8t3UuU5sdpRwXUXGnmlVV0CCmRVU3G8Evf5MKUw9vqIFV36tX7moNjfo7CPTxfenZIJErLMSIhX309pvDd8SUgK3smKMpJsknVKBtr26t4D+gd3AC5qMCwCFHOaTWfFvLCLJPft3qktVo3FafmZAhRojb9IAxj8KEqPDQy0stos394SQQ==X02mq",toAbsolutePath=t=>{const[,e]=process.argv,a=A(e),s=a.substring(0,a.indexOf("dcdx")+4);return v(s,t.replaceAll("../",""))},Q={name:"shared",driver:"bridge"};let G=class Base extends R{options;sequelize=null;constructor(t){super(),this.options=t}async run(t,e){try{if(!this.sequelize)throw new Error("Database connection does not exist");await this.sequelize.query(t,{logging:e})}catch(e){console.error("An error occurred while trying to run the following SQL query:",t,e),s()}return null}async start(t=this.options.clean){console.log(`Starting instance of ${this.name} ⏳`),t&&await this.down(),await this.up(),this.emit(`${this.name}:up`);if(await this.waitUntilReady()){if(console.log(`Database is ready and accepting connections on localhost:${this.options.port} 🗄️`),await this.onDatabaseReady(),this.emit("db:ready"),this.options.logging){const t=await this.getServiceState();t&&await this.showDockerLogs(t.name)}}else console.log(`Failed to start database ${this.name} ⛔`),s(0)}async stop(t=this.options.prune){if(t)await this.down();else{const t=E(this.getDockerComposeConfig());await w({cwd:i(),configAsString:t,log:!0})}this.emit("db:stopped")}async onDatabaseReady(){}getDockerComposeConfig(){return{version:"3.8",services:{db:this.getService()},networks:{shared:Q}}}async up(){const t=E(this.getDockerComposeConfig());return D({cwd:i(),configAsString:t,log:!0})}async down(){const t=E(this.getDockerComposeConfig());return f({cwd:i(),configAsString:t,commandOptions:["-v","--remove-orphans","--rmi","local"],log:!0})}async waitUntilReady(){try{const t="mssql"===this.name?"master":this.options.database;return this.sequelize=new O(t,this.options.username,this.options.password,{host:"localhost",port:this.options.port,dialect:this.name.replace("postgresql","postgres"),retry:{max:30,match:[y,M,x,U,q],backoffBase:1e3,backoffExponent:1},logging:!1}),this.sequelize.authenticate().then((()=>!0)).catch((t=>(console.log(t),!1)))}catch(t){return!1}}async getServiceState(){const t=E(this.getDockerComposeConfig());return(await S({configAsString:t,log:!1,commandOptions:["--all"]})).data.services.find((t=>t.name.includes(this.name)))}async showDockerLogs(t){return new Promise(((e,a)=>{c("docker",["logs","-f","-n","5000",t],{cwd:i(),stdio:"inherit"}).on("exit",(t=>0===t?e():a(new Error(`Docker exited with code ${t}`))))}))}};const $={port:1433,database:"dcdx",username:"sa",password:"DataCenterDX!",edition:"Developer",version:"2022"};class MSSQL extends G{name="mssql";driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";options=$;version="2022";get url(){return`jdbc:sqlserver://db:${this.options.port};databaseName=${this.options.database};trustServerCertificate=true`}constructor(t=$){super({...$,...t})}async onDatabaseReady(){await this.run(`CREATE DATABASE ${this.options.database}`),await this.run(`ALTER DATABASE ${this.options.database} COLLATE SQL_Latin1_General_CP1_CS_AS`),await this.run(`ALTER DATABASE ${this.options.database} SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;`)}getService=()=>({image:`mcr.microsoft.com/mssql/server:${this.version}-latest`,ports:[`${this.options.port||1433}:1433`],environment:{ACCEPT_EULA:"y",MSSQL_SA_PASSWORD:this.options.password||"dcdx",MSSQL_PID:this.options.edition},networks:{shared:{aliases:["db","database"]}}})}const F={port:3306,database:"dcdx",username:"dcdx",password:"dcdx",version:"8.0"};class MySQL extends G{name="mysql";driver="com.mysql.jdbc.Driver";options=F;version="8.0";get url(){return`jdbc:mysql://db:${this.options.port}/${this.options.database}?sessionVariables=transaction_isolation='READ-COMMITTED'`}constructor(t=F){super({...F,...t})}async onDatabaseReady(){await this.run(`ALTER DATABASE ${this.options.database} CHARACTER SET 'utf8mb4' COLLATE utf8mb4_bin`)}getService=()=>({image:`mysql:${this.version}`,ports:[`${this.options.port||3306}:3306`],environment:{MYSQL_ROOT_PASSWORD:this.options.password||"dcdx",MYSQL_USER:this.options.username||"dcdx",MYSQL_PASSWORD:this.options.password||"dcdx",MYSQL_DATABASE:this.options.database||"dcdx"},command:["--log_bin_trust_function_creators=1"],networks:{shared:{aliases:["db","database"]}}})}const Y={version:"15",database:"dcdx",port:5432,username:"dcdx",password:"dcdx"};class Postgres extends G{name="postgresql";driver="org.postgresql.Driver";options=Y;version="15";get url(){return`jdbc:postgresql://db:${this.options.port}/${this.options.database}`}constructor(t=Y){super({...Y,...t})}getService=()=>({image:`postgres:${this.version}`,ports:[`${this.options.port||5432}:5432`],environment:{POSTGRES_USER:this.options.username||"dcdx",POSTGRES_PASSWORD:this.options.password||"dcdx",POSTGRES_DB:this.options.database||"dcdx",POSTGRES_HOST_AUTH_METHOD:"md5",POSTGRES_INITDB_ARGS:"--encoding=UTF-8 --lc-collate=C --lc-ctype=C"},networks:{shared:{aliases:["db","database"]}}})}const W=v(C(),".dcdx");class Base extends R{options;constructor(t){super(),this.options=t}get baseUrl(){let t="http://localhost";return this.options.port&&(t+=`:${this.options.port}`),this.options.contextPath?`${t}/${this.options.contextPath}`:t}getDatabaseEngine(t){switch(t){case"postgresql":return new Postgres;case"mssql":return new MSSQL;case"mysql":return new MySQL}}async start(){this.options.clean&&await this.down(),await this.build(this.options.version),await this.database.start(this.options.clean),await this.up()}async stop(){if(await this.database.stop(this.options.prune),this.options.prune)await this.down();else{const t=E(this.getDockerComposeConfig());await w({cwd:i(),configAsString:t,log:!0})}this.emit(`${this.name}:stopped`)}async reset(){await this.database.stop(!0),await this.down()}async cp(t){const e=await this.getServiceState();if(e&&e.state.toLowerCase().startsWith("up")){const e=this.getDockerComposeConfig(),a=E(e);await k("cp",[t,`${this.name}:/opt/quickreload/`],{cwd:i(),configAsString:a,log:!1})}}getJVMArgs(){const t=[];return t.push("-Dupm.plugin.upload.enabled=true"),this.options.devMode&&(t.push("-Djira.dev.mode=true"),t.push("-Datlassian.dev.mode=true")),this.options.quickReload&&t.push("-Dquickreload.dirs=/opt/quickreload"),t}async isApplicationReady(){try{const t=await b.get(`${this.baseUrl}/status`,{validateStatus:()=>!0}).catch((()=>null));if(t&&200===t.status){const{data:e}=t;if("FIRST_RUN"===e.state||"RUNNING"===e.state)return console.log(`The application ${this.name} is ready on ${this.baseUrl} 🎉`),!0}return!1}catch(t){return!1}}getDockerComposeConfig(){return{version:"3.8",services:{[this.name]:this.getService()},networks:{shared:Q}}}async up(){const t=this.getDockerComposeConfig(),e=E(t);await P({cwd:i(),configAsString:e,log:!0}),this.emit(`${this.name}:up`);await this.waitUntilReady()?(this.emit(`${this.name}:ready`),await this.tailApplicationLogs()):console.log(`Failed to start ${this.name} ⛔`),s(0)}async down(){const t=E(this.getDockerComposeConfig());await f({cwd:i(),configAsString:t,commandOptions:["-v","--remove-orphans","--rmi","local"],log:!0})}async getServiceState(){const t=E(this.getDockerComposeConfig());return(await S({configAsString:t,log:!1,commandOptions:["--all"]})).data.services.find((t=>t.name.includes(this.name)))}async waitUntilReady(t=0){console.log(`Waiting for ${this.name} to become available... ${t}s`);const e=await this.getServiceState();return!!(e&&e.state.toLowerCase().startsWith("up")&&await this.isApplicationReady())||(t>=300?(console.error(`A timeout occurred while waiting for ${this.name} to become available ⛔`),e&&await this.showDockerLogs(e.name),!1):(await new Promise((t=>setTimeout(t,1e3))),this.waitUntilReady(t+1)))}getDockerRepositoryUrl(){return`https://bitbucket.org/atlassian-docker/docker-${"jira"===this.name?"atlassian-jira":"bamboo"===this.name?`${this.name}-server`:`atlassian-${this.name}-server`}.git`}async build(t){const e=this.getDockerRepositoryUrl(),a=v(W,this.name,"source");d(a)?await T({baseDir:a}).pull({"--recurse-submodule":null}):(u(v(W,this.name),{recursive:!0}),await T().clone(e,a,{"--recurse-submodule":null})),await new Promise(((e,s)=>{c("docker",["build","-t",`dcdx/${this.name}:${t}`,"--build-arg",`${this.name.toUpperCase()}_VERSION=${t}`,"."],{cwd:a,stdio:"inherit"}).on("exit",(t=>0===t?e():s(new Error(`Docker exited with code ${t}`))))}))}async tailApplicationLogs(){const t=await this.getServiceState();t&&t.state.toLowerCase().startsWith("up")&&await this.showApplicationLogs(t.name).catch((()=>null))}async showDockerLogs(t){return new Promise(((e,a)=>{c("docker",["logs","-f","-n","5000",t],{cwd:i(),stdio:"inherit"}).on("exit",(t=>0===t?e():a(new Error(`Docker exited with code ${t}`))))}))}async showApplicationLogs(t){return new Promise(((e,a)=>{c("docker",["exec","-i",t,"tail","-F","-n","5000",this.logFilePath],{cwd:i(),stdio:"inherit"}).on("exit",(t=>0===t?e():a(new Error(`Docker exited with code ${t}`))))}))}}class Bamboo extends Base{name=L.BAMBOO;database;logFilePath="/var/atlassian/application-data/bamboo/logs/atlassian-bamboo.log";constructor(t){super(t),this.database=this.getDatabaseEngine(t.database)}getService(){const t=this.getVolumes(),e=this.getEnvironmentVariables();return{build:{context:toAbsolutePath("../../assets"),dockerfile_inline:`\nFROM dcdx/${this.name}:${this.options.version}\nCOPY ./mysql-connector-j-8.3.0.jar /opt/atlassian/bamboo/lib/mysql-connector-j-8.3.0.jar\nCOPY ./quickreload-5.0.4.jar /var/atlassian/application-data/bamboo/shared/plugins/quickreload-5.0.4.jar\nRUN echo "/opt/quickreload" > /var/atlassian/application-data/bamboo/quickreload.properties; mkdir -p /opt/quickreload; chown -R bamboo:bamboo /opt/quickreload;\n\nRUN chown -R bamboo:bamboo /var/atlassian/application-data/bamboo`},ports:[`${this.options.port||80}:8085`,...this.options.debug?["5005:5005"]:[]],environment:Object.keys(e).length>0?e:void 0,volumes:t.length>0?t:void 0,networks:["shared"]}}getJVMArgs(){const t=super.getJVMArgs();return this.options.debug&&(t.push("-Xdebug"),t.push("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005")),t}async isApplicationReady(){try{const t=await b.get(`${this.baseUrl}/setup/setupGeneralConfiguration.action`,{validateStatus:()=>!0}).catch((()=>null));return 200===t?.status}catch(t){return!1}}getEnvironmentVariables(){return{...this.options.contextPath?{ATL_TOMCAT_CONTEXTPATH:this.options.contextPath}:"",JVM_SUPPORT_RECOMMENDED_ARGS:this.getJVMArgs().join(" "),ATL_BAMBOO_ENABLE_UNATTENDED_SETUP:"true",ATL_LICENSE:this.options.license||V,ATL_JDBC_URL:this.database.url,ATL_JDBC_USER:this.database.options.username,ATL_JDBC_PASSWORD:this.database.options.password,ATL_DB_TYPE:`${this.database.name}`}}getVolumes(){return[...this.options.quickReload?[`${this.options.quickReload}:/opt/quickreload`]:""]}}class Bitbucket extends Base{name=L.BITBUCKET;database;logFilePath="/var/atlassian/application-data/bitbucket/log/atlassian-bitbucket.log";constructor(t){super(t),this.database=this.getDatabaseEngine(t.database)}getService(){const t=this.getVolumes(),e=this.getEnvironmentVariables();return{build:{context:toAbsolutePath("../../assets"),dockerfile_inline:`\nFROM dcdx/${this.name}:${this.options.version}\nCOPY ./quickreload-5.0.4.jar /var/atlassian/application-data/bitbucket/plugins/installed-plugins/quickreload-5.0.4.jar\nCOPY ./mysql-connector-j-8.3.0.jar /var/atlassian/application-data/bitbucket/lib/mysql-connector-j-8.3.0.jar\nRUN echo "/opt/quickreload" > /var/atlassian/application-data/bitbucket/quickreload.properties; mkdir -p /opt/quickreload; chown -R bitbucket:bitbucket /opt/quickreload;\n\nRUN mkdir -p /var/atlassian/application-data/bitbucket/shared; touch /var/atlassian/application-data/bitbucket/shared/bitbucket.properties; echo "setup.license=${this.options.license||J}" >> /var/atlassian/application-data/bitbucket/shared/bitbucket.properties;\n\nRUN chown -R bitbucket:bitbucket /var/atlassian/application-data/bitbucket`},ports:[`${this.options.port||80}:7990`,...this.options.debug?["5005:5005"]:[]],environment:Object.keys(e).length>0?e:void 0,volumes:t.length>0?t:void 0,networks:["shared"]}}getJVMArgs(){const t=super.getJVMArgs();return this.options.debug&&(t.push("-Xdebug"),t.push("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005")),t}getEnvironmentVariables(){return{JVM_SUPPORT_RECOMMENDED_ARGS:this.getJVMArgs().join(" "),JDBC_URL:this.database.url,JDBC_USER:this.database.options.username,JDBC_PASSWORD:this.database.options.password,JDBC_DRIVER:`${this.database.driver}`}}getVolumes(){return[...this.options.quickReload?[`${this.options.quickReload}:/opt/quickreload`]:""]}}class Confluence extends Base{name=L.CONFLUENCE;database;logFilePath="/var/atlassian/application-data/confluence/logs/atlassian-confluence.log";constructor(t){super(t),this.database=this.getDatabaseEngine(t.database)}getService(){const t=this.getVolumes(),e=this.getEnvironmentVariables();return{build:{context:toAbsolutePath("../../assets"),dockerfile_inline:`\nFROM dcdx/${this.name}:${this.options.version}\nCOPY ./mysql-connector-j-8.3.0.jar /opt/atlassian/confluence/confluence/WEB-INF/lib/mysql-connector-j-8.3.0.jar\nCOPY ./quickreload-5.0.4.jar /opt/atlassian/confluence/confluence/WEB-INF/atlassian-bundled-plugins/quickreload-5.0.4.jar\nRUN echo "/opt/quickreload" > /var/atlassian/application-data/confluence/quickreload.properties; mkdir -p /opt/quickreload; chown -R confluence:confluence /opt/quickreload;\n\nRUN chown -R confluence:confluence /opt/atlassian/confluence`},ports:[`${this.options.port||80}:8090`,...this.options.debug?["5005:5005"]:[]],environment:Object.keys(e).length>0?e:void 0,volumes:t.length>0?t:void 0,networks:["shared"]}}getJVMArgs(){const t=super.getJVMArgs();return this.options.debug&&(t.push("-Xdebug"),t.push("-Xrunjdwp:transport=dt_socket,address=*:5005,server=y,suspend=n"),t.push("-Dcom.sun.management.jmxremote.port=9999"),t.push("-Dcom.sun.management.jmxremote.rmi.port=9998"),t.push("-Dcom.sun.management.jmxremote.authenticate=false"),t.push("-Dcom.sun.management.jmxremote.ssl=false")),t}getEnvironmentVariables(){return{...this.options.contextPath?{ATL_TOMCAT_CONTEXTPATH:this.options.contextPath}:"",JVM_SUPPORT_RECOMMENDED_ARGS:this.getJVMArgs().join(" "),ATL_LICENSE_KEY:this.options.license||I,ATL_JDBC_URL:this.database.url,ATL_JDBC_USER:this.database.options.username,ATL_JDBC_PASSWORD:this.database.options.password,ATL_DB_TYPE:`${this.database.name}`}}getVolumes(){return[...this.options.quickReload?[`${this.options.quickReload}:/opt/quickreload`]:""]}}class Jira extends Base{name=L.JIRA;database;logFilePath="/var/atlassian/application-data/jira/log/atlassian-jira.log";constructor(t){super(t),this.database=this.getDatabaseEngine(t.database)}getService(){const t=this.getVolumes(),e=this.getEnvironmentVariables();return{build:{context:toAbsolutePath("../../assets"),dockerfile_inline:`\nFROM dcdx/${this.name}:${this.options.version}\nCOPY ./jira-data-generator-5.0.0.jar /var/atlassian/application-data/jira/plugins/installed-plugins/jira-data-generator-5.0.0.jar\nCOPY ./mysql-connector-j-8.3.0.jar /opt/atlassian/jira/lib/mysql-connector-j-8.3.0.jar\nCOPY ./quickreload-5.0.4.jar /var/atlassian/application-data/jira/plugins/installed-plugins/quickreload-5.0.4.jar\nRUN echo "/opt/quickreload" > /var/atlassian/application-data/jira/quickreload.properties; mkdir -p /opt/quickreload; chown -R jira:jira /opt/quickreload;\n\nRUN chown -R jira:jira /var/atlassian/application-data/jira`},ports:[`${this.options.port||80}:8080`,...this.options.debug?["5005:5005"]:[]],environment:Object.keys(e).length>0?e:void 0,volumes:t.length>0?t:void 0,networks:["shared"]}}getJVMArgs(){const t=super.getJVMArgs();return this.options.debug&&(t.push("-Xdebug"),t.push("-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005")),t}getEnvironmentVariables(){const t="postgresql"===this.database.name?"postgres72":this.database.name;return{...this.options.contextPath?{ATL_TOMCAT_CONTEXTPATH:this.options.contextPath}:"",JVM_SUPPORT_RECOMMENDED_ARGS:this.getJVMArgs().join(" "),ATL_LICENSE_KEY:this.options.license||I,ATL_JDBC_URL:this.database.url,ATL_JDBC_USER:this.database.options.username,ATL_JDBC_PASSWORD:this.database.options.password,ATL_DB_DRIVER:this.database.driver,ATL_DB_TYPE:t,JIRA_SETUP_LICENSE:this.options.license||N}}getVolumes(){return[...this.options.quickReload?[`${this.options.quickReload}:/opt/quickreload`]:""]}}const z=AMPS.getApplicationVersion();(async()=>{const n=e.name("dcdx start").description("Start the host application in dev mode based on the Atlassian Maven Plugin Suite (AMPS) configuration.\nYou can add Maven build arguments after the command options.").usage("[options] [...maven_arguments]").addOption(new a("-v, --version <version>","The version of the host application").default(z)).addOption(new a("-d, --database <name>","The database engine on which the host application will run").choices(["postgresql","mysql","mssql"]).default("postgresql")).addOption(new a("-p, --port <port>","The HTTP port on which the host application will be accessible").default("80")).addOption(new a("-c, --contextPath <contextPath>","The context path on which the host application will be accessible")).addOption(new a("-P, --activate-profiles <arg>","Comma-delimited list of profiles to activate")).addOption(new a("-qr, --quickReload","Build & install the app automatically using QuickReload")).addOption(new a("-o, --outputDirectory <arg>","Output directory where QuickReload will look for generated JAR files").default("target")).addOption(new a("--clean","Remove data files before starting the database").default(!1)).addOption(new a("--prune","Remove data files when stopping the database").default(!1)).addOption(new a("--debug","Add support for JVM debugger on port 5005").default(!1)).allowUnknownOption(!0).parse(process.argv).opts();AMPS.isAtlassianPlugin()||(console.log("Unable to find an Atlassian Plugin project in the current directory 🤔"),s());const r=AMPS.getApplication();r||(console.log("The Atlassian Plugin project does not contain an AMPS configuration, unable to detect product 😰"),s(),process.exit());const c=(t=>{switch(t){case L.JIRA:return Jira;case L.CONFLUENCE:return Confluence;case L.BAMBOO:return Bamboo;case L.BITBUCKET:return Bitbucket}})(r);c||(console.log("The Atlassian Plugin project does not contain an AMPS configuration, unable to detect product 😰"),process.exit());const l=new c({devMode:!0,version:n.version,database:n.database,port:Number(n.port),contextPath:n.contextPath,clean:n.clean,prune:n.prune,debug:n.debug}),d=e.args.slice();n.activateProfiles&&d.push("-P",n.activateProfiles);let p=null;if(n.quickReload){console.log("Watching filesystem for changes to source files (QuickReload)");let e=(new Date).getTime();p=t("**/*",{cwd:i(),usePolling:!0,interval:2e3,binaryInterval:2e3,awaitWriteFinish:!0,atomic:!0}).on("change",(async t=>{var a;t.startsWith(n.outputDirectory)&&t.toLowerCase().endsWith(".jar")?(console.log("Found updated JAR file(s), uploading them to QuickReload"),await l.cp(t),e=(new Date).getTime()):t.startsWith(n.outputDirectory)||((t=>t>(new Date).getTime()-5e3)(e)?(a=n.outputDirectory,console.log(`\n===============================================================================================================\nRecursive build trigger detected. The last build completed last than 5 seconds ago\nThis may indicate that the build changes files outside of the output directory\nAlternatively, Maven is using a different output directory than configured:\n'${a}'\n\nPlease make sure to check your build process and/or specify a different output directory using the '-o' option\n===============================================================================================================\n `)):(console.log("Detected file change, rebuilding Atlasian Plugin for QuickReload"),await AMPS.build(d).catch((()=>Promise.resolve()))))}))}o((async()=>{p&&(console.log("Stopping filesystem watcher... ⏳"),await p.close()),console.log(`Stopping ${l.name}... ⏳`),await l.stop(),console.log("Successfully stopped all running processes 💪")}),{wait:3e4}),console.log("Starting application..."),await l.start()})(),process.on("SIGINT",(()=>{console.log("Received term signal, trying to stop gracefully 💪"),s()}));