@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,135 @@
1
+ {
2
+ "language": "angular",
3
+ "inlineCompletions": [
4
+ {
5
+ "text": "import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-${1:name}',\n templateUrl: './${1:name}.component.html',\n styleUrls: ['./${1:name}.component.scss']\n})\nexport class ${2:Name}Component {\n constructor() {}\n}",
6
+ "description": "Angular component class with external template and styles",
7
+ "triggerPrefix": "ang-component"
8
+ },
9
+ {
10
+ "text": "import { Component } from '@angular/core';\n\n@Component({\n selector: 'app-${1:name}',\n standalone: true,\n imports: [],\n template: `\n <div>\n ${2:content}\n </div>\n `,\n styles: []\n})\nexport class ${3:Name}Component {\n constructor() {}\n}",
11
+ "description": "Angular standalone component with inline template",
12
+ "triggerPrefix": "ang-standalone-component"
13
+ },
14
+ {
15
+ "text": "import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ${1:Name}Service {\n constructor() {}\n}",
16
+ "description": "Angular injectable service provided in root",
17
+ "triggerPrefix": "ang-service"
18
+ },
19
+ {
20
+ "text": "import { Directive, ElementRef } from '@angular/core';\n\n@Directive({\n selector: '[app${1:Name}]',\n standalone: true\n})\nexport class ${1:Name}Directive {\n constructor(private el: ElementRef) {}\n}",
21
+ "description": "Angular standalone directive",
22
+ "triggerPrefix": "ang-directive"
23
+ },
24
+ {
25
+ "text": "import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: '${1:pipeName}',\n standalone: true\n})\nexport class ${2:Name}Pipe implements PipeTransform {\n transform(value: unknown, ...args: unknown[]): unknown {\n return value;\n }\n}",
26
+ "description": "Angular standalone pipe implementing PipeTransform",
27
+ "triggerPrefix": "ang-pipe"
28
+ },
29
+ {
30
+ "text": "import { CanActivateFn } from '@angular/router';\n\nexport const ${1:auth}Guard: CanActivateFn = (route, state) => {\n return true;\n};",
31
+ "description": "Angular functional route guard (CanActivateFn)",
32
+ "triggerPrefix": "ang-guard"
33
+ },
34
+ {
35
+ "text": "import { HttpInterceptorFn } from '@angular/common/http';\n\nexport const ${1:name}Interceptor: HttpInterceptorFn = (req, next) => {\n const modifiedReq = req.clone({\n setHeaders: {\n Authorization: `Bearer ${2:token}`\n }\n });\n return next(modifiedReq);\n};",
36
+ "description": "Angular functional HTTP interceptor",
37
+ "triggerPrefix": "ang-interceptor"
38
+ },
39
+ {
40
+ "text": "import { ResolveFn } from '@angular/router';\n\nexport const ${1:name}Resolver: ResolveFn<${2:any}> = (route, state) => {\n return ${3:null};\n};",
41
+ "description": "Angular functional route resolver",
42
+ "triggerPrefix": "ang-resolver"
43
+ },
44
+ {
45
+ "text": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule\n ],\n exports: []\n})\nexport class ${1:Name}Module {}",
46
+ "description": "Angular NgModule",
47
+ "triggerPrefix": "ang-module"
48
+ },
49
+ {
50
+ "text": "import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { CommonModule } from '@angular/common';\n\nconst routes: Routes = [\n { path: '', component: ${1:Name}Component }\n];\n\n@NgModule({\n declarations: [${1:Name}Component],\n imports: [\n CommonModule,\n RouterModule.forChild(routes)\n ]\n})\nexport class ${1:Name}Module {}",
51
+ "description": "Angular feature module with routing",
52
+ "triggerPrefix": "ang-feature-module"
53
+ },
54
+ {
55
+ "text": "{\n path: '${1:feature}',\n loadChildren: () => import('./${1:feature}/${1:feature}.module').then(m => m.${2:Feature}Module)\n}",
56
+ "description": "Lazy-loaded route configuration",
57
+ "triggerPrefix": "ang-lazy-route"
58
+ },
59
+ {
60
+ "text": "import { FormGroup, FormControl, Validators } from '@angular/forms';\n\n${1:form} = new FormGroup({\n ${2:name}: new FormControl('', [Validators.required]),\n ${3:email}: new FormControl('', [Validators.required, Validators.email])\n});\n\nonSubmit(): void {\n if (this.${1:form}.valid) {\n console.log(this.${1:form}.value);\n }\n}",
61
+ "description": "Reactive form group with validators",
62
+ "triggerPrefix": "ang-reactive-form"
63
+ },
64
+ {
65
+ "text": "<form #${1:form}=\"ngForm\" (ngSubmit)=\"onSubmit(${1:form})\">\n <input name=\"${2:field}\" ngModel required />\n <button type=\"submit\" [disabled]=\"${1:form}.invalid\">Submit</button>\n</form>",
66
+ "description": "Template-driven form with ngModel",
67
+ "triggerPrefix": "ang-template-form"
68
+ },
69
+ {
70
+ "text": "import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport function ${1:customValidator}(): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const isValid = ${2:true};\n return isValid ? null : { ${1:customValidator}: { value: control.value } };\n };\n}",
71
+ "description": "Custom form validator function",
72
+ "triggerPrefix": "ang-validator"
73
+ },
74
+ {
75
+ "text": "import { ErrorHandler, Injectable } from '@angular/core';\n\n@Injectable()\nexport class GlobalErrorHandler implements ErrorHandler {\n handleError(error: unknown): void {\n console.error('Unhandled error:', error);\n }\n}",
76
+ "description": "Global error handler service",
77
+ "triggerPrefix": "ang-error-handler"
78
+ },
79
+ {
80
+ "text": "import { Component, signal, computed, effect } from '@angular/core';\n\n@Component({\n selector: 'app-${1:name}',\n standalone: true,\n template: `\n <div>{{ ${2:count}() }}</div>\n <button (click)=\"increment()\">+</button>\n `\n})\nexport class ${3:Name}Component {\n ${2:count} = signal(0);\n double = computed(() => this.${2:count}() * 2);\n\n constructor() {\n effect(() => {\n console.log('Count changed:', this.${2:count}());\n });\n }\n\n increment(): void {\n this.${2:count}.update(v => v + 1);\n }\n}",
81
+ "description": "Signal-based standalone component with computed and effect",
82
+ "triggerPrefix": "ang-signal-component"
83
+ },
84
+ {
85
+ "text": "import { signalStore, withState, withComputed, withMethods, patchState } from '@ngrx/signals';\nimport { computed } from '@angular/core';\n\ntype ${1:Name}State = {\n items: ${2:any}[];\n loading: boolean;\n};\n\nconst initialState: ${1:Name}State = {\n items: [],\n loading: false\n};\n\nexport const ${3:Name}Store = signalStore(\n withState(initialState),\n withComputed((store) => ({\n itemCount: computed(() => store.items().length)\n })),\n withMethods((store) => ({\n addItem(item: ${2:any}): void {\n patchState(store, { items: [...store.items(), item] });\n },\n setLoading(loading: boolean): void {\n patchState(store, { loading });\n }\n }))\n);",
86
+ "description": "NgRx signal store with state, computed, and methods",
87
+ "triggerPrefix": "ang-signal-store"
88
+ },
89
+ {
90
+ "text": "import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ${1:Name}Service {\n private http = inject(HttpClient);\n private apiUrl = '${2:/api}';\n\n getAll(): Observable<${3:any}[]> {\n return this.http.get<${3:any}[]>(this.apiUrl);\n }\n\n getById(id: string): Observable<${3:any}> {\n return this.http.get<${3:any}>(`${this.apiUrl}/${id}`);\n }\n\n create(data: Partial<${3:any}>): Observable<${3:any}> {\n return this.http.post<${3:any}>(this.apiUrl, data);\n }\n\n update(id: string, data: Partial<${3:any}>): Observable<${3:any}> {\n return this.http.put<${3:any}>(`${this.apiUrl}/${id}`, data);\n }\n\n delete(id: string): Observable<void> {\n return this.http.delete<void>(`${this.apiUrl}/${id}`);\n }\n}",
91
+ "description": "HTTP service with full CRUD methods using inject()",
92
+ "triggerPrefix": "ang-http-service"
93
+ },
94
+ {
95
+ "text": "{\n path: '${1:parent}',\n component: ${2:Parent}Component,\n children: [\n { path: '', component: ${3:List}Component },\n { path: ':id', component: ${4:Detail}Component },\n { path: 'create', component: ${5:Create}Component }\n ]\n}",
96
+ "description": "Route configuration with child routes",
97
+ "triggerPrefix": "ang-route-children"
98
+ },
99
+ {
100
+ "text": "import { ComponentFixture, TestBed } from '@angular/core/testing';\nimport { ${1:Name}Component } from './${2:name}.component';\n\ndescribe('${1:Name}Component', () => {\n let component: ${1:Name}Component;\n let fixture: ComponentFixture<${1:Name}Component>;\n\n beforeEach(async () => {\n await TestBed.configureTestingModule({\n imports: [${1:Name}Component]\n }).compileComponents();\n\n fixture = TestBed.createComponent(${1:Name}Component);\n component = fixture.componentInstance;\n fixture.detectChanges();\n });\n\n it('should create', () => {\n expect(component).toBeTruthy();\n });\n});",
101
+ "description": "Unit test with TestBed for standalone component",
102
+ "triggerPrefix": "ang-test"
103
+ },
104
+ {
105
+ "text": "export const environment = {\n production: ${1:false},\n apiUrl: '${2:http://localhost:3000/api}',\n appName: '${3:MyApp}'\n};",
106
+ "description": "Environment configuration file",
107
+ "triggerPrefix": "ang-environment"
108
+ },
109
+ {
110
+ "text": "import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { provideHttpClient, withInterceptors } from '@angular/common/http';\n\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes),\n provideHttpClient(withInterceptors([]))\n ]\n};",
111
+ "description": "app.config.ts with providers for standalone app",
112
+ "triggerPrefix": "ang-app-config"
113
+ },
114
+ {
115
+ "text": "import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch((err) => console.error(err));",
116
+ "description": "main.ts bootstrap for standalone Angular app",
117
+ "triggerPrefix": "ang-main"
118
+ },
119
+ {
120
+ "text": "import { Component, inject } from '@angular/core';\nimport { ${1:Name}Service } from './${2:name}.service';\n\n@Component({\n selector: 'app-${2:name}',\n standalone: true,\n template: `\n <div>{{ data() }}</div>\n `\n})\nexport class ${1:Name}Component {\n private ${2:name}Service = inject(${1:Name}Service);\n data = this.${2:name}Service.getData();\n}",
121
+ "description": "Component using inject() function for dependency injection",
122
+ "triggerPrefix": "ang-inject-component"
123
+ },
124
+ {
125
+ "text": "import { Component, input, output } from '@angular/core';\n\n@Component({\n selector: 'app-${1:name}',\n standalone: true,\n template: `\n <div>{{ title() }}</div>\n <button (click)=\"clicked.emit()\">Click</button>\n `\n})\nexport class ${2:Name}Component {\n title = input.required<string>();\n value = input<number>(0);\n clicked = output<void>();\n}",
126
+ "description": "Component with signal-based input() and output()",
127
+ "triggerPrefix": "ang-signal-io"
128
+ },
129
+ {
130
+ "text": "import { Component, viewChild, ElementRef, AfterViewInit } from '@angular/core';\n\n@Component({\n selector: 'app-${1:name}',\n standalone: true,\n template: `\n <div #${2:container}>Content</div>\n `\n})\nexport class ${3:Name}Component implements AfterViewInit {\n ${2:container} = viewChild.required<ElementRef>('${2:container}');\n\n ngAfterViewInit(): void {\n console.log(this.${2:container}().nativeElement);\n }\n}",
131
+ "description": "Component with signal-based viewChild query",
132
+ "triggerPrefix": "ang-viewchild"
133
+ }
134
+ ]
135
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "language": "nestjs",
3
+ "inlineCompletions": [
4
+ { "triggerPattern": "^\\s*@Controller\\($", "insertText": "'${1:path}')\nexport class ${2:Name}Controller {\n\tconstructor(private readonly ${3:name}Service: ${2:Name}Service) {}\n\n\t@Get()\n\tfindAll() {\n\t\treturn this.${3:name}Service.findAll();\n\t}\n}", "description": "Controller class template", "completeBracketPairs": true },
5
+ { "triggerPattern": "^\\s*@Injectable\\(\\)$", "insertText": "\nexport class ${1:Name}Service {\n\tconstructor() {}\n\n\t${2:// service methods}\n}", "description": "Injectable service template", "completeBracketPairs": true },
6
+ { "triggerPattern": "^\\s*@Module\\($", "insertText": "{\n\timports: [${1}],\n\tcontrollers: [${2}],\n\tproviders: [${3}],\n\texports: [${4}],\n})\nexport class ${5:Name}Module {}", "description": "Module definition template", "completeBracketPairs": true },
7
+ { "triggerPattern": "^\\s*@Get\\($", "insertText": "'${1:path}')\nasync ${2:findAll}(${3}): Promise<${4:any}> {\n\t${5:return [];}\n}", "description": "GET endpoint handler", "completeBracketPairs": true },
8
+ { "triggerPattern": "^\\s*@Post\\($", "insertText": "'${1:path}')\n@HttpCode(${2:201})\nasync ${3:create}(@Body() ${4:createDto}: ${5:CreateDto}): Promise<${6:any}> {\n\t${7:return this.service.create(createDto);}\n}", "description": "POST endpoint handler", "completeBracketPairs": true },
9
+ { "triggerPattern": "^\\s*@Put\\($", "insertText": "'${1::id}')\nasync ${2:update}(@Param('id') id: string, @Body() ${3:updateDto}: ${4:UpdateDto}): Promise<${5:any}> {\n\t${6:return this.service.update(id, updateDto);}\n}", "description": "PUT endpoint handler", "completeBracketPairs": true },
10
+ { "triggerPattern": "^\\s*@Delete\\($", "insertText": "'${1::id}')\n@HttpCode(${2:204})\nasync ${3:remove}(@Param('id') id: string): Promise<void> {\n\t${4:return this.service.remove(id);}\n}", "description": "DELETE endpoint handler", "completeBracketPairs": true },
11
+ { "triggerPattern": "^\\s*@UseGuards\\($", "insertText": "${1:AuthGuard})\n${2}", "description": "Guard decorator", "completeBracketPairs": true },
12
+ { "triggerPattern": "^\\s*canActivate\\($", "insertText": "context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {\n\tconst request = context.switchToHttp().getRequest();\n\t${1:return true;}\n}", "description": "Guard canActivate method", "completeBracketPairs": true },
13
+ { "triggerPattern": "^\\s*transform\\($", "insertText": "value: ${1:any}, metadata: ArgumentMetadata): ${2:any} {\n\t${3:return value;}\n}", "description": "Pipe transform method", "completeBracketPairs": true },
14
+ { "triggerPattern": "^\\s*intercept\\($", "insertText": "context: ExecutionContext, next: CallHandler): Observable<${1:any}> {\n\t${2:console.log('Before...');}\n\treturn next.handle().pipe(\n\t\t${3:tap(() => console.log('After...'))}\n\t);\n}", "description": "Interceptor intercept method", "completeBracketPairs": true },
15
+ { "triggerPattern": "^\\s*catch\\(exception$", "insertText": ": ${1:HttpException}, host: ArgumentsHost) {\n\tconst ctx = host.switchToHttp();\n\tconst response = ctx.getResponse<Response>();\n\tconst status = exception.getStatus();\n\n\tresponse.status(status).json({\n\t\tstatusCode: status,\n\t\tmessage: exception.message,\n\t\ttimestamp: new Date().toISOString(),\n\t});\n}", "description": "Exception filter catch method", "completeBracketPairs": true },
16
+ { "triggerPattern": "^\\s*Test\\.createTestingModule\\($", "insertText": "{\n\timports: [${1}],\n\tcontrollers: [${2}],\n\tproviders: [${3}],\n}).compile();\n\n${4:service} = module.get<${5:Service}>(${5:Service});", "description": "Testing module setup", "completeBracketPairs": true },
17
+ { "triggerPattern": "^\\s*@WebSocketGateway\\($", "insertText": "${1:80}, { namespace: '${2:events}' })\nexport class ${3:Name}Gateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {\n\t@WebSocketServer()\n\tserver: Server;\n\n\t@SubscribeMessage('${4:message}')\n\thandle${4:Message}(client: Socket, payload: ${5:any}): ${6:any} {\n\t\t${7:return payload;}\n\t}\n}", "description": "WebSocket gateway template", "completeBracketPairs": true },
18
+ { "triggerPattern": "^\\s*configure\\($", "insertText": "consumer: MiddlewareConsumer) {\n\tconsumer\n\t\t.apply(${1:LoggerMiddleware})\n\t\t.forRoutes(${2:'*'});\n}", "description": "Middleware configuration", "completeBracketPairs": true },
19
+ { "triggerPattern": "^\\s*@Cron\\($", "insertText": "'${1:*/30 * * * * *}')\nasync ${2:handleCron}() {\n\t${3:// scheduled task}\n}", "description": "Cron job handler", "completeBracketPairs": true },
20
+ { "triggerPattern": "^\\s*TypeOrmModule\\.forRoot\\($", "insertText": "{\n\ttype: '${1|postgres,mysql,sqlite,mariadb,mssql|}',\n\thost: '${2:localhost}',\n\tport: ${3:5432},\n\tusername: '${4:user}',\n\tpassword: '${5:password}',\n\tdatabase: '${6:db}',\n\tentities: [${7}],\n\tsynchronize: ${8:true},\n})", "description": "TypeORM connection config", "completeBracketPairs": true },
21
+ { "triggerPattern": "^\\s*@ApiOperation\\($", "insertText": "{ summary: '${1:Operation description}' })\n@ApiResponse({ status: ${2:200}, description: '${3:Success}' })\n${4}", "description": "Swagger operation docs", "completeBracketPairs": true },
22
+ { "triggerPattern": "^\\s*@Entity\\($", "insertText": "'${1:table_name}')\nexport class ${2:Name}Entity {\n\t@PrimaryGeneratedColumn()\n\tid: number;\n\n\t@Column()\n\t${3:name}: ${4:string};\n\n\t@CreateDateColumn()\n\tcreatedAt: Date;\n\n\t@UpdateDateColumn()\n\tupdatedAt: Date;\n}", "description": "TypeORM entity template", "completeBracketPairs": true },
23
+ { "triggerPattern": "^\\s*class\\s+\\w+Dto$", "insertText": " {\n\t@IsNotEmpty()\n\t@IsString()\n\t${1:name}: string;\n\n\t@IsOptional()\n\t@IsNumber()\n\t${2:age}?: number;\n}", "description": "DTO class with validators", "completeBracketPairs": true }
24
+ ]
25
+ }
@@ -0,0 +1,179 @@
1
+ {
2
+ "language": "nextjs",
3
+ "inlineCompletions": [
4
+ {
5
+ "triggerPattern": "export\\s+default\\s+function\\s+Page",
6
+ "insertText": "export default function Page({\n params,\n searchParams\n}: {\n params: Promise<{ slug: string }>\n searchParams: Promise<{ [key: string]: string | string[] | undefined }>\n}) {\n return (\n <div>\n <h1>Page</h1>\n </div>\n )\n}",
7
+ "description": "App Router page component template",
8
+ "completeBracketPairs": true
9
+ },
10
+ {
11
+ "triggerPattern": "export\\s+default\\s+function\\s+Layout",
12
+ "insertText": "export default function Layout({\n children\n}: {\n children: React.ReactNode\n}) {\n return (\n <div>\n {children}\n </div>\n )\n}",
13
+ "description": "App Router layout component template",
14
+ "completeBracketPairs": true
15
+ },
16
+ {
17
+ "triggerPattern": "export\\s+default\\s+function\\s+RootLayout",
18
+ "insertText": "export default function RootLayout({\n children\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n )\n}",
19
+ "description": "Root layout component with html and body tags",
20
+ "completeBracketPairs": true
21
+ },
22
+ {
23
+ "triggerPattern": "export\\s+default\\s+function\\s+Loading",
24
+ "insertText": "export default function Loading() {\n return (\n <div className=\"flex items-center justify-center\">\n <p>Loading...</p>\n </div>\n )\n}",
25
+ "description": "Loading component template",
26
+ "completeBracketPairs": true
27
+ },
28
+ {
29
+ "triggerPattern": "export\\s+default\\s+function\\s+Error",
30
+ "insertText": "'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}",
31
+ "description": "Error boundary component template",
32
+ "completeBracketPairs": true
33
+ },
34
+ {
35
+ "triggerPattern": "export\\s+default\\s+function\\s+NotFound",
36
+ "insertText": "export default function NotFound() {\n return (\n <div>\n <h2>Not Found</h2>\n <p>Could not find the requested resource.</p>\n </div>\n )\n}",
37
+ "description": "Not-found component template",
38
+ "completeBracketPairs": true
39
+ },
40
+ {
41
+ "triggerPattern": "export\\s+async\\s+function\\s+GET",
42
+ "insertText": "export async function GET(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n return NextResponse.json({ id })\n}",
43
+ "description": "Route Handler GET method",
44
+ "completeBracketPairs": true
45
+ },
46
+ {
47
+ "triggerPattern": "export\\s+async\\s+function\\s+POST",
48
+ "insertText": "export async function POST(request: NextRequest) {\n const body = await request.json()\n return NextResponse.json({ success: true }, { status: 201 })\n}",
49
+ "description": "Route Handler POST method",
50
+ "completeBracketPairs": true
51
+ },
52
+ {
53
+ "triggerPattern": "export\\s+(?:async\\s+)?function\\s+middleware",
54
+ "insertText": "import { NextResponse } from 'next/server'\nimport type { NextRequest } from 'next/server'\n\nexport function middleware(request: NextRequest) {\n return NextResponse.next()\n}\n\nexport const config = {\n matcher: ['/dashboard/:path*']\n}",
55
+ "description": "Middleware function template",
56
+ "completeBracketPairs": true
57
+ },
58
+ {
59
+ "triggerPattern": "['\"]use server['\"]\\s*$",
60
+ "insertText": "'use server'\n\nexport async function submitForm(formData: FormData) {\n const data = Object.fromEntries(formData)\n // Process form data\n}",
61
+ "description": "Server Action template",
62
+ "completeBracketPairs": true
63
+ },
64
+ {
65
+ "triggerPattern": "const\\s+router\\s*=\\s*useRouter",
66
+ "insertText": "const router = useRouter()\n\nconst handleNavigate = () => {\n router.push('/destination')\n}",
67
+ "description": "useRouter with navigation handler",
68
+ "completeBracketPairs": true
69
+ },
70
+ {
71
+ "triggerPattern": "const\\s+pathname\\s*=\\s*usePathname",
72
+ "insertText": "const pathname = usePathname()",
73
+ "description": "usePathname hook usage",
74
+ "completeBracketPairs": true
75
+ },
76
+ {
77
+ "triggerPattern": "const\\s+searchParams\\s*=\\s*useSearchParams",
78
+ "insertText": "const searchParams = useSearchParams()\nconst query = searchParams.get('q')",
79
+ "description": "useSearchParams hook with query extraction",
80
+ "completeBracketPairs": true
81
+ },
82
+ {
83
+ "triggerPattern": "<Image\\s",
84
+ "insertText": "<Image\n src=\"/image.png\"\n width={500}\n height={300}\n alt=\"Description\"\n/>",
85
+ "description": "next/image component with required props",
86
+ "completeBracketPairs": true
87
+ },
88
+ {
89
+ "triggerPattern": "<Image\\s+fill",
90
+ "insertText": "<Image\n src=\"/image.png\"\n fill\n sizes=\"(max-width: 768px) 100vw, 50vw\"\n alt=\"Description\"\n className=\"object-cover\"\n/>",
91
+ "description": "next/image with fill mode",
92
+ "completeBracketPairs": true
93
+ },
94
+ {
95
+ "triggerPattern": "<Link\\s",
96
+ "insertText": "<Link href=\"/path\">\n Link Text\n</Link>",
97
+ "description": "next/link component",
98
+ "completeBracketPairs": true
99
+ },
100
+ {
101
+ "triggerPattern": "export\\s+async\\s+function\\s+generateMetadata",
102
+ "insertText": "export async function generateMetadata(\n { params }: { params: Promise<{ slug: string }> },\n parent: ResolvingMetadata\n): Promise<Metadata> {\n const { slug } = await params\n return {\n title: slug,\n description: `Description for ${slug}`\n }\n}",
103
+ "description": "generateMetadata function template",
104
+ "completeBracketPairs": true
105
+ },
106
+ {
107
+ "triggerPattern": "export\\s+async\\s+function\\s+generateStaticParams",
108
+ "insertText": "export async function generateStaticParams() {\n const items = await fetchItems()\n return items.map((item) => ({\n slug: item.slug\n }))\n}",
109
+ "description": "generateStaticParams function template",
110
+ "completeBracketPairs": true
111
+ },
112
+ {
113
+ "triggerPattern": "export\\s+const\\s+metadata\\s*:\\s*Metadata",
114
+ "insertText": "export const metadata: Metadata = {\n title: 'Page Title',\n description: 'Page description',\n openGraph: {\n title: 'Page Title',\n description: 'Page description',\n type: 'website'\n }\n}",
115
+ "description": "Static metadata export with OpenGraph",
116
+ "completeBracketPairs": true
117
+ },
118
+ {
119
+ "triggerPattern": "export\\s+default\\s+(?:async\\s+)?function\\s+handler",
120
+ "insertText": "import type { NextApiRequest, NextApiResponse } from 'next'\n\nexport default async function handler(\n req: NextApiRequest,\n res: NextApiResponse\n) {\n if (req.method === 'GET') {\n return res.status(200).json({ message: 'OK' })\n }\n return res.status(405).json({ message: 'Method not allowed' })\n}",
121
+ "description": "Pages Router API route handler",
122
+ "completeBracketPairs": true
123
+ },
124
+ {
125
+ "triggerPattern": "import\\s+dynamic\\s+from\\s+['\"]next/dynamic['\"]",
126
+ "insertText": "import dynamic from 'next/dynamic'\n\nconst DynamicComponent = dynamic(() => import('./Component'), {\n loading: () => <p>Loading...</p>,\n ssr: false\n})",
127
+ "description": "Dynamic import with next/dynamic",
128
+ "completeBracketPairs": true
129
+ },
130
+ {
131
+ "triggerPattern": "<form\\s+action\\s*=",
132
+ "insertText": "<form action={async (formData: FormData) => {\n 'use server'\n const data = Object.fromEntries(formData)\n // Process form data\n}}>\n <input type=\"text\" name=\"field\" />\n <button type=\"submit\">Submit</button>\n</form>",
133
+ "description": "Form with inline Server Action",
134
+ "completeBracketPairs": true
135
+ },
136
+ {
137
+ "triggerPattern": "export\\s+async\\s+function\\s+PUT",
138
+ "insertText": "export async function PUT(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n const body = await request.json()\n return NextResponse.json({ id, ...body })\n}",
139
+ "description": "Route Handler PUT method",
140
+ "completeBracketPairs": true
141
+ },
142
+ {
143
+ "triggerPattern": "export\\s+async\\s+function\\s+DELETE",
144
+ "insertText": "export async function DELETE(\n request: NextRequest,\n { params }: { params: Promise<{ id: string }> }\n) {\n const { id } = await params\n return NextResponse.json({ deleted: true })\n}",
145
+ "description": "Route Handler DELETE method",
146
+ "completeBracketPairs": true
147
+ },
148
+ {
149
+ "triggerPattern": "const\\s+\\{\\s*pending",
150
+ "insertText": "const { pending, data, method, action } = useFormStatus()",
151
+ "description": "useFormStatus destructuring",
152
+ "completeBracketPairs": true
153
+ },
154
+ {
155
+ "triggerPattern": "const\\s+\\[state,\\s*formAction\\]\\s*=\\s*useFormState",
156
+ "insertText": "const [state, formAction] = useFormState(serverAction, initialState)",
157
+ "description": "useFormState hook usage",
158
+ "completeBracketPairs": true
159
+ },
160
+ {
161
+ "triggerPattern": "export\\s+default\\s+function\\s+Template",
162
+ "insertText": "export default function Template({\n children\n}: {\n children: React.ReactNode\n}) {\n return <div>{children}</div>\n}",
163
+ "description": "Template component",
164
+ "completeBracketPairs": true
165
+ },
166
+ {
167
+ "triggerPattern": "export\\s+default\\s+function\\s+GlobalError",
168
+ "insertText": "'use client'\n\nexport default function GlobalError({\n error,\n reset\n}: {\n error: Error & { digest?: string }\n reset: () => void\n}) {\n return (\n <html>\n <body>\n <h2>Something went wrong!</h2>\n <button onClick={() => reset()}>Try again</button>\n </body>\n </html>\n )\n}",
169
+ "description": "Global error component with required html/body tags",
170
+ "completeBracketPairs": true
171
+ },
172
+ {
173
+ "triggerPattern": "<Script\\s",
174
+ "insertText": "<Script\n src=\"https://example.com/script.js\"\n strategy=\"afterInteractive\"\n onLoad={() => console.log('Script loaded')}\n/>",
175
+ "description": "next/script component with strategy",
176
+ "completeBracketPairs": true
177
+ }
178
+ ]
179
+ }
@@ -0,0 +1,203 @@
1
+ {
2
+ "language": "react",
3
+ "inlineCompletions": [
4
+ {
5
+ "triggerPattern": "^import React",
6
+ "insertText": "import React from 'react';",
7
+ "description": "Import React default module",
8
+ "completeBracketPairs": false
9
+ },
10
+ {
11
+ "triggerPattern": "^import \\{ us",
12
+ "insertText": "import { useState, useEffect } from 'react';",
13
+ "description": "Import common React hooks",
14
+ "completeBracketPairs": false
15
+ },
16
+ {
17
+ "triggerPattern": "const \\[\\w+, set",
18
+ "insertText": "const [${1}, set${1/(.*)/${1:/capitalize}/}] = useState(${2});",
19
+ "description": "useState declaration with setter",
20
+ "completeBracketPairs": true
21
+ },
22
+ {
23
+ "triggerPattern": "useEffect\\(\\(\\) =>",
24
+ "insertText": "useEffect(() => {\n ${1}\n return () => {\n ${2}\n };\n}, [${3}]);",
25
+ "description": "useEffect with cleanup function",
26
+ "completeBracketPairs": true
27
+ },
28
+ {
29
+ "triggerPattern": "useEffect\\(\\(\\) => \\{\\s*$",
30
+ "insertText": "\n ${1:// effect logic}\n return () => {\n ${2:// cleanup}\n };\n}, [${3}]);",
31
+ "description": "useEffect body with cleanup",
32
+ "completeBracketPairs": true
33
+ },
34
+ {
35
+ "triggerPattern": "const \\w+ = useRef",
36
+ "insertText": "const ${1:ref} = useRef<${2:HTMLDivElement}>(${3:null});",
37
+ "description": "useRef with type annotation",
38
+ "completeBracketPairs": true
39
+ },
40
+ {
41
+ "triggerPattern": "const \\w+ = useMemo",
42
+ "insertText": "const ${1:memoized} = useMemo(() => ${2:computation}, [${3:deps}]);",
43
+ "description": "useMemo with computation",
44
+ "completeBracketPairs": true
45
+ },
46
+ {
47
+ "triggerPattern": "const \\w+ = useCallback",
48
+ "insertText": "const ${1:callback} = useCallback((${2:args}) => {\n ${3}\n}, [${4:deps}]);",
49
+ "description": "useCallback with dependencies",
50
+ "completeBracketPairs": true
51
+ },
52
+ {
53
+ "triggerPattern": "const \\w+ = useContext",
54
+ "insertText": "const ${1:value} = useContext(${2:MyContext});",
55
+ "description": "useContext consumption",
56
+ "completeBracketPairs": true
57
+ },
58
+ {
59
+ "triggerPattern": "const \\[\\w+, dispatch\\] = useReducer",
60
+ "insertText": "const [${1:state}, dispatch] = useReducer(${2:reducer}, ${3:initialState});",
61
+ "description": "useReducer with dispatch",
62
+ "completeBracketPairs": true
63
+ },
64
+ {
65
+ "triggerPattern": "<div className=",
66
+ "insertText": "<div className=\"${1:container}\">\n ${2}\n</div>",
67
+ "description": "JSX div with className",
68
+ "completeBracketPairs": true
69
+ },
70
+ {
71
+ "triggerPattern": "onClick=\\{",
72
+ "insertText": "onClick={(e) => {\n ${1:e.preventDefault();}\n ${2}\n}}",
73
+ "description": "onClick handler with event",
74
+ "completeBracketPairs": true
75
+ },
76
+ {
77
+ "triggerPattern": "onChange=\\{",
78
+ "insertText": "onChange={(e: React.ChangeEvent<${1:HTMLInputElement}>) => {\n ${2:setValue(e.target.value);}\n}}",
79
+ "description": "onChange handler with typed event",
80
+ "completeBracketPairs": true
81
+ },
82
+ {
83
+ "triggerPattern": "onSubmit=\\{",
84
+ "insertText": "onSubmit={(e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n ${1}\n}}",
85
+ "description": "onSubmit handler with preventDefault",
86
+ "completeBracketPairs": true
87
+ },
88
+ {
89
+ "triggerPattern": "\\{\\w+\\.map\\(",
90
+ "insertText": "{${1:items}.map((${2:item}) => (\n <${3:div} key={${2:item}.${4:id}}>\n {${2:item}.${5:name}}\n </${3:div}>\n))}",
91
+ "description": "Array map with key prop",
92
+ "completeBracketPairs": true
93
+ },
94
+ {
95
+ "triggerPattern": "\\{\\w+ \\? ",
96
+ "insertText": "{${1:condition} ? (\n ${2:<div>True</div>}\n) : (\n ${3:<div>False</div>}\n)}",
97
+ "description": "Ternary conditional rendering",
98
+ "completeBracketPairs": true
99
+ },
100
+ {
101
+ "triggerPattern": "\\{\\w+ && ",
102
+ "insertText": "{${1:condition} && <${2:div}>${3:content}</${2:div}>}",
103
+ "description": "Logical AND conditional rendering",
104
+ "completeBracketPairs": true
105
+ },
106
+ {
107
+ "triggerPattern": "const \\w+Context = createContext",
108
+ "insertText": "const ${1:My}Context = createContext<${2:ContextType} | undefined>(undefined);",
109
+ "description": "createContext with type",
110
+ "completeBracketPairs": true
111
+ },
112
+ {
113
+ "triggerPattern": "React\\.memo\\(",
114
+ "insertText": "React.memo(${1:Component}, (prevProps, nextProps) => {\n return ${2:prevProps.id === nextProps.id};\n})",
115
+ "description": "React.memo with custom comparison",
116
+ "completeBracketPairs": true
117
+ },
118
+ {
119
+ "triggerPattern": "forwardRef<",
120
+ "insertText": "forwardRef<${1:HTMLDivElement}, ${2:Props}>((props, ref) => {\n return <${3:div} ref={ref}>${4}</${3:div}>;\n})",
121
+ "description": "forwardRef with types",
122
+ "completeBracketPairs": true
123
+ },
124
+ {
125
+ "triggerPattern": "React\\.lazy\\(",
126
+ "insertText": "React.lazy(() => import('${1:./Component}'))",
127
+ "description": "React.lazy dynamic import",
128
+ "completeBracketPairs": true
129
+ },
130
+ {
131
+ "triggerPattern": "<Suspense",
132
+ "insertText": "<Suspense fallback={<${1:div}>Loading...</${1:div}>}>\n ${2}\n</Suspense>",
133
+ "description": "Suspense with fallback",
134
+ "completeBracketPairs": true
135
+ },
136
+ {
137
+ "triggerPattern": "createPortal\\(",
138
+ "insertText": "createPortal(\n ${1:children},\n document.getElementById('${2:portal-root}')!\n)",
139
+ "description": "createPortal with container",
140
+ "completeBracketPairs": true
141
+ },
142
+ {
143
+ "triggerPattern": "const \\[isPending, startTransition\\]",
144
+ "insertText": "const [isPending, startTransition] = useTransition();\n\nstartTransition(() => {\n ${1:setState(newValue)};\n});",
145
+ "description": "useTransition with startTransition call",
146
+ "completeBracketPairs": true
147
+ },
148
+ {
149
+ "triggerPattern": "useImperativeHandle\\(",
150
+ "insertText": "useImperativeHandle(${1:ref}, () => ({\n ${2:focus}() {\n ${3:// implementation}\n }\n}), [${4}]);",
151
+ "description": "useImperativeHandle with methods",
152
+ "completeBracketPairs": true
153
+ },
154
+ {
155
+ "triggerPattern": "style=\\{\\{",
156
+ "insertText": "style={{ ${1:display}: '${2:flex}', ${3:gap}: '${4:1rem}' }}",
157
+ "description": "Inline style object",
158
+ "completeBracketPairs": true
159
+ },
160
+ {
161
+ "triggerPattern": "<ErrorBoundary",
162
+ "insertText": "<ErrorBoundary fallback={<${1:div}>Something went wrong</${1:div}>}>\n ${2}\n</ErrorBoundary>",
163
+ "description": "ErrorBoundary with fallback",
164
+ "completeBracketPairs": true
165
+ },
166
+ {
167
+ "triggerPattern": "export default function \\w+",
168
+ "insertText": "export default function ${1:Component}(${2:props}: ${3:Props}) {\n return (\n <div>\n ${4}\n </div>\n );\n}",
169
+ "description": "Default exported function component",
170
+ "completeBracketPairs": true
171
+ },
172
+ {
173
+ "triggerPattern": "const handle\\w+ = async",
174
+ "insertText": "const handle${1:Submit} = async (${2:e}: ${3:React.FormEvent}) => {\n ${2:e}.preventDefault();\n try {\n ${4}\n } catch (error) {\n ${5:console.error(error);}\n }\n};",
175
+ "description": "Async event handler with error handling",
176
+ "completeBracketPairs": true
177
+ },
178
+ {
179
+ "triggerPattern": "useLayoutEffect\\(",
180
+ "insertText": "useLayoutEffect(() => {\n ${1:// read DOM measurements}\n return () => {\n ${2:// cleanup}\n };\n}, [${3}]);",
181
+ "description": "useLayoutEffect with cleanup",
182
+ "completeBracketPairs": true
183
+ },
184
+ {
185
+ "triggerPattern": "useSyncExternalStore\\(",
186
+ "insertText": "useSyncExternalStore(\n ${1:subscribe},\n ${2:getSnapshot},\n ${3:getServerSnapshot}\n)",
187
+ "description": "useSyncExternalStore with all params",
188
+ "completeBracketPairs": true
189
+ },
190
+ {
191
+ "triggerPattern": "<form onSubmit",
192
+ "insertText": "<form onSubmit={(e) => {\n e.preventDefault();\n ${1:// handle form submission}\n}}>\n ${2}\n <button type=\"submit\">${3:Submit}</button>\n</form>",
193
+ "description": "Form with submit handler",
194
+ "completeBracketPairs": true
195
+ },
196
+ {
197
+ "triggerPattern": "<input value=",
198
+ "insertText": "<input\n type=\"${1:text}\"\n value={${2:value}}\n onChange={(e) => ${3:setValue}(e.target.value)}\n placeholder=\"${4}\"\n/>",
199
+ "description": "Controlled input element",
200
+ "completeBracketPairs": true
201
+ }
202
+ ]
203
+ }