create-appraisejs 0.1.6 → 0.1.8-alpha
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 +45 -45
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/copy-template.d.ts +2 -1
- package/dist/copy-template.d.ts.map +1 -1
- package/dist/copy-template.js +10 -7
- package/dist/copy-template.js.map +1 -1
- package/dist/copy-template.test.js +19 -0
- package/dist/copy-template.test.js.map +1 -1
- package/package.json +69 -67
- package/templates/default/.vscode/settings.json +5 -0
- package/templates/default/appraisejs.config.json +1 -1
- package/templates/default/components.json +24 -24
- package/templates/default/cucumber.mjs +16 -0
- package/templates/default/eslint.config.mjs +15 -15
- package/templates/default/next.config.ts +13 -7
- package/templates/default/package-lock.json +13732 -14321
- package/templates/default/package.json +11 -9
- package/templates/default/postcss.config.mjs +8 -8
- package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
- package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
- package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
- package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
- package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
- package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
- package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
- package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
- package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
- package/templates/default/prisma/schema.prisma +554 -554
- package/templates/default/scripts/regenerate-features.ts +94 -94
- package/templates/default/scripts/setup-env.ts +19 -19
- package/templates/default/scripts/sync-all.ts +341 -341
- package/templates/default/scripts/sync-appraise-base-template.ts +52 -2
- package/templates/default/scripts/sync-environments.ts +323 -323
- package/templates/default/scripts/sync-locator-groups.ts +413 -413
- package/templates/default/scripts/sync-locators.ts +402 -402
- package/templates/default/scripts/sync-modules.ts +349 -349
- package/templates/default/scripts/sync-tags.ts +292 -292
- package/templates/default/scripts/sync-template-step-groups.ts +399 -399
- package/templates/default/scripts/sync-template-steps.ts +806 -806
- package/templates/default/scripts/sync-test-cases.ts +905 -905
- package/templates/default/scripts/sync-test-suites.ts +411 -411
- package/templates/default/src/actions/conflict/conflict.action.ts +33 -33
- package/templates/default/src/actions/dashboard/dashboard-actions.ts +240 -240
- package/templates/default/src/actions/environments/environment-actions.ts +205 -205
- package/templates/default/src/actions/locator/locator-actions.ts +547 -547
- package/templates/default/src/actions/locator-groups/locator-group-actions.ts +344 -344
- package/templates/default/src/actions/modules/module-actions.ts +133 -133
- package/templates/default/src/actions/reports/report-actions.ts +613 -613
- package/templates/default/src/actions/review/review-actions.ts +147 -147
- package/templates/default/src/actions/tags/tag-actions.ts +104 -104
- package/templates/default/src/actions/template-step/template-step-actions.ts +332 -332
- package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +278 -278
- package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -238
- package/templates/default/src/actions/test-case/test-case-actions.ts +419 -419
- package/templates/default/src/actions/test-run/test-run-actions.ts +1185 -1185
- package/templates/default/src/actions/test-suite/test-suite-actions.ts +253 -253
- package/templates/default/src/actions/user/user-actions.ts +13 -13
- package/templates/default/src/app/(base)/environments/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -219
- package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -96
- package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -24
- package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/environments/page.tsx +59 -59
- package/templates/default/src/app/(base)/layout.tsx +10 -10
- package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -44
- package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -215
- package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
- package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
- package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/locator-groups/page.tsx +61 -61
- package/templates/default/src/app/(base)/locators/create/page.tsx +38 -38
- package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -163
- package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +73 -90
- package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -28
- package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/locators/page.tsx +65 -65
- package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -66
- package/templates/default/src/app/(base)/modules/create/page.tsx +34 -34
- package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/modules/module-form.tsx +126 -126
- package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -85
- package/templates/default/src/app/(base)/modules/module-table.tsx +24 -24
- package/templates/default/src/app/(base)/modules/page.tsx +59 -59
- package/templates/default/src/app/(base)/reports/[id]/page.tsx +517 -517
- package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -33
- package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -78
- package/templates/default/src/app/(base)/reports/overview-chart.tsx +46 -46
- package/templates/default/src/app/(base)/reports/page.tsx +98 -98
- package/templates/default/src/app/(base)/reports/report-metric-card.tsx +16 -16
- package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -189
- package/templates/default/src/app/(base)/reports/report-table.tsx +72 -72
- package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +131 -131
- package/templates/default/src/app/(base)/reports/report-view-table.tsx +82 -82
- package/templates/default/src/app/(base)/reports/test-cases/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -115
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -79
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/view-logs-button.tsx +60 -60
- package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -11
- package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/tags/create/page.tsx +39 -39
- package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -50
- package/templates/default/src/app/(base)/tags/page.tsx +58 -58
- package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -147
- package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -63
- package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -29
- package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -60
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -167
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -89
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -32
- package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -37
- package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -49
- package/templates/default/src/app/(base)/template-steps/page.tsx +59 -59
- package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -213
- package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -384
- package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -158
- package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -24
- package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -56
- package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -89
- package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -58
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -84
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -262
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
- package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -76
- package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -96
- package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -38
- package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -73
- package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -106
- package/templates/default/src/app/(base)/test-cases/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -82
- package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -395
- package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +90 -90
- package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +35 -35
- package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +56 -56
- package/templates/default/src/app/(base)/test-runs/create/page.tsx +47 -47
- package/templates/default/src/app/(base)/test-runs/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +508 -512
- package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -229
- package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -127
- package/templates/default/src/app/(base)/test-suites/create/page.tsx +45 -45
- package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +55 -55
- package/templates/default/src/app/(base)/test-suites/page.tsx +82 -82
- package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +269 -269
- package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +97 -97
- package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -29
- package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -187
- package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +12 -12
- package/templates/default/src/app/(dashboard-components)/data-card.tsx +26 -26
- package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +56 -56
- package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -87
- package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +44 -44
- package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +133 -133
- package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +420 -420
- package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -146
- package/templates/default/src/app/globals.css +147 -147
- package/templates/default/src/app/layout.tsx +171 -171
- package/templates/default/src/app/page.tsx +64 -64
- package/templates/default/src/assets/icons/empty-tube.tsx +23 -23
- package/templates/default/src/assets/icons/tube-plus.tsx +29 -29
- package/templates/default/src/components/base-node.tsx +21 -21
- package/templates/default/src/components/chart/pie-chart.tsx +73 -73
- package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -460
- package/templates/default/src/components/data-state/empty-state.tsx +40 -40
- package/templates/default/src/components/data-visualization/info-card.tsx +70 -70
- package/templates/default/src/components/data-visualization/info-grid.tsx +22 -22
- package/templates/default/src/components/devtools/providers.tsx +19 -13
- package/templates/default/src/components/diagram/button-edge.tsx +54 -54
- package/templates/default/src/components/diagram/dynamic-parameters.tsx +438 -438
- package/templates/default/src/components/diagram/edit-header-option.tsx +36 -36
- package/templates/default/src/components/diagram/flow-diagram.tsx +470 -470
- package/templates/default/src/components/diagram/node-form.tsx +262 -262
- package/templates/default/src/components/diagram/options-header-node.tsx +57 -57
- package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -155
- package/templates/default/src/components/form/error-message.tsx +7 -7
- package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -453
- package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -30
- package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
- package/templates/default/src/components/logo.tsx +15 -15
- package/templates/default/src/components/navigation/command-badge.tsx +34 -34
- package/templates/default/src/components/navigation/command-chain-input.tsx +51 -51
- package/templates/default/src/components/navigation/entity-search-command.tsx +116 -116
- package/templates/default/src/components/navigation/nav-card.tsx +31 -31
- package/templates/default/src/components/navigation/nav-command.tsx +508 -508
- package/templates/default/src/components/navigation/nav-link.tsx +60 -60
- package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -112
- package/templates/default/src/components/node-header.tsx +159 -159
- package/templates/default/src/components/reports/test-case-logs-modal.tsx +253 -253
- package/templates/default/src/components/table/table-actions.tsx +172 -172
- package/templates/default/src/components/test-run/download-logs-button.tsx +99 -99
- package/templates/default/src/components/test-run/log-viewer.tsx +445 -445
- package/templates/default/src/components/test-run/test-run-details.tsx +611 -611
- package/templates/default/src/components/test-run/test-run-header.tsx +149 -149
- package/templates/default/src/components/test-run/view-report-button.tsx +102 -102
- package/templates/default/src/components/theme/mode-toggle.tsx +54 -54
- package/templates/default/src/components/theme/theme-provider.tsx +8 -8
- package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -7
- package/templates/default/src/components/typography/page-header.tsx +7 -7
- package/templates/default/src/components/ui/alert-dialog.tsx +106 -106
- package/templates/default/src/components/ui/alert.tsx +43 -43
- package/templates/default/src/components/ui/avatar.tsx +40 -40
- package/templates/default/src/components/ui/badge.tsx +29 -29
- package/templates/default/src/components/ui/button.tsx +47 -47
- package/templates/default/src/components/ui/calendar.tsx +158 -158
- package/templates/default/src/components/ui/card.tsx +43 -43
- package/templates/default/src/components/ui/checkbox.tsx +28 -28
- package/templates/default/src/components/ui/command.tsx +135 -135
- package/templates/default/src/components/ui/data-table-column-header.tsx +61 -61
- package/templates/default/src/components/ui/data-table-pagination.tsx +87 -87
- package/templates/default/src/components/ui/data-table-view-options.tsx +50 -50
- package/templates/default/src/components/ui/data-table.tsx +267 -267
- package/templates/default/src/components/ui/dialog.tsx +97 -97
- package/templates/default/src/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/src/components/ui/input.tsx +22 -22
- package/templates/default/src/components/ui/kbd.tsx +28 -28
- package/templates/default/src/components/ui/label.tsx +19 -19
- package/templates/default/src/components/ui/loading.tsx +12 -12
- package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -116
- package/templates/default/src/components/ui/multi-select.tsx +142 -142
- package/templates/default/src/components/ui/navigation-menu.tsx +120 -120
- package/templates/default/src/components/ui/popover.tsx +33 -33
- package/templates/default/src/components/ui/progress.tsx +25 -25
- package/templates/default/src/components/ui/radio-group.tsx +44 -44
- package/templates/default/src/components/ui/scroll-area.tsx +40 -40
- package/templates/default/src/components/ui/select.tsx +151 -144
- package/templates/default/src/components/ui/separator.tsx +22 -22
- package/templates/default/src/components/ui/skeleton.tsx +7 -7
- package/templates/default/src/components/ui/table.tsx +76 -76
- package/templates/default/src/components/ui/tabs.tsx +55 -55
- package/templates/default/src/components/ui/textarea.tsx +21 -21
- package/templates/default/src/components/ui/toast.tsx +113 -113
- package/templates/default/src/components/ui/toaster.tsx +26 -26
- package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -87
- package/templates/default/src/config/db-config.ts +10 -10
- package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -30
- package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -20
- package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -28
- package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -21
- package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -23
- package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -42
- package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -16
- package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -39
- package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -36
- package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -43
- package/templates/default/src/constants/form-opts/test-run-form-opts.ts +31 -31
- package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -24
- package/templates/default/src/hooks/use-toast.ts +187 -187
- package/templates/default/src/lib/bidirectional-sync.ts +432 -432
- package/templates/default/src/lib/database-sync.ts +531 -531
- package/templates/default/src/lib/environment-file-utils.ts +221 -221
- package/templates/default/src/lib/feature-file-generator.ts +411 -411
- package/templates/default/src/lib/gherkin-parser.ts +259 -259
- package/templates/default/src/lib/locator-group-file-utils.ts +370 -370
- package/templates/default/src/lib/metrics/metric-calculator.ts +613 -613
- package/templates/default/src/lib/module-hierarchy-builder.ts +205 -205
- package/templates/default/src/lib/path-helpers/module-path.ts +71 -71
- package/templates/default/src/lib/test-case-utils.ts +6 -6
- package/templates/default/src/lib/test-run/log-formatter.ts +83 -83
- package/templates/default/src/lib/test-run/process-manager.ts +191 -191
- package/templates/default/src/lib/test-run/report-parser.ts +316 -316
- package/templates/default/src/lib/test-run/test-run-executor.ts +144 -144
- package/templates/default/src/lib/test-run/winston-logger.ts +95 -95
- package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -42
- package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
- package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -160
- package/templates/default/src/lib/utils/node-param-validation.ts +81 -81
- package/templates/default/src/lib/utils/template-step-file-generator.ts +167 -167
- package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +723 -723
- package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -166
- package/templates/default/src/lib/utils.ts +31 -31
- package/templates/default/src/tests/config/executor/world.ts +41 -41
- package/templates/default/src/tests/executor.ts +80 -80
- package/templates/default/src/tests/hooks/hooks.ts +99 -99
- package/templates/default/src/tests/mapping/locator-map.json +1 -1
- package/templates/default/src/tests/steps/actions/click.step.ts +62 -62
- package/templates/default/src/tests/steps/actions/navigation.step.ts +73 -72
- package/templates/default/src/tests/steps/validations/active_state_assertion.step.ts +34 -34
- package/templates/default/src/tests/steps/validations/navigation_assertion.step.ts +24 -23
- package/templates/default/src/tests/steps/validations/text_assertion.step.ts +111 -111
- package/templates/default/src/tests/steps/validations/visibility_assertion.step.ts +30 -30
- package/templates/default/src/tests/support/parameter-types.ts +12 -12
- package/templates/default/src/tests/utils/cache.util.ts +260 -260
- package/templates/default/src/tests/utils/cli.util.ts +177 -177
- package/templates/default/src/tests/utils/environment.util.ts +65 -65
- package/templates/default/src/tests/utils/locator.util.ts +248 -248
- package/templates/default/src/tests/utils/random-data.util.ts +44 -44
- package/templates/default/src/tests/utils/spawner.util.ts +617 -617
- package/templates/default/src/types/diagram/diagram.ts +34 -34
- package/templates/default/src/types/diagram/template-step.ts +11 -11
- package/templates/default/src/types/executor/browser.type.ts +1 -1
- package/templates/default/src/types/form/actionHandler.ts +6 -6
- package/templates/default/src/types/locator/locator.type.ts +11 -11
- package/templates/default/src/types/step/step.type.ts +1 -1
- package/templates/default/src/types/table/data-table.ts +6 -6
- package/templates/default/tailwind.config.ts +62 -62
- package/templates/default/.env +0 -2
- package/templates/default/next-env.d.ts +0 -6
- package/templates/default/prisma/prisma/dev.db +0 -0
- package/templates/default/src/tests/config/environments/environments.json +0 -14
|
@@ -1,205 +1,205 @@
|
|
|
1
|
-
'use server'
|
|
2
|
-
|
|
3
|
-
import prisma from '@/config/db-config'
|
|
4
|
-
import { environmentSchema } from '@/constants/form-opts/environment-form-opts'
|
|
5
|
-
import { ActionResponse } from '@/types/form/actionHandler'
|
|
6
|
-
import { revalidatePath } from 'next/cache'
|
|
7
|
-
import { z } from 'zod'
|
|
8
|
-
import { createOrUpdateEnvironmentsFile, updateEnvironmentEntry } from '@/lib/environment-file-utils'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Check if an environment name already exists
|
|
12
|
-
*/
|
|
13
|
-
async function checkUniqueName(name: string, excludeId?: string): Promise<boolean> {
|
|
14
|
-
const existing = await prisma.environment.findFirst({
|
|
15
|
-
where: {
|
|
16
|
-
name: name,
|
|
17
|
-
...(excludeId && { id: { not: excludeId } }),
|
|
18
|
-
},
|
|
19
|
-
})
|
|
20
|
-
return !!existing
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export async function getAllEnvironmentsAction(): Promise<ActionResponse> {
|
|
24
|
-
try {
|
|
25
|
-
const environments = await prisma.environment.findMany({
|
|
26
|
-
orderBy: {
|
|
27
|
-
createdAt: 'desc',
|
|
28
|
-
},
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
// Update the environments.json file
|
|
32
|
-
await createOrUpdateEnvironmentsFile()
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
status: 200,
|
|
36
|
-
data: environments,
|
|
37
|
-
}
|
|
38
|
-
} catch (error) {
|
|
39
|
-
return {
|
|
40
|
-
status: 500,
|
|
41
|
-
error: `Server error occurred: ${error}`,
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function deleteEnvironmentAction(ids: string[]): Promise<ActionResponse> {
|
|
47
|
-
try {
|
|
48
|
-
await prisma.environment.deleteMany({
|
|
49
|
-
where: {
|
|
50
|
-
id: { in: ids },
|
|
51
|
-
},
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
// Update the environments.json file
|
|
55
|
-
await createOrUpdateEnvironmentsFile()
|
|
56
|
-
|
|
57
|
-
revalidatePath('/environments')
|
|
58
|
-
return {
|
|
59
|
-
status: 200,
|
|
60
|
-
message: 'Environments deleted successfully',
|
|
61
|
-
}
|
|
62
|
-
} catch (error) {
|
|
63
|
-
return {
|
|
64
|
-
status: 500,
|
|
65
|
-
error: `Server error occurred: ${error}`,
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export async function createEnvironmentAction(
|
|
71
|
-
_prev: unknown,
|
|
72
|
-
value: z.infer<typeof environmentSchema>,
|
|
73
|
-
): Promise<ActionResponse> {
|
|
74
|
-
try {
|
|
75
|
-
environmentSchema.parse(value)
|
|
76
|
-
|
|
77
|
-
// Check if name already exists
|
|
78
|
-
const nameExists = await checkUniqueName(value.name)
|
|
79
|
-
if (nameExists) {
|
|
80
|
-
return {
|
|
81
|
-
status: 400,
|
|
82
|
-
error: 'An environment with this name already exists. Please choose a different name.',
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Convert empty strings to null for optional fields
|
|
87
|
-
const environmentData = {
|
|
88
|
-
...value,
|
|
89
|
-
apiBaseUrl: value.apiBaseUrl === '' ? null : value.apiBaseUrl,
|
|
90
|
-
username: value.username === '' ? null : value.username,
|
|
91
|
-
password: value.password === '' ? null : value.password,
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
const newEnvironment = await prisma.environment.create({
|
|
95
|
-
data: environmentData,
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
// Update the environments.json file
|
|
99
|
-
await createOrUpdateEnvironmentsFile()
|
|
100
|
-
|
|
101
|
-
revalidatePath('/environments')
|
|
102
|
-
return {
|
|
103
|
-
status: 200,
|
|
104
|
-
data: newEnvironment,
|
|
105
|
-
message: 'Environment created successfully',
|
|
106
|
-
}
|
|
107
|
-
} catch (error) {
|
|
108
|
-
return {
|
|
109
|
-
status: 500,
|
|
110
|
-
error: `Server error occurred: ${error}`,
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export async function getEnvironmentByIdAction(id: string): Promise<ActionResponse> {
|
|
116
|
-
try {
|
|
117
|
-
const environmentData = await prisma.environment.findUniqueOrThrow({
|
|
118
|
-
where: { id },
|
|
119
|
-
})
|
|
120
|
-
return {
|
|
121
|
-
status: 200,
|
|
122
|
-
data: environmentData,
|
|
123
|
-
}
|
|
124
|
-
} catch (error) {
|
|
125
|
-
return {
|
|
126
|
-
status: 500,
|
|
127
|
-
error: `Server error occurred: ${error}`,
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export async function updateEnvironmentAction(
|
|
133
|
-
_prev: unknown,
|
|
134
|
-
value: z.infer<typeof environmentSchema>,
|
|
135
|
-
id?: string,
|
|
136
|
-
): Promise<ActionResponse> {
|
|
137
|
-
try {
|
|
138
|
-
environmentSchema.parse(value)
|
|
139
|
-
|
|
140
|
-
// Get the current environment to check if name changed
|
|
141
|
-
const currentEnvironment = await prisma.environment.findUnique({
|
|
142
|
-
where: { id },
|
|
143
|
-
select: { name: true },
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
// Check if name is being changed and if the new name already exists
|
|
147
|
-
if (currentEnvironment?.name !== value.name) {
|
|
148
|
-
const nameExists = await checkUniqueName(value.name, id)
|
|
149
|
-
if (nameExists) {
|
|
150
|
-
return {
|
|
151
|
-
status: 400,
|
|
152
|
-
error: 'An environment with this name already exists. Please choose a different name.',
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Convert empty strings to null for optional fields
|
|
158
|
-
const environmentData = {
|
|
159
|
-
...value,
|
|
160
|
-
apiBaseUrl: value.apiBaseUrl === '' ? null : value.apiBaseUrl,
|
|
161
|
-
username: value.username === '' ? null : value.username,
|
|
162
|
-
password: value.password === '' ? null : value.password,
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const updatedEnvironment = await prisma.environment.update({
|
|
166
|
-
where: { id },
|
|
167
|
-
data: environmentData,
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
// Update the environments.json file
|
|
171
|
-
// If name changed, we need to remove the old entry and add the new one
|
|
172
|
-
const oldName = currentEnvironment?.name !== value.name ? currentEnvironment?.name : undefined
|
|
173
|
-
await updateEnvironmentEntry(id!, oldName)
|
|
174
|
-
|
|
175
|
-
revalidatePath('/environments')
|
|
176
|
-
return {
|
|
177
|
-
status: 200,
|
|
178
|
-
data: updatedEnvironment,
|
|
179
|
-
message: 'Environment updated successfully',
|
|
180
|
-
}
|
|
181
|
-
} catch (error) {
|
|
182
|
-
return {
|
|
183
|
-
status: 500,
|
|
184
|
-
error: `Server error occurred: ${error}`,
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Check if an environment name is unique
|
|
191
|
-
*/
|
|
192
|
-
export async function checkEnvironmentNameUniqueAction(name: string, excludeId?: string): Promise<ActionResponse> {
|
|
193
|
-
try {
|
|
194
|
-
const nameExists = await checkUniqueName(name, excludeId)
|
|
195
|
-
return {
|
|
196
|
-
status: 200,
|
|
197
|
-
data: { isUnique: !nameExists },
|
|
198
|
-
}
|
|
199
|
-
} catch (error) {
|
|
200
|
-
return {
|
|
201
|
-
status: 500,
|
|
202
|
-
error: `Server error occurred: ${error}`,
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
1
|
+
'use server'
|
|
2
|
+
|
|
3
|
+
import prisma from '@/config/db-config'
|
|
4
|
+
import { environmentSchema } from '@/constants/form-opts/environment-form-opts'
|
|
5
|
+
import { ActionResponse } from '@/types/form/actionHandler'
|
|
6
|
+
import { revalidatePath } from 'next/cache'
|
|
7
|
+
import { z } from 'zod'
|
|
8
|
+
import { createOrUpdateEnvironmentsFile, updateEnvironmentEntry } from '@/lib/environment-file-utils'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check if an environment name already exists
|
|
12
|
+
*/
|
|
13
|
+
async function checkUniqueName(name: string, excludeId?: string): Promise<boolean> {
|
|
14
|
+
const existing = await prisma.environment.findFirst({
|
|
15
|
+
where: {
|
|
16
|
+
name: name,
|
|
17
|
+
...(excludeId && { id: { not: excludeId } }),
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
return !!existing
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function getAllEnvironmentsAction(): Promise<ActionResponse> {
|
|
24
|
+
try {
|
|
25
|
+
const environments = await prisma.environment.findMany({
|
|
26
|
+
orderBy: {
|
|
27
|
+
createdAt: 'desc',
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Update the environments.json file
|
|
32
|
+
await createOrUpdateEnvironmentsFile()
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
status: 200,
|
|
36
|
+
data: environments,
|
|
37
|
+
}
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return {
|
|
40
|
+
status: 500,
|
|
41
|
+
error: `Server error occurred: ${error}`,
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function deleteEnvironmentAction(ids: string[]): Promise<ActionResponse> {
|
|
47
|
+
try {
|
|
48
|
+
await prisma.environment.deleteMany({
|
|
49
|
+
where: {
|
|
50
|
+
id: { in: ids },
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// Update the environments.json file
|
|
55
|
+
await createOrUpdateEnvironmentsFile()
|
|
56
|
+
|
|
57
|
+
revalidatePath('/environments')
|
|
58
|
+
return {
|
|
59
|
+
status: 200,
|
|
60
|
+
message: 'Environments deleted successfully',
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
return {
|
|
64
|
+
status: 500,
|
|
65
|
+
error: `Server error occurred: ${error}`,
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function createEnvironmentAction(
|
|
71
|
+
_prev: unknown,
|
|
72
|
+
value: z.infer<typeof environmentSchema>,
|
|
73
|
+
): Promise<ActionResponse> {
|
|
74
|
+
try {
|
|
75
|
+
environmentSchema.parse(value)
|
|
76
|
+
|
|
77
|
+
// Check if name already exists
|
|
78
|
+
const nameExists = await checkUniqueName(value.name)
|
|
79
|
+
if (nameExists) {
|
|
80
|
+
return {
|
|
81
|
+
status: 400,
|
|
82
|
+
error: 'An environment with this name already exists. Please choose a different name.',
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Convert empty strings to null for optional fields
|
|
87
|
+
const environmentData = {
|
|
88
|
+
...value,
|
|
89
|
+
apiBaseUrl: value.apiBaseUrl === '' ? null : value.apiBaseUrl,
|
|
90
|
+
username: value.username === '' ? null : value.username,
|
|
91
|
+
password: value.password === '' ? null : value.password,
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const newEnvironment = await prisma.environment.create({
|
|
95
|
+
data: environmentData,
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
// Update the environments.json file
|
|
99
|
+
await createOrUpdateEnvironmentsFile()
|
|
100
|
+
|
|
101
|
+
revalidatePath('/environments')
|
|
102
|
+
return {
|
|
103
|
+
status: 200,
|
|
104
|
+
data: newEnvironment,
|
|
105
|
+
message: 'Environment created successfully',
|
|
106
|
+
}
|
|
107
|
+
} catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
status: 500,
|
|
110
|
+
error: `Server error occurred: ${error}`,
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export async function getEnvironmentByIdAction(id: string): Promise<ActionResponse> {
|
|
116
|
+
try {
|
|
117
|
+
const environmentData = await prisma.environment.findUniqueOrThrow({
|
|
118
|
+
where: { id },
|
|
119
|
+
})
|
|
120
|
+
return {
|
|
121
|
+
status: 200,
|
|
122
|
+
data: environmentData,
|
|
123
|
+
}
|
|
124
|
+
} catch (error) {
|
|
125
|
+
return {
|
|
126
|
+
status: 500,
|
|
127
|
+
error: `Server error occurred: ${error}`,
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export async function updateEnvironmentAction(
|
|
133
|
+
_prev: unknown,
|
|
134
|
+
value: z.infer<typeof environmentSchema>,
|
|
135
|
+
id?: string,
|
|
136
|
+
): Promise<ActionResponse> {
|
|
137
|
+
try {
|
|
138
|
+
environmentSchema.parse(value)
|
|
139
|
+
|
|
140
|
+
// Get the current environment to check if name changed
|
|
141
|
+
const currentEnvironment = await prisma.environment.findUnique({
|
|
142
|
+
where: { id },
|
|
143
|
+
select: { name: true },
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
// Check if name is being changed and if the new name already exists
|
|
147
|
+
if (currentEnvironment?.name !== value.name) {
|
|
148
|
+
const nameExists = await checkUniqueName(value.name, id)
|
|
149
|
+
if (nameExists) {
|
|
150
|
+
return {
|
|
151
|
+
status: 400,
|
|
152
|
+
error: 'An environment with this name already exists. Please choose a different name.',
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Convert empty strings to null for optional fields
|
|
158
|
+
const environmentData = {
|
|
159
|
+
...value,
|
|
160
|
+
apiBaseUrl: value.apiBaseUrl === '' ? null : value.apiBaseUrl,
|
|
161
|
+
username: value.username === '' ? null : value.username,
|
|
162
|
+
password: value.password === '' ? null : value.password,
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const updatedEnvironment = await prisma.environment.update({
|
|
166
|
+
where: { id },
|
|
167
|
+
data: environmentData,
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Update the environments.json file
|
|
171
|
+
// If name changed, we need to remove the old entry and add the new one
|
|
172
|
+
const oldName = currentEnvironment?.name !== value.name ? currentEnvironment?.name : undefined
|
|
173
|
+
await updateEnvironmentEntry(id!, oldName)
|
|
174
|
+
|
|
175
|
+
revalidatePath('/environments')
|
|
176
|
+
return {
|
|
177
|
+
status: 200,
|
|
178
|
+
data: updatedEnvironment,
|
|
179
|
+
message: 'Environment updated successfully',
|
|
180
|
+
}
|
|
181
|
+
} catch (error) {
|
|
182
|
+
return {
|
|
183
|
+
status: 500,
|
|
184
|
+
error: `Server error occurred: ${error}`,
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Check if an environment name is unique
|
|
191
|
+
*/
|
|
192
|
+
export async function checkEnvironmentNameUniqueAction(name: string, excludeId?: string): Promise<ActionResponse> {
|
|
193
|
+
try {
|
|
194
|
+
const nameExists = await checkUniqueName(name, excludeId)
|
|
195
|
+
return {
|
|
196
|
+
status: 200,
|
|
197
|
+
data: { isUnique: !nameExists },
|
|
198
|
+
}
|
|
199
|
+
} catch (error) {
|
|
200
|
+
return {
|
|
201
|
+
status: 500,
|
|
202
|
+
error: `Server error occurred: ${error}`,
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|