@nextsparkjs/theme-default 0.1.0-beta.17 → 0.1.0-beta.170

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/api/ai/chat/stream/route.ts +4 -1
  2. package/api/ai/orchestrator/route.ts +10 -3
  3. package/api/ai/single-agent/route.ts +10 -3
  4. package/api/ai/usage/route.ts +4 -1
  5. package/blocks/benefits/component.tsx +4 -4
  6. package/blocks/cta-section/component.tsx +4 -4
  7. package/blocks/faq-accordion/component.tsx +2 -2
  8. package/blocks/features-grid/component.tsx +5 -5
  9. package/blocks/hero/component.tsx +2 -2
  10. package/blocks/hero/fields.ts +1 -1
  11. package/blocks/hero-with-form/component.tsx +7 -7
  12. package/blocks/hero-with-form/fields.ts +1 -1
  13. package/blocks/jumbotron/component.tsx +7 -7
  14. package/blocks/jumbotron/fields.ts +1 -1
  15. package/blocks/logo-cloud/component.tsx +6 -6
  16. package/blocks/logo-cloud/fields.ts +1 -1
  17. package/blocks/post-content/component.tsx +2 -2
  18. package/blocks/pricing-table/component.tsx +5 -5
  19. package/blocks/split-content/component.tsx +5 -5
  20. package/blocks/split-content/fields.ts +1 -1
  21. package/blocks/stats-counter/component.tsx +9 -9
  22. package/blocks/testimonials/component.tsx +4 -4
  23. package/blocks/testimonials/fields.ts +1 -1
  24. package/blocks/text-content/component.tsx +12 -10
  25. package/blocks/timeline/component.tsx +12 -12
  26. package/blocks/video-hero/component.tsx +7 -7
  27. package/blocks/video-hero/fields.ts +1 -1
  28. package/components/ai-chat/ChatPanel.tsx +7 -7
  29. package/components/ai-chat/Message.tsx +2 -2
  30. package/components/ai-chat/MessageInput.tsx +3 -3
  31. package/components/ai-chat/MessageList.tsx +3 -3
  32. package/components/ai-chat/TypingIndicator.tsx +2 -2
  33. package/config/app.config.ts +90 -62
  34. package/config/billing.config.ts +5 -10
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +22 -23
  38. package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
  39. package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
  40. package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
  41. package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
  42. package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
  43. package/docs/superadmin/01-setup/01-configuration.md +79 -0
  44. package/docs/superadmin/01-setup/02-deployment.md +82 -0
  45. package/docs/superadmin/02-management/01-users.md +83 -0
  46. package/docs/superadmin/03-integrations/01-langchain.md +139 -0
  47. package/emails/verify-email.ts +33 -0
  48. package/entities/customers/api/docs.md +107 -0
  49. package/entities/customers/api/presets.ts +80 -0
  50. package/entities/pages/api/docs.md +114 -0
  51. package/entities/pages/api/presets.ts +72 -0
  52. package/entities/posts/api/docs.md +120 -0
  53. package/entities/posts/api/presets.ts +74 -0
  54. package/entities/tasks/api/docs.md +126 -0
  55. package/entities/tasks/api/presets.ts +84 -0
  56. package/lib/selectors.ts +7 -4
  57. package/messages/de/admin.json +45 -0
  58. package/messages/en/admin.json +56 -0
  59. package/messages/en/navigation.json +2 -1
  60. package/messages/es/admin.json +56 -0
  61. package/messages/es/navigation.json +2 -1
  62. package/messages/fr/admin.json +45 -0
  63. package/messages/it/admin.json +45 -0
  64. package/messages/pt/admin.json +45 -0
  65. package/migrations/089_add_editor_team_role.sql +15 -23
  66. package/migrations/090_demo_users_teams.sql +11 -11
  67. package/migrations/091_greek_teams_billing.sql +15 -15
  68. package/migrations/093_pages_sample_data.sql +7 -7
  69. package/migrations/098_patterns_sample_data.sql +234 -0
  70. package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
  71. package/package.json +4 -3
  72. package/styles/globals.css +42 -0
  73. package/templates/(public)/page.tsx +1 -1
  74. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  75. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  76. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  77. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  78. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  79. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  80. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  81. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  82. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  83. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  84. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  85. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  86. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  94. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  95. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  96. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  97. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  98. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  99. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  100. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  101. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  102. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  113. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  114. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  115. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  116. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  117. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  118. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  119. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  120. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  121. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  124. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  125. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  126. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  127. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  128. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  129. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  130. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  131. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  132. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  133. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  134. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  135. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  136. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  142. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  143. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  144. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  145. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  146. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  151. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  152. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  153. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  154. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  155. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  156. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  157. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  158. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  159. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  160. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  161. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  162. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  163. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  164. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  165. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  166. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  167. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  168. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  169. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  170. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  171. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  172. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  175. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  176. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  177. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  178. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  179. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  180. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  181. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  182. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  184. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  185. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  190. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  191. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  192. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  193. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  194. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  195. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  196. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  197. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  198. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  199. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  200. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  201. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  202. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  203. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  204. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  205. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  206. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  207. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  208. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  209. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  210. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  211. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  212. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  213. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  214. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  215. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  216. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  217. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  218. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  219. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  222. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  223. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  224. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  225. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  226. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  227. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  230. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  231. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  232. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  233. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  234. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  235. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  236. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  237. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  240. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  241. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  242. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  243. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  244. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  245. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  246. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  247. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  248. package/tests/cypress/fixtures/blocks.json +218 -0
  249. package/tests/cypress/fixtures/entities.json +87 -0
  250. package/tests/cypress/fixtures/page-builder.json +21 -0
  251. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  252. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  253. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  254. package/tests/cypress/src/components/EntityForm.ts +375 -0
  255. package/tests/cypress/src/components/EntityList.ts +389 -0
  256. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  257. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  258. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  259. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  260. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  261. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  262. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  263. package/tests/cypress/src/components/index.ts +21 -0
  264. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  265. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  266. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  267. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  268. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  269. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  270. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  271. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  272. package/tests/cypress/src/controllers/index.js +25 -0
  273. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  274. package/tests/cypress/src/core/BasePOM.ts +33 -0
  275. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  276. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  277. package/tests/cypress/src/core/index.ts +14 -0
  278. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  279. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  280. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  281. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  282. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  283. package/tests/cypress/src/entities/index.ts +16 -0
  284. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  285. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  286. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  287. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  288. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  289. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  290. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  291. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  292. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  293. package/tests/cypress/src/features/index.ts +28 -0
  294. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  295. package/tests/cypress/src/index.ts +101 -0
  296. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  297. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  298. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  299. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  300. package/tests/cypress/src/pages/index.js +5 -0
  301. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  302. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  303. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  304. package/tests/cypress/src/pages/public/index.js +6 -0
  305. package/tests/cypress/src/selectors.ts +46 -0
  306. package/tests/cypress/src/session-helpers.ts +518 -0
  307. package/tests/cypress/support/doc-commands.ts +260 -0
  308. package/tests/cypress/support/e2e.ts +90 -0
  309. package/tests/cypress.config.ts +178 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  312. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  313. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  314. package/tests/jest/__mocks__/jose.js +22 -0
  315. package/tests/jest/__mocks__/next/image.js +15 -0
  316. package/tests/jest/__mocks__/next-server.js +56 -0
  317. package/tests/jest/components/post-header.test.tsx +377 -0
  318. package/tests/jest/jest.config.cjs +154 -0
  319. package/tests/jest/langchain/COVERAGE.md +372 -0
  320. package/tests/jest/langchain/guardrails.test.ts +465 -0
  321. package/tests/jest/langchain/streaming.test.ts +370 -0
  322. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  323. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  324. package/tests/jest/langchain/tracer.test.ts +823 -0
  325. package/tests/jest/services/tasks.service.test.ts +707 -0
  326. package/tests/jest/setup.ts +170 -0
  327. package/tests/jest/tsconfig.jest.json +6 -0
  328. package/tests/jest/validation/categories.test.ts +429 -0
  329. package/tests/jest/validation/posts.test.ts +546 -0
  330. package/tests/tsconfig.json +21 -0
  331. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  332. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Documentation Commands for Cypress
