@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.
- package/README.md +1414 -0
- package/dist/commands/apply-patches.d.ts +23 -0
- package/dist/commands/apply-patches.d.ts.map +1 -0
- package/dist/commands/apply-patches.js +524 -0
- package/dist/commands/apply-patches.js.map +1 -0
- package/dist/commands/new-app-feature.d.ts +7 -0
- package/dist/commands/new-app-feature.d.ts.map +1 -0
- package/dist/commands/new-app-feature.js +166 -0
- package/dist/commands/new-app-feature.js.map +1 -0
- package/dist/commands/new-app.d.ts +1 -0
- package/dist/commands/new-app.d.ts.map +1 -0
- package/dist/commands/new-app.js +2 -0
- package/dist/commands/new-app.js.map +1 -0
- package/dist/commands/watch-patches.d.ts +6 -0
- package/dist/commands/watch-patches.d.ts.map +1 -0
- package/dist/commands/watch-patches.js +152 -0
- package/dist/commands/watch-patches.js.map +1 -0
- package/dist/core/dependency-resolver.d.ts +40 -0
- package/dist/core/dependency-resolver.d.ts.map +1 -0
- package/dist/core/dependency-resolver.js +122 -0
- package/dist/core/dependency-resolver.js.map +1 -0
- package/dist/core/file-operations.d.ts +37 -0
- package/dist/core/file-operations.d.ts.map +1 -0
- package/dist/core/file-operations.js +201 -0
- package/dist/core/file-operations.js.map +1 -0
- package/dist/core/package-json-merger.d.ts +30 -0
- package/dist/core/package-json-merger.d.ts.map +1 -0
- package/dist/core/package-json-merger.js +104 -0
- package/dist/core/package-json-merger.js.map +1 -0
- package/dist/core/patch-loader.d.ts +17 -0
- package/dist/core/patch-loader.d.ts.map +1 -0
- package/dist/core/patch-loader.js +100 -0
- package/dist/core/patch-loader.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/debounce.d.ts +6 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/debounce.js +19 -0
- package/dist/utils/debounce.js.map +1 -0
- package/dist/utils/import-merger.d.ts +12 -0
- package/dist/utils/import-merger.d.ts.map +1 -0
- package/dist/utils/import-merger.js +240 -0
- package/dist/utils/import-merger.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +17 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-mappings.d.ts +88 -0
- package/dist/utils/path-mappings.d.ts.map +1 -0
- package/dist/utils/path-mappings.js +138 -0
- package/dist/utils/path-mappings.js.map +1 -0
- package/dist/utils/paths.d.ts +43 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +107 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/route-merger.d.ts +107 -0
- package/dist/utils/route-merger.d.ts.map +1 -0
- package/dist/utils/route-merger.js +303 -0
- package/dist/utils/route-merger.js.map +1 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +109 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +39 -0
- package/src/commands/apply-patches.ts +594 -0
- package/src/commands/new-app-feature.ts +203 -0
- package/src/commands/new-app.ts +0 -0
- package/src/commands/watch-patches.ts +173 -0
- package/src/core/dependency-resolver.ts +175 -0
- package/src/core/file-operations.ts +265 -0
- package/src/core/package-json-merger.ts +129 -0
- package/src/core/patch-loader.ts +128 -0
- package/src/index.ts +95 -0
- package/src/types.ts +23 -0
- package/src/utils/debounce.ts +23 -0
- package/src/utils/import-merger.ts +293 -0
- package/src/utils/logger.ts +21 -0
- package/src/utils/path-mappings.ts +154 -0
- package/src/utils/paths.ts +121 -0
- package/src/utils/route-merger.ts +357 -0
- package/src/utils/validation.ts +150 -0
- package/test/e2e/E2E_TEST_FIXTURES.md +509 -0
- package/test/e2e/apply-patches.spec.ts +861 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/package.json +10 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/appLayout.tsx +27 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/home.tsx +8 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/index.tsx +10 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/old-page.tsx +8 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/routes.tsx +23 -0
- package/test/e2e/fixtures/base-app/digitalExperiences/webApplications/base-app/src/styles/global.css +14 -0
- package/test/e2e/fixtures/basic-operations/dep-chain-linear/feature.ts +11 -0
- package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/__inherit__appLayout.tsx +27 -0
- package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/contact.tsx +8 -0
- package/test/e2e/fixtures/basic-operations/dep-chain-linear/template/digitalExperiences/webApplications/dep-chain-linear/src/routes.tsx +17 -0
- package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/feature.ts +10 -0
- 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
- 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
- package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/about.tsx +8 -0
- package/test/e2e/fixtures/basic-operations/feature-file-inherit-route-add/template/digitalExperiences/webApplications/feature-file-inherit-route-add/src/routes.tsx +17 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/feature.ts +10 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/__inherit__appLayout.tsx +27 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/routes.tsx +17 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/settings.tsx +9 -0
- package/test/e2e/fixtures/basic-operations/feature-file-prepend-append/template/digitalExperiences/webApplications/feature-file-prepend-append/src/styles/__append__global.css +10 -0
- package/test/e2e/fixtures/basic-operations/feature-file-route-delete/feature.ts +10 -0
- package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/__delete__old-page.tsx +2 -0
- package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/__inherit__appLayout.tsx +27 -0
- package/test/e2e/fixtures/basic-operations/feature-file-route-delete/template/digitalExperiences/webApplications/feature-file-route-delete/src/routes.tsx +16 -0
- package/test/e2e/fixtures/composition-5-features/5-features-about/feature.ts +3 -0
- package/test/e2e/fixtures/composition-5-features/5-features-about/template/digitalExperiences/webApplications/5-features-about/src/about.tsx +8 -0
- package/test/e2e/fixtures/composition-5-features/5-features-about/template/digitalExperiences/webApplications/5-features-about/src/routes.tsx +17 -0
- package/test/e2e/fixtures/composition-5-features/5-features-analytics/feature.ts +3 -0
- package/test/e2e/fixtures/composition-5-features/5-features-analytics/template/digitalExperiences/webApplications/5-features-analytics/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/composition-5-features/5-features-footer/feature.ts +3 -0
- package/test/e2e/fixtures/composition-5-features/5-features-footer/template/digitalExperiences/webApplications/5-features-footer/src/footer.tsx +7 -0
- package/test/e2e/fixtures/composition-5-features/5-features-footer/template/digitalExperiences/webApplications/5-features-footer/src/routes.tsx +17 -0
- package/test/e2e/fixtures/composition-5-features/5-features-navigation/feature.ts +3 -0
- package/test/e2e/fixtures/composition-5-features/5-features-navigation/template/digitalExperiences/webApplications/5-features-navigation/src/navigation.tsx +7 -0
- package/test/e2e/fixtures/composition-5-features/5-features-navigation/template/digitalExperiences/webApplications/5-features-navigation/src/routes.tsx +17 -0
- package/test/e2e/fixtures/composition-5-features/5-features-theme/feature.ts +3 -0
- package/test/e2e/fixtures/composition-5-features/5-features-theme/template/digitalExperiences/webApplications/5-features-theme/src/styles/__append__global.css +5 -0
- package/test/e2e/fixtures/composition-append/composition-append-1/feature.ts +10 -0
- package/test/e2e/fixtures/composition-append/composition-append-1/template/digitalExperiences/webApplications/composition-append-1/src/styles/__append__global.css +4 -0
- package/test/e2e/fixtures/composition-append/composition-append-2/feature.ts +10 -0
- package/test/e2e/fixtures/composition-append/composition-append-2/template/digitalExperiences/webApplications/composition-append-2/src/styles/__append__global.css +4 -0
- package/test/e2e/fixtures/composition-append/composition-append-3/feature.ts +10 -0
- package/test/e2e/fixtures/composition-append/composition-append-3/template/digitalExperiences/webApplications/composition-append-3/src/styles/__append__global.css +4 -0
- package/test/e2e/fixtures/composition-inherit-modify/composition-inherit-layout/feature.ts +3 -0
- package/test/e2e/fixtures/composition-inherit-modify/composition-inherit-layout/template/digitalExperiences/webApplications/composition-inherit-layout/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/composition-inherit-modify/composition-modify-layout/feature.ts +3 -0
- package/test/e2e/fixtures/composition-inherit-modify/composition-modify-layout/template/digitalExperiences/webApplications/composition-modify-layout/src/__append__appLayout.tsx +2 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-1/feature.ts +10 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-1/template/digitalExperiences/webApplications/composition-prepend-1/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-2/feature.ts +10 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-2/template/digitalExperiences/webApplications/composition-prepend-2/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-3/feature.ts +10 -0
- package/test/e2e/fixtures/composition-prepend/composition-prepend-3/template/digitalExperiences/webApplications/composition-prepend-3/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-a/feature.ts +11 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-a/template/digitalExperiences/webApplications/dep-chain-a/src/page-a.tsx +8 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-a/template/digitalExperiences/webApplications/dep-chain-a/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-b/feature.ts +11 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-b/template/digitalExperiences/webApplications/dep-chain-b/src/page-b.tsx +8 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-b/template/digitalExperiences/webApplications/dep-chain-b/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-c/feature.ts +11 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-c/template/digitalExperiences/webApplications/dep-chain-c/src/page-c.tsx +8 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-c/template/digitalExperiences/webApplications/dep-chain-c/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-d/feature.ts +10 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-d/template/digitalExperiences/webApplications/dep-chain-d/src/page-d.tsx +8 -0
- package/test/e2e/fixtures/dep-chain-long/dep-chain-d/template/digitalExperiences/webApplications/dep-chain-d/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-circular/dep-circular-a/feature.ts +11 -0
- package/test/e2e/fixtures/dep-circular/dep-circular-a/template/digitalExperiences/webApplications/dep-circular-a/src/page-a.tsx +8 -0
- package/test/e2e/fixtures/dep-circular/dep-circular-b/feature.ts +11 -0
- package/test/e2e/fixtures/dep-circular/dep-circular-b/template/digitalExperiences/webApplications/dep-circular-b/src/page-b.tsx +8 -0
- package/test/e2e/fixtures/dep-complex-graph/README.md +119 -0
- package/test/e2e/fixtures/dep-complex-graph/create-placeholders.sh +25 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/feature.ts +14 -0
- 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
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/login.tsx +8 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/routes.tsx +29 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-auth/template/digitalExperiences/webApplications/dep-complex-graph-auth/src/signup.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/feature.ts +14 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/analytics.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/dashboard.tsx +8 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/reports.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-dashboard/template/digitalExperiences/webApplications/dep-complex-graph-dashboard/src/routes.tsx +32 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/feature.ts +14 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/profile-edit.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/profile.tsx +8 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-profile/template/digitalExperiences/webApplications/dep-complex-graph-profile/src/routes.tsx +26 -0
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-components/feature.ts +14 -0
- 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
- 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
- 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
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-types/feature.ts +10 -0
- 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
- 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
- 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
- package/test/e2e/fixtures/dep-complex-graph/dep-complex-graph-shared-utils/feature.ts +10 -0
- 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
- 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
- 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
- package/test/e2e/fixtures/dep-complex-graph/feature.ts +15 -0
- package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/admin-dashboard.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/admin-layout.tsx +1 -0
- package/test/e2e/fixtures/dep-complex-graph/template/digitalExperiences/webApplications/dep-complex-graph/src/routes.tsx +24 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-left/feature.ts +11 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-left/template/digitalExperiences/webApplications/dep-diamond-left/src/left-page.tsx +8 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-left/template/digitalExperiences/webApplications/dep-diamond-left/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-right/feature.ts +11 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-right/template/digitalExperiences/webApplications/dep-diamond-right/src/right-page.tsx +8 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-right/template/digitalExperiences/webApplications/dep-diamond-right/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/feature.ts +10 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/template/digitalExperiences/webApplications/dep-diamond-shared/src/routes.tsx +17 -0
- package/test/e2e/fixtures/dep-diamond/dep-diamond-shared/template/digitalExperiences/webApplications/dep-diamond-shared/src/shared-utils.tsx +8 -0
- package/test/e2e/fixtures/edges/edge-binary-files/feature.ts +13 -0
- package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/assets/test-image.png +0 -0
- package/test/e2e/fixtures/edges/edge-binary-files/template/digitalExperiences/webApplications/edge-binary-files/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-conflicting-prefixes/feature.ts +13 -0
- package/test/e2e/fixtures/edges/edge-conflicting-prefixes/template/digitalExperiences/webApplications/edge-conflicting-prefixes/src/__inherit____delete__conflicting.tsx +5 -0
- package/test/e2e/fixtures/edges/edge-conflicting-prefixes/template/digitalExperiences/webApplications/edge-conflicting-prefixes/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-empty-feature/feature.ts +16 -0
- package/test/e2e/fixtures/edges/edge-empty-feature/template/digitalExperiences/webApplications/edge-empty-feature/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-invalid-routes/feature.ts +12 -0
- package/test/e2e/fixtures/edges/edge-invalid-routes/template/digitalExperiences/webApplications/edge-invalid-routes/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-invalid-routes/template/digitalExperiences/webApplications/edge-invalid-routes/src/routes.tsx +8 -0
- package/test/e2e/fixtures/edges/edge-line-endings/feature.ts +13 -0
- package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/crlf.tsx +4 -0
- package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-line-endings/template/digitalExperiences/webApplications/edge-line-endings/src/styles/__append__global.css +4 -0
- package/test/e2e/fixtures/edges/edge-missing-base-files/feature.ts +13 -0
- package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/__inherit__missing.tsx +1 -0
- package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/__prepend__nonexistent.tsx +2 -0
- package/test/e2e/fixtures/edges/edge-missing-base-files/template/digitalExperiences/webApplications/edge-missing-base-files/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/edges/edge-package-json-conflicts-a/feature.ts +14 -0
- package/test/e2e/fixtures/edges/edge-package-json-conflicts-a/template/digitalExperiences/webApplications/edge-package-json-conflicts-a/src/placeholder.tsx +1 -0
- package/test/e2e/fixtures/edges/edge-package-json-conflicts-b/feature.ts +14 -0
- package/test/e2e/fixtures/edges/edge-package-json-conflicts-b/template/digitalExperiences/webApplications/edge-package-json-conflicts-b/src/placeholder.tsx +1 -0
- package/test/e2e/fixtures/edges/edge-performance-many/feature.ts +26 -0
- package/test/e2e/fixtures/edges/edge-performance-many/template/digitalExperiences/webApplications/edge-performance-many/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/path-mappings/feature-custom-mapping/feature.ts +16 -0
- package/test/e2e/fixtures/path-mappings/feature-custom-mapping/template/web/src/custom-component.tsx +3 -0
- package/test/e2e/fixtures/path-mappings/feature-custom-mapping/template/web/src/routes.tsx +8 -0
- package/test/e2e/fixtures/path-mappings/feature-mixed-paths/feature.ts +7 -0
- package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/digitalExperiences/webApplications/feature-mixed-paths/assets/icon.svg +3 -0
- package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/webApp/src/mapped-component.tsx +3 -0
- package/test/e2e/fixtures/path-mappings/feature-mixed-paths/template/webApp/src/routes.tsx +8 -0
- package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/feature.ts +7 -0
- package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/template/webApp/src/app.tsx +3 -0
- package/test/e2e/fixtures/path-mappings/feature-with-webapp-mapping/template/webApp/src/routes.tsx +8 -0
- package/test/e2e/fixtures/path-mappings/feature-without-mapping/feature.ts +11 -0
- package/test/e2e/fixtures/path-mappings/feature-without-mapping/template/digitalExperiences/webApplications/feature-without-mapping/src/legacy-component.tsx +3 -0
- package/test/e2e/fixtures/path-mappings/feature-without-mapping/template/digitalExperiences/webApplications/feature-without-mapping/src/routes.tsx +8 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/feature.ts +10 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/components/LoginForm.tsx +25 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/context/AuthContext.tsx +28 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/login.tsx +10 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/scenarios/scenario-authentication/template/digitalExperiences/webApplications/scenario-authentication/src/routes.tsx +17 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/feature.ts +11 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactDetail.tsx +54 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactForm.tsx +146 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/components/ContactList.tsx +77 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/routes.tsx +36 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/styles/__append__global.css +176 -0
- package/test/e2e/fixtures/scenarios/scenario-crud-contacts/template/digitalExperiences/webApplications/scenario-crud-contacts/src/utils/contactsApi.ts +42 -0
- package/test/e2e/fixtures/scenarios/scenario-navigation-menu/feature.ts +10 -0
- package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/__append__appLayout.tsx +4 -0
- package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/components/NavigationMenu.tsx +17 -0
- package/test/e2e/fixtures/scenarios/scenario-navigation-menu/template/digitalExperiences/webApplications/scenario-navigation-menu/src/placeholder.tsx +0 -0
- package/test/e2e/fixtures/single-operations/feature-file-append/feature.ts +10 -0
- package/test/e2e/fixtures/single-operations/feature-file-append/template/digitalExperiences/webApplications/feature-file-append/src/styles/__append__global.css +10 -0
- package/test/e2e/fixtures/single-operations/feature-file-inherit/feature.ts +10 -0
- package/test/e2e/fixtures/single-operations/feature-file-inherit/template/digitalExperiences/webApplications/feature-file-inherit/src/__inherit__appLayout.tsx +1 -0
- package/test/e2e/fixtures/single-operations/feature-file-inherit/template/digitalExperiences/webApplications/feature-file-inherit/src/__inherit__home.tsx +1 -0
- package/test/e2e/fixtures/single-operations/feature-file-prepend/feature.ts +10 -0
- package/test/e2e/fixtures/single-operations/feature-file-prepend/template/digitalExperiences/webApplications/feature-file-prepend/src/__prepend__index.tsx +2 -0
- package/test/e2e/fixtures/single-operations/feature-import-merge/feature.ts +10 -0
- package/test/e2e/fixtures/single-operations/feature-import-merge/template/digitalExperiences/webApplications/feature-import-merge/src/routes.tsx +18 -0
- package/test/e2e/fixtures/single-operations/feature-import-merge/template/digitalExperiences/webApplications/feature-import-merge/src/settings.tsx +8 -0
- package/test/e2e/fixtures/single-operations/feature-route-add/feature.ts +10 -0
- package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/about.tsx +8 -0
- package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/routes.tsx +23 -0
- package/test/e2e/fixtures/single-operations/feature-route-add/template/digitalExperiences/webApplications/feature-route-add/src/services.tsx +8 -0
- package/test/e2e/fixtures/watch/watch-add-delete-files/feature.ts +13 -0
- package/test/e2e/fixtures/watch/watch-add-delete-files/template/digitalExperiences/webApplications/watch-add-delete-files/src/initial.tsx +4 -0
- package/test/e2e/fixtures/watch/watch-add-delete-files/template/digitalExperiences/webApplications/watch-add-delete-files/src/placeholder.tsx +4 -0
- package/test/e2e/fixtures/watch/watch-basic/feature.ts +13 -0
- package/test/e2e/fixtures/watch/watch-basic/template/digitalExperiences/webApplications/watch-basic/src/placeholder.tsx +4 -0
- package/test/e2e/fixtures/watch/watch-basic/template/digitalExperiences/webApplications/watch-basic/src/watchTest.tsx +3 -0
- package/test/e2e/fixtures/watch/watch-debounce/feature.ts +13 -0
- package/test/e2e/fixtures/watch/watch-debounce/template/digitalExperiences/webApplications/watch-debounce/src/placeholder.tsx +4 -0
- package/test/e2e/fixtures/watch/watch-multiple-files/feature.ts +13 -0
- package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/components/WatchComponent.tsx +3 -0
- package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/placeholder.tsx +4 -0
- package/test/e2e/fixtures/watch/watch-multiple-files/template/digitalExperiences/webApplications/watch-multiple-files/src/styles/theme.css +4 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/package.json +10 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/about.tsx +8 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/appLayout.tsx +27 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/contact.tsx +8 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/home.tsx +8 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/index.tsx +10 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/old-page.tsx +8 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/routes.tsx +35 -0
- package/test/e2e/gold/dep-chain-linear-apply/digitalExperiences/webApplications/dep-chain-linear/src/styles/global.css +14 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/package.json +10 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/appLayout.tsx +27 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/home.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/index.tsx +10 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/old-page.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-a.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-b.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-c.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/page-d.tsx +8 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/routes.tsx +47 -0
- package/test/e2e/gold/dep-chain-long-apply/digitalExperiences/webApplications/dep-chain-a/src/styles/global.css +14 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/package.json +10 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/admin-dashboard.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/admin-layout.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/analytics.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/appLayout.tsx +27 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/components.tsx +8 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/dashboard.tsx +8 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/home.tsx +8 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/index.tsx +10 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/login.tsx +8 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/profile-edit.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/profile.tsx +8 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/reports.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/routes.tsx +94 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/signup.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/styles/global.css +14 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/tools.tsx +1 -0
- package/test/e2e/gold/dep-complex-graph-apply/digitalExperiences/webApplications/dep-complex-graph/src/types.tsx +8 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/package.json +10 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/custom-component.tsx +3 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/home.tsx +8 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/index.tsx +10 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/routes.tsx +28 -0
- package/test/e2e/gold/feature-custom-mapping-apply/digitalExperiences/webApplications/feature-custom-mapping/src/styles/global.css +14 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/package.json +10 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/about.tsx +8 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/home.tsx +8 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/index.tsx +10 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/routes.tsx +29 -0
- package/test/e2e/gold/feature-file-inherit-route-add-apply/digitalExperiences/webApplications/feature-file-inherit-route-add/src/styles/global.css +14 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/package.json +10 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/home.tsx +8 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/index.tsx +13 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/routes.tsx +29 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/settings.tsx +9 -0
- package/test/e2e/gold/feature-file-prepend-append-apply/digitalExperiences/webApplications/feature-file-prepend-append/src/styles/global.css +25 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/package.json +10 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/home.tsx +8 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/index.tsx +10 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/routes.tsx +17 -0
- package/test/e2e/gold/feature-file-route-delete-apply/digitalExperiences/webApplications/feature-file-route-delete/src/styles/global.css +14 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/assets/icon.svg +3 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/package.json +10 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/home.tsx +8 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/index.tsx +10 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/mapped-component.tsx +3 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/routes.tsx +28 -0
- package/test/e2e/gold/feature-mixed-paths-apply/digitalExperiences/webApplications/feature-mixed-paths/src/styles/global.css +14 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/package.json +10 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/app.tsx +3 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/home.tsx +8 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/index.tsx +10 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/routes.tsx +28 -0
- package/test/e2e/gold/feature-with-webapp-mapping-apply/digitalExperiences/webApplications/feature-with-webapp-mapping/src/styles/global.css +14 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/package.json +10 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/appLayout.tsx +27 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/home.tsx +8 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/index.tsx +10 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/legacy-component.tsx +3 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/old-page.tsx +8 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/routes.tsx +28 -0
- package/test/e2e/gold/feature-without-mapping-apply/digitalExperiences/webApplications/feature-without-mapping/src/styles/global.css +14 -0
- package/test/e2e/path-mappings.spec.ts +232 -0
- package/test/e2e/watch-patches.spec.ts +237 -0
- package/test/helpers/cli-runner.ts +100 -0
- package/test/helpers/compare-directories.ts +197 -0
- package/test/helpers/create-temp-dir.ts +34 -0
- package/test/helpers/fixtures.ts +67 -0
- package/test/setup.ts +6 -0
- package/test/unit/debounce.spec.ts +159 -0
- package/test/unit/dependency-resolver.spec.ts +260 -0
- package/test/unit/file-operations.spec.ts +264 -0
- package/test/unit/import-merger.spec.ts +395 -0
- package/test/unit/index.spec.ts +158 -0
- package/test/unit/new-app.spec.ts +178 -0
- package/test/unit/new-feature.spec.ts +178 -0
- package/test/unit/package-json-merger.spec.ts +275 -0
- package/test/unit/patch-loader.spec.ts +238 -0
- package/test/unit/path-mappings.spec.ts +241 -0
- package/test/unit/paths.spec.ts +247 -0
- package/test/unit/route-merger.spec.ts +265 -0
- package/test/unit/validation.spec.ts +311 -0
- package/tsconfig.json +20 -0
- 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"}
|