indraq_cli 1.3.0 → 1.5.1

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 (86) hide show
  1. package/README.md +1031 -662
  2. package/dist/cli/create-program.d.ts.map +1 -1
  3. package/dist/cli/create-program.js +6 -6
  4. package/dist/cli/create-program.js.map +1 -1
  5. package/dist/cli/doctor.command.d.ts.map +1 -1
  6. package/dist/cli/doctor.command.js +23 -0
  7. package/dist/cli/doctor.command.js.map +1 -1
  8. package/dist/modules/configure/configure.command.d.ts.map +1 -0
  9. package/dist/modules/configure/configure.command.js +116 -0
  10. package/dist/modules/configure/configure.command.js.map +1 -0
  11. package/dist/modules/deploy/commands/build.command.d.ts +2 -2
  12. package/dist/modules/deploy/commands/build.command.d.ts.map +1 -1
  13. package/dist/modules/deploy/commands/build.command.js +45 -16
  14. package/dist/modules/deploy/commands/build.command.js.map +1 -1
  15. package/dist/modules/deploy/commands/configure-docker.command.d.ts +2 -0
  16. package/dist/modules/deploy/commands/configure-docker.command.d.ts.map +1 -0
  17. package/dist/modules/deploy/commands/configure-docker.command.js +169 -0
  18. package/dist/modules/deploy/commands/configure-docker.command.js.map +1 -0
  19. package/dist/modules/deploy/config/docker-config.d.ts +21 -0
  20. package/dist/modules/deploy/config/docker-config.d.ts.map +1 -0
  21. package/dist/modules/deploy/config/docker-config.js +187 -0
  22. package/dist/modules/deploy/config/docker-config.js.map +1 -0
  23. package/dist/modules/deploy/index.d.ts.map +1 -1
  24. package/dist/modules/deploy/index.js +9 -26
  25. package/dist/modules/deploy/index.js.map +1 -1
  26. package/dist/modules/mobile/commands/build-mobile.command.d.ts +11 -0
  27. package/dist/modules/mobile/commands/build-mobile.command.d.ts.map +1 -0
  28. package/dist/modules/mobile/commands/build-mobile.command.js +188 -0
  29. package/dist/modules/mobile/commands/build-mobile.command.js.map +1 -0
  30. package/dist/modules/mobile/commands/configure-mobile.command.d.ts +8 -0
  31. package/dist/modules/mobile/commands/configure-mobile.command.d.ts.map +1 -0
  32. package/dist/modules/mobile/commands/configure-mobile.command.js +353 -0
  33. package/dist/modules/mobile/commands/configure-mobile.command.js.map +1 -0
  34. package/dist/modules/mobile/config/mobile-config.d.ts +43 -0
  35. package/dist/modules/mobile/config/mobile-config.d.ts.map +1 -0
  36. package/dist/modules/mobile/config/mobile-config.js +211 -0
  37. package/dist/modules/mobile/config/mobile-config.js.map +1 -0
  38. package/dist/modules/mobile/index.d.ts +3 -0
  39. package/dist/modules/mobile/index.d.ts.map +1 -0
  40. package/dist/modules/mobile/index.js +50 -0
  41. package/dist/modules/mobile/index.js.map +1 -0
  42. package/dist/modules/mobile/services/jenkins-mobile.service.d.ts +31 -0
  43. package/dist/modules/mobile/services/jenkins-mobile.service.d.ts.map +1 -0
  44. package/dist/modules/mobile/services/jenkins-mobile.service.js +175 -0
  45. package/dist/modules/mobile/services/jenkins-mobile.service.js.map +1 -0
  46. package/dist/modules/mobile/services/project.service.d.ts +11 -0
  47. package/dist/modules/mobile/services/project.service.d.ts.map +1 -0
  48. package/dist/modules/mobile/services/project.service.js +73 -0
  49. package/dist/modules/mobile/services/project.service.js.map +1 -0
  50. package/dist/modules/mobile/services/source-bundle.service.d.ts +9 -0
  51. package/dist/modules/mobile/services/source-bundle.service.d.ts.map +1 -0
  52. package/dist/modules/mobile/services/source-bundle.service.js +114 -0
  53. package/dist/modules/mobile/services/source-bundle.service.js.map +1 -0
  54. package/dist/modules/mobile/services/version-sync.service.d.ts +7 -0
  55. package/dist/modules/mobile/services/version-sync.service.d.ts.map +1 -0
  56. package/dist/modules/mobile/services/version-sync.service.js +88 -0
  57. package/dist/modules/mobile/services/version-sync.service.js.map +1 -0
  58. package/dist/shared/config/config-files.d.ts +5 -0
  59. package/dist/shared/config/config-files.d.ts.map +1 -0
  60. package/dist/shared/config/config-files.js +88 -0
  61. package/dist/shared/config/config-files.js.map +1 -0
  62. package/dist/shared/config/jenkins-config.d.ts +36 -0
  63. package/dist/shared/config/jenkins-config.d.ts.map +1 -0
  64. package/dist/shared/config/jenkins-config.js +164 -0
  65. package/dist/shared/config/jenkins-config.js.map +1 -0
  66. package/dist/shared/jenkins/configure-jenkins.d.ts +7 -0
  67. package/dist/shared/jenkins/configure-jenkins.d.ts.map +1 -0
  68. package/dist/shared/jenkins/configure-jenkins.js +84 -0
  69. package/dist/shared/jenkins/configure-jenkins.js.map +1 -0
  70. package/dist/{modules/deploy/services → shared/jenkins}/jenkins.service.d.ts +5 -4
  71. package/dist/shared/jenkins/jenkins.service.d.ts.map +1 -0
  72. package/dist/{modules/deploy/services → shared/jenkins}/jenkins.service.js +43 -89
  73. package/dist/shared/jenkins/jenkins.service.js.map +1 -0
  74. package/dist/shared/runtime/runtime-doctor.js.map +1 -1
  75. package/package.json +10 -5
  76. package/templates/jenkins/Jenkinsfile-Mobile-App +633 -0
  77. package/dist/modules/deploy/commands/configure.command.d.ts.map +0 -1
  78. package/dist/modules/deploy/commands/configure.command.js +0 -404
  79. package/dist/modules/deploy/commands/configure.command.js.map +0 -1
  80. package/dist/modules/deploy/config/deployment-config.d.ts +0 -29
  81. package/dist/modules/deploy/config/deployment-config.d.ts.map +0 -1
  82. package/dist/modules/deploy/config/deployment-config.js +0 -164
  83. package/dist/modules/deploy/config/deployment-config.js.map +0 -1
  84. package/dist/modules/deploy/services/jenkins.service.d.ts.map +0 -1
  85. package/dist/modules/deploy/services/jenkins.service.js.map +0 -1
  86. /package/dist/modules/{deploy/commands → configure}/configure.command.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-config.js","sourceRoot":"","sources":["../../../../src/modules/mobile/config/mobile-config.ts"],"names":[],"mappings":";;;AAAA,6CAAyC;AACzC,qCAAkE;AAClE,sEAI6C;AA8C7C,MAAM,eAAe,GAAG,aAAa,CAAC;AACzB,QAAA,uBAAuB,GAAG,sBAAsB,CAAC;AACjD,QAAA,sBAAsB,GAAG,KAAK,CAAC;AAC/B,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAChC,QAAA,wBAAwB,GAAG,aAAa,CAAC;AAEtD,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAqC,EAAE,CACrE,KAAK,KAAK,IAAI;IACd,KAAK,KAAK,oBAAoB;IAC9B,KAAK,KAAK,WAAW;IACrB,KAAK,KAAK,aAAa;IACvB,KAAK,KAAK,aAAa,CAAC;AAE1B,MAAM,SAAS,GAAG,CAAC,KAAc,EAAsC,EAAE,CACvE,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,YAAY,CAAC;AAEpF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAoC,EAAE;IACvE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAyC,CAAC;IAC5D,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAW,EAAE,CAC7D,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAD7D,QAAA,oBAAoB,wBACyC;AAEnE,MAAM,yBAAyB,GAAG,CAAC,KAAa,EAAW,EAAE,CAClE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,gCAAwB,CAAC;AADhE,QAAA,yBAAyB,6BACuC;AAE7E,MAAM,YAAY,GAAG,CAAC,KAAc,EAAgC,EAAE;IACpE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAqC,CAAC;IACxD,OAAO,CACL,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,IAAA,4BAAoB,EAAC,SAAS,CAAC,OAAO,CAAC;QACvC,OAAO,SAAS,CAAC,WAAW,KAAK,QAAQ;QACzC,IAAA,iCAAyB,EAAC,SAAS,CAAC,WAAW,CAAC;QAChD,OAAO,SAAS,CAAC,oBAAoB,KAAK,SAAS;QACnD,OAAO,SAAS,CAAC,wBAAwB,KAAK,SAAS,CACxD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,KAAiC,EAAW,EAAE;IAC1E,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChF,MAAM,IAAI,GAAG,KAAK,CAAC,YAA+D,CAAC;IACnF,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,KAAc,EAAyB,EAAE;IAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAA8B,CAAC;IACjD,OAAO,CACL,SAAS,CAAC,aAAa,KAAK,CAAC;QAC7B,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC9B,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,CAAC,SAAS,CAAC,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,cAAc,CAAC;QAChH,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC;QAClC,oBAAoB,CAAC,SAAS,CAAC,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAiC,EAAE;IAC7D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAsC,CAAC;IACzD,OAAO,CACL,SAAS,CAAC,aAAa,KAAK,CAAC;QAC7B,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC9B,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QACrC,CAAC,SAAS,CAAC,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,cAAc,CAAC;QAChH,OAAO,SAAS,CAAC,cAAc,KAAK,QAAQ;QAC5C,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC;QAClC,oBAAoB,CAAC,SAAS,CAAC,CAChC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,KAAc,EAAiC,EAAE;IAC7D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,SAAS,GAAG,KAAsC,CAAC;IACzD,OAAO,CACL,SAAS,CAAC,aAAa,KAAK,CAAC;QAC7B,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ;QACvC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,SAAS,CAAC,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC,WAAW,KAAK,MAAM,IAAI,SAAS,CAAC,WAAW,KAAK,cAAc,CAAC;QAChH,OAAO,SAAS,CAAC,cAAc,KAAK,QAAQ;QAC5C,oBAAoB,CAAC,SAAS,CAAC,CAChC,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,yBAAyB,GAAG,GAAiB,EAAE,CAAC,CAAC;IAC5D,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,IAAA,wBAAU,GAAE;IACvB,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE;QACV,OAAO,EAAE,8BAAsB;QAC/B,WAAW,EAAE,mCAA2B;QACxC,oBAAoB,EAAE,IAAI;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;IACD,YAAY,EAAE;QACZ,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QACpC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;QACxC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;KACtC;CACF,CAAC,CAAC;AAhBU,QAAA,yBAAyB,6BAgBnC;AAEH,MAAM,SAAS,GAAG,CAAC,MAA4B,EAAgB,EAAE,CAAC,CAAC;IACjE,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;IAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;CAClC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,CAAC,MAA4B,EAAgB,EAAE,CAAC,CAAC;IACjE,aAAa,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,SAAS;IAC3B,OAAO,EAAE,EAAE;IACX,WAAW,EAAE,MAAM,CAAC,WAAW;IAC/B,UAAU,EAAE;QACV,OAAO,EAAE,8BAAsB;QAC/B,WAAW,EAAE,mCAA2B;QACxC,oBAAoB,EAAE,IAAI;QAC1B,wBAAwB,EAAE,IAAI;KAC/B;IACD,YAAY,EAAE,MAAM,CAAC,YAAY;CAClC,CAAC,CAAC;AAEI,MAAM,mBAAmB,GAAG,GAAW,EAAE,CAAC,IAAA,kCAAmB,EAAC,eAAe,CAAC,CAAC;AAAzE,QAAA,mBAAmB,uBAAsD;AAE/E,MAAM,eAAe,GAAG,GAAwB,EAAE;IACvD,MAAM,IAAI,GAAG,IAAA,2BAAmB,GAAE,CAAC;IACnC,IAAI,CAAC,IAAA,oBAAU,EAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;QACjE,IAAI,SAAS,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC;AArBW,QAAA,eAAe,mBAqB1B;AAEK,MAAM,wBAAwB,GAAG,GAAiB,EAAE,CAAC,IAAA,uBAAe,GAAE,IAAI,IAAA,iCAAyB,GAAE,CAAC;AAAhG,QAAA,wBAAwB,4BAAwE;AAEtG,MAAM,gBAAgB,GAAG,CAAC,MAAoB,EAAQ,EAAE;IAC7D,IAAA,0CAA2B,GAAE,CAAC;IAC9B,IAAA,uBAAa,EAAC,IAAA,2BAAmB,GAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrF,IAAI,IAAA,yCAA0B,EAAC,eAAe,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8IAA8I,CAC/I,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AARW,QAAA,gBAAgB,oBAQ3B;AAEK,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAU,EAAE;IAChE,IAAI,CAAC,IAAA,4BAAoB,EAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,OAAO,EAAE,CAAC,CAAC;IAChH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC,CAAC;AANW,QAAA,sBAAsB,0BAMjC;AAEK,MAAM,wCAAwC,GAAG,CACtD,WAAmB,EACnB,eAAuB,EAC2F,EAAE;IACpH,MAAM,OAAO,GAAG,IAAA,uBAAe,GAAE,CAAC;IAClC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAE/F,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAChC,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;QACrG,qBAAqB,GAAG,IAAI,CAAC;QAC7B,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;IAC1F,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QAC5C,OAAO,CAAC,UAAU,CAAC,OAAO,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAChF,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC;QAChD,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,IAAI,gCAAwB,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CACb,gDAAgD,OAAO,CAAC,UAAU,CAAC,WAAW,sCAAsC,gCAAwB,+CAA+C,CAC5L,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,CAAC;QACpC,mBAAmB,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,eAAe,IAAI,mBAAmB;QAAE,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,CAAC;AAC1F,CAAC,CAAC;AAjCW,QAAA,wCAAwC,4CAiCnD;AAEK,MAAM,iBAAiB,GAAG,CAC/B,WAA8B,EAC9B,WAAkC,EACb,EAAE;IACvB,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,IAAI,WAAW,KAAK,KAAK;YAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACzD,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,WAAW,KAAK,KAAK;QAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AACxC,CAAC,CAAC;AAVW,QAAA,iBAAiB,qBAU5B;AAEK,MAAM,4BAA4B,GAAG,CAC1C,WAA8B,EAC9B,WAAkC,EAClC,MAAyB,EACnB,EAAE;IACR,IAAI,CAAC,IAAA,yBAAiB,EAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,qCAAqC,WAAW,MAAM,WAAW,iBAAiB,MAAM,GAAG,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC,CAAC;AARW,QAAA,4BAA4B,gCAQvC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const registerMobileModule: (program: Command) => void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/mobile/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAkD1D,eAAO,MAAM,oBAAoB,GAAI,SAAS,OAAO,KAAG,IAQvD,CAAA"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerMobileModule = void 0;
