@codeyam/codeyam-cli 0.1.0-staging.8aea589 → 0.1.0-staging.bbe4da9
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/analyzer-template/.build-info.json +7 -7
- package/analyzer-template/log.txt +3 -3
- package/analyzer-template/package.json +8 -7
- package/analyzer-template/packages/ai/index.ts +6 -2
- package/analyzer-template/packages/ai/package.json +2 -2
- package/analyzer-template/packages/ai/scripts/ai-test-matrix.mjs +424 -0
- package/analyzer-template/packages/ai/src/lib/analyzeScope.ts +24 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/astScopeAnalyzer.ts +6 -16
- package/analyzer-template/packages/ai/src/lib/astScopes/methodSemantics.ts +197 -0
- package/analyzer-template/packages/ai/src/lib/astScopes/paths.ts +28 -2
- package/analyzer-template/packages/ai/src/lib/astScopes/processExpression.ts +145 -4
- package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1877 -542
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.ts +138 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.ts +1 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.ts +139 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/DebugTracer.ts +224 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/PathManager.ts +203 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/README.md +294 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.ts +161 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.ts +235 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.ts +64 -1
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +14 -6
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/selectBestValue.ts +70 -0
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.ts +113 -0
- package/analyzer-template/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.ts +36 -0
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityDocumentation.ts +20 -2
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarioData.ts +56 -160
- package/analyzer-template/packages/ai/src/lib/generateChangesEntityScenarios.ts +79 -265
- package/analyzer-template/packages/ai/src/lib/generateEntityDocumentation.ts +16 -2
- package/analyzer-template/packages/ai/src/lib/generateEntityKeyAttributes.ts +32 -8
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarioData.ts +53 -154
- package/analyzer-template/packages/ai/src/lib/generateEntityScenarios.ts +84 -254
- package/analyzer-template/packages/ai/src/lib/generateStatementAnalysis.ts +48 -71
- package/analyzer-template/packages/ai/src/lib/getConditionalUsagesFromCode.ts +27 -6
- package/analyzer-template/packages/ai/src/lib/getLLMCallStats.ts +0 -14
- package/analyzer-template/packages/ai/src/lib/modelInfo.ts +15 -0
- package/analyzer-template/packages/ai/src/lib/promptGenerators/gatherAttributesMap.ts +42 -4
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.ts +8 -33
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.ts +54 -62
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.ts +93 -109
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.ts +8 -27
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.ts +33 -38
- package/analyzer-template/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.ts +30 -30
- package/analyzer-template/packages/ai/src/lib/types/index.ts +2 -0
- package/analyzer-template/packages/ai/src/lib/worker/SerializableDataStructure.ts +41 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +47 -8
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/getNodeType.ts +1 -1
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.ts +4 -2
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllExports.ts +5 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.ts +8 -10
- package/analyzer-template/packages/analyze/src/lib/files/analyze/analyzeEntities.ts +6 -1
- package/analyzer-template/packages/analyze/src/lib/files/analyze/gatherEntityMap.ts +8 -6
- package/analyzer-template/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.ts +5 -13
- package/analyzer-template/packages/analyze/src/lib/files/analyzeChange.ts +34 -15
- package/analyzer-template/packages/analyze/src/lib/files/analyzeEntity.ts +17 -3
- package/analyzer-template/packages/analyze/src/lib/files/analyzeInitial.ts +35 -16
- package/analyzer-template/packages/analyze/src/lib/files/analyzeRemixRoute.ts +21 -33
- package/analyzer-template/packages/analyze/src/lib/files/getImportedExports.ts +75 -10
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.ts +26 -0
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateDataStructure.ts +7 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarioData.ts +6 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/generateScenarios.ts +9 -1
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +15 -7
- package/analyzer-template/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.ts +12 -2
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts +23 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.d.ts.map +1 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js +30 -0
- package/analyzer-template/packages/aws/dist/src/lib/s3/getPresignedUrl.js.map +1 -0
- package/analyzer-template/packages/aws/package.json +5 -4
- package/analyzer-template/packages/aws/s3/index.ts +4 -0
- package/analyzer-template/packages/aws/src/lib/s3/getPresignedUrl.ts +62 -0
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.ts +28 -21
- package/analyzer-template/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.ts +18 -11
- package/analyzer-template/packages/generate/src/lib/scenarioComponent.ts +6 -3
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
- package/analyzer-template/packages/github/dist/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js +5 -3
- package/analyzer-template/packages/github/dist/generate/src/lib/scenarioComponent.js.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts +2 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js +3 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/db.js.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts +2 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tableRelations.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts +37 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
- package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.js +1 -1
- package/analyzer-template/packages/github/dist/supabase/src/lib/scenarioToDb.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/index.d.ts +2 -0
- package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/index.js +2 -0
- package/analyzer-template/packages/github/dist/utils/index.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts +25 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js +40 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/Semaphore.js.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js +39 -5
- package/analyzer-template/packages/github/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js +17 -0
- package/analyzer-template/packages/github/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/analyzer-template/packages/supabase/src/lib/kysely/db.ts +6 -0
- package/analyzer-template/packages/supabase/src/lib/kysely/tableRelations.ts +3 -0
- package/analyzer-template/packages/supabase/src/lib/kysely/tables/debugReportsTable.ts +61 -0
- package/analyzer-template/packages/supabase/src/lib/scenarioToDb.ts +1 -0
- package/analyzer-template/packages/ui-components/src/scenario-editor/components/DataItemEditor.tsx +1 -1
- package/analyzer-template/packages/utils/dist/utils/index.d.ts +2 -0
- package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/index.js +2 -0
- package/analyzer-template/packages/utils/dist/utils/index.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts +25 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.d.ts.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js +40 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/Semaphore.js.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js +39 -5
- package/analyzer-template/packages/utils/dist/utils/src/lib/applyUniversalMocks.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts +12 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.d.ts.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js +17 -0
- package/analyzer-template/packages/utils/dist/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/analyzer-template/packages/utils/index.ts +2 -0
- package/analyzer-template/packages/utils/src/lib/Semaphore.ts +42 -0
- package/analyzer-template/packages/utils/src/lib/applyUniversalMocks.ts +46 -7
- package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/getRemixRoutePath.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.ts +1 -0
- package/analyzer-template/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.ts +33 -0
- package/analyzer-template/packages/utils/src/lib/lightweightEntityExtractor.ts +16 -0
- package/analyzer-template/project/constructMockCode.ts +199 -9
- package/analyzer-template/project/reconcileMockDataKeys.ts +13 -0
- package/analyzer-template/project/runMultiScenarioServer.ts +0 -4
- package/analyzer-template/project/runScenarioServer.ts +0 -4
- package/analyzer-template/project/start.ts +1 -11
- package/analyzer-template/project/startScenarioCapture.ts +24 -0
- package/analyzer-template/project/startServer.ts +50 -70
- package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
- package/analyzer-template/project/writeMockDataTsx.ts +191 -7
- package/analyzer-template/project/writeScenarioComponents.ts +643 -63
- package/analyzer-template/project/writeUniversalMocks.ts +66 -8
- package/analyzer-template/scripts/postbuild.cjs +12 -1
- package/background/src/lib/virtualized/project/constructMockCode.js +183 -11
- package/background/src/lib/virtualized/project/constructMockCode.js.map +1 -1
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js +12 -0
- package/background/src/lib/virtualized/project/reconcileMockDataKeys.js.map +1 -1
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js +0 -3
- package/background/src/lib/virtualized/project/runMultiScenarioServer.js.map +1 -1
- package/background/src/lib/virtualized/project/start.js +1 -8
- package/background/src/lib/virtualized/project/start.js.map +1 -1
- package/background/src/lib/virtualized/project/startScenarioCapture.js +18 -0
- package/background/src/lib/virtualized/project/startScenarioCapture.js.map +1 -1
- package/background/src/lib/virtualized/project/startServer.js +40 -68
- package/background/src/lib/virtualized/project/startServer.js.map +1 -1
- package/background/src/lib/virtualized/project/trackGeneratedFiles.js +30 -0
- package/background/src/lib/virtualized/project/trackGeneratedFiles.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +156 -6
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +433 -41
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeUniversalMocks.js +56 -7
- package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
- package/codeyam-cli/src/cli.js +6 -0
- package/codeyam-cli/src/cli.js.map +1 -1
- package/codeyam-cli/src/codeyam-cli.js +0 -0
- package/codeyam-cli/src/commands/debug.js +222 -0
- package/codeyam-cli/src/commands/debug.js.map +1 -0
- package/codeyam-cli/src/commands/init.js +4 -23
- package/codeyam-cli/src/commands/init.js.map +1 -1
- package/codeyam-cli/src/commands/report.js +102 -0
- package/codeyam-cli/src/commands/report.js.map +1 -0
- package/codeyam-cli/src/commands/setup-sandbox.js +165 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -0
- package/codeyam-cli/src/commands/test-startup.js +14 -5
- package/codeyam-cli/src/commands/test-startup.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js +6 -6
- package/codeyam-cli/src/utils/__tests__/cleanupAnalysisFiles.test.js.map +1 -1
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js +8 -0
- package/codeyam-cli/src/utils/__tests__/setupClaudeCodeSettings.test.js.map +1 -1
- package/codeyam-cli/src/utils/analysisRunner.js +2 -1
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +24 -2
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/cleanupAnalysisFiles.js +2 -2
- package/codeyam-cli/src/utils/cleanupAnalysisFiles.js.map +1 -1
- package/codeyam-cli/src/utils/generateReport.js +219 -0
- package/codeyam-cli/src/utils/generateReport.js.map +1 -0
- package/codeyam-cli/src/utils/install-skills.js +7 -0
- package/codeyam-cli/src/utils/install-skills.js.map +1 -1
- package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js +1 -0
- package/codeyam-cli/src/utils/queue/__tests__/job.pidTracking.test.js.map +1 -1
- package/codeyam-cli/src/utils/queue/job.js +10 -5
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- package/codeyam-cli/src/utils/sandbox.js +190 -0
- package/codeyam-cli/src/utils/sandbox.js.map +1 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js +4 -0
- package/codeyam-cli/src/utils/setupClaudeCodeSettings.js.map +1 -1
- package/codeyam-cli/src/utils/webappDetection.js +2 -1
- package/codeyam-cli/src/utils/webappDetection.js.map +1 -1
- package/codeyam-cli/src/webserver/app/lib/database.js +50 -2
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-Dp_FTAs1.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-TlHocYno.js +26 -0
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-CVMmGuIc.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-BKKG1s2B.js → LogViewer-JkfQ-VaI.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-Cqce0_KG.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BrMAP1nP.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bi-__7HT.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-XmIpHcLJ.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/_index-BmfhU6CA.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-Dm8lM73z.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/api.generate-report-l0sNRNKZ.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/chart-column-kA4jn9if.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-CgXbbZRx.js +26 -0
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-B2oHQ-zo.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/clock-BAfbP_iK.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/codeyam-name-logo-CvKwUgHo.svg +9 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-BBYuR56H.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BgPXZbm0.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BHiWkb_W.js → entity._sha._-BkoAXaOa.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-Bj5GHkhb.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-eW5z9AyZ.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entityStatus-C5Okl18j.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entityVersioning-Bk_YB1jM.js → entityVersioning-CU_Lchhc.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-B9tSboXM.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/file-text-18aYHZGd.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-Df79EyEb.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-CDEwTVH_.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-DXRB6jBc.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/html2canvas-pro.esm-XQCGvadH.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-_LjBsTxX.js +8 -0
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-D_EGChhq.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/manifest-3e0ffbcc.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-CGyT4J4b.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/settings-CEPbAsom.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/settings-R8QF_mHX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-B_PXvFom.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-BthANBVv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-Lumm1t01.js → useLastLogLine-Blr5oZDE.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useReportContext-CANr3QJ5.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/useToast-Bbf4Hokd.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/index-vf1FETCO.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-B5s58TvB.js +169 -0
- package/codeyam-cli/src/webserver/build/server/index.js +1 -1
- package/codeyam-cli/src/webserver/build-info.json +5 -5
- package/codeyam-cli/src/webserver/server.js +1 -1
- package/codeyam-cli/src/webserver/server.js.map +1 -1
- package/codeyam-cli/templates/codeyam-setup-skill.md +70 -85
- package/codeyam-cli/templates/debug-command.md +125 -0
- package/package.json +9 -11
- package/packages/ai/index.js +2 -3
- package/packages/ai/index.js.map +1 -1
- package/packages/ai/src/lib/analyzeScope.js +13 -0
- package/packages/ai/src/lib/analyzeScope.js.map +1 -1
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js +6 -15
- package/packages/ai/src/lib/astScopes/astScopeAnalyzer.js.map +1 -1
- package/packages/ai/src/lib/astScopes/methodSemantics.js +134 -0
- package/packages/ai/src/lib/astScopes/methodSemantics.js.map +1 -1
- package/packages/ai/src/lib/astScopes/paths.js +28 -3
- package/packages/ai/src/lib/astScopes/paths.js.map +1 -1
- package/packages/ai/src/lib/astScopes/processExpression.js +123 -3
- package/packages/ai/src/lib/astScopes/processExpression.js.map +1 -1
- package/packages/ai/src/lib/checkAllAttributes.js +1 -3
- package/packages/ai/src/lib/checkAllAttributes.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js +1358 -396
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js +137 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/FunctionCallManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js +1 -1
- package/packages/ai/src/lib/dataStructure/equivalencyManagers/frameworks/ReactFrameworkManager.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js +112 -0
- package/packages/ai/src/lib/dataStructure/helpers/BatchSchemaProcessor.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js +176 -0
- package/packages/ai/src/lib/dataStructure/helpers/DebugTracer.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/PathManager.js +178 -0
- package/packages/ai/src/lib/dataStructure/helpers/PathManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js +138 -0
- package/packages/ai/src/lib/dataStructure/helpers/ScopeTreeManager.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js +199 -0
- package/packages/ai/src/lib/dataStructure/helpers/VisitedTracker.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js +55 -1
- package/packages/ai/src/lib/dataStructure/helpers/cleanNonObjectFunctions.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +14 -6
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js +62 -0
- package/packages/ai/src/lib/dataStructure/helpers/selectBestValue.js.map +1 -0
- package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js +90 -0
- package/packages/ai/src/lib/dataStructure/helpers/uniqueIdUtils.js.map +1 -0
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js +22 -0
- package/packages/ai/src/lib/gatherRelevantDependentKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityDocumentation.js +19 -1
- package/packages/ai/src/lib/generateChangesEntityDocumentation.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js +55 -156
- package/packages/ai/src/lib/generateChangesEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateChangesEntityScenarios.js +79 -262
- package/packages/ai/src/lib/generateChangesEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateEntityDocumentation.js +15 -1
- package/packages/ai/src/lib/generateEntityDocumentation.js.map +1 -1
- package/packages/ai/src/lib/generateEntityKeyAttributes.js +32 -8
- package/packages/ai/src/lib/generateEntityKeyAttributes.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarioData.js +52 -152
- package/packages/ai/src/lib/generateEntityScenarioData.js.map +1 -1
- package/packages/ai/src/lib/generateEntityScenarios.js +88 -258
- package/packages/ai/src/lib/generateEntityScenarios.js.map +1 -1
- package/packages/ai/src/lib/generateStatementAnalysis.js +46 -71
- package/packages/ai/src/lib/generateStatementAnalysis.js.map +1 -1
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js +13 -8
- package/packages/ai/src/lib/getConditionalUsagesFromCode.js.map +1 -1
- package/packages/ai/src/lib/getLLMCallStats.js +0 -14
- package/packages/ai/src/lib/getLLMCallStats.js.map +1 -1
- package/packages/ai/src/lib/modelInfo.js +15 -0
- package/packages/ai/src/lib/modelInfo.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js +36 -3
- package/packages/ai/src/lib/promptGenerators/gatherAttributesMap.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js +8 -33
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityDocumentationGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js +35 -41
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js +59 -72
- package/packages/ai/src/lib/promptGenerators/generateChangesEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js +8 -27
- package/packages/ai/src/lib/promptGenerators/generateEntityDocumentationGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js +24 -27
- package/packages/ai/src/lib/promptGenerators/generateEntityScenarioDataGenerator.js.map +1 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js +21 -22
- package/packages/ai/src/lib/promptGenerators/generateEntityScenariosGenerator.js.map +1 -1
- package/packages/ai/src/lib/types/index.js +2 -0
- package/packages/ai/src/lib/types/index.js.map +1 -1
- package/packages/ai/src/lib/worker/SerializableDataStructure.js +7 -0
- package/packages/ai/src/lib/worker/SerializableDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/FileAnalyzer.js +39 -7
- package/packages/analyze/src/lib/FileAnalyzer.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js +1 -1
- package/packages/analyze/src/lib/asts/nodes/getNodeType.js.map +1 -1
- package/packages/analyze/src/lib/asts/nodes/index.js +2 -1
- package/packages/analyze/src/lib/asts/nodes/index.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.js +3 -2
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExportedNodes.js.map +1 -1
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js +4 -3
- package/packages/analyze/src/lib/asts/sourceFiles/getAllExports.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js +6 -8
- package/packages/analyze/src/lib/files/analyze/analyzeEntities/prepareDataStructures.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js +5 -1
- package/packages/analyze/src/lib/files/analyze/analyzeEntities.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js +8 -2
- package/packages/analyze/src/lib/files/analyze/gatherEntityMap.js.map +1 -1
- package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js +5 -8
- package/packages/analyze/src/lib/files/analyze/trackEntityCircularDependencies.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeChange.js +21 -9
- package/packages/analyze/src/lib/files/analyzeChange.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeEntity.js +10 -4
- package/packages/analyze/src/lib/files/analyzeEntity.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeInitial.js +21 -9
- package/packages/analyze/src/lib/files/analyzeInitial.js.map +1 -1
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js +18 -23
- package/packages/analyze/src/lib/files/analyzeRemixRoute.js.map +1 -1
- package/packages/analyze/src/lib/files/getImportedExports.js +56 -4
- package/packages/analyze/src/lib/files/getImportedExports.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js +24 -0
- package/packages/analyze/src/lib/files/scenarios/gatherDataForMocks.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js +6 -1
- package/packages/analyze/src/lib/files/scenarios/generateDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js +9 -1
- package/packages/analyze/src/lib/files/scenarios/generateKeyAttributes.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js +5 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarioData.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js +9 -1
- package/packages/analyze/src/lib/files/scenarios/generateScenarios.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js +16 -7
- package/packages/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.js.map +1 -1
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js +8 -2
- package/packages/analyze/src/lib/files/scenarios/mergeValidatedDataStructures.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js +28 -21
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageNext.js.map +1 -1
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js +18 -11
- package/packages/generate/src/lib/componentScenarioPage/componentScenarioPageRemix.js.map +1 -1
- package/packages/generate/src/lib/scenarioComponent.js +5 -3
- package/packages/generate/src/lib/scenarioComponent.js.map +1 -1
- package/packages/supabase/src/lib/kysely/db.js +3 -0
- package/packages/supabase/src/lib/kysely/db.js.map +1 -1
- package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js +27 -0
- package/packages/supabase/src/lib/kysely/tables/debugReportsTable.js.map +1 -0
- package/packages/supabase/src/lib/scenarioToDb.js +1 -1
- package/packages/supabase/src/lib/scenarioToDb.js.map +1 -1
- package/packages/utils/index.js +2 -0
- package/packages/utils/index.js.map +1 -1
- package/packages/utils/src/lib/Semaphore.js +40 -0
- package/packages/utils/src/lib/Semaphore.js.map +1 -0
- package/packages/utils/src/lib/applyUniversalMocks.js +39 -5
- package/packages/utils/src/lib/applyUniversalMocks.js.map +1 -1
- package/packages/utils/src/lib/frameworks/getNextRoutePath.js +2 -1
- package/packages/utils/src/lib/frameworks/getNextRoutePath.js.map +1 -1
- package/packages/utils/src/lib/frameworks/getRemixRoutePath.js +2 -1
- package/packages/utils/src/lib/frameworks/getRemixRoutePath.js.map +1 -1
- package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js +2 -1
- package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.js.map +1 -1
- package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js +1 -0
- package/packages/utils/src/lib/frameworks/remixRouteFileNameToRoute.js.map +1 -1
- package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js +32 -0
- package/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.js.map +1 -0
- package/packages/utils/src/lib/lightweightEntityExtractor.js +17 -0
- package/packages/utils/src/lib/lightweightEntityExtractor.js.map +1 -1
- package/analyzer-template/packages/ai/src/lib/generateEntityDataMap.ts +0 -375
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-rqv54FUY.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/InteractivePreview-B0oiPem-.js +0 -26
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DqXXjAJ7.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-DU_jxCPD.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-5DY-YIxu.js +0 -6
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-DmjXUj6m.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-DvSrcxsk.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CsaMd9mb.js +0 -10
- package/codeyam-cli/src/webserver/build/client/assets/chart-column-VXBS6qOn.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/circle-alert-n5GUC2AS.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/clock-DKqtX8js.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/components-Dj-Ggnl2.js +0 -40
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-BbR3FwNc.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-L7M9Vr5z.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-C9w-q7P3.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-CdGoUs8A.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/file-text-B6Er7j5k.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-KcDVw1FY.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-B9uZ8eSJ.js +0 -12
- package/codeyam-cli/src/webserver/build/client/assets/globals-B0f88RTV.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/loader-circle-v3c6DFp4.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-fca08d7e.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-Cf8VBqIb.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-DA14wXpu.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-COJUrwGu.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-NU_ZquhK.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-CNaMJ-nR.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-BRShB17p.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/zap-BvukH0eN.js +0 -1
- package/codeyam-cli/src/webserver/build/client/cy-logo-cli.svg +0 -13
- package/codeyam-cli/src/webserver/build/client/favicon.svg +0 -13
- package/codeyam-cli/src/webserver/build/server/assets/index-DHr4rT4u.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-Bi1mj14J.js +0 -166
- package/codeyam-cli/src/webserver/public/cy-logo-cli.svg +0 -13
- package/codeyam-cli/src/webserver/public/favicon.svg +0 -13
- package/packages/ai/src/lib/generateEntityDataMap.js +0 -335
- package/packages/ai/src/lib/generateEntityDataMap.js.map +0 -1
- package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js +0 -17
- package/packages/ai/src/lib/promptGenerators/generateEntityDataMapGenerator.js.map +0 -1
|
@@ -4,8 +4,9 @@ import {
|
|
|
4
4
|
functionArguments,
|
|
5
5
|
cleanOutBoundary,
|
|
6
6
|
fillInDirectSchemaGapsAndUnknowns,
|
|
7
|
+
removeDuplicateFunctionCalls,
|
|
7
8
|
} from '~codeyam/ai';
|
|
8
|
-
import { DataStructure, DeepReadonly } from '~codeyam/types';
|
|
9
|
+
import { DataStructure, DeepReadonly, EntityType } from '~codeyam/types';
|
|
9
10
|
|
|
10
11
|
interface ReturnValuePart {
|
|
11
12
|
name: string;
|
|
@@ -18,6 +19,7 @@ interface ReturnValuePart {
|
|
|
18
19
|
nested?: ReturnValuePart[];
|
|
19
20
|
isAsyncFunction?: boolean;
|
|
20
21
|
isStructural?: boolean;
|
|
22
|
+
hasNoReturnData?: boolean; // true when function has only signature entries, no functionCallReturnValue
|
|
21
23
|
// Maps literal argument values to their specific nested structures for conditional dispatch
|
|
22
24
|
argVariants?: Map<string, ReturnValuePart[]>;
|
|
23
25
|
}
|
|
@@ -162,6 +164,7 @@ function isValidKey(key: string) {
|
|
|
162
164
|
export default function constructMockCode(
|
|
163
165
|
mockName: string,
|
|
164
166
|
dependencySchemas: DeepReadonly<DataStructure['dependencySchemas']>,
|
|
167
|
+
entityType?: EntityType,
|
|
165
168
|
) {
|
|
166
169
|
const mockNameParts = splitOutsideParenthesesAndArrays(mockName);
|
|
167
170
|
|
|
@@ -193,9 +196,10 @@ export default function constructMockCode(
|
|
|
193
196
|
relevantReturnValueSchema = fillInDirectSchemaGapsAndUnknowns({
|
|
194
197
|
schema: dependencySchemas[filePath][entityName]?.returnValueSchema,
|
|
195
198
|
});
|
|
196
|
-
// NOTE:
|
|
199
|
+
// NOTE: clearAttributesFromMapping is disabled because it deletes
|
|
197
200
|
// method calls on arrays (like .eq() after functionCallReturnValue: 'array')
|
|
198
|
-
//
|
|
201
|
+
// However, we still need to remove duplicate function calls that create invalid syntax
|
|
202
|
+
removeDuplicateFunctionCalls(relevantReturnValueSchema);
|
|
199
203
|
dataStructureValue = relevantReturnValueSchema?.[dataStructurePath];
|
|
200
204
|
break;
|
|
201
205
|
}
|
|
@@ -273,7 +277,15 @@ export default function constructMockCode(
|
|
|
273
277
|
}
|
|
274
278
|
|
|
275
279
|
const addReturnValueFunctionAccessor = (dataPath: string) => {
|
|
276
|
-
|
|
280
|
+
// Add function call accessor if:
|
|
281
|
+
// - There are actual arguments, OR
|
|
282
|
+
// - This is a callable (not a method that returns an array directly)
|
|
283
|
+
// For methods like getAll() that return arrays, the data is at ["getAll()"] not ["getAll()"]["()"]
|
|
284
|
+
if (
|
|
285
|
+
returnValue.returnsFunctionArgs &&
|
|
286
|
+
(returnValue.returnsFunctionArgs.length > 0 ||
|
|
287
|
+
!returnValue.returnsFunctionArray)
|
|
288
|
+
) {
|
|
277
289
|
if (returnValue.isArray) {
|
|
278
290
|
dataPath = `${dataPath}${optionalAccess('[0]')}`;
|
|
279
291
|
}
|
|
@@ -313,6 +325,7 @@ export default function constructMockCode(
|
|
|
313
325
|
returnsFunctionArgs,
|
|
314
326
|
returnsFunctionArray,
|
|
315
327
|
isAsyncFunction,
|
|
328
|
+
hasNoReturnData,
|
|
316
329
|
} = returnValue;
|
|
317
330
|
|
|
318
331
|
const nestedContent: (string | undefined)[] = (nested ?? []).map(
|
|
@@ -325,9 +338,53 @@ export default function constructMockCode(
|
|
|
325
338
|
},
|
|
326
339
|
);
|
|
327
340
|
|
|
341
|
+
// Array prototype methods that should be ignored when building mocks
|
|
342
|
+
// (these work on any array - we don't need to mock them)
|
|
343
|
+
const ARRAY_PROTOTYPE_METHODS = new Set([
|
|
344
|
+
'at',
|
|
345
|
+
'concat',
|
|
346
|
+
'copyWithin',
|
|
347
|
+
'entries',
|
|
348
|
+
'every',
|
|
349
|
+
'fill',
|
|
350
|
+
'filter',
|
|
351
|
+
'find',
|
|
352
|
+
'findIndex',
|
|
353
|
+
'findLast',
|
|
354
|
+
'findLastIndex',
|
|
355
|
+
'flat',
|
|
356
|
+
'flatMap',
|
|
357
|
+
'forEach',
|
|
358
|
+
'includes',
|
|
359
|
+
'indexOf',
|
|
360
|
+
'join',
|
|
361
|
+
'keys',
|
|
362
|
+
'lastIndexOf',
|
|
363
|
+
'map',
|
|
364
|
+
'pop',
|
|
365
|
+
'push',
|
|
366
|
+
'reduce',
|
|
367
|
+
'reduceRight',
|
|
368
|
+
'reverse',
|
|
369
|
+
'shift',
|
|
370
|
+
'slice',
|
|
371
|
+
'some',
|
|
372
|
+
'sort',
|
|
373
|
+
'splice',
|
|
374
|
+
'toLocaleString',
|
|
375
|
+
'toReversed',
|
|
376
|
+
'toSorted',
|
|
377
|
+
'toSpliced',
|
|
378
|
+
'toString',
|
|
379
|
+
'unshift',
|
|
380
|
+
'values',
|
|
381
|
+
'with',
|
|
382
|
+
'length',
|
|
383
|
+
]);
|
|
384
|
+
|
|
328
385
|
const levelContentItems = [];
|
|
329
386
|
// Add spread for data paths when:
|
|
330
|
-
// - Not a function returning an array
|
|
387
|
+
// - Not a function returning an array, OR function returns array with custom methods
|
|
331
388
|
// - Has function args OR not an array
|
|
332
389
|
// - Not structural, OR is a structural [0] element with nested content
|
|
333
390
|
// (array elements with nested functions need their other properties spread)
|
|
@@ -336,8 +393,20 @@ export default function constructMockCode(
|
|
|
336
393
|
returnValue.name === '[0]' &&
|
|
337
394
|
nested &&
|
|
338
395
|
nested.length > 0;
|
|
396
|
+
// Check if function returns array but has custom methods (not just array prototype methods)
|
|
397
|
+
// Excludes array indices like [0], [1], [] which are not methods
|
|
398
|
+
const hasCustomMethodsOnArrayReturn =
|
|
399
|
+
returnsFunctionArray &&
|
|
400
|
+
nested &&
|
|
401
|
+
nested.length > 0 &&
|
|
402
|
+
nested.some((n) => {
|
|
403
|
+
// Skip array indices - they're not methods
|
|
404
|
+
if (n.name.match(/^\[\d*\]$/)) return false;
|
|
405
|
+
const methodName = n.name.replace(/[<(].*$/, '');
|
|
406
|
+
return !ARRAY_PROTOTYPE_METHODS.has(methodName);
|
|
407
|
+
});
|
|
339
408
|
if (
|
|
340
|
-
!returnsFunctionArray &&
|
|
409
|
+
(!returnsFunctionArray || hasCustomMethodsOnArrayReturn) &&
|
|
341
410
|
(returnsFunctionArgs || !isArray) &&
|
|
342
411
|
(!returnValue.isStructural || isStructuralArrayElementWithNested)
|
|
343
412
|
) {
|
|
@@ -352,14 +421,35 @@ export default function constructMockCode(
|
|
|
352
421
|
.join(', ');
|
|
353
422
|
let funcContents = '';
|
|
354
423
|
if (returnsFunctionArray) {
|
|
355
|
-
if (
|
|
424
|
+
if (hasNoReturnData) {
|
|
425
|
+
// Function has no return data (only signatures) - return empty array
|
|
426
|
+
funcContents = 'return []';
|
|
427
|
+
} else if (levelContents.length === 0 && dataPaths.length === 1) {
|
|
428
|
+
// When returning an array with no nested content, return the data path directly
|
|
429
|
+
// (the data path points to the array in scenario data)
|
|
430
|
+
funcContents = `return ${dataPaths[0]}`;
|
|
431
|
+
} else if (levelContents.length === 0) {
|
|
356
432
|
funcContents = 'return []';
|
|
357
433
|
} else {
|
|
358
434
|
funcContents = `return [\n${indent(levelContents)}\n]`;
|
|
359
435
|
}
|
|
360
436
|
} else {
|
|
437
|
+
// Check if function has no actual return data (only signatures)
|
|
438
|
+
const hasNestedItems = nested && nested.length > 0;
|
|
439
|
+
const hasActualNestedContent =
|
|
440
|
+
nestedContent.filter(Boolean).length > 0;
|
|
441
|
+
|
|
361
442
|
if (levelContentItems.length === 1 && dataPaths.length === 1) {
|
|
362
|
-
|
|
443
|
+
if (
|
|
444
|
+
hasNoReturnData ||
|
|
445
|
+
(hasNestedItems && !hasActualNestedContent)
|
|
446
|
+
) {
|
|
447
|
+
// Function has no return data (only signatures) - return empty array
|
|
448
|
+
funcContents = 'return []';
|
|
449
|
+
} else {
|
|
450
|
+
// Has return data - return data path
|
|
451
|
+
funcContents = `return ${dataPaths[0]}`;
|
|
452
|
+
}
|
|
363
453
|
} else {
|
|
364
454
|
funcContents = `return {\n${indent(levelContents)}\n}`;
|
|
365
455
|
}
|
|
@@ -372,6 +462,17 @@ export default function constructMockCode(
|
|
|
372
462
|
}
|
|
373
463
|
}
|
|
374
464
|
|
|
465
|
+
// Check if all nested items are array prototype methods
|
|
466
|
+
const hasOnlyArrayPrototypeMethods =
|
|
467
|
+
returnsFunctionArray &&
|
|
468
|
+
nested &&
|
|
469
|
+
nested.length > 0 &&
|
|
470
|
+
nested.every((n) => {
|
|
471
|
+
// Extract method name before type params and args (e.g., "reduce<...>(...)" -> "reduce")
|
|
472
|
+
const methodName = n.name.replace(/[<(].*$/, '');
|
|
473
|
+
return ARRAY_PROTOTYPE_METHODS.has(methodName);
|
|
474
|
+
});
|
|
475
|
+
|
|
375
476
|
let returnValueContents = '';
|
|
376
477
|
if (
|
|
377
478
|
!returnsFunctionArgs &&
|
|
@@ -379,6 +480,16 @@ export default function constructMockCode(
|
|
|
379
480
|
dataPaths.length === 1
|
|
380
481
|
) {
|
|
381
482
|
returnValueContents = dataPaths[0];
|
|
483
|
+
} else if (
|
|
484
|
+
returnsFunctionArray &&
|
|
485
|
+
dataPaths.length === 1 &&
|
|
486
|
+
!root &&
|
|
487
|
+
(!nested || nested.length === 0 || hasOnlyArrayPrototypeMethods)
|
|
488
|
+
) {
|
|
489
|
+
// Nested method returns an array - return the data path directly
|
|
490
|
+
// Only if nested content is empty or only contains array prototype methods
|
|
491
|
+
// (like .reduce() which work on any array - we don't need to mock them)
|
|
492
|
+
returnValueContents = dataPaths[0];
|
|
382
493
|
} else {
|
|
383
494
|
if (isArray) {
|
|
384
495
|
// When GENERIC array (using []) has nested content (like functions that need wrapping),
|
|
@@ -687,6 +798,25 @@ export default function constructMockCode(
|
|
|
687
798
|
if (returnValueSection.returnsFunctionArgs && value === 'array') {
|
|
688
799
|
returnValueSection.returnsFunctionArray = true;
|
|
689
800
|
}
|
|
801
|
+
|
|
802
|
+
// Check if this function call has actual return data in the schema
|
|
803
|
+
// If the path only has .signature entries (no .functionCallReturnValue), mark as no return data
|
|
804
|
+
// Use parts[i] (original part) instead of modified 'part' to include array indices like [1]
|
|
805
|
+
const functionCallPath = joinParenthesesAndArrays([
|
|
806
|
+
...parts.slice(0, i),
|
|
807
|
+
parts[i], // Use original part which may include [1](args) together
|
|
808
|
+
]);
|
|
809
|
+
// Check if there's a .functionCallReturnValue AFTER this function call path
|
|
810
|
+
const hasFunctionCallReturnValue = Object.keys(
|
|
811
|
+
relevantReturnValueSchema,
|
|
812
|
+
).some((k) => {
|
|
813
|
+
if (!k.startsWith(functionCallPath)) return false;
|
|
814
|
+
const afterPath = k.slice(functionCallPath.length);
|
|
815
|
+
return afterPath.startsWith('.functionCallReturnValue');
|
|
816
|
+
});
|
|
817
|
+
if (!hasFunctionCallReturnValue) {
|
|
818
|
+
returnValueSection.hasNoReturnData = true;
|
|
819
|
+
}
|
|
690
820
|
}
|
|
691
821
|
|
|
692
822
|
if (nextIsDifferentiatedArray || hasNestedFunction) {
|
|
@@ -841,6 +971,26 @@ export default function constructMockCode(
|
|
|
841
971
|
}
|
|
842
972
|
|
|
843
973
|
if (!hasNestedFunction) {
|
|
974
|
+
// Before breaking, check if this function returns an array
|
|
975
|
+
// by looking for a functionCallReturnValue: 'array' entry in the schema
|
|
976
|
+
if (relevantPart && part.endsWith(')')) {
|
|
977
|
+
const functionReturnPath = joinParenthesesAndArrays([
|
|
978
|
+
...parts.slice(0, i + 1),
|
|
979
|
+
RETURN_VALUE,
|
|
980
|
+
]);
|
|
981
|
+
const returnType = relevantReturnValueSchema[functionReturnPath];
|
|
982
|
+
if (returnType === 'array') {
|
|
983
|
+
// Only set returnsFunctionArray if the array contains plain data,
|
|
984
|
+
// NOT if it contains functions (which need wrapping)
|
|
985
|
+
const arrayElementPath = `${functionReturnPath}[]`;
|
|
986
|
+
const arrayElementType =
|
|
987
|
+
relevantReturnValueSchema[arrayElementPath];
|
|
988
|
+
// If array element is a function, we need to wrap it - don't set returnsFunctionArray
|
|
989
|
+
if (arrayElementType !== 'function') {
|
|
990
|
+
relevantPart.returnsFunctionArray = true;
|
|
991
|
+
}
|
|
992
|
+
}
|
|
993
|
+
}
|
|
844
994
|
break;
|
|
845
995
|
}
|
|
846
996
|
|
|
@@ -884,7 +1034,47 @@ export default function constructMockCode(
|
|
|
884
1034
|
|
|
885
1035
|
return `const ${mockNameParts[0]} = {\n${indent(returnParts.join(',\n'))}\n};`;
|
|
886
1036
|
} else if (isFunction) {
|
|
887
|
-
|
|
1037
|
+
// For headers() and cookies() from next/headers, add common iterator methods
|
|
1038
|
+
// These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
|
|
1039
|
+
// (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
|
|
1040
|
+
const needsIteratorMethods =
|
|
1041
|
+
mockName === 'headers' || mockName === 'cookies';
|
|
1042
|
+
let enhancedContents = contents;
|
|
1043
|
+
if (needsIteratorMethods && contents.trim().startsWith('{')) {
|
|
1044
|
+
// Add iterator methods that operate on the scenario data
|
|
1045
|
+
const iteratorMethods = `,
|
|
1046
|
+
entries: () => Object.entries(scenarios().data()?.["${mockName}()"] || {}),
|
|
1047
|
+
keys: () => Object.keys(scenarios().data()?.["${mockName}()"] || {}),
|
|
1048
|
+
values: () => Object.values(scenarios().data()?.["${mockName}()"] || {}),
|
|
1049
|
+
forEach: (fn) => Object.entries(scenarios().data()?.["${mockName}()"] || {}).forEach(([k, v]) => fn(v, k)),
|
|
1050
|
+
has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${mockName}()"] || {}, key)`;
|
|
1051
|
+
// Insert before the closing brace (handle trailing whitespace)
|
|
1052
|
+
enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
|
|
1053
|
+
}
|
|
1054
|
+
|
|
1055
|
+
// Classes need to be mocked as classes, not functions.
|
|
1056
|
+
// They're used with `new ClassName(args)` which requires a proper constructor.
|
|
1057
|
+
// A function mock like `function ClassName() { return value; }` doesn't work because
|
|
1058
|
+
// `new ClassName("arg")` wouldn't create the expected instance.
|
|
1059
|
+
// For Error subclasses (detected by name ending in "Error"), extend Error for proper error handling.
|
|
1060
|
+
if (entityType === 'class') {
|
|
1061
|
+
const isErrorSubclass = mockName.endsWith('Error');
|
|
1062
|
+
const baseClass = isErrorSubclass ? 'Error' : 'Object';
|
|
1063
|
+
const superCall = isErrorSubclass ? 'super(message);' : '';
|
|
1064
|
+
const nameAssignment = isErrorSubclass
|
|
1065
|
+
? `this.name = '${mockName}';`
|
|
1066
|
+
: '';
|
|
1067
|
+
|
|
1068
|
+
return `class ${mockName}${isErrorSubclass ? ' extends Error' : ''} {
|
|
1069
|
+
constructor(message) {
|
|
1070
|
+
${superCall}
|
|
1071
|
+
${nameAssignment}
|
|
1072
|
+
Object.assign(this, scenarios().data()?.["${mockName}()"] || {});
|
|
1073
|
+
}
|
|
1074
|
+
}`;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
return `const ${mockName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
|
|
888
1078
|
} else {
|
|
889
1079
|
return `const ${mockName} = ${contents}`;
|
|
890
1080
|
}
|
|
@@ -46,8 +46,10 @@ export function reconcileMockDataKeys(
|
|
|
46
46
|
* - Extract function name and first argument(s)
|
|
47
47
|
* - Ignore the last argument value (could be literal or variable)
|
|
48
48
|
* - Match based on the common prefix
|
|
49
|
+
* - If key has no parentheses, try matching with "()" appended
|
|
49
50
|
*
|
|
50
51
|
* e.g., "eq('user_id', 'user-12345')" matches "eq('user_id', user.id)"
|
|
52
|
+
* e.g., "getAll" matches "getAll()"
|
|
51
53
|
*/
|
|
52
54
|
function findClosestKey(key: string, expectedKeys: string[]): string | null {
|
|
53
55
|
const keyBase = extractKeyBase(key);
|
|
@@ -60,6 +62,17 @@ function findClosestKey(key: string, expectedKeys: string[]): string | null {
|
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
64
|
|
|
65
|
+
// If no match found and key has no parentheses, try matching with "()" appended
|
|
66
|
+
// This handles the case where LLM generates "getAll" but expected key is "getAll()"
|
|
67
|
+
if (!key.includes('(')) {
|
|
68
|
+
const keyWithParens = key + '()';
|
|
69
|
+
for (const expected of expectedKeys) {
|
|
70
|
+
if (expected === keyWithParens) {
|
|
71
|
+
return expected;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
63
76
|
return null;
|
|
64
77
|
}
|
|
65
78
|
|
|
@@ -184,10 +184,6 @@ export async function runMultiScenarioServer({
|
|
|
184
184
|
// Start the server (this runs in the background)
|
|
185
185
|
const serverPromise = startServer({
|
|
186
186
|
startCommand,
|
|
187
|
-
packageManager,
|
|
188
|
-
exitAfterSuccessfulAppStart,
|
|
189
|
-
framework,
|
|
190
|
-
|
|
191
187
|
onStart: async (port: number) => {
|
|
192
188
|
projectPort = port;
|
|
193
189
|
serverStarted = true;
|
|
@@ -119,10 +119,6 @@ export async function runScenarioServer({
|
|
|
119
119
|
try {
|
|
120
120
|
const code = await startServer({
|
|
121
121
|
startCommand,
|
|
122
|
-
packageManager,
|
|
123
|
-
exitAfterSuccessfulAppStart,
|
|
124
|
-
framework,
|
|
125
|
-
|
|
126
122
|
onStart: async (port: number) => {
|
|
127
123
|
if (taskCompletion) {
|
|
128
124
|
console.log(
|
|
@@ -378,17 +378,7 @@ async function main({
|
|
|
378
378
|
});
|
|
379
379
|
updateBackgroundJobProgress(backgroundJob, {
|
|
380
380
|
initiated: backgroundJob.progress.initiated,
|
|
381
|
-
steps: [
|
|
382
|
-
{
|
|
383
|
-
name: 'build-project',
|
|
384
|
-
initiated:
|
|
385
|
-
backgroundJob.progress.steps.find(
|
|
386
|
-
(s) => s.name === 'build-project',
|
|
387
|
-
)?.initiated ?? new Date().toISOString(),
|
|
388
|
-
error: error.message,
|
|
389
|
-
completed: new Date().toISOString(),
|
|
390
|
-
},
|
|
391
|
-
],
|
|
381
|
+
steps: [],
|
|
392
382
|
completed: new Date().toISOString(),
|
|
393
383
|
}).catch(() => {});
|
|
394
384
|
}
|
|
@@ -24,6 +24,11 @@ import {
|
|
|
24
24
|
} from '~codeyam/utils';
|
|
25
25
|
import getAppPath from './getAppPath';
|
|
26
26
|
import { restoreAllBackups, restoreFromBackup } from './backupFiles';
|
|
27
|
+
import {
|
|
28
|
+
readTrackingFile,
|
|
29
|
+
writeTrackingFile,
|
|
30
|
+
clearTrackingFile,
|
|
31
|
+
} from './trackGeneratedFiles';
|
|
27
32
|
import captureLibraryFunctionDirect from './captureLibraryFunctionDirect';
|
|
28
33
|
import {
|
|
29
34
|
getFrameworkForComponent,
|
|
@@ -79,6 +84,21 @@ export async function startScenarioCapture({
|
|
|
79
84
|
restoreAllBackups(fullPath);
|
|
80
85
|
}
|
|
81
86
|
|
|
87
|
+
// Clean up any leftover generated files from previous debug sessions
|
|
88
|
+
const previouslyTracked = readTrackingFile();
|
|
89
|
+
if (previouslyTracked) {
|
|
90
|
+
awsLog('CodeYam: Cleaning up files from previous session', {
|
|
91
|
+
generatedCount: previouslyTracked.generatedFiles.length,
|
|
92
|
+
backupCount: previouslyTracked.backupFiles.length,
|
|
93
|
+
timestamp: previouslyTracked.timestamp,
|
|
94
|
+
});
|
|
95
|
+
removeScenario(previouslyTracked.generatedFiles);
|
|
96
|
+
for (const backupPath of previouslyTracked.backupFiles) {
|
|
97
|
+
restoreFromBackup(backupPath);
|
|
98
|
+
}
|
|
99
|
+
clearTrackingFile();
|
|
100
|
+
}
|
|
101
|
+
|
|
82
102
|
const sortedReadyToBeCaptured = readyToBeCaptured.sort((a, b) => {
|
|
83
103
|
if (a.indirect !== b.indirect) {
|
|
84
104
|
return a.indirect ? 1 : -1;
|
|
@@ -446,6 +466,9 @@ export async function startScenarioCapture({
|
|
|
446
466
|
controller?.port,
|
|
447
467
|
);
|
|
448
468
|
allGeneratedFiles.push(codeyamPagePath);
|
|
469
|
+
|
|
470
|
+
// Persist file tracking for crash/debug recovery
|
|
471
|
+
writeTrackingFile(allGeneratedFiles, backupFiles);
|
|
449
472
|
}
|
|
450
473
|
|
|
451
474
|
// Skip if no scenarios to capture
|
|
@@ -565,6 +588,7 @@ export async function startScenarioCapture({
|
|
|
565
588
|
for (const backupPath of backupsToRestore) {
|
|
566
589
|
restoreFromBackup(backupPath);
|
|
567
590
|
}
|
|
591
|
+
clearTrackingFile();
|
|
568
592
|
}
|
|
569
593
|
};
|
|
570
594
|
|
|
@@ -1,25 +1,32 @@
|
|
|
1
1
|
import getPort from 'get-port';
|
|
2
2
|
import execAsync from '../common/execAsync';
|
|
3
|
-
import {
|
|
3
|
+
import { ServerCommand } from '~codeyam/types';
|
|
4
4
|
import { Socket } from 'net';
|
|
5
5
|
import { awsLogDebugLevel } from '~codeyam/utils';
|
|
6
6
|
|
|
7
7
|
export interface StartServerArgs {
|
|
8
|
-
startCommand
|
|
9
|
-
packageManager: string;
|
|
10
|
-
exitAfterSuccessfulAppStart?: boolean;
|
|
8
|
+
startCommand: ServerCommand;
|
|
11
9
|
onStart: (port: number) => Promise<void>;
|
|
12
10
|
onError: (data: string) => Promise<void>;
|
|
13
|
-
framework: ProjectFramework;
|
|
14
11
|
projectPort?: number;
|
|
15
12
|
}
|
|
16
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Start the project's dev server.
|
|
16
|
+
*
|
|
17
|
+
* Requires a complete startCommand with $PORT placeholder in args.
|
|
18
|
+
* The startCommand should be fully specified in the project's webapp configuration,
|
|
19
|
+
* including any package manager invocation and framework-specific flags.
|
|
20
|
+
*
|
|
21
|
+
* Examples of valid startCommand configurations:
|
|
22
|
+
* - npm: { command: 'npm', args: ['run', 'dev', '--', '--port', '$PORT'] }
|
|
23
|
+
* - pnpm: { command: 'pnpm', args: ['dev', '--port', '$PORT'] }
|
|
24
|
+
* - monorepo: { command: 'sh', args: ['-c', 'cd subdir && pnpm dev --port $PORT'] }
|
|
25
|
+
*/
|
|
17
26
|
export async function startServer({
|
|
18
27
|
startCommand,
|
|
19
|
-
packageManager,
|
|
20
28
|
onStart,
|
|
21
29
|
onError,
|
|
22
|
-
framework,
|
|
23
30
|
projectPort,
|
|
24
31
|
}: StartServerArgs) {
|
|
25
32
|
const acceptableErrorsRegexes = [
|
|
@@ -27,7 +34,7 @@ export async function startServer({
|
|
|
27
34
|
/favicon\.ico/,
|
|
28
35
|
/DeprecationWarning/,
|
|
29
36
|
/warn deprecated/,
|
|
30
|
-
/One of your dependencies, babel-preset-react-app, is importing the/,
|
|
37
|
+
/One of your dependencies, babel-preset-react-app, is importing the/,
|
|
31
38
|
/No route matches URL/,
|
|
32
39
|
/Browserslist: caniuse-lite is outdated/,
|
|
33
40
|
/npx update-browserslist-db@latest/,
|
|
@@ -37,8 +44,27 @@ export async function startServer({
|
|
|
37
44
|
];
|
|
38
45
|
|
|
39
46
|
try {
|
|
40
|
-
//
|
|
41
|
-
|
|
47
|
+
// Validate startCommand
|
|
48
|
+
if (!startCommand?.command) {
|
|
49
|
+
throw new Error(
|
|
50
|
+
'startCommand.command is required. ' +
|
|
51
|
+
'Please configure a complete startCommand in the webapp configuration.',
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (!startCommand.args?.length) {
|
|
55
|
+
throw new Error(
|
|
56
|
+
'startCommand.args is required and must be non-empty. ' +
|
|
57
|
+
'Please configure startCommand.args with $PORT placeholder.',
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
if (!startCommand.args.some((arg) => arg.includes('$PORT'))) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
'startCommand.args must include $PORT placeholder. ' +
|
|
63
|
+
'Example: ["run", "dev", "--", "--port", "$PORT"]',
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Port auto-selection (as late as possible to minimize race conditions)
|
|
42
68
|
if (!projectPort) {
|
|
43
69
|
projectPort = await getPort();
|
|
44
70
|
console.log(`CodeYam: Auto-selected project port: ${projectPort}`);
|
|
@@ -68,7 +94,6 @@ export async function startServer({
|
|
|
68
94
|
|
|
69
95
|
socket.connect(port, 'localhost');
|
|
70
96
|
|
|
71
|
-
// Don't leave socket hanging
|
|
72
97
|
timer.current = setTimeout(() => {
|
|
73
98
|
console.log(`CodeYam: checkPort: Timeout`);
|
|
74
99
|
socket.destroy();
|
|
@@ -89,66 +114,22 @@ export async function startServer({
|
|
|
89
114
|
}
|
|
90
115
|
};
|
|
91
116
|
|
|
92
|
-
//
|
|
93
|
-
const command = startCommand
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// Custom startCommand provided - clone and process it
|
|
98
|
-
args = [...args];
|
|
99
|
-
|
|
100
|
-
// Replace any $PORT placeholders with the actual port
|
|
101
|
-
let hasPort = false;
|
|
102
|
-
for (let i = 0; i < args.length; i++) {
|
|
103
|
-
if (args[i].includes('$PORT')) {
|
|
104
|
-
args[i] = args[i].replace('$PORT', projectPort.toString());
|
|
105
|
-
hasPort = true;
|
|
106
|
-
} else if (args[i] === '--port' || args[i] === '-p') {
|
|
107
|
-
hasPort = true;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
117
|
+
// Build command from startCommand (substituting $PORT)
|
|
118
|
+
const command = startCommand.command;
|
|
119
|
+
const args = startCommand.args.map((arg) =>
|
|
120
|
+
arg.replace(/\$PORT/g, projectPort.toString()),
|
|
121
|
+
);
|
|
110
122
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
if (framework === ProjectFramework.CodeYam) {
|
|
122
|
-
args = ['start', projectPort.toString()];
|
|
123
|
-
} else {
|
|
124
|
-
// there's no guarantee that the logic below will work for all frameworks, and
|
|
125
|
-
// certainly no guarantee that it'll work on any one individual project... but
|
|
126
|
-
// it's a reasonable default, and we have `startCommand` for anything bespoke
|
|
127
|
-
//
|
|
128
|
-
// All package managers support -- to pass arguments to scripts.
|
|
129
|
-
// npm requires it, and Turbo-based projects (monorepos) also require it.
|
|
130
|
-
// Using -- universally is safe and ensures compatibility.
|
|
131
|
-
args = ['run', 'dev', '--', '--port', projectPort.toString()];
|
|
132
|
-
if (framework === ProjectFramework.Remix) {
|
|
133
|
-
args.push('--strictPort');
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
let env = startCommand?.env;
|
|
138
|
-
if (!env) {
|
|
139
|
-
env = {
|
|
140
|
-
LOCAL: 'local',
|
|
141
|
-
PORT: projectPort.toString(),
|
|
142
|
-
};
|
|
143
|
-
if (framework === ProjectFramework.CRA) {
|
|
144
|
-
env.BROWSER = 'none';
|
|
145
|
-
}
|
|
146
|
-
} else {
|
|
147
|
-
// Replace $PORT placeholders in env values
|
|
148
|
-
env = { ...env };
|
|
123
|
+
// Handle env: $PORT substitution
|
|
124
|
+
let env: Record<string, string> = {
|
|
125
|
+
LOCAL: 'local',
|
|
126
|
+
PORT: projectPort.toString(),
|
|
127
|
+
};
|
|
128
|
+
if (startCommand.env) {
|
|
129
|
+
env = { ...env, ...startCommand.env };
|
|
149
130
|
for (const key of Object.keys(env)) {
|
|
150
131
|
if (typeof env[key] === 'string' && env[key].includes('$PORT')) {
|
|
151
|
-
env[key] = env[key].replace(
|
|
132
|
+
env[key] = env[key].replace(/\$PORT/g, projectPort.toString());
|
|
152
133
|
}
|
|
153
134
|
}
|
|
154
135
|
}
|
|
@@ -166,7 +147,6 @@ export async function startServer({
|
|
|
166
147
|
env,
|
|
167
148
|
workingDir: '../project',
|
|
168
149
|
acceptableErrorsRegexes,
|
|
169
|
-
// logErrors: false, // we do more selective logging ourselves
|
|
170
150
|
onError,
|
|
171
151
|
processName: 'local-project-server',
|
|
172
152
|
}),
|
|
@@ -183,6 +163,6 @@ export async function startServer({
|
|
|
183
163
|
console.log(
|
|
184
164
|
`CodeYam Error: Error executing start script: ${error.message}`,
|
|
185
165
|
);
|
|
186
|
-
throw error;
|
|
166
|
+
throw error;
|
|
187
167
|
}
|
|
188
168
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
2
|
+
|
|
3
|
+
const TRACKING_FILE_PATH = '../project/.codeyam-generated-files.json';
|
|
4
|
+
|
|
5
|
+
export interface TrackedFiles {
|
|
6
|
+
generatedFiles: string[];
|
|
7
|
+
backupFiles: string[];
|
|
8
|
+
timestamp: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function getTrackingFilePath(): string {
|
|
12
|
+
return TRACKING_FILE_PATH;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function writeTrackingFile(
|
|
16
|
+
generatedFiles: string[],
|
|
17
|
+
backupFiles: string[],
|
|
18
|
+
): void {
|
|
19
|
+
const data: TrackedFiles = {
|
|
20
|
+
generatedFiles,
|
|
21
|
+
backupFiles,
|
|
22
|
+
timestamp: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
writeFileSync(TRACKING_FILE_PATH, JSON.stringify(data, null, 2), 'utf8');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function readTrackingFile(): TrackedFiles | null {
|
|
28
|
+
if (!existsSync(TRACKING_FILE_PATH)) return null;
|
|
29
|
+
try {
|
|
30
|
+
const content = readFileSync(TRACKING_FILE_PATH, 'utf8');
|
|
31
|
+
return JSON.parse(content);
|
|
32
|
+
} catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function clearTrackingFile(): void {
|
|
38
|
+
if (existsSync(TRACKING_FILE_PATH)) {
|
|
39
|
+
unlinkSync(TRACKING_FILE_PATH);
|
|
40
|
+
}
|
|
41
|
+
}
|