@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.
- package/data/codeActions/angular.json +126 -0
- package/data/codeActions/nestjs.json +124 -0
- package/data/codeActions/nextjs.json +198 -0
- package/data/codeActions/react.json +154 -0
- package/data/codeActions/shadcn.json +112 -0
- package/data/codeActions/shell.json +169 -26
- package/data/codeLens/angular.json +22 -0
- package/data/codeLens/nestjs.json +21 -0
- package/data/codeLens/nextjs.json +117 -0
- package/data/codeLens/react.json +89 -0
- package/data/codeLens/shadcn.json +89 -0
- package/data/codeLens/shell.json +59 -17
- package/data/codeLens/tailwindcss.json +56 -0
- package/data/color/angular.json +21 -0
- package/data/color/nestjs.json +18 -0
- package/data/color/nextjs.json +22 -0
- package/data/color/react.json +93 -0
- package/data/color/shadcn.json +66 -0
- package/data/color/shell.json +106 -80
- package/data/commands/angular.json +312 -0
- package/data/commands/manifest.json +5 -0
- package/data/commands/nestjs.json +273 -0
- package/data/commands/nextjs.json +123 -0
- package/data/commands/react.json +210 -0
- package/data/commands/shadcn.json +410 -0
- package/data/commands/shell.json +571 -41
- package/data/completion/angular.json +1490 -0
- package/data/completion/css.json +793 -0
- package/data/completion/nestjs.json +1454 -0
- package/data/completion/nextjs.json +1373 -0
- package/data/completion/react.json +1319 -0
- package/data/completion/shadcn.json +1202 -0
- package/data/completion/shell.json +2446 -510
- package/data/declaration/angular.json +46 -0
- package/data/declaration/nestjs.json +47 -0
- package/data/declaration/nextjs.json +274 -0
- package/data/declaration/react.json +199 -0
- package/data/declaration/shadcn.json +211 -0
- package/data/declaration/shell.json +343 -24
- package/data/declaration/tailwindcss.json +72 -0
- package/data/definition/angular.json +670 -0
- package/data/definition/nestjs.json +684 -0
- package/data/definition/nextjs.json +439 -0
- package/data/definition/react.json +397 -0
- package/data/definition/shadcn.json +99 -0
- package/data/definition/shell.json +820 -0
- package/data/documentHighlight/angular.json +414 -0
- package/data/documentHighlight/css.json +77 -2
- package/data/documentHighlight/nestjs.json +115 -0
- package/data/documentHighlight/nextjs.json +212 -0
- package/data/documentHighlight/react.json +119 -0
- package/data/documentHighlight/shadcn.json +168 -0
- package/data/documentHighlight/shell.json +664 -334
- package/data/documentHighlight/tailwindcss.json +105 -10
- package/data/documentRangeFormatting/angular.json +45 -0
- package/data/documentRangeFormatting/nestjs.json +17 -0
- package/data/documentRangeFormatting/nextjs.json +17 -0
- package/data/documentRangeFormatting/react.json +78 -0
- package/data/documentRangeFormatting/shadcn.json +45 -0
- package/data/documentRangeFormatting/shell.json +120 -53
- package/data/documentSymbol/angular.json +180 -0
- package/data/documentSymbol/nestjs.json +152 -0
- package/data/documentSymbol/nextjs.json +159 -0
- package/data/documentSymbol/react.json +145 -0
- package/data/documentSymbol/shadcn.json +131 -0
- package/data/documentSymbol/shell.json +166 -26
- package/data/documentSymbol/tailwindcss.json +49 -0
- package/data/foldingRange/angular.json +99 -0
- package/data/foldingRange/nestjs.json +26 -0
- package/data/foldingRange/nextjs.json +26 -0
- package/data/foldingRange/react.json +120 -0
- package/data/foldingRange/shadcn.json +93 -0
- package/data/foldingRange/shell.json +106 -46
- package/data/formatting/angular.json +21 -0
- package/data/formatting/nestjs.json +23 -0
- package/data/formatting/nextjs.json +23 -0
- package/data/formatting/react.json +71 -0
- package/data/formatting/shadcn.json +61 -0
- package/data/formatting/shell.json +103 -19
- package/data/hover/angular.json +455 -0
- package/data/hover/css.json +232 -0
- package/data/hover/nestjs.json +296 -0
- package/data/hover/nextjs.json +305 -0
- package/data/hover/react.json +173 -0
- package/data/hover/shadcn.json +450 -0
- package/data/hover/shell.json +684 -75
- package/data/implementation/angular.json +22 -0
- package/data/implementation/nestjs.json +24 -0
- package/data/implementation/nextjs.json +137 -0
- package/data/implementation/react.json +125 -0
- package/data/implementation/shadcn.json +89 -0
- package/data/implementation/shell.json +59 -3
- package/data/inlayHints/angular.json +24 -0
- package/data/inlayHints/nestjs.json +24 -0
- package/data/inlayHints/nextjs.json +143 -0
- package/data/inlayHints/react.json +177 -0
- package/data/inlayHints/shadcn.json +109 -0
- package/data/inlayHints/shell.json +223 -35
- package/data/inlineCompletions/angular.json +135 -0
- package/data/inlineCompletions/nestjs.json +25 -0
- package/data/inlineCompletions/nextjs.json +179 -0
- package/data/inlineCompletions/react.json +203 -0
- package/data/inlineCompletions/shadcn.json +115 -0
- package/data/inlineCompletions/shell.json +185 -35
- package/data/linkedEditingRange/angular.json +23 -0
- package/data/linkedEditingRange/nestjs.json +10 -0
- package/data/linkedEditingRange/nextjs.json +11 -0
- package/data/linkedEditingRange/react.json +75 -0
- package/data/linkedEditingRange/shadcn.json +23 -0
- package/data/linkedEditingRange/shell.json +25 -25
- package/data/links/angular.json +95 -0
- package/data/links/nestjs.json +130 -0
- package/data/links/nextjs.json +91 -0
- package/data/links/react.json +75 -0
- package/data/links/shadcn.json +98 -0
- package/data/links/shell.json +56 -0
- package/data/links/tailwindcss.json +25 -0
- package/data/manifest.json +339 -152
- package/data/onTypeFormatting/angular.json +14 -0
- package/data/onTypeFormatting/nestjs.json +16 -0
- package/data/onTypeFormatting/nextjs.json +17 -0
- package/data/onTypeFormatting/react.json +127 -0
- package/data/onTypeFormatting/shadcn.json +54 -0
- package/data/onTypeFormatting/shell.json +72 -68
- package/data/rangeSemanticTokens/angular.json +140 -0
- package/data/rangeSemanticTokens/nestjs.json +27 -0
- package/data/rangeSemanticTokens/nextjs.json +28 -0
- package/data/rangeSemanticTokens/react.json +216 -0
- package/data/rangeSemanticTokens/shadcn.json +140 -0
- package/data/rangeSemanticTokens/shell.json +247 -69
- package/data/rangeSemanticTokens/tailwindcss.json +99 -8
- package/data/references/angular.json +26 -0
- package/data/references/nestjs.json +24 -0
- package/data/references/nextjs.json +178 -0
- package/data/references/react.json +192 -0
- package/data/references/shadcn.json +101 -0
- package/data/references/shell.json +323 -92
- package/data/references/tailwindcss.json +66 -0
- package/data/rename/angular.json +131 -0
- package/data/rename/nestjs.json +32 -0
- package/data/rename/nextjs.json +31 -0
- package/data/rename/react.json +88 -0
- package/data/rename/shadcn.json +79 -0
- package/data/rename/shell.json +101 -31
- package/data/selectionRange/angular.json +95 -0
- package/data/selectionRange/nestjs.json +21 -0
- package/data/selectionRange/nextjs.json +22 -0
- package/data/selectionRange/react.json +87 -0
- package/data/selectionRange/shadcn.json +89 -0
- package/data/selectionRange/shell.json +65 -35
- package/data/semanticTokens/angular.json +198 -0
- package/data/semanticTokens/nestjs.json +35 -0
- package/data/semanticTokens/nextjs.json +38 -0
- package/data/semanticTokens/react.json +215 -0
- package/data/semanticTokens/shadcn.json +180 -0
- package/data/semanticTokens/shell.json +238 -65
- package/data/signatureHelp/angular.json +182 -0
- package/data/signatureHelp/nestjs.json +128 -0
- package/data/signatureHelp/nextjs.json +127 -0
- package/data/signatureHelp/react.json +281 -0
- package/data/signatureHelp/shadcn.json +237 -0
- package/data/signatureHelp/shell.json +797 -104
- package/data/typeDefinition/angular.json +362 -0
- package/data/typeDefinition/nestjs.json +334 -0
- package/data/typeDefinition/nextjs.json +285 -0
- package/data/typeDefinition/react.json +236 -0
- package/data/typeDefinition/shadcn.json +292 -0
- package/data/typeDefinition/shell.json +104 -40
- package/package.json +1 -1
- package/data/codeActions/bash.json +0 -169
- package/data/codeActions/zsh.json +0 -49
- package/data/codeLens/bash.json +0 -75
- package/data/codeLens/zsh.json +0 -19
- package/data/color/bash.json +0 -100
- package/data/color/zsh.json +0 -80
- package/data/commands/bash.json +0 -102
- package/data/commands/zsh.json +0 -166
- package/data/completion/bash.json +0 -1184
- package/data/completion/zsh.json +0 -973
- package/data/declaration/bash.json +0 -301
- package/data/declaration/zsh.json +0 -205
- package/data/definition/bash.json +0 -565
- package/data/definition/zsh.json +0 -350
- package/data/documentHighlight/bash.json +0 -393
- package/data/documentHighlight/zsh.json +0 -266
- package/data/documentRangeFormatting/bash.json +0 -41
- package/data/documentRangeFormatting/zsh.json +0 -59
- package/data/documentSymbol/bash.json +0 -124
- package/data/documentSymbol/zsh.json +0 -26
- package/data/foldingRange/bash.json +0 -76
- package/data/foldingRange/zsh.json +0 -46
- package/data/formatting/bash.json +0 -88
- package/data/formatting/zsh.json +0 -28
- package/data/hover/bash.json +0 -579
- package/data/hover/zsh.json +0 -96
- package/data/implementation/bash.json +0 -44
- package/data/implementation/zsh.json +0 -41
- package/data/inlayHints/bash.json +0 -207
- package/data/inlayHints/zsh.json +0 -43
- package/data/inlineCompletions/bash.json +0 -155
- package/data/inlineCompletions/zsh.json +0 -17
- package/data/linkedEditingRange/bash.json +0 -25
- package/data/linkedEditingRange/zsh.json +0 -25
- package/data/links/bash.json +0 -56
- package/data/links/zsh.json +0 -15
- package/data/onTypeFormatting/bash.json +0 -68
- package/data/onTypeFormatting/zsh.json +0 -68
- package/data/rangeSemanticTokens/bash.json +0 -90
- package/data/rangeSemanticTokens/zsh.json +0 -76
- package/data/references/bash.json +0 -221
- package/data/references/zsh.json +0 -166
- package/data/rename/bash.json +0 -37
- package/data/rename/zsh.json +0 -31
- package/data/selectionRange/bash.json +0 -35
- package/data/selectionRange/zsh.json +0 -35
- package/data/semanticTokens/bash.json +0 -71
- package/data/semanticTokens/zsh.json +0 -71
- package/data/signatureHelp/bash.json +0 -111
- package/data/signatureHelp/zsh.json +0 -118
- package/data/typeDefinition/bash.json +0 -95
- 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
|
+
}
|