@nextsparkjs/core 0.1.0-beta.84 → 0.1.0-beta.85
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/styles/classes.json +1 -1
- package/dist/templates/app/(auth)/forgot-password/page.tsx +216 -0
- package/dist/templates/app/(auth)/layout.tsx +51 -0
- package/dist/templates/app/(auth)/login/page.tsx +21 -0
- package/dist/templates/app/(auth)/reset-password/page.tsx +212 -0
- package/dist/templates/app/(auth)/signup/page.tsx +21 -0
- package/dist/templates/app/(auth)/verify-email/page.tsx +190 -0
- package/dist/templates/app/(public)/[...slug]/page.tsx +378 -0
- package/dist/templates/app/(public)/docs/[section]/[page]/page.tsx +90 -0
- package/dist/templates/app/(public)/docs/layout.tsx +25 -0
- package/dist/templates/app/(public)/docs/page.tsx +81 -0
- package/dist/templates/app/(public)/layout.tsx +41 -0
- package/dist/templates/app/(public)/page.tsx +19 -0
- package/dist/templates/app/403/page.tsx +89 -0
- package/dist/templates/app/api/auth/[...all]/route.ts +78 -0
- package/dist/templates/app/api/cron/billing/lifecycle/route.ts +98 -0
- package/dist/templates/app/api/csp-report/route.ts +175 -0
- package/dist/templates/app/api/devtools/config/entities/route.ts +108 -0
- package/dist/templates/app/api/devtools/config/theme/route.ts +66 -0
- package/dist/templates/app/api/devtools/tests/[...path]/route.ts +130 -0
- package/dist/templates/app/api/devtools/tests/route.ts +134 -0
- package/dist/templates/app/api/health/route.ts +29 -0
- package/dist/templates/app/api/internal/user-metadata/route.ts +36 -0
- package/dist/templates/app/api/superadmin/subscriptions/route.ts +310 -0
- package/dist/templates/app/api/superadmin/teams/[teamId]/route.ts +286 -0
- package/dist/templates/app/api/superadmin/teams/route.ts +188 -0
- package/dist/templates/app/api/superadmin/users/[userId]/route.ts +540 -0
- package/dist/templates/app/api/superadmin/users/route.ts +323 -0
- package/dist/templates/app/api/user/delete-account/route.ts +55 -0
- package/dist/templates/app/api/user/plan-flags/route.ts +283 -0
- package/dist/templates/app/api/user/profile/route.ts +133 -0
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +210 -0
- package/dist/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +331 -0
- package/dist/templates/app/api/v1/[entity]/[id]/route.ts +35 -0
- package/dist/templates/app/api/v1/[entity]/docs.md +369 -0
- package/dist/templates/app/api/v1/[entity]/presets.ts +194 -0
- package/dist/templates/app/api/v1/[entity]/route.ts +31 -0
- package/dist/templates/app/api/v1/api-keys/[id]/route.ts +303 -0
- package/dist/templates/app/api/v1/api-keys/docs.md +101 -0
- package/dist/templates/app/api/v1/api-keys/presets.ts +31 -0
- package/dist/templates/app/api/v1/api-keys/route.ts +250 -0
- package/dist/templates/app/api/v1/auth/docs.md +184 -0
- package/dist/templates/app/api/v1/auth/presets.ts +44 -0
- package/dist/templates/app/api/v1/auth/signup-with-invite/route.ts +227 -0
- package/dist/templates/app/api/v1/billing/cancel/route.ts +206 -0
- package/dist/templates/app/api/v1/billing/change-plan/route.ts +97 -0
- package/dist/templates/app/api/v1/billing/check-action/route.ts +81 -0
- package/dist/templates/app/api/v1/billing/checkout/route.ts +124 -0
- package/dist/templates/app/api/v1/billing/docs.md +209 -0
- package/dist/templates/app/api/v1/billing/plans/route.ts +85 -0
- package/dist/templates/app/api/v1/billing/portal/route.ts +90 -0
- package/dist/templates/app/api/v1/billing/presets.ts +121 -0
- package/dist/templates/app/api/v1/billing/webhooks/stripe/route.ts +428 -0
- package/dist/templates/app/api/v1/blocks/[slug]/route.ts +29 -0
- package/dist/templates/app/api/v1/blocks/docs.md +173 -0
- package/dist/templates/app/api/v1/blocks/presets.ts +121 -0
- package/dist/templates/app/api/v1/blocks/route.ts +45 -0
- package/dist/templates/app/api/v1/blocks/validate/route.ts +45 -0
- package/dist/templates/app/api/v1/cron/docs.md +116 -0
- package/dist/templates/app/api/v1/cron/presets.ts +26 -0
- package/dist/templates/app/api/v1/cron/process/route.ts +108 -0
- package/dist/templates/app/api/v1/devtools/blocks/route.ts +82 -0
- package/dist/templates/app/api/v1/devtools/docs/route.ts +150 -0
- package/dist/templates/app/api/v1/devtools/docs.md +204 -0
- package/dist/templates/app/api/v1/devtools/features/route.ts +61 -0
- package/dist/templates/app/api/v1/devtools/flows/route.ts +61 -0
- package/dist/templates/app/api/v1/devtools/presets.ts +113 -0
- package/dist/templates/app/api/v1/devtools/scheduled-actions/route.ts +120 -0
- package/dist/templates/app/api/v1/devtools/testing/route.ts +82 -0
- package/dist/templates/app/api/v1/media/docs.md +117 -0
- package/dist/templates/app/api/v1/media/presets.ts +24 -0
- package/dist/templates/app/api/v1/media/upload/route.ts +150 -0
- package/dist/templates/app/api/v1/patterns/[id]/usages/route.ts +116 -0
- package/dist/templates/app/api/v1/plugin/[...path]/route.ts +373 -0
- package/dist/templates/app/api/v1/plugin/docs.md +79 -0
- package/dist/templates/app/api/v1/plugin/presets.ts +21 -0
- package/dist/templates/app/api/v1/plugin/route.ts +96 -0
- package/dist/templates/app/api/v1/post-categories/[id]/route.ts +255 -0
- package/dist/templates/app/api/v1/post-categories/docs.md +134 -0
- package/dist/templates/app/api/v1/post-categories/presets.ts +78 -0
- package/dist/templates/app/api/v1/post-categories/route.ts +119 -0
- package/dist/templates/app/api/v1/team-invitations/[token]/accept/route.ts +179 -0
- package/dist/templates/app/api/v1/team-invitations/[token]/decline/route.ts +120 -0
- package/dist/templates/app/api/v1/team-invitations/[token]/route.ts +89 -0
- package/dist/templates/app/api/v1/team-invitations/docs.md +88 -0
- package/dist/templates/app/api/v1/team-invitations/presets.ts +43 -0
- package/dist/templates/app/api/v1/team-invitations/route.ts +114 -0
- package/dist/templates/app/api/v1/teams/[teamId]/invitations/route.ts +171 -0
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +105 -0
- package/dist/templates/app/api/v1/teams/[teamId]/invoices/route.ts +125 -0
- package/dist/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +263 -0
- package/dist/templates/app/api/v1/teams/[teamId]/members/route.ts +358 -0
- package/dist/templates/app/api/v1/teams/[teamId]/route.ts +322 -0
- package/dist/templates/app/api/v1/teams/[teamId]/subscription/route.ts +50 -0
- package/dist/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +91 -0
- package/dist/templates/app/api/v1/teams/docs.md +320 -0
- package/dist/templates/app/api/v1/teams/presets.ts +178 -0
- package/dist/templates/app/api/v1/teams/route.ts +293 -0
- package/dist/templates/app/api/v1/teams/switch/route.ts +88 -0
- package/dist/templates/app/api/v1/theme/[...path]/route.ts +361 -0
- package/dist/templates/app/api/v1/theme/docs.md +74 -0
- package/dist/templates/app/api/v1/theme/presets.ts +21 -0
- package/dist/templates/app/api/v1/theme/route.ts +96 -0
- package/dist/templates/app/api/v1/users/[id]/meta/[key]/route.ts +363 -0
- package/dist/templates/app/api/v1/users/[id]/route.ts +302 -0
- package/dist/templates/app/api/v1/users/docs.md +93 -0
- package/dist/templates/app/api/v1/users/presets.ts +59 -0
- package/dist/templates/app/api/v1/users/route.ts +197 -0
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +117 -0
- package/dist/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +103 -0
- package/dist/templates/app/dashboard/(main)/[entity]/create/page.tsx +95 -0
- package/dist/templates/app/dashboard/(main)/[entity]/error.tsx +51 -0
- package/dist/templates/app/dashboard/(main)/[entity]/layout.tsx +113 -0
- package/dist/templates/app/dashboard/(main)/[entity]/loading.tsx +61 -0
- package/dist/templates/app/dashboard/(main)/[entity]/page.tsx +90 -0
- package/dist/templates/app/dashboard/(main)/layout.tsx +98 -0
- package/dist/templates/app/dashboard/(main)/loading.tsx +5 -0
- package/dist/templates/app/dashboard/(main)/page.tsx +201 -0
- package/dist/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +114 -0
- package/dist/templates/app/dashboard/(main)/patterns/[id]/page.tsx +20 -0
- package/dist/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +171 -0
- package/dist/templates/app/dashboard/(main)/patterns/create/page.tsx +86 -0
- package/dist/templates/app/dashboard/(main)/patterns/page.tsx +444 -0
- package/dist/templates/app/dashboard/features/analytics/page.tsx +35 -0
- package/dist/templates/app/dashboard/features/automation/page.tsx +35 -0
- package/dist/templates/app/dashboard/features/layout.tsx +13 -0
- package/dist/templates/app/dashboard/features/loading.tsx +5 -0
- package/dist/templates/app/dashboard/features/webhooks/page.tsx +35 -0
- package/dist/templates/app/dashboard/layout.tsx +86 -0
- package/dist/templates/app/dashboard/permission-denied/page.tsx +29 -0
- package/dist/templates/app/dashboard/settings/api-keys/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/api-keys/page.tsx +513 -0
- package/dist/templates/app/dashboard/settings/billing/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/billing/page.tsx +284 -0
- package/dist/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +222 -0
- package/dist/templates/app/dashboard/settings/invoices/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/invoices/page.tsx +82 -0
- package/dist/templates/app/dashboard/settings/layout.tsx +151 -0
- package/dist/templates/app/dashboard/settings/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/notifications/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/notifications/page.tsx +462 -0
- package/dist/templates/app/dashboard/settings/page.tsx +92 -0
- package/dist/templates/app/dashboard/settings/password/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/password/page.tsx +306 -0
- package/dist/templates/app/dashboard/settings/plans/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/plans/page.tsx +40 -0
- package/dist/templates/app/dashboard/settings/profile/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/profile/page.tsx +686 -0
- package/dist/templates/app/dashboard/settings/security/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/security/page.tsx +505 -0
- package/dist/templates/app/dashboard/settings/teams/loading.tsx +5 -0
- package/dist/templates/app/dashboard/settings/teams/page.tsx +272 -0
- package/dist/templates/app/dashboard/settings/teams/permissions/page.tsx +92 -0
- package/dist/templates/app/devtools/blocks/[slug]/page.tsx +39 -0
- package/dist/templates/app/devtools/blocks/page.tsx +31 -0
- package/dist/templates/app/devtools/config/page.tsx +31 -0
- package/dist/templates/app/devtools/features/page.tsx +31 -0
- package/dist/templates/app/devtools/flows/page.tsx +31 -0
- package/dist/templates/app/devtools/layout.tsx +58 -0
- package/dist/templates/app/devtools/page.tsx +121 -0
- package/dist/templates/app/devtools/scheduled-actions/page.tsx +157 -0
- package/dist/templates/app/devtools/style/page.tsx +330 -0
- package/dist/templates/app/devtools/tags/page.tsx +31 -0
- package/dist/templates/app/devtools/tests/[[...path]]/page.tsx +47 -0
- package/dist/templates/app/favicon.ico +0 -0
- package/dist/templates/app/globals.css +12 -0
- package/dist/templates/app/layout.tsx +96 -0
- package/dist/templates/app/public/page.tsx +30 -0
- package/dist/templates/app/superadmin/docs/[section]/[page]/page.tsx +92 -0
- package/dist/templates/app/superadmin/docs/page.tsx +75 -0
- package/dist/templates/app/superadmin/layout.tsx +67 -0
- package/dist/templates/app/superadmin/page.tsx +149 -0
- package/dist/templates/app/superadmin/subscriptions/page.tsx +655 -0
- package/dist/templates/app/superadmin/team-roles/page.tsx +493 -0
- package/dist/templates/app/superadmin/teams/[teamId]/page.tsx +687 -0
- package/dist/templates/app/superadmin/teams/page.tsx +302 -0
- package/dist/templates/app/superadmin/users/[userId]/page.tsx +548 -0
- package/dist/templates/app/superadmin/users/page.tsx +528 -0
- package/package.json +2 -2
- package/templates/app/(auth)/forgot-password/page.tsx +216 -0
- package/templates/app/(auth)/layout.tsx +51 -0
- package/templates/app/(auth)/login/page.tsx +21 -0
- package/templates/app/(auth)/reset-password/page.tsx +212 -0
- package/templates/app/(auth)/signup/page.tsx +21 -0
- package/templates/app/(auth)/verify-email/page.tsx +190 -0
- package/templates/app/(public)/[...slug]/page.tsx +378 -0
- package/templates/app/(public)/docs/[section]/[page]/page.tsx +90 -0
- package/templates/app/(public)/docs/layout.tsx +25 -0
- package/templates/app/(public)/docs/page.tsx +81 -0
- package/templates/app/(public)/layout.tsx +41 -0
- package/templates/app/(public)/page.tsx +19 -0
- package/templates/app/403/page.tsx +89 -0
- package/templates/app/api/auth/[...all]/route.ts +78 -0
- package/templates/app/api/cron/billing/lifecycle/route.ts +98 -0
- package/templates/app/api/csp-report/route.ts +175 -0
- package/templates/app/api/devtools/config/entities/route.ts +108 -0
- package/templates/app/api/devtools/config/theme/route.ts +66 -0
- package/templates/app/api/devtools/tests/[...path]/route.ts +130 -0
- package/templates/app/api/devtools/tests/route.ts +134 -0
- package/templates/app/api/health/route.ts +29 -0
- package/templates/app/api/internal/user-metadata/route.ts +36 -0
- package/templates/app/api/superadmin/subscriptions/route.ts +310 -0
- package/templates/app/api/superadmin/teams/[teamId]/route.ts +286 -0
- package/templates/app/api/superadmin/teams/route.ts +188 -0
- package/templates/app/api/superadmin/users/[userId]/route.ts +540 -0
- package/templates/app/api/superadmin/users/route.ts +323 -0
- package/templates/app/api/user/delete-account/route.ts +55 -0
- package/templates/app/api/user/plan-flags/route.ts +283 -0
- package/templates/app/api/user/profile/route.ts +133 -0
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/[childId]/route.ts +210 -0
- package/templates/app/api/v1/[entity]/[id]/child/[childType]/route.ts +331 -0
- package/templates/app/api/v1/[entity]/[id]/route.ts +35 -0
- package/templates/app/api/v1/[entity]/docs.md +369 -0
- package/templates/app/api/v1/[entity]/presets.ts +194 -0
- package/templates/app/api/v1/[entity]/route.ts +31 -0
- package/templates/app/api/v1/api-keys/[id]/route.ts +303 -0
- package/templates/app/api/v1/api-keys/docs.md +101 -0
- package/templates/app/api/v1/api-keys/presets.ts +31 -0
- package/templates/app/api/v1/api-keys/route.ts +250 -0
- package/templates/app/api/v1/auth/docs.md +184 -0
- package/templates/app/api/v1/auth/presets.ts +44 -0
- package/templates/app/api/v1/auth/signup-with-invite/route.ts +227 -0
- package/templates/app/api/v1/billing/cancel/route.ts +206 -0
- package/templates/app/api/v1/billing/change-plan/route.ts +97 -0
- package/templates/app/api/v1/billing/check-action/route.ts +81 -0
- package/templates/app/api/v1/billing/checkout/route.ts +124 -0
- package/templates/app/api/v1/billing/docs.md +209 -0
- package/templates/app/api/v1/billing/plans/route.ts +85 -0
- package/templates/app/api/v1/billing/portal/route.ts +90 -0
- package/templates/app/api/v1/billing/presets.ts +121 -0
- package/templates/app/api/v1/billing/webhooks/stripe/route.ts +428 -0
- package/templates/app/api/v1/blocks/[slug]/route.ts +29 -0
- package/templates/app/api/v1/blocks/docs.md +173 -0
- package/templates/app/api/v1/blocks/presets.ts +121 -0
- package/templates/app/api/v1/blocks/route.ts +45 -0
- package/templates/app/api/v1/blocks/validate/route.ts +45 -0
- package/templates/app/api/v1/cron/docs.md +116 -0
- package/templates/app/api/v1/cron/presets.ts +26 -0
- package/templates/app/api/v1/cron/process/route.ts +108 -0
- package/templates/app/api/v1/devtools/blocks/route.ts +82 -0
- package/templates/app/api/v1/devtools/docs/route.ts +150 -0
- package/templates/app/api/v1/devtools/docs.md +204 -0
- package/templates/app/api/v1/devtools/features/route.ts +61 -0
- package/templates/app/api/v1/devtools/flows/route.ts +61 -0
- package/templates/app/api/v1/devtools/presets.ts +113 -0
- package/templates/app/api/v1/devtools/scheduled-actions/route.ts +120 -0
- package/templates/app/api/v1/devtools/testing/route.ts +82 -0
- package/templates/app/api/v1/media/docs.md +117 -0
- package/templates/app/api/v1/media/presets.ts +24 -0
- package/templates/app/api/v1/media/upload/route.ts +150 -0
- package/templates/app/api/v1/patterns/[id]/usages/route.ts +116 -0
- package/templates/app/api/v1/plugin/[...path]/route.ts +373 -0
- package/templates/app/api/v1/plugin/docs.md +79 -0
- package/templates/app/api/v1/plugin/presets.ts +21 -0
- package/templates/app/api/v1/plugin/route.ts +96 -0
- package/templates/app/api/v1/post-categories/[id]/route.ts +255 -0
- package/templates/app/api/v1/post-categories/docs.md +134 -0
- package/templates/app/api/v1/post-categories/presets.ts +78 -0
- package/templates/app/api/v1/post-categories/route.ts +119 -0
- package/templates/app/api/v1/team-invitations/[token]/accept/route.ts +179 -0
- package/templates/app/api/v1/team-invitations/[token]/decline/route.ts +120 -0
- package/templates/app/api/v1/team-invitations/[token]/route.ts +89 -0
- package/templates/app/api/v1/team-invitations/docs.md +88 -0
- package/templates/app/api/v1/team-invitations/presets.ts +43 -0
- package/templates/app/api/v1/team-invitations/route.ts +114 -0
- package/templates/app/api/v1/teams/[teamId]/invitations/route.ts +171 -0
- package/templates/app/api/v1/teams/[teamId]/invoices/[invoiceNumber]/route.ts +105 -0
- package/templates/app/api/v1/teams/[teamId]/invoices/route.ts +125 -0
- package/templates/app/api/v1/teams/[teamId]/members/[memberId]/route.ts +263 -0
- package/templates/app/api/v1/teams/[teamId]/members/route.ts +358 -0
- package/templates/app/api/v1/teams/[teamId]/route.ts +322 -0
- package/templates/app/api/v1/teams/[teamId]/subscription/route.ts +50 -0
- package/templates/app/api/v1/teams/[teamId]/usage/[limitSlug]/route.ts +91 -0
- package/templates/app/api/v1/teams/docs.md +320 -0
- package/templates/app/api/v1/teams/presets.ts +178 -0
- package/templates/app/api/v1/teams/route.ts +293 -0
- package/templates/app/api/v1/teams/switch/route.ts +88 -0
- package/templates/app/api/v1/theme/[...path]/route.ts +361 -0
- package/templates/app/api/v1/theme/docs.md +74 -0
- package/templates/app/api/v1/theme/presets.ts +21 -0
- package/templates/app/api/v1/theme/route.ts +96 -0
- package/templates/app/api/v1/users/[id]/meta/[key]/route.ts +363 -0
- package/templates/app/api/v1/users/[id]/route.ts +302 -0
- package/templates/app/api/v1/users/docs.md +93 -0
- package/templates/app/api/v1/users/presets.ts +59 -0
- package/templates/app/api/v1/users/route.ts +197 -0
- package/templates/app/dashboard/(main)/[entity]/[id]/edit/page.tsx +117 -0
- package/templates/app/dashboard/(main)/[entity]/[id]/page.tsx +103 -0
- package/templates/app/dashboard/(main)/[entity]/create/page.tsx +95 -0
- package/templates/app/dashboard/(main)/[entity]/error.tsx +51 -0
- package/templates/app/dashboard/(main)/[entity]/layout.tsx +113 -0
- package/templates/app/dashboard/(main)/[entity]/loading.tsx +61 -0
- package/templates/app/dashboard/(main)/[entity]/page.tsx +90 -0
- package/templates/app/dashboard/(main)/layout.tsx +98 -0
- package/templates/app/dashboard/(main)/loading.tsx +5 -0
- package/templates/app/dashboard/(main)/page.tsx +201 -0
- package/templates/app/dashboard/(main)/patterns/[id]/edit/page.tsx +114 -0
- package/templates/app/dashboard/(main)/patterns/[id]/page.tsx +20 -0
- package/templates/app/dashboard/(main)/patterns/[id]/reports/page.tsx +171 -0
- package/templates/app/dashboard/(main)/patterns/create/page.tsx +86 -0
- package/templates/app/dashboard/(main)/patterns/page.tsx +444 -0
- package/templates/app/dashboard/features/analytics/page.tsx +35 -0
- package/templates/app/dashboard/features/automation/page.tsx +35 -0
- package/templates/app/dashboard/features/layout.tsx +13 -0
- package/templates/app/dashboard/features/loading.tsx +5 -0
- package/templates/app/dashboard/features/webhooks/page.tsx +35 -0
- package/templates/app/dashboard/layout.tsx +86 -0
- package/templates/app/dashboard/permission-denied/page.tsx +29 -0
- package/templates/app/dashboard/settings/api-keys/loading.tsx +5 -0
- package/templates/app/dashboard/settings/api-keys/page.tsx +513 -0
- package/templates/app/dashboard/settings/billing/loading.tsx +5 -0
- package/templates/app/dashboard/settings/billing/page.tsx +284 -0
- package/templates/app/dashboard/settings/invoices/[invoiceNumber]/page.tsx +222 -0
- package/templates/app/dashboard/settings/invoices/loading.tsx +5 -0
- package/templates/app/dashboard/settings/invoices/page.tsx +82 -0
- package/templates/app/dashboard/settings/layout.tsx +151 -0
- package/templates/app/dashboard/settings/loading.tsx +5 -0
- package/templates/app/dashboard/settings/notifications/loading.tsx +5 -0
- package/templates/app/dashboard/settings/notifications/page.tsx +462 -0
- package/templates/app/dashboard/settings/page.tsx +92 -0
- package/templates/app/dashboard/settings/password/loading.tsx +5 -0
- package/templates/app/dashboard/settings/password/page.tsx +306 -0
- package/templates/app/dashboard/settings/plans/loading.tsx +5 -0
- package/templates/app/dashboard/settings/plans/page.tsx +40 -0
- package/templates/app/dashboard/settings/profile/loading.tsx +5 -0
- package/templates/app/dashboard/settings/profile/page.tsx +686 -0
- package/templates/app/dashboard/settings/security/loading.tsx +5 -0
- package/templates/app/dashboard/settings/security/page.tsx +505 -0
- package/templates/app/dashboard/settings/teams/loading.tsx +5 -0
- package/templates/app/dashboard/settings/teams/page.tsx +272 -0
- package/templates/app/dashboard/settings/teams/permissions/page.tsx +92 -0
- package/templates/app/devtools/blocks/[slug]/page.tsx +39 -0
- package/templates/app/devtools/blocks/page.tsx +31 -0
- package/templates/app/devtools/config/page.tsx +31 -0
- package/templates/app/devtools/features/page.tsx +31 -0
- package/templates/app/devtools/flows/page.tsx +31 -0
- package/templates/app/devtools/layout.tsx +58 -0
- package/templates/app/devtools/page.tsx +121 -0
- package/templates/app/devtools/scheduled-actions/page.tsx +157 -0
- package/templates/app/devtools/style/page.tsx +330 -0
- package/templates/app/devtools/tags/page.tsx +31 -0
- package/templates/app/devtools/tests/[[...path]]/page.tsx +47 -0
- package/templates/app/favicon.ico +0 -0
- package/templates/app/globals.css +12 -0
- package/templates/app/layout.tsx +96 -0
- package/templates/app/public/page.tsx +30 -0
- package/templates/app/superadmin/docs/[section]/[page]/page.tsx +92 -0
- package/templates/app/superadmin/docs/page.tsx +75 -0
- package/templates/app/superadmin/layout.tsx +67 -0
- package/templates/app/superadmin/page.tsx +149 -0
- package/templates/app/superadmin/subscriptions/page.tsx +655 -0
- package/templates/app/superadmin/team-roles/page.tsx +493 -0
- package/templates/app/superadmin/teams/[teamId]/page.tsx +687 -0
- package/templates/app/superadmin/teams/page.tsx +302 -0
- package/templates/app/superadmin/users/[userId]/page.tsx +548 -0
- package/templates/app/superadmin/users/page.tsx +528 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools Blocks API
|
|
3
|
+
*
|
|
4
|
+
* GET /api/v1/devtools/blocks
|
|
5
|
+
*
|
|
6
|
+
* Returns the block registry with field definitions and test coverage.
|
|
7
|
+
* Requires superadmin or developer user role.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { NextRequest, NextResponse } from 'next/server'
|
|
11
|
+
import { authenticateRequest } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
12
|
+
import {
|
|
13
|
+
canAccessDevtoolsApi,
|
|
14
|
+
createDevtoolsAccessDeniedResponse,
|
|
15
|
+
createDevtoolsUnauthorizedResponse,
|
|
16
|
+
} from '@nextsparkjs/core/lib/api/auth/devtools-auth'
|
|
17
|
+
import { BLOCK_REGISTRY } from '@nextsparkjs/registries/block-registry'
|
|
18
|
+
import { TAGS_REGISTRY, COVERAGE_SUMMARY } from '@nextsparkjs/registries/testing-registry'
|
|
19
|
+
|
|
20
|
+
export async function GET(request: NextRequest) {
|
|
21
|
+
// Authenticate request
|
|
22
|
+
const authResult = await authenticateRequest(request)
|
|
23
|
+
|
|
24
|
+
if (!authResult.success) {
|
|
25
|
+
return createDevtoolsUnauthorizedResponse()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Check DevTools access permission
|
|
29
|
+
if (!canAccessDevtoolsApi(authResult)) {
|
|
30
|
+
return createDevtoolsAccessDeniedResponse()
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Merge blocks with test coverage data
|
|
34
|
+
// Type assertion needed because TAGS_REGISTRY uses 'as const' with readonly arrays
|
|
35
|
+
const blockTags = TAGS_REGISTRY.blocks as unknown as Record<string, { tag: string; testCount: number; files: readonly string[] }>
|
|
36
|
+
const blocksWithCoverage = Object.values(BLOCK_REGISTRY).map((block) => {
|
|
37
|
+
const tagData = blockTags[block.slug]
|
|
38
|
+
return {
|
|
39
|
+
...block,
|
|
40
|
+
testing: {
|
|
41
|
+
hasTests: (tagData?.testCount || 0) > 0,
|
|
42
|
+
testCount: tagData?.testCount || 0,
|
|
43
|
+
files: tagData?.files ? [...tagData.files] : [],
|
|
44
|
+
tag: `@b-${block.slug}`,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// Calculate summary stats
|
|
50
|
+
const total = blocksWithCoverage.length
|
|
51
|
+
const withTests = blocksWithCoverage.filter((b) => b.testing.hasTests).length
|
|
52
|
+
|
|
53
|
+
// Get unique categories
|
|
54
|
+
const categories = [...new Set(blocksWithCoverage.map((b) => b.category))].sort()
|
|
55
|
+
|
|
56
|
+
return NextResponse.json({
|
|
57
|
+
success: true,
|
|
58
|
+
data: {
|
|
59
|
+
blocks: blocksWithCoverage,
|
|
60
|
+
summary: {
|
|
61
|
+
total,
|
|
62
|
+
withTests,
|
|
63
|
+
withoutTests: total - withTests,
|
|
64
|
+
categories,
|
|
65
|
+
},
|
|
66
|
+
meta: {
|
|
67
|
+
theme: COVERAGE_SUMMARY.theme,
|
|
68
|
+
generatedAt: COVERAGE_SUMMARY.generatedAt,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export async function OPTIONS() {
|
|
75
|
+
return new NextResponse(null, {
|
|
76
|
+
status: 204,
|
|
77
|
+
headers: {
|
|
78
|
+
'Access-Control-Allow-Methods': 'GET, OPTIONS',
|
|
79
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-api-key',
|
|
80
|
+
},
|
|
81
|
+
})
|
|
82
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools API Documentation Endpoint
|
|
3
|
+
*
|
|
4
|
+
* Serves markdown documentation files for API endpoints.
|
|
5
|
+
* Used by the API Explorer to display endpoint documentation.
|
|
6
|
+
*
|
|
7
|
+
* Supports both monorepo and npm modes:
|
|
8
|
+
* - Monorepo: themes at repo root (themes/{theme}/...)
|
|
9
|
+
* - NPM: themes in contents directory (contents/themes/{theme}/...)
|
|
10
|
+
*
|
|
11
|
+
* GET /api/v1/devtools/docs?path={path}
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { NextRequest, NextResponse } from 'next/server'
|
|
15
|
+
import { readFile } from 'fs/promises'
|
|
16
|
+
import { join, dirname } from 'path'
|
|
17
|
+
import { existsSync } from 'fs'
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Valid path patterns for documentation files
|
|
21
|
+
* Supports both monorepo mode (themes/) and npm mode (contents/themes/)
|
|
22
|
+
*/
|
|
23
|
+
const VALID_PATH_PATTERNS = [
|
|
24
|
+
// Entity folders
|
|
25
|
+
/^(contents\/)?themes\/[\w-]+\/entities\/[\w-]+\/api\/docs\.md$/,
|
|
26
|
+
// Theme routes
|
|
27
|
+
/^(contents\/)?themes\/[\w-]+\/app\/api\/.*\/docs\.md$/,
|
|
28
|
+
// Core routes (monorepo mode)
|
|
29
|
+
/^packages\/core\/templates\/app\/api\/.*\/docs\.md$/,
|
|
30
|
+
// Core routes (NPM mode)
|
|
31
|
+
/^node_modules\/@nextsparkjs\/core\/templates\/app\/api\/.*\/docs\.md$/,
|
|
32
|
+
// Legacy devtools/api location (for backwards compatibility)
|
|
33
|
+
/^(contents\/)?themes\/[\w-]+\/devtools\/api\/[\w-]+\.md$/
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Validate that a path matches one of the allowed patterns
|
|
38
|
+
*/
|
|
39
|
+
function isValidPath(path: string): boolean {
|
|
40
|
+
return VALID_PATH_PATTERNS.some(pattern => pattern.test(path))
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Detect monorepo root by searching for pnpm-workspace.yaml
|
|
45
|
+
*/
|
|
46
|
+
function detectMonorepoRoot(startDir: string): string | null {
|
|
47
|
+
let dir = startDir
|
|
48
|
+
const maxDepth = 10
|
|
49
|
+
let depth = 0
|
|
50
|
+
|
|
51
|
+
while (dir !== '/' && depth < maxDepth) {
|
|
52
|
+
if (existsSync(join(dir, 'pnpm-workspace.yaml'))) {
|
|
53
|
+
return dir
|
|
54
|
+
}
|
|
55
|
+
dir = dirname(dir)
|
|
56
|
+
depth++
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get all possible base paths for resolving doc files
|
|
64
|
+
* Handles both monorepo and npm modes
|
|
65
|
+
*/
|
|
66
|
+
function getBasePaths(): string[] {
|
|
67
|
+
const cwd = process.cwd()
|
|
68
|
+
const paths: string[] = []
|
|
69
|
+
|
|
70
|
+
// Always try cwd first (works for npm mode with contents/)
|
|
71
|
+
paths.push(cwd)
|
|
72
|
+
|
|
73
|
+
// Check if we're in monorepo mode
|
|
74
|
+
const monorepoRoot = detectMonorepoRoot(cwd)
|
|
75
|
+
if (monorepoRoot && monorepoRoot !== cwd) {
|
|
76
|
+
// In monorepo, themes are at repo root
|
|
77
|
+
paths.push(monorepoRoot)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return paths
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function GET(request: NextRequest) {
|
|
84
|
+
const searchParams = request.nextUrl.searchParams
|
|
85
|
+
const docPath = searchParams.get('path')
|
|
86
|
+
|
|
87
|
+
if (!docPath) {
|
|
88
|
+
return NextResponse.json(
|
|
89
|
+
{ error: 'Missing path parameter' },
|
|
90
|
+
{ status: 400 }
|
|
91
|
+
)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Validate path to prevent directory traversal
|
|
95
|
+
if (docPath.includes('..')) {
|
|
96
|
+
return NextResponse.json(
|
|
97
|
+
{ error: 'Invalid path: directory traversal not allowed' },
|
|
98
|
+
{ status: 400 }
|
|
99
|
+
)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Validate path matches allowed patterns
|
|
103
|
+
if (!isValidPath(docPath)) {
|
|
104
|
+
return NextResponse.json(
|
|
105
|
+
{ error: 'Invalid path: does not match allowed patterns' },
|
|
106
|
+
{ status: 400 }
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Only allow .md files
|
|
111
|
+
if (!docPath.endsWith('.md')) {
|
|
112
|
+
return NextResponse.json(
|
|
113
|
+
{ error: 'Only markdown files are allowed' },
|
|
114
|
+
{ status: 400 }
|
|
115
|
+
)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
// Try all possible base paths
|
|
120
|
+
const basePaths = getBasePaths()
|
|
121
|
+
|
|
122
|
+
let fullPath: string | null = null
|
|
123
|
+
for (const base of basePaths) {
|
|
124
|
+
const testPath = join(base, docPath)
|
|
125
|
+
if (existsSync(testPath)) {
|
|
126
|
+
fullPath = testPath
|
|
127
|
+
break
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Check if file exists
|
|
132
|
+
if (!fullPath) {
|
|
133
|
+
return NextResponse.json(
|
|
134
|
+
{ error: 'Document not found' },
|
|
135
|
+
{ status: 404 }
|
|
136
|
+
)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Read the markdown file
|
|
140
|
+
const content = await readFile(fullPath, 'utf-8')
|
|
141
|
+
|
|
142
|
+
return NextResponse.json({ content })
|
|
143
|
+
} catch (error) {
|
|
144
|
+
console.error('Error reading documentation:', error)
|
|
145
|
+
return NextResponse.json(
|
|
146
|
+
{ error: 'Failed to read document' },
|
|
147
|
+
{ status: 500 }
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# DevTools API
|
|
2
|
+
|
|
3
|
+
Development and debugging utilities for the NextSpark framework.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The DevTools API provides endpoints for development-time utilities including documentation serving, feature registry access, scheduled action management, test flows, and block metadata. These endpoints are restricted to superadmin and developer users.
|
|
8
|
+
|
|
9
|
+
## Authentication
|
|
10
|
+
|
|
11
|
+
All endpoints require authentication via:
|
|
12
|
+
- **Session cookie** with superadmin or developer role
|
|
13
|
+
- **API Key** header with appropriate permissions
|
|
14
|
+
|
|
15
|
+
Only superadmin and developer users can access these endpoints.
|
|
16
|
+
|
|
17
|
+
## Endpoints
|
|
18
|
+
|
|
19
|
+
### Get Documentation
|
|
20
|
+
`GET /api/v1/devtools/docs?path={path}`
|
|
21
|
+
|
|
22
|
+
Serves markdown documentation files for API endpoints. Used by the API Explorer to display endpoint documentation.
|
|
23
|
+
|
|
24
|
+
**Query Parameters:**
|
|
25
|
+
- `path` (string, required): Path to the markdown file
|
|
26
|
+
|
|
27
|
+
**Valid Path Patterns:**
|
|
28
|
+
- `themes/{theme}/entities/{entity}/api/docs.md`
|
|
29
|
+
- `themes/{theme}/app/api/.../docs.md`
|
|
30
|
+
- `packages/core/templates/app/api/.../docs.md`
|
|
31
|
+
- `node_modules/@nextsparkjs/core/templates/app/api/.../docs.md`
|
|
32
|
+
|
|
33
|
+
**Example Request:**
|
|
34
|
+
```
|
|
35
|
+
GET /api/v1/devtools/docs?path=packages/core/templates/app/api/v1/teams/docs.md
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Response:**
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"content": "# Teams API\n\nManage teams..."
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### List Features
|
|
46
|
+
`GET /api/v1/devtools/features`
|
|
47
|
+
|
|
48
|
+
Returns the feature registry with test coverage information.
|
|
49
|
+
|
|
50
|
+
**Response:**
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"success": true,
|
|
54
|
+
"data": {
|
|
55
|
+
"features": [
|
|
56
|
+
{
|
|
57
|
+
"id": "auth-login",
|
|
58
|
+
"name": "User Login",
|
|
59
|
+
"category": "auth",
|
|
60
|
+
"hasTests": true,
|
|
61
|
+
"testFile": "auth/login.cy.ts"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"summary": {
|
|
65
|
+
"total": 25,
|
|
66
|
+
"withTests": 20,
|
|
67
|
+
"withoutTests": 5
|
|
68
|
+
},
|
|
69
|
+
"meta": {
|
|
70
|
+
"theme": "default",
|
|
71
|
+
"generatedAt": "2024-01-15T10:00:00Z"
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### List Blocks
|
|
78
|
+
`GET /api/v1/devtools/blocks`
|
|
79
|
+
|
|
80
|
+
Returns block registry metadata for development inspection.
|
|
81
|
+
|
|
82
|
+
**Response:**
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"success": true,
|
|
86
|
+
"data": {
|
|
87
|
+
"blocks": [
|
|
88
|
+
{
|
|
89
|
+
"slug": "hero-simple",
|
|
90
|
+
"name": "Simple Hero",
|
|
91
|
+
"category": "hero",
|
|
92
|
+
"hasPreview": true
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"categories": ["hero", "content", "cta", "faq"],
|
|
96
|
+
"total": 15
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### List Test Flows
|
|
102
|
+
`GET /api/v1/devtools/flows`
|
|
103
|
+
|
|
104
|
+
Returns test flows for end-to-end testing scenarios.
|
|
105
|
+
|
|
106
|
+
**Response:**
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"success": true,
|
|
110
|
+
"data": {
|
|
111
|
+
"flows": [
|
|
112
|
+
{
|
|
113
|
+
"id": "user-onboarding",
|
|
114
|
+
"name": "User Onboarding Flow",
|
|
115
|
+
"steps": ["signup", "verify-email", "complete-profile"],
|
|
116
|
+
"testFile": "flows/onboarding.cy.ts"
|
|
117
|
+
}
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### List Scheduled Actions
|
|
124
|
+
`GET /api/v1/devtools/scheduled-actions`
|
|
125
|
+
|
|
126
|
+
Returns scheduled actions with filtering and pagination.
|
|
127
|
+
|
|
128
|
+
**Query Parameters:**
|
|
129
|
+
- `status` (string, optional): Filter by status (pending, running, completed, failed)
|
|
130
|
+
- `action_type` (string, optional): Filter by action type
|
|
131
|
+
- `page` (number, optional): Page number. Default: 1
|
|
132
|
+
- `limit` (number, optional): Items per page. Default: 20
|
|
133
|
+
|
|
134
|
+
**Response:**
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"success": true,
|
|
138
|
+
"data": {
|
|
139
|
+
"actions": [
|
|
140
|
+
{
|
|
141
|
+
"id": "action_123",
|
|
142
|
+
"actionType": "send-email",
|
|
143
|
+
"status": "completed",
|
|
144
|
+
"payload": { "to": "user@example.com" },
|
|
145
|
+
"scheduledAt": "2024-01-15T10:00:00Z",
|
|
146
|
+
"completedAt": "2024-01-15T10:00:05Z",
|
|
147
|
+
"attempts": 1
|
|
148
|
+
}
|
|
149
|
+
],
|
|
150
|
+
"pagination": {
|
|
151
|
+
"total": 50,
|
|
152
|
+
"page": 1,
|
|
153
|
+
"limit": 20,
|
|
154
|
+
"totalPages": 3
|
|
155
|
+
},
|
|
156
|
+
"meta": {
|
|
157
|
+
"registeredActionTypes": ["send-email", "cleanup-expired", "sync-data"]
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Testing Information
|
|
164
|
+
`GET /api/v1/devtools/testing`
|
|
165
|
+
|
|
166
|
+
Returns testing configuration and utilities information.
|
|
167
|
+
|
|
168
|
+
**Response:**
|
|
169
|
+
```json
|
|
170
|
+
{
|
|
171
|
+
"success": true,
|
|
172
|
+
"data": {
|
|
173
|
+
"cypress": {
|
|
174
|
+
"baseUrl": "http://localhost:5173",
|
|
175
|
+
"specPattern": "cypress/e2e/**/*.cy.ts"
|
|
176
|
+
},
|
|
177
|
+
"testUsers": [
|
|
178
|
+
{ "email": "superadmin@test.com", "role": "superadmin" },
|
|
179
|
+
{ "email": "admin@test.com", "role": "admin" }
|
|
180
|
+
],
|
|
181
|
+
"coverage": {
|
|
182
|
+
"enabled": true,
|
|
183
|
+
"threshold": 80
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Error Responses
|
|
190
|
+
|
|
191
|
+
| Status | Description |
|
|
192
|
+
|--------|-------------|
|
|
193
|
+
| 400 | Bad Request - Missing or invalid path parameter |
|
|
194
|
+
| 401 | Unauthorized - Authentication required |
|
|
195
|
+
| 403 | Forbidden - Requires superadmin or developer role |
|
|
196
|
+
| 404 | Not Found - Document or resource not found |
|
|
197
|
+
| 500 | Server Error - Failed to read or process request |
|
|
198
|
+
|
|
199
|
+
## Security Notes
|
|
200
|
+
|
|
201
|
+
- Path traversal (`..`) is blocked to prevent unauthorized file access
|
|
202
|
+
- Only `.md` files are allowed for documentation endpoints
|
|
203
|
+
- All endpoints validate user role before processing
|
|
204
|
+
- DevTools API is only accessible in development environments by default
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools Features API
|
|
3
|
+
*
|
|
4
|
+
* GET /api/v1/devtools/features
|
|
5
|
+
*
|
|
6
|
+
* Returns the feature registry with test coverage information.
|
|
7
|
+
* Requires superadmin or developer user role.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { NextRequest, NextResponse } from 'next/server'
|
|
11
|
+
import { authenticateRequest } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
12
|
+
import {
|
|
13
|
+
canAccessDevtoolsApi,
|
|
14
|
+
createDevtoolsAccessDeniedResponse,
|
|
15
|
+
createDevtoolsUnauthorizedResponse,
|
|
16
|
+
} from '@nextsparkjs/core/lib/api/auth/devtools-auth'
|
|
17
|
+
import {
|
|
18
|
+
FEATURE_REGISTRY,
|
|
19
|
+
COVERAGE_SUMMARY,
|
|
20
|
+
} from '@nextsparkjs/registries/testing-registry'
|
|
21
|
+
|
|
22
|
+
export async function GET(request: NextRequest) {
|
|
23
|
+
// Authenticate request
|
|
24
|
+
const authResult = await authenticateRequest(request)
|
|
25
|
+
|
|
26
|
+
if (!authResult.success) {
|
|
27
|
+
return createDevtoolsUnauthorizedResponse()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Check DevTools access permission
|
|
31
|
+
if (!canAccessDevtoolsApi(authResult)) {
|
|
32
|
+
return createDevtoolsAccessDeniedResponse()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Return feature registry data
|
|
36
|
+
return NextResponse.json({
|
|
37
|
+
success: true,
|
|
38
|
+
data: {
|
|
39
|
+
features: Object.values(FEATURE_REGISTRY),
|
|
40
|
+
summary: {
|
|
41
|
+
total: COVERAGE_SUMMARY.features.total,
|
|
42
|
+
withTests: COVERAGE_SUMMARY.features.withTests,
|
|
43
|
+
withoutTests: COVERAGE_SUMMARY.features.withoutTests,
|
|
44
|
+
},
|
|
45
|
+
meta: {
|
|
46
|
+
theme: COVERAGE_SUMMARY.theme,
|
|
47
|
+
generatedAt: COVERAGE_SUMMARY.generatedAt,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function OPTIONS() {
|
|
54
|
+
return new NextResponse(null, {
|
|
55
|
+
status: 204,
|
|
56
|
+
headers: {
|
|
57
|
+
'Access-Control-Allow-Methods': 'GET, OPTIONS',
|
|
58
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-api-key',
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DevTools Flows API
|
|
3
|
+
*
|
|
4
|
+
* GET /api/v1/devtools/flows
|
|
5
|
+
*
|
|
6
|
+
* Returns the flow registry with test coverage information.
|
|
7
|
+
* Requires superadmin or developer user role.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { NextRequest, NextResponse } from 'next/server'
|
|
11
|
+
import { authenticateRequest } from '@nextsparkjs/core/lib/api/auth/dual-auth'
|
|
12
|
+
import {
|
|
13
|
+
canAccessDevtoolsApi,
|
|
14
|
+
createDevtoolsAccessDeniedResponse,
|
|
15
|
+
createDevtoolsUnauthorizedResponse,
|
|
16
|
+
} from '@nextsparkjs/core/lib/api/auth/devtools-auth'
|
|
17
|
+
import {
|
|
18
|
+
FLOW_REGISTRY,
|
|
19
|
+
COVERAGE_SUMMARY,
|
|
20
|
+
} from '@nextsparkjs/registries/testing-registry'
|
|
21
|
+
|
|
22
|
+
export async function GET(request: NextRequest) {
|
|
23
|
+
// Authenticate request
|
|
24
|
+
const authResult = await authenticateRequest(request)
|
|
25
|
+
|
|
26
|
+
if (!authResult.success) {
|
|
27
|
+
return createDevtoolsUnauthorizedResponse()
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Check DevTools access permission
|
|
31
|
+
if (!canAccessDevtoolsApi(authResult)) {
|
|
32
|
+
return createDevtoolsAccessDeniedResponse()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Return flow registry data
|
|
36
|
+
return NextResponse.json({
|
|
37
|
+
success: true,
|
|
38
|
+
data: {
|
|
39
|
+
flows: Object.values(FLOW_REGISTRY),
|
|
40
|
+
summary: {
|
|
41
|
+
total: COVERAGE_SUMMARY.flows.total,
|
|
42
|
+
withTests: COVERAGE_SUMMARY.flows.withTests,
|
|
43
|
+
withoutTests: COVERAGE_SUMMARY.flows.withoutTests,
|
|
44
|
+
},
|
|
45
|
+
meta: {
|
|
46
|
+
theme: COVERAGE_SUMMARY.theme,
|
|
47
|
+
generatedAt: COVERAGE_SUMMARY.generatedAt,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export async function OPTIONS() {
|
|
54
|
+
return new NextResponse(null, {
|
|
55
|
+
status: 204,
|
|
56
|
+
headers: {
|
|
57
|
+
'Access-Control-Allow-Methods': 'GET, OPTIONS',
|
|
58
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, x-api-key',
|
|
59
|
+
},
|
|
60
|
+
})
|
|
61
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Presets for DevTools
|
|
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/devtools',
|
|
11
|
+
summary: 'Development and debugging utilities',
|
|
12
|
+
presets: [
|
|
13
|
+
// Documentation
|
|
14
|
+
{
|
|
15
|
+
id: 'get-teams-docs',
|
|
16
|
+
title: 'Get Teams Docs',
|
|
17
|
+
description: 'Fetch Teams API documentation',
|
|
18
|
+
method: 'GET',
|
|
19
|
+
path: '/docs',
|
|
20
|
+
queryParams: {
|
|
21
|
+
path: 'packages/core/templates/app/api/v1/teams/docs.md'
|
|
22
|
+
},
|
|
23
|
+
tags: ['read', 'docs']
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: 'get-billing-docs',
|
|
27
|
+
title: 'Get Billing Docs',
|
|
28
|
+
description: 'Fetch Billing API documentation',
|
|
29
|
+
method: 'GET',
|
|
30
|
+
path: '/docs',
|
|
31
|
+
queryParams: {
|
|
32
|
+
path: 'packages/core/templates/app/api/v1/billing/docs.md'
|
|
33
|
+
},
|
|
34
|
+
tags: ['read', 'docs']
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
// Features
|
|
38
|
+
{
|
|
39
|
+
id: 'list-features',
|
|
40
|
+
title: 'List Features',
|
|
41
|
+
description: 'Get feature registry with test coverage',
|
|
42
|
+
method: 'GET',
|
|
43
|
+
path: '/features',
|
|
44
|
+
tags: ['read', 'testing']
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
// Blocks
|
|
48
|
+
{
|
|
49
|
+
id: 'list-devtools-blocks',
|
|
50
|
+
title: 'List Blocks Metadata',
|
|
51
|
+
description: 'Get block registry metadata',
|
|
52
|
+
method: 'GET',
|
|
53
|
+
path: '/blocks',
|
|
54
|
+
tags: ['read', 'blocks']
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
// Test Flows
|
|
58
|
+
{
|
|
59
|
+
id: 'list-flows',
|
|
60
|
+
title: 'List Test Flows',
|
|
61
|
+
description: 'Get available test flows',
|
|
62
|
+
method: 'GET',
|
|
63
|
+
path: '/flows',
|
|
64
|
+
tags: ['read', 'testing']
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
// Scheduled Actions
|
|
68
|
+
{
|
|
69
|
+
id: 'list-scheduled-actions',
|
|
70
|
+
title: 'List Scheduled Actions',
|
|
71
|
+
description: 'Get all scheduled actions',
|
|
72
|
+
method: 'GET',
|
|
73
|
+
path: '/scheduled-actions',
|
|
74
|
+
queryParams: {
|
|
75
|
+
page: '1',
|
|
76
|
+
limit: '20'
|
|
77
|
+
},
|
|
78
|
+
tags: ['read', 'scheduled-actions']
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: 'list-pending-actions',
|
|
82
|
+
title: 'List Pending Actions',
|
|
83
|
+
description: 'Filter scheduled actions by pending status',
|
|
84
|
+
method: 'GET',
|
|
85
|
+
path: '/scheduled-actions',
|
|
86
|
+
queryParams: {
|
|
87
|
+
status: 'pending'
|
|
88
|
+
},
|
|
89
|
+
tags: ['read', 'scheduled-actions', 'filter']
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 'list-failed-actions',
|
|
93
|
+
title: 'List Failed Actions',
|
|
94
|
+
description: 'Filter scheduled actions by failed status',
|
|
95
|
+
method: 'GET',
|
|
96
|
+
path: '/scheduled-actions',
|
|
97
|
+
queryParams: {
|
|
98
|
+
status: 'failed'
|
|
99
|
+
},
|
|
100
|
+
tags: ['read', 'scheduled-actions', 'filter']
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
// Testing
|
|
104
|
+
{
|
|
105
|
+
id: 'get-testing-info',
|
|
106
|
+
title: 'Get Testing Info',
|
|
107
|
+
description: 'Get testing configuration and utilities',
|
|
108
|
+
method: 'GET',
|
|
109
|
+
path: '/testing',
|
|
110
|
+
tags: ['read', 'testing']
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
})
|