@sfdc-webapps/cli 1.0.2

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 (405) hide show
  1. package/README.md +1414 -0
  2. package/dist/commands/apply-patches.d.ts +23 -0
  3. package/dist/commands/apply-patches.d.ts.map +1 -0
  4. package/dist/commands/apply-patches.js +524 -0
  5. package/dist/commands/apply-patches.js.map +1 -0
  6. package/dist/commands/new-app-feature.d.ts +7 -0
  7. package/dist/commands/new-app-feature.d.ts.map +1 -0
  8. package/dist/commands/new-app-feature.js +166 -0
  9. package/dist/commands/new-app-feature.js.map +1 -0
  10. package/dist/commands/new-app.d.ts +1 -0
  11. package/dist/commands/new-app.d.ts.map +1 -0
  12. package/dist/commands/new-app.js +2 -0
  13. package/dist/commands/new-app.js.map +1 -0
  14. package/dist/commands/watch-patches.d.ts +6 -0
  15. package/dist/commands/watch-patches.d.ts.map +1 -0
  16. package/dist/commands/watch-patches.js +152 -0
  17. package/dist/commands/watch-patches.js.map +1 -0
  18. package/dist/core/dependency-resolver.d.ts +40 -0
  19. package/dist/core/dependency-resolver.d.ts.map +1 -0
  20. package/dist/core/dependency-resolver.js +122 -0
  21. package/dist/core/dependency-resolver.js.map +1 -0
  22. package/dist/core/file-operations.d.ts +37 -0
  23. package/dist/core/file-operations.d.ts.map +1 -0
  24. package/dist/core/file-operations.js +201 -0
  25. package/dist/core/file-operations.js.map +1 -0
  26. package/dist/core/package-json-merger.d.ts +30 -0
  27. package/dist/core/package-json-merger.d.ts.map +1 -0
  28. package/dist/core/package-json-merger.js +104 -0
  29. package/dist/core/package-json-merger.js.map +1 -0
  30. package/dist/core/patch-loader.d.ts +17 -0
  31. package/dist/core/patch-loader.d.ts.map +1 -0
  32. package/dist/core/patch-loader.js +100 -0
  33. package/dist/core/patch-loader.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +90 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/types.d.ts +21 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/utils/debounce.d.ts +6 -0
  43. package/dist/utils/debounce.d.ts.map +1 -0
  44. package/dist/utils/debounce.js +19 -0
  45. package/dist/utils/debounce.js.map +1 -0
  46. package/dist/utils/import-merger.d.ts +12 -0
  47. package/dist/utils/import-merger.d.ts.map +1 -0
  48. package/dist/utils/import-merger.js +240 -0
  49. package/dist/utils/import-merger.js.map +1 -0
  50. package/dist/utils/logger.d.ts +6 -0
  51. package/dist/utils/logger.d.ts.map +1 -0
  52. package/dist/utils/logger.js +17 -0
  53. package/dist/utils/logger.js.map +1 -0
  54. package/dist/utils/path-mappings.d.ts +88 -0
  55. package/dist/utils/path-mappings.d.ts.map +1 -0
  56. package/dist/utils/path-mappings.js +138 -0
  57. package/dist/utils/path-mappings.js.map +1 -0
  58. package/dist/utils/paths.d.ts +43 -0
  59. package/dist/utils/paths.d.ts.map +1 -0
  60. package/dist/utils/paths.js +107 -0
  61. package/dist/utils/paths.js.map +1 -0
  62. package/dist/utils/route-merger.d.ts +107 -0
  63. package/dist/utils/route-merger.d.ts.map +1 -0
  64. package/dist/utils/route-merger.js +303 -0
  65. package/dist/utils/route-merger.js.map +1 -0
  66. package/dist/utils/validation.d.ts +29 -0
  67. package/dist/utils/validation.d.ts.map +1 -0
  68. package/dist/utils/validation.js +109 -0
  69. package/dist/utils/validation.js.map +1 -0
  70. package/package.json +39 -0
  71. package/src/commands/apply-patches.ts +594 -0
  72. package/src/commands/new-app-feature.ts +203 -0
  73. package/src/commands/new-app.ts +0 -0
  74. package/src/commands/watch-patches.ts +173 -0
  75. package/src/core/dependency-resolver.ts +175 -0
  76. package/src/core/file-operations.ts +265 -0
  77. package/src/core/package-json-merger.ts +129 -0
  78. package/src/core/patch-loader.ts +128 -0
  79. package/src/index.ts +95 -0
  80. package/src/types.ts +23 -0
  81. package/src/utils/debounce.ts +23 -0
  82. package/src/utils/import-merger.ts +293 -0
  83. package/src/utils/logger.ts +21 -0
  84. package/src/utils/path-mappings.ts +154 -0
  85. package/src/utils/paths.ts +121 -0
  86. package/src/utils/route-merger.ts +357 -0
  87. package/src/utils/validation.ts +150 -0
  88. package/test/e2e/E2E_TEST_FIXTURES.md +509 -0
  89. package/test/e2e/apply-patches.spec.ts +861 -0
  90. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/package.json +10 -0
  91. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/appLayout.tsx +27 -0
  92. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/home.tsx +8 -0
  93. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/index.tsx +10 -0
  94. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/old-page.tsx +8 -0
  95. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/routes.tsx +23 -0
  96. package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/styles/global.css +14 -0
  97. package/test/e2e/fixtures/basic-operations/dep-chain-linear/feature.ts +11 -0
  98. package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/__inherit__appLayout.tsx +27 -0
  99. package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/contact.tsx +8 -0
  100. package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/routes.tsx +17 -0
  101. package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/feature.ts +10 -0
  102. package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/__inherit__appLayout.tsx +27 -0
  103. package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/__inherit__home.tsx +0 -0
  104. package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/about.tsx +8 -0
  105. package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/routes.tsx +17 -0
  106. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/feature.ts +10 -0
  107. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/__inherit__appLayout.tsx +27 -0
  108. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/__prepend__index.tsx +2 -0
  109. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/routes.tsx +17 -0
  110. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/settings.tsx +9 -0
  111. package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/styles/__append__global.css +10 -0
  112. package/test/e2e/fixtures/basic-operations/feature-file-route-delete/feature.ts +10 -0
  113. package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/__delete__old-page.tsx +2 -0
  114. package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/__inherit__appLayout.tsx +27 -0
  115. package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/routes.tsx +16 -0
  116. package/test/e2e/fixtures/composition-5-features/5-features-about/feature.ts +3 -0
  117. package/test/e2e/fixtures/composition-5-features/5-features-about/template/digitalExperiences/webApplications/5-features-about/src/about.tsx +8 -0
  118. package/test/e2e/fixtures/composition-5-features/5-features-about/template/digitalExperiences/webApplications/5-features-about/src/routes.tsx +17 -0
  119. package/test/e2e/fixtures/composition-5-features/5-features-analytics/feature.ts +3 -0
  120. package/test/e2e/fixtures/composition-5-features/5-features-analytics/template/digitalExperiences/webApplications/5-features-analytics/src/__prepend__index.tsx +2 -0
  121. package/test/e2e/fixtures/composition-5-features/5-features-footer/feature.ts +3 -0
  122. package/test/e2e/fixtures/composition-5-features/5-features-footer/template/digitalExperiences/webApplications/5-features-footer/src/footer.tsx +7 -0
  123. package/test/e2e/fixtures/composition-5-features/5-features-footer/template/digitalExperiences/webApplications/5-features-footer/src/routes.tsx +17 -0
  124. package/test/e2e/fixtures/composition-5-features/5-features-navigation/feature.ts +3 -0
  125. package/test/e2e/fixtures/composition-5-features/5-features-navigation/template/digitalExperiences/webApplications/5-features-navigation/src/navigation.tsx +7 -0
  126. package/test/e2e/fixtures/composition-5-features/5-features-navigation/template/digitalExperiences/webApplications/5-features-navigation/src/routes.tsx +17 -0
  127. package/test/e2e/fixtures/composition-5-features/5-features-theme/feature.ts +3 -0
  128. package/test/e2e/fixtures/composition-5-features/5-features-theme/template/digitalExperiences/webApplications/5-features-theme/src/styles/__append__global.css +5 -0
  129. package/test/e2e/fixtures/composition-append/composition-append-1/feature.ts +10 -0
  130. package/test/e2e/fixtures/composition-append/composition-append-1/template/digitalExperiences/webApplications/composition-append-1/src/styles/__append__global.css +4 -0
  131. package/test/e2e/fixtures/composition-append/composition-append-2/feature.ts +10 -0
  132. package/test/e2e/fixtures/composition-append/composition-append-2/template/digitalExperiences/webApplications/composition-append-2/src/styles/__append__global.css +4 -0
  133. package/test/e2e/fixtures/composition-append/composition-append-3/feature.ts +10 -0
  134. package/test/e2e/fixtures/composition-append/composition-append-3/template/digitalExperiences/webApplications/composition-append-3/src/styles/__append__global.css +4 -0
  135. package/test/e2e/fixtures/composition-inherit-modify/composition-inherit-layout/feature.ts +3 -0
  136. package/test/e2e/fixtures/composition-inherit-modify/composition-inherit-layout/template/digitalExperiences/webApplications/composition-inherit-layout/src/__inherit__appLayout.tsx +1 -0
  137. package/test/e2e/fixtures/composition-inherit-modify/composition-modify-layout/feature.ts +3 -0
  138. package/test/e2e/fixtures/composition-inherit-modify/composition-modify-layout/template/digitalExperiences/webApplications/composition-modify-layout/src/__append__appLayout.tsx +2 -0
  139. package/test/e2e/fixtures/composition-prepend/composition-prepend-1/feature.ts +10 -0
  140. package/test/e2e/fixtures/composition-prepend/composition-prepend-1/template/digitalExperiences/webApplications/composition-prepend-1/src/__prepend__index.tsx +2 -0
  141. package/test/e2e/fixtures/composition-prepend/composition-prepend-2/feature.ts +10 -0
  142. package/test/e2e/fixtures/composition-prepend/composition-prepend-2/template/digitalExperiences/webApplications/composition-prepend-2/src/__prepend__index.tsx +2 -0
  143. package/test/e2e/fixtures/composition-prepend/composition-prepend-3/feature.ts +10 -0
  144. package/test/e2e/fixtures/composition-prepend/composition-prepend-3/template/digitalExperiences/webApplications/composition-prepend-3/src/__prepend__index.tsx +2 -0
  145. package/test/e2e/fixtures/dep-chain-long/dep-chain-a/feature.ts +11 -0
  146. package/test/e2e/fixtures/dep-chain-long/dep-chain-a/template/digitalExperiences/webApplications/dep-chain-a/src/page-a.tsx +8 -0
  147. package/test/e2e/fixtures/dep-chain-long/dep-chain-a/template/digitalExperiences/webApplications/dep-chain-a/src/routes.tsx +17 -0
  148. package/test/e2e/fixtures/dep-chain-long/dep-chain-b/feature.ts +11 -0
  149. package/test/e2e/fixtures/dep-chain-long/dep-chain-b/template/digitalExperiences/webApplications/dep-chain-b/src/page-b.tsx +8 -0
  150. package/test/e2e/fixtures/dep-chain-long/dep-chain-b/template/digitalExperiences/webApplications/dep-chain-b/src/routes.tsx +17 -0
  151. package/test/e2e/fixtures/dep-chain-long/dep-chain-c/feature.ts +11 -0
  152. package/test/e2e/fixtures/dep-chain-long/dep-chain-c/template/digitalExperiences/webApplications/dep-chain-c/src/page-c.tsx +8 -0
  153. package/test/e2e/fixtures/dep-chain-long/dep-chain-c/template/digitalExperiences/webApplications/dep-chain-c/src/routes.tsx +17 -0
  154. package/test/e2e/fixtures/dep-chain-long/dep-chain-d/feature.ts +10 -0
  155. package/test/e2e/fixtures/dep-chain-long/dep-chain-d/template/digitalExperiences/webApplications/dep-chain-d/src/page-d.tsx +8 -0
  156. package/test/e2e/fixtures/dep-chain-long/dep-chain-d/template/digitalExperiences/webApplications/dep-chain-d/src/routes.tsx +17 -0
  157. package/test/e2e/fixtures/dep-circular/dep-circular-a/feature.ts +11 -0
  158. package/test/e2e/fixtures/dep-circular/dep-circular-a/template/digitalExperiences/webApplications/dep-circular-a/src/page-a.tsx +8 -0
  159. package/test/e2e/fixtures/dep-circular/dep-circular-b/feature.ts +11 -0
  160. package/test/e2e/fixtures/dep-circular/dep-circular-b/template/digitalExperiences/webApplications/dep-circular-b/src/page-b.tsx +8 -0
  161. package/test/e2e/fixtures/dep-complex-graph/README.md +119 -0
  162. package/test/e2e/fixtures/dep-complex-graph/create-placeholders.sh +25 -0
  163. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/feature.ts +14 -0
  164. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/__delete__old-page.tsx +1 -0
  165. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/__inherit__appLayout.tsx +1 -0
  166. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/login.tsx +8 -0
  167. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/routes.tsx +29 -0
  168. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/signup.tsx +1 -0
  169. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/feature.ts +14 -0
  170. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/__inherit__appLayout.tsx +1 -0
  171. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/analytics.tsx +1 -0
  172. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/dashboard.tsx +8 -0
  173. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/reports.tsx +1 -0
  174. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/routes.tsx +32 -0
  175. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/feature.ts +14 -0
  176. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/__inherit__appLayout.tsx +1 -0
  177. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/profile-edit.tsx +1 -0
  178. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/profile.tsx +8 -0
  179. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/routes.tsx +26 -0
  180. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-components/feature.ts +14 -0
  181. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-components/template/digitalExperiences/webApplications/dep-complex-graph-shared-components/src/__inherit__appLayout.tsx +1 -0
  182. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-components/template/digitalExperiences/webApplications/dep-complex-graph-shared-components/src/components.tsx +8 -0
  183. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-components/template/digitalExperiences/webApplications/dep-complex-graph-shared-components/src/routes.tsx +18 -0
  184. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-types/feature.ts +10 -0
  185. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-types/template/digitalExperiences/webApplications/dep-complex-graph-shared-types/src/__inherit__appLayout.tsx +1 -0
  186. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-types/template/digitalExperiences/webApplications/dep-complex-graph-shared-types/src/routes.tsx +17 -0
  187. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-types/template/digitalExperiences/webApplications/dep-complex-graph-shared-types/src/types.tsx +8 -0
  188. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-utils/feature.ts +10 -0
  189. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-utils/template/digitalExperiences/webApplications/dep-complex-graph-shared-utils/src/__inherit__appLayout.tsx +1 -0
  190. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-utils/template/digitalExperiences/webApplications/dep-complex-graph-shared-utils/src/routes.tsx +18 -0
  191. package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-utils/template/digitalExperiences/webApplications/dep-complex-graph-shared-utils/src/tools.tsx +1 -0
  192. package/test/e2e/fixtures/dep-complex-graph/feature.ts +15 -0
  193. package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/__inherit__appLayout.tsx +1 -0
  194. package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/admin-dashboard.tsx +1 -0
  195. package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/admin-layout.tsx +1 -0
  196. package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/routes.tsx +24 -0
  197. package/test/e2e/fixtures/dep-diamond/dep-diamond-left/feature.ts +11 -0
  198. package/test/e2e/fixtures/dep-diamond/dep-diamond-left/template/digitalExperiences/webApplications/dep-diamond-left/src/left-page.tsx +8 -0
  199. package/test/e2e/fixtures/dep-diamond/dep-diamond-left/template/digitalExperiences/webApplications/dep-diamond-left/src/routes.tsx +17 -0
  200. package/test/e2e/fixtures/dep-diamond/dep-diamond-right/feature.ts +11 -0
  201. package/test/e2e/fixtures/dep-diamond/dep-diamond-right/template/digitalExperiences/webApplications/dep-diamond-right/src/right-page.tsx +8 -0
  202. package/test/e2e/fixtures/dep-diamond/dep-diamond-right/template/digitalExperiences/webApplications/dep-diamond-right/src/routes.tsx +17 -0
  203. package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/feature.ts +10 -0
  204. package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/template/digitalExperiences/webApplications/dep-diamond-shared/src/routes.tsx +17 -0
  205. package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/template/digitalExperiences/webApplications/dep-diamond-shared/src/shared-utils.tsx +8 -0
  206. package/test/e2e/fixtures/edges/edge-binary-files/feature.ts +13 -0
  207. package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/__inherit__appLayout.tsx +1 -0
  208. package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/assets/test-image.png +0 -0
  209. package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/placeholder.tsx +0 -0
  210. package/test/e2e/fixtures/edges/edge-conflicting-prefixes/feature.ts +13 -0
  211. package/test/e2e/fixtures/edges/edge-conflicting-prefixes/template/digitalExperiences/webApplications/edge-conflicting-prefixes/src/__inherit____delete__conflicting.tsx +5 -0
  212. package/test/e2e/fixtures/edges/edge-conflicting-prefixes/template/digitalExperiences/webApplications/edge-conflicting-prefixes/src/placeholder.tsx +0 -0
  213. package/test/e2e/fixtures/edges/edge-empty-feature/feature.ts +16 -0
  214. package/test/e2e/fixtures/edges/edge-empty-feature/template/digitalExperiences/webApplications/edge-empty-feature/src/placeholder.tsx +0 -0
  215. package/test/e2e/fixtures/edges/edge-invalid-routes/feature.ts +12 -0
  216. package/test/e2e/fixtures/edges/edge-invalid-routes/template/digitalExperiences/webApplications/edge-invalid-routes/src/placeholder.tsx +0 -0
  217. package/test/e2e/fixtures/edges/edge-invalid-routes/template/digitalExperiences/webApplications/edge-invalid-routes/src/routes.tsx +8 -0
  218. package/test/e2e/fixtures/edges/edge-line-endings/feature.ts +13 -0
  219. package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/__prepend__index.tsx +2 -0
  220. package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/crlf.tsx +4 -0
  221. package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/placeholder.tsx +0 -0
  222. package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/styles/__append__global.css +4 -0
  223. package/test/e2e/fixtures/edges/edge-missing-base-files/feature.ts +13 -0
  224. package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/__inherit__missing.tsx +1 -0
  225. package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/__prepend__nonexistent.tsx +2 -0
  226. package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/placeholder.tsx +0 -0
  227. package/test/e2e/fixtures/edges/edge-package-json-conflicts-a/feature.ts +14 -0
  228. package/test/e2e/fixtures/edges/edge-package-json-conflicts-a/template/digitalExperiences/webApplications/edge-package-json-conflicts-a/src/placeholder.tsx +1 -0
  229. package/test/e2e/fixtures/edges/edge-package-json-conflicts-b/feature.ts +14 -0
  230. package/test/e2e/fixtures/edges/edge-package-json-conflicts-b/template/digitalExperiences/webApplications/edge-package-json-conflicts-b/src/placeholder.tsx +1 -0
  231. package/test/e2e/fixtures/edges/edge-performance-many/feature.ts +26 -0
  232. package/test/e2e/fixtures/edges/edge-performance-many/template/digitalExperiences/webApplications/edge-performance-many/src/placeholder.tsx +0 -0
  233. package/test/e2e/fixtures/path-mappings/feature-custom-mapping/feature.ts +16 -0
  234. package/test/e2e/fixtures/path-mappings/feature-custom-mapping/template/web/src/custom-component.tsx +3 -0
  235. package/test/e2e/fixtures/path-mappings/feature-custom-mapping/template/web/src/routes.tsx +8 -0
  236. package/test/e2e/fixtures/path-mappings/feature-mixed-paths/feature.ts +7 -0
  237. package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/digitalExperiences/webApplications/feature-mixed-paths/assets/icon.svg +3 -0
  238. package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/webApp/src/mapped-component.tsx +3 -0
  239. package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/webApp/src/routes.tsx +8 -0
  240. package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/feature.ts +7 -0
  241. package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/template/webApp/src/app.tsx +3 -0
  242. package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/template/webApp/src/routes.tsx +8 -0
  243. package/test/e2e/fixtures/path-mappings/feature-without-mapping/feature.ts +11 -0
  244. package/test/e2e/fixtures/path-mappings/feature-without-mapping/template/digitalExperiences/webApplications/feature-without-mapping/src/legacy-component.tsx +3 -0
  245. package/test/e2e/fixtures/path-mappings/feature-without-mapping/template/digitalExperiences/webApplications/feature-without-mapping/src/routes.tsx +8 -0
  246. package/test/e2e/fixtures/scenarios/scenario-authentication/feature.ts +10 -0
  247. package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/components/LoginForm.tsx +25 -0
  248. package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/context/AuthContext.tsx +28 -0
  249. package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/login.tsx +10 -0
  250. package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/placeholder.tsx +0 -0
  251. package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/routes.tsx +17 -0
  252. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/feature.ts +11 -0
  253. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/__inherit__appLayout.tsx +1 -0
  254. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactDetail.tsx +54 -0
  255. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactForm.tsx +146 -0
  256. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactList.tsx +77 -0
  257. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/placeholder.tsx +0 -0
  258. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/routes.tsx +36 -0
  259. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/styles/__append__global.css +176 -0
  260. package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/utils/contactsApi.ts +42 -0
  261. package/test/e2e/fixtures/scenarios/scenario-navigation-menu/feature.ts +10 -0
  262. package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/__append__appLayout.tsx +4 -0
  263. package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/components/NavigationMenu.tsx +17 -0
  264. package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/placeholder.tsx +0 -0
  265. package/test/e2e/fixtures/single-operations/feature-file-append/feature.ts +10 -0
  266. package/test/e2e/fixtures/single-operations/feature-file-append/template/digitalExperiences/webApplications/feature-file-append/src/styles/__append__global.css +10 -0
  267. package/test/e2e/fixtures/single-operations/feature-file-inherit/feature.ts +10 -0
  268. package/test/e2e/fixtures/single-operations/feature-file-inherit/template/digitalExperiences/webApplications/feature-file-inherit/src/__inherit__appLayout.tsx +1 -0
  269. package/test/e2e/fixtures/single-operations/feature-file-inherit/template/digitalExperiences/webApplications/feature-file-inherit/src/__inherit__home.tsx +1 -0
  270. package/test/e2e/fixtures/single-operations/feature-file-prepend/feature.ts +10 -0
  271. package/test/e2e/fixtures/single-operations/feature-file-prepend/template/digitalExperiences/webApplications/feature-file-prepend/src/__prepend__index.tsx +2 -0
  272. package/test/e2e/fixtures/single-operations/feature-import-merge/feature.ts +10 -0
  273. package/test/e2e/fixtures/single-operations/feature-import-merge/template/digitalExperiences/webApplications/feature-import-merge/src/routes.tsx +18 -0
  274. package/test/e2e/fixtures/single-operations/feature-import-merge/template/digitalExperiences/webApplications/feature-import-merge/src/settings.tsx +8 -0
  275. package/test/e2e/fixtures/single-operations/feature-route-add/feature.ts +10 -0
  276. package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/about.tsx +8 -0
  277. package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/routes.tsx +23 -0
  278. package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/services.tsx +8 -0
  279. package/test/e2e/fixtures/watch/watch-add-delete-files/feature.ts +13 -0
  280. package/test/e2e/fixtures/watch/watch-add-delete-files/template/digitalExperiences/webApplications/watch-add-delete-files/src/initial.tsx +4 -0
  281. package/test/e2e/fixtures/watch/watch-add-delete-files/template/digitalExperiences/webApplications/watch-add-delete-files/src/placeholder.tsx +4 -0
  282. package/test/e2e/fixtures/watch/watch-basic/feature.ts +13 -0
  283. package/test/e2e/fixtures/watch/watch-basic/template/digitalExperiences/webApplications/watch-basic/src/placeholder.tsx +4 -0
  284. package/test/e2e/fixtures/watch/watch-basic/template/digitalExperiences/webApplications/watch-basic/src/watchTest.tsx +3 -0
  285. package/test/e2e/fixtures/watch/watch-debounce/feature.ts +13 -0
  286. package/test/e2e/fixtures/watch/watch-debounce/template/digitalExperiences/webApplications/watch-debounce/src/placeholder.tsx +4 -0
  287. package/test/e2e/fixtures/watch/watch-multiple-files/feature.ts +13 -0
  288. package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/components/WatchComponent.tsx +3 -0
  289. package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/placeholder.tsx +4 -0
  290. package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/styles/theme.css +4 -0
  291. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/package.json +10 -0
  292. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/about.tsx +8 -0
  293. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/appLayout.tsx +27 -0
  294. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/contact.tsx +8 -0
  295. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/home.tsx +8 -0
  296. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/index.tsx +10 -0
  297. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/old-page.tsx +8 -0
  298. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/routes.tsx +35 -0
  299. package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/styles/global.css +14 -0
  300. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/package.json +10 -0
  301. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/appLayout.tsx +27 -0
  302. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/home.tsx +8 -0
  303. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/index.tsx +10 -0
  304. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/old-page.tsx +8 -0
  305. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-a.tsx +8 -0
  306. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-b.tsx +8 -0
  307. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-c.tsx +8 -0
  308. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-d.tsx +8 -0
  309. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/routes.tsx +47 -0
  310. package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/styles/global.css +14 -0
  311. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/package.json +10 -0
  312. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/admin-dashboard.tsx +1 -0
  313. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/admin-layout.tsx +1 -0
  314. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/analytics.tsx +1 -0
  315. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/appLayout.tsx +27 -0
  316. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/components.tsx +8 -0
  317. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/dashboard.tsx +8 -0
  318. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/home.tsx +8 -0
  319. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/index.tsx +10 -0
  320. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/login.tsx +8 -0
  321. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/profile-edit.tsx +1 -0
  322. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/profile.tsx +8 -0
  323. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/reports.tsx +1 -0
  324. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/routes.tsx +94 -0
  325. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/signup.tsx +1 -0
  326. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/styles/global.css +14 -0
  327. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/tools.tsx +1 -0
  328. package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/types.tsx +8 -0
  329. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/package.json +10 -0
  330. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/appLayout.tsx +27 -0
  331. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/custom-component.tsx +3 -0
  332. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/home.tsx +8 -0
  333. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/index.tsx +10 -0
  334. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/old-page.tsx +8 -0
  335. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/routes.tsx +28 -0
  336. package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/styles/global.css +14 -0
  337. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/package.json +10 -0
  338. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/about.tsx +8 -0
  339. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/appLayout.tsx +27 -0
  340. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/home.tsx +8 -0
  341. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/index.tsx +10 -0
  342. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/old-page.tsx +8 -0
  343. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/routes.tsx +29 -0
  344. package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/styles/global.css +14 -0
  345. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/package.json +10 -0
  346. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/appLayout.tsx +27 -0
  347. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/home.tsx +8 -0
  348. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/index.tsx +13 -0
  349. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/old-page.tsx +8 -0
  350. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/routes.tsx +29 -0
  351. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/settings.tsx +9 -0
  352. package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/styles/global.css +25 -0
  353. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/package.json +10 -0
  354. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/appLayout.tsx +27 -0
  355. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/home.tsx +8 -0
  356. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/index.tsx +10 -0
  357. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/routes.tsx +17 -0
  358. package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/styles/global.css +14 -0
  359. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/assets/icon.svg +3 -0
  360. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/package.json +10 -0
  361. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/appLayout.tsx +27 -0
  362. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/home.tsx +8 -0
  363. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/index.tsx +10 -0
  364. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/mapped-component.tsx +3 -0
  365. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/old-page.tsx +8 -0
  366. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/routes.tsx +28 -0
  367. package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/styles/global.css +14 -0
  368. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/package.json +10 -0
  369. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/app.tsx +3 -0
  370. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/appLayout.tsx +27 -0
  371. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/home.tsx +8 -0
  372. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/index.tsx +10 -0
  373. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/old-page.tsx +8 -0
  374. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/routes.tsx +28 -0
  375. package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/styles/global.css +14 -0
  376. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/package.json +10 -0
  377. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/appLayout.tsx +27 -0
  378. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/home.tsx +8 -0
  379. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/index.tsx +10 -0
  380. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/legacy-component.tsx +3 -0
  381. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/old-page.tsx +8 -0
  382. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/routes.tsx +28 -0
  383. package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/styles/global.css +14 -0
  384. package/test/e2e/path-mappings.spec.ts +232 -0
  385. package/test/e2e/watch-patches.spec.ts +237 -0
  386. package/test/helpers/cli-runner.ts +100 -0
  387. package/test/helpers/compare-directories.ts +197 -0
  388. package/test/helpers/create-temp-dir.ts +34 -0
  389. package/test/helpers/fixtures.ts +67 -0
  390. package/test/setup.ts +6 -0
  391. package/test/unit/debounce.spec.ts +159 -0
  392. package/test/unit/dependency-resolver.spec.ts +260 -0
  393. package/test/unit/file-operations.spec.ts +264 -0
  394. package/test/unit/import-merger.spec.ts +395 -0
  395. package/test/unit/index.spec.ts +158 -0
  396. package/test/unit/new-app.spec.ts +178 -0
  397. package/test/unit/new-feature.spec.ts +178 -0
  398. package/test/unit/package-json-merger.spec.ts +275 -0
  399. package/test/unit/patch-loader.spec.ts +238 -0
  400. package/test/unit/path-mappings.spec.ts +241 -0
  401. package/test/unit/paths.spec.ts +247 -0
  402. package/test/unit/route-merger.spec.ts +265 -0
  403. package/test/unit/validation.spec.ts +311 -0
  404. package/tsconfig.json +20 -0
  405. package/vitest.config.ts +18 -0
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Apply feature patches to create a new app
3
+ *
4
+ * @param featurePath - Path to the feature directory containing feature.ts
5
+ * @param appPath - Path to the base app directory (used as reference, remains unchanged)
6
+ * @param options - Configuration options
7
+ * @param options.targetDirName - Required. Target directory where feature will be applied
8
+ * @param options.skipDependencyChanges - Optional. Skip npm dependency installation
9
+ * @param options.clean - Optional. Clean target directory before applying
10
+ *
11
+ * @example
12
+ * await applyPatchesCommand(
13
+ * 'packages/feature-navigation-menu',
14
+ * 'packages/base-react-app',
15
+ * { targetDirName: 'my-app' }
16
+ * );
17
+ */
18
+ export declare function applyPatchesCommand(featurePath: string, appPath: string, options: {
19
+ targetDirName: string;
20
+ skipDependencyChanges?: boolean;
21
+ clean?: boolean;
22
+ }): Promise<void>;
23
+ //# sourceMappingURL=apply-patches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patches.d.ts","sourceRoot":"","sources":["../../src/commands/apply-patches.ts"],"names":[],"mappings":"AA2aA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAAE,GACpF,OAAO,CAAC,IAAI,CAAC,CAiJf"}
@@ -0,0 +1,524 @@
1
+ import { cpSync, existsSync, rmSync, readdirSync, statSync, mkdirSync, unlinkSync } from 'fs';
2
+ import { join, relative, basename, dirname, isAbsolute } from 'path';
3
+ import { tmpdir } from 'os';
4
+ import { randomBytes } from 'crypto';
5
+ import { validateAndResolveFeaturePath, validateAndResolveAppPath, getWebApplicationPath } from '../utils/validation.js';
6
+ import { resolveDependencies } from '../core/dependency-resolver.js';
7
+ import { applyFile, deleteFile, prependToFile, appendToFile } from '../core/file-operations.js';
8
+ import { mergePackageJson } from '../core/package-json-merger.js';
9
+ import { getMonorepoRoot, translatePathToBaseApp, translatePathToTargetApp } from '../utils/paths.js';
10
+ import { getEffectivePathMappings, applyPathMappings } from '../utils/path-mappings.js';
11
+ import * as logger from '../utils/logger.js';
12
+ /**
13
+ * Recursively discover all files in a directory
14
+ */
15
+ function discoverFiles(dir, baseDir = dir) {
16
+ const files = [];
17
+ const entries = readdirSync(dir);
18
+ for (const entry of entries) {
19
+ const fullPath = join(dir, entry);
20
+ const stat = statSync(fullPath);
21
+ if (stat.isDirectory()) {
22
+ files.push(...discoverFiles(fullPath, baseDir));
23
+ }
24
+ else if (stat.isFile()) {
25
+ // Get relative path from baseDir
26
+ files.push(relative(baseDir, fullPath));
27
+ }
28
+ }
29
+ return files;
30
+ }
31
+ const DELETE_PREFIX = '__delete__';
32
+ const INHERIT_PREFIX = '__inherit__';
33
+ const PREPEND_PREFIX = '__prepend__';
34
+ const APPEND_PREFIX = '__append__';
35
+ /**
36
+ * Check if a path component has the delete prefix and return the actual path
37
+ * Returns null if no delete prefix is found, otherwise returns the actual path
38
+ *
39
+ * Examples:
40
+ * - "src/__delete__routes.tsx" -> "src/routes.tsx"
41
+ * - "src/__delete__pages" -> "src/pages"
42
+ * - "__delete__src/routes.tsx" -> "src/routes.tsx"
43
+ * - "src/routes.tsx" -> null (no prefix)
44
+ */
45
+ function extractDeletePath(relativePath) {
46
+ const parts = relativePath.split('/');
47
+ let hasDeletePrefix = false;
48
+ const transformedParts = parts.map(part => {
49
+ if (part.startsWith(DELETE_PREFIX)) {
50
+ hasDeletePrefix = true;
51
+ return part.substring(DELETE_PREFIX.length);
52
+ }
53
+ return part;
54
+ });
55
+ return hasDeletePrefix ? transformedParts.join('/') : null;
56
+ }
57
+ /**
58
+ * Check if a path component has the inherit prefix and return the actual path
59
+ * Returns null if no inherit prefix is found, otherwise returns the actual path
60
+ *
61
+ * Examples:
62
+ * - "src/__inherit__routes.tsx" -> "src/routes.tsx"
63
+ * - "__inherit__src/routes.tsx" -> "src/routes.tsx"
64
+ * - "src/routes.tsx" -> null (no prefix)
65
+ */
66
+ function extractInheritPath(relativePath) {
67
+ const parts = relativePath.split('/');
68
+ let hasInheritPrefix = false;
69
+ const transformedParts = parts.map(part => {
70
+ if (part.startsWith(INHERIT_PREFIX)) {
71
+ hasInheritPrefix = true;
72
+ return part.substring(INHERIT_PREFIX.length);
73
+ }
74
+ return part;
75
+ });
76
+ return hasInheritPrefix ? transformedParts.join('/') : null;
77
+ }
78
+ /**
79
+ * Check if a path component has the prepend prefix and return the actual path
80
+ * Returns null if no prepend prefix is found, otherwise returns the actual path
81
+ *
82
+ * Examples:
83
+ * - "src/styles/__prepend__global.css" -> "src/styles/global.css"
84
+ * - "__prepend__file.txt" -> "file.txt"
85
+ * - "src/file.tsx" -> null (no prefix)
86
+ */
87
+ function extractPrependPath(relativePath) {
88
+ const parts = relativePath.split('/');
89
+ let hasPrependPrefix = false;
90
+ const transformedParts = parts.map(part => {
91
+ if (part.startsWith(PREPEND_PREFIX)) {
92
+ hasPrependPrefix = true;
93
+ return part.substring(PREPEND_PREFIX.length);
94
+ }
95
+ return part;
96
+ });
97
+ return hasPrependPrefix ? transformedParts.join('/') : null;
98
+ }
99
+ /**
100
+ * Check if a path component has the append prefix and return the actual path
101
+ * Returns null if no append prefix is found, otherwise returns the actual path
102
+ *
103
+ * Examples:
104
+ * - "src/styles/__append__global.css" -> "src/styles/global.css"
105
+ * - "__append__file.txt" -> "file.txt"
106
+ * - "src/file.tsx" -> null (no prefix)
107
+ */
108
+ function extractAppendPath(relativePath) {
109
+ const parts = relativePath.split('/');
110
+ let hasAppendPrefix = false;
111
+ const transformedParts = parts.map(part => {
112
+ if (part.startsWith(APPEND_PREFIX)) {
113
+ hasAppendPrefix = true;
114
+ return part.substring(APPEND_PREFIX.length);
115
+ }
116
+ return part;
117
+ });
118
+ return hasAppendPrefix ? transformedParts.join('/') : null;
119
+ }
120
+ /**
121
+ * Apply a single feature's files to the target directory
122
+ * This is the core application logic extracted for reuse
123
+ */
124
+ async function applySingleFeature(resolvedFeature, baseAppPath, targetDir, targetAppName) {
125
+ const { featureDir, config, featurePath } = resolvedFeature;
126
+ const { templateDir, routeFilePath, pathMappings } = config;
127
+ // Extract feature name for path translation
128
+ const featureName = basename(featurePath);
129
+ // Get effective path mappings for this feature
130
+ const effectiveMappings = getEffectivePathMappings(featureName, pathMappings);
131
+ // Discover and apply files from feature's template directory
132
+ const templatePath = join(featureDir, templateDir);
133
+ if (!existsSync(templatePath)) {
134
+ throw new Error(`Template directory '${templateDir}' does not exist in feature path '${featurePath}'`);
135
+ }
136
+ logger.heading(`\nApplying: ${featurePath}`);
137
+ logger.info('Discovering files...');
138
+ const discoveredFiles = discoverFiles(templatePath);
139
+ if (discoveredFiles.length === 0) {
140
+ throw new Error(`Feature '${featurePath}' has no files in ${templateDir} directory`);
141
+ }
142
+ logger.info(`Found ${discoveredFiles.length} file(s)`);
143
+ // Validate that there are no conflicting paths and that base files exist
144
+ logger.info('Validating paths...');
145
+ const normalizedPaths = new Map();
146
+ const deleteFiles = [];
147
+ const inheritFiles = [];
148
+ const prependFiles = [];
149
+ const appendFiles = [];
150
+ for (const relativePath of discoveredFiles) {
151
+ // Apply path mappings to transform template path
152
+ const mappedPath = applyPathMappings(relativePath, effectiveMappings);
153
+ const deleteTargetPath = extractDeletePath(mappedPath);
154
+ const inheritTargetPath = extractInheritPath(mappedPath);
155
+ const prependTargetPath = extractPrependPath(mappedPath);
156
+ const appendTargetPath = extractAppendPath(mappedPath);
157
+ let normalizedPath;
158
+ let type;
159
+ if (deleteTargetPath) {
160
+ normalizedPath = deleteTargetPath;
161
+ type = 'delete';
162
+ deleteFiles.push(deleteTargetPath);
163
+ }
164
+ else if (inheritTargetPath) {
165
+ normalizedPath = inheritTargetPath;
166
+ type = 'inherit';
167
+ inheritFiles.push(inheritTargetPath);
168
+ }
169
+ else if (prependTargetPath) {
170
+ normalizedPath = prependTargetPath;
171
+ type = 'prepend';
172
+ prependFiles.push(prependTargetPath);
173
+ }
174
+ else if (appendTargetPath) {
175
+ normalizedPath = appendTargetPath;
176
+ type = 'append';
177
+ appendFiles.push(appendTargetPath);
178
+ }
179
+ else {
180
+ normalizedPath = mappedPath;
181
+ type = 'normal';
182
+ }
183
+ // Check for conflicts
184
+ if (normalizedPaths.has(normalizedPath)) {
185
+ const existing = normalizedPaths.get(normalizedPath);
186
+ logger.error('\nPath conflict detected!\n');
187
+ logger.info(`The following paths resolve to the same target file:`);
188
+ logger.info(` 1. ${existing.path} (${existing.type})`);
189
+ logger.info(` 2. ${relativePath} (${type})`);
190
+ logger.info(` → Both target: ${normalizedPath}\n`);
191
+ logger.warning('You cannot have multiple files targeting the same path.');
192
+ logger.info('Please remove one of these files from the template directory.\n');
193
+ throw new Error('Path conflict - cannot proceed');
194
+ }
195
+ normalizedPaths.set(normalizedPath, { path: relativePath, type });
196
+ }
197
+ // Validate that files marked for deletion exist
198
+ // Note: Files may exist in target (from dependencies) or will be inherited from base app
199
+ for (const deleteFile of deleteFiles) {
200
+ // Translate feature path to target app path
201
+ const targetPath = translatePathToTargetApp(deleteFile, featureName, targetAppName);
202
+ const targetFilePath = join(targetDir, targetPath);
203
+ // If file doesn't exist in target yet, check if it will be copied from base app during deletion
204
+ if (!existsSync(targetFilePath)) {
205
+ // Check if file exists in base app (will be inherited during delete operation)
206
+ const translatedPath = translatePathToBaseApp(deleteFile, featureName, baseAppPath);
207
+ const baseFilePath = join(baseAppPath, translatedPath);
208
+ if (!existsSync(baseFilePath)) {
209
+ logger.error(`\nValidation error: Cannot delete file that doesn't exist!\n`);
210
+ logger.info(`File marked for deletion: ${deleteFile}`);
211
+ logger.info(`Not found in target: ${targetFilePath}`);
212
+ logger.info(`Not found in base app: ${baseFilePath}`);
213
+ logger.warning(`The file must exist in target or base app to be deleted.\n`);
214
+ throw new Error('Delete validation failed - cannot proceed');
215
+ }
216
+ }
217
+ }
218
+ // Validate that files marked for inheritance exist in base app
219
+ for (const inheritFile of inheritFiles) {
220
+ // Translate feature path to target app path
221
+ const targetPath = translatePathToTargetApp(inheritFile, featureName, targetAppName);
222
+ const targetFilePath = join(targetDir, targetPath);
223
+ // If file doesn't exist in target yet, check if it will be copied from base app during inheritance
224
+ if (!existsSync(targetFilePath)) {
225
+ // Translate feature path to base app path (we inherit from base app)
226
+ const translatedPath = translatePathToBaseApp(inheritFile, featureName, baseAppPath);
227
+ const baseFilePath = join(baseAppPath, translatedPath);
228
+ if (!existsSync(baseFilePath)) {
229
+ logger.error(`\nValidation error: Cannot inherit file that doesn't exist!\n`);
230
+ logger.info(`File marked for inheritance: ${inheritFile}`);
231
+ logger.info(`Translated to: ${translatedPath}`);
232
+ logger.info(`Expected location in base app: ${baseFilePath}`);
233
+ logger.warning(`The file doesn't exist in the base app.\n`);
234
+ throw new Error('Inherit validation failed - cannot proceed');
235
+ }
236
+ }
237
+ }
238
+ // Validate that files marked for prepending exist in base app
239
+ for (const prependFile of prependFiles) {
240
+ // Translate feature path to base app path (we prepend to base app files)
241
+ const translatedPath = translatePathToBaseApp(prependFile, featureName, baseAppPath);
242
+ const baseFilePath = join(baseAppPath, translatedPath);
243
+ if (!existsSync(baseFilePath)) {
244
+ logger.error(`\nValidation error: Cannot prepend to file that doesn't exist!\n`);
245
+ logger.info(`File marked for prepending: ${prependFile}`);
246
+ logger.info(`Translated to: ${translatedPath}`);
247
+ logger.info(`Expected location in base app: ${baseFilePath}`);
248
+ logger.warning(`The file doesn't exist in the base app.\n`);
249
+ throw new Error('Prepend validation failed - cannot proceed');
250
+ }
251
+ }
252
+ // Validate that files marked for appending exist in base app
253
+ for (const appendFile of appendFiles) {
254
+ // Translate feature path to base app path (we append to base app files)
255
+ const translatedPath = translatePathToBaseApp(appendFile, featureName, baseAppPath);
256
+ const baseFilePath = join(baseAppPath, translatedPath);
257
+ if (!existsSync(baseFilePath)) {
258
+ logger.error(`\nValidation error: Cannot append to file that doesn't exist!\n`);
259
+ logger.info(`File marked for appending: ${appendFile}`);
260
+ logger.info(`Translated to: ${translatedPath}`);
261
+ logger.info(`Expected location in base app: ${baseFilePath}`);
262
+ logger.warning(`The file doesn't exist in the base app.\n`);
263
+ throw new Error('Append validation failed - cannot proceed');
264
+ }
265
+ }
266
+ logger.success('Paths validated');
267
+ // Apply each discovered file
268
+ for (const relativePath of discoveredFiles) {
269
+ // Apply path mappings to transform template path
270
+ const mappedPath = applyPathMappings(relativePath, effectiveMappings);
271
+ // Translate feature path to base app path (for finding base files)
272
+ const translatedPath = translatePathToBaseApp(mappedPath, featureName, baseAppPath);
273
+ // Translate feature path to target app path (for writing files)
274
+ const targetPath = translatePathToTargetApp(mappedPath, featureName, targetAppName);
275
+ // Check if this is a special operation
276
+ const deleteTargetPath = extractDeletePath(mappedPath);
277
+ const inheritTargetPath = extractInheritPath(mappedPath);
278
+ const prependTargetPath = extractPrependPath(mappedPath);
279
+ const appendTargetPath = extractAppendPath(mappedPath);
280
+ if (deleteTargetPath) {
281
+ // This is a delete operation - delete the target file/directory
282
+ const targetDeletePath = translatePathToTargetApp(deleteTargetPath, featureName, targetAppName);
283
+ const targetFilePath = join(targetDir, targetDeletePath);
284
+ await deleteFile(targetFilePath, targetDeletePath);
285
+ }
286
+ else if (inheritTargetPath) {
287
+ // This is an inherit operation - copy from base app if target doesn't have it
288
+ const targetInheritPath = translatePathToTargetApp(inheritTargetPath, featureName, targetAppName);
289
+ const targetFilePath = join(targetDir, targetInheritPath);
290
+ if (!existsSync(targetFilePath)) {
291
+ // Copy from base app to preserve inherited file in new target structure
292
+ const translatedInheritPath = translatePathToBaseApp(inheritTargetPath, featureName, baseAppPath);
293
+ const baseFilePath = join(baseAppPath, translatedInheritPath);
294
+ if (existsSync(baseFilePath)) {
295
+ const targetFileDir = dirname(targetFilePath);
296
+ if (!existsSync(targetFileDir)) {
297
+ mkdirSync(targetFileDir, { recursive: true });
298
+ }
299
+ cpSync(baseFilePath, targetFilePath);
300
+ logger.info(`Copied ${targetInheritPath} (inherited from base app)`);
301
+ }
302
+ else {
303
+ logger.info(`Skipped ${targetInheritPath} (file not in base app)`);
304
+ }
305
+ }
306
+ else {
307
+ logger.info(`Skipped ${targetInheritPath} (already exists in target)`);
308
+ }
309
+ }
310
+ else if (prependTargetPath) {
311
+ // This is a prepend operation - ensure target file exists first
312
+ const featureFilePath = join(templatePath, relativePath);
313
+ const targetPrependPath = translatePathToTargetApp(prependTargetPath, featureName, targetAppName);
314
+ const targetFilePath = join(targetDir, targetPrependPath);
315
+ // Copy from base app if target doesn't have the file yet
316
+ if (!existsSync(targetFilePath)) {
317
+ const translatedPrependPath = translatePathToBaseApp(prependTargetPath, featureName, baseAppPath);
318
+ const baseFilePath = join(baseAppPath, translatedPrependPath);
319
+ if (existsSync(baseFilePath)) {
320
+ const targetFileDir = dirname(targetFilePath);
321
+ if (!existsSync(targetFileDir)) {
322
+ mkdirSync(targetFileDir, { recursive: true });
323
+ }
324
+ cpSync(baseFilePath, targetFilePath);
325
+ }
326
+ }
327
+ await prependToFile(featureFilePath, targetFilePath, targetPrependPath);
328
+ }
329
+ else if (appendTargetPath) {
330
+ // This is an append operation - ensure target file exists first
331
+ const featureFilePath = join(templatePath, relativePath);
332
+ const targetAppendPath = translatePathToTargetApp(appendTargetPath, featureName, targetAppName);
333
+ const targetFilePath = join(targetDir, targetAppendPath);
334
+ // Copy from base app if target doesn't have the file yet
335
+ if (!existsSync(targetFilePath)) {
336
+ const translatedAppendPath = translatePathToBaseApp(appendTargetPath, featureName, baseAppPath);
337
+ const baseFilePath = join(baseAppPath, translatedAppendPath);
338
+ if (existsSync(baseFilePath)) {
339
+ const targetFileDir = dirname(targetFilePath);
340
+ if (!existsSync(targetFileDir)) {
341
+ mkdirSync(targetFileDir, { recursive: true });
342
+ }
343
+ cpSync(baseFilePath, targetFilePath);
344
+ }
345
+ }
346
+ await appendToFile(featureFilePath, targetFilePath, targetAppendPath);
347
+ }
348
+ else {
349
+ // Normal file operation - add/update/merge
350
+ const patchFilePath = join(templatePath, relativePath);
351
+ // Use target app path to ensure all features write to same location
352
+ const targetFilePath = join(targetDir, targetPath);
353
+ // Determine if this should be merged (only for the routes file)
354
+ // The routeFilePath from config includes the full path from template root
355
+ const shouldMerge = mappedPath === routeFilePath;
356
+ // For route merging with dependencies:
357
+ // - Use target file as base if it exists (accumulates routes from previous features)
358
+ // - Otherwise use base app file (first feature merges with base app)
359
+ // Create a temp copy of target to avoid ts-morph issues with same file as base and target
360
+ let baseFilePath = join(baseAppPath, translatedPath);
361
+ let tempFilePath;
362
+ if (shouldMerge && existsSync(targetFilePath)) {
363
+ // Create temp copy of target to use as base
364
+ tempFilePath = join(tmpdir(), `route-merge-${randomBytes(8).toString('hex')}.tsx`);
365
+ cpSync(targetFilePath, tempFilePath);
366
+ baseFilePath = tempFilePath;
367
+ }
368
+ try {
369
+ await applyFile(patchFilePath, baseFilePath, targetFilePath, targetPath, shouldMerge);
370
+ }
371
+ finally {
372
+ // Clean up temp file
373
+ if (tempFilePath && existsSync(tempFilePath)) {
374
+ unlinkSync(tempFilePath);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ }
380
+ /**
381
+ * Apply feature patches to create a new app
382
+ *
383
+ * @param featurePath - Path to the feature directory containing feature.ts
384
+ * @param appPath - Path to the base app directory (used as reference, remains unchanged)
385
+ * @param options - Configuration options
386
+ * @param options.targetDirName - Required. Target directory where feature will be applied
387
+ * @param options.skipDependencyChanges - Optional. Skip npm dependency installation
388
+ * @param options.clean - Optional. Clean target directory before applying
389
+ *
390
+ * @example
391
+ * await applyPatchesCommand(
392
+ * 'packages/feature-navigation-menu',
393
+ * 'packages/base-react-app',
394
+ * { targetDirName: 'my-app' }
395
+ * );
396
+ */
397
+ export async function applyPatchesCommand(featurePath, appPath, options) {
398
+ try {
399
+ logger.heading(`Applying patches: ${featurePath} → ${options.targetDirName}`);
400
+ // Step 1: Validate inputs
401
+ logger.info('Validating paths...');
402
+ validateAndResolveFeaturePath(featurePath); // Fast-fail validation
403
+ const baseAppPath = validateAndResolveAppPath(appPath);
404
+ logger.success('Validation passed');
405
+ // Step 2: Prepare target directory
406
+ // Extract target app name from the main feature path for nested structure
407
+ const mainFeatureName = basename(featurePath);
408
+ const targetAppName = mainFeatureName;
409
+ // Resolve target directory - if absolute, use as-is; otherwise resolve relative to monorepo root
410
+ const resolvedTargetDir = isAbsolute(options.targetDirName)
411
+ ? options.targetDirName
412
+ : join(getMonorepoRoot(), options.targetDirName);
413
+ if (existsSync(resolvedTargetDir)) {
414
+ if (options.clean) {
415
+ logger.info(`Cleaning existing directory ${options.targetDirName}...`);
416
+ rmSync(resolvedTargetDir, { recursive: true, force: true });
417
+ logger.success('Directory cleaned');
418
+ }
419
+ }
420
+ else {
421
+ logger.info(`Creating target directory ${options.targetDirName}...`);
422
+ mkdirSync(resolvedTargetDir, { recursive: true });
423
+ logger.success('Target directory created');
424
+ }
425
+ // Copy base app to target directory with nested structure
426
+ logger.info(`Copying base app to ${options.targetDirName}...`);
427
+ const targetAppDir = join(resolvedTargetDir, 'digitalExperiences/webApplications', targetAppName);
428
+ const sourceWebAppPath = getWebApplicationPath(baseAppPath);
429
+ mkdirSync(dirname(targetAppDir), { recursive: true });
430
+ cpSync(sourceWebAppPath, targetAppDir, { recursive: true });
431
+ logger.success('Base app copied');
432
+ const targetDir = resolvedTargetDir;
433
+ // Step 3: Resolve dependencies
434
+ logger.heading('\nResolving Dependencies');
435
+ const { orderedFeatures } = await resolveDependencies(featurePath);
436
+ if (orderedFeatures.length > 1) {
437
+ logger.info(`Resolved dependency chain (${orderedFeatures.length} features):`);
438
+ for (let i = 0; i < orderedFeatures.length; i++) {
439
+ const { featurePath: path } = orderedFeatures[i];
440
+ const isMainFeature = i === orderedFeatures.length - 1;
441
+ const prefix = isMainFeature ? '└─' : '├─';
442
+ const label = isMainFeature ? ' (main)' : ' (dependency)';
443
+ logger.info(` ${prefix} ${path}${label}`);
444
+ }
445
+ logger.success('Dependency resolution complete');
446
+ }
447
+ else {
448
+ logger.info('No dependencies found');
449
+ }
450
+ // Step 4: Apply all features in dependency order
451
+ for (const resolvedFeature of orderedFeatures) {
452
+ await applySingleFeature(resolvedFeature, baseAppPath, targetDir, targetAppName);
453
+ }
454
+ // Step 5: Aggregate and install all dependencies once
455
+ if (options.skipDependencyChanges) {
456
+ logger.info('\n⏭ Skipping dependency installation');
457
+ }
458
+ else {
459
+ // Aggregate all dependencies from all resolved features, checking for conflicts
460
+ const aggregatedDependencies = {};
461
+ const aggregatedDevDependencies = {};
462
+ // Collect all features from all resolved features
463
+ const allFeatures = orderedFeatures.flatMap(rf => rf.config.features);
464
+ // First pass: collect all regular dependencies
465
+ for (const feature of allFeatures) {
466
+ if (feature.packageJson?.dependencies) {
467
+ for (const [name, version] of Object.entries(feature.packageJson.dependencies)) {
468
+ if (aggregatedDependencies[name] && aggregatedDependencies[name] !== version) {
469
+ throw new Error(`Dependency version conflict for '${name}': feature requires '${version}' but another feature requires '${aggregatedDependencies[name]}'`);
470
+ }
471
+ aggregatedDependencies[name] = version;
472
+ }
473
+ }
474
+ }
475
+ // Second pass: collect dev dependencies (skip if already in dependencies)
476
+ for (const feature of allFeatures) {
477
+ if (feature.packageJson?.devDependencies) {
478
+ for (const [name, version] of Object.entries(feature.packageJson.devDependencies)) {
479
+ // Skip if already in regular dependencies
480
+ if (aggregatedDependencies[name]) {
481
+ continue;
482
+ }
483
+ if (aggregatedDevDependencies[name] && aggregatedDevDependencies[name] !== version) {
484
+ throw new Error(`Dev dependency version conflict for '${name}': feature requires '${version}' but another feature requires '${aggregatedDevDependencies[name]}'`);
485
+ }
486
+ aggregatedDevDependencies[name] = version;
487
+ }
488
+ }
489
+ }
490
+ const hasAnyDependencies = Object.keys(aggregatedDependencies).length > 0 ||
491
+ Object.keys(aggregatedDevDependencies).length > 0;
492
+ if (hasAnyDependencies) {
493
+ logger.heading('\nInstalling Dependencies');
494
+ await mergePackageJson(targetDir, {
495
+ dependencies: Object.keys(aggregatedDependencies).length > 0 ? aggregatedDependencies : undefined,
496
+ devDependencies: Object.keys(aggregatedDevDependencies).length > 0 ? aggregatedDevDependencies : undefined
497
+ }, targetAppDir);
498
+ }
499
+ else {
500
+ logger.info('\n✓ No dependencies to install');
501
+ }
502
+ }
503
+ // Step 6: Success message
504
+ logger.heading('\n✓ Success');
505
+ logger.success(`Created: ${targetDir}`);
506
+ }
507
+ catch (err) {
508
+ // Only log error if it's not already been logged (check for our custom error messages)
509
+ const errorMessage = err instanceof Error ? err.message : String(err);
510
+ const skipLogging = [
511
+ 'Path conflict - cannot proceed',
512
+ 'Delete validation failed - cannot proceed',
513
+ 'Inherit validation failed - cannot proceed',
514
+ 'Prepend validation failed - cannot proceed',
515
+ 'Append validation failed - cannot proceed',
516
+ 'Route deletion failed - cannot proceed'
517
+ ].includes(errorMessage);
518
+ if (!skipLogging) {
519
+ logger.error(`Failed to apply feature: ${errorMessage}`);
520
+ }
521
+ throw err;
522
+ }
523
+ }
524
+ //# sourceMappingURL=apply-patches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-patches.js","sourceRoot":"","sources":["../../src/commands/apply-patches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Create a new app or feature from the base-reference-app or base-feature template
3
+ *
4
+ * @param appOrFeatureName - Name of the app or feature (without "app-" or "feature-" prefix)
5
+ */
6
+ export declare function newAppOrFeatureCommand(appOrFeatureName: string, appOrFeatureType: 'app' | 'feature'): Promise<void>;
7
+ //# sourceMappingURL=new-app-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-app-feature.d.ts","sourceRoot":"","sources":["../../src/commands/new-app-feature.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CA2IzH"}