3
+ *
4
+ * Custom commands for generating documentation videos with narration.
5
+ * Uses cypress-slow-down for controlled execution speed.
6
+ *
7
+ * @example
8
+ * // In your test file:
9
+ * import '../support/doc-commands'
10
+ *
11
+ * describe('Tutorial: Login', { tags: ['@doc'] }, () => {
12
+ * before(() => {
13
+ * cy.startDocMode(800)
14
+ * })
15
+ *
16
+ * it('shows how to login', () => {
17
+ * cy.narrate('First, navigate to the login page')
18
+ * cy.visit('/login')
19
+ * })
20
+ * })
21
+ */
22
+
23
+ import { slowCypressDown } from 'cypress-slow-down'
24
+ import 'cypress-slow-down/commands'
25
+
26
+ // Store narrations for extraction
27
+ interface NarrationEntry {
28
+ timestamp: number
29
+ time: string // "M:SS" format from start (for subtitles)
30
+ timeMs: number // Milliseconds from start
31
+ stepNumber: number
32
+ text: string
33
+ highlight?: string
34
+ duration: number
35
+ chapter?: string
36
+ }
37
+
38
+ let narrations: NarrationEntry[] = []
39
+ let stepCounter = 0
40
+ let docModeActive = false
41
+ let startTime = 0 // Timestamp when recording started
42
+
43
+ /**
44
+ * Format milliseconds to M:SS or MM:SS string
45
+ */
46
+ function formatTime(ms: number): string {
47
+ const totalSeconds = Math.floor(ms / 1000)
48
+ const minutes = Math.floor(totalSeconds / 60)
49
+ const seconds = totalSeconds % 60
50
+ return `${minutes}:${seconds.toString().padStart(2, '0')}`
51
+ }
52
+
53
+ // Declare custom commands
54
+ declare global {
55
+ namespace Cypress {
56
+ interface Chainable {
57
+ /**
58
+ * Start documentation mode with specified delay between commands
59
+ * @param delayMs - Milliseconds to wait between each command (default: 800)
60
+ */
61
+ startDocMode(delayMs?: number): Chainable<void>
62
+
63
+ /**
64
+ * End documentation mode and save narrations
65
+ */
66
+ endDocMode(): Chainable<void>
67
+
68
+ /**
69
+ * Add narration text for the current step
70
+ * @param text - The narration text to display/speak
71
+ * @param options - Optional settings like highlight selector
72
+ */
73
+ narrate(text: string, options?: { highlight?: string; pause?: number }): Chainable<void>
74
+
75
+ /**
76
+ * Add a chapter/section marker in the narration
77
+ * @param title - Chapter title
78
+ */
79
+ chapter(title: string): Chainable<void>
80
+
81
+ /**
82
+ * Pause for emphasis (used after important actions)
83
+ * @param ms - Milliseconds to pause
84
+ */
85
+ pauseForEmphasis(ms?: number): Chainable<void>
86
+
87
+ /**
88
+ * Highlight an element visually (adds temporary outline)
89
+ * @param selector - Element selector to highlight
90
+ */
91
+ highlightElement(selector: string): Chainable<void>
92
+ }
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Calculate reading time based on text length
98
+ * Average reading speed: ~150-180 words per minute for narration
99
+ * We use ~4 characters = 1 syllable, ~1.5 syllables/second for clear speech
100
+ */
101
+ function calculateNarrationDuration(text: string): number {
102
+ const words = text.split(/\s+/).length
103
+ const wordsPerSecond = 2.5 // Slow, clear narration speed
104
+ const baseTime = (words / wordsPerSecond) * 1000
105
+ // Add minimum time and buffer
106
+ return Math.max(1500, baseTime + 500)
107
+ }
108
+
109
+ /**
110
+ * Start documentation mode - slows down Cypress execution
111
+ */
112
+ Cypress.Commands.add('startDocMode', (delayMs = 800) => {
113
+ docModeActive = true
114
+ narrations = []
115
+ stepCounter = 0
116
+ startTime = Date.now() // Record start time
117
+
118
+ // Activate slow mode
119
+ slowCypressDown(delayMs)
120
+
121
+ // Log start marker (visible in video)
122
+ cy.log('🎬 **DOCUMENTATION MODE STARTED**')
123
+
124
+ // Add initial narration entry
125
+ narrations.push({
126
+ timestamp: startTime,
127
+ time: '0:00',
128
+ timeMs: 0,
129
+ stepNumber: 0,
130
+ text: '--- Documentation Recording Started ---',
131
+ duration: 0,
132
+ })
133
+ })
134
+
135
+ /**
136
+ * End documentation mode and save narrations to file
137
+ */
138
+ Cypress.Commands.add('endDocMode', () => {
139
+ if (!docModeActive) return
140
+
141
+ cy.log('🎬 **DOCUMENTATION MODE ENDED**')
142
+
143
+ // Add final narration entry
144
+ const now = Date.now()
145
+ const elapsedMs = now - startTime
146
+ narrations.push({
147
+ timestamp: now,
148
+ time: formatTime(elapsedMs),
149
+ timeMs: elapsedMs,
150
+ stepNumber: stepCounter + 1,
151
+ text: '--- Documentation Recording Ended ---',
152
+ duration: 0,
153
+ })
154
+
155
+ // Save narrations to file via task
156
+ const specName = Cypress.spec.name.replace('.cy.ts', '').replace('.cy.js', '')
157
+ cy.task('saveNarrations', {
158
+ specName,
159
+ narrations,
160
+ totalDuration: formatTime(elapsedMs),
161
+ totalDurationMs: elapsedMs,
162
+ }, { log: false })
163
+
164
+ cy.log(`🎬 **Total Duration: ${formatTime(elapsedMs)}**`)
165
+
166
+ docModeActive = false
167
+ narrations = []
168
+ stepCounter = 0
169
+ startTime = 0
170
+ })
171
+
172
+ /**
173
+ * Add narration for current step
174
+ */
175
+ Cypress.Commands.add('narrate', (text: string, options?: { highlight?: string; pause?: number }) => {
176
+ stepCounter++
177
+ const duration = calculateNarrationDuration(text)
178
+ const now = Date.now()
179
+ const elapsedMs = now - startTime
180
+ const timeStr = formatTime(elapsedMs)
181
+
182
+ // Store narration data
183
+ narrations.push({
184
+ timestamp: now,
185
+ time: timeStr,
186
+ timeMs: elapsedMs,
187
+ stepNumber: stepCounter,
188
+ text,
189
+ highlight: options?.highlight,
190
+ duration,
191
+ })
192
+
193
+ // Visual feedback in Cypress runner (will show in video)
194
+ cy.log(`🎙️ **[${timeStr}]** ${text}`)
195
+
196
+ // If highlight specified, add visual indicator
197
+ if (options?.highlight) {
198
+ cy.highlightElement(options.highlight)
199
+ }
200
+
201
+ // Wait for narration duration (so video has time for the narration)
202
+ const waitTime = options?.pause ?? duration
203
+ cy.wait(waitTime, { log: false })
204
+ })
205
+
206
+ /**
207
+ * Add chapter marker
208
+ */
209
+ Cypress.Commands.add('chapter', (title: string) => {
210
+ stepCounter++
211
+ const now = Date.now()
212
+ const elapsedMs = now - startTime
213
+ const timeStr = formatTime(elapsedMs)
214
+
215
+ narrations.push({
216
+ timestamp: now,
217
+ time: timeStr,
218
+ timeMs: elapsedMs,
219
+ stepNumber: stepCounter,
220
+ text: `=== ${title} ===`,
221
+ chapter: title,
222
+ duration: 2000,
223
+ })
224
+
225
+ // Large visual marker
226
+ cy.log(`📖 **[${timeStr}] ━━━ ${title.toUpperCase()} ━━━**`)
227
+ cy.wait(2000, { log: false })
228
+ })
229
+
230
+ /**
231
+ * Pause for emphasis after important actions
232
+ */
233
+ Cypress.Commands.add('pauseForEmphasis', (ms = 1500) => {
234
+ cy.log('⏸️ *pause*')
235
+ cy.wait(ms, { log: false })
236
+ })
237
+
238
+ /**
239
+ * Highlight an element with a visual indicator
240
+ */
241
+ Cypress.Commands.add('highlightElement', (selector: string) => {
242
+ cy.get(selector).then($el => {
243
+ // Add highlight class
244
+ $el.css({
245
+ outline: '3px solid #ff6b6b',
246
+ outlineOffset: '2px',
247
+ transition: 'outline 0.3s ease',
248
+ })
249
+
250
+ // Remove highlight after a delay
251
+ cy.wait(800, { log: false }).then(() => {
252
+ $el.css({
253
+ outline: 'none',
254
+ outlineOffset: '0',
255
+ })
256
+ })
257
+ })
258
+ })
259
+
260
+ export {}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Cypress E2E Support File for Theme
3
+ *
4
+ * This file is used when running tests in npm mode (outside monorepo).
5
+ * In monorepo mode, the core support file is used instead via cypress.config.ts.
6
+ *
7
+ * For documentation video commands, install cypress-slow-down:
8
+ * pnpm add -D cypress-slow-down
9
+ * Then uncomment the doc-commands import below.
10
+ */
11
+
12
+ import '@testing-library/cypress/add-commands'
13
+
14
+ // Import @cypress/grep for test filtering by tags
15
+ // v5.x uses named export { register }
16
+ import { register as registerCypressGrep } from '@cypress/grep'
17
+ registerCypressGrep()
18
+
19
+ // Doc commands are optional (require cypress-slow-down)
20
+ // Uncomment if you have cypress-slow-down installed:
21
+ // import './doc-commands'
22
+
23
+ // Global error handling
24
+ Cypress.on('uncaught:exception', (err) => {
25
+ // Ignore React hydration errors
26
+ if (err.message.includes('Hydration')) {
27
+ return false
28
+ }
29
+ // Ignore ResizeObserver errors
30
+ if (err.message.includes('ResizeObserver')) {
31
+ return false
32
+ }
33
+ return true
34
+ })
35
+
36
+ // Global before hook
37
+ beforeEach(() => {
38
+ cy.clearCookies()
39
+ cy.clearLocalStorage()
40
+ })
41
+
42
+ // Type declarations for @cypress/grep and custom commands
43
+ declare global {
44
+ namespace Cypress {
45
+ interface Chainable {
46
+ /**
47
+ * Custom command to make API requests with better error handling
48
+ */
49
+ apiRequest(options: Partial<Cypress.RequestOptions>): Chainable<Cypress.Response<any>>
50
+
51
+ /**
52
+ * Login command for authenticated tests
53
+ */
54
+ login(email: string, password: string): Chainable<void>
55
+ }
56
+ interface SuiteConfigOverrides {
57
+ tags?: string | string[]
58
+ }
59
+ interface TestConfigOverrides {
60
+ tags?: string | string[]
61
+ }
62
+ }
63
+ }
64
+
65
+ // Custom API request command
66
+ Cypress.Commands.add('apiRequest', (options) => {
67
+ const defaultOptions = {
68
+ failOnStatusCode: false,
69
+ timeout: 15000,
70
+ headers: {
71
+ 'Content-Type': 'application/json',
72
+ ...options.headers
73
+ }
74
+ }
75
+ return cy.request({
76
+ ...defaultOptions,
77
+ ...options
78
+ })
79
+ })
80
+
81
+ // Login command for authenticated tests
82
+ Cypress.Commands.add('login', (email: string, password: string) => {
83
+ cy.session([email, password], () => {
84
+ cy.visit('/login')
85
+ cy.get('[data-testid="email-input"], input[name="email"]').type(email)
86
+ cy.get('[data-testid="password-input"], input[name="password"]').type(password)
87
+ cy.get('[data-testid="submit-button"], button[type="submit"]').click()
88
+ cy.url().should('include', '/dashboard')
89
+ })
90
+ })
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Cypress Configuration for Default Theme
3
+ *
4
+ * This config works in both monorepo and npm mode.
5
+ * Run with: pnpm cy:open or pnpm cy:run
6
+ *
7
+ * Filter by tags: pnpm cy:tags "@smoke" or pnpm cy:run --env grepTags="@smoke"
8
+ */
9
+
10
+ import { defineConfig } from 'cypress'
11
+ import path from 'path'
12
+ import fs from 'fs'
13
+ import { fileURLToPath } from 'url'
14
+
15
+ // ESM-compatible __dirname
16
+ const __filename = fileURLToPath(import.meta.url)
17
+ const __dirname = path.dirname(__filename)
18
+
19
+ // Paths relative to this config file
20
+ const themeRoot = path.resolve(__dirname, '..')
21
+ const narrationsOutputDir = path.join(__dirname, 'cypress/videos/narrations')
22
+
23
+ // Detect if running in npm mode vs monorepo
24
+ // In monorepo: themes/default/tests -> 3 levels up to repo root
25
+ // In npm mode: contents/themes/default/tests -> 4 levels up to project root
26
+ const monorepoRoot = path.resolve(__dirname, '../../..')
27
+ const npmRoot = path.resolve(__dirname, '../../../..')
28
+ const isNpmMode = !fs.existsSync(path.join(monorepoRoot, 'packages/core'))
29
+ const projectRoot = isNpmMode ? npmRoot : monorepoRoot
30
+
31
+ // Load environment variables
32
+ // In monorepo: apps/dev/.env | In npm mode: .env at project root
33
+ import dotenv from 'dotenv'
34
+ const envPath = isNpmMode
35
+ ? path.join(projectRoot, '.env')
36
+ : path.join(projectRoot, 'apps/dev/.env')
37
+ dotenv.config({ path: envPath })
38
+
39
+ // Server port (from .env or default 3000)
40
+ const port = process.env.PORT || 3000
41
+
42
+ // Extract CYPRESS_ prefixed variables from process.env
43
+ // Cypress auto-strips the CYPRESS_ prefix when accessing via Cypress.env()
44
+ const cypressEnvVars: Record<string, string> = {}
45
+ Object.entries(process.env).forEach(([key, value]) => {
46
+ if (key.startsWith('CYPRESS_') && value) {
47
+ // Remove CYPRESS_ prefix for Cypress.env() access
48
+ const cypressKey = key.replace('CYPRESS_', '')
49
+ cypressEnvVars[cypressKey] = value
50
+ }
51
+ })
52
+
53
+ export default defineConfig({
54
+ e2e: {
55
+ // Base URL for the application
56
+ baseUrl: `http://localhost:${port}`,
57
+
58
+ // Spec patterns: theme tests only
59
+ // Note: core e2e tests were removed as they were empty
60
+ specPattern: [
61
+ path.join(__dirname, 'cypress/e2e/**/*.cy.{js,ts}'),
62
+ ],
63
+
64
+ // Support file (always theme-local)
65
+ supportFile: path.join(__dirname, 'cypress/support/e2e.ts'),
66
+
67
+ // Fixtures folder (theme-specific)
68
+ fixturesFolder: path.join(__dirname, 'cypress/fixtures'),
69
+
70
+ // Output folders (theme-specific)
71
+ downloadsFolder: path.join(__dirname, 'cypress/downloads'),
72
+ screenshotsFolder: path.join(__dirname, 'cypress/screenshots'),
73
+ videosFolder: path.join(__dirname, 'cypress/videos'),
74
+
75
+ // Viewport settings
76
+ viewportWidth: 1280,
77
+ viewportHeight: 720,
78
+
79
+ // Video and screenshot settings
80
+ video: true,
81
+ screenshotOnRunFailure: true,
82
+
83
+ // Timeouts
84
+ defaultCommandTimeout: 10000,
85
+ requestTimeout: 10000,
86
+ responseTimeout: 10000,
87
+ pageLoadTimeout: 30000,
88
+
89
+ // Browser settings
90
+ chromeWebSecurity: false,
91
+
92
+ // Test isolation
93
+ testIsolation: true,
94
+
95
+ // Retry settings
96
+ retries: {
97
+ runMode: 1,
98
+ openMode: 0,
99
+ },
100
+
101
+ // Environment variables
102
+ env: {
103
+ // Spread CYPRESS_ prefixed vars from .env (e.g., CYPRESS_DEVELOPER_EMAIL -> DEVELOPER_EMAIL)
104
+ ...cypressEnvVars,
105
+
106
+ // Theme info
107
+ ACTIVE_THEME: 'default',
108
+ THEME_PATH: themeRoot,
109
+
110
+ // Feature flags
111
+ ENABLE_ALLURE: true,
112
+
113
+ // Allure reporting
114
+ allureResultsPath: path.join(__dirname, 'cypress/allure-results'),
115
+
116
+ // API settings
117
+ API_URL: `http://localhost:${port}/api`,
118
+ API_BASE_URL: `http://localhost:${port}`,
119
+
120
+ // @cypress/grep - filter specs by tags
121
+ grepFilterSpecs: true,
122
+ grepOmitFiltered: true,
123
+ },
124
+
125
+ async setupNodeEvents(on, config) {
126
+ // Allure plugin setup (allure-cypress)
127
+ const { allureCypress } = await import('allure-cypress/reporter')
128
+ allureCypress(on, config, {
129
+ resultsDir: path.join(__dirname, 'cypress/allure-results'),
130
+ })
131
+
132
+ // @cypress/grep plugin for test filtering by tags
133
+ // v5.x uses named export { plugin } from '@cypress/grep/plugin'
134
+ const { plugin: grepPlugin } = await import('@cypress/grep/plugin')
135
+ grepPlugin(config)
136
+
137
+ // Documentation video tasks
138
+ on('task', {
139
+ /**
140
+ * Save narrations to JSON file for post-processing
141
+ */
142
+ saveNarrations({ specName, narrations }: { specName: string; narrations: unknown[] }) {
143
+ // Ensure output directory exists
144
+ if (!fs.existsSync(narrationsOutputDir)) {
145
+ fs.mkdirSync(narrationsOutputDir, { recursive: true })
146
+ }
147
+
148
+ const filename = `${specName}-narrations.json`
149
+ const filepath = path.join(narrationsOutputDir, filename)
150
+
151
+ fs.writeFileSync(filepath, JSON.stringify(narrations, null, 2))
152
+ console.log(`📝 Narrations saved to: ${filepath}`)
153
+
154
+ return null
155
+ },
156
+
157
+ /**
158
+ * Add narration entry (called per narration)
159
+ */
160
+ addNarration(narration: unknown) {
161
+ // This could be used for real-time streaming to a narration service
162
+ console.log('🎙️ Narration:', narration)
163
+ return null
164
+ },
165
+ })
166
+
167
+ return config
168
+ },
169
+ },
170
+
171
+ // Component testing (future use)
172
+ component: {
173
+ devServer: {
174
+ framework: 'next',
175
+ bundler: 'webpack',
176
+ },
177
+ },
178
+ })
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Mock for @nextsparkjs/core/components/ui/badge
3
+ */
4
+ const React = require('react')
5
+
6
+ const Badge = ({ children, variant = 'default', className = '', ...props }) => {
7
+ return React.createElement('span', {
8
+ className: `badge badge-${variant} ${className}`.trim(),
9
+ 'data-testid': 'badge',
10
+ ...props,
11
+ }, children)
12
+ }
13
+
14
+ module.exports = { Badge }
15
+ module.exports.Badge = Badge
16
+ module.exports.default = Badge
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Mock for @nextsparkjs/core/lib/db
3
+ */
4
+
5
+ const queryWithRLS = jest.fn().mockResolvedValue([])
6
+ const mutateWithRLS = jest.fn().mockResolvedValue({ rowCount: 1 })
7
+
8
+ module.exports = {
9
+ queryWithRLS,
10
+ mutateWithRLS,
11
+ }