@enjoys/context-engine 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/data/codeActions/angular.json +126 -0
  2. package/data/codeActions/nestjs.json +124 -0
  3. package/data/codeActions/nextjs.json +198 -0
  4. package/data/codeActions/react.json +154 -0
  5. package/data/codeActions/shadcn.json +112 -0
  6. package/data/codeActions/shell.json +169 -26
  7. package/data/codeLens/angular.json +22 -0
  8. package/data/codeLens/nestjs.json +21 -0
  9. package/data/codeLens/nextjs.json +117 -0
  10. package/data/codeLens/react.json +89 -0
  11. package/data/codeLens/shadcn.json +89 -0
  12. package/data/codeLens/shell.json +59 -17
  13. package/data/codeLens/tailwindcss.json +56 -0
  14. package/data/color/angular.json +21 -0
  15. package/data/color/nestjs.json +18 -0
  16. package/data/color/nextjs.json +22 -0
  17. package/data/color/react.json +93 -0
  18. package/data/color/shadcn.json +66 -0
  19. package/data/color/shell.json +106 -80
  20. package/data/commands/angular.json +312 -0
  21. package/data/commands/manifest.json +5 -0
  22. package/data/commands/nestjs.json +273 -0
  23. package/data/commands/nextjs.json +123 -0
  24. package/data/commands/react.json +210 -0
  25. package/data/commands/shadcn.json +410 -0
  26. package/data/commands/shell.json +571 -41
  27. package/data/completion/angular.json +1490 -0
  28. package/data/completion/css.json +793 -0
  29. package/data/completion/nestjs.json +1454 -0
  30. package/data/completion/nextjs.json +1373 -0
  31. package/data/completion/react.json +1319 -0
  32. package/data/completion/shadcn.json +1202 -0
  33. package/data/completion/shell.json +2446 -510
  34. package/data/declaration/angular.json +46 -0
  35. package/data/declaration/nestjs.json +47 -0
  36. package/data/declaration/nextjs.json +274 -0
  37. package/data/declaration/react.json +199 -0
  38. package/data/declaration/shadcn.json +211 -0
  39. package/data/declaration/shell.json +343 -24
  40. package/data/declaration/tailwindcss.json +72 -0
  41. package/data/definition/angular.json +670 -0
  42. package/data/definition/nestjs.json +684 -0
  43. package/data/definition/nextjs.json +439 -0
  44. package/data/definition/react.json +397 -0
  45. package/data/definition/shadcn.json +99 -0
  46. package/data/definition/shell.json +820 -0
  47. package/data/documentHighlight/angular.json +414 -0
  48. package/data/documentHighlight/css.json +77 -2
  49. package/data/documentHighlight/nestjs.json +115 -0
  50. package/data/documentHighlight/nextjs.json +212 -0
  51. package/data/documentHighlight/react.json +119 -0
  52. package/data/documentHighlight/shadcn.json +168 -0
  53. package/data/documentHighlight/shell.json +664 -334
  54. package/data/documentHighlight/tailwindcss.json +105 -10
  55. package/data/documentRangeFormatting/angular.json +45 -0
  56. package/data/documentRangeFormatting/nestjs.json +17 -0
  57. package/data/documentRangeFormatting/nextjs.json +17 -0
  58. package/data/documentRangeFormatting/react.json +78 -0
  59. package/data/documentRangeFormatting/shadcn.json +45 -0
  60. package/data/documentRangeFormatting/shell.json +120 -53
  61. package/data/documentSymbol/angular.json +180 -0
  62. package/data/documentSymbol/nestjs.json +152 -0
  63. package/data/documentSymbol/nextjs.json +159 -0
  64. package/data/documentSymbol/react.json +145 -0
  65. package/data/documentSymbol/shadcn.json +131 -0
  66. package/data/documentSymbol/shell.json +166 -26
  67. package/data/documentSymbol/tailwindcss.json +49 -0
  68. package/data/foldingRange/angular.json +99 -0
  69. package/data/foldingRange/nestjs.json +26 -0
  70. package/data/foldingRange/nextjs.json +26 -0
  71. package/data/foldingRange/react.json +120 -0
  72. package/data/foldingRange/shadcn.json +93 -0
  73. package/data/foldingRange/shell.json +106 -46
  74. package/data/formatting/angular.json +21 -0
  75. package/data/formatting/nestjs.json +23 -0
  76. package/data/formatting/nextjs.json +23 -0
  77. package/data/formatting/react.json +71 -0
  78. package/data/formatting/shadcn.json +61 -0
  79. package/data/formatting/shell.json +103 -19
  80. package/data/hover/angular.json +455 -0
  81. package/data/hover/css.json +232 -0
  82. package/data/hover/nestjs.json +296 -0
  83. package/data/hover/nextjs.json +305 -0
  84. package/data/hover/react.json +173 -0
  85. package/data/hover/shadcn.json +450 -0
  86. package/data/hover/shell.json +684 -75
  87. package/data/implementation/angular.json +22 -0
  88. package/data/implementation/nestjs.json +24 -0
  89. package/data/implementation/nextjs.json +137 -0
  90. package/data/implementation/react.json +125 -0
  91. package/data/implementation/shadcn.json +89 -0
  92. package/data/implementation/shell.json +59 -3
  93. package/data/inlayHints/angular.json +24 -0
  94. package/data/inlayHints/nestjs.json +24 -0
  95. package/data/inlayHints/nextjs.json +143 -0
  96. package/data/inlayHints/react.json +177 -0
  97. package/data/inlayHints/shadcn.json +109 -0
  98. package/data/inlayHints/shell.json +223 -35
  99. package/data/inlineCompletions/angular.json +135 -0
  100. package/data/inlineCompletions/nestjs.json +25 -0
  101. package/data/inlineCompletions/nextjs.json +179 -0
  102. package/data/inlineCompletions/react.json +203 -0
  103. package/data/inlineCompletions/shadcn.json +115 -0
  104. package/data/inlineCompletions/shell.json +185 -35
  105. package/data/linkedEditingRange/angular.json +23 -0
  106. package/data/linkedEditingRange/nestjs.json +10 -0
  107. package/data/linkedEditingRange/nextjs.json +11 -0
  108. package/data/linkedEditingRange/react.json +75 -0
  109. package/data/linkedEditingRange/shadcn.json +23 -0
  110. package/data/linkedEditingRange/shell.json +25 -25
  111. package/data/links/angular.json +95 -0
  112. package/data/links/nestjs.json +130 -0
  113. package/data/links/nextjs.json +91 -0
  114. package/data/links/react.json +75 -0
  115. package/data/links/shadcn.json +98 -0
  116. package/data/links/shell.json +56 -0
  117. package/data/links/tailwindcss.json +25 -0
  118. package/data/manifest.json +339 -152
  119. package/data/onTypeFormatting/angular.json +14 -0
  120. package/data/onTypeFormatting/nestjs.json +16 -0
  121. package/data/onTypeFormatting/nextjs.json +17 -0
  122. package/data/onTypeFormatting/react.json +127 -0
  123. package/data/onTypeFormatting/shadcn.json +54 -0
  124. package/data/onTypeFormatting/shell.json +72 -68
  125. package/data/rangeSemanticTokens/angular.json +140 -0
  126. package/data/rangeSemanticTokens/nestjs.json +27 -0
  127. package/data/rangeSemanticTokens/nextjs.json +28 -0
  128. package/data/rangeSemanticTokens/react.json +216 -0
  129. package/data/rangeSemanticTokens/shadcn.json +140 -0
  130. package/data/rangeSemanticTokens/shell.json +247 -69
  131. package/data/rangeSemanticTokens/tailwindcss.json +99 -8
  132. package/data/references/angular.json +26 -0
  133. package/data/references/nestjs.json +24 -0
  134. package/data/references/nextjs.json +178 -0
  135. package/data/references/react.json +192 -0
  136. package/data/references/shadcn.json +101 -0
  137. package/data/references/shell.json +323 -92
  138. package/data/references/tailwindcss.json +66 -0
  139. package/data/rename/angular.json +131 -0
  140. package/data/rename/nestjs.json +32 -0
  141. package/data/rename/nextjs.json +31 -0
  142. package/data/rename/react.json +88 -0
  143. package/data/rename/shadcn.json +79 -0
  144. package/data/rename/shell.json +101 -31
  145. package/data/selectionRange/angular.json +95 -0
  146. package/data/selectionRange/nestjs.json +21 -0
  147. package/data/selectionRange/nextjs.json +22 -0
  148. package/data/selectionRange/react.json +87 -0
  149. package/data/selectionRange/shadcn.json +89 -0
  150. package/data/selectionRange/shell.json +65 -35
  151. package/data/semanticTokens/angular.json +198 -0
  152. package/data/semanticTokens/nestjs.json +35 -0
  153. package/data/semanticTokens/nextjs.json +38 -0
  154. package/data/semanticTokens/react.json +215 -0
  155. package/data/semanticTokens/shadcn.json +180 -0
  156. package/data/semanticTokens/shell.json +238 -65
  157. package/data/signatureHelp/angular.json +182 -0
  158. package/data/signatureHelp/nestjs.json +128 -0
  159. package/data/signatureHelp/nextjs.json +127 -0
  160. package/data/signatureHelp/react.json +281 -0
  161. package/data/signatureHelp/shadcn.json +237 -0
  162. package/data/signatureHelp/shell.json +797 -104
  163. package/data/typeDefinition/angular.json +362 -0
  164. package/data/typeDefinition/nestjs.json +334 -0
  165. package/data/typeDefinition/nextjs.json +285 -0
  166. package/data/typeDefinition/react.json +236 -0
  167. package/data/typeDefinition/shadcn.json +292 -0
  168. package/data/typeDefinition/shell.json +104 -40
  169. package/package.json +1 -1
  170. package/data/codeActions/bash.json +0 -169
  171. package/data/codeActions/zsh.json +0 -49
  172. package/data/codeLens/bash.json +0 -75
  173. package/data/codeLens/zsh.json +0 -19
  174. package/data/color/bash.json +0 -100
  175. package/data/color/zsh.json +0 -80
  176. package/data/commands/bash.json +0 -102
  177. package/data/commands/zsh.json +0 -166
  178. package/data/completion/bash.json +0 -1184
  179. package/data/completion/zsh.json +0 -973
  180. package/data/declaration/bash.json +0 -301
  181. package/data/declaration/zsh.json +0 -205
  182. package/data/definition/bash.json +0 -565
  183. package/data/definition/zsh.json +0 -350
  184. package/data/documentHighlight/bash.json +0 -393
  185. package/data/documentHighlight/zsh.json +0 -266
  186. package/data/documentRangeFormatting/bash.json +0 -41
  187. package/data/documentRangeFormatting/zsh.json +0 -59
  188. package/data/documentSymbol/bash.json +0 -124
  189. package/data/documentSymbol/zsh.json +0 -26
  190. package/data/foldingRange/bash.json +0 -76
  191. package/data/foldingRange/zsh.json +0 -46
  192. package/data/formatting/bash.json +0 -88
  193. package/data/formatting/zsh.json +0 -28
  194. package/data/hover/bash.json +0 -579
  195. package/data/hover/zsh.json +0 -96
  196. package/data/implementation/bash.json +0 -44
  197. package/data/implementation/zsh.json +0 -41
  198. package/data/inlayHints/bash.json +0 -207
  199. package/data/inlayHints/zsh.json +0 -43
  200. package/data/inlineCompletions/bash.json +0 -155
  201. package/data/inlineCompletions/zsh.json +0 -17
  202. package/data/linkedEditingRange/bash.json +0 -25
  203. package/data/linkedEditingRange/zsh.json +0 -25
  204. package/data/links/bash.json +0 -56
  205. package/data/links/zsh.json +0 -15
  206. package/data/onTypeFormatting/bash.json +0 -68
  207. package/data/onTypeFormatting/zsh.json +0 -68
  208. package/data/rangeSemanticTokens/bash.json +0 -90
  209. package/data/rangeSemanticTokens/zsh.json +0 -76
  210. package/data/references/bash.json +0 -221
  211. package/data/references/zsh.json +0 -166
  212. package/data/rename/bash.json +0 -37
  213. package/data/rename/zsh.json +0 -31
  214. package/data/selectionRange/bash.json +0 -35
  215. package/data/selectionRange/zsh.json +0 -35
  216. package/data/semanticTokens/bash.json +0 -71
  217. package/data/semanticTokens/zsh.json +0 -71
  218. package/data/signatureHelp/bash.json +0 -111
  219. package/data/signatureHelp/zsh.json +0 -118
  220. package/data/typeDefinition/bash.json +0 -95
  221. package/data/typeDefinition/zsh.json +0 -40