4
+ const commander_1 = require("commander");
5
+ const build_mobile_command_1 = require("./commands/build-mobile.command");
6
+ const parseOutput = (value) => {
7
+ const normalized = value.trim().toLowerCase();
8
+ if (normalized === 'development-client' || normalized === 'dev-client' || normalized === 'client')
9
+ return 'development-client';
10
+ if (normalized === 'debug-apk' || normalized === 'debug')
11
+ return 'debug-apk';
12
+ if (normalized === 'release-apk' || normalized === 'apk')
13
+ return 'release-apk';
14
+ if (normalized === 'release-aab' || normalized === 'aab')
15
+ return 'release-aab';
16
+ throw new commander_1.InvalidArgumentError('Output must be dev-client, debug-apk, apk, or aab.');
17
+ };
18
+ const parseProfile = (value) => {
19
+ const normalized = value.trim().toLowerCase().replace(/_/g, '-');
20
+ if (normalized === 'fast')
21
+ return 'fast';
22
+ if (normalized === 'clean')
23
+ return 'clean';
24
+ if (normalized === 'full-reset' || normalized === 'fullreset')
25
+ return 'full-reset';
26
+ throw new commander_1.InvalidArgumentError('Profile must be fast, clean, or full-reset.');
27
+ };
28
+ const addMobileShortcut = (build, name, environment, description) => {
29
+ build
30
+ .command(name)
31
+ .description(description)
32
+ .option('--output <output>', 'Override saved output for this build only', parseOutput)
33
+ .option('--profile <profile>', 'Override saved profile for this build only', parseProfile)
34
+ .option('--verbose', 'Enable verbose Gradle/Jenkins build logging')
35
+ .option('--dry-run', 'Validate configuration and print the build plan without uploading')
36
+ .option('-y, --yes', 'Skip the final confirmation prompt')
37
+ .action(async (options) => {
38
+ await (0, build_mobile_command_1.buildMobile)({ env: environment, ...options });
39
+ });
40
+ };
41
+ const registerMobileModule = (program) => {
42
+ const build = program.command('build').description('Build application artifacts using IndraQ build services.');
43
+ addMobileShortcut(build, 'mobile:dev', 'dev', 'Build the mobile Development environment.');
44
+ addMobileShortcut(build, 'mobile:development', 'dev', 'Alias for `indraq build mobile:dev`.');
45
+ addMobileShortcut(build, 'mobile:staging', 'staging', 'Build the mobile Staging environment.');
46
+ addMobileShortcut(build, 'mobile:prod', 'prod', 'Build the mobile Production environment.');
47
+ addMobileShortcut(build, 'mobile:production', 'prod', 'Alias for `indraq build mobile:prod`.');
48
+ };
49
+ exports.registerMobileModule = registerMobileModule;
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/mobile/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0D;AAC1D,0EAA8D;AAO9D,MAAM,WAAW,GAAG,CAAC,KAAa,EAAqB,EAAE;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,UAAU,KAAK,oBAAoB,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,oBAAoB,CAAC;IAC/H,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC;IAC7E,IAAI,UAAU,KAAK,aAAa,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC;IAC/E,IAAI,UAAU,KAAK,aAAa,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC;IAC/E,MAAM,IAAI,gCAAoB,CAAC,oDAAoD,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAsB,EAAE;IACzD,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACjE,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC;IACnF,MAAM,IAAI,gCAAoB,CAAC,6CAA6C,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,KAAc,EACd,IAAY,EACZ,WAAkC,EAClC,WAAmB,EACb,EAAE;IACR,KAAK;SACF,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,WAAW,CAAC;SACxB,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,WAAW,CAAC;SACrF,MAAM,CAAC,qBAAqB,EAAE,4CAA4C,EAAE,YAAY,CAAC;SACzF,MAAM,CAAC,WAAW,EAAE,6CAA6C,CAAC;SAClE,MAAM,CAAC,WAAW,EAAE,mEAAmE,CAAC;SACxF,MAAM,CAAC,WAAW,EAAE,oCAAoC,CAAC;SACzD,MAAM,CAAC,KAAK,EAAE,OAMd,EAAE,EAAE;QACH,MAAM,IAAA,kCAAW,EAAC,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAAC,OAAgB,EAAQ,EAAE;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,0DAA0D,CAAC,CAAC;IAE/G,iBAAiB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,2CAA2C,CAAC,CAAC;IAC3F,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,sCAAsC,CAAC,CAAC;IAC9F,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,uCAAuC,CAAC,CAAC;IAC/F,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,0CAA0C,CAAC,CAAC;IAC5F,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,uCAAuC,CAAC,CAAC;AACjG,CAAC,CAAA;AARY,QAAA,oBAAoB,wBAQhC"}
@@ -0,0 +1,31 @@
1
+ import type { JenkinsResolvedConfig } from '../../../shared/config/jenkins-config';
2
+ import type { MobileBuildOutput, MobileBuildProfile, MobileEnvironmentName, MobileProjectType } from '../config/mobile-config';
3
+ export interface MobileJenkinsBuildRequest {
4
+ projectId: string;
5
+ appName: string;
6
+ appVersion: string;
7
+ appVersionCode: number;
8
+ projectType: MobileProjectType;
9
+ environment: MobileEnvironmentName;
10
+ output: MobileBuildOutput;
11
+ profile: MobileBuildProfile;
12
+ sourceBundlePath: string;
13
+ sourceSha256: string;
14
+ envFilePath: string | null;
15
+ gitCommit?: string;
16
+ gitDirty: boolean;
17
+ verbose: boolean;
18
+ }
19
+ export interface JenkinsArtifact {
20
+ fileName: string;
21
+ relativePath: string;
22
+ url: string;
23
+ }
24
+ export interface MobileJenkinsBuildResult {
25
+ buildNumber: number;
26
+ buildUrl: string;
27
+ result: string;
28
+ artifacts: JenkinsArtifact[];
29
+ }
30
+ export declare const triggerMobileJenkinsBuild: (config: JenkinsResolvedConfig, jobName: string, request: MobileJenkinsBuildRequest) => Promise<MobileJenkinsBuildResult>;
31
+ //# sourceMappingURL=jenkins-mobile.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-mobile.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/mobile/services/jenkins-mobile.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAMnF,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,WAAW,EAAE,qBAAqB,CAAC;IACnC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,EAAE,CAAC;CAC9B;AAkID,eAAO,MAAM,yBAAyB,GACpC,QAAQ,qBAAqB,EAC7B,SAAS,MAAM,EACf,SAAS,yBAAyB,KACjC,OAAO,CAAC,wBAAwB,CAmFlC,CAAC"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.triggerMobileJenkinsBuild = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const jenkins_service_1 = require("../../../shared/jenkins/jenkins.service");
6
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
7
+ const toJenkinsProjectType = (value) => value === 'expo' ? 'Expo' : 'React Native CLI';
8
+ const toJenkinsEnvironment = (value) => value === 'dev' ? 'Development' : value === 'staging' ? 'Staging' : 'Production';
9
+ const toJenkinsOutput = (value) => {
10
+ switch (value) {
11
+ case 'development-client': return 'Development Client';
12
+ case 'debug-apk': return 'Debug APK';
13
+ case 'release-apk': return 'Release APK';
14
+ case 'release-aab': return 'Release AAB';
15
+ }
16
+ };
17
+ const toJenkinsProfile = (value) => value === 'fast' ? 'FAST' : value === 'clean' ? 'CLEAN' : 'FULL_RESET';
18
+ const createAuthHeaders = (username, password) => ({
19
+ Authorization: `Basic ${Buffer.from(`${username}:${password}`, 'utf8').toString('base64')}`
20
+ });
21
+ const fetchJson = async (url, headers, timeout = 15_000) => {
22
+ const response = await fetch(url, {
23
+ headers,
24
+ signal: AbortSignal.timeout(timeout)
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Jenkins request failed (HTTP ${response.status}) for ${url}`);
28
+ }
29
+ return await response.json();
30
+ };
31
+ const getCrumb = async (config, authHeaders) => {
32
+ try {
33
+ const response = await fetch(`${(0, jenkins_service_1.normalizeJenkinsUrl)(config.url)}/crumbIssuer/api/json`, {
34
+ headers: authHeaders,
35
+ signal: AbortSignal.timeout(10_000)
36
+ });
37
+ if (response.status === 404)
38
+ return {};
39
+ if (!response.ok)
40
+ return {};
41
+ const data = await response.json();
42
+ return data.crumbRequestField && data.crumb ? { [data.crumbRequestField]: data.crumb } : {};
43
+ }
44
+ catch {
45
+ // Jenkins API tokens normally do not require a crumb. The build POST will
46
+ // surface a useful error if this controller does require one.
47
+ return {};
48
+ }
49
+ };
50
+ const parseQueueLocation = (location, baseUrl) => {
51
+ if (!location) {
52
+ throw new Error('Jenkins accepted the build request but did not return a queue Location header.');
53
+ }
54
+ const queueUrl = new URL(location, `${(0, jenkins_service_1.normalizeJenkinsUrl)(baseUrl)}/`);
55
+ if (!/\/queue\/item\/\d+\/?$/.test(queueUrl.pathname)) {
56
+ throw new Error(`Jenkins did not return a build queue URL. Received redirect/location: ${queueUrl.toString()}`);
57
+ }
58
+ return queueUrl.toString().replace(/\/+$/, '');
59
+ };
60
+ const waitForBuildStart = async (queueUrl, authHeaders) => {
61
+ const deadline = Date.now() + 10 * 60_000;
62
+ while (Date.now() < deadline) {
63
+ const data = await fetchJson(`${queueUrl}/api/json`, authHeaders);
64
+ if (data.cancelled)
65
+ throw new Error('Jenkins cancelled the mobile build while it was waiting in the queue.');
66
+ const number = data.executable?.number;
67
+ const url = data.executable?.url;
68
+ if (typeof number === 'number' && url)
69
+ return { number, url: url.replace(/\/+$/, '') };
70
+ if (data.why)
71
+ process.stdout.write(`\rJenkins queue: ${data.why.slice(0, 120)} `);
72
+ await sleep(1500);
73
+ }
74
+ throw new Error('Timed out waiting for Jenkins to start the mobile build.');
75
+ };
76
+ const streamBuild = async (buildUrl, authHeaders) => {
77
+ let start = 0;
78
+ while (true) {
79
+ const logResponse = await fetch(`${buildUrl}/logText/progressiveText?start=${start}`, {
80
+ headers: authHeaders,
81
+ signal: AbortSignal.timeout(30_000)
82
+ });
83
+ if (!logResponse.ok) {
84
+ throw new Error(`Unable to read Jenkins console log (HTTP ${logResponse.status}).`);
85
+ }
86
+ const logText = await logResponse.text();
87
+ if (logText)
88
+ process.stdout.write(logText);
89
+ const next = Number(logResponse.headers.get('x-text-size') ?? start);
90
+ if (Number.isFinite(next))
91
+ start = next;
92
+ const state = await fetchJson(`${buildUrl}/api/json?tree=building,result,url,artifacts%5BfileName,relativePath%5D`, authHeaders);
93
+ const moreData = (logResponse.headers.get('x-more-data') ?? '').toLowerCase() === 'true';
94
+ if (!state.building && state.result && !moreData)
95
+ return state;
96
+ await sleep(1000);
97
+ }
98
+ };
99
+ const triggerMobileJenkinsBuild = async (config, jobName, request) => {
100
+ const credentials = (0, jenkins_service_1.readJenkinsCredentials)(config.serverId);
101
+ const authHeaders = createAuthHeaders(credentials.username, credentials.secret);
102
+ const jobBaseUrl = (0, jenkins_service_1.getJenkinsJobBaseUrl)(config.url, jobName);
103
+ const crumbHeaders = await getCrumb(config, authHeaders);
104
+ const form = new FormData();
105
+ const sourceBlob = await (0, node_fs_1.openAsBlob)(request.sourceBundlePath, { type: 'application/gzip' });
106
+ form.append('SOURCE_BUNDLE', sourceBlob, 'indraq-source.tar.gz');
107
+ if (request.envFilePath) {
108
+ const envBlob = await (0, node_fs_1.openAsBlob)(request.envFilePath, { type: 'text/plain' });
109
+ form.append('ENV_FILE', envBlob, '.env');
110
+ }
111
+ else {
112
+ form.append('ENV_FILE', new Blob([], { type: 'text/plain' }), '.env');
113
+ }
114
+ form.append('PROJECT_ID', request.projectId);
115
+ form.append('APP_NAME', request.appName);
116
+ form.append('APP_VERSION', request.appVersion);
117
+ form.append('APP_VERSION_CODE', String(request.appVersionCode));
118
+ form.append('SOURCE_SHA256', request.sourceSha256);
119
+ form.append('PROJECT_TYPE', toJenkinsProjectType(request.projectType));
120
+ form.append('BUILD_ENVIRONMENT', toJenkinsEnvironment(request.environment));
121
+ form.append('BUILD_OUTPUT', toJenkinsOutput(request.output));
122
+ form.append('BUILD_PROFILE', toJenkinsProfile(request.profile));
123
+ form.append('SOURCE_REVISION', request.gitCommit ?? 'local');
124
+ form.append('SOURCE_DIRTY', request.gitDirty ? 'true' : 'false');
125
+ form.append('VERBOSE_BUILD', request.verbose ? 'true' : 'false');
126
+ let response;
127
+ try {
128
+ response = await fetch(`${jobBaseUrl}/buildWithParameters`, {
129
+ method: 'POST',
130
+ headers: { ...authHeaders, ...crumbHeaders },
131
+ body: form,
132
+ redirect: 'manual',
133
+ signal: AbortSignal.timeout(120_000)
134
+ });
135
+ }
136
+ catch (error) {
137
+ const message = error instanceof Error ? error.message : 'unknown network error';
138
+ throw new Error(`Unable to upload source and trigger Jenkins: ${message}`);
139
+ }
140
+ if (response.status < 200 || response.status >= 400) {
141
+ const body = (await response.text()).slice(0, 500);
142
+ if (response.status === 400) {
143
+ throw new Error(`Jenkins rejected the mobile build parameters (HTTP 400). Make sure this job uses the IndraQ v1.5 mobile Jenkinsfile and the Jenkins "File Parameter" plugin is installed.${body ? `\n${body}` : ''}`);
144
+ }
145
+ if (response.status === 401 || response.status === 403) {
146
+ throw new Error(`Jenkins rejected the mobile build request (HTTP ${response.status}). Check credentials and Build permission.`);
147
+ }
148
+ throw new Error(`Jenkins build request failed (HTTP ${response.status}).${body ? `\n${body}` : ''}`);
149
+ }
150
+ const queueUrl = parseQueueLocation(response.headers.get('location'), config.url);
151
+ console.log(`Jenkins queue: ${queueUrl}`);
152
+ const started = await waitForBuildStart(queueUrl, authHeaders);
153
+ process.stdout.write('\n');
154
+ console.log(`Jenkins build #${started.number}: ${started.url}\n`);
155
+ const state = await streamBuild(started.url, authHeaders);
156
+ const result = state.result ?? 'UNKNOWN';
157
+ const artifacts = (state.artifacts ?? [])
158
+ .filter((item) => Boolean(item.fileName && item.relativePath))
159
+ .map((item) => ({
160
+ fileName: item.fileName,
161
+ relativePath: item.relativePath,
162
+ url: `${started.url}/artifact/${item.relativePath.split('/').map(encodeURIComponent).join('/')}`
163
+ }));
164
+ if (result !== 'SUCCESS') {
165
+ throw new Error(`Jenkins mobile build #${started.number} finished with ${result}. Review the console output above.`);
166
+ }
167
+ return {
168
+ buildNumber: started.number,
169
+ buildUrl: started.url,
170
+ result,
171
+ artifacts
172
+ };
173
+ };
174
+ exports.triggerMobileJenkinsBuild = triggerMobileJenkinsBuild;
175
+ //# sourceMappingURL=jenkins-mobile.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jenkins-mobile.service.js","sourceRoot":"","sources":["../../../../src/modules/mobile/services/jenkins-mobile.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MobileProjectType } from '../config/mobile-config';
2
+ export interface MobileProjectInfo {
3
+ root: string;
4
+ appName: string;
5
+ packageName?: string;
6
+ gitCommit?: string;
7
+ gitDirty: boolean;
8
+ }
9
+ export declare const validateMobileProjectRoot: (projectType: MobileProjectType, root?: string) => MobileProjectInfo;
10
+ export declare const assertExpoDevelopmentClientInstalled: (root?: string) => void;
11
+ //# sourceMappingURL=project.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/mobile/services/project.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAyCD,eAAO,MAAM,yBAAyB,GACpC,aAAa,iBAAiB,EAC9B,aAAoB,KACnB,iBAiCF,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAAI,aAAoB,KAAG,IAQ3E,CAAC"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertExpoDevelopmentClientInstalled = exports.validateMobileProjectRoot = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const node_child_process_1 = require("node:child_process");
7
+ const readPackageJson = (root) => {
8
+ const packagePath = (0, node_path_1.join)(root, 'package.json');
9
+ if (!(0, node_fs_1.existsSync)(packagePath)) {
10
+ throw new Error(`You are not in a mobile project root. package.json was not found in:\n${root}\n\nRun the command from the folder that contains package.json.`);
11
+ }
12
+ try {
13
+ return JSON.parse((0, node_fs_1.readFileSync)(packagePath, 'utf8'));
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : 'invalid JSON';
17
+ throw new Error(`Unable to read package.json in ${root}: ${message}`);
18
+ }
19
+ };
20
+ const getGitMetadata = (root) => {
21
+ const commitResult = (0, node_child_process_1.spawnSync)('git', ['rev-parse', '--short', 'HEAD'], {
22
+ cwd: root,
23
+ encoding: 'utf8',
24
+ stdio: ['ignore', 'pipe', 'ignore']
25
+ });
26
+ const statusResult = (0, node_child_process_1.spawnSync)('git', ['status', '--porcelain'], {
27
+ cwd: root,
28
+ encoding: 'utf8',
29
+ stdio: ['ignore', 'pipe', 'ignore']
30
+ });
31
+ const commit = commitResult.status === 0 ? commitResult.stdout.trim() : undefined;
32
+ const dirty = statusResult.status === 0 ? Boolean(statusResult.stdout.trim()) : false;
33
+ return { ...(commit ? { commit } : {}), dirty };
34
+ };
35
+ const validateMobileProjectRoot = (projectType, root = process.cwd()) => {
36
+ const pkg = readPackageJson(root);
37
+ const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
38
+ if (projectType === 'expo') {
39
+ if (!deps.expo) {
40
+ throw new Error('Mobile configuration says this is an Expo project, but `expo` is not present in the root package.json. Run `indraq configure` → Mobile App → Project settings.');
41
+ }
42
+ }
43
+ else {
44
+ if (!deps['react-native']) {
45
+ throw new Error('Mobile configuration says this is React Native CLI, but `react-native` is not present in the root package.json.');
46
+ }
47
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(root, 'android'))) {
48
+ throw new Error('React Native CLI project root must contain an android/ directory.');
49
+ }
50
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.join)(root, 'android', 'gradlew'))) {
51
+ throw new Error('React Native CLI project root must contain android/gradlew.');
52
+ }
53
+ }
54
+ const git = getGitMetadata(root);
55
+ const appName = (pkg.name?.trim() || (0, node_path_1.basename)(root)).replace(/[^A-Za-z0-9._-]+/g, '-');
56
+ return {
57
+ root,
58
+ appName,
59
+ ...(pkg.name ? { packageName: pkg.name } : {}),
60
+ ...(git.commit ? { gitCommit: git.commit } : {}),
61
+ gitDirty: git.dirty
62
+ };
63
+ };
64
+ exports.validateMobileProjectRoot = validateMobileProjectRoot;
65
+ const assertExpoDevelopmentClientInstalled = (root = process.cwd()) => {
66
+ const pkg = readPackageJson(root);
67
+ const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
68
+ if (!deps['expo-dev-client']) {
69
+ throw new Error('Expo Development Client selected, but `expo-dev-client` is not installed. Run `npx expo install expo-dev-client` first.');
70
+ }
71
+ };
72
+ exports.assertExpoDevelopmentClientInstalled = assertExpoDevelopmentClientInstalled;
73
+ //# sourceMappingURL=project.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.service.js","sourceRoot":"","sources":["../../../../src/modules/mobile/services/project.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SourceBundle {
2
+ archivePath: string;
3
+ sha256: string;
4
+ sizeBytes: number;
5
+ cleanup: () => void;
6
+ }
7
+ export declare const createSourceBundle: (root: string, projectId: string) => Promise<SourceBundle>;
8
+ export declare const getRootEnvFile: (root: string) => string | null;
9
+ //# sourceMappingURL=source-bundle.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-bundle.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/mobile/services/source-bundle.service.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA+DD,eAAO,MAAM,kBAAkB,GAAU,MAAM,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,YAAY,CAiD9F,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,IAGtD,CAAC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRootEnvFile = exports.createSourceBundle = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_os_1 = require("node:os");
7
+ const node_path_1 = require("node:path");
8
+ const node_child_process_1 = require("node:child_process");
9
+ const EXCLUDED_TOP_LEVEL = new Set([
10
+ '.git',
11
+ '.indraq',
12
+ 'node_modules',
13
+ 'coverage',
14
+ 'dist',
15
+ 'build',
16
+ '.expo',
17
+ '.gradle',
18
+ '.turbo',
19
+ '.cache',
20
+ '.idea',
21
+ '.vscode'
22
+ ]);
23
+ const normalizeRelative = (value) => value.split(node_path_1.sep).join('/').replace(/^\.\//, '');
24
+ const shouldIncludeRelativePath = (value) => {
25
+ const normalized = normalizeRelative(value);
26
+ if (!normalized || normalized === '.')
27
+ return true;
28
+ const segments = normalized.split('/');
29
+ if (EXCLUDED_TOP_LEVEL.has(segments[0]))
30
+ return false;
31
+ if (normalized === '.env' || normalized.startsWith('.env.'))
32
+ return false;
33
+ if (/\.(apk|aab|ipa|tgz|tar\.gz)$/i.test(normalized))
34
+ return false;
35
+ const wrapped = `/${normalized}/`;
36
+ const blockedFragments = [
37
+ '/node_modules/',
38
+ '/android/.gradle/',
39
+ '/android/app/build/',
40
+ '/android/build/',
41
+ '/ios/Pods/',
42
+ '/ios/build/',
43
+ '/.expo/',
44
+ '/coverage/'
45
+ ];
46
+ return !blockedFragments.some((fragment) => wrapped.includes(fragment));
47
+ };
48
+ const assertTarAvailable = () => {
49
+ const result = (0, node_child_process_1.spawnSync)('tar', ['--version'], {
50
+ encoding: 'utf8',
51
+ stdio: ['ignore', 'pipe', 'pipe']
52
+ });
53
+ if (result.error || result.status !== 0) {
54
+ throw new Error('`tar` is required to package the local mobile source tree. Modern Windows, macOS, and Linux normally include it. Install/enable tar and make sure it is available in PATH.');
55
+ }
56
+ };
57
+ const sha256File = async (path) => new Promise((resolve, reject) => {
58
+ const hash = (0, node_crypto_1.createHash)('sha256');
59
+ const stream = (0, node_fs_1.createReadStream)(path);
60
+ stream.on('data', (chunk) => hash.update(chunk));
61
+ stream.on('error', reject);
62
+ stream.on('end', () => resolve(hash.digest('hex')));
63
+ });
64
+ const createSourceBundle = async (root, projectId) => {
65
+ if (!(0, node_fs_1.existsSync)(root))
66
+ throw new Error(`Project root not found: ${root}`);
67
+ assertTarAvailable();
68
+ const tempRoot = (0, node_path_1.join)((0, node_os_1.tmpdir)(), 'indraq-cli', 'mobile');
69
+ const workDirectory = (0, node_path_1.join)(tempRoot, `${projectId}-${Date.now()}`);
70
+ const stagingDirectory = (0, node_path_1.join)(workDirectory, 'source');
71
+ const archivePath = (0, node_path_1.join)(workDirectory, 'source.tar.gz');
72
+ (0, node_fs_1.mkdirSync)(stagingDirectory, { recursive: true });
73
+ try {
74
+ (0, node_fs_1.cpSync)(root, stagingDirectory, {
75
+ recursive: true,
76
+ force: true,
77
+ errorOnExist: false,
78
+ preserveTimestamps: false,
79
+ filter: (sourcePath) => {
80
+ if (sourcePath === root)
81
+ return true;
82
+ return shouldIncludeRelativePath((0, node_path_1.relative)(root, sourcePath));
83
+ }
84
+ });
85
+ const result = (0, node_child_process_1.spawnSync)('tar', ['-czf', archivePath, '-C', stagingDirectory, '.'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
86
+ if (result.error || result.status !== 0) {
87
+ const details = (result.stderr || result.stdout || result.error?.message || 'unknown tar error').trim();
88
+ throw new Error(`Unable to create mobile source archive with tar: ${details}`);
89
+ }
90
+ const sizeBytes = (0, node_fs_1.statSync)(archivePath).size;
91
+ if (sizeBytes <= 0)
92
+ throw new Error('Generated mobile source bundle is empty.');
93
+ const sha256 = await sha256File(archivePath);
94
+ // Staging can be much larger than the final archive, so remove it before upload.
95
+ (0, node_fs_1.rmSync)(stagingDirectory, { recursive: true, force: true });
96
+ return {
97
+ archivePath,
98
+ sha256,
99
+ sizeBytes,
100
+ cleanup: () => (0, node_fs_1.rmSync)(workDirectory, { recursive: true, force: true })
101
+ };
102
+ }
103
+ catch (error) {
104
+ (0, node_fs_1.rmSync)(workDirectory, { recursive: true, force: true });
105
+ throw error;
106
+ }
107
+ };
108
+ exports.createSourceBundle = createSourceBundle;
109
+ const getRootEnvFile = (root) => {
110
+ const path = (0, node_path_1.join)(root, '.env');
111
+ return (0, node_fs_1.existsSync)(path) ? path : null;
112
+ };
113
+ exports.getRootEnvFile = getRootEnvFile;
114
+ //# sourceMappingURL=source-bundle.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-bundle.service.js","sourceRoot":"","sources":["../../../../src/modules/mobile/services/source-bundle.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { MobileProjectType } from '../config/mobile-config';
2
+ export interface VersionSyncResult {
3
+ updatedFiles: string[];
4
+ warnings: string[];
5
+ }
6
+ export declare const syncMobileVersionIntoProject: (root: string, projectType: MobileProjectType, version: string, versionCode: number) => VersionSyncResult;
7
+ //# sourceMappingURL=version-sync.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-sync.service.d.ts","sourceRoot":"","sources":["../../../../src/modules/mobile/services/version-sync.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAwED,eAAO,MAAM,4BAA4B,GACvC,MAAM,MAAM,EACZ,aAAa,iBAAiB,EAC9B,SAAS,MAAM,EACf,aAAa,MAAM,KAClB,iBAKF,CAAC"}