@l4yercak3/cli 1.3.1 → 2.0.0-alpha.0

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 (357) hide show
  1. package/README.md +10 -220
  2. package/dist/api/client.d.ts +12 -0
  3. package/dist/api/client.d.ts.map +1 -0
  4. package/dist/api/client.js +37 -0
  5. package/dist/api/client.js.map +1 -0
  6. package/dist/api/platform.d.ts +161 -0
  7. package/dist/api/platform.d.ts.map +1 -0
  8. package/dist/api/platform.js +70 -0
  9. package/dist/api/platform.js.map +1 -0
  10. package/dist/bin/sevenlayers.d.ts +3 -0
  11. package/dist/bin/sevenlayers.d.ts.map +1 -0
  12. package/dist/bin/sevenlayers.js +198 -0
  13. package/dist/bin/sevenlayers.js.map +1 -0
  14. package/dist/commands/agent/catalog.d.ts +5 -0
  15. package/dist/commands/agent/catalog.d.ts.map +1 -0
  16. package/dist/commands/agent/catalog.js +142 -0
  17. package/dist/commands/agent/catalog.js.map +1 -0
  18. package/dist/commands/agent/drift.d.ts +5 -0
  19. package/dist/commands/agent/drift.d.ts.map +1 -0
  20. package/dist/commands/agent/drift.js +113 -0
  21. package/dist/commands/agent/drift.js.map +1 -0
  22. package/dist/commands/agent/init.d.ts +5 -0
  23. package/dist/commands/agent/init.d.ts.map +1 -0
  24. package/dist/commands/agent/init.js +75 -0
  25. package/dist/commands/agent/init.js.map +1 -0
  26. package/dist/commands/agent/permissions.d.ts +5 -0
  27. package/dist/commands/agent/permissions.d.ts.map +1 -0
  28. package/dist/commands/agent/permissions.js +88 -0
  29. package/dist/commands/agent/permissions.js.map +1 -0
  30. package/dist/commands/agent/runner.d.ts +14 -0
  31. package/dist/commands/agent/runner.d.ts.map +1 -0
  32. package/dist/commands/agent/runner.js +59 -0
  33. package/dist/commands/agent/runner.js.map +1 -0
  34. package/dist/commands/agent/shared.d.ts +13 -0
  35. package/dist/commands/agent/shared.d.ts.map +1 -0
  36. package/dist/commands/agent/shared.js +31 -0
  37. package/dist/commands/agent/shared.js.map +1 -0
  38. package/dist/commands/agent/template.d.ts +5 -0
  39. package/dist/commands/agent/template.d.ts.map +1 -0
  40. package/dist/commands/agent/template.js +104 -0
  41. package/dist/commands/agent/template.js.map +1 -0
  42. package/dist/commands/app/connect.d.ts +7 -0
  43. package/dist/commands/app/connect.d.ts.map +1 -0
  44. package/dist/commands/app/connect.js +12 -0
  45. package/dist/commands/app/connect.js.map +1 -0
  46. package/dist/commands/app/init.d.ts +7 -0
  47. package/dist/commands/app/init.d.ts.map +1 -0
  48. package/dist/commands/app/init.js +12 -0
  49. package/dist/commands/app/init.js.map +1 -0
  50. package/dist/commands/app/link.d.ts +3 -0
  51. package/dist/commands/app/link.d.ts.map +1 -0
  52. package/dist/commands/app/link.js +92 -0
  53. package/dist/commands/app/link.js.map +1 -0
  54. package/dist/commands/app/pages.d.ts +15 -0
  55. package/dist/commands/app/pages.d.ts.map +1 -0
  56. package/dist/commands/app/pages.js +180 -0
  57. package/dist/commands/app/pages.js.map +1 -0
  58. package/dist/commands/app/register.d.ts +3 -0
  59. package/dist/commands/app/register.d.ts.map +1 -0
  60. package/dist/commands/app/register.js +120 -0
  61. package/dist/commands/app/register.js.map +1 -0
  62. package/dist/commands/app/remote.d.ts +14 -0
  63. package/dist/commands/app/remote.d.ts.map +1 -0
  64. package/dist/commands/app/remote.js +44 -0
  65. package/dist/commands/app/remote.js.map +1 -0
  66. package/dist/commands/app/setup.d.ts +3 -0
  67. package/dist/commands/app/setup.d.ts.map +1 -0
  68. package/dist/commands/app/setup.js +299 -0
  69. package/dist/commands/app/setup.js.map +1 -0
  70. package/dist/commands/app/shared.d.ts +9 -0
  71. package/dist/commands/app/shared.d.ts.map +1 -0
  72. package/dist/commands/app/shared.js +122 -0
  73. package/dist/commands/app/shared.js.map +1 -0
  74. package/dist/commands/app/sync.d.ts +7 -0
  75. package/dist/commands/app/sync.d.ts.map +1 -0
  76. package/dist/commands/app/sync.js +107 -0
  77. package/dist/commands/app/sync.js.map +1 -0
  78. package/dist/commands/booking/check.d.ts +3 -0
  79. package/dist/commands/booking/check.d.ts.map +1 -0
  80. package/dist/commands/booking/check.js +68 -0
  81. package/dist/commands/booking/check.js.map +1 -0
  82. package/dist/commands/booking/setup.d.ts +3 -0
  83. package/dist/commands/booking/setup.d.ts.map +1 -0
  84. package/dist/commands/booking/setup.js +95 -0
  85. package/dist/commands/booking/setup.js.map +1 -0
  86. package/dist/commands/booking/shared.d.ts +31 -0
  87. package/dist/commands/booking/shared.d.ts.map +1 -0
  88. package/dist/commands/booking/shared.js +112 -0
  89. package/dist/commands/booking/shared.js.map +1 -0
  90. package/dist/commands/booking/smoke.d.ts +3 -0
  91. package/dist/commands/booking/smoke.d.ts.map +1 -0
  92. package/dist/commands/booking/smoke.js +101 -0
  93. package/dist/commands/booking/smoke.js.map +1 -0
  94. package/dist/commands/cms/bind.d.ts +3 -0
  95. package/dist/commands/cms/bind.d.ts.map +1 -0
  96. package/dist/commands/cms/bind.js +212 -0
  97. package/dist/commands/cms/bind.js.map +1 -0
  98. package/dist/commands/cms/content.d.ts +40 -0
  99. package/dist/commands/cms/content.d.ts.map +1 -0
  100. package/dist/commands/cms/content.js +169 -0
  101. package/dist/commands/cms/content.js.map +1 -0
  102. package/dist/commands/cms/doctor.d.ts +3 -0
  103. package/dist/commands/cms/doctor.d.ts.map +1 -0
  104. package/dist/commands/cms/doctor.js +69 -0
  105. package/dist/commands/cms/doctor.js.map +1 -0
  106. package/dist/commands/cms/migrate.d.ts +3 -0
  107. package/dist/commands/cms/migrate.d.ts.map +1 -0
  108. package/dist/commands/cms/migrate.js +78 -0
  109. package/dist/commands/cms/migrate.js.map +1 -0
  110. package/dist/commands/cms/registry.d.ts +3 -0
  111. package/dist/commands/cms/registry.d.ts.map +1 -0
  112. package/dist/commands/cms/registry.js +161 -0
  113. package/dist/commands/cms/registry.js.map +1 -0
  114. package/dist/commands/cms/seed.d.ts +3 -0
  115. package/dist/commands/cms/seed.d.ts.map +1 -0
  116. package/dist/commands/cms/seed.js +102 -0
  117. package/dist/commands/cms/seed.js.map +1 -0
  118. package/dist/commands/cms/shared.d.ts +22 -0
  119. package/dist/commands/cms/shared.d.ts.map +1 -0
  120. package/dist/commands/cms/shared.js +82 -0
  121. package/dist/commands/cms/shared.js.map +1 -0
  122. package/dist/commands/doctor/target.d.ts +3 -0
  123. package/dist/commands/doctor/target.d.ts.map +1 -0
  124. package/dist/commands/doctor/target.js +46 -0
  125. package/dist/commands/doctor/target.js.map +1 -0
  126. package/dist/commands/env/list.d.ts +3 -0
  127. package/dist/commands/env/list.d.ts.map +1 -0
  128. package/dist/commands/env/list.js +28 -0
  129. package/dist/commands/env/list.js.map +1 -0
  130. package/dist/commands/env/set.d.ts +3 -0
  131. package/dist/commands/env/set.d.ts.map +1 -0
  132. package/dist/commands/env/set.js +36 -0
  133. package/dist/commands/env/set.js.map +1 -0
  134. package/dist/commands/env/use.d.ts +3 -0
  135. package/dist/commands/env/use.d.ts.map +1 -0
  136. package/dist/commands/env/use.js +15 -0
  137. package/dist/commands/env/use.js.map +1 -0
  138. package/dist/commands/legacy/connect.d.ts +3 -0
  139. package/dist/commands/legacy/connect.d.ts.map +1 -0
  140. package/dist/commands/legacy/connect.js +8 -0
  141. package/dist/commands/legacy/connect.js.map +1 -0
  142. package/dist/commands/legacy/pages.d.ts +3 -0
  143. package/dist/commands/legacy/pages.d.ts.map +1 -0
  144. package/dist/commands/legacy/pages.js +16 -0
  145. package/dist/commands/legacy/pages.js.map +1 -0
  146. package/dist/commands/legacy/spread.d.ts +3 -0
  147. package/dist/commands/legacy/spread.d.ts.map +1 -0
  148. package/dist/commands/legacy/spread.js +8 -0
  149. package/dist/commands/legacy/spread.js.map +1 -0
  150. package/dist/commands/legacy/sync.d.ts +3 -0
  151. package/dist/commands/legacy/sync.d.ts.map +1 -0
  152. package/dist/commands/legacy/sync.js +8 -0
  153. package/dist/commands/legacy/sync.js.map +1 -0
  154. package/dist/config/env-diff.d.ts +10 -0
  155. package/dist/config/env-diff.d.ts.map +1 -0
  156. package/dist/config/env-diff.js +24 -0
  157. package/dist/config/env-diff.js.map +1 -0
  158. package/dist/config/env-parser.d.ts +20 -0
  159. package/dist/config/env-parser.d.ts.map +1 -0
  160. package/dist/config/env-parser.js +70 -0
  161. package/dist/config/env-parser.js.map +1 -0
  162. package/dist/config/env-writer.d.ts +22 -0
  163. package/dist/config/env-writer.d.ts.map +1 -0
  164. package/dist/config/env-writer.js +172 -0
  165. package/dist/config/env-writer.js.map +1 -0
  166. package/dist/config/profile-store.d.ts +29 -0
  167. package/dist/config/profile-store.d.ts.map +1 -0
  168. package/dist/config/profile-store.js +257 -0
  169. package/dist/config/profile-store.js.map +1 -0
  170. package/dist/core/args.d.ts +11 -0
  171. package/dist/core/args.d.ts.map +1 -0
  172. package/dist/core/args.js +106 -0
  173. package/dist/core/args.js.map +1 -0
  174. package/dist/core/colors.d.ts +6 -0
  175. package/dist/core/colors.d.ts.map +1 -0
  176. package/dist/core/colors.js +29 -0
  177. package/dist/core/colors.js.map +1 -0
  178. package/dist/safety/target-guard.d.ts +16 -0
  179. package/dist/safety/target-guard.d.ts.map +1 -0
  180. package/dist/safety/target-guard.js +55 -0
  181. package/dist/safety/target-guard.js.map +1 -0
  182. package/dist/testing/booking-smoke.d.ts +17 -0
  183. package/dist/testing/booking-smoke.d.ts.map +1 -0
  184. package/dist/testing/booking-smoke.js +43 -0
  185. package/dist/testing/booking-smoke.js.map +1 -0
  186. package/dist/tests/agent-commands.test.d.ts +2 -0
  187. package/dist/tests/agent-commands.test.d.ts.map +1 -0
  188. package/dist/tests/agent-commands.test.js +180 -0
  189. package/dist/tests/agent-commands.test.js.map +1 -0
  190. package/dist/tests/agent-governance.test.d.ts +2 -0
  191. package/dist/tests/agent-governance.test.d.ts.map +1 -0
  192. package/dist/tests/agent-governance.test.js +233 -0
  193. package/dist/tests/agent-governance.test.js.map +1 -0
  194. package/dist/tests/app-commands.test.d.ts +2 -0
  195. package/dist/tests/app-commands.test.d.ts.map +1 -0
  196. package/dist/tests/app-commands.test.js +462 -0
  197. package/dist/tests/app-commands.test.js.map +1 -0
  198. package/dist/tests/booking-commands.test.d.ts +2 -0
  199. package/dist/tests/booking-commands.test.d.ts.map +1 -0
  200. package/dist/tests/booking-commands.test.js +204 -0
  201. package/dist/tests/booking-commands.test.js.map +1 -0
  202. package/dist/tests/booking-smoke.test.d.ts +2 -0
  203. package/dist/tests/booking-smoke.test.d.ts.map +1 -0
  204. package/dist/tests/booking-smoke.test.js +183 -0
  205. package/dist/tests/booking-smoke.test.js.map +1 -0
  206. package/dist/tests/cms-commands.test.d.ts +2 -0
  207. package/dist/tests/cms-commands.test.d.ts.map +1 -0
  208. package/dist/tests/cms-commands.test.js +254 -0
  209. package/dist/tests/cms-commands.test.js.map +1 -0
  210. package/dist/tests/cms-ops.test.d.ts +2 -0
  211. package/dist/tests/cms-ops.test.d.ts.map +1 -0
  212. package/dist/tests/cms-ops.test.js +125 -0
  213. package/dist/tests/cms-ops.test.js.map +1 -0
  214. package/dist/tests/env-writer.test.d.ts +2 -0
  215. package/dist/tests/env-writer.test.d.ts.map +1 -0
  216. package/dist/tests/env-writer.test.js +90 -0
  217. package/dist/tests/env-writer.test.js.map +1 -0
  218. package/dist/tests/profile-store.test.d.ts +2 -0
  219. package/dist/tests/profile-store.test.d.ts.map +1 -0
  220. package/dist/tests/profile-store.test.js +88 -0
  221. package/dist/tests/profile-store.test.js.map +1 -0
  222. package/dist/tests/target-guard.test.d.ts +2 -0
  223. package/dist/tests/target-guard.test.d.ts.map +1 -0
  224. package/dist/tests/target-guard.test.js +132 -0
  225. package/dist/tests/target-guard.test.js.map +1 -0
  226. package/dist/ui/logo.d.ts +2 -0
  227. package/dist/ui/logo.d.ts.map +1 -0
  228. package/dist/ui/logo.js +22 -0
  229. package/dist/ui/logo.js.map +1 -0
  230. package/package.json +17 -53
  231. package/.claude/settings.local.json +0 -36
  232. package/.cursor/rules.md +0 -203
  233. package/.eslintrc.js +0 -31
  234. package/CLAUDE.md +0 -100
  235. package/bin/cli.js +0 -116
  236. package/docs/ADDING_FRAMEWORK_DETECTORS.md +0 -391
  237. package/docs/ADDING_NEW_PROJECT_TYPE.md +0 -156
  238. package/docs/ARCHITECTURE_RELATIONSHIPS.md +0 -411
  239. package/docs/CLI_AUTHENTICATION.md +0 -214
  240. package/docs/CLI_PAGE_DETECTION_REQUIREMENTS.md +0 -519
  241. package/docs/CRM-PIPELINES-SEQUENCES-SPEC.md +0 -429
  242. package/docs/DETECTOR_ARCHITECTURE.md +0 -326
  243. package/docs/DEVELOPMENT.md +0 -194
  244. package/docs/IMPLEMENTATION_PHASES.md +0 -468
  245. package/docs/INTEGRATION_PATHS_ARCHITECTURE.md +0 -1543
  246. package/docs/OAUTH_CLARIFICATION.md +0 -258
  247. package/docs/OAUTH_SETUP_GUIDE_TEMPLATE.md +0 -211
  248. package/docs/PHASE_0_PROGRESS.md +0 -120
  249. package/docs/PHASE_1_COMPLETE.md +0 -366
  250. package/docs/PHASE_SUMMARY.md +0 -149
  251. package/docs/PLAN.md +0 -511
  252. package/docs/README.md +0 -56
  253. package/docs/STRIPE_INTEGRATION.md +0 -447
  254. package/docs/SUMMARY.md +0 -230
  255. package/docs/UPDATED_PLAN.md +0 -447
  256. package/docs/mcp_server/MCP_EXTENSION_GUIDE.md +0 -1313
  257. package/docs/mcp_server/MCP_SERVER_ARCHITECTURE.md +0 -1481
  258. package/docs/mcp_server/applicationOntology.ts +0 -817
  259. package/docs/mcp_server/cliApplications.ts +0 -639
  260. package/docs/mcp_server/crmOntology.ts +0 -1063
  261. package/docs/mcp_server/eventOntology.ts +0 -1183
  262. package/docs/mcp_server/formsOntology.ts +0 -1401
  263. package/docs/mcp_server/ontologySchemas.ts +0 -185
  264. package/docs/mcp_server/schema.ts +0 -250
  265. package/docs/microsass_production_machine/CLI_API_REFERENCE.md +0 -1197
  266. package/docs/microsass_production_machine/CLI_PRODUCT_VISION.md +0 -676
  267. package/docs/microsass_production_machine/CLI_REQUIREMENTS.md +0 -606
  268. package/docs/microsass_production_machine/CONNECTED_APPLICATIONS_SPEC.md +0 -390
  269. package/docs/microsass_production_machine/IMPLEMENTATION_ROADMAP.md +0 -725
  270. package/docs/microsass_production_machine/OBJECT_MAPPINGS.md +0 -808
  271. package/docs/microsass_production_machine/REFERENCE_IMPLEMENTATION.md +0 -532
  272. package/src/api/backend-client.js +0 -449
  273. package/src/commands/api-keys.js +0 -119
  274. package/src/commands/connect.js +0 -243
  275. package/src/commands/login.js +0 -332
  276. package/src/commands/logout.js +0 -30
  277. package/src/commands/mcp-server.js +0 -85
  278. package/src/commands/mcp-setup.js +0 -686
  279. package/src/commands/pages.js +0 -317
  280. package/src/commands/scaffold.js +0 -409
  281. package/src/commands/spread.js +0 -861
  282. package/src/commands/status.js +0 -62
  283. package/src/commands/sync.js +0 -169
  284. package/src/commands/upgrade.js +0 -48
  285. package/src/config/config-manager.js +0 -206
  286. package/src/detectors/api-client-detector.js +0 -85
  287. package/src/detectors/base-detector.js +0 -77
  288. package/src/detectors/database-detector.js +0 -245
  289. package/src/detectors/expo-detector.js +0 -166
  290. package/src/detectors/github-detector.js +0 -74
  291. package/src/detectors/index.js +0 -106
  292. package/src/detectors/mapping-suggestor.js +0 -119
  293. package/src/detectors/model-detector.js +0 -318
  294. package/src/detectors/nextjs-detector.js +0 -139
  295. package/src/detectors/oauth-detector.js +0 -122
  296. package/src/detectors/page-detector.js +0 -480
  297. package/src/detectors/registry.js +0 -121
  298. package/src/generators/api-client-generator.js +0 -223
  299. package/src/generators/api-only/client.js +0 -683
  300. package/src/generators/api-only/index.js +0 -96
  301. package/src/generators/api-only/types.js +0 -618
  302. package/src/generators/api-only/webhooks.js +0 -377
  303. package/src/generators/env-generator.js +0 -191
  304. package/src/generators/expo-auth-generator.js +0 -1009
  305. package/src/generators/gitignore-generator.js +0 -92
  306. package/src/generators/index.js +0 -166
  307. package/src/generators/manifest-generator.js +0 -154
  308. package/src/generators/mcp-guide-generator.js +0 -256
  309. package/src/generators/nextauth-generator.js +0 -247
  310. package/src/generators/oauth-guide-generator.js +0 -277
  311. package/src/generators/quickstart/components/index.js +0 -1699
  312. package/src/generators/quickstart/components-mobile/index.js +0 -1440
  313. package/src/generators/quickstart/database/convex.js +0 -1257
  314. package/src/generators/quickstart/database/index.js +0 -34
  315. package/src/generators/quickstart/database/supabase.js +0 -1132
  316. package/src/generators/quickstart/hooks/index.js +0 -1065
  317. package/src/generators/quickstart/index.js +0 -191
  318. package/src/generators/quickstart/pages/index.js +0 -1466
  319. package/src/generators/quickstart/screens/index.js +0 -1498
  320. package/src/logo.js +0 -116
  321. package/src/mcp/auth.js +0 -127
  322. package/src/mcp/registry/domains/applications.js +0 -516
  323. package/src/mcp/registry/domains/benefits.js +0 -798
  324. package/src/mcp/registry/domains/codegen.js +0 -894
  325. package/src/mcp/registry/domains/core.js +0 -324
  326. package/src/mcp/registry/domains/crm.js +0 -591
  327. package/src/mcp/registry/domains/events.js +0 -649
  328. package/src/mcp/registry/domains/forms.js +0 -696
  329. package/src/mcp/registry/index.js +0 -164
  330. package/src/mcp/server.js +0 -116
  331. package/src/utils/file-utils.js +0 -117
  332. package/src/utils/init-helpers.js +0 -243
  333. package/src/utils/prompt-utils.js +0 -195
  334. package/templates/CLAUDE.md +0 -86
  335. package/tests/api-client-detector.test.js +0 -214
  336. package/tests/api-client-generator.test.js +0 -176
  337. package/tests/backend-client.test.js +0 -640
  338. package/tests/base-detector.test.js +0 -101
  339. package/tests/commands/login.test.js +0 -143
  340. package/tests/commands/logout.test.js +0 -84
  341. package/tests/commands/status.test.js +0 -167
  342. package/tests/config-manager.test.js +0 -321
  343. package/tests/database-detector.test.js +0 -221
  344. package/tests/detector-index.test.js +0 -209
  345. package/tests/detector-registry.test.js +0 -93
  346. package/tests/env-generator.test.js +0 -278
  347. package/tests/expo-detector.test.js +0 -263
  348. package/tests/file-utils.test.js +0 -194
  349. package/tests/generators-index.test.js +0 -454
  350. package/tests/github-detector.test.js +0 -145
  351. package/tests/gitignore-generator.test.js +0 -109
  352. package/tests/logo.test.js +0 -96
  353. package/tests/nextauth-generator.test.js +0 -255
  354. package/tests/nextjs-detector.test.js +0 -235
  355. package/tests/oauth-detector.test.js +0 -264
  356. package/tests/oauth-guide-generator.test.js +0 -273
  357. package/tests/page-detector.test.js +0 -371