@@ -0,0 +1,126 @@
1
+ {
2
+ "language": "angular",
3
+ "codeActions": [
4
+ {
5
+ "title": "Add missing import",
6
+ "kind": "quickfix",
7
+ "description": "Automatically import a symbol that is used but not imported in the current file",
8
+ "pattern": "\\b(Component|Injectable|Directive|Pipe|Input|Output|OnInit|OnDestroy|signal|computed|effect|inject|FormControl|FormGroup|HttpClient|Router|ActivatedRoute)\\b",
9
+ "isPreferred": true
10
+ },
11
+ {
12
+ "title": "Convert to standalone component",
13
+ "kind": "refactor.rewrite",
14
+ "description": "Convert an NgModule-based component to a standalone component with standalone: true and direct imports",
15
+ "pattern": "@Component\\s*\\(",
16
+ "isPreferred": false
17
+ },
18
+ {
19
+ "title": "Add lifecycle hook",
20
+ "kind": "refactor.rewrite",
21
+ "description": "Add a lifecycle hook (OnInit, OnDestroy, OnChanges, etc.) to the current component or directive class",
22
+ "pattern": "class\\s+\\w+(Component|Directive)",
23
+ "isPreferred": false
24
+ },
25
+ {
26
+ "title": "Extract to service",
27
+ "kind": "refactor.extract",
28
+ "description": "Extract selected logic into a new injectable Angular service",
29
+ "pattern": ".*",
30
+ "isPreferred": false
31
+ },
32
+ {
33
+ "title": "Add @Input property",
34
+ "kind": "refactor.rewrite",
35
+ "description": "Add a new @Input() property to the component or directive",
36
+ "pattern": "class\\s+\\w+(Component|Directive)",
37
+ "isPreferred": false
38
+ },
39
+ {
40
+ "title": "Add @Output property",
41
+ "kind": "refactor.rewrite",
42
+ "description": "Add a new @Output() EventEmitter property to the component or directive",
43
+ "pattern": "class\\s+\\w+(Component|Directive)",
44
+ "isPreferred": false
45
+ },
46
+ {
47
+ "title": "Convert @Input to signal input",
48
+ "kind": "refactor.rewrite",
49
+ "description": "Convert a decorator-based @Input() property to the signal-based input() function",
50
+ "pattern": "@Input\\(\\)",
51
+ "isPreferred": false
52
+ },
53
+ {
54
+ "title": "Convert @Output to signal output",
55
+ "kind": "refactor.rewrite",
56
+ "description": "Convert a decorator-based @Output() EventEmitter to the signal-based output() function",
57
+ "pattern": "@Output\\(\\)",
58
+ "isPreferred": false
59
+ },
60
+ {
61
+ "title": "Convert *ngIf to @if",
62
+ "kind": "refactor.rewrite",
63
+ "description": "Convert legacy *ngIf structural directive to new built-in @if control flow syntax",
64
+ "pattern": "\\*ngIf",
65
+ "isPreferred": false
66
+ },
67
+ {
68
+ "title": "Convert *ngFor to @for",
69
+ "kind": "refactor.rewrite",
70
+ "description": "Convert legacy *ngFor structural directive to new built-in @for control flow syntax with track",
71
+ "pattern": "\\*ngFor",
72
+ "isPreferred": false
73
+ },
74
+ {
75
+ "title": "Convert ngSwitch to @switch",
76
+ "kind": "refactor.rewrite",
77
+ "description": "Convert legacy ngSwitch directive to new built-in @switch control flow syntax",
78
+ "pattern": "\\[ngSwitch\\]",
79
+ "isPreferred": false
80
+ },
81
+ {
82
+ "title": "Add form validators",
83
+ "kind": "refactor.rewrite",
84
+ "description": "Add Validators (required, email, minLength, etc.) to a FormControl or FormGroup field",
85
+ "pattern": "new FormControl|FormBuilder|fb\\.group|fb\\.control",
86
+ "isPreferred": false
87
+ },
88
+ {
89
+ "title": "Import module",
90
+ "kind": "quickfix",
91
+ "description": "Add a missing module or standalone component/directive/pipe to the imports array",
92
+ "pattern": "@(Component|NgModule)\\s*\\(\\s*\\{",
93
+ "isPreferred": false
94
+ },
95
+ {
96
+ "title": "Organize imports",
97
+ "kind": "source.organizeImports",
98
+ "description": "Sort and clean up import statements, removing unused imports",
99
+ "pattern": "\\bimport\\b",
100
+ "isPreferred": true
101
+ },
102
+ {
103
+ "title": "Fix all auto-fixable lint issues",
104
+ "kind": "source.fixAll",
105
+ "description": "Apply all available automatic fixes for linting and type errors",
106
+ "pattern": ".*",
107
+ "isPreferred": false
108
+ },
109
+ {
110
+ "title": "Generate trackBy function",
111
+ "kind": "refactor.rewrite",
112
+ "description": "Generate a trackBy function for *ngFor or a track expression for @for",
113
+ "pattern": "\\*ngFor|@for",
114
+ "isPreferred": false
115
+ }
116
+ ],
117
+ "providedCodeActionKinds": [
118
+ "quickfix",
119
+ "refactor",
120
+ "refactor.extract",
121
+ "refactor.rewrite",
122
+ "source",
123
+ "source.fixAll",
124
+ "source.organizeImports"
125
+ ]
126
+ }
@@ -0,0 +1,124 @@
1
+ {
2
+ "language": "nestjs",
3
+ "codeActions": [
4
+ {
5
+ "title": "Add missing decorator import",
6
+ "kind": "quickfix",
7
+ "description": "Adds the missing import statement for NestJS decorators like @Controller, @Injectable, @Get, @Post, etc. from @nestjs/common",
8
+ "pattern": "@(Controller|Injectable|Get|Post|Put|Patch|Delete|Module|Inject|Body|Param|Query|Headers|UseGuards|UseInterceptors|UsePipes|UseFilters|SetMetadata|Catch|HttpCode|Header|Redirect|Req|Res)",
9
+ "isPreferred": true
10
+ },
11
+ {
12
+ "title": "Generate constructor injection",
13
+ "kind": "quickfix",
14
+ "description": "Generates a constructor with dependency injection for the specified service or repository",
15
+ "pattern": "class\\s+\\w+\\s*\\{",
16
+ "isPreferred": false
17
+ },
18
+ {
19
+ "title": "Extract method to service",
20
+ "kind": "refactor.extract",
21
+ "description": "Extracts the selected method logic from a controller into a service class",
22
+ "pattern": "@(Get|Post|Put|Patch|Delete)\\s*\\(",
23
+ "isPreferred": false
24
+ },
25
+ {
26
+ "title": "Add @Injectable() decorator",
27
+ "kind": "quickfix",
28
+ "description": "Adds the @Injectable() decorator to a class that needs to be managed by the NestJS IoC container",
29
+ "pattern": "export\\s+class\\s+\\w+(Service|Guard|Pipe|Interceptor|Filter|Strategy|Middleware)",
30
+ "isPreferred": true
31
+ },
32
+ {
33
+ "title": "Convert to async method",
34
+ "kind": "refactor",
35
+ "description": "Converts a synchronous route handler method to an async method with Promise return type",
36
+ "pattern": "@(Get|Post|Put|Patch|Delete)\\s*\\([^)]*\\)\\s*\\n\\s*(?!async)",
37
+ "isPreferred": false
38
+ },
39
+ {
40
+ "title": "Add ValidationPipe to method",
41
+ "kind": "quickfix",
42
+ "description": "Adds @UsePipes(new ValidationPipe()) decorator to the route handler for request validation",
43
+ "pattern": "@(Post|Put|Patch)\\s*\\(",
44
+ "isPreferred": false
45
+ },
46
+ {
47
+ "title": "Wrap in try-catch with HttpException",
48
+ "kind": "refactor",
49
+ "description": "Wraps the selected code in a try-catch block that throws an appropriate HttpException on error",
50
+ "pattern": "async\\s+\\w+\\s*\\(",
51
+ "isPreferred": false
52
+ },
53
+ {
54
+ "title": "Add @ApiProperty() to DTO fields",
55
+ "kind": "quickfix",
56
+ "description": "Adds @ApiProperty() decorator from @nestjs/swagger to all properties in a DTO class for Swagger documentation",
57
+ "pattern": "class\\s+\\w+Dto\\s*\\{",
58
+ "isPreferred": false
59
+ },
60
+ {
61
+ "title": "Generate CRUD endpoints",
62
+ "kind": "refactor",
63
+ "description": "Generates a complete set of CRUD route handlers (GET, POST, PUT, DELETE) in the controller",
64
+ "pattern": "@Controller\\s*\\(",
65
+ "isPreferred": false
66
+ },
67
+ {
68
+ "title": "Add @UseGuards(AuthGuard)",
69
+ "kind": "quickfix",
70
+ "description": "Adds @UseGuards(AuthGuard('jwt')) decorator to protect the route with JWT authentication",
71
+ "pattern": "@(Get|Post|Put|Patch|Delete)\\s*\\(",
72
+ "isPreferred": false
73
+ },
74
+ {
75
+ "title": "Add @UseInterceptors(ClassSerializerInterceptor)",
76
+ "kind": "quickfix",
77
+ "description": "Adds ClassSerializerInterceptor to the controller or method for response serialization",
78
+ "pattern": "@Controller\\s*\\(|@(Get|Post|Put|Patch|Delete)\\s*\\(",
79
+ "isPreferred": false
80
+ },
81
+ {
82
+ "title": "Add Swagger decorators to endpoint",
83
+ "kind": "refactor",
84
+ "description": "Adds @ApiOperation, @ApiResponse, and other Swagger decorators to document the endpoint",
85
+ "pattern": "@(Get|Post|Put|Patch|Delete)\\s*\\(",
86
+ "isPreferred": false
87
+ },
88
+ {
89
+ "title": "Convert to custom provider",
90
+ "kind": "refactor",
91
+ "description": "Converts a simple class provider to a custom provider with useFactory, useValue, or useClass syntax",
92
+ "pattern": "providers:\\s*\\[",
93
+ "isPreferred": false
94
+ },
95
+ {
96
+ "title": "Add module imports",
97
+ "kind": "quickfix",
98
+ "description": "Adds missing NestJS module imports (ConfigModule, TypeOrmModule, etc.) to the module's imports array",
99
+ "pattern": "@Module\\s*\\(",
100
+ "isPreferred": false
101
+ },
102
+ {
103
+ "title": "Organize imports",
104
+ "kind": "source.organizeImports",
105
+ "description": "Organizes and sorts import statements, grouping @nestjs/* imports together",
106
+ "pattern": "import\\s+",
107
+ "isPreferred": false
108
+ },
109
+ {
110
+ "title": "Fix all auto-fixable issues",
111
+ "kind": "source.fixAll",
112
+ "description": "Applies all available auto-fixes including missing imports, decorators, and formatting",
113
+ "pattern": ".*",
114
+ "isPreferred": false
115
+ }
116
+ ],
117
+ "providedCodeActionKinds": [
118
+ "quickfix",
119
+ "refactor",
120
+ "refactor.extract",
121
+ "source.organizeImports",
122
+ "source.fixAll"
123
+ ]
124
+ }
@@ -0,0 +1,198 @@
1
+ {
2
+ "language": "nextjs",
3
+ "codeActions": [
4
+ {
5
+ "title": "Add 'use client' directive",
6
+ "kind": "quickfix",
7
+ "description": "Adds 'use client' directive at the top of the file to mark it as a Client Component.",
8
+ "pattern": "useState|useEffect|useContext|useReducer|useRef|useCallback|useMemo|onClick|onChange|onSubmit|addEventListener",
9
+ "edit": {
10
+ "insertText": "'use client';\n\n",
11
+ "position": "top"
12
+ }
13
+ },
14
+ {
15
+ "title": "Add 'use server' directive",
16
+ "kind": "quickfix",
17
+ "description": "Adds 'use server' directive to mark the file or function as a Server Action.",
18
+ "pattern": "formData|revalidatePath|revalidateTag|redirect|db\\.|prisma\\.",
19
+ "edit": {
20
+ "insertText": "'use server';\n\n",
21
+ "position": "top"
22
+ }
23
+ },
24
+ {
25
+ "title": "Convert to Server Component",
26
+ "kind": "refactor",
27
+ "description": "Removes 'use client' directive and converts client-specific code to server-compatible patterns.",
28
+ "pattern": "^'use client'",
29
+ "edit": {
30
+ "removePattern": "^'use client';?\\s*\\n?",
31
+ "position": "top"
32
+ }
33
+ },
34
+ {
35
+ "title": "Convert to Client Component",
36
+ "kind": "refactor",
37
+ "description": "Adds 'use client' directive and ensures the component uses client-side patterns.",
38
+ "pattern": "export\\s+(default\\s+)?(async\\s+)?function",
39
+ "edit": {
40
+ "insertText": "'use client';\n\n",
41
+ "position": "top"
42
+ }
43
+ },
44
+ {
45
+ "title": "Extract Server Action",
46
+ "kind": "refactor.extract",
47
+ "description": "Extracts inline server action into a separate 'use server' function.",
48
+ "pattern": "'use server'\\s*;?\\s*\\n\\s*(?=.*formData)",
49
+ "edit": {
50
+ "extractTo": "actions.ts",
51
+ "directive": "'use server'"
52
+ }
53
+ },
54
+ {
55
+ "title": "Add generateMetadata export",
56
+ "kind": "quickfix",
57
+ "description": "Adds a generateMetadata function for dynamic SEO metadata.",
58
+ "pattern": "export\\s+default\\s+(async\\s+)?function\\s+\\w+Page",
59
+ "edit": {
60
+ "insertText": "\nimport type { Metadata } from 'next';\n\nexport async function generateMetadata({ params }: { params: { slug: string } }): Promise<Metadata> {\n return {\n title: '',\n description: '',\n };\n}\n",
61
+ "position": "beforeExport"
62
+ }
63
+ },
64
+ {
65
+ "title": "Add generateStaticParams export",
66
+ "kind": "quickfix",
67
+ "description": "Adds a generateStaticParams function for static generation of dynamic routes.",
68
+ "pattern": "params:\\s*\\{\\s*\\w+:\\s*string",
69
+ "edit": {
70
+ "insertText": "\nexport async function generateStaticParams() {\n return [];\n}\n",
71
+ "position": "beforeExport"
72
+ }
73
+ },
74
+ {
75
+ "title": "Wrap with Suspense boundary",
76
+ "kind": "refactor",
77
+ "description": "Wraps the selected async component with a React Suspense boundary and loading fallback.",
78
+ "pattern": "<\\w+.*/>|<\\w+.*>.*</\\w+>",
79
+ "edit": {
80
+ "wrapWith": "<Suspense fallback={<Loading />}>",
81
+ "wrapEnd": "</Suspense>",
82
+ "import": "import { Suspense } from 'react';"
83
+ }
84
+ },
85
+ {
86
+ "title": "Add loading.tsx file",
87
+ "kind": "source",
88
+ "description": "Creates a loading.tsx file in the current route segment directory for streaming.",
89
+ "pattern": "page\\.(tsx|jsx|ts|js)$",
90
+ "edit": {
91
+ "createFile": "loading.tsx",
92
+ "content": "export default function Loading() {\n return <div>Loading...</div>;\n}\n"
93
+ }
94
+ },
95
+ {
96
+ "title": "Add error.tsx file",
97
+ "kind": "source",
98
+ "description": "Creates an error.tsx file in the current route segment directory for error handling.",
99
+ "pattern": "page\\.(tsx|jsx|ts|js)$",
100
+ "edit": {
101
+ "createFile": "error.tsx",
102
+ "content": "'use client';\n\nexport default function Error({\n error,\n reset,\n}: {\n error: Error & { digest?: string };\n reset: () => void;\n}) {\n return (\n <div>\n <h2>Something went wrong!</h2>\n <button onClick={() => reset()}>Try again</button>\n </div>\n );\n}\n"
103
+ }
104
+ },
105
+ {
106
+ "title": "Convert getServerSideProps to App Router",
107
+ "kind": "refactor",
108
+ "description": "Converts Pages Router getServerSideProps to App Router async Server Component with fetch.",
109
+ "pattern": "getServerSideProps",
110
+ "edit": {
111
+ "convertPattern": "getServerSideProps",
112
+ "replacement": "async-server-component",
113
+ "fetchOptions": "{ cache: 'no-store' }"
114
+ }
115
+ },
116
+ {
117
+ "title": "Convert API Route to Route Handler",
118
+ "kind": "refactor",
119
+ "description": "Converts Pages Router API route (req, res) to App Router Route Handler with NextRequest/NextResponse.",
120
+ "pattern": "NextApiRequest|NextApiResponse|req\\.method|res\\.status",
121
+ "edit": {
122
+ "convertPattern": "api-route-to-route-handler",
123
+ "importReplace": {
124
+ "from": "import type { NextApiRequest, NextApiResponse } from 'next';",
125
+ "to": "import { NextRequest, NextResponse } from 'next/server';"
126
+ }
127
+ }
128
+ },
129
+ {
130
+ "title": "Add revalidation to fetch",
131
+ "kind": "quickfix",
132
+ "description": "Adds next.revalidate or next.tags option to an existing fetch call.",
133
+ "pattern": "fetch\\([^)]+\\)(?!.*next:)",
134
+ "edit": {
135
+ "appendToFetch": ", { next: { revalidate: 3600 } }"
136
+ }
137
+ },
138
+ {
139
+ "title": "Optimize Image component",
140
+ "kind": "quickfix",
141
+ "description": "Converts HTML <img> tag to Next.js <Image> component with optimization props.",
142
+ "pattern": "<img\\s",
143
+ "edit": {
144
+ "replaceTag": "Image",
145
+ "addImport": "import Image from 'next/image';",
146
+ "requiredProps": ["width", "height", "alt"]
147
+ }
148
+ },
149
+ {
150
+ "title": "Add middleware matcher",
151
+ "kind": "quickfix",
152
+ "description": "Adds or updates the config.matcher export in middleware.ts for route matching.",
153
+ "pattern": "export\\s+function\\s+middleware",
154
+ "edit": {
155
+ "insertText": "\nexport const config = {\n matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],\n};\n",
156
+ "position": "bottom"
157
+ }
158
+ },
159
+ {
160
+ "title": "Convert to dynamic import",
161
+ "kind": "refactor",
162
+ "description": "Converts a static import to a dynamic import using next/dynamic for code splitting.",
163
+ "pattern": "import\\s+\\w+\\s+from\\s+'[^']+'",
164
+ "edit": {
165
+ "convertPattern": "static-to-dynamic",
166
+ "addImport": "import dynamic from 'next/dynamic';"
167
+ }
168
+ },
169
+ {
170
+ "title": "Add route segment config",
171
+ "kind": "source",
172
+ "description": "Adds route segment configuration exports (dynamic, revalidate, runtime, etc.).",
173
+ "pattern": "page\\.(tsx|jsx|ts|js)|route\\.(tsx|jsx|ts|js)|layout\\.(tsx|jsx|ts|js)",
174
+ "edit": {
175
+ "insertText": "export const dynamic = 'auto';\nexport const revalidate = false;\n",
176
+ "position": "afterImports"
177
+ }
178
+ },
179
+ {
180
+ "title": "Organize Next.js imports",
181
+ "kind": "source.organizeImports",
182
+ "description": "Organizes imports with next/* imports first, then third-party, then local imports.",
183
+ "pattern": "import.*from\\s+'next/",
184
+ "edit": {
185
+ "sortOrder": ["next/*", "react", "third-party", "local"]
186
+ }
187
+ }
188
+ ],
189
+ "providedCodeActionKinds": [
190
+ "quickfix",
191
+ "refactor",
192
+ "refactor.extract",
193
+ "refactor.inline",
194
+ "source",
195
+ "source.fixAll",
196
+ "source.organizeImports"
197
+ ]
198
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "language": "react",
3
+ "codeActions": [
4
+ {
5
+ "title": "Extract JSX to new component",
6
+ "kind": "refactor.extract",
7
+ "description": "Extracts the selected JSX into a new React functional component and replaces the selection with the new component tag",
8
+ "pattern": "<[A-Za-z][^>]*>[\\s\\S]*</[A-Za-z][^>]*>",
9
+ "isPreferred": true
10
+ },
11
+ {
12
+ "title": "Extract custom hook",
13
+ "kind": "refactor.extract",
14
+ "description": "Extracts selected stateful logic (useState, useEffect, etc.) into a new custom hook function prefixed with 'use'",
15
+ "pattern": "const\\s+\\[.*\\]\\s*=\\s*useState|useEffect\\s*\\(",
16
+ "isPreferred": true
17
+ },
18
+ {
19
+ "title": "Wrap with React.memo",
20
+ "kind": "refactor",
21
+ "description": "Wraps the component with React.memo() for performance optimization by preventing unnecessary re-renders when props are unchanged",
22
+ "pattern": "(export\\s+)?(const|function)\\s+[A-Z][a-zA-Z]*",
23
+ "isPreferred": false
24
+ },
25
+ {
26
+ "title": "Wrap with Suspense boundary",
27
+ "kind": "refactor",
28
+ "description": "Wraps selected JSX with a React.Suspense boundary and a fallback loading component",
29
+ "pattern": "<[A-Z][a-zA-Z]*",
30
+ "isPreferred": false
31
+ },
32
+ {
33
+ "title": "Wrap with ErrorBoundary",
34
+ "kind": "refactor",
35
+ "description": "Wraps selected JSX with an ErrorBoundary component to catch rendering errors in the subtree",
36
+ "pattern": "<[A-Z][a-zA-Z]*",
37
+ "isPreferred": false
38
+ },
39
+ {
40
+ "title": "Convert class component to function component",
41
+ "kind": "refactor",
42
+ "description": "Converts a class-based React component to a functional component with hooks (useState for state, useEffect for lifecycle methods)",
43
+ "pattern": "class\\s+\\w+\\s+extends\\s+(React\\.)?Component",
44
+ "isPreferred": true
45
+ },
46
+ {
47
+ "title": "Wrap callback with useCallback",
48
+ "kind": "refactor",
49
+ "description": "Wraps an inline function or arrow function passed as a prop with useCallback to memoize it and prevent unnecessary child re-renders",
50
+ "pattern": "\\w+\\s*=\\s*\\{\\s*(\\(|function)",
51
+ "isPreferred": false
52
+ },
53
+ {
54
+ "title": "Wrap value with useMemo",
55
+ "kind": "refactor",
56
+ "description": "Wraps a computed value with useMemo to memoize the result and avoid expensive recalculations on every render",
57
+ "pattern": "const\\s+\\w+\\s*=\\s*(?!use)",
58
+ "isPreferred": false
59
+ },
60
+ {
61
+ "title": "Organize imports",
62
+ "kind": "source.organizeImports",
63
+ "description": "Sorts and groups React imports: React first, then third-party modules, then local imports, removing any unused imports",
64
+ "pattern": "^import\\s+",
65
+ "isPreferred": true
66
+ },
67
+ {
68
+ "title": "Fix missing key prop in list",
69
+ "kind": "quickfix",
70
+ "description": "Adds a unique key prop to JSX elements rendered inside a .map() call to fix the 'Each child in a list should have a unique key prop' warning",
71
+ "pattern": "\\.map\\s*\\([^)]*\\)\\s*=>\\s*<",
72
+ "isPreferred": true
73
+ },
74
+ {
75
+ "title": "Fix missing dependency in useEffect",
76
+ "kind": "quickfix",
77
+ "description": "Adds missing variables to the useEffect dependency array based on the variables used inside the effect callback",
78
+ "pattern": "useEffect\\s*\\([^,]+,\\s*\\[",
79
+ "isPreferred": true
80
+ },
81
+ {
82
+ "title": "Convert to controlled component",
83
+ "kind": "refactor",
84
+ "description": "Converts an uncontrolled form input to a controlled component by adding value and onChange props bound to state",
85
+ "pattern": "<input|<textarea|<select",
86
+ "isPreferred": false
87
+ },
88
+ {
89
+ "title": "Wrap with forwardRef",
90
+ "kind": "refactor",
91
+ "description": "Wraps the component with React.forwardRef to allow parent components to access a child ref",
92
+ "pattern": "(export\\s+)?(const|function)\\s+[A-Z][a-zA-Z]*",
93
+ "isPreferred": false
94
+ },
95
+ {
96
+ "title": "Add displayName",
97
+ "kind": "quickfix",
98
+ "description": "Adds a displayName static property to the component for better debugging in React DevTools",
99
+ "pattern": "(React\\.memo|React\\.forwardRef|memo|forwardRef)\\s*\\(",
100
+ "isPreferred": false
101
+ },
102
+ {
103
+ "title": "Convert to lazy-loaded component",
104
+ "kind": "refactor",
105
+ "description": "Converts a static import of a component to a dynamic import using React.lazy() for code splitting",
106
+ "pattern": "import\\s+\\w+\\s+from",
107
+ "isPreferred": false
108
+ },
109
+ {
110
+ "title": "Add error boundary wrapper",
111
+ "kind": "quickfix",
112
+ "description": "Adds try-catch pattern in async handlers or wraps components with error boundaries for better error handling",
113
+ "pattern": "async\\s+|await\\s+|throw\\s+",
114
+ "isPreferred": false
115
+ },
116
+ {
117
+ "title": "Fix all auto-fixable issues",
118
+ "kind": "source.fixAll",
119
+ "description": "Applies all automatic fixes including missing keys, unused imports, missing dependencies, and formatting issues",
120
+ "pattern": ".*",
121
+ "isPreferred": false
122
+ },
123
+ {
124
+ "title": "Extract inline styles to object",
125
+ "kind": "refactor.extract",
126
+ "description": "Extracts inline style objects from JSX elements into a named constant for better readability and reusability",
127
+ "pattern": "style\\s*=\\s*\\{\\{",
128
+ "isPreferred": false
129
+ },
130
+ {
131
+ "title": "Convert useState to useReducer",
132
+ "kind": "refactor",
133
+ "description": "Converts multiple related useState calls into a single useReducer with typed actions for complex state management",
134
+ "pattern": "const\\s+\\[\\w+,\\s*set\\w+\\]\\s*=\\s*useState",
135
+ "isPreferred": false
136
+ },
137
+ {
138
+ "title": "Add TypeScript types to component props",
139
+ "kind": "quickfix",
140
+ "description": "Generates a TypeScript interface for the component props based on prop usage within the component",
141
+ "pattern": "(const|function)\\s+[A-Z]\\w*\\s*=?\\s*\\(",
142
+ "isPreferred": false
143
+ }
144
+ ],
145
+ "providedCodeActionKinds": [
146
+ "quickfix",
147
+ "refactor",
148
+ "refactor.extract",
149
+ "refactor.inline",
150
+ "source",
151
+ "source.fixAll",
152
+ "source.organizeImports"
153
+ ]
154
+ }