@codeyam/codeyam-cli 0.1.0-staging.1 → 0.1.0-staging.28f73cf
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 +2 -1
- 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 +127 -4
- package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +1821 -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/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/generateChangesEntityKeyAttributes.ts +51 -107
- 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 +53 -176
- 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 +39 -0
- package/analyzer-template/packages/analyze/src/lib/FileAnalyzer.ts +52 -6
- package/analyzer-template/packages/analyze/src/lib/asts/nodes/index.ts +2 -1
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.ts +238 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.ts +25 -0
- package/analyzer-template/packages/analyze/src/lib/asts/sourceFiles/index.ts +2 -0
- 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/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/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/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/frameworks/getNextRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/src/lib/frameworks/getNextRoutePath.js +5 -3
- 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/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/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/frameworks/getNextRoutePath.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/src/lib/frameworks/getNextRoutePath.js +5 -3
- 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/index.ts +2 -0
- package/analyzer-template/packages/utils/src/lib/Semaphore.ts +42 -0
- package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +8 -3
- 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/project/constructMockCode.ts +170 -6
- package/analyzer-template/project/reconcileMockDataKeys.ts +13 -0
- package/analyzer-template/project/start.ts +1 -11
- package/analyzer-template/project/startScenarioCapture.ts +24 -0
- package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
- package/analyzer-template/project/writeMockDataTsx.ts +125 -4
- package/analyzer-template/project/writeScenarioComponents.ts +199 -45
- package/analyzer-template/project/writeUniversalMocks.ts +72 -10
- package/background/src/lib/virtualized/project/constructMockCode.js +158 -7
- 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/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/trackGeneratedFiles.js +30 -0
- package/background/src/lib/virtualized/project/trackGeneratedFiles.js.map +1 -0
- package/background/src/lib/virtualized/project/writeMockDataTsx.js +95 -3
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +144 -28
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/background/src/lib/virtualized/project/writeUniversalMocks.js +59 -9
- package/background/src/lib/virtualized/project/writeUniversalMocks.js.map +1 -1
- package/codeyam-cli/scripts/apply-setup.js +288 -0
- package/codeyam-cli/scripts/apply-setup.js.map +1 -0
- package/codeyam-cli/scripts/extract-setup.js +130 -0
- package/codeyam-cli/scripts/extract-setup.js.map +1 -0
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js +238 -0
- package/codeyam-cli/scripts/fixtures/cal.com/universal-mocks/packages/prisma/index.js.map +1 -0
- 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 +221 -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 +164 -0
- package/codeyam-cli/src/commands/setup-sandbox.js.map +1 -0
- 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 +4 -3
- package/codeyam-cli/src/utils/analysisRunner.js.map +1 -1
- package/codeyam-cli/src/utils/analyzer.js +30 -0
- package/codeyam-cli/src/utils/analyzer.js.map +1 -1
- package/codeyam-cli/src/utils/backgroundServer.js +25 -5
- package/codeyam-cli/src/utils/backgroundServer.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/fileWatcher.js +75 -5
- package/codeyam-cli/src/utils/fileWatcher.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 +8 -3
- package/codeyam-cli/src/utils/queue/job.js.map +1 -1
- 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 +63 -2
- package/codeyam-cli/src/webserver/app/lib/database.js.map +1 -1
- package/codeyam-cli/src/webserver/backgroundServer.js +15 -35
- package/codeyam-cli/src/webserver/backgroundServer.js.map +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-D5ZHFomX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-Dh-FldQK.js → InteractivePreview-XDSzQLOY.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-BYVx9KFp.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-Dp6DC845.js → LogViewer-CRcT5fOZ.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/ReportIssueModal-BORLgi0X.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-Bual6h18.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bi-YUMa-.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-4D2vLLJz.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/_index-BC200mfN.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CxvZPkCv.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-B2I7jQx2.js → chart-column-B8fb6wnw.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-De6i8FUT.js +26 -0
- package/codeyam-cli/src/webserver/build/client/assets/{circle-alert-GwwOAbhw.js → circle-alert-IdsgAK39.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/circle-check-BACUUf75.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/clock-vWeoCemX.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CS7XDrKv.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DIOEw_3i.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-1Z6D0fLM.js → entity._sha._-8Els_3Wb.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-C3FZJx1w.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-YJz_igar.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entityStatus-BEqj2qBy.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entityVersioning-DO2gCvXv.js → entityVersioning-Bk_YB1jM.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-DiP0q291.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/file-text-LM0mgxXE.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-Dxh9CcaV.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-BXmqrWCH.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-BGS74ED-.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-D-zYbzFZ.js +8 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-DN7Vr40D.js → loader-circle-BXPKbHEb.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-1af162d4.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-DB7VgjCY.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{settings-MZc4XdmE.js → settings-5zF_GOcS.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-Dc4MlMpK.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-BQ-02-jB.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/triangle-alert-D7k-ArFa.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-BBlyqxij.js → useLastLogLine-AlhS7g5F.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-Ddo4UQv7.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{zap-B4gsLUZQ.js → zap-_jw-9DCp.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-D4JpXSIO.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-vwbN7n65.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 +85 -94
- package/codeyam-cli/templates/debug-command.md +125 -0
- package/package.json +9 -11
- package/packages/ai/index.js +1 -2
- 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 +111 -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 +1320 -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/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/generateChangesEntityKeyAttributes.js +51 -107
- package/packages/ai/src/lib/generateChangesEntityKeyAttributes.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 +53 -176
- 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 +45 -5
- package/packages/analyze/src/lib/FileAnalyzer.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/getAllDeclaredEntityNodes.js +191 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getAllDeclaredEntityNodes.js.map +1 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.js +16 -0
- package/packages/analyze/src/lib/asts/sourceFiles/getDeclaredEntityNode.js.map +1 -0
- package/packages/analyze/src/lib/asts/sourceFiles/index.js +2 -0
- package/packages/analyze/src/lib/asts/sourceFiles/index.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/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/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/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/frameworks/getNextRoutePath.js +5 -3
- 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/analyzer-template/packages/ai/src/lib/generateEntityDataMap.ts +0 -375
- package/codeyam-cli/src/webserver/build/client/assets/EntityTypeIcon-GqWwt5wG.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-p0fuyqGQ.js +0 -3
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-xwuhwsZH.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bl2IRh55.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioViewer-M2QuSHKC.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/_index-CAVtep9Q.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-CLmzsLsT.js +0 -10
- package/codeyam-cli/src/webserver/build/client/assets/components-CAx5ONX_.js +0 -40
- package/codeyam-cli/src/webserver/build/client/assets/createLucideIcon-CgyOwWip.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-DGy3zrli.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-ChAdTrrU.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-D9L7267w.js +0 -5
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-C6FRgjPr.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/files-C3-cQjgv.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/git-Dp4EB9nv.js +0 -12
- package/codeyam-cli/src/webserver/build/client/assets/globals-Da3jt49-.css +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-172a4629.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/root-COyVTsPq.js +0 -16
- package/codeyam-cli/src/webserver/build/client/assets/search-CvyP_1Lo.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-Hbf8b7J_.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/simulations-BMBi0VzO.js +0 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-C_VxoXTh.js +0 -1
- package/codeyam-cli/src/webserver/build/client/cy-logo-cli.svg +0 -13
- package/codeyam-cli/src/webserver/build/server/assets/index-eAULANMV.js +0 -1
- package/codeyam-cli/src/webserver/build/server/assets/server-build-lutv16q5.js +0 -161
- package/codeyam-cli/src/webserver/public/cy-logo-cli.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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { default as Semaphore } from './src/lib/Semaphore';
|
|
1
2
|
export { default as isRemixRoute } from './src/lib/frameworks/isRemixRoute';
|
|
2
3
|
export { default as isNextRoute } from './src/lib/frameworks/isNextRoute';
|
|
3
4
|
export { default as isFrameworkRoute } from './src/lib/frameworks/isFrameworkRoute';
|
|
@@ -7,6 +8,7 @@ export { default as frameworkRouteFileNameToRoute } from './src/lib/frameworks/f
|
|
|
7
8
|
export { default as getRemixRoutePath } from './src/lib/frameworks/getRemixRoutePath';
|
|
8
9
|
export { default as getNextRoutePath } from './src/lib/frameworks/getNextRoutePath';
|
|
9
10
|
export { default as getFrameworkRoutePath } from './src/lib/frameworks/getFrameworkRoutePath';
|
|
11
|
+
export { default as sanitizeNextRouteSegments } from './src/lib/frameworks/sanitizeNextRouteSegments';
|
|
10
12
|
export { default as safeFileName } from './src/lib/safeFileName';
|
|
11
13
|
export { default as normalizeKey } from './src/lib/normalizeKey';
|
|
12
14
|
export {
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An async semaphore for limiting concurrent access to a resource.
|
|
3
|
+
*
|
|
4
|
+
* Useful for controlling parallelism when some operations are CPU-bound
|
|
5
|
+
* and shouldn't all run simultaneously, while allowing I/O-bound operations
|
|
6
|
+
* to proceed freely.
|
|
7
|
+
*/
|
|
8
|
+
export default class Semaphore {
|
|
9
|
+
private count: number;
|
|
10
|
+
private waiting: Array<() => void> = [];
|
|
11
|
+
|
|
12
|
+
constructor(count: number) {
|
|
13
|
+
this.count = count;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Acquire a permit from the semaphore.
|
|
18
|
+
* If a permit is available, returns immediately.
|
|
19
|
+
* Otherwise, blocks until a permit becomes available.
|
|
20
|
+
*/
|
|
21
|
+
async acquire(): Promise<void> {
|
|
22
|
+
if (this.count > 0) {
|
|
23
|
+
this.count--;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
await new Promise<void>((resolve) => this.waiting.push(resolve));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Release a permit back to the semaphore.
|
|
31
|
+
* If there are waiters, the first one in line gets the permit.
|
|
32
|
+
* Otherwise, increments the available count.
|
|
33
|
+
*/
|
|
34
|
+
release(): void {
|
|
35
|
+
const next = this.waiting.shift();
|
|
36
|
+
if (next) {
|
|
37
|
+
next();
|
|
38
|
+
} else {
|
|
39
|
+
this.count++;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { safeFileName } from '~codeyam/utils';
|
|
1
|
+
import { getAppDirectoryForFile, safeFileName } from '~codeyam/utils';
|
|
2
2
|
import {
|
|
3
3
|
Analysis,
|
|
4
4
|
ReadonlyEntity,
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
ProjectFramework,
|
|
8
8
|
} from '~codeyam/types';
|
|
9
9
|
import { PROJECT_RELATIVE_PATH } from '~codeyam/utils';
|
|
10
|
+
import sanitizeNextRouteSegments from './sanitizeNextRouteSegments';
|
|
10
11
|
|
|
11
12
|
export default function getNextRoutePath({
|
|
12
13
|
file,
|
|
@@ -24,11 +25,15 @@ export default function getNextRoutePath({
|
|
|
24
25
|
framework: ProjectFramework;
|
|
25
26
|
scenario?: { name: string };
|
|
26
27
|
}) {
|
|
27
|
-
const routePath = file.path.split('/').slice(1);
|
|
28
|
+
const routePath = sanitizeNextRouteSegments(file.path.split('/').slice(1));
|
|
28
29
|
const scenarioSlug = scenario ? safeFileName(scenario.name) : undefined;
|
|
30
|
+
const appDirectory = getAppDirectoryForFile(
|
|
31
|
+
file.path,
|
|
32
|
+
project.metadata?.webapps,
|
|
33
|
+
);
|
|
29
34
|
const pathComponents = [
|
|
30
35
|
PROJECT_RELATIVE_PATH,
|
|
31
|
-
|
|
36
|
+
appDirectory,
|
|
32
37
|
'static',
|
|
33
38
|
project.slug,
|
|
34
39
|
rootAnalysis.id,
|
|
@@ -31,7 +31,8 @@ export default function getRemixRoutePath({
|
|
|
31
31
|
const route = file.path.slice(routesIndex);
|
|
32
32
|
const cleanRoute = route
|
|
33
33
|
.replace(/\//g, '.')
|
|
34
|
-
.replace(
|
|
34
|
+
.replace(/\$(\w+)/g, '$1') // $slug -> slug (named params)
|
|
35
|
+
.replace(/\$/g, 'splat') // bare $ -> splat (catch-all)
|
|
35
36
|
.replace(/_/g, 'x');
|
|
36
37
|
|
|
37
38
|
const scenarioSlug = scenario ? `.${safeFileName(scenario.name)}` : '';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Analysis, File } from '~codeyam/types';
|
|
2
2
|
import safeFileName from '../safeFileName';
|
|
3
|
+
import sanitizeNextRouteSegments from './sanitizeNextRouteSegments';
|
|
3
4
|
|
|
4
5
|
export default function nextRouteFileNameToRoute(
|
|
5
6
|
projectSlug: string,
|
|
@@ -7,7 +8,7 @@ export default function nextRouteFileNameToRoute(
|
|
|
7
8
|
analysis: Analysis,
|
|
8
9
|
scenarioName?: string,
|
|
9
10
|
) {
|
|
10
|
-
const route = file.path.split('/').slice(1, -1);
|
|
11
|
+
const route = sanitizeNextRouteSegments(file.path.split('/').slice(1, -1));
|
|
11
12
|
const pathComponents = [
|
|
12
13
|
'static',
|
|
13
14
|
projectSlug,
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitize Next.js route path segments to remove special syntax.
|
|
3
|
+
* - Route groups (folder) become folder (strip parens, keep name)
|
|
4
|
+
* - Dynamic segments [param] become param0 (suffix avoids Next.js private folder convention)
|
|
5
|
+
* - Catch-all [...slug] becomes slug0
|
|
6
|
+
* - Optional catch-all [[...slug]] becomes slug0
|
|
7
|
+
*
|
|
8
|
+
* Note: We use suffix "0" instead of prefix "_" because Next.js treats folders
|
|
9
|
+
* starting with underscore as private segments that are excluded from routing.
|
|
10
|
+
*/
|
|
11
|
+
export default function sanitizeNextRouteSegments(
|
|
12
|
+
segments: string[],
|
|
13
|
+
): string[] {
|
|
14
|
+
return segments.map((segment) => {
|
|
15
|
+
// Handle route groups (folder) - strip parens, keep name
|
|
16
|
+
const routeGroup = segment.match(/^\(([^)]+)\)$/);
|
|
17
|
+
if (routeGroup) return routeGroup[1];
|
|
18
|
+
|
|
19
|
+
// Handle optional catch-all [[...param]]
|
|
20
|
+
const optionalCatchAll = segment.match(/^\[\[\.\.\.([\w]+)\]\]$/);
|
|
21
|
+
if (optionalCatchAll) return `${optionalCatchAll[1]}0`;
|
|
22
|
+
|
|
23
|
+
// Handle catch-all [...param]
|
|
24
|
+
const catchAll = segment.match(/^\[\.\.\.([\w]+)\]$/);
|
|
25
|
+
if (catchAll) return `${catchAll[1]}0`;
|
|
26
|
+
|
|
27
|
+
// Handle dynamic [param]
|
|
28
|
+
const dynamic = segment.match(/^\[([\w]+)\]$/);
|
|
29
|
+
if (dynamic) return `${dynamic[1]}0`;
|
|
30
|
+
|
|
31
|
+
return segment;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
@@ -18,6 +18,7 @@ interface ReturnValuePart {
|
|
|
18
18
|
nested?: ReturnValuePart[];
|
|
19
19
|
isAsyncFunction?: boolean;
|
|
20
20
|
isStructural?: boolean;
|
|
21
|
+
hasNoReturnData?: boolean; // true when function has only signature entries, no functionCallReturnValue
|
|
21
22
|
// Maps literal argument values to their specific nested structures for conditional dispatch
|
|
22
23
|
argVariants?: Map<string, ReturnValuePart[]>;
|
|
23
24
|
}
|
|
@@ -273,7 +274,15 @@ export default function constructMockCode(
|
|
|
273
274
|
}
|
|
274
275
|
|
|
275
276
|
const addReturnValueFunctionAccessor = (dataPath: string) => {
|
|
276
|
-
|
|
277
|
+
// Add function call accessor if:
|
|
278
|
+
// - There are actual arguments, OR
|
|
279
|
+
// - This is a callable (not a method that returns an array directly)
|
|
280
|
+
// For methods like getAll() that return arrays, the data is at ["getAll()"] not ["getAll()"]["()"]
|
|
281
|
+
if (
|
|
282
|
+
returnValue.returnsFunctionArgs &&
|
|
283
|
+
(returnValue.returnsFunctionArgs.length > 0 ||
|
|
284
|
+
!returnValue.returnsFunctionArray)
|
|
285
|
+
) {
|
|
277
286
|
if (returnValue.isArray) {
|
|
278
287
|
dataPath = `${dataPath}${optionalAccess('[0]')}`;
|
|
279
288
|
}
|
|
@@ -313,6 +322,7 @@ export default function constructMockCode(
|
|
|
313
322
|
returnsFunctionArgs,
|
|
314
323
|
returnsFunctionArray,
|
|
315
324
|
isAsyncFunction,
|
|
325
|
+
hasNoReturnData,
|
|
316
326
|
} = returnValue;
|
|
317
327
|
|
|
318
328
|
const nestedContent: (string | undefined)[] = (nested ?? []).map(
|
|
@@ -325,9 +335,53 @@ export default function constructMockCode(
|
|
|
325
335
|
},
|
|
326
336
|
);
|
|
327
337
|
|
|
338
|
+
// Array prototype methods that should be ignored when building mocks
|
|
339
|
+
// (these work on any array - we don't need to mock them)
|
|
340
|
+
const ARRAY_PROTOTYPE_METHODS = new Set([
|
|
341
|
+
'at',
|
|
342
|
+
'concat',
|
|
343
|
+
'copyWithin',
|
|
344
|
+
'entries',
|
|
345
|
+
'every',
|
|
346
|
+
'fill',
|
|
347
|
+
'filter',
|
|
348
|
+
'find',
|
|
349
|
+
'findIndex',
|
|
350
|
+
'findLast',
|
|
351
|
+
'findLastIndex',
|
|
352
|
+
'flat',
|
|
353
|
+
'flatMap',
|
|
354
|
+
'forEach',
|
|
355
|
+
'includes',
|
|
356
|
+
'indexOf',
|
|
357
|
+
'join',
|
|
358
|
+
'keys',
|
|
359
|
+
'lastIndexOf',
|
|
360
|
+
'map',
|
|
361
|
+
'pop',
|
|
362
|
+
'push',
|
|
363
|
+
'reduce',
|
|
364
|
+
'reduceRight',
|
|
365
|
+
'reverse',
|
|
366
|
+
'shift',
|
|
367
|
+
'slice',
|
|
368
|
+
'some',
|
|
369
|
+
'sort',
|
|
370
|
+
'splice',
|
|
371
|
+
'toLocaleString',
|
|
372
|
+
'toReversed',
|
|
373
|
+
'toSorted',
|
|
374
|
+
'toSpliced',
|
|
375
|
+
'toString',
|
|
376
|
+
'unshift',
|
|
377
|
+
'values',
|
|
378
|
+
'with',
|
|
379
|
+
'length',
|
|
380
|
+
]);
|
|
381
|
+
|
|
328
382
|
const levelContentItems = [];
|
|
329
383
|
// Add spread for data paths when:
|
|
330
|
-
// - Not a function returning an array
|
|
384
|
+
// - Not a function returning an array, OR function returns array with custom methods
|
|
331
385
|
// - Has function args OR not an array
|
|
332
386
|
// - Not structural, OR is a structural [0] element with nested content
|
|
333
387
|
// (array elements with nested functions need their other properties spread)
|
|
@@ -336,8 +390,20 @@ export default function constructMockCode(
|
|
|
336
390
|
returnValue.name === '[0]' &&
|
|
337
391
|
nested &&
|
|
338
392
|
nested.length > 0;
|
|
393
|
+
// Check if function returns array but has custom methods (not just array prototype methods)
|
|
394
|
+
// Excludes array indices like [0], [1], [] which are not methods
|
|
395
|
+
const hasCustomMethodsOnArrayReturn =
|
|
396
|
+
returnsFunctionArray &&
|
|
397
|
+
nested &&
|
|
398
|
+
nested.length > 0 &&
|
|
399
|
+
nested.some((n) => {
|
|
400
|
+
// Skip array indices - they're not methods
|
|
401
|
+
if (n.name.match(/^\[\d*\]$/)) return false;
|
|
402
|
+
const methodName = n.name.replace(/[<(].*$/, '');
|
|
403
|
+
return !ARRAY_PROTOTYPE_METHODS.has(methodName);
|
|
404
|
+
});
|
|
339
405
|
if (
|
|
340
|
-
!returnsFunctionArray &&
|
|
406
|
+
(!returnsFunctionArray || hasCustomMethodsOnArrayReturn) &&
|
|
341
407
|
(returnsFunctionArgs || !isArray) &&
|
|
342
408
|
(!returnValue.isStructural || isStructuralArrayElementWithNested)
|
|
343
409
|
) {
|
|
@@ -352,14 +418,35 @@ export default function constructMockCode(
|
|
|
352
418
|
.join(', ');
|
|
353
419
|
let funcContents = '';
|
|
354
420
|
if (returnsFunctionArray) {
|
|
355
|
-
if (
|
|
421
|
+
if (hasNoReturnData) {
|
|
422
|
+
// Function has no return data (only signatures) - return empty array
|
|
423
|
+
funcContents = 'return []';
|
|
424
|
+
} else if (levelContents.length === 0 && dataPaths.length === 1) {
|
|
425
|
+
// When returning an array with no nested content, return the data path directly
|
|
426
|
+
// (the data path points to the array in scenario data)
|
|
427
|
+
funcContents = `return ${dataPaths[0]}`;
|
|
428
|
+
} else if (levelContents.length === 0) {
|
|
356
429
|
funcContents = 'return []';
|
|
357
430
|
} else {
|
|
358
431
|
funcContents = `return [\n${indent(levelContents)}\n]`;
|
|
359
432
|
}
|
|
360
433
|
} else {
|
|
434
|
+
// Check if function has no actual return data (only signatures)
|
|
435
|
+
const hasNestedItems = nested && nested.length > 0;
|
|
436
|
+
const hasActualNestedContent =
|
|
437
|
+
nestedContent.filter(Boolean).length > 0;
|
|
438
|
+
|
|
361
439
|
if (levelContentItems.length === 1 && dataPaths.length === 1) {
|
|
362
|
-
|
|
440
|
+
if (
|
|
441
|
+
hasNoReturnData ||
|
|
442
|
+
(hasNestedItems && !hasActualNestedContent)
|
|
443
|
+
) {
|
|
444
|
+
// Function has no return data (only signatures) - return empty array
|
|
445
|
+
funcContents = 'return []';
|
|
446
|
+
} else {
|
|
447
|
+
// Has return data - return data path
|
|
448
|
+
funcContents = `return ${dataPaths[0]}`;
|
|
449
|
+
}
|
|
363
450
|
} else {
|
|
364
451
|
funcContents = `return {\n${indent(levelContents)}\n}`;
|
|
365
452
|
}
|
|
@@ -372,6 +459,17 @@ export default function constructMockCode(
|
|
|
372
459
|
}
|
|
373
460
|
}
|
|
374
461
|
|
|
462
|
+
// Check if all nested items are array prototype methods
|
|
463
|
+
const hasOnlyArrayPrototypeMethods =
|
|
464
|
+
returnsFunctionArray &&
|
|
465
|
+
nested &&
|
|
466
|
+
nested.length > 0 &&
|
|
467
|
+
nested.every((n) => {
|
|
468
|
+
// Extract method name before type params and args (e.g., "reduce<...>(...)" -> "reduce")
|
|
469
|
+
const methodName = n.name.replace(/[<(].*$/, '');
|
|
470
|
+
return ARRAY_PROTOTYPE_METHODS.has(methodName);
|
|
471
|
+
});
|
|
472
|
+
|
|
375
473
|
let returnValueContents = '';
|
|
376
474
|
if (
|
|
377
475
|
!returnsFunctionArgs &&
|
|
@@ -379,6 +477,16 @@ export default function constructMockCode(
|
|
|
379
477
|
dataPaths.length === 1
|
|
380
478
|
) {
|
|
381
479
|
returnValueContents = dataPaths[0];
|
|
480
|
+
} else if (
|
|
481
|
+
returnsFunctionArray &&
|
|
482
|
+
dataPaths.length === 1 &&
|
|
483
|
+
!root &&
|
|
484
|
+
(!nested || nested.length === 0 || hasOnlyArrayPrototypeMethods)
|
|
485
|
+
) {
|
|
486
|
+
// Nested method returns an array - return the data path directly
|
|
487
|
+
// Only if nested content is empty or only contains array prototype methods
|
|
488
|
+
// (like .reduce() which work on any array - we don't need to mock them)
|
|
489
|
+
returnValueContents = dataPaths[0];
|
|
382
490
|
} else {
|
|
383
491
|
if (isArray) {
|
|
384
492
|
// When GENERIC array (using []) has nested content (like functions that need wrapping),
|
|
@@ -687,6 +795,25 @@ export default function constructMockCode(
|
|
|
687
795
|
if (returnValueSection.returnsFunctionArgs && value === 'array') {
|
|
688
796
|
returnValueSection.returnsFunctionArray = true;
|
|
689
797
|
}
|
|
798
|
+
|
|
799
|
+
// Check if this function call has actual return data in the schema
|
|
800
|
+
// If the path only has .signature entries (no .functionCallReturnValue), mark as no return data
|
|
801
|
+
// Use parts[i] (original part) instead of modified 'part' to include array indices like [1]
|
|
802
|
+
const functionCallPath = joinParenthesesAndArrays([
|
|
803
|
+
...parts.slice(0, i),
|
|
804
|
+
parts[i], // Use original part which may include [1](args) together
|
|
805
|
+
]);
|
|
806
|
+
// Check if there's a .functionCallReturnValue AFTER this function call path
|
|
807
|
+
const hasFunctionCallReturnValue = Object.keys(
|
|
808
|
+
relevantReturnValueSchema,
|
|
809
|
+
).some((k) => {
|
|
810
|
+
if (!k.startsWith(functionCallPath)) return false;
|
|
811
|
+
const afterPath = k.slice(functionCallPath.length);
|
|
812
|
+
return afterPath.startsWith('.functionCallReturnValue');
|
|
813
|
+
});
|
|
814
|
+
if (!hasFunctionCallReturnValue) {
|
|
815
|
+
returnValueSection.hasNoReturnData = true;
|
|
816
|
+
}
|
|
690
817
|
}
|
|
691
818
|
|
|
692
819
|
if (nextIsDifferentiatedArray || hasNestedFunction) {
|
|
@@ -841,6 +968,26 @@ export default function constructMockCode(
|
|
|
841
968
|
}
|
|
842
969
|
|
|
843
970
|
if (!hasNestedFunction) {
|
|
971
|
+
// Before breaking, check if this function returns an array
|
|
972
|
+
// by looking for a functionCallReturnValue: 'array' entry in the schema
|
|
973
|
+
if (relevantPart && part.endsWith(')')) {
|
|
974
|
+
const functionReturnPath = joinParenthesesAndArrays([
|
|
975
|
+
...parts.slice(0, i + 1),
|
|
976
|
+
RETURN_VALUE,
|
|
977
|
+
]);
|
|
978
|
+
const returnType = relevantReturnValueSchema[functionReturnPath];
|
|
979
|
+
if (returnType === 'array') {
|
|
980
|
+
// Only set returnsFunctionArray if the array contains plain data,
|
|
981
|
+
// NOT if it contains functions (which need wrapping)
|
|
982
|
+
const arrayElementPath = `${functionReturnPath}[]`;
|
|
983
|
+
const arrayElementType =
|
|
984
|
+
relevantReturnValueSchema[arrayElementPath];
|
|
985
|
+
// If array element is a function, we need to wrap it - don't set returnsFunctionArray
|
|
986
|
+
if (arrayElementType !== 'function') {
|
|
987
|
+
relevantPart.returnsFunctionArray = true;
|
|
988
|
+
}
|
|
989
|
+
}
|
|
990
|
+
}
|
|
844
991
|
break;
|
|
845
992
|
}
|
|
846
993
|
|
|
@@ -884,7 +1031,24 @@ export default function constructMockCode(
|
|
|
884
1031
|
|
|
885
1032
|
return `const ${mockNameParts[0]} = {\n${indent(returnParts.join(',\n'))}\n};`;
|
|
886
1033
|
} else if (isFunction) {
|
|
887
|
-
|
|
1034
|
+
// For headers() and cookies() from next/headers, add common iterator methods
|
|
1035
|
+
// These are needed when the mock is passed to functions that use .entries(), .keys(), etc.
|
|
1036
|
+
// (e.g., Object.fromEntries(headers.entries()) in buildLegacyHeaders)
|
|
1037
|
+
const needsIteratorMethods =
|
|
1038
|
+
mockName === 'headers' || mockName === 'cookies';
|
|
1039
|
+
let enhancedContents = contents;
|
|
1040
|
+
if (needsIteratorMethods && contents.trim().startsWith('{')) {
|
|
1041
|
+
// Add iterator methods that operate on the scenario data
|
|
1042
|
+
const iteratorMethods = `,
|
|
1043
|
+
entries: () => Object.entries(scenarios().data()?.["${mockName}()"] || {}),
|
|
1044
|
+
keys: () => Object.keys(scenarios().data()?.["${mockName}()"] || {}),
|
|
1045
|
+
values: () => Object.values(scenarios().data()?.["${mockName}()"] || {}),
|
|
1046
|
+
forEach: (fn) => Object.entries(scenarios().data()?.["${mockName}()"] || {}).forEach(([k, v]) => fn(v, k)),
|
|
1047
|
+
has: (key) => Object.prototype.hasOwnProperty.call(scenarios().data()?.["${mockName}()"] || {}, key)`;
|
|
1048
|
+
// Insert before the closing brace (handle trailing whitespace)
|
|
1049
|
+
enhancedContents = contents.replace(/\}\s*$/, iteratorMethods + '\n}');
|
|
1050
|
+
}
|
|
1051
|
+
return `const ${mockName}ReturnValue = ${enhancedContents};\n\n${isRootAsyncFunction ? 'async ' : ''}function ${mockName}() {\n${indent(`return ${mockName}ReturnValue;`)}\n}`;
|
|
888
1052
|
} else {
|
|
889
1053
|
return `const ${mockName} = ${contents}`;
|
|
890
1054
|
}
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -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
|
+
}
|