@@ -1,371 +0,0 @@
1
- /**
2
- * Page Detector Tests
3
- */
4
-
5
- const fs = require('fs');
6
- const path = require('path');
7
-
8
- // Mock fs module
9
- jest.mock('fs');
10
-
11
- const pageDetector = require('../src/detectors/page-detector');
12
-
13
- describe('PageDetector', () => {
14
- beforeEach(() => {
15
- jest.clearAllMocks();
16
- });
17
-
18
- describe('Next.js App Router', () => {
19
- it('detects pages in app directory', () => {
20
- const projectPath = '/test/project';
21
-
22
- // Mock directory structure
23
- fs.existsSync.mockImplementation((p) => {
24
- const validPaths = [
25
- path.join(projectPath, 'app'),
26
- path.join(projectPath, 'app', 'page.tsx'),
27
- path.join(projectPath, 'app', 'about'),
28
- path.join(projectPath, 'app', 'about', 'page.tsx'),
29
- path.join(projectPath, 'app', 'dashboard'),
30
- path.join(projectPath, 'app', 'dashboard', 'page.tsx'),
31
- path.join(projectPath, 'app', 'dashboard', '[id]'),
32
- path.join(projectPath, 'app', 'dashboard', '[id]', 'page.tsx'),
33
- ];
34
- return validPaths.includes(p);
35
- });
36
-
37
- fs.readdirSync.mockImplementation((dir) => {
38
- if (dir === path.join(projectPath, 'app')) {
39
- return [
40
- { name: 'page.tsx', isDirectory: () => false, isFile: () => true },
41
- { name: 'about', isDirectory: () => true, isFile: () => false },
42
- { name: 'dashboard', isDirectory: () => true, isFile: () => false },
43
- ];
44
- }
45
- if (dir === path.join(projectPath, 'app', 'about')) {
46
- return [
47
- { name: 'page.tsx', isDirectory: () => false, isFile: () => true },
48
- ];
49
- }
50
- if (dir === path.join(projectPath, 'app', 'dashboard')) {
51
- return [
52
- { name: 'page.tsx', isDirectory: () => false, isFile: () => true },
53
- { name: '[id]', isDirectory: () => true, isFile: () => false },
54
- ];
55
- }
56
- if (dir === path.join(projectPath, 'app', 'dashboard', '[id]')) {
57
- return [
58
- { name: 'page.tsx', isDirectory: () => false, isFile: () => true },
59
- ];
60
- }
61
- return [];
62
- });
63
-
64
- const pages = pageDetector.detect(projectPath, 'nextjs', { routerType: 'app' });
65
-
66
- expect(pages).toHaveLength(4);
67
- expect(pages).toContainEqual(expect.objectContaining({
68
- path: '/',
69
- name: 'Home',
70
- pageType: 'static',
71
- }));
72
- expect(pages).toContainEqual(expect.objectContaining({
73
- path: '/about',
74
- name: 'About',
75
- pageType: 'static',
76
- }));
77
- expect(pages).toContainEqual(expect.objectContaining({
78
- path: '/dashboard',
79
- name: 'Dashboard',
80
- pageType: 'static',
81
- }));
82
- expect(pages).toContainEqual(expect.objectContaining({
83
- path: '/dashboard/[id]',
84
- name: 'Dashboard Detail',
85
- pageType: 'dynamic',
86
- }));
87
- });
88
-
89
- it('detects API routes', () => {
90
- const projectPath = '/test/project';
91
-
92
- fs.existsSync.mockImplementation((p) => {
93
- const validPaths = [
94
- path.join(projectPath, 'app'),
95
- path.join(projectPath, 'app', 'api'),
96
- path.join(projectPath, 'app', 'api', 'users'),
97
- path.join(projectPath, 'app', 'api', 'users', 'route.ts'),
98
- ];
99
- return validPaths.includes(p);
100
- });
101
-
102
- fs.readdirSync.mockImplementation((dir) => {
103
- if (dir === path.join(projectPath, 'app')) {
104
- return [
105
- { name: 'api', isDirectory: () => true, isFile: () => false },
106
- ];
107
- }
108
- if (dir === path.join(projectPath, 'app', 'api')) {
109
- return [
110
- { name: 'users', isDirectory: () => true, isFile: () => false },
111
- ];
112
- }
113
- if (dir === path.join(projectPath, 'app', 'api', 'users')) {
114
- return [
115
- { name: 'route.ts', isDirectory: () => false, isFile: () => true },
116
- ];
117
- }
118
- return [];
119
- });
120
-
121
- const pages = pageDetector.detect(projectPath, 'nextjs', { routerType: 'app' });
122
-
123
- expect(pages).toHaveLength(1);
124
- expect(pages[0]).toMatchObject({
125
- path: '/api/users',
126
- name: 'API: Users',
127
- pageType: 'api_route',
128
- });
129
- });
130
-
131
- it('skips route groups but preserves children', () => {
132
- const projectPath = '/test/project';
133
-
134
- fs.existsSync.mockImplementation((p) => {
135
- const validPaths = [
136
- path.join(projectPath, 'app'),
137
- path.join(projectPath, 'app', '(auth)'),
138
- path.join(projectPath, 'app', '(auth)', 'login'),
139
- path.join(projectPath, 'app', '(auth)', 'login', 'page.tsx'),
140
- ];
141
- return validPaths.includes(p);
142
- });
143
-
144
- fs.readdirSync.mockImplementation((dir) => {
145
- if (dir === path.join(projectPath, 'app')) {
146
- return [
147
- { name: '(auth)', isDirectory: () => true, isFile: () => false },
148
- ];
149
- }
150
- if (dir === path.join(projectPath, 'app', '(auth)')) {
151
- return [
152
- { name: 'login', isDirectory: () => true, isFile: () => false },
153
- ];
154
- }
155
- if (dir === path.join(projectPath, 'app', '(auth)', 'login')) {
156
- return [
157
- { name: 'page.tsx', isDirectory: () => false, isFile: () => true },
158
- ];
159
- }
160
- return [];
161
- });
162
-
163
- const pages = pageDetector.detect(projectPath, 'nextjs', { routerType: 'app' });
164
-
165
- expect(pages).toHaveLength(1);
166
- // Route group (auth) is stripped from path
167
- expect(pages[0].path).toBe('/login');
168
- });
169
- });
170
-
171
- describe('Next.js Pages Router', () => {
172
- it('detects pages in pages directory', () => {
173
- const projectPath = '/test/project';
174
-
175
- fs.existsSync.mockImplementation((p) => {
176
- const validPaths = [
177
- path.join(projectPath, 'pages'),
178
- ];
179
- return validPaths.includes(p);
180
- });
181
-
182
- fs.readdirSync.mockImplementation((dir) => {
183
- if (dir === path.join(projectPath, 'pages')) {
184
- return [
185
- { name: 'index.tsx', isDirectory: () => false, isFile: () => true },
186
- { name: 'about.tsx', isDirectory: () => false, isFile: () => true },
187
- { name: '[slug].tsx', isDirectory: () => false, isFile: () => true },
188
- { name: '_app.tsx', isDirectory: () => false, isFile: () => true },
189
- ];
190
- }
191
- return [];
192
- });
193
-
194
- const pages = pageDetector.detect(projectPath, 'nextjs', { routerType: 'pages' });
195
-
196
- expect(pages).toHaveLength(3); // Excludes _app.tsx
197
- expect(pages).toContainEqual(expect.objectContaining({
198
- path: '/',
199
- name: 'Home',
200
- pageType: 'static',
201
- }));
202
- expect(pages).toContainEqual(expect.objectContaining({
203
- path: '/about',
204
- name: 'About',
205
- pageType: 'static',
206
- }));
207
- expect(pages).toContainEqual(expect.objectContaining({
208
- path: '/[slug]',
209
- name: 'Detail',
210
- pageType: 'dynamic',
211
- }));
212
- });
213
-
214
- it('detects API routes in pages/api', () => {
215
- const projectPath = '/test/project';
216
-
217
- fs.existsSync.mockImplementation((p) => {
218
- return p === path.join(projectPath, 'pages');
219
- });
220
-
221
- fs.readdirSync.mockImplementation((dir) => {
222
- if (dir === path.join(projectPath, 'pages')) {
223
- return [
224
- { name: 'api', isDirectory: () => true, isFile: () => false },
225
- ];
226
- }
227
- if (dir === path.join(projectPath, 'pages', 'api')) {
228
- return [
229
- { name: 'hello.ts', isDirectory: () => false, isFile: () => true },
230
- ];
231
- }
232
- return [];
233
- });
234
-
235
- const pages = pageDetector.detect(projectPath, 'nextjs', { routerType: 'pages' });
236
-
237
- expect(pages).toHaveLength(1);
238
- expect(pages[0]).toMatchObject({
239
- path: '/api/hello',
240
- name: 'API: Hello',
241
- pageType: 'api_route',
242
- });
243
- });
244
- });
245
-
246
- describe('Expo Router', () => {
247
- it('detects screens in expo-router app directory', () => {
248
- const projectPath = '/test/project';
249
-
250
- fs.existsSync.mockImplementation((p) => {
251
- const validPaths = [
252
- path.join(projectPath, 'app'),
253
- ];
254
- return validPaths.includes(p);
255
- });
256
-
257
- fs.readdirSync.mockImplementation((dir) => {
258
- if (dir === path.join(projectPath, 'app')) {
259
- return [
260
- { name: 'index.tsx', isDirectory: () => false, isFile: () => true },
261
- { name: 'profile.tsx', isDirectory: () => false, isFile: () => true },
262
- { name: '[id].tsx', isDirectory: () => false, isFile: () => true },
263
- { name: '_layout.tsx', isDirectory: () => false, isFile: () => true },
264
- { name: '+not-found.tsx', isDirectory: () => false, isFile: () => true },
265
- ];
266
- }
267
- return [];
268
- });
269
-
270
- const screens = pageDetector.detect(projectPath, 'expo', { routerType: 'expo-router' });
271
-
272
- expect(screens).toHaveLength(4); // Excludes _layout.tsx
273
- expect(screens).toContainEqual(expect.objectContaining({
274
- path: '/',
275
- name: 'Home',
276
- pageType: 'static',
277
- }));
278
- expect(screens).toContainEqual(expect.objectContaining({
279
- path: '/profile',
280
- name: 'Profile',
281
- pageType: 'static',
282
- }));
283
- expect(screens).toContainEqual(expect.objectContaining({
284
- path: '/[id]',
285
- name: 'Detail',
286
- pageType: 'dynamic',
287
- }));
288
- expect(screens).toContainEqual(expect.objectContaining({
289
- path: '/*',
290
- name: 'Not Found',
291
- pageType: 'static',
292
- }));
293
- });
294
- });
295
-
296
- describe('React Navigation', () => {
297
- it('detects screens in screens directory', () => {
298
- const projectPath = '/test/project';
299
-
300
- fs.existsSync.mockImplementation((p) => {
301
- const validPaths = [
302
- path.join(projectPath, 'src', 'screens'),
303
- ];
304
- return validPaths.includes(p);
305
- });
306
-
307
- fs.readdirSync.mockImplementation((dir) => {
308
- if (dir === path.join(projectPath, 'src', 'screens')) {
309
- return [
310
- { name: 'HomeScreen.tsx', isDirectory: () => false, isFile: () => true },
311
- { name: 'ProfileScreen.tsx', isDirectory: () => false, isFile: () => true },
312
- { name: 'SettingsScreen.tsx', isDirectory: () => false, isFile: () => true },
313
- { name: 'index.ts', isDirectory: () => false, isFile: () => true },
314
- ];
315
- }
316
- return [];
317
- });
318
-
319
- const screens = pageDetector.detect(projectPath, 'expo', { routerType: 'react-navigation' });
320
-
321
- expect(screens).toHaveLength(3); // Excludes index.ts
322
- expect(screens).toContainEqual(expect.objectContaining({
323
- path: '/',
324
- name: 'Home',
325
- pageType: 'static',
326
- }));
327
- expect(screens).toContainEqual(expect.objectContaining({
328
- path: '/profile',
329
- name: 'Profile',
330
- pageType: 'static',
331
- }));
332
- expect(screens).toContainEqual(expect.objectContaining({
333
- path: '/settings',
334
- name: 'Settings',
335
- pageType: 'static',
336
- }));
337
- });
338
- });
339
-
340
- describe('Page name generation', () => {
341
- it('generates correct names for various paths', () => {
342
- expect(pageDetector.generatePageName('/')).toBe('Home');
343
- expect(pageDetector.generatePageName('/about')).toBe('About');
344
- expect(pageDetector.generatePageName('/user-profile')).toBe('User Profile');
345
- expect(pageDetector.generatePageName('/dashboard/[id]')).toBe('Dashboard Detail');
346
- expect(pageDetector.generatePageName('/api/users', true)).toBe('API: Users');
347
- expect(pageDetector.generatePageName('/api', true)).toBe('API: Root');
348
- });
349
- });
350
-
351
- describe('Page type detection', () => {
352
- it('detects dynamic pages', () => {
353
- expect(pageDetector.detectPageType('/dashboard/[id]')).toBe('dynamic');
354
- expect(pageDetector.detectPageType('/blog/[...slug]')).toBe('dynamic');
355
- expect(pageDetector.detectPageType('/users/[userId]/posts/[postId]')).toBe('dynamic');
356
- });
357
-
358
- it('detects static pages', () => {
359
- expect(pageDetector.detectPageType('/')).toBe('static');
360
- expect(pageDetector.detectPageType('/about')).toBe('static');
361
- expect(pageDetector.detectPageType('/dashboard')).toBe('static');
362
- });
363
- });
364
-
365
- describe('Unknown framework', () => {
366
- it('returns empty array for unknown framework', () => {
367
- const pages = pageDetector.detect('/test/project', 'unknown', {});
368
- expect(pages).toEqual([]);
369
- });
370
- });
371
- });