@codeyam/codeyam-cli 0.1.0-bleeding-edge.8afd3ee → 0.1.0-staging.09652b8
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 +1 -1
- package/analyzer-template/packages/ai/index.ts +0 -1
- package/analyzer-template/packages/ai/scripts/ai-test-matrix.mjs +424 -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 +113 -4
- package/analyzer-template/packages/ai/src/lib/checkAllAttributes.ts +1 -3
- package/analyzer-template/packages/ai/src/lib/dataStructure/ScopeDataStructure.ts +430 -7
- package/analyzer-template/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.ts +12 -6
- 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/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/getLLMCallStats.ts +0 -14
- package/analyzer-template/packages/ai/src/lib/modelInfo.ts +15 -0
- 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/analyze/src/lib/files/scenarios/mergeInDependentDataStructure.ts +15 -7
- 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/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/utils/index.d.ts +1 -0
- package/analyzer-template/packages/github/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/github/dist/utils/index.js +1 -0
- package/analyzer-template/packages/github/dist/utils/index.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/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/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/ui-components/src/scenario-editor/components/DataItemEditor.tsx +1 -1
- package/analyzer-template/packages/utils/dist/utils/index.d.ts +1 -0
- package/analyzer-template/packages/utils/dist/utils/index.d.ts.map +1 -1
- package/analyzer-template/packages/utils/dist/utils/index.js +1 -0
- package/analyzer-template/packages/utils/dist/utils/index.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/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/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 +1 -0
- package/analyzer-template/packages/utils/src/lib/frameworks/getNextRoutePath.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.ts +2 -1
- package/analyzer-template/packages/utils/src/lib/frameworks/sanitizeNextRouteSegments.ts +33 -0
- package/analyzer-template/project/startScenarioCapture.ts +24 -0
- package/analyzer-template/project/trackGeneratedFiles.ts +41 -0
- package/analyzer-template/project/writeMockDataTsx.ts +94 -4
- package/analyzer-template/project/writeScenarioComponents.ts +35 -27
- 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 +71 -3
- package/background/src/lib/virtualized/project/writeMockDataTsx.js.map +1 -1
- package/background/src/lib/virtualized/project/writeScenarioComponents.js +15 -11
- package/background/src/lib/virtualized/project/writeScenarioComponents.js.map +1 -1
- package/codeyam-cli/src/commands/init.js +4 -23
- package/codeyam-cli/src/commands/init.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/build/client/assets/EntityTypeIcon-B9Sf8e9w.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{InteractivePreview-B0oiPem-.js → InteractivePreview-CDnfNKKQ.js} +3 -3
- package/codeyam-cli/src/webserver/build/client/assets/LibraryFunctionPreview-DUS-3h7I.js +3 -0
- package/codeyam-cli/src/webserver/build/client/assets/{LogViewer-BKKG1s2B.js → LogViewer-TJzDQku1.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/SafeScreenshot-BgdlWM6p.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/ScenarioPreview-Bl6GY-OE.js +6 -0
- package/codeyam-cli/src/webserver/build/client/assets/{ScenarioViewer-DmjXUj6m.js → ScenarioViewer-BDq8RX50.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/_index-Bh3y3Wsl.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/activity.(_tab)-tq7Bl6-t.js +10 -0
- package/codeyam-cli/src/webserver/build/client/assets/{chart-column-VXBS6qOn.js → chart-column-q9_nHfwv.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/chunk-WWGJGFF6-DvL0YqDJ.js +26 -0
- package/codeyam-cli/src/webserver/build/client/assets/{circle-alert-n5GUC2AS.js → circle-alert-CKMpA1v_.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{clock-DKqtX8js.js → clock-Wnfog8Qw.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/dev.empty-C_ixaqqh.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{entity._sha._-BHiWkb_W.js → entity._sha._-3bYjyojg.js} +10 -10
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.create-scenario-DtfwpN9J.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/entity._sha_.edit._scenarioId-QecTs_sq.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/entry.client-hnkEgHrC.js +5 -0
- package/codeyam-cli/src/webserver/build/client/assets/file-text-CvCVdKLW.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/files-DgUCYhbd.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/git-WoKohOtW.js +12 -0
- package/codeyam-cli/src/webserver/build/client/assets/globals-DZfbt0u5.css +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/index-Vvbl94Xc.js +8 -0
- package/codeyam-cli/src/webserver/build/client/assets/{loader-circle-v3c6DFp4.js → loader-circle-Bxm63UxG.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/manifest-c90b8608.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/root-DrVZQamX.js +16 -0
- package/codeyam-cli/src/webserver/build/client/assets/{search-DA14wXpu.js → search-CJkk16Ct.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/{settings-COJUrwGu.js → settings-ConzHeiL.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/settings-LuiJ1UIm.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/simulations-B9LRwAej.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{useLastLogLine-Lumm1t01.js → useLastLogLine-CpUcCv1V.js} +1 -1
- package/codeyam-cli/src/webserver/build/client/assets/useToast-DOxmMaSg.js +1 -0
- package/codeyam-cli/src/webserver/build/client/assets/{zap-BvukH0eN.js → zap-D5R1FAcH.js} +1 -1
- package/codeyam-cli/src/webserver/build/server/assets/index-DzbqTxoN.js +1 -0
- package/codeyam-cli/src/webserver/build/server/assets/server-build-DGGis3OZ.js +166 -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 +5 -0
- package/package.json +7 -7
- package/packages/ai/index.js +0 -1
- package/packages/ai/index.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 +99 -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 +308 -2
- package/packages/ai/src/lib/dataStructure/ScopeDataStructure.js.map +1 -1
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.js +12 -6
- package/packages/ai/src/lib/dataStructure/helpers/fillInSchemaGapsAndUnknowns.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/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/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/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/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/utils/index.js +1 -0
- package/packages/utils/index.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/nextRouteFileNameToRoute.js +2 -1
- package/packages/utils/src/lib/frameworks/nextRouteFileNameToRoute.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-rqv54FUY.js +0 -1
- 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/_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/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/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/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/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
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"buildTimestamp": "2025-12-
|
|
3
|
-
"buildTime":
|
|
4
|
-
"gitCommit": "
|
|
2
|
+
"buildTimestamp": "2025-12-11T19:58:38.049Z",
|
|
3
|
+
"buildTime": 1765483118049,
|
|
4
|
+
"gitCommit": "09652b804d2c3f3bc36b68a17478631e582f31af",
|
|
5
5
|
"nodeVersion": "v20.19.6",
|
|
6
|
-
"contentHash": "
|
|
7
|
-
"buildNumber":
|
|
8
|
-
"semanticVersion": "0.1.
|
|
9
|
-
"version": "0.1.
|
|
6
|
+
"contentHash": "6e8c56946bdcea6f1963d242e2b564537497d45ca94380cb79761d60d176e37e",
|
|
7
|
+
"buildNumber": 70,
|
|
8
|
+
"semanticVersion": "0.1.70",
|
|
9
|
+
"version": "0.1.70 (2025-12-11T19:58+6e8c569)"
|
|
10
10
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
|
|
2
|
-
[12/
|
|
3
|
-
[12/
|
|
2
|
+
[12/11/2025, 7:58:37 PM] > codeyam-combo@1.0.0 mergeDependencies
|
|
3
|
+
[12/11/2025, 7:58:37 PM] > node ./scripts/mergePackageJsonFiles.cjs
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
[12/
|
|
6
|
+
[12/11/2025, 7:58:38 PM] Merged dependencies into root package.json
|
|
7
7
|
|
|
@@ -13,7 +13,6 @@ export { default as generateEntityDocumentation } from './src/lib/generateEntity
|
|
|
13
13
|
export { default as generateChangesEntityDocumentation } from './src/lib/generateChangesEntityDocumentation';
|
|
14
14
|
export { default as codeQualityEntityAnalysis } from './src/lib/codeQualityEntityAnalysis';
|
|
15
15
|
export { default as summarizeDiff } from './src/lib/summarizeDiff';
|
|
16
|
-
export { default as generateEntityDataMap } from './src/lib/generateEntityDataMap';
|
|
17
16
|
export { default as generateEntityDataStructure } from './src/lib/generateEntityDataStructure';
|
|
18
17
|
export { default as generateEntityScenarios } from './src/lib/generateEntityScenarios';
|
|
19
18
|
export {
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* AI Test Matrix Runner
|
|
4
|
+
*
|
|
5
|
+
* Runs AI test suites across multiple models with configurable concurrency.
|
|
6
|
+
* Outputs JSON results for analysis.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node packages/ai/scripts/ai-test-matrix.mjs [options]
|
|
10
|
+
*
|
|
11
|
+
* Options:
|
|
12
|
+
* --test, -t Test file pattern (default: all ai_tests)
|
|
13
|
+
* --models, -m Comma-separated model list (default: see MODELS below)
|
|
14
|
+
* --runs, -r Number of runs per model (default: 1, useful for flakiness detection)
|
|
15
|
+
* --concurrency Max concurrent test runs (default: 4)
|
|
16
|
+
* --output, -o Output file for results JSON (default: stdout)
|
|
17
|
+
*
|
|
18
|
+
* Examples:
|
|
19
|
+
* node packages/ai/scripts/ai-test-matrix.mjs -t generateStatementAnalysis
|
|
20
|
+
* node packages/ai/scripts/ai-test-matrix.mjs -m "gpt-4.1-mini,claude-sonnet-4-20250514" -r 3
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { spawn } from 'node:child_process';
|
|
24
|
+
import { writeFile } from 'node:fs/promises';
|
|
25
|
+
import { parseArgs } from 'node:util';
|
|
26
|
+
|
|
27
|
+
const MODELS = [
|
|
28
|
+
// OpenAI
|
|
29
|
+
'openai/gpt-5',
|
|
30
|
+
'openai/gpt-5-mini',
|
|
31
|
+
'openai/gpt-5-nano',
|
|
32
|
+
'openai/gpt-4.1',
|
|
33
|
+
'openai/gpt-4.1-mini',
|
|
34
|
+
'openai/gpt-4o',
|
|
35
|
+
'openai/gpt-4o-mini',
|
|
36
|
+
|
|
37
|
+
// Groq
|
|
38
|
+
'openai/gpt-oss-120b-groq',
|
|
39
|
+
|
|
40
|
+
// DeepInfra
|
|
41
|
+
'openai/gpt-oss-120b-deepinfra',
|
|
42
|
+
'qwen/qwen3-235b-instruct-deepinfra',
|
|
43
|
+
'qwen/qwen3-coder-480b-instruct-deepinfra',
|
|
44
|
+
'google/gemini-2.5-pro-deepinfra',
|
|
45
|
+
'google/gemini-2.5-flash-deepinfra',
|
|
46
|
+
|
|
47
|
+
// OpenRouter
|
|
48
|
+
'google/gemini-2.5-flash-lite-openrouter',
|
|
49
|
+
'meta-llama/llama-4-maverick-openrouter',
|
|
50
|
+
'deepseek/v3.1-terminus-openrouter',
|
|
51
|
+
|
|
52
|
+
// Anthropic
|
|
53
|
+
'anthropic/claude-4.5-haiku',
|
|
54
|
+
'anthropic/claude-4.5-sonnet',
|
|
55
|
+
'anthropic/claude-4.5-opus',
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const AI_TESTS_DIR = 'packages/ai/src/lib/__tests__/ai_tests';
|
|
59
|
+
|
|
60
|
+
// Tests excluded from default runs (low signal-to-noise ratio)
|
|
61
|
+
const EXCLUDED_TESTS = [
|
|
62
|
+
'generateStatementAnalysis',
|
|
63
|
+
'generateEntityDataStructure',
|
|
64
|
+
];
|
|
65
|
+
|
|
66
|
+
const HELP_TEXT = `
|
|
67
|
+
AI Test Matrix Runner
|
|
68
|
+
|
|
69
|
+
Runs AI test suites across multiple models with configurable concurrency.
|
|
70
|
+
Outputs JSON results for analysis.
|
|
71
|
+
|
|
72
|
+
Usage:
|
|
73
|
+
node packages/ai/scripts/ai-test-matrix.mjs [options]
|
|
74
|
+
|
|
75
|
+
Options:
|
|
76
|
+
--test, -t Test file pattern (default: all ai_tests)
|
|
77
|
+
--models, -m Comma-separated model list (default: ${MODELS.join(', ')})
|
|
78
|
+
--runs, -r Number of runs per model (default: 1, useful for flakiness detection)
|
|
79
|
+
--concurrency Max concurrent test runs (default: 4)
|
|
80
|
+
--output, -o Output file for results JSON (default: stdout)
|
|
81
|
+
--help, -h Show this help message
|
|
82
|
+
|
|
83
|
+
Examples:
|
|
84
|
+
node packages/ai/scripts/ai-test-matrix.mjs -t generateStatementAnalysis
|
|
85
|
+
node packages/ai/scripts/ai-test-matrix.mjs -m "gpt-4.1-mini,claude-sonnet-4-20250514" -r 3
|
|
86
|
+
`;
|
|
87
|
+
|
|
88
|
+
function parseCliArgs() {
|
|
89
|
+
const { values } = parseArgs({
|
|
90
|
+
options: {
|
|
91
|
+
test: { type: 'string', short: 't', default: '' },
|
|
92
|
+
models: { type: 'string', short: 'm', default: '' },
|
|
93
|
+
runs: { type: 'string', short: 'r', default: '1' },
|
|
94
|
+
concurrency: { type: 'string', default: '4' },
|
|
95
|
+
output: { type: 'string', short: 'o', default: '' },
|
|
96
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
if (values.help) {
|
|
101
|
+
console.log(HELP_TEXT);
|
|
102
|
+
process.exit(0);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
testPattern: values.test || '',
|
|
107
|
+
models: values.models ? values.models.split(',').map((m) => m.trim()) : MODELS,
|
|
108
|
+
runs: parseInt(values.runs, 10),
|
|
109
|
+
concurrency: parseInt(values.concurrency, 10),
|
|
110
|
+
outputFile: values.output || '',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Run jest with JSON output and return parsed results
|
|
116
|
+
*/
|
|
117
|
+
async function runJest(model, testPattern, ignorePatterns = []) {
|
|
118
|
+
const testPath = testPattern
|
|
119
|
+
? `${AI_TESTS_DIR}/${testPattern}.test.ts`
|
|
120
|
+
: AI_TESTS_DIR;
|
|
121
|
+
|
|
122
|
+
const jestArgs = ['jest', '--config', 'jest.config.ai.ts', '--json', testPath];
|
|
123
|
+
|
|
124
|
+
// Add --testPathIgnorePatterns for excluded tests
|
|
125
|
+
for (const pattern of ignorePatterns) {
|
|
126
|
+
jestArgs.push('--testPathIgnorePatterns', pattern);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
const startTime = Date.now();
|
|
131
|
+
const proc = spawn('npx', jestArgs, {
|
|
132
|
+
env: { ...process.env, CODEYAM_TEST_MODEL: model },
|
|
133
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
134
|
+
}
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
let stdout = '';
|
|
138
|
+
let stderr = '';
|
|
139
|
+
|
|
140
|
+
proc.stdout.on('data', (data) => {
|
|
141
|
+
stdout += data.toString();
|
|
142
|
+
});
|
|
143
|
+
proc.stderr.on('data', (data) => {
|
|
144
|
+
stderr += data.toString();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
proc.on('close', (exitCode) => {
|
|
148
|
+
const duration = Date.now() - startTime;
|
|
149
|
+
|
|
150
|
+
// Jest outputs JSON to stdout, but may include non-JSON lines
|
|
151
|
+
// Find the JSON object in the output
|
|
152
|
+
let jsonResult = null;
|
|
153
|
+
try {
|
|
154
|
+
const jsonMatch = stdout.match(/^\{[\s\S]*\}$/m);
|
|
155
|
+
if (jsonMatch) {
|
|
156
|
+
jsonResult = JSON.parse(jsonMatch[0]);
|
|
157
|
+
}
|
|
158
|
+
} catch {
|
|
159
|
+
// JSON parse failed
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (jsonResult) {
|
|
163
|
+
resolve({
|
|
164
|
+
success: exitCode === 0,
|
|
165
|
+
model,
|
|
166
|
+
duration,
|
|
167
|
+
numTotalTests: jsonResult.numTotalTests,
|
|
168
|
+
numPassedTests: jsonResult.numPassedTests,
|
|
169
|
+
numFailedTests: jsonResult.numFailedTests,
|
|
170
|
+
testResults: jsonResult.testResults.map((tr) => {
|
|
171
|
+
const passed = tr.assertionResults.filter((ar) => ar.status === 'passed').length;
|
|
172
|
+
const failed = tr.assertionResults.filter((ar) => ar.status === 'failed').length;
|
|
173
|
+
return {
|
|
174
|
+
file: tr.name.replace(/.*ai_tests\//, ''),
|
|
175
|
+
passed,
|
|
176
|
+
failed,
|
|
177
|
+
failures: tr.assertionResults
|
|
178
|
+
.filter((ar) => ar.status === 'failed')
|
|
179
|
+
.map((ar) => ({
|
|
180
|
+
name: ar.title,
|
|
181
|
+
message: ar.failureMessages?.[0]?.slice(0, 500) || '',
|
|
182
|
+
})),
|
|
183
|
+
};
|
|
184
|
+
}),
|
|
185
|
+
});
|
|
186
|
+
} else {
|
|
187
|
+
resolve({
|
|
188
|
+
success: false,
|
|
189
|
+
model,
|
|
190
|
+
duration,
|
|
191
|
+
error: 'Failed to parse Jest JSON output',
|
|
192
|
+
stderr: stderr.slice(0, 1000),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Run tasks with limited concurrency
|
|
201
|
+
*/
|
|
202
|
+
async function runWithConcurrency(tasks, concurrency) {
|
|
203
|
+
const results = [];
|
|
204
|
+
const executing = new Set();
|
|
205
|
+
|
|
206
|
+
for (const task of tasks) {
|
|
207
|
+
const promise = task().then((result) => {
|
|
208
|
+
executing.delete(promise);
|
|
209
|
+
return result;
|
|
210
|
+
});
|
|
211
|
+
executing.add(promise);
|
|
212
|
+
results.push(promise);
|
|
213
|
+
|
|
214
|
+
if (executing.size >= concurrency) {
|
|
215
|
+
await Promise.race(executing);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return Promise.all(results);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Aggregate results for summary statistics
|
|
224
|
+
*/
|
|
225
|
+
function aggregateResults(results, models, runs) {
|
|
226
|
+
const byModel = {};
|
|
227
|
+
|
|
228
|
+
for (const model of models) {
|
|
229
|
+
const modelResults = results.filter((r) => r.model === model);
|
|
230
|
+
const cleanRuns = modelResults.filter((r) => r.numFailedTests === 0).length;
|
|
231
|
+
const totalPassed = modelResults.reduce((sum, r) => sum + (r.numPassedTests || 0), 0);
|
|
232
|
+
const totalTests = modelResults.reduce((sum, r) => sum + (r.numTotalTests || 0), 0);
|
|
233
|
+
|
|
234
|
+
byModel[model] = {
|
|
235
|
+
runs: modelResults.length,
|
|
236
|
+
cleanRuns,
|
|
237
|
+
testsTotal: totalTests,
|
|
238
|
+
testsPassed: totalPassed,
|
|
239
|
+
testPassRate: totalTests > 0 ? ((totalPassed / totalTests) * 100).toFixed(1) + '%' : 'N/A',
|
|
240
|
+
avgDuration: Math.round(
|
|
241
|
+
modelResults.reduce((sum, r) => sum + r.duration, 0) / modelResults.length
|
|
242
|
+
),
|
|
243
|
+
// Flakiness: tests that passed in some runs but failed in others
|
|
244
|
+
flakyTests: runs > 1 ? findFlakyTests(modelResults) : [],
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return byModel;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Find tests that passed in some runs but failed in others
|
|
253
|
+
*/
|
|
254
|
+
function findFlakyTests(modelResults) {
|
|
255
|
+
const testOutcomes = new Map();
|
|
256
|
+
|
|
257
|
+
for (const result of modelResults) {
|
|
258
|
+
if (!result.testResults) continue;
|
|
259
|
+
|
|
260
|
+
for (const tr of result.testResults) {
|
|
261
|
+
for (const failure of tr.failures || []) {
|
|
262
|
+
const key = `${tr.file}:${failure.name}`;
|
|
263
|
+
if (!testOutcomes.has(key)) {
|
|
264
|
+
testOutcomes.set(key, { passed: 0, failed: 0 });
|
|
265
|
+
}
|
|
266
|
+
testOutcomes.get(key).failed++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Mark passed for tests not in failures
|
|
272
|
+
const totalRuns = modelResults.length;
|
|
273
|
+
const flaky = [];
|
|
274
|
+
|
|
275
|
+
for (const [test, outcomes] of testOutcomes) {
|
|
276
|
+
outcomes.passed = totalRuns - outcomes.failed;
|
|
277
|
+
if (outcomes.passed > 0 && outcomes.failed > 0) {
|
|
278
|
+
flaky.push({
|
|
279
|
+
test,
|
|
280
|
+
passRate: ((outcomes.passed / totalRuns) * 100).toFixed(0) + '%',
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return flaky;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
async function main() {
|
|
289
|
+
const config = parseCliArgs();
|
|
290
|
+
|
|
291
|
+
console.error(`🧪 AI Test Matrix Runner`);
|
|
292
|
+
console.error(` Models: ${config.models.join(', ')}`);
|
|
293
|
+
console.error(` Runs per model: ${config.runs}`);
|
|
294
|
+
console.error(` Concurrency: ${config.concurrency}`);
|
|
295
|
+
console.error(` Test pattern: ${config.testPattern || '(all ai_tests)'}`);
|
|
296
|
+
|
|
297
|
+
// When running all tests (no specific pattern), exclude noisy tests
|
|
298
|
+
const ignorePatterns = config.testPattern ? [] : EXCLUDED_TESTS;
|
|
299
|
+
if (ignorePatterns.length > 0) {
|
|
300
|
+
console.error(` Excluding: ${ignorePatterns.join(', ')}`);
|
|
301
|
+
}
|
|
302
|
+
console.error('');
|
|
303
|
+
|
|
304
|
+
// Build task list
|
|
305
|
+
const tasks = [];
|
|
306
|
+
for (const model of config.models) {
|
|
307
|
+
for (let run = 0; run < config.runs; run++) {
|
|
308
|
+
tasks.push(async () => {
|
|
309
|
+
const runLabel = config.runs > 1 ? ` (run ${run + 1}/${config.runs})` : '';
|
|
310
|
+
console.error(`⏳ Starting: ${model}${runLabel}`);
|
|
311
|
+
const result = await runJest(model, config.testPattern, ignorePatterns);
|
|
312
|
+
const status = result.numFailedTests === 0 ? '✅' : '❌';
|
|
313
|
+
console.error(
|
|
314
|
+
`${status} Finished: ${model}${runLabel} - ${result.numPassedTests}/${result.numTotalTests} passed (${result.duration}ms)`
|
|
315
|
+
);
|
|
316
|
+
return { ...result, runIndex: run };
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const results = await runWithConcurrency(tasks, config.concurrency);
|
|
322
|
+
const summary = aggregateResults(results, config.models, config.runs);
|
|
323
|
+
|
|
324
|
+
const output = {
|
|
325
|
+
timestamp: new Date().toISOString(),
|
|
326
|
+
config: {
|
|
327
|
+
testPattern: config.testPattern || '(all)',
|
|
328
|
+
models: config.models,
|
|
329
|
+
runs: config.runs,
|
|
330
|
+
},
|
|
331
|
+
summary,
|
|
332
|
+
results,
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
const jsonOutput = JSON.stringify(output, null, 2);
|
|
336
|
+
|
|
337
|
+
if (config.outputFile) {
|
|
338
|
+
await writeFile(config.outputFile, jsonOutput);
|
|
339
|
+
console.error(`\n📄 Results written to ${config.outputFile}`);
|
|
340
|
+
} else {
|
|
341
|
+
console.log(jsonOutput);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Print summary table to stderr
|
|
345
|
+
console.error('\n📊 Summary:');
|
|
346
|
+
console.error('─'.repeat(70));
|
|
347
|
+
for (const [model, stats] of Object.entries(summary)) {
|
|
348
|
+
console.error(
|
|
349
|
+
`${model.padEnd(40)} ${stats.testPassRate.padStart(6)} (${stats.testsPassed}/${stats.testsTotal}) | ${stats.avgDuration}ms`
|
|
350
|
+
);
|
|
351
|
+
if (stats.flakyTests.length > 0) {
|
|
352
|
+
console.error(` ⚠️ Flaky: ${stats.flakyTests.map((f) => f.test).join(', ')}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
console.error('─'.repeat(70));
|
|
356
|
+
|
|
357
|
+
// Print matrix view (models × test files)
|
|
358
|
+
printMatrix(results, config.models);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Print a matrix view: test files (rows) × models (columns)
|
|
363
|
+
*/
|
|
364
|
+
function printMatrix(results, models) {
|
|
365
|
+
// Collect all test files across all results
|
|
366
|
+
const testFiles = new Set();
|
|
367
|
+
for (const result of results) {
|
|
368
|
+
if (!result.testResults) continue;
|
|
369
|
+
for (const tr of result.testResults) {
|
|
370
|
+
testFiles.add(tr.file);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (testFiles.size === 0) return;
|
|
375
|
+
|
|
376
|
+
const sortedFiles = [...testFiles].sort();
|
|
377
|
+
|
|
378
|
+
// Compute column widths
|
|
379
|
+
const fileColWidth = Math.max(30, ...sortedFiles.map((f) => f.replace('.test.ts', '').length + 2));
|
|
380
|
+
const modelColWidth = 12;
|
|
381
|
+
|
|
382
|
+
// Shorten model names for display
|
|
383
|
+
const shortModelName = (m) => {
|
|
384
|
+
const parts = m.split('/');
|
|
385
|
+
return parts[parts.length - 1].slice(0, modelColWidth - 1);
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
console.error('\n📋 Matrix (test files × models):');
|
|
389
|
+
console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
|
|
390
|
+
|
|
391
|
+
// Header row
|
|
392
|
+
const header = ''.padEnd(fileColWidth) + models.map((m) => shortModelName(m).padStart(modelColWidth)).join(' ');
|
|
393
|
+
console.error(header);
|
|
394
|
+
console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
|
|
395
|
+
|
|
396
|
+
// Data rows
|
|
397
|
+
for (const file of sortedFiles) {
|
|
398
|
+
const shortFile = file.replace('.test.ts', '');
|
|
399
|
+
let row = shortFile.padEnd(fileColWidth);
|
|
400
|
+
|
|
401
|
+
for (const model of models) {
|
|
402
|
+
// Find result for this model (use first run if multiple)
|
|
403
|
+
const result = results.find((r) => r.model === model);
|
|
404
|
+
const tr = result?.testResults?.find((t) => t.file === file);
|
|
405
|
+
|
|
406
|
+
if (tr) {
|
|
407
|
+
const total = tr.passed + tr.failed;
|
|
408
|
+
const cell = `${tr.passed}/${total}`;
|
|
409
|
+
row += cell.padStart(modelColWidth) + ' ';
|
|
410
|
+
} else {
|
|
411
|
+
row += '-'.padStart(modelColWidth) + ' ';
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
console.error(row);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
console.error('─'.repeat(fileColWidth + models.length * (modelColWidth + 1)));
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
main().catch((err) => {
|
|
422
|
+
console.error('Fatal error:', err);
|
|
423
|
+
process.exit(1);
|
|
424
|
+
});
|
|
@@ -170,17 +170,6 @@ export class ASTScopeAnalyzer {
|
|
|
170
170
|
// console.info('SOURCEFILE', this.sourceFile.getText());
|
|
171
171
|
// console.info('RANGE', this.statementInfo.start, this.statementInfo.end, this.sourceFile.getText().slice(this.statementInfo.start, this.statementInfo.end));
|
|
172
172
|
|
|
173
|
-
// console.info('RELEVANT NODES:\n\n', this.statementInfo.text);
|
|
174
|
-
// relevantNodes.forEach((node, i) =>
|
|
175
|
-
// console.info(`RELEVANT NODE ${i}`, node.getText(this.sourceFile)),
|
|
176
|
-
// );
|
|
177
|
-
|
|
178
|
-
// console.info(
|
|
179
|
-
// 'CHILD BOUNDARIES',
|
|
180
|
-
// this.statementInfo.childBoundaries.map((b) =>
|
|
181
|
-
// this.sourceFile.getText().slice(b.start, b.end),
|
|
182
|
-
// ),
|
|
183
|
-
// );
|
|
184
173
|
this.processNodes(relevantNodes, context);
|
|
185
174
|
|
|
186
175
|
// for (const childBoundary of this.statementInfo.childBoundaries) {
|
|
@@ -285,12 +274,13 @@ export class ASTScopeAnalyzer {
|
|
|
285
274
|
node: ts.Node,
|
|
286
275
|
sourceFile: ts.SourceFile,
|
|
287
276
|
): { nodeStart: number; nodeEnd: number } {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
277
|
+
// Use getStart(sourceFile) to get the position after leading trivia.
|
|
278
|
+
// Note: We intentionally don't adjust for leadingContentOffset here because
|
|
279
|
+
// the positions from isolateStatements are calculated using getStart() too,
|
|
280
|
+
// which uses the same sourceFile.text coordinate system.
|
|
291
281
|
return {
|
|
292
|
-
nodeStart: node.getStart(sourceFile)
|
|
293
|
-
nodeEnd: node.getEnd()
|
|
282
|
+
nodeStart: node.getStart(sourceFile),
|
|
283
|
+
nodeEnd: node.getEnd(),
|
|
294
284
|
};
|
|
295
285
|
}
|
|
296
286
|
|