@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,1490 @@
1
+ {
2
+ "language": "angular",
3
+ "completions": [
4
+ {
5
+ "label": "ng-component-class",
6
+ "kind": 28,
7
+ "detail": "Angular Component Class",
8
+ "documentation": { "value": "Creates a standalone Angular component with template, styles, and lifecycle hook." },
9
+ "insertText": "import { Component, OnInit } from '@angular/core';\n\n@Component({\n selector: '${1:app-example}',\n standalone: true,\n imports: [],\n template: `\n <div>\n <h1>{{ title }}</h1>\n </div>\n `,\n styles: []\n})\nexport class ${2:Example}Component implements OnInit {\n title = '${3:Hello}';\n\n ngOnInit(): void {\n ${0}\n }\n}",
10
+ "insertTextRules": 4,
11
+ "sortText": "00_ng-component-class"
12
+ },
13
+ {
14
+ "label": "ng-service-class",
15
+ "kind": 28,
16
+ "detail": "Angular Injectable Service",
17
+ "documentation": { "value": "Creates an Angular injectable service with root provider." },
18
+ "insertText": "import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ${1:Example}Service {\n constructor() {}\n\n ${0}\n}",
19
+ "insertTextRules": 4,
20
+ "sortText": "00_ng-service-class"
21
+ },
22
+ {
23
+ "label": "ng-directive-class",
24
+ "kind": 28,
25
+ "detail": "Angular Directive",
26
+ "documentation": { "value": "Creates a standalone Angular directive." },
27
+ "insertText": "import { Directive, ElementRef, OnInit } from '@angular/core';\n\n@Directive({\n selector: '[${1:appHighlight}]',\n standalone: true\n})\nexport class ${2:Highlight}Directive implements OnInit {\n constructor(private el: ElementRef) {}\n\n ngOnInit(): void {\n ${0}\n }\n}",
28
+ "insertTextRules": 4,
29
+ "sortText": "00_ng-directive-class"
30
+ },
31
+ {
32
+ "label": "ng-pipe-class",
33
+ "kind": 28,
34
+ "detail": "Angular Pipe",
35
+ "documentation": { "value": "Creates a standalone Angular pipe with transform method." },
36
+ "insertText": "import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: '${1:example}',\n standalone: true\n})\nexport class ${2:Example}Pipe implements PipeTransform {\n transform(value: ${3:unknown}, ...args: unknown[]): ${4:unknown} {\n ${0}\n return value;\n }\n}",
37
+ "insertTextRules": 4,
38
+ "sortText": "00_ng-pipe-class"
39
+ },
40
+ {
41
+ "label": "ng-guard-fn",
42
+ "kind": 28,
43
+ "detail": "Angular Functional Guard",
44
+ "documentation": { "value": "Creates an Angular functional route guard using CanActivateFn." },
45
+ "insertText": "import { CanActivateFn } from '@angular/router';\nimport { inject } from '@angular/core';\n\nexport const ${1:auth}Guard: CanActivateFn = (route, state) => {\n ${0}\n return true;\n};",
46
+ "insertTextRules": 4,
47
+ "sortText": "00_ng-guard-fn"
48
+ },
49
+ {
50
+ "label": "ng-interceptor-fn",
51
+ "kind": 28,
52
+ "detail": "Angular Functional Interceptor",
53
+ "documentation": { "value": "Creates an Angular functional HTTP interceptor." },
54
+ "insertText": "import { HttpInterceptorFn } from '@angular/common/http';\n\nexport const ${1:auth}Interceptor: HttpInterceptorFn = (req, next) => {\n const modifiedReq = req.clone({\n setHeaders: {\n Authorization: `Bearer ${2:\\${token\\}}`\n }\n });\n return next(modifiedReq);\n};",
55
+ "insertTextRules": 4,
56
+ "sortText": "00_ng-interceptor-fn"
57
+ },
58
+ {
59
+ "label": "ng-module-class",
60
+ "kind": 28,
61
+ "detail": "Angular NgModule",
62
+ "documentation": { "value": "Creates an Angular NgModule with declarations, imports, providers, and exports." },
63
+ "insertText": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [${1}],\n imports: [\n CommonModule${2}\n ],\n providers: [${3}],\n exports: [${4}]\n})\nexport class ${5:Feature}Module {}",
64
+ "insertTextRules": 4,
65
+ "sortText": "00_ng-module-class"
66
+ },
67
+ {
68
+ "label": "ng-resolver-fn",
69
+ "kind": 28,
70
+ "detail": "Angular Functional Resolver",
71
+ "documentation": { "value": "Creates an Angular functional route resolver." },
72
+ "insertText": "import { ResolveFn } from '@angular/router';\nimport { inject } from '@angular/core';\n\nexport const ${1:data}Resolver: ResolveFn<${2:any}> = (route, state) => {\n ${0}\n};",
73
+ "insertTextRules": 4,
74
+ "sortText": "00_ng-resolver-fn"
75
+ },
76
+ {
77
+ "label": "ng-feature-module",
78
+ "kind": 28,
79
+ "detail": "Angular Feature Module with Routing",
80
+ "documentation": { "value": "Creates an Angular feature module with its own routing module." },
81
+ "insertText": "import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule, Routes } from '@angular/router';\n\nconst routes: Routes = [\n { path: '', component: ${1:Feature}Component }\n];\n\n@NgModule({\n declarations: [${1:Feature}Component],\n imports: [\n CommonModule,\n RouterModule.forChild(routes)\n ]\n})\nexport class ${1:Feature}Module {}",
82
+ "insertTextRules": 4,
83
+ "sortText": "00_ng-feature-module"
84
+ },
85
+ {
86
+ "label": "ng-lazy-route",
87
+ "kind": 28,
88
+ "detail": "Lazy-loaded Route Configuration",
89
+ "documentation": { "value": "Creates a lazy-loaded route using loadComponent for standalone components." },
90
+ "insertText": "{\n path: '${1:feature}',\n loadComponent: () => import('./${2:feature}/${3:feature}.component').then(m => m.${4:Feature}Component)\n}",
91
+ "insertTextRules": 4,
92
+ "sortText": "00_ng-lazy-route"
93
+ },
94
+ {
95
+ "label": "ng-signal-component",
96
+ "kind": 28,
97
+ "detail": "Signal-based Angular Component",
98
+ "documentation": { "value": "Creates an Angular component using signals for state management." },
99
+ "insertText": "import { Component, signal, computed } from '@angular/core';\n\n@Component({\n selector: '${1:app-example}',\n standalone: true,\n template: `\n <div>\n <p>Count: {{ count() }}</p>\n <p>Double: {{ doubleCount() }}</p>\n <button (click)=\"increment()\">Increment</button>\n </div>\n `\n})\nexport class ${2:Example}Component {\n count = signal(0);\n doubleCount = computed(() => this.count() * 2);\n\n increment(): void {\n this.count.update(v => v + 1);\n }\n}",
100
+ "insertTextRules": 4,
101
+ "sortText": "00_ng-signal-component"
102
+ },
103
+ {
104
+ "label": "ng-reactive-form",
105
+ "kind": 28,
106
+ "detail": "Reactive Form Component",
107
+ "documentation": { "value": "Creates an Angular component with a reactive form using FormBuilder." },
108
+ "insertText": "import { Component } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';\n\n@Component({\n selector: '${1:app-form}',\n standalone: true,\n imports: [ReactiveFormsModule],\n template: `\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit()\">\n <input formControlName=\"${2:name}\" />\n <button type=\"submit\" [disabled]=\"form.invalid\">Submit</button>\n </form>\n `\n})\nexport class ${3:Form}Component {\n form: FormGroup;\n\n constructor(private fb: FormBuilder) {\n this.form = this.fb.group({\n ${2:name}: ['', Validators.required]\n });\n }\n\n onSubmit(): void {\n if (this.form.valid) {\n console.log(this.form.value);\n }\n }\n}",
109
+ "insertTextRules": 4,
110
+ "sortText": "00_ng-reactive-form"
111
+ },
112
+ {
113
+ "label": "ng-template-form",
114
+ "kind": 28,
115
+ "detail": "Template-driven Form Component",
116
+ "documentation": { "value": "Creates an Angular component with a template-driven form using ngModel." },
117
+ "insertText": "import { Component } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: '${1:app-form}',\n standalone: true,\n imports: [FormsModule],\n template: `\n <form #${2:myForm}=\"ngForm\" (ngSubmit)=\"onSubmit(${2:myForm})\">\n <input name=\"${3:field}\" [(ngModel)]=\"model.${3:field}\" required />\n <button type=\"submit\" [disabled]=\"${2:myForm}.invalid\">Submit</button>\n </form>\n `\n})\nexport class ${4:Form}Component {\n model = {\n ${3:field}: ''\n };\n\n onSubmit(form: any): void {\n if (form.valid) {\n console.log(this.model);\n }\n }\n}",
118
+ "insertTextRules": 4,
119
+ "sortText": "00_ng-template-form"
120
+ },
121
+ {
122
+ "label": "@Component",
123
+ "kind": 17,
124
+ "detail": "Component decorator",
125
+ "documentation": { "value": "Marks a class as an Angular component and supplies configuration metadata that determines how the component should be processed, instantiated, and used at runtime." },
126
+ "insertText": "@Component({\n selector: '${1:app-root}',\n standalone: true,\n imports: [${2}],\n templateUrl: './${3:app}.component.html',\n styleUrls: ['./${3:app}.component.${4:css}']\n})",
127
+ "insertTextRules": 4,
128
+ "sortText": "01_@Component"
129
+ },
130
+ {
131
+ "label": "@NgModule",
132
+ "kind": 17,
133
+ "detail": "NgModule decorator",
134
+ "documentation": { "value": "Marks a class as an NgModule and supplies configuration metadata." },
135
+ "insertText": "@NgModule({\n declarations: [${1}],\n imports: [${2}],\n providers: [${3}],\n exports: [${4}]\n})",
136
+ "insertTextRules": 4,
137
+ "sortText": "01_@NgModule"
138
+ },
139
+ {
140
+ "label": "@Injectable",
141
+ "kind": 17,
142
+ "detail": "Injectable decorator",
143
+ "documentation": { "value": "Marks a class as available to be provided and injected as a dependency." },
144
+ "insertText": "@Injectable({\n providedIn: '${1:root}'\n})",
145
+ "insertTextRules": 4,
146
+ "sortText": "01_@Injectable"
147
+ },
148
+ {
149
+ "label": "@Directive",
150
+ "kind": 17,
151
+ "detail": "Directive decorator",
152
+ "documentation": { "value": "Marks a class as an Angular directive and provides configuration metadata." },
153
+ "insertText": "@Directive({\n selector: '[${1:appDirective}]',\n standalone: true\n})",
154
+ "insertTextRules": 4,
155
+ "sortText": "01_@Directive"
156
+ },
157
+ {
158
+ "label": "@Pipe",
159
+ "kind": 17,
160
+ "detail": "Pipe decorator",
161
+ "documentation": { "value": "Marks a class as an Angular pipe and supplies configuration metadata." },
162
+ "insertText": "@Pipe({\n name: '${1:pipeName}',\n standalone: true\n})",
163
+ "insertTextRules": 4,
164
+ "sortText": "01_@Pipe"
165
+ },
166
+ {
167
+ "label": "@Input",
168
+ "kind": 17,
169
+ "detail": "Input decorator",
170
+ "documentation": { "value": "Marks a class field as an input property. The input property is bound to a DOM property in the template." },
171
+ "insertText": "@Input() ${1:propertyName}: ${2:string};",
172
+ "insertTextRules": 4,
173
+ "sortText": "01_@Input"
174
+ },
175
+ {
176
+ "label": "@Output",
177
+ "kind": 17,
178
+ "detail": "Output decorator",
179
+ "documentation": { "value": "Marks a class field as an output property and supplies configuration metadata." },
180
+ "insertText": "@Output() ${1:eventName} = new EventEmitter<${2:void}>();",
181
+ "insertTextRules": 4,
182
+ "sortText": "01_@Output"
183
+ },
184
+ {
185
+ "label": "@ViewChild",
186
+ "kind": 17,
187
+ "detail": "ViewChild decorator",
188
+ "documentation": { "value": "Configures a view query. The change detector looks for the first element or directive matching the selector in the view DOM." },
189
+ "insertText": "@ViewChild(${1:selector}) ${2:name}!: ${3:ElementRef};",
190
+ "insertTextRules": 4,
191
+ "sortText": "01_@ViewChild"
192
+ },
193
+ {
194
+ "label": "@ViewChildren",
195
+ "kind": 17,
196
+ "detail": "ViewChildren decorator",
197
+ "documentation": { "value": "Configures a view query. The change detector looks for all elements or directives matching the selector in the view DOM." },
198
+ "insertText": "@ViewChildren(${1:selector}) ${2:items}!: QueryList<${3:ElementRef}>;",
199
+ "insertTextRules": 4,
200
+ "sortText": "01_@ViewChildren"
201
+ },
202
+ {
203
+ "label": "@ContentChild",
204
+ "kind": 17,
205
+ "detail": "ContentChild decorator",
206
+ "documentation": { "value": "Configures a content query. The change detector looks for the first element or directive matching the selector in the content DOM." },
207
+ "insertText": "@ContentChild(${1:selector}) ${2:name}!: ${3:ElementRef};",
208
+ "insertTextRules": 4,
209
+ "sortText": "01_@ContentChild"
210
+ },
211
+ {
212
+ "label": "@ContentChildren",
213
+ "kind": 17,
214
+ "detail": "ContentChildren decorator",
215
+ "documentation": { "value": "Configures a content query. The change detector looks for all elements or directives matching the selector in the content DOM." },
216
+ "insertText": "@ContentChildren(${1:selector}) ${2:items}!: QueryList<${3:ElementRef}>;",
217
+ "insertTextRules": 4,
218
+ "sortText": "01_@ContentChildren"
219
+ },
220
+ {
221
+ "label": "@HostBinding",
222
+ "kind": 17,
223
+ "detail": "HostBinding decorator",
224
+ "documentation": { "value": "Marks a DOM property or element attribute as a host-binding property and supplies configuration metadata." },
225
+ "insertText": "@HostBinding('${1:class.active}') ${2:isActive} = ${3:false};",
226
+ "insertTextRules": 4,
227
+ "sortText": "01_@HostBinding"
228
+ },
229
+ {
230
+ "label": "@HostListener",
231
+ "kind": 17,
232
+ "detail": "HostListener decorator",
233
+ "documentation": { "value": "Declares a host listener. Angular will invoke the decorated method when the host element emits the specified event." },
234
+ "insertText": "@HostListener('${1:click}', ['$event'])\non${2:Click}(event: ${3:Event}): void {\n ${0}\n}",
235
+ "insertTextRules": 4,
236
+ "sortText": "01_@HostListener"
237
+ },
238
+ {
239
+ "label": "@Inject",
240
+ "kind": 17,
241
+ "detail": "Inject decorator",
242
+ "documentation": { "value": "Specifies a custom provider of a dependency using an injection token." },
243
+ "insertText": "@Inject(${1:TOKEN}) ${2:name}: ${3:type}",
244
+ "insertTextRules": 4,
245
+ "sortText": "01_@Inject"
246
+ },
247
+ {
248
+ "label": "@Optional",
249
+ "kind": 17,
250
+ "detail": "Optional decorator",
251
+ "documentation": { "value": "Marks a dependency as optional. The injector provides null if the dependency is not found." },
252
+ "insertText": "@Optional()",
253
+ "insertTextRules": 4,
254
+ "sortText": "01_@Optional"
255
+ },
256
+ {
257
+ "label": "@Self",
258
+ "kind": 17,
259
+ "detail": "Self decorator",
260
+ "documentation": { "value": "Instructs the DI framework to resolve a dependency only from the local injector." },
261
+ "insertText": "@Self()",
262
+ "insertTextRules": 4,
263
+ "sortText": "01_@Self"
264
+ },
265
+ {
266
+ "label": "@SkipSelf",
267
+ "kind": 17,
268
+ "detail": "SkipSelf decorator",
269
+ "documentation": { "value": "Instructs the DI framework to resolve a dependency starting from the parent injector." },
270
+ "insertText": "@SkipSelf()",
271
+ "insertTextRules": 4,
272
+ "sortText": "01_@SkipSelf"
273
+ },
274
+ {
275
+ "label": "@Host",
276
+ "kind": 17,
277
+ "detail": "Host decorator",
278
+ "documentation": { "value": "Instructs the DI framework to resolve a dependency by checking the host element's injector." },
279
+ "insertText": "@Host()",
280
+ "insertTextRules": 4,
281
+ "sortText": "01_@Host"
282
+ },
283
+ {
284
+ "label": "Component",
285
+ "kind": 5,
286
+ "detail": "Angular Component class/decorator",
287
+ "documentation": { "value": "Decorator that marks a class as an Angular component with template, styles, and metadata." },
288
+ "insertText": "Component",
289
+ "insertTextRules": 4,
290
+ "sortText": "02_Component"
291
+ },
292
+ {
293
+ "label": "OnInit",
294
+ "kind": 7,
295
+ "detail": "Lifecycle hook interface",
296
+ "documentation": { "value": "Interface for the ngOnInit lifecycle hook. Called once after the first ngOnChanges." },
297
+ "insertText": "OnInit",
298
+ "insertTextRules": 4,
299
+ "sortText": "02_OnInit"
300
+ },
301
+ {
302
+ "label": "OnDestroy",
303
+ "kind": 7,
304
+ "detail": "Lifecycle hook interface",
305
+ "documentation": { "value": "Interface for the ngOnDestroy lifecycle hook. Called once when the directive is destroyed." },
306
+ "insertText": "OnDestroy",
307
+ "insertTextRules": 4,
308
+ "sortText": "02_OnDestroy"
309
+ },
310
+ {
311
+ "label": "OnChanges",
312
+ "kind": 7,
313
+ "detail": "Lifecycle hook interface",
314
+ "documentation": { "value": "Interface for the ngOnChanges lifecycle hook. Called when any data-bound input property changes." },
315
+ "insertText": "OnChanges",
316
+ "insertTextRules": 4,
317
+ "sortText": "02_OnChanges"
318
+ },
319
+ {
320
+ "label": "AfterViewInit",
321
+ "kind": 7,
322
+ "detail": "Lifecycle hook interface",
323
+ "documentation": { "value": "Interface for the ngAfterViewInit lifecycle hook. Called after the component's view has been fully initialized." },
324
+ "insertText": "AfterViewInit",
325
+ "insertTextRules": 4,
326
+ "sortText": "02_AfterViewInit"
327
+ },
328
+ {
329
+ "label": "AfterContentInit",
330
+ "kind": 7,
331
+ "detail": "Lifecycle hook interface",
332
+ "documentation": { "value": "Interface for the ngAfterContentInit lifecycle hook. Called after content has been projected into the component." },
333
+ "insertText": "AfterContentInit",
334
+ "insertTextRules": 4,
335
+ "sortText": "02_AfterContentInit"
336
+ },
337
+ {
338
+ "label": "DoCheck",
339
+ "kind": 7,
340
+ "detail": "Lifecycle hook interface",
341
+ "documentation": { "value": "Interface for the ngDoCheck lifecycle hook. Called during every change detection run." },
342
+ "insertText": "DoCheck",
343
+ "insertTextRules": 4,
344
+ "sortText": "02_DoCheck"
345
+ },
346
+ {
347
+ "label": "AfterViewChecked",
348
+ "kind": 7,
349
+ "detail": "Lifecycle hook interface",
350
+ "documentation": { "value": "Interface for the ngAfterViewChecked lifecycle hook. Called after every check of the component's view." },
351
+ "insertText": "AfterViewChecked",
352
+ "insertTextRules": 4,
353
+ "sortText": "02_AfterViewChecked"
354
+ },
355
+ {
356
+ "label": "AfterContentChecked",
357
+ "kind": 7,
358
+ "detail": "Lifecycle hook interface",
359
+ "documentation": { "value": "Interface for the ngAfterContentChecked lifecycle hook. Called after every check of projected content." },
360
+ "insertText": "AfterContentChecked",
361
+ "insertTextRules": 4,
362
+ "sortText": "02_AfterContentChecked"
363
+ },
364
+ {
365
+ "label": "NgModule",
366
+ "kind": 5,
367
+ "detail": "Angular module decorator/class",
368
+ "documentation": { "value": "Decorator that marks a class as an NgModule and supplies configuration metadata." },
369
+ "insertText": "NgModule",
370
+ "insertTextRules": 4,
371
+ "sortText": "02_NgModule"
372
+ },
373
+ {
374
+ "label": "Injectable",
375
+ "kind": 5,
376
+ "detail": "Injectable decorator/class",
377
+ "documentation": { "value": "Decorator that marks a class as available to be provided and injected as a dependency." },
378
+ "insertText": "Injectable",
379
+ "insertTextRules": 4,
380
+ "sortText": "02_Injectable"
381
+ },
382
+ {
383
+ "label": "Directive",
384
+ "kind": 5,
385
+ "detail": "Angular directive decorator/class",
386
+ "documentation": { "value": "Decorator that marks a class as an Angular directive." },
387
+ "insertText": "Directive",
388
+ "insertTextRules": 4,
389
+ "sortText": "02_Directive"
390
+ },
391
+ {
392
+ "label": "Pipe",
393
+ "kind": 5,
394
+ "detail": "Angular pipe decorator/class",
395
+ "documentation": { "value": "Decorator that marks a class as a pipe and supplies configuration metadata." },
396
+ "insertText": "Pipe",
397
+ "insertTextRules": 4,
398
+ "sortText": "02_Pipe"
399
+ },
400
+ {
401
+ "label": "EventEmitter",
402
+ "kind": 5,
403
+ "detail": "Angular EventEmitter class",
404
+ "documentation": { "value": "Use in directives and components to emit custom events synchronously or asynchronously." },
405
+ "insertText": "EventEmitter",
406
+ "insertTextRules": 4,
407
+ "sortText": "02_EventEmitter"
408
+ },
409
+ {
410
+ "label": "ChangeDetectionStrategy",
411
+ "kind": 8,
412
+ "detail": "Change detection enum",
413
+ "documentation": { "value": "Defines the strategy that the default change detector uses. OnPush means the change detector runs only when inputs change or events fire." },
414
+ "insertText": "ChangeDetectionStrategy",
415
+ "insertTextRules": 4,
416
+ "sortText": "02_ChangeDetectionStrategy"
417
+ },
418
+ {
419
+ "label": "ChangeDetectionStrategy.OnPush",
420
+ "kind": 14,
421
+ "detail": "OnPush change detection",
422
+ "documentation": { "value": "Sets the change detection strategy to OnPush, improving performance by only checking when inputs change." },
423
+ "insertText": "ChangeDetectionStrategy.OnPush",
424
+ "insertTextRules": 4,
425
+ "sortText": "02_ChangeDetectionStrategy.OnPush"
426
+ },
427
+ {
428
+ "label": "ViewEncapsulation",
429
+ "kind": 8,
430
+ "detail": "View encapsulation enum",
431
+ "documentation": { "value": "Defines the template and style encapsulation options available for a component." },
432
+ "insertText": "ViewEncapsulation",
433
+ "insertTextRules": 4,
434
+ "sortText": "02_ViewEncapsulation"
435
+ },
436
+ {
437
+ "label": "ChangeDetectorRef",
438
+ "kind": 5,
439
+ "detail": "Change detector reference",
440
+ "documentation": { "value": "Base class that provides change detection functionality. A change-detection tree collects all views that are to be checked for changes." },
441
+ "insertText": "ChangeDetectorRef",
442
+ "insertTextRules": 4,
443
+ "sortText": "02_ChangeDetectorRef"
444
+ },
445
+ {
446
+ "label": "ElementRef",
447
+ "kind": 5,
448
+ "detail": "Wrapper around a native element",
449
+ "documentation": { "value": "A wrapper around a native element inside a View. Use with caution as direct DOM access bypasses Angular's templating." },
450
+ "insertText": "ElementRef",
451
+ "insertTextRules": 4,
452
+ "sortText": "02_ElementRef"
453
+ },
454
+ {
455
+ "label": "TemplateRef",
456
+ "kind": 5,
457
+ "detail": "Embedded template reference",
458
+ "documentation": { "value": "Represents an embedded template that can be used to instantiate embedded views." },
459
+ "insertText": "TemplateRef",
460
+ "insertTextRules": 4,
461
+ "sortText": "02_TemplateRef"
462
+ },
463
+ {
464
+ "label": "ViewContainerRef",
465
+ "kind": 5,
466
+ "detail": "View container reference",
467
+ "documentation": { "value": "Represents a container where one or more views can be attached to a component." },
468
+ "insertText": "ViewContainerRef",
469
+ "insertTextRules": 4,
470
+ "sortText": "02_ViewContainerRef"
471
+ },
472
+ {
473
+ "label": "Renderer2",
474
+ "kind": 5,
475
+ "detail": "DOM renderer abstraction",
476
+ "documentation": { "value": "Extend this base class to implement custom rendering. Provides a safe way to manipulate DOM elements." },
477
+ "insertText": "Renderer2",
478
+ "insertTextRules": 4,
479
+ "sortText": "02_Renderer2"
480
+ },
481
+ {
482
+ "label": "NgZone",
483
+ "kind": 5,
484
+ "detail": "Angular zone service",
485
+ "documentation": { "value": "An injectable service for executing work inside or outside of the Angular zone. Optimizes change detection." },
486
+ "insertText": "NgZone",
487
+ "insertTextRules": 4,
488
+ "sortText": "02_NgZone"
489
+ },
490
+ {
491
+ "label": "Injector",
492
+ "kind": 5,
493
+ "detail": "Dependency injector",
494
+ "documentation": { "value": "Concrete injectors implement this interface. The Injector is responsible for retrieving instances of dependencies." },
495
+ "insertText": "Injector",
496
+ "insertTextRules": 4,
497
+ "sortText": "02_Injector"
498
+ },
499
+ {
500
+ "label": "DestroyRef",
501
+ "kind": 5,
502
+ "detail": "Destroy lifecycle reference",
503
+ "documentation": { "value": "Allows registering cleanup callbacks that are invoked when the associated context is destroyed." },
504
+ "insertText": "DestroyRef",
505
+ "insertTextRules": 4,
506
+ "sortText": "02_DestroyRef"
507
+ },
508
+ {
509
+ "label": "inject",
510
+ "kind": 1,
511
+ "detail": "Inject function",
512
+ "documentation": { "value": "Injects a token from the currently active injector. Must be used in an injection context." },
513
+ "insertText": "inject(${1:token})",
514
+ "insertTextRules": 4,
515
+ "sortText": "02_inject"
516
+ },
517
+ {
518
+ "label": "PipeTransform",
519
+ "kind": 7,
520
+ "detail": "Pipe transform interface",
521
+ "documentation": { "value": "Interface that all pipes must implement. Defines a transform method." },
522
+ "insertText": "PipeTransform",
523
+ "insertTextRules": 4,
524
+ "sortText": "02_PipeTransform"
525
+ },
526
+ {
527
+ "label": "QueryList",
528
+ "kind": 5,
529
+ "detail": "Live query list",
530
+ "documentation": { "value": "An unmodifiable list of items that Angular keeps up to date when the state of the application changes." },
531
+ "insertText": "QueryList",
532
+ "insertTextRules": 4,
533
+ "sortText": "02_QueryList"
534
+ },
535
+ {
536
+ "label": "SimpleChanges",
537
+ "kind": 7,
538
+ "detail": "Input changes hash",
539
+ "documentation": { "value": "A hashtable of changes represented by SimpleChange objects stored at the declared property name." },
540
+ "insertText": "SimpleChanges",
541
+ "insertTextRules": 4,
542
+ "sortText": "02_SimpleChanges"
543
+ },
544
+ {
545
+ "label": "InjectionToken",
546
+ "kind": 5,
547
+ "detail": "DI token class",
548
+ "documentation": { "value": "Creates a token that can be used in a DI Provider. Use an InjectionToken whenever the type is not sufficient to identify a dependency." },
549
+ "insertText": "new InjectionToken<${1:Type}>('${2:description}')",
550
+ "insertTextRules": 4,
551
+ "sortText": "02_InjectionToken"
552
+ },
553
+ {
554
+ "label": "signal",
555
+ "kind": 1,
556
+ "detail": "Create a writable signal",
557
+ "documentation": { "value": "Creates a writable signal with an initial value. Signals are reactive primitives that notify consumers when they change." },
558
+ "insertText": "signal<${1:Type}>(${2:initialValue})",
559
+ "insertTextRules": 4,
560
+ "sortText": "03_signal"
561
+ },
562
+ {
563
+ "label": "computed",
564
+ "kind": 1,
565
+ "detail": "Create a computed signal",
566
+ "documentation": { "value": "Creates a memoized signal which derives its value from other signals. Re-evaluates only when dependencies change." },
567
+ "insertText": "computed(() => ${1:expression})",
568
+ "insertTextRules": 4,
569
+ "sortText": "03_computed"
570
+ },
571
+ {
572
+ "label": "effect",
573
+ "kind": 1,
574
+ "detail": "Create a signal effect",
575
+ "documentation": { "value": "Creates an effect that runs a side-effectful function whenever one of the signals it reads changes." },
576
+ "insertText": "effect(() => {\n ${0}\n})",
577
+ "insertTextRules": 4,
578
+ "sortText": "03_effect"
579
+ },
580
+ {
581
+ "label": "input",
582
+ "kind": 1,
583
+ "detail": "Signal-based input",
584
+ "documentation": { "value": "Declares a signal-based input property. Alternative to @Input decorator with signal semantics." },
585
+ "insertText": "input<${1:Type}>(${2})",
586
+ "insertTextRules": 4,
587
+ "sortText": "03_input"
588
+ },
589
+ {
590
+ "label": "input.required",
591
+ "kind": 1,
592
+ "detail": "Required signal-based input",
593
+ "documentation": { "value": "Declares a required signal-based input property. The parent must provide a value." },
594
+ "insertText": "input.required<${1:Type}>()",
595
+ "insertTextRules": 4,
596
+ "sortText": "03_input.required"
597
+ },
598
+ {
599
+ "label": "output",
600
+ "kind": 1,
601
+ "detail": "Signal-based output",
602
+ "documentation": { "value": "Declares a signal-based output property. Alternative to @Output decorator." },
603
+ "insertText": "output<${1:Type}>()",
604
+ "insertTextRules": 4,
605
+ "sortText": "03_output"
606
+ },
607
+ {
608
+ "label": "model",
609
+ "kind": 1,
610
+ "detail": "Signal-based two-way binding",
611
+ "documentation": { "value": "Creates a model signal for two-way data binding. Combines input and output in a single API." },
612
+ "insertText": "model<${1:Type}>(${2:initialValue})",
613
+ "insertTextRules": 4,
614
+ "sortText": "03_model"
615
+ },
616
+ {
617
+ "label": "model.required",
618
+ "kind": 1,
619
+ "detail": "Required model signal",
620
+ "documentation": { "value": "Creates a required model signal for two-way data binding." },
621
+ "insertText": "model.required<${1:Type}>()",
622
+ "insertTextRules": 4,
623
+ "sortText": "03_model.required"
624
+ },
625
+ {
626
+ "label": "viewChild",
627
+ "kind": 1,
628
+ "detail": "Signal-based view child query",
629
+ "documentation": { "value": "Signal-based alternative to @ViewChild. Returns a signal that updates when the queried element changes." },
630
+ "insertText": "viewChild<${1:ElementRef}>('${2:ref}')",
631
+ "insertTextRules": 4,
632
+ "sortText": "03_viewChild"
633
+ },
634
+ {
635
+ "label": "viewChild.required",
636
+ "kind": 1,
637
+ "detail": "Required signal-based view child",
638
+ "documentation": { "value": "Signal-based required view child query. Throws if the element is not found." },
639
+ "insertText": "viewChild.required<${1:ElementRef}>('${2:ref}')",
640
+ "insertTextRules": 4,
641
+ "sortText": "03_viewChild.required"
642
+ },
643
+ {
644
+ "label": "viewChildren",
645
+ "kind": 1,
646
+ "detail": "Signal-based view children query",
647
+ "documentation": { "value": "Signal-based alternative to @ViewChildren. Returns a signal with a list of matching elements." },
648
+ "insertText": "viewChildren<${1:ElementRef}>('${2:ref}')",
649
+ "insertTextRules": 4,
650
+ "sortText": "03_viewChildren"
651
+ },
652
+ {
653
+ "label": "contentChild",
654
+ "kind": 1,
655
+ "detail": "Signal-based content child query",
656
+ "documentation": { "value": "Signal-based alternative to @ContentChild. Queries projected content." },
657
+ "insertText": "contentChild<${1:ElementRef}>('${2:ref}')",
658
+ "insertTextRules": 4,
659
+ "sortText": "03_contentChild"
660
+ },
661
+ {
662
+ "label": "contentChildren",
663
+ "kind": 1,
664
+ "detail": "Signal-based content children query",
665
+ "documentation": { "value": "Signal-based alternative to @ContentChildren. Queries all matching projected content." },
666
+ "insertText": "contentChildren<${1:ElementRef}>('${2:ref}')",
667
+ "insertTextRules": 4,
668
+ "sortText": "03_contentChildren"
669
+ },
670
+ {
671
+ "label": "linkedSignal",
672
+ "kind": 1,
673
+ "detail": "Create a linked signal",
674
+ "documentation": { "value": "Creates a writable signal that resets to a computed value whenever a source signal changes." },
675
+ "insertText": "linkedSignal(() => ${1:expression})",
676
+ "insertTextRules": 4,
677
+ "sortText": "03_linkedSignal"
678
+ },
679
+ {
680
+ "label": "resource",
681
+ "kind": 1,
682
+ "detail": "Create an async resource",
683
+ "documentation": { "value": "Creates a resource that loads data asynchronously based on a reactive request signal." },
684
+ "insertText": "resource({\n request: () => ${1:params},\n loader: async ({ request }) => {\n ${0}\n }\n})",
685
+ "insertTextRules": 4,
686
+ "sortText": "03_resource"
687
+ },
688
+ {
689
+ "label": "toSignal",
690
+ "kind": 1,
691
+ "detail": "Convert Observable to Signal",
692
+ "documentation": { "value": "Converts an Observable to a signal. Values emitted by the Observable update the signal." },
693
+ "insertText": "toSignal(${1:observable$})",
694
+ "insertTextRules": 4,
695
+ "sortText": "03_toSignal"
696
+ },
697
+ {
698
+ "label": "toObservable",
699
+ "kind": 1,
700
+ "detail": "Convert Signal to Observable",
701
+ "documentation": { "value": "Converts a signal to an Observable that emits whenever the signal value changes." },
702
+ "insertText": "toObservable(${1:signal})",
703
+ "insertTextRules": 4,
704
+ "sortText": "03_toObservable"
705
+ },
706
+ {
707
+ "label": "@if",
708
+ "kind": 17,
709
+ "detail": "Built-in control flow: if",
710
+ "documentation": { "value": "New built-in control flow for conditional rendering. Replaces *ngIf." },
711
+ "insertText": "@if (${1:condition}) {\n ${0}\n}",
712
+ "insertTextRules": 4,
713
+ "sortText": "03_@if"
714
+ },
715
+ {
716
+ "label": "@if-else",
717
+ "kind": 17,
718
+ "detail": "Built-in control flow: if/else",
719
+ "documentation": { "value": "Conditional rendering with else branch." },
720
+ "insertText": "@if (${1:condition}) {\n ${2}\n} @else {\n ${0}\n}",
721
+ "insertTextRules": 4,
722
+ "sortText": "03_@if-else"
723
+ },
724
+ {
725
+ "label": "@for",
726
+ "kind": 17,
727
+ "detail": "Built-in control flow: for",
728
+ "documentation": { "value": "New built-in control flow for repeating elements. Replaces *ngFor. Requires a track expression." },
729
+ "insertText": "@for (${1:item} of ${2:items}; track ${3:$index}) {\n ${0}\n} @empty {\n <p>No items</p>\n}",
730
+ "insertTextRules": 4,
731
+ "sortText": "03_@for"
732
+ },
733
+ {
734
+ "label": "@switch",
735
+ "kind": 17,
736
+ "detail": "Built-in control flow: switch",
737
+ "documentation": { "value": "New built-in control flow for switch/case rendering. Replaces ngSwitch." },
738
+ "insertText": "@switch (${1:expression}) {\n @case (${2:value1}) {\n ${3}\n }\n @default {\n ${0}\n }\n}",
739
+ "insertTextRules": 4,
740
+ "sortText": "03_@switch"
741
+ },
742
+ {
743
+ "label": "@defer",
744
+ "kind": 17,
745
+ "detail": "Built-in deferrable views",
746
+ "documentation": { "value": "Defers loading of a section of the template until a trigger condition is met. Supports lazy loading." },
747
+ "insertText": "@defer (on ${1:viewport}) {\n ${2}\n} @loading {\n <p>Loading...</p>\n} @placeholder {\n <p>${3:Placeholder}</p>\n} @error {\n <p>Error loading content</p>\n}",
748
+ "insertTextRules": 4,
749
+ "sortText": "03_@defer"
750
+ },
751
+ {
752
+ "label": "@let",
753
+ "kind": 17,
754
+ "detail": "Built-in template variable",
755
+ "documentation": { "value": "Declares a local template variable. Useful for caching complex expressions." },
756
+ "insertText": "@let ${1:name} = ${2:expression};",
757
+ "insertTextRules": 4,
758
+ "sortText": "03_@let"
759
+ },
760
+ {
761
+ "label": "FormControl",
762
+ "kind": 5,
763
+ "detail": "Reactive form control",
764
+ "documentation": { "value": "Tracks the value and validation status of an individual form control." },
765
+ "insertText": "new FormControl(${1:''}, ${2:Validators.required})",
766
+ "insertTextRules": 4,
767
+ "sortText": "02_FormControl"
768
+ },
769
+ {
770
+ "label": "FormGroup",
771
+ "kind": 5,
772
+ "detail": "Reactive form group",
773
+ "documentation": { "value": "Tracks the value and validity state of a group of FormControl instances." },
774
+ "insertText": "new FormGroup({\n ${1:field}: new FormControl(${2:''})\n})",
775
+ "insertTextRules": 4,
776
+ "sortText": "02_FormGroup"
777
+ },
778
+ {
779
+ "label": "FormBuilder",
780
+ "kind": 5,
781
+ "detail": "Form builder service",
782
+ "documentation": { "value": "Creates an AbstractControl from a user-specified configuration. Reduces boilerplate for creating forms." },
783
+ "insertText": "FormBuilder",
784
+ "insertTextRules": 4,
785
+ "sortText": "02_FormBuilder"
786
+ },
787
+ {
788
+ "label": "FormArray",
789
+ "kind": 5,
790
+ "detail": "Reactive form array",
791
+ "documentation": { "value": "Tracks the value and validity state of an array of FormControl, FormGroup, or FormArray instances." },
792
+ "insertText": "new FormArray([${1}])",
793
+ "insertTextRules": 4,
794
+ "sortText": "02_FormArray"
795
+ },
796
+ {
797
+ "label": "Validators",
798
+ "kind": 5,
799
+ "detail": "Built-in validators",
800
+ "documentation": { "value": "Provides a set of built-in validators: required, minLength, maxLength, pattern, email, min, max, etc." },
801
+ "insertText": "Validators",
802
+ "insertTextRules": 4,
803
+ "sortText": "02_Validators"
804
+ },
805
+ {
806
+ "label": "Validators.required",
807
+ "kind": 9,
808
+ "detail": "Required validator",
809
+ "documentation": { "value": "Validator that requires the control to have a non-empty value." },
810
+ "insertText": "Validators.required",
811
+ "insertTextRules": 4,
812
+ "sortText": "02_Validators.required"
813
+ },
814
+ {
815
+ "label": "Validators.email",
816
+ "kind": 9,
817
+ "detail": "Email validator",
818
+ "documentation": { "value": "Validator that requires the control to have a value that passes email validation." },
819
+ "insertText": "Validators.email",
820
+ "insertTextRules": 4,
821
+ "sortText": "02_Validators.email"
822
+ },
823
+ {
824
+ "label": "Validators.minLength",
825
+ "kind": 0,
826
+ "detail": "Min length validator",
827
+ "documentation": { "value": "Validator that requires the control value to have a minimum length." },
828
+ "insertText": "Validators.minLength(${1:3})",
829
+ "insertTextRules": 4,
830
+ "sortText": "02_Validators.minLength"
831
+ },
832
+ {
833
+ "label": "Validators.maxLength",
834
+ "kind": 0,
835
+ "detail": "Max length validator",
836
+ "documentation": { "value": "Validator that requires the control value to have a maximum length." },
837
+ "insertText": "Validators.maxLength(${1:50})",
838
+ "insertTextRules": 4,
839
+ "sortText": "02_Validators.maxLength"
840
+ },
841
+ {
842
+ "label": "Validators.pattern",
843
+ "kind": 0,
844
+ "detail": "Pattern validator",
845
+ "documentation": { "value": "Validator that requires the control value to match a regex pattern." },
846
+ "insertText": "Validators.pattern('${1:regex}')",
847
+ "insertTextRules": 4,
848
+ "sortText": "02_Validators.pattern"
849
+ },
850
+ {
851
+ "label": "ReactiveFormsModule",
852
+ "kind": 8,
853
+ "detail": "Reactive forms module",
854
+ "documentation": { "value": "Module that provides the directives and providers for reactive forms: formControl, formGroup, formArrayName." },
855
+ "insertText": "ReactiveFormsModule",
856
+ "insertTextRules": 4,
857
+ "sortText": "02_ReactiveFormsModule"
858
+ },
859
+ {
860
+ "label": "FormsModule",
861
+ "kind": 8,
862
+ "detail": "Template-driven forms module",
863
+ "documentation": { "value": "Module that provides NgModel and related directives for template-driven forms." },
864
+ "insertText": "FormsModule",
865
+ "insertTextRules": 4,
866
+ "sortText": "02_FormsModule"
867
+ },
868
+ {
869
+ "label": "[(ngModel)]",
870
+ "kind": 9,
871
+ "detail": "Two-way data binding",
872
+ "documentation": { "value": "Two-way data binding using ngModel. Requires FormsModule to be imported." },
873
+ "insertText": "[(ngModel)]=\"${1:property}\"",
874
+ "insertTextRules": 4,
875
+ "sortText": "02_[(ngModel)]"
876
+ },
877
+ {
878
+ "label": "RouterModule",
879
+ "kind": 8,
880
+ "detail": "Angular router module",
881
+ "documentation": { "value": "Adds router directives and providers. Use forRoot for root module and forChild for feature modules." },
882
+ "insertText": "RouterModule",
883
+ "insertTextRules": 4,
884
+ "sortText": "02_RouterModule"
885
+ },
886
+ {
887
+ "label": "Router",
888
+ "kind": 5,
889
+ "detail": "Router service",
890
+ "documentation": { "value": "A service that provides navigation among views and URL manipulation capabilities." },
891
+ "insertText": "Router",
892
+ "insertTextRules": 4,
893
+ "sortText": "02_Router"
894
+ },
895
+ {
896
+ "label": "ActivatedRoute",
897
+ "kind": 5,
898
+ "detail": "Activated route service",
899
+ "documentation": { "value": "Provides access to information about a route associated with a component loaded in an outlet." },
900
+ "insertText": "ActivatedRoute",
901
+ "insertTextRules": 4,
902
+ "sortText": "02_ActivatedRoute"
903
+ },
904
+ {
905
+ "label": "RouterOutlet",
906
+ "kind": 5,
907
+ "detail": "Router outlet directive",
908
+ "documentation": { "value": "Acts as a placeholder that Angular dynamically fills based on the current router state." },
909
+ "insertText": "<router-outlet></router-outlet>",
910
+ "insertTextRules": 4,
911
+ "sortText": "02_RouterOutlet"
912
+ },
913
+ {
914
+ "label": "routerLink",
915
+ "kind": 9,
916
+ "detail": "Router link directive",
917
+ "documentation": { "value": "Turns user clicks into router navigations. Can be applied to anchor tags or any element." },
918
+ "insertText": "[routerLink]=\"['/${1:path}']\"",
919
+ "insertTextRules": 4,
920
+ "sortText": "02_routerLink"
921
+ },
922
+ {
923
+ "label": "RouterLink",
924
+ "kind": 5,
925
+ "detail": "RouterLink directive class",
926
+ "documentation": { "value": "Import for standalone components to use routerLink directive." },
927
+ "insertText": "RouterLink",
928
+ "insertTextRules": 4,
929
+ "sortText": "02_RouterLink"
930
+ },
931
+ {
932
+ "label": "RouterLinkActive",
933
+ "kind": 5,
934
+ "detail": "Router link active directive",
935
+ "documentation": { "value": "Tracks whether the linked route of an element is currently active and sets CSS classes." },
936
+ "insertText": "RouterLinkActive",
937
+ "insertTextRules": 4,
938
+ "sortText": "02_RouterLinkActive"
939
+ },
940
+ {
941
+ "label": "Routes",
942
+ "kind": 7,
943
+ "detail": "Route configuration type",
944
+ "documentation": { "value": "An array of Route objects used to configure the router." },
945
+ "insertText": "const routes: Routes = [\n { path: '${1}', component: ${2:Component} }\n];",
946
+ "insertTextRules": 4,
947
+ "sortText": "02_Routes"
948
+ },
949
+ {
950
+ "label": "CanActivate",
951
+ "kind": 7,
952
+ "detail": "Route guard interface",
953
+ "documentation": { "value": "Interface for a class-based guard that determines if a route can be activated." },
954
+ "insertText": "CanActivate",
955
+ "insertTextRules": 4,
956
+ "sortText": "02_CanActivate"
957
+ },
958
+ {
959
+ "label": "CanDeactivate",
960
+ "kind": 7,
961
+ "detail": "Deactivation guard interface",
962
+ "documentation": { "value": "Interface for a guard that determines if the user can navigate away from a route." },
963
+ "insertText": "CanDeactivate",
964
+ "insertTextRules": 4,
965
+ "sortText": "02_CanDeactivate"
966
+ },
967
+ {
968
+ "label": "Resolve",
969
+ "kind": 7,
970
+ "detail": "Route resolver interface",
971
+ "documentation": { "value": "Interface for a class that resolves data before a route is activated." },
972
+ "insertText": "Resolve",
973
+ "insertTextRules": 4,
974
+ "sortText": "02_Resolve"
975
+ },
976
+ {
977
+ "label": "provideRouter",
978
+ "kind": 1,
979
+ "detail": "Provide router function",
980
+ "documentation": { "value": "Sets up providers for the router. Used in standalone application configuration." },
981
+ "insertText": "provideRouter(${1:routes})",
982
+ "insertTextRules": 4,
983
+ "sortText": "02_provideRouter"
984
+ },
985
+ {
986
+ "label": "withComponentInputBinding",
987
+ "kind": 1,
988
+ "detail": "Router input binding feature",
989
+ "documentation": { "value": "Enables binding route parameters directly to component inputs." },
990
+ "insertText": "withComponentInputBinding()",
991
+ "insertTextRules": 4,
992
+ "sortText": "02_withComponentInputBinding"
993
+ },
994
+ {
995
+ "label": "HttpClient",
996
+ "kind": 5,
997
+ "detail": "HTTP client service",
998
+ "documentation": { "value": "Performs HTTP requests. Available as an injectable class with methods to perform HTTP requests." },
999
+ "insertText": "HttpClient",
1000
+ "insertTextRules": 4,
1001
+ "sortText": "02_HttpClient"
1002
+ },
1003
+ {
1004
+ "label": "HttpHeaders",
1005
+ "kind": 5,
1006
+ "detail": "HTTP headers class",
1007
+ "documentation": { "value": "Represents the header configuration options for an HTTP request. Instances are immutable." },
1008
+ "insertText": "new HttpHeaders({\n '${1:Content-Type}': '${2:application/json}'\n})",
1009
+ "insertTextRules": 4,
1010
+ "sortText": "02_HttpHeaders"
1011
+ },
1012
+ {
1013
+ "label": "HttpParams",
1014
+ "kind": 5,
1015
+ "detail": "HTTP params class",
1016
+ "documentation": { "value": "An HTTP request/response body that represents serialized parameters. Instances are immutable." },
1017
+ "insertText": "new HttpParams().set('${1:key}', '${2:value}')",
1018
+ "insertTextRules": 4,
1019
+ "sortText": "02_HttpParams"
1020
+ },
1021
+ {
1022
+ "label": "HttpInterceptor",
1023
+ "kind": 7,
1024
+ "detail": "HTTP interceptor interface",
1025
+ "documentation": { "value": "Interface for intercepting outgoing HTTP requests and incoming responses." },
1026
+ "insertText": "HttpInterceptor",
1027
+ "insertTextRules": 4,
1028
+ "sortText": "02_HttpInterceptor"
1029
+ },
1030
+ {
1031
+ "label": "provideHttpClient",
1032
+ "kind": 1,
1033
+ "detail": "Provide HTTP client",
1034
+ "documentation": { "value": "Sets up providers for HttpClient. Used in standalone application configuration." },
1035
+ "insertText": "provideHttpClient(${1})",
1036
+ "insertTextRules": 4,
1037
+ "sortText": "02_provideHttpClient"
1038
+ },
1039
+ {
1040
+ "label": "withInterceptors",
1041
+ "kind": 1,
1042
+ "detail": "HTTP interceptors feature",
1043
+ "documentation": { "value": "Configures functional HTTP interceptors for the application." },
1044
+ "insertText": "withInterceptors([${1:interceptorFn}])",
1045
+ "insertTextRules": 4,
1046
+ "sortText": "02_withInterceptors"
1047
+ },
1048
+ {
1049
+ "label": "withFetch",
1050
+ "kind": 1,
1051
+ "detail": "Use Fetch API backend",
1052
+ "documentation": { "value": "Configures HttpClient to use the Fetch API instead of XMLHttpRequest." },
1053
+ "insertText": "withFetch()",
1054
+ "insertTextRules": 4,
1055
+ "sortText": "02_withFetch"
1056
+ },
1057
+ {
1058
+ "label": "NgIf",
1059
+ "kind": 5,
1060
+ "detail": "Structural directive",
1061
+ "documentation": { "value": "A structural directive that conditionally includes a template based on the value of an expression." },
1062
+ "insertText": "*ngIf=\"${1:condition}\"",
1063
+ "insertTextRules": 4,
1064
+ "sortText": "04_NgIf"
1065
+ },
1066
+ {
1067
+ "label": "NgFor",
1068
+ "kind": 5,
1069
+ "detail": "Structural directive",
1070
+ "documentation": { "value": "A structural directive that renders a template for each item in a collection." },
1071
+ "insertText": "*ngFor=\"let ${1:item} of ${2:items}\"",
1072
+ "insertTextRules": 4,
1073
+ "sortText": "04_NgFor"
1074
+ },
1075
+ {
1076
+ "label": "NgSwitch",
1077
+ "kind": 5,
1078
+ "detail": "Structural directive",
1079
+ "documentation": { "value": "A structural directive that adds or removes templates when the host expression matches the switch expression." },
1080
+ "insertText": "[ngSwitch]=\"${1:expression}\"",
1081
+ "insertTextRules": 4,
1082
+ "sortText": "04_NgSwitch"
1083
+ },
1084
+ {
1085
+ "label": "NgClass",
1086
+ "kind": 5,
1087
+ "detail": "Attribute directive",
1088
+ "documentation": { "value": "Adds and removes CSS classes on an HTML element." },
1089
+ "insertText": "[ngClass]=\"${1:classExpression}\"",
1090
+ "insertTextRules": 4,
1091
+ "sortText": "04_NgClass"
1092
+ },
1093
+ {
1094
+ "label": "NgStyle",
1095
+ "kind": 5,
1096
+ "detail": "Attribute directive",
1097
+ "documentation": { "value": "Updates styles of the host HTML element." },
1098
+ "insertText": "[ngStyle]=\"${1:styleExpression}\"",
1099
+ "insertTextRules": 4,
1100
+ "sortText": "04_NgStyle"
1101
+ },
1102
+ {
1103
+ "label": "AsyncPipe",
1104
+ "kind": 5,
1105
+ "detail": "Async pipe",
1106
+ "documentation": { "value": "Subscribes to an Observable or Promise and returns the latest value emitted. Automatically unsubscribes on destroy." },
1107
+ "insertText": "| async",
1108
+ "insertTextRules": 4,
1109
+ "sortText": "04_AsyncPipe"
1110
+ },
1111
+ {
1112
+ "label": "DatePipe",
1113
+ "kind": 5,
1114
+ "detail": "Date pipe",
1115
+ "documentation": { "value": "Formats a date value according to locale rules." },
1116
+ "insertText": "| date:'${1:short}'",
1117
+ "insertTextRules": 4,
1118
+ "sortText": "04_DatePipe"
1119
+ },
1120
+ {
1121
+ "label": "CurrencyPipe",
1122
+ "kind": 5,
1123
+ "detail": "Currency pipe",
1124
+ "documentation": { "value": "Transforms a number to a currency string according to locale rules." },
1125
+ "insertText": "| currency:'${1:USD}'",
1126
+ "insertTextRules": 4,
1127
+ "sortText": "04_CurrencyPipe"
1128
+ },
1129
+ {
1130
+ "label": "DecimalPipe",
1131
+ "kind": 5,
1132
+ "detail": "Decimal pipe",
1133
+ "documentation": { "value": "Transforms a number into a decimal string according to locale rules." },
1134
+ "insertText": "| number:'${1:1.0-2}'",
1135
+ "insertTextRules": 4,
1136
+ "sortText": "04_DecimalPipe"
1137
+ },
1138
+ {
1139
+ "label": "PercentPipe",
1140
+ "kind": 5,
1141
+ "detail": "Percent pipe",
1142
+ "documentation": { "value": "Transforms a number to a percentage string according to locale rules." },
1143
+ "insertText": "| percent",
1144
+ "insertTextRules": 4,
1145
+ "sortText": "04_PercentPipe"
1146
+ },
1147
+ {
1148
+ "label": "JsonPipe",
1149
+ "kind": 5,
1150
+ "detail": "JSON pipe",
1151
+ "documentation": { "value": "Converts a value into its JSON-format representation. Useful for debugging." },
1152
+ "insertText": "| json",
1153
+ "insertTextRules": 4,
1154
+ "sortText": "04_JsonPipe"
1155
+ },
1156
+ {
1157
+ "label": "SlicePipe",
1158
+ "kind": 5,
1159
+ "detail": "Slice pipe",
1160
+ "documentation": { "value": "Creates a new Array or String containing a subset of the elements." },
1161
+ "insertText": "| slice:${1:0}:${2:10}",
1162
+ "insertTextRules": 4,
1163
+ "sortText": "04_SlicePipe"
1164
+ },
1165
+ {
1166
+ "label": "UpperCasePipe",
1167
+ "kind": 5,
1168
+ "detail": "Uppercase pipe",
1169
+ "documentation": { "value": "Transforms text to all upper case." },
1170
+ "insertText": "| uppercase",
1171
+ "insertTextRules": 4,
1172
+ "sortText": "04_UpperCasePipe"
1173
+ },
1174
+ {
1175
+ "label": "LowerCasePipe",
1176
+ "kind": 5,
1177
+ "detail": "Lowercase pipe",
1178
+ "documentation": { "value": "Transforms text to all lower case." },
1179
+ "insertText": "| lowercase",
1180
+ "insertTextRules": 4,
1181
+ "sortText": "04_LowerCasePipe"
1182
+ },
1183
+ {
1184
+ "label": "TitleCasePipe",
1185
+ "kind": 5,
1186
+ "detail": "Title case pipe",
1187
+ "documentation": { "value": "Transforms text to title case (first letter of each word capitalized)." },
1188
+ "insertText": "| titlecase",
1189
+ "insertTextRules": 4,
1190
+ "sortText": "04_TitleCasePipe"
1191
+ },
1192
+ {
1193
+ "label": "KeyValuePipe",
1194
+ "kind": 5,
1195
+ "detail": "Key-value pipe",
1196
+ "documentation": { "value": "Transforms Object or Map into an array of key-value pairs." },
1197
+ "insertText": "| keyvalue",
1198
+ "insertTextRules": 4,
1199
+ "sortText": "04_KeyValuePipe"
1200
+ },
1201
+ {
1202
+ "label": "standalone",
1203
+ "kind": 9,
1204
+ "detail": "Standalone component flag",
1205
+ "documentation": { "value": "Marks a component, directive, or pipe as standalone. Standalone components don't need to be declared in an NgModule." },
1206
+ "insertText": "standalone: true",
1207
+ "insertTextRules": 4,
1208
+ "sortText": "02_standalone"
1209
+ },
1210
+ {
1211
+ "label": "importProvidersFrom",
1212
+ "kind": 1,
1213
+ "detail": "Import providers utility",
1214
+ "documentation": { "value": "Collects providers from NgModules for use in standalone application configuration." },
1215
+ "insertText": "importProvidersFrom(${1:Module})",
1216
+ "insertTextRules": 4,
1217
+ "sortText": "02_importProvidersFrom"
1218
+ },
1219
+ {
1220
+ "label": "provideZoneChangeDetection",
1221
+ "kind": 1,
1222
+ "detail": "Zone change detection provider",
1223
+ "documentation": { "value": "Provides NgZone-based change detection for the application." },
1224
+ "insertText": "provideZoneChangeDetection({ eventCoalescing: true })",
1225
+ "insertTextRules": 4,
1226
+ "sortText": "02_provideZoneChangeDetection"
1227
+ },
1228
+ {
1229
+ "label": "ApplicationConfig",
1230
+ "kind": 7,
1231
+ "detail": "Application configuration interface",
1232
+ "documentation": { "value": "Set of config options available during the application bootstrap operation." },
1233
+ "insertText": "const appConfig: ApplicationConfig = {\n providers: [\n ${0}\n ]\n};",
1234
+ "insertTextRules": 4,
1235
+ "sortText": "02_ApplicationConfig"
1236
+ },
1237
+ {
1238
+ "label": "bootstrapApplication",
1239
+ "kind": 1,
1240
+ "detail": "Bootstrap standalone application",
1241
+ "documentation": { "value": "Bootstraps an instance of a standalone Angular component as the root of the application." },
1242
+ "insertText": "bootstrapApplication(${1:AppComponent}, ${2:appConfig})",
1243
+ "insertTextRules": 4,
1244
+ "sortText": "02_bootstrapApplication"
1245
+ },
1246
+ {
1247
+ "label": "ngOnInit",
1248
+ "kind": 0,
1249
+ "detail": "Lifecycle hook: OnInit",
1250
+ "documentation": { "value": "Called once after the first ngOnChanges. Initialize the directive/component here." },
1251
+ "insertText": "ngOnInit(): void {\n ${0}\n}",
1252
+ "insertTextRules": 4,
1253
+ "sortText": "02_ngOnInit"
1254
+ },
1255
+ {
1256
+ "label": "ngOnDestroy",
1257
+ "kind": 0,
1258
+ "detail": "Lifecycle hook: OnDestroy",
1259
+ "documentation": { "value": "Called once when the directive/component is destroyed. Cleanup subscriptions and detach event handlers here." },
1260
+ "insertText": "ngOnDestroy(): void {\n ${0}\n}",
1261
+ "insertTextRules": 4,
1262
+ "sortText": "02_ngOnDestroy"
1263
+ },
1264
+ {
1265
+ "label": "ngOnChanges",
1266
+ "kind": 0,
1267
+ "detail": "Lifecycle hook: OnChanges",
1268
+ "documentation": { "value": "Called when any data-bound input property changes. Receives a SimpleChanges object." },
1269
+ "insertText": "ngOnChanges(changes: SimpleChanges): void {\n ${0}\n}",
1270
+ "insertTextRules": 4,
1271
+ "sortText": "02_ngOnChanges"
1272
+ },
1273
+ {
1274
+ "label": "ngAfterViewInit",
1275
+ "kind": 0,
1276
+ "detail": "Lifecycle hook: AfterViewInit",
1277
+ "documentation": { "value": "Called after the component's view and child views have been fully initialized." },
1278
+ "insertText": "ngAfterViewInit(): void {\n ${0}\n}",
1279
+ "insertTextRules": 4,
1280
+ "sortText": "02_ngAfterViewInit"
1281
+ },
1282
+ {
1283
+ "label": "ngAfterContentInit",
1284
+ "kind": 0,
1285
+ "detail": "Lifecycle hook: AfterContentInit",
1286
+ "documentation": { "value": "Called after content projection into the component is complete." },
1287
+ "insertText": "ngAfterContentInit(): void {\n ${0}\n}",
1288
+ "insertTextRules": 4,
1289
+ "sortText": "02_ngAfterContentInit"
1290
+ },
1291
+ {
1292
+ "label": "ngDoCheck",
1293
+ "kind": 0,
1294
+ "detail": "Lifecycle hook: DoCheck",
1295
+ "documentation": { "value": "Called during every change detection run. Use to detect changes Angular won't catch on its own." },
1296
+ "insertText": "ngDoCheck(): void {\n ${0}\n}",
1297
+ "insertTextRules": 4,
1298
+ "sortText": "02_ngDoCheck"
1299
+ },
1300
+ {
1301
+ "label": "ngAfterViewChecked",
1302
+ "kind": 0,
1303
+ "detail": "Lifecycle hook: AfterViewChecked",
1304
+ "documentation": { "value": "Called after every check of the component's view." },
1305
+ "insertText": "ngAfterViewChecked(): void {\n ${0}\n}",
1306
+ "insertTextRules": 4,
1307
+ "sortText": "02_ngAfterViewChecked"
1308
+ },
1309
+ {
1310
+ "label": "ngAfterContentChecked",
1311
+ "kind": 0,
1312
+ "detail": "Lifecycle hook: AfterContentChecked",
1313
+ "documentation": { "value": "Called after every check of projected content." },
1314
+ "insertText": "ngAfterContentChecked(): void {\n ${0}\n}",
1315
+ "insertTextRules": 4,
1316
+ "sortText": "02_ngAfterContentChecked"
1317
+ },
1318
+ {
1319
+ "label": "CanActivateFn",
1320
+ "kind": 7,
1321
+ "detail": "Functional route guard type",
1322
+ "documentation": { "value": "Type for functional route guards. Replaces class-based CanActivate." },
1323
+ "insertText": "CanActivateFn",
1324
+ "insertTextRules": 4,
1325
+ "sortText": "02_CanActivateFn"
1326
+ },
1327
+ {
1328
+ "label": "CanDeactivateFn",
1329
+ "kind": 7,
1330
+ "detail": "Functional deactivation guard type",
1331
+ "documentation": { "value": "Type for functional deactivation guards." },
1332
+ "insertText": "CanDeactivateFn",
1333
+ "insertTextRules": 4,
1334
+ "sortText": "02_CanDeactivateFn"
1335
+ },
1336
+ {
1337
+ "label": "ResolveFn",
1338
+ "kind": 7,
1339
+ "detail": "Functional resolver type",
1340
+ "documentation": { "value": "Type for functional route resolvers." },
1341
+ "insertText": "ResolveFn",
1342
+ "insertTextRules": 4,
1343
+ "sortText": "02_ResolveFn"
1344
+ },
1345
+ {
1346
+ "label": "HttpInterceptorFn",
1347
+ "kind": 7,
1348
+ "detail": "Functional interceptor type",
1349
+ "documentation": { "value": "Type for functional HTTP interceptors." },
1350
+ "insertText": "HttpInterceptorFn",
1351
+ "insertTextRules": 4,
1352
+ "sortText": "02_HttpInterceptorFn"
1353
+ },
1354
+ {
1355
+ "label": "CommonModule",
1356
+ "kind": 8,
1357
+ "detail": "Common module",
1358
+ "documentation": { "value": "Exports all the basic Angular directives and pipes, such as NgIf, NgFor, DecimalPipe, etc." },
1359
+ "insertText": "CommonModule",
1360
+ "insertTextRules": 4,
1361
+ "sortText": "02_CommonModule"
1362
+ },
1363
+ {
1364
+ "label": "ngOnInit-implement",
1365
+ "kind": 28,
1366
+ "detail": "Implement OnInit interface",
1367
+ "documentation": { "value": "Adds OnInit interface and ngOnInit method to the class." },
1368
+ "insertText": "implements OnInit {\n ngOnInit(): void {\n ${0}\n }",
1369
+ "insertTextRules": 4,
1370
+ "sortText": "00_ngOnInit-implement"
1371
+ },
1372
+ {
1373
+ "label": "ngOnDestroy-implement",
1374
+ "kind": 28,
1375
+ "detail": "Implement OnDestroy interface",
1376
+ "documentation": { "value": "Adds OnDestroy interface and ngOnDestroy method to the class." },
1377
+ "insertText": "implements OnDestroy {\n ngOnDestroy(): void {\n ${0}\n }",
1378
+ "insertTextRules": 4,
1379
+ "sortText": "00_ngOnDestroy-implement"
1380
+ },
1381
+ {
1382
+ "label": "HttpClient.get",
1383
+ "kind": 0,
1384
+ "detail": "HTTP GET request",
1385
+ "documentation": { "value": "Sends a GET request to a specified URL and returns an Observable." },
1386
+ "insertText": "this.http.get<${1:ResponseType}>('${2:url}')",
1387
+ "insertTextRules": 4,
1388
+ "sortText": "02_HttpClient.get"
1389
+ },
1390
+ {
1391
+ "label": "HttpClient.post",
1392
+ "kind": 0,
1393
+ "detail": "HTTP POST request",
1394
+ "documentation": { "value": "Sends a POST request to a specified URL and returns an Observable." },
1395
+ "insertText": "this.http.post<${1:ResponseType}>('${2:url}', ${3:body})",
1396
+ "insertTextRules": 4,
1397
+ "sortText": "02_HttpClient.post"
1398
+ },
1399
+ {
1400
+ "label": "HttpClient.put",
1401
+ "kind": 0,
1402
+ "detail": "HTTP PUT request",
1403
+ "documentation": { "value": "Sends a PUT request to a specified URL and returns an Observable." },
1404
+ "insertText": "this.http.put<${1:ResponseType}>('${2:url}', ${3:body})",
1405
+ "insertTextRules": 4,
1406
+ "sortText": "02_HttpClient.put"
1407
+ },
1408
+ {
1409
+ "label": "HttpClient.delete",
1410
+ "kind": 0,
1411
+ "detail": "HTTP DELETE request",
1412
+ "documentation": { "value": "Sends a DELETE request to a specified URL and returns an Observable." },
1413
+ "insertText": "this.http.delete<${1:ResponseType}>('${2:url}')",
1414
+ "insertTextRules": 4,
1415
+ "sortText": "02_HttpClient.delete"
1416
+ },
1417
+ {
1418
+ "label": "HttpClient.patch",
1419
+ "kind": 0,
1420
+ "detail": "HTTP PATCH request",
1421
+ "documentation": { "value": "Sends a PATCH request to a specified URL and returns an Observable." },
1422
+ "insertText": "this.http.patch<${1:ResponseType}>('${2:url}', ${3:body})",
1423
+ "insertTextRules": 4,
1424
+ "sortText": "02_HttpClient.patch"
1425
+ },
1426
+ {
1427
+ "label": "ViewEncapsulation.None",
1428
+ "kind": 14,
1429
+ "detail": "No encapsulation",
1430
+ "documentation": { "value": "Disables CSS encapsulation. Styles apply globally." },
1431
+ "insertText": "ViewEncapsulation.None",
1432
+ "insertTextRules": 4,
1433
+ "sortText": "02_ViewEncapsulation.None"
1434
+ },
1435
+ {
1436
+ "label": "ViewEncapsulation.Emulated",
1437
+ "kind": 14,
1438
+ "detail": "Emulated encapsulation",
1439
+ "documentation": { "value": "Default. Emulates native Shadow DOM by adding unique attributes to host elements and styles." },
1440
+ "insertText": "ViewEncapsulation.Emulated",
1441
+ "insertTextRules": 4,
1442
+ "sortText": "02_ViewEncapsulation.Emulated"
1443
+ },
1444
+ {
1445
+ "label": "ViewEncapsulation.ShadowDom",
1446
+ "kind": 14,
1447
+ "detail": "Shadow DOM encapsulation",
1448
+ "documentation": { "value": "Uses the browser's native Shadow DOM for true style encapsulation." },
1449
+ "insertText": "ViewEncapsulation.ShadowDom",
1450
+ "insertTextRules": 4,
1451
+ "sortText": "02_ViewEncapsulation.ShadowDom"
1452
+ },
1453
+ {
1454
+ "label": "ChangeDetectionStrategy.Default",
1455
+ "kind": 14,
1456
+ "detail": "Default change detection",
1457
+ "documentation": { "value": "Uses the default CheckAlways strategy, checking the component every change detection cycle." },
1458
+ "insertText": "ChangeDetectionStrategy.Default",
1459
+ "insertTextRules": 4,
1460
+ "sortText": "02_ChangeDetectionStrategy.Default"
1461
+ },
1462
+ {
1463
+ "label": "takeUntilDestroyed",
1464
+ "kind": 1,
1465
+ "detail": "Auto-unsubscribe on destroy",
1466
+ "documentation": { "value": "Operator that completes an Observable when the associated component or service is destroyed." },
1467
+ "insertText": "takeUntilDestroyed()",
1468
+ "insertTextRules": 4,
1469
+ "sortText": "02_takeUntilDestroyed"
1470
+ },
1471
+ {
1472
+ "label": "provideAnimations",
1473
+ "kind": 1,
1474
+ "detail": "Provide animations",
1475
+ "documentation": { "value": "Sets up providers for Angular animations." },
1476
+ "insertText": "provideAnimations()",
1477
+ "insertTextRules": 4,
1478
+ "sortText": "02_provideAnimations"
1479
+ },
1480
+ {
1481
+ "label": "provideAnimationsAsync",
1482
+ "kind": 1,
1483
+ "detail": "Provide async animations",
1484
+ "documentation": { "value": "Sets up providers for lazy-loaded Angular animations." },
1485
+ "insertText": "provideAnimationsAsync()",
1486
+ "insertTextRules": 4,
1487
+ "sortText": "02_provideAnimationsAsync"
1488
+ }
1489
+ ]
1490
+ }