@nextsparkjs/core 0.1.0-beta.81 → 0.1.0-beta.83
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/dist/components/entities/wrappers/EntityDetailWrapper.d.ts.map +1 -1
- package/dist/components/entities/wrappers/EntityDetailWrapper.js +11 -39
- package/dist/hooks/useEntityQuery.d.ts.map +1 -1
- package/dist/hooks/useEntityQuery.js +21 -3
- package/dist/lib/theme/get-default-theme-mode.d.ts +11 -0
- package/dist/lib/theme/get-default-theme-mode.d.ts.map +1 -1
- package/dist/lib/theme/get-default-theme-mode.js +42 -25
- package/dist/styles/classes.json +1 -1
- package/dist/templates/next.config.mjs +5 -2
- package/dist/types/theme.d.ts +2 -0
- package/dist/types/theme.d.ts.map +1 -1
- package/package.json +16 -16
- package/scripts/build/docs-registry.mjs +0 -0
- package/scripts/create-theme.mjs +0 -0
- package/scripts/deploy/release-version.mjs +0 -0
- package/scripts/deploy/vercel-deploy.mjs +0 -0
- package/scripts/dev/watch-plugins.mjs +0 -0
- package/scripts/maintenance/update-core.mjs +0 -0
- package/scripts/setup/npm-postinstall.mjs +0 -0
- package/scripts/setup/setup-claude.mjs +0 -0
- package/scripts/validation/check-imports.sh +0 -0
- package/templates/next.config.mjs +5 -2
- package/dist/templates/app/(auth)/forgot-password/page.tsx +0 -216
- package/dist/templates/app/(auth)/layout.tsx +0 -51
- package/dist/templates/app/(auth)/login/page.tsx +0 -21
- package/dist/templates/app/(auth)/reset-password/page.tsx +0 -212
- package/dist/templates/app/(auth)/signup/page.tsx +0 -21
- package/dist/templates/app/(auth)/verify-email/page.tsx +0 -190
- package/dist/templates/app/(public)/[...slug]/page.tsx +0 -378
- package/dist/templates/app/(public)/docs/[section]/[page]/page.tsx +0 -90
- package/dist/templates/app/(public)/docs/layout.tsx +0 -25
- package/dist/templates/app/(public)/docs/page.tsx +0 -81
- package/dist/templates/app/(public)/layout.tsx +0 -41
- package/dist/templates/app/(public)/page.tsx +0 -19
- package/dist/templates/app/403/page.tsx +0 -89
- package/dist/templates/app/api/auth/[...all]/route.ts +0 -78
- package/dist/templates/app/api/cron/billing/lifecycle/route.ts +0 -98
- package/dist/templates/app/api/csp-report/route.ts +0 -175
- package/dist/templates/app/api/devtools/config/entities/route.ts +0 -108
- package/dist/templates/app/api/devtools/config/theme/route.ts +0 -66
- package/dist/templates/app/api/devtools/tests/[...path]/route.ts +0 -130
- package/dist/templates/app/api/devtools/tests/route.ts +0 -134
- package/dist/templates/app/api/health/route.ts +0 -29
- package/dist/templates/app/api/internal/user-metadata/route.ts +0 -36
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +0 -310
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +0 -286
- package/dist/templates/app/api/superadmin/teams/route.ts +0 -188
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +0 -540
- package/dist/templates/app/api/superadmin/users/route.ts +0 -323
- package/dist/templates/app/api/user/delete-account/route.ts +0 -55
- package/dist/templates/app/api/user/plan-flags/route.ts +0 -283
- package/dist/templates/app/api/user/profile/route.ts +0 -133
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +0 -210
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +0 -331
- package/dist/templates/app/api/v1/[entity]/[id]/route.ts +0 -35
- package/dist/templates/app/api/v1/[entity]/docs.md +0 -369
- package/dist/templates/app/api/v1/[entity]/presets.ts +0 -194
- package/dist/templates/app/api/v1/[entity]/route.ts +0 -31
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +0 -303
- package/dist/templates/app/api/v1/api-keys/docs.md +0 -101
- package/dist/templates/app/api/v1/api-keys/presets.ts +0 -31
- package/dist/templates/app/api/v1/api-keys/route.ts +0 -250
- package/dist/templates/app/api/v1/auth/docs.md +0 -184
- package/dist/templates/app/api/v1/auth/presets.ts +0 -44
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +0 -227
- package/dist/templates/app/api/v1/billing/cancel/route.ts +0 -206
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +0 -97
- package/dist/templates/app/api/v1/billing/check-action/route.ts +0 -81
- package/dist/templates/app/api/v1/billing/checkout/route.ts +0 -124
- package/dist/templates/app/api/v1/billing/docs.md +0 -209
- package/dist/templates/app/api/v1/billing/plans/route.ts +0 -85
- package/dist/templates/app/api/v1/billing/portal/route.ts +0 -90
- package/dist/templates/app/api/v1/billing/presets.ts +0 -121
- package/dist/templates/app/api/v1/billing/webhooks/stripe/route.ts +0 -428
- package/dist/templates/app/api/v1/blocks/[slug]/route.ts +0 -29
- package/dist/templates/app/api/v1/blocks/docs.md +0 -173
- package/dist/templates/app/api/v1/blocks/presets.ts +0 -121
- package/dist/templates/app/api/v1/blocks/route.ts +0 -45
- package/dist/templates/app/api/v1/blocks/validate/route.ts +0 -45
- package/dist/templates/app/api/v1/cron/docs.md +0 -116
- package/dist/templates/app/api/v1/cron/presets.ts +0 -26
- package/dist/templates/app/api/v1/cron/process/route.ts +0 -108
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +0 -82
- package/dist/templates/app/api/v1/devtools/docs/route.ts +0 -150
- package/dist/templates/app/api/v1/devtools/docs.md +0 -204
- package/dist/templates/app/api/v1/devtools/features/route.ts +0 -61
- package/dist/templates/app/api/v1/devtools/flows/route.ts +0 -61
- package/dist/templates/app/api/v1/devtools/presets.ts +0 -113
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +0 -120
- package/dist/templates/app/api/v1/devtools/testing/route.ts +0 -82
- package/dist/templates/app/api/v1/media/docs.md +0 -117
- package/dist/templates/app/api/v1/media/presets.ts +0 -24
- package/dist/templates/app/api/v1/media/upload/route.ts +0 -150
- package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +0 -116
- package/dist/templates/app/api/v1/plugin/[...path]/route.ts +0 -373
- package/dist/templates/app/api/v1/plugin/docs.md +0 -79
- package/dist/templates/app/api/v1/plugin/presets.ts +0 -21
- package/dist/templates/app/api/v1/plugin/route.ts +0 -96
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +0 -255
- package/dist/templates/app/api/v1/post-categories/docs.md +0 -134
- package/dist/templates/app/api/v1/post-categories/presets.ts +0 -78
- package/dist/templates/app/api/v1/post-categories/route.ts +0 -119
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +0 -179
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +0 -120
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +0 -89
- package/dist/templates/app/api/v1/team-invitations/docs.md +0 -88
- package/dist/templates/app/api/v1/team-invitations/presets.ts +0 -43
- package/dist/templates/app/api/v1/team-invitations/route.ts +0 -114
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +0 -171
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +0 -105
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +0 -125
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +0 -263
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +0 -358
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +0 -322
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +0 -50
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +0 -91
- package/dist/templates/app/api/v1/teams/docs.md +0 -320
- package/dist/templates/app/api/v1/teams/presets.ts +0 -178
- package/dist/templates/app/api/v1/teams/route.ts +0 -293
- package/dist/templates/app/api/v1/teams/switch/route.ts +0 -88
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +0 -361
- package/dist/templates/app/api/v1/theme/docs.md +0 -74
- package/dist/templates/app/api/v1/theme/presets.ts +0 -21
- package/dist/templates/app/api/v1/theme/route.ts +0 -96
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +0 -363
- package/dist/templates/app/api/v1/users/[id]/route.ts +0 -302
- package/dist/templates/app/api/v1/users/docs.md +0 -93
- package/dist/templates/app/api/v1/users/presets.ts +0 -59
- package/dist/templates/app/api/v1/users/route.ts +0 -197
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +0 -117
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +0 -103
- package/dist/templates/app/dashboard/(main)/[entity]/create/page.tsx +0 -95
- package/dist/templates/app/dashboard/(main)/[entity]/error.tsx +0 -51
- package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +0 -113
- package/dist/templates/app/dashboard/(main)/[entity]/loading.tsx +0 -61
- package/dist/templates/app/dashboard/(main)/[entity]/page.tsx +0 -90
- package/dist/templates/app/dashboard/(main)/layout.tsx +0 -98
- package/dist/templates/app/dashboard/(main)/loading.tsx +0 -5
- package/dist/templates/app/dashboard/(main)/page.tsx +0 -201
- package/dist/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +0 -114
- package/dist/templates/app/dashboard/(main)/patterns/[id]/page.tsx +0 -20
- package/dist/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +0 -171
- package/dist/templates/app/dashboard/(main)/patterns/create/page.tsx +0 -86
- package/dist/templates/app/dashboard/(main)/patterns/page.tsx +0 -444
- package/dist/templates/app/dashboard/features/analytics/page.tsx +0 -35
- package/dist/templates/app/dashboard/features/automation/page.tsx +0 -35
- package/dist/templates/app/dashboard/features/layout.tsx +0 -13
- package/dist/templates/app/dashboard/features/loading.tsx +0 -5
- package/dist/templates/app/dashboard/features/webhooks/page.tsx +0 -35
- package/dist/templates/app/dashboard/layout.tsx +0 -86
- package/dist/templates/app/dashboard/permission-denied/page.tsx +0 -29
- package/dist/templates/app/dashboard/settings/api-keys/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/api-keys/page.tsx +0 -513
- package/dist/templates/app/dashboard/settings/billing/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/billing/page.tsx +0 -284
- package/dist/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +0 -222
- package/dist/templates/app/dashboard/settings/invoices/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/invoices/page.tsx +0 -82
- package/dist/templates/app/dashboard/settings/layout.tsx +0 -151
- package/dist/templates/app/dashboard/settings/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/notifications/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/notifications/page.tsx +0 -462
- package/dist/templates/app/dashboard/settings/page.tsx +0 -92
- package/dist/templates/app/dashboard/settings/password/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/password/page.tsx +0 -306
- package/dist/templates/app/dashboard/settings/plans/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/plans/page.tsx +0 -40
- package/dist/templates/app/dashboard/settings/profile/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/profile/page.tsx +0 -686
- package/dist/templates/app/dashboard/settings/security/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/security/page.tsx +0 -505
- package/dist/templates/app/dashboard/settings/teams/loading.tsx +0 -5
- package/dist/templates/app/dashboard/settings/teams/page.tsx +0 -272
- package/dist/templates/app/dashboard/settings/teams/permissions/page.tsx +0 -92
- package/dist/templates/app/devtools/blocks/[slug]/page.tsx +0 -39
- package/dist/templates/app/devtools/blocks/page.tsx +0 -31
- package/dist/templates/app/devtools/config/page.tsx +0 -31
- package/dist/templates/app/devtools/features/page.tsx +0 -31
- package/dist/templates/app/devtools/flows/page.tsx +0 -31
- package/dist/templates/app/devtools/layout.tsx +0 -58
- package/dist/templates/app/devtools/page.tsx +0 -121
- package/dist/templates/app/devtools/scheduled-actions/page.tsx +0 -157
- package/dist/templates/app/devtools/style/page.tsx +0 -330
- package/dist/templates/app/devtools/tags/page.tsx +0 -31
- package/dist/templates/app/devtools/tests/[[...path]]/page.tsx +0 -47
- package/dist/templates/app/favicon.ico +0 -0
- package/dist/templates/app/globals.css +0 -12
- package/dist/templates/app/layout.tsx +0 -96
- package/dist/templates/app/public/page.tsx +0 -30
- package/dist/templates/app/superadmin/docs/[section]/[page]/page.tsx +0 -92
- package/dist/templates/app/superadmin/docs/page.tsx +0 -75
- package/dist/templates/app/superadmin/layout.tsx +0 -67
- package/dist/templates/app/superadmin/page.tsx +0 -149
- package/dist/templates/app/superadmin/subscriptions/page.tsx +0 -655
- package/dist/templates/app/superadmin/team-roles/page.tsx +0 -493
- package/dist/templates/app/superadmin/teams/[teamId]/page.tsx +0 -687
- package/dist/templates/app/superadmin/teams/page.tsx +0 -302
- package/dist/templates/app/superadmin/users/[userId]/page.tsx +0 -548
- package/dist/templates/app/superadmin/users/page.tsx +0 -528
- package/templates/app/(auth)/forgot-password/page.tsx +0 -216
- package/templates/app/(auth)/layout.tsx +0 -51
- package/templates/app/(auth)/login/page.tsx +0 -21
- package/templates/app/(auth)/reset-password/page.tsx +0 -212
- package/templates/app/(auth)/signup/page.tsx +0 -21
- package/templates/app/(auth)/verify-email/page.tsx +0 -190
- package/templates/app/(public)/[...slug]/page.tsx +0 -378
- package/templates/app/(public)/docs/[section]/[page]/page.tsx +0 -90
- package/templates/app/(public)/docs/layout.tsx +0 -25
- package/templates/app/(public)/docs/page.tsx +0 -81
- package/templates/app/(public)/layout.tsx +0 -41
- package/templates/app/(public)/page.tsx +0 -19
- package/templates/app/403/page.tsx +0 -89
- package/templates/app/api/auth/[...all]/route.ts +0 -78
- package/templates/app/api/cron/billing/lifecycle/route.ts +0 -98
- package/templates/app/api/csp-report/route.ts +0 -175
- package/templates/app/api/devtools/config/entities/route.ts +0 -108
- package/templates/app/api/devtools/config/theme/route.ts +0 -66
- package/templates/app/api/devtools/tests/[...path]/route.ts +0 -130
- package/templates/app/api/devtools/tests/route.ts +0 -134
- package/templates/app/api/health/route.ts +0 -29
- package/templates/app/api/internal/user-metadata/route.ts +0 -36
- package/templates/app/api/superadmin/subscriptions/route.ts +0 -310
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +0 -286
- package/templates/app/api/superadmin/teams/route.ts +0 -188
- package/templates/app/api/superadmin/users/[userId]/route.ts +0 -540
- package/templates/app/api/superadmin/users/route.ts +0 -323
- package/templates/app/api/user/delete-account/route.ts +0 -55
- package/templates/app/api/user/plan-flags/route.ts +0 -283
- package/templates/app/api/user/profile/route.ts +0 -133
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +0 -210
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +0 -331
- package/templates/app/api/v1/[entity]/[id]/route.ts +0 -35
- package/templates/app/api/v1/[entity]/docs.md +0 -369
- package/templates/app/api/v1/[entity]/presets.ts +0 -194
- package/templates/app/api/v1/[entity]/route.ts +0 -31
- package/templates/app/api/v1/api-keys/[id]/route.ts +0 -303
- package/templates/app/api/v1/api-keys/docs.md +0 -101
- package/templates/app/api/v1/api-keys/presets.ts +0 -31
- package/templates/app/api/v1/api-keys/route.ts +0 -250
- package/templates/app/api/v1/auth/docs.md +0 -184
- package/templates/app/api/v1/auth/presets.ts +0 -44
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +0 -227
- package/templates/app/api/v1/billing/cancel/route.ts +0 -206
- package/templates/app/api/v1/billing/change-plan/route.ts +0 -97
- package/templates/app/api/v1/billing/check-action/route.ts +0 -81
- package/templates/app/api/v1/billing/checkout/route.ts +0 -124
- package/templates/app/api/v1/billing/docs.md +0 -209
- package/templates/app/api/v1/billing/plans/route.ts +0 -85
- package/templates/app/api/v1/billing/portal/route.ts +0 -90
- package/templates/app/api/v1/billing/presets.ts +0 -121
- package/templates/app/api/v1/billing/webhooks/stripe/route.ts +0 -428
- package/templates/app/api/v1/blocks/[slug]/route.ts +0 -29
- package/templates/app/api/v1/blocks/docs.md +0 -173
- package/templates/app/api/v1/blocks/presets.ts +0 -121
- package/templates/app/api/v1/blocks/route.ts +0 -45
- package/templates/app/api/v1/blocks/validate/route.ts +0 -45
- package/templates/app/api/v1/cron/docs.md +0 -116
- package/templates/app/api/v1/cron/presets.ts +0 -26
- package/templates/app/api/v1/cron/process/route.ts +0 -108
- package/templates/app/api/v1/devtools/blocks/route.ts +0 -82
- package/templates/app/api/v1/devtools/docs/route.ts +0 -150
- package/templates/app/api/v1/devtools/docs.md +0 -204
- package/templates/app/api/v1/devtools/features/route.ts +0 -61
- package/templates/app/api/v1/devtools/flows/route.ts +0 -61
- package/templates/app/api/v1/devtools/presets.ts +0 -113
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +0 -120
- package/templates/app/api/v1/devtools/testing/route.ts +0 -82
- package/templates/app/api/v1/media/docs.md +0 -117
- package/templates/app/api/v1/media/presets.ts +0 -24
- package/templates/app/api/v1/media/upload/route.ts +0 -150
- package/templates/app/api/v1/patterns/[id]/usages/route.ts +0 -116
- package/templates/app/api/v1/plugin/[...path]/route.ts +0 -373
- package/templates/app/api/v1/plugin/docs.md +0 -79
- package/templates/app/api/v1/plugin/presets.ts +0 -21
- package/templates/app/api/v1/plugin/route.ts +0 -96
- package/templates/app/api/v1/post-categories/[id]/route.ts +0 -255
- package/templates/app/api/v1/post-categories/docs.md +0 -134
- package/templates/app/api/v1/post-categories/presets.ts +0 -78
- package/templates/app/api/v1/post-categories/route.ts +0 -119
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +0 -179
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +0 -120
- package/templates/app/api/v1/team-invitations/[token]/route.ts +0 -89
- package/templates/app/api/v1/team-invitations/docs.md +0 -88
- package/templates/app/api/v1/team-invitations/presets.ts +0 -43
- package/templates/app/api/v1/team-invitations/route.ts +0 -114
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +0 -171
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +0 -105
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +0 -125
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +0 -263
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +0 -358
- package/templates/app/api/v1/teams/[teamId]/route.ts +0 -322
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +0 -50
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +0 -91
- package/templates/app/api/v1/teams/docs.md +0 -320
- package/templates/app/api/v1/teams/presets.ts +0 -178
- package/templates/app/api/v1/teams/route.ts +0 -293
- package/templates/app/api/v1/teams/switch/route.ts +0 -88
- package/templates/app/api/v1/theme/[...path]/route.ts +0 -361
- package/templates/app/api/v1/theme/docs.md +0 -74
- package/templates/app/api/v1/theme/presets.ts +0 -21
- package/templates/app/api/v1/theme/route.ts +0 -96
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +0 -363
- package/templates/app/api/v1/users/[id]/route.ts +0 -302
- package/templates/app/api/v1/users/docs.md +0 -93
- package/templates/app/api/v1/users/presets.ts +0 -59
- package/templates/app/api/v1/users/route.ts +0 -197
- package/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +0 -117
- package/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +0 -103
- package/templates/app/dashboard/(main)/[entity]/create/page.tsx +0 -95
- package/templates/app/dashboard/(main)/[entity]/error.tsx +0 -51
- package/templates/app/dashboard/(main)/[entity]/layout.tsx +0 -113
- package/templates/app/dashboard/(main)/[entity]/loading.tsx +0 -61
- package/templates/app/dashboard/(main)/[entity]/page.tsx +0 -90
- package/templates/app/dashboard/(main)/layout.tsx +0 -98
- package/templates/app/dashboard/(main)/loading.tsx +0 -5
- package/templates/app/dashboard/(main)/page.tsx +0 -201
- package/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +0 -114
- package/templates/app/dashboard/(main)/patterns/[id]/page.tsx +0 -20
- package/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +0 -171
- package/templates/app/dashboard/(main)/patterns/create/page.tsx +0 -86
- package/templates/app/dashboard/(main)/patterns/page.tsx +0 -444
- package/templates/app/dashboard/features/analytics/page.tsx +0 -35
- package/templates/app/dashboard/features/automation/page.tsx +0 -35
- package/templates/app/dashboard/features/layout.tsx +0 -13
- package/templates/app/dashboard/features/loading.tsx +0 -5
- package/templates/app/dashboard/features/webhooks/page.tsx +0 -35
- package/templates/app/dashboard/layout.tsx +0 -86
- package/templates/app/dashboard/permission-denied/page.tsx +0 -29
- package/templates/app/dashboard/settings/api-keys/loading.tsx +0 -5
- package/templates/app/dashboard/settings/api-keys/page.tsx +0 -513
- package/templates/app/dashboard/settings/billing/loading.tsx +0 -5
- package/templates/app/dashboard/settings/billing/page.tsx +0 -284
- package/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +0 -222
- package/templates/app/dashboard/settings/invoices/loading.tsx +0 -5
- package/templates/app/dashboard/settings/invoices/page.tsx +0 -82
- package/templates/app/dashboard/settings/layout.tsx +0 -151
- package/templates/app/dashboard/settings/loading.tsx +0 -5
- package/templates/app/dashboard/settings/notifications/loading.tsx +0 -5
- package/templates/app/dashboard/settings/notifications/page.tsx +0 -462
- package/templates/app/dashboard/settings/page.tsx +0 -92
- package/templates/app/dashboard/settings/password/loading.tsx +0 -5
- package/templates/app/dashboard/settings/password/page.tsx +0 -306
- package/templates/app/dashboard/settings/plans/loading.tsx +0 -5
- package/templates/app/dashboard/settings/plans/page.tsx +0 -40
- package/templates/app/dashboard/settings/profile/loading.tsx +0 -5
- package/templates/app/dashboard/settings/profile/page.tsx +0 -686
- package/templates/app/dashboard/settings/security/loading.tsx +0 -5
- package/templates/app/dashboard/settings/security/page.tsx +0 -505
- package/templates/app/dashboard/settings/teams/loading.tsx +0 -5
- package/templates/app/dashboard/settings/teams/page.tsx +0 -272
- package/templates/app/dashboard/settings/teams/permissions/page.tsx +0 -92
- package/templates/app/devtools/blocks/[slug]/page.tsx +0 -39
- package/templates/app/devtools/blocks/page.tsx +0 -31
- package/templates/app/devtools/config/page.tsx +0 -31
- package/templates/app/devtools/features/page.tsx +0 -31
- package/templates/app/devtools/flows/page.tsx +0 -31
- package/templates/app/devtools/layout.tsx +0 -58
- package/templates/app/devtools/page.tsx +0 -121
- package/templates/app/devtools/scheduled-actions/page.tsx +0 -157
- package/templates/app/devtools/style/page.tsx +0 -330
- package/templates/app/devtools/tags/page.tsx +0 -31
- package/templates/app/devtools/tests/[[...path]]/page.tsx +0 -47
- package/templates/app/favicon.ico +0 -0
- package/templates/app/globals.css +0 -12
- package/templates/app/layout.tsx +0 -96
- package/templates/app/public/page.tsx +0 -30
- package/templates/app/superadmin/docs/[section]/[page]/page.tsx +0 -92
- package/templates/app/superadmin/docs/page.tsx +0 -75
- package/templates/app/superadmin/layout.tsx +0 -67
- package/templates/app/superadmin/page.tsx +0 -149
- package/templates/app/superadmin/subscriptions/page.tsx +0 -655
- package/templates/app/superadmin/team-roles/page.tsx +0 -493
- package/templates/app/superadmin/teams/[teamId]/page.tsx +0 -687
- package/templates/app/superadmin/teams/page.tsx +0 -302
- package/templates/app/superadmin/users/[userId]/page.tsx +0 -548
- package/templates/app/superadmin/users/page.tsx +0 -528
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dynamic Plugin API Router with Catch-All Paths
|
|
3
|
-
*
|
|
4
|
-
* Handles API requests for any plugin with nested paths
|
|
5
|
-
* Route: /api/v1/plugins/[...path]
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { NextRequest, NextResponse } from 'next/server'
|
|
9
|
-
import { PluginService, type RouteFileEndpoint, type PluginRegistryEntry } from '@nextsparkjs/core/lib/services'
|
|
10
|
-
import { PLUGIN_REGISTRY } from '@nextsparkjs/registries/plugin-registry'
|
|
11
|
-
|
|
12
|
-
export async function GET(
|
|
13
|
-
request: NextRequest,
|
|
14
|
-
{ params }: { params: Promise<{ path: string[] }> }
|
|
15
|
-
) {
|
|
16
|
-
const { path } = await params
|
|
17
|
-
return handlePluginRequest(request, path, 'GET')
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export async function POST(
|
|
21
|
-
request: NextRequest,
|
|
22
|
-
{ params }: { params: Promise<{ path: string[] }> }
|
|
23
|
-
) {
|
|
24
|
-
const { path } = await params
|
|
25
|
-
return handlePluginRequest(request, path, 'POST')
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export async function PUT(
|
|
29
|
-
request: NextRequest,
|
|
30
|
-
{ params }: { params: Promise<{ path: string[] }> }
|
|
31
|
-
) {
|
|
32
|
-
const { path } = await params
|
|
33
|
-
return handlePluginRequest(request, path, 'PUT')
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export async function DELETE(
|
|
37
|
-
request: NextRequest,
|
|
38
|
-
{ params }: { params: Promise<{ path: string[] }> }
|
|
39
|
-
) {
|
|
40
|
-
const { path } = await params
|
|
41
|
-
return handlePluginRequest(request, path, 'DELETE')
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function PATCH(
|
|
45
|
-
request: NextRequest,
|
|
46
|
-
{ params }: { params: Promise<{ path: string[] }> }
|
|
47
|
-
) {
|
|
48
|
-
const { path } = await params
|
|
49
|
-
return handlePluginRequest(request, path, 'PATCH')
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Handle plugin API requests with nested paths
|
|
54
|
-
*/
|
|
55
|
-
async function handlePluginRequest(
|
|
56
|
-
request: NextRequest,
|
|
57
|
-
pathSegments: string[],
|
|
58
|
-
method: string
|
|
59
|
-
): Promise<NextResponse> {
|
|
60
|
-
console.log(`[Plugin API] Handling request: ${method} ${pathSegments.join('/')}`)
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
// Extract plugin name from path segments
|
|
64
|
-
if (!pathSegments || pathSegments.length === 0) {
|
|
65
|
-
return NextResponse.json(
|
|
66
|
-
{
|
|
67
|
-
error: 'Plugin name is required',
|
|
68
|
-
format: '/api/v1/plugins/{pluginName}/{endpoint}'
|
|
69
|
-
},
|
|
70
|
-
{ status: 400 }
|
|
71
|
-
)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const [pluginName, ...remainingPath] = pathSegments
|
|
75
|
-
|
|
76
|
-
// Get registered plugins
|
|
77
|
-
const plugins = PluginService.getAll()
|
|
78
|
-
const plugin = plugins.find(p => p.name === pluginName)
|
|
79
|
-
|
|
80
|
-
if (!plugin) {
|
|
81
|
-
return NextResponse.json(
|
|
82
|
-
{
|
|
83
|
-
error: 'Plugin not found',
|
|
84
|
-
requested: pluginName,
|
|
85
|
-
available: plugins.map(p => p.name)
|
|
86
|
-
},
|
|
87
|
-
{ status: 404 }
|
|
88
|
-
)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!plugin.enabled) {
|
|
92
|
-
return NextResponse.json(
|
|
93
|
-
{ error: 'Plugin is disabled' },
|
|
94
|
-
{ status: 403 }
|
|
95
|
-
)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Construct the endpoint path
|
|
99
|
-
const endpointPath = remainingPath.length > 0 ? '/' + remainingPath.join('/') : '/'
|
|
100
|
-
|
|
101
|
-
// Construct the full request path for registry lookup
|
|
102
|
-
const requestPath = `/api/v1/plugin/${pathSegments.join('/')}`
|
|
103
|
-
|
|
104
|
-
// Check if route exists in registry metadata
|
|
105
|
-
if (PluginService.hasRoute(requestPath, method)) {
|
|
106
|
-
console.log(`[Plugin API] Route found in registry: ${requestPath}`)
|
|
107
|
-
// Note: Route exists but execution handled by fallback mechanisms below
|
|
108
|
-
// This maintains zero-dynamic-imports policy
|
|
109
|
-
} else {
|
|
110
|
-
console.log(`[Plugin API] No route found for ${requestPath}, method: ${method}`)
|
|
111
|
-
|
|
112
|
-
// Check if this plugin has route files but handler not found - possible configuration issue
|
|
113
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
114
|
-
if (pluginEntry?.routeFiles && pluginEntry.routeFiles.length > 0) {
|
|
115
|
-
console.warn(`[Plugin API] Plugin '${pluginName}' has route files but route '${requestPath}' not found in registry`)
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Fallback: Try to load plugin's API handler from registry
|
|
120
|
-
const pluginEntry2 = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
121
|
-
if (pluginEntry2?.hasAPI) {
|
|
122
|
-
const response = await loadPluginAPIFromRegistry(pluginName, request, method, endpointPath)
|
|
123
|
-
if (response) {
|
|
124
|
-
return response
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
// Fallback to plugin's built-in API handler
|
|
130
|
-
if (plugin.api && typeof plugin.api.handler === 'function') {
|
|
131
|
-
return plugin.api.handler(request, method, endpointPath)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Default plugin info endpoint
|
|
135
|
-
if (endpointPath === '/' && method === 'GET') {
|
|
136
|
-
return NextResponse.json({
|
|
137
|
-
plugin: {
|
|
138
|
-
name: plugin.name,
|
|
139
|
-
displayName: plugin.displayName,
|
|
140
|
-
version: plugin.version,
|
|
141
|
-
description: plugin.description,
|
|
142
|
-
enabled: plugin.enabled,
|
|
143
|
-
dependencies: plugin.dependencies,
|
|
144
|
-
hasAPI: !!plugin.api || hasPluginAPIFiles(pluginName) || PluginService.getPluginRouteEndpoints().length > 0,
|
|
145
|
-
components: plugin.components ? Object.keys(plugin.components) : [],
|
|
146
|
-
services: plugin.services ? Object.keys(plugin.services) : []
|
|
147
|
-
}
|
|
148
|
-
})
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Plugin doesn't support this endpoint
|
|
152
|
-
return NextResponse.json(
|
|
153
|
-
{
|
|
154
|
-
error: 'Endpoint not supported by plugin',
|
|
155
|
-
plugin: plugin.name,
|
|
156
|
-
path: endpointPath,
|
|
157
|
-
method,
|
|
158
|
-
availableEndpoints: getPluginEndpoints(pluginName)
|
|
159
|
-
},
|
|
160
|
-
{ status: 404 }
|
|
161
|
-
)
|
|
162
|
-
|
|
163
|
-
} catch (error) {
|
|
164
|
-
console.error('[Plugin API] Error handling nested request:', error)
|
|
165
|
-
|
|
166
|
-
return NextResponse.json(
|
|
167
|
-
{
|
|
168
|
-
error: 'Internal server error',
|
|
169
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
170
|
-
},
|
|
171
|
-
{ status: 500 }
|
|
172
|
-
)
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
/**
|
|
177
|
-
* Match route pattern with dynamic parameters
|
|
178
|
-
* Example: 'orders/[orderId]/items' matches 'orders/123/items'
|
|
179
|
-
*/
|
|
180
|
-
function matchRoutePattern(pattern: string, path: string): { matches: boolean; params: Record<string, string> } {
|
|
181
|
-
const params: Record<string, string> = {}
|
|
182
|
-
|
|
183
|
-
// Split both pattern and path into segments
|
|
184
|
-
const patternSegments = pattern.split('/').filter(Boolean)
|
|
185
|
-
const pathSegments = path.split('/').filter(Boolean)
|
|
186
|
-
|
|
187
|
-
// Must have same number of segments
|
|
188
|
-
if (patternSegments.length !== pathSegments.length) {
|
|
189
|
-
return { matches: false, params }
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Check each segment
|
|
193
|
-
for (let i = 0; i < patternSegments.length; i++) {
|
|
194
|
-
const patternSeg = patternSegments[i]
|
|
195
|
-
const pathSeg = pathSegments[i]
|
|
196
|
-
|
|
197
|
-
// Check if this is a dynamic parameter [paramName]
|
|
198
|
-
if (patternSeg.startsWith('[') && patternSeg.endsWith(']')) {
|
|
199
|
-
// Extract parameter name
|
|
200
|
-
const paramName = patternSeg.slice(1, -1)
|
|
201
|
-
params[paramName] = pathSeg
|
|
202
|
-
} else {
|
|
203
|
-
// Static segment must match exactly
|
|
204
|
-
if (patternSeg !== pathSeg) {
|
|
205
|
-
return { matches: false, params: {} }
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return { matches: true, params }
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Load plugin API handler from registry (dynamic plugin loading)
|
|
215
|
-
*/
|
|
216
|
-
async function loadPluginAPIFromRegistry(
|
|
217
|
-
pluginName: string,
|
|
218
|
-
request: NextRequest,
|
|
219
|
-
method: string,
|
|
220
|
-
path: string
|
|
221
|
-
): Promise<NextResponse | null> {
|
|
222
|
-
try {
|
|
223
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
224
|
-
|
|
225
|
-
if (!pluginEntry) {
|
|
226
|
-
return null
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// First, check if the plugin has a config-based API handler
|
|
230
|
-
const plugin = pluginEntry.config
|
|
231
|
-
if (plugin.api && typeof plugin.api.handler === 'function') {
|
|
232
|
-
console.log(`[Plugin API] Using ${pluginName} config handler for ${path}`)
|
|
233
|
-
|
|
234
|
-
// Ensure endpoints are registered if the plugin has a registration function
|
|
235
|
-
if (plugin.api.registerEndpoints && typeof plugin.api.registerEndpoints === 'function') {
|
|
236
|
-
plugin.api.registerEndpoints()
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return plugin.api.handler(request, method, path)
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
// Use the plugin config's API handler if available
|
|
243
|
-
console.log(`[Plugin API] Checking plugin config for API handler`)
|
|
244
|
-
|
|
245
|
-
// If no API handler in config, and the plugin has route files, show available routes
|
|
246
|
-
if (pluginEntry.routeFiles && pluginEntry.routeFiles.length > 0) {
|
|
247
|
-
// Find matching route with dynamic parameter support
|
|
248
|
-
let matchedRoute: RouteFileEndpoint | undefined
|
|
249
|
-
let extractedParams: Record<string, string> = {}
|
|
250
|
-
|
|
251
|
-
const endpointPath = path.substring(1) // Remove leading slash
|
|
252
|
-
|
|
253
|
-
for (const route of pluginEntry.routeFiles) {
|
|
254
|
-
const { matches, params } = matchRoutePattern(route.relativePath, endpointPath)
|
|
255
|
-
|
|
256
|
-
if (matches && route.methods.includes(method)) {
|
|
257
|
-
matchedRoute = route
|
|
258
|
-
extractedParams = params
|
|
259
|
-
break
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (matchedRoute) {
|
|
264
|
-
console.log(`[Plugin API] Found route file for ${pluginName}: ${matchedRoute.relativePath}`)
|
|
265
|
-
console.log(`[Plugin API] Extracted params:`, extractedParams)
|
|
266
|
-
|
|
267
|
-
// Execute the plugin route using static imports (Next.js compatible)
|
|
268
|
-
try {
|
|
269
|
-
console.log(`[Plugin API] Executing ${method} for ${pluginName}:${matchedRoute.relativePath}`)
|
|
270
|
-
|
|
271
|
-
// Use the pattern from registry for handler lookup (not the actual path)
|
|
272
|
-
const routeKey = `${pluginName}/${matchedRoute.relativePath}`
|
|
273
|
-
const pluginHandler = RouteHandlerService.getPluginHandler(routeKey, method)
|
|
274
|
-
|
|
275
|
-
if (!pluginHandler) {
|
|
276
|
-
console.error(`[Plugin API] Handler not found for ${routeKey}:${method}`)
|
|
277
|
-
return NextResponse.json(
|
|
278
|
-
{
|
|
279
|
-
error: `Method ${method} not supported`,
|
|
280
|
-
plugin: pluginName,
|
|
281
|
-
route: matchedRoute.relativePath,
|
|
282
|
-
availableMethods: matchedRoute.methods
|
|
283
|
-
},
|
|
284
|
-
{ status: 405 }
|
|
285
|
-
)
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Execute the plugin handler with extracted dynamic parameters
|
|
289
|
-
return await pluginHandler(request, {
|
|
290
|
-
params: Promise.resolve(extractedParams)
|
|
291
|
-
})
|
|
292
|
-
|
|
293
|
-
} catch (executionError) {
|
|
294
|
-
console.error(`[Plugin API] Error executing plugin route:`, executionError)
|
|
295
|
-
|
|
296
|
-
return NextResponse.json(
|
|
297
|
-
{
|
|
298
|
-
success: false,
|
|
299
|
-
error: 'Plugin route execution failed',
|
|
300
|
-
plugin: pluginName,
|
|
301
|
-
route: matchedRoute.relativePath,
|
|
302
|
-
message: executionError instanceof Error ? executionError.message : 'Unknown execution error',
|
|
303
|
-
details: 'Failed to execute plugin route handler'
|
|
304
|
-
},
|
|
305
|
-
{ status: 500 }
|
|
306
|
-
)
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
return null
|
|
312
|
-
|
|
313
|
-
} catch (error) {
|
|
314
|
-
console.error(`[Plugin API] Error loading ${pluginName} API from registry:`, error)
|
|
315
|
-
|
|
316
|
-
return NextResponse.json(
|
|
317
|
-
{
|
|
318
|
-
error: 'Plugin API error',
|
|
319
|
-
plugin: pluginName,
|
|
320
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
321
|
-
},
|
|
322
|
-
{ status: 500 }
|
|
323
|
-
)
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/**
|
|
328
|
-
* Check if plugin has API files (using registry)
|
|
329
|
-
*/
|
|
330
|
-
function hasPluginAPIFiles(pluginName: string): boolean {
|
|
331
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
332
|
-
return pluginEntry?.hasAPI || false
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
interface PluginEndpoint {
|
|
336
|
-
path: string
|
|
337
|
-
methods: string[]
|
|
338
|
-
description: string
|
|
339
|
-
source: string
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Get available endpoints for a plugin (using registry)
|
|
344
|
-
*/
|
|
345
|
-
function getPluginEndpoints(pluginName: string): PluginEndpoint[] {
|
|
346
|
-
const endpoints = []
|
|
347
|
-
|
|
348
|
-
// Get plugin's route file endpoints from registry
|
|
349
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
350
|
-
|
|
351
|
-
if (pluginEntry?.routeFiles) {
|
|
352
|
-
endpoints.push(...pluginEntry.routeFiles.map((endpoint: RouteFileEndpoint) => ({
|
|
353
|
-
path: endpoint.relativePath === '/' ? '/' : '/' + endpoint.relativePath,
|
|
354
|
-
methods: endpoint.methods,
|
|
355
|
-
description: `Route file endpoint`,
|
|
356
|
-
source: 'route-file'
|
|
357
|
-
})))
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// Add default endpoint if plugin has API but no specific routes
|
|
361
|
-
if (pluginEntry?.hasAPI && endpoints.length === 0) {
|
|
362
|
-
endpoints.push({ path: '/', methods: ['GET'], description: 'Basic API available', source: 'default' })
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
return endpoints.length > 0 ? endpoints : [{ path: '/', methods: ['GET'], description: 'Basic API available', source: 'default' }]
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
// ========== ROUTE HANDLER REGISTRY (Zero Runtime I/O) ==========
|
|
369
|
-
// Import from auto-generated registry - NO direct imports from @/contents allowed
|
|
370
|
-
// All route handlers are resolved at build time by scripts/build-registry.mjs
|
|
371
|
-
// This provides ~17,255x performance improvement over dynamic imports
|
|
372
|
-
|
|
373
|
-
import { RouteHandlerService } from '@nextsparkjs/core/lib/services/route-handler.service'
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# Plugin API
|
|
2
|
-
|
|
3
|
-
Access plugin metadata and route plugin-specific endpoints.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The Plugin API provides endpoints to list installed plugins and their API capabilities. Plugin-specific endpoints are routed through `/api/v1/plugin/{pluginName}/...`.
|
|
8
|
-
|
|
9
|
-
## Authentication
|
|
10
|
-
|
|
11
|
-
- **GET /api/v1/plugin** (list plugins) is public
|
|
12
|
-
- Plugin-specific routes may have their own authentication requirements
|
|
13
|
-
|
|
14
|
-
## Endpoints
|
|
15
|
-
|
|
16
|
-
### List Plugins
|
|
17
|
-
`GET /api/v1/plugin`
|
|
18
|
-
|
|
19
|
-
Returns all registered plugins with their API status and endpoints.
|
|
20
|
-
|
|
21
|
-
**Response:**
|
|
22
|
-
```json
|
|
23
|
-
{
|
|
24
|
-
"success": true,
|
|
25
|
-
"plugins": [
|
|
26
|
-
{
|
|
27
|
-
"name": "email-notifications",
|
|
28
|
-
"displayName": "Email Notifications",
|
|
29
|
-
"version": "1.0.0",
|
|
30
|
-
"description": "Send email notifications for various events",
|
|
31
|
-
"enabled": true,
|
|
32
|
-
"hasAPI": true,
|
|
33
|
-
"apiEndpoints": [
|
|
34
|
-
{
|
|
35
|
-
"path": "/send",
|
|
36
|
-
"methods": ["POST"],
|
|
37
|
-
"description": "Route file endpoint"
|
|
38
|
-
}
|
|
39
|
-
],
|
|
40
|
-
"baseUrl": "/api/v1/plugins/email-notifications",
|
|
41
|
-
"components": ["NotificationSettings", "EmailPreview"],
|
|
42
|
-
"services": ["EmailService"]
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
|
-
"totalPlugins": 5,
|
|
46
|
-
"enabledPlugins": 4,
|
|
47
|
-
"pluginsWithAPI": 3
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Plugin-Specific Routes
|
|
52
|
-
`* /api/v1/plugin/{pluginName}/...`
|
|
53
|
-
|
|
54
|
-
Each plugin can define its own API routes. These are handled by the catch-all route and forwarded to the plugin's route handlers.
|
|
55
|
-
|
|
56
|
-
**Example:**
|
|
57
|
-
- `POST /api/v1/plugin/email-notifications/send` - Send notification
|
|
58
|
-
- `GET /api/v1/plugin/analytics/stats` - Get analytics data
|
|
59
|
-
|
|
60
|
-
## Plugin Structure
|
|
61
|
-
|
|
62
|
-
Plugins can expose:
|
|
63
|
-
- **API Routes**: Custom endpoints under `/api/v1/plugin/{name}/`
|
|
64
|
-
- **Components**: React components for UI
|
|
65
|
-
- **Services**: Business logic services
|
|
66
|
-
|
|
67
|
-
## Plugin Registry
|
|
68
|
-
|
|
69
|
-
The plugin registry (`PLUGIN_REGISTRY`) contains metadata about each plugin:
|
|
70
|
-
- `hasAPI`: Whether the plugin has API routes
|
|
71
|
-
- `routeFiles`: List of available route endpoints
|
|
72
|
-
- `enabled`: Whether the plugin is active
|
|
73
|
-
|
|
74
|
-
## Error Responses
|
|
75
|
-
|
|
76
|
-
| Status | Description |
|
|
77
|
-
|--------|-------------|
|
|
78
|
-
| 404 | Plugin not found or route doesn't exist |
|
|
79
|
-
| 500 | Server Error - Failed to list plugins |
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* API Presets for Plugin
|
|
3
|
-
*
|
|
4
|
-
* These presets appear in the DevTools API Explorer's "Presets" tab.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { defineApiEndpoint } from '@nextsparkjs/core/types/api-presets'
|
|
8
|
-
|
|
9
|
-
export default defineApiEndpoint({
|
|
10
|
-
endpoint: '/api/v1/plugin',
|
|
11
|
-
summary: 'Access plugin metadata and API routes',
|
|
12
|
-
presets: [
|
|
13
|
-
{
|
|
14
|
-
id: 'list-plugins',
|
|
15
|
-
title: 'List All Plugins',
|
|
16
|
-
description: 'Get all registered plugins with API status',
|
|
17
|
-
method: 'GET',
|
|
18
|
-
tags: ['read', 'list']
|
|
19
|
-
}
|
|
20
|
-
]
|
|
21
|
-
})
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin API Base Route
|
|
3
|
-
*
|
|
4
|
-
* Lists all available plugins and their API status
|
|
5
|
-
* Route: /api/v1/plugins
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { NextResponse } from 'next/server'
|
|
9
|
-
import { PluginService, type PluginRegistryEntry } from '@nextsparkjs/core/lib/services'
|
|
10
|
-
import { PLUGIN_REGISTRY } from '@nextsparkjs/registries/plugin-registry'
|
|
11
|
-
|
|
12
|
-
export async function GET() {
|
|
13
|
-
return listPluginsWithAPI()
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* List all plugins with their API status
|
|
18
|
-
*/
|
|
19
|
-
async function listPluginsWithAPI(): Promise<NextResponse> {
|
|
20
|
-
try {
|
|
21
|
-
const plugins = PluginService.getAll()
|
|
22
|
-
|
|
23
|
-
const pluginsWithAPI = plugins.map((plugin) => {
|
|
24
|
-
const hasAPIFiles = hasPluginAPIFiles(plugin.name)
|
|
25
|
-
const endpoints = getPluginEndpoints(plugin.name)
|
|
26
|
-
|
|
27
|
-
return {
|
|
28
|
-
name: plugin.name,
|
|
29
|
-
displayName: plugin.displayName,
|
|
30
|
-
version: plugin.version,
|
|
31
|
-
description: plugin.description,
|
|
32
|
-
enabled: plugin.enabled,
|
|
33
|
-
hasAPI: !!plugin.api || hasAPIFiles,
|
|
34
|
-
apiEndpoints: endpoints,
|
|
35
|
-
baseUrl: `/api/v1/plugins/${plugin.name}`,
|
|
36
|
-
components: plugin.components ? Object.keys(plugin.components) : [],
|
|
37
|
-
services: plugin.services ? Object.keys(plugin.services) : []
|
|
38
|
-
}
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
return NextResponse.json({
|
|
42
|
-
success: true,
|
|
43
|
-
plugins: pluginsWithAPI,
|
|
44
|
-
totalPlugins: plugins.length,
|
|
45
|
-
enabledPlugins: plugins.filter(p => p.enabled).length,
|
|
46
|
-
pluginsWithAPI: pluginsWithAPI.filter(p => p.hasAPI).length
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
} catch (error) {
|
|
50
|
-
console.error('[Plugin API] Error listing plugins:', error)
|
|
51
|
-
|
|
52
|
-
return NextResponse.json(
|
|
53
|
-
{
|
|
54
|
-
error: 'Failed to list plugins',
|
|
55
|
-
message: error instanceof Error ? error.message : 'Unknown error'
|
|
56
|
-
},
|
|
57
|
-
{ status: 500 }
|
|
58
|
-
)
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* Check if plugin has API files (using registry)
|
|
64
|
-
*/
|
|
65
|
-
function hasPluginAPIFiles(pluginName: string): boolean {
|
|
66
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
67
|
-
return pluginEntry?.hasAPI || false
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
interface PluginEndpoint {
|
|
71
|
-
path: string
|
|
72
|
-
methods: string[]
|
|
73
|
-
description: string
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Get available endpoints for a plugin (using registry)
|
|
78
|
-
*/
|
|
79
|
-
function getPluginEndpoints(pluginName: string): PluginEndpoint[] {
|
|
80
|
-
const pluginEntry = (PLUGIN_REGISTRY as Record<string, PluginRegistryEntry>)[pluginName]
|
|
81
|
-
|
|
82
|
-
if (pluginEntry?.routeFiles) {
|
|
83
|
-
return pluginEntry.routeFiles.map((endpoint) => ({
|
|
84
|
-
path: endpoint.relativePath === '/' ? '/' : '/' + endpoint.relativePath,
|
|
85
|
-
methods: endpoint.methods,
|
|
86
|
-
description: 'Route file endpoint'
|
|
87
|
-
}))
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Default endpoint if plugin has API but no specific routes
|
|
91
|
-
if (pluginEntry?.hasAPI) {
|
|
92
|
-
return [{ path: '/', methods: ['GET'], description: 'Basic plugin info' }]
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return []
|
|
96
|
-
}
|