@smartsoft001-mobilems/claude-plugins 2.84.0 → 2.86.0

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 (136) hide show
  1. package/.claude-plugin/marketplace.json +2 -6
  2. package/README.md +97 -0
  3. package/package.json +2 -2
  4. package/plugins/flow/scripts/refresh-mobilems-api-spec.sh +372 -0
  5. package/plugins/flow/skills/mobilems-docs-reader/SKILL.md +116 -0
  6. package/plugins/flow-external/scripts/refresh-mobilems-api-spec.sh +372 -0
  7. package/plugins/flow-external/skills/mobilems-docs-reader/SKILL.md +116 -0
  8. package/plugins/flow-legacy/scripts/refresh-mobilems-api-spec.sh +372 -0
  9. package/plugins/flow-legacy/skills/mobilems-docs-reader/SKILL.md +116 -0
  10. package/plugins/mobilems/.claude-plugin/README.md +30 -0
  11. package/plugins/mobilems/.claude-plugin/plugin.json +5 -0
  12. package/plugins/mobilems/scripts/refresh-mobilems-api-spec.sh +372 -0
  13. package/plugins/mobilems/skills/mobilems-docs-reader/SKILL.md +116 -0
  14. package/plugins/flow/.claude-plugin/README.md +0 -91
  15. package/plugins/flow/.claude-plugin/merge-permissions.js +0 -97
  16. package/plugins/flow/.claude-plugin/plugin.json +0 -5
  17. package/plugins/flow/.claude-plugin/settings.template.json +0 -86
  18. package/plugins/flow/agents/angular-component-scaffolder.md +0 -175
  19. package/plugins/flow/agents/angular-directive-builder.md +0 -153
  20. package/plugins/flow/agents/angular-guard-builder.md +0 -243
  21. package/plugins/flow/agents/angular-jest-test-writer.md +0 -474
  22. package/plugins/flow/agents/angular-pipe-builder.md +0 -169
  23. package/plugins/flow/agents/angular-resolver-builder.md +0 -286
  24. package/plugins/flow/agents/angular-service-builder.md +0 -161
  25. package/plugins/flow/agents/angular-signal-state-builder.md +0 -339
  26. package/plugins/flow/agents/angular-test-diagnostician.md +0 -279
  27. package/plugins/flow/agents/angular-testbed-configurator.md +0 -315
  28. package/plugins/flow/agents/arch-scaffolder.md +0 -278
  29. package/plugins/flow/agents/e2e-data-testid-injector.md +0 -197
  30. package/plugins/flow/agents/e2e-project-scaffolder.md +0 -194
  31. package/plugins/flow/agents/e2e-test-writer.md +0 -350
  32. package/plugins/flow/agents/shared-agent-evolver.md +0 -294
  33. package/plugins/flow/agents/shared-build-verifier.md +0 -160
  34. package/plugins/flow/agents/shared-config-updater.md +0 -310
  35. package/plugins/flow/agents/shared-coverage-enforcer.md +0 -184
  36. package/plugins/flow/agents/shared-error-handler.md +0 -217
  37. package/plugins/flow/agents/shared-file-creator.md +0 -344
  38. package/plugins/flow/agents/shared-impl-orchestrator.md +0 -312
  39. package/plugins/flow/agents/shared-impl-reporter.md +0 -339
  40. package/plugins/flow/agents/shared-impl-teammate.md +0 -201
  41. package/plugins/flow/agents/shared-linear-subtask-iterator.md +0 -337
  42. package/plugins/flow/agents/shared-logic-implementer.md +0 -243
  43. package/plugins/flow/agents/shared-maia-api.md +0 -26
  44. package/plugins/flow/agents/shared-parallelization-analyzer.md +0 -343
  45. package/plugins/flow/agents/shared-performance-validator.md +0 -168
  46. package/plugins/flow/agents/shared-plan-perspective.md +0 -269
  47. package/plugins/flow/agents/shared-project-standardizer.md +0 -205
  48. package/plugins/flow/agents/shared-report-synthesizer.md +0 -188
  49. package/plugins/flow/agents/shared-review-teammate.md +0 -189
  50. package/plugins/flow/agents/shared-security-scanner.md +0 -186
  51. package/plugins/flow/agents/shared-style-enforcer.md +0 -230
  52. package/plugins/flow/agents/shared-subtask-dependency-analyzer.md +0 -188
  53. package/plugins/flow/agents/shared-tdd-developer.md +0 -350
  54. package/plugins/flow/agents/shared-team-coordinator.md +0 -189
  55. package/plugins/flow/agents/shared-test-fixer.md +0 -186
  56. package/plugins/flow/agents/shared-test-runner.md +0 -191
  57. package/plugins/flow/agents/shared-ui-classifier.md +0 -263
  58. package/plugins/flow/agents/shared-verification-orchestrator.md +0 -194
  59. package/plugins/flow/agents/shared-verification-runner.md +0 -140
  60. package/plugins/flow/agents/ui-a11y-validator.md +0 -305
  61. package/plugins/flow/agents/ui-screenshot-reporter.md +0 -329
  62. package/plugins/flow/agents/ui-web-designer.md +0 -214
  63. package/plugins/flow/skills/a11y-audit/SKILL.md +0 -214
  64. package/plugins/flow/skills/angular-patterns/SKILL.md +0 -191
  65. package/plugins/flow/skills/browser-capture/SKILL.md +0 -238
  66. package/plugins/flow/skills/commit/SKILL.md +0 -259
  67. package/plugins/flow/skills/debug-helper/SKILL.md +0 -375
  68. package/plugins/flow/skills/impl/SKILL.md +0 -992
  69. package/plugins/flow/skills/linear-suggestion/SKILL.md +0 -132
  70. package/plugins/flow/skills/maia-files-delete/SKILL.md +0 -59
  71. package/plugins/flow/skills/maia-files-upload/SKILL.md +0 -57
  72. package/plugins/flow/skills/nx-conventions/SKILL.md +0 -326
  73. package/plugins/flow/skills/plan/SKILL.md +0 -1003
  74. package/plugins/flow/skills/push/SKILL.md +0 -737
  75. package/plugins/flow/skills/review/SKILL.md +0 -443
  76. package/plugins/flow/skills/test-e2e/SKILL.md +0 -161
  77. package/plugins/flow/skills/test-unit/SKILL.md +0 -456
  78. package/plugins/flow-external/.claude-plugin/README.md +0 -152
  79. package/plugins/flow-external/.claude-plugin/merge-permissions.js +0 -80
  80. package/plugins/flow-external/.claude-plugin/plugin.json +0 -5
  81. package/plugins/flow-external/.claude-plugin/settings.template.json +0 -78
  82. package/plugins/flow-external/agents/angular-component-scaffolder.md +0 -269
  83. package/plugins/flow-external/agents/angular-directive-builder.md +0 -130
  84. package/plugins/flow-external/agents/angular-guard-builder.md +0 -70
  85. package/plugins/flow-external/agents/angular-pipe-builder.md +0 -82
  86. package/plugins/flow-external/agents/angular-resolver-builder.md +0 -74
  87. package/plugins/flow-external/agents/angular-service-builder.md +0 -160
  88. package/plugins/flow-external/agents/angular-state-builder.md +0 -254
  89. package/plugins/flow-external/agents/shared-build-verifier.md +0 -67
  90. package/plugins/flow-external/agents/shared-impl-orchestrator.md +0 -88
  91. package/plugins/flow-external/agents/shared-impl-reporter.md +0 -107
  92. package/plugins/flow-external/agents/shared-linear-subtask-iterator.md +0 -70
  93. package/plugins/flow-external/agents/shared-ui-classifier.md +0 -38
  94. package/plugins/flow-external/agents/ui-web-designer.md +0 -179
  95. package/plugins/flow-external/skills/a11y-audit/SKILL.md +0 -96
  96. package/plugins/flow-external/skills/angular-cli-conventions/SKILL.md +0 -267
  97. package/plugins/flow-external/skills/angular-patterns/SKILL.md +0 -170
  98. package/plugins/flow-external/skills/browser-capture/SKILL.md +0 -68
  99. package/plugins/flow-external/skills/commit/SKILL.md +0 -114
  100. package/plugins/flow-external/skills/debug-helper/SKILL.md +0 -131
  101. package/plugins/flow-external/skills/impl/SKILL.md +0 -217
  102. package/plugins/flow-external/skills/linear-suggestion/SKILL.md +0 -62
  103. package/plugins/flow-external/skills/maia-files-delete/SKILL.md +0 -34
  104. package/plugins/flow-external/skills/maia-files-upload/SKILL.md +0 -41
  105. package/plugins/flow-external/skills/plan/SKILL.md +0 -302
  106. package/plugins/flow-external/skills/push/SKILL.md +0 -210
  107. package/plugins/flow-legacy/.claude-plugin/README.md +0 -143
  108. package/plugins/flow-legacy/.claude-plugin/merge-permissions.js +0 -94
  109. package/plugins/flow-legacy/.claude-plugin/plugin.json +0 -5
  110. package/plugins/flow-legacy/.claude-plugin/settings.template.json +0 -79
  111. package/plugins/flow-legacy/agents/angular-component-scaffolder.md +0 -323
  112. package/plugins/flow-legacy/agents/angular-directive-builder.md +0 -258
  113. package/plugins/flow-legacy/agents/angular-guard-builder.md +0 -322
  114. package/plugins/flow-legacy/agents/angular-pipe-builder.md +0 -227
  115. package/plugins/flow-legacy/agents/angular-resolver-builder.md +0 -332
  116. package/plugins/flow-legacy/agents/angular-service-builder.md +0 -271
  117. package/plugins/flow-legacy/agents/angular-state-builder.md +0 -479
  118. package/plugins/flow-legacy/agents/shared-impl-orchestrator.md +0 -174
  119. package/plugins/flow-legacy/agents/shared-impl-reporter.md +0 -204
  120. package/plugins/flow-legacy/agents/shared-linear-subtask-iterator.md +0 -187
  121. package/plugins/flow-legacy/agents/shared-tdd-developer.md +0 -306
  122. package/plugins/flow-legacy/agents/shared-test-runner.md +0 -131
  123. package/plugins/flow-legacy/agents/shared-ui-classifier.md +0 -145
  124. package/plugins/flow-legacy/skills/a11y-audit/SKILL.md +0 -214
  125. package/plugins/flow-legacy/skills/angular-patterns/SKILL.md +0 -346
  126. package/plugins/flow-legacy/skills/browser-capture/SKILL.md +0 -238
  127. package/plugins/flow-legacy/skills/commit/SKILL.md +0 -215
  128. package/plugins/flow-legacy/skills/debug-helper/SKILL.md +0 -395
  129. package/plugins/flow-legacy/skills/impl/SKILL.md +0 -710
  130. package/plugins/flow-legacy/skills/linear-suggestion/SKILL.md +0 -132
  131. package/plugins/flow-legacy/skills/maia-files-delete/SKILL.md +0 -59
  132. package/plugins/flow-legacy/skills/maia-files-upload/SKILL.md +0 -57
  133. package/plugins/flow-legacy/skills/nx-conventions/SKILL.md +0 -368
  134. package/plugins/flow-legacy/skills/plan/SKILL.md +0 -708
  135. package/plugins/flow-legacy/skills/push/SKILL.md +0 -623
  136. package/plugins/flow-legacy/skills/test-unit/SKILL.md +0 -500
@@ -1,227 +0,0 @@
1
- ---
2
- name: angular-pipe-builder
3
- description: Create Angular 14 pipes with constructor DI. Use when building transform pipes for templates in legacy projects.
4
- tools: Read, Write, Glob, Grep
5
- model: haiku
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular 14 pipes following legacy best practices.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular pipes using Angular 14 patterns including constructor injection for dependencies.
14
-
15
- ## When to Use
16
-
17
- - Creating new transform pipes
18
- - Building formatting pipes
19
- - Adding template transformations
20
-
21
- ## CRITICAL: Angular 14 Patterns (MANDATORY)
22
-
23
- | Feature | ✅ CORRECT (Angular 14) | ❌ WRONG (Angular 20+) |
24
- |---------|------------------------|----------------------|
25
- | DI | Constructor injection | `inject()` |
26
- | Standalone | NO (use modules) | `standalone: true` |
27
-
28
- ## Pipe Templates
29
-
30
- ### Pure Pipe (Stateless)
31
-
32
- ```typescript
33
- import { Pipe, PipeTransform } from '@angular/core';
34
-
35
- @Pipe({
36
- name: 'capitalize',
37
- pure: true, // Default, can be omitted
38
- })
39
- export class CapitalizePipe implements PipeTransform {
40
- transform(value: string | null | undefined): string {
41
- if (!value) return '';
42
- return value.charAt(0).toUpperCase() + value.slice(1).toLowerCase();
43
- }
44
- }
45
- ```
46
-
47
- ### Pipe with Parameters
48
-
49
- ```typescript
50
- import { Pipe, PipeTransform } from '@angular/core';
51
-
52
- @Pipe({
53
- name: 'truncate',
54
- })
55
- export class TruncatePipe implements PipeTransform {
56
- transform(
57
- value: string | null | undefined,
58
- limit: number = 100,
59
- ellipsis: string = '...'
60
- ): string {
61
- if (!value) return '';
62
- if (value.length <= limit) return value;
63
- return value.substring(0, limit) + ellipsis;
64
- }
65
- }
66
- ```
67
-
68
- ### Pipe with Service Injection
69
-
70
- ```typescript
71
- import { Pipe, PipeTransform } from '@angular/core';
72
- import { TranslateService } from '@ngx-translate/core';
73
-
74
- @Pipe({
75
- name: 'localizedDate',
76
- })
77
- export class LocalizedDatePipe implements PipeTransform {
78
- // Constructor injection (NOT inject())
79
- constructor(private readonly translateService: TranslateService) {}
80
-
81
- transform(value: Date | string | null | undefined, format: string = 'short'): string {
82
- if (!value) return '';
83
-
84
- const date = value instanceof Date ? value : new Date(value);
85
- const locale = this.translateService.currentLang || 'pl';
86
-
87
- return date.toLocaleDateString(locale, this.getFormatOptions(format));
88
- }
89
-
90
- private getFormatOptions(format: string): Intl.DateTimeFormatOptions {
91
- switch (format) {
92
- case 'short':
93
- return { day: '2-digit', month: '2-digit', year: 'numeric' };
94
- case 'long':
95
- return { day: 'numeric', month: 'long', year: 'numeric' };
96
- case 'full':
97
- return { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric' };
98
- default:
99
- return { day: '2-digit', month: '2-digit', year: 'numeric' };
100
- }
101
- }
102
- }
103
- ```
104
-
105
- ### Impure Pipe (Stateful)
106
-
107
- ```typescript
108
- import { Pipe, PipeTransform, ChangeDetectorRef, OnDestroy } from '@angular/core';
109
- import { Subscription } from 'rxjs';
110
- import { TranslateService } from '@ngx-translate/core';
111
-
112
- @Pipe({
113
- name: 'translateAsync',
114
- pure: false, // Impure - re-evaluates on every change detection
115
- })
116
- export class TranslateAsyncPipe implements PipeTransform, OnDestroy {
117
- private lastKey: string | null = null;
118
- private lastValue: string = '';
119
- private subscription: Subscription | null = null;
120
-
121
- // Constructor injection (NOT inject())
122
- constructor(
123
- private readonly translateService: TranslateService,
124
- private readonly cdr: ChangeDetectorRef
125
- ) {}
126
-
127
- transform(key: string | null | undefined): string {
128
- if (!key) return '';
129
-
130
- if (key !== this.lastKey) {
131
- this.lastKey = key;
132
- this.dispose();
133
-
134
- this.subscription = this.translateService.get(key).subscribe(value => {
135
- this.lastValue = value;
136
- this.cdr.markForCheck();
137
- });
138
- }
139
-
140
- return this.lastValue;
141
- }
142
-
143
- ngOnDestroy(): void {
144
- this.dispose();
145
- }
146
-
147
- private dispose(): void {
148
- if (this.subscription) {
149
- this.subscription.unsubscribe();
150
- this.subscription = null;
151
- }
152
- }
153
- }
154
- ```
155
-
156
- ## Module Declaration
157
-
158
- Pipes MUST be declared in a module:
159
-
160
- ```typescript
161
- import { NgModule } from '@angular/core';
162
-
163
- import { CapitalizePipe } from './capitalize.pipe';
164
- import { TruncatePipe } from './truncate.pipe';
165
- import { LocalizedDatePipe } from './localized-date.pipe';
166
-
167
- @NgModule({
168
- declarations: [
169
- CapitalizePipe,
170
- TruncatePipe,
171
- LocalizedDatePipe,
172
- ],
173
- exports: [
174
- CapitalizePipe,
175
- TruncatePipe,
176
- LocalizedDatePipe,
177
- ],
178
- })
179
- export class PipesModule {}
180
- ```
181
-
182
- ## Checklist
183
-
184
- - [ ] Uses constructor injection (NOT `inject()`)
185
- - [ ] Implements `PipeTransform`
186
- - [ ] Handles null/undefined input
187
- - [ ] Uses `pure: false` only when necessary
188
- - [ ] Implements `OnDestroy` for impure pipes
189
- - [ ] Declared in a module
190
- - [ ] Has unit tests
191
-
192
- ## Output Format
193
-
194
- ```markdown
195
- ## Pipe Created
196
-
197
- ### File
198
-
199
- `capitalize.pipe.ts`
200
-
201
- ### API
202
-
203
- | Parameter | Type | Default | Description |
204
- | --------- | -------- | ------- | ------------------ |
205
- | `value` | `string` | - | Text to capitalize |
206
-
207
- ### Usage
208
-
209
- ```html
210
- {{ 'hello world' | capitalize }}
211
- <!-- Output: Hello world -->
212
- ```
213
-
214
- ### Angular 14 Patterns Used
215
-
216
- - ✅ Constructor injection (when needed)
217
- - ✅ Module declaration
218
- - ✅ Proper null handling
219
-
220
- ### Module Registration
221
-
222
- Add to module:
223
- ```typescript
224
- declarations: [CapitalizePipe],
225
- exports: [CapitalizePipe]
226
- ```
227
- ```
@@ -1,332 +0,0 @@
1
- ---
2
- name: angular-resolver-builder
3
- description: Create Angular 14 route resolvers with constructor DI. Use when pre-fetching data before route activation in legacy projects.
4
- tools: Read, Write, Glob, Grep
5
- model: sonnet
6
- color: "#DD0031"
7
- ---
8
-
9
- You are an expert at creating Angular 14 route resolvers following legacy best practices.
10
-
11
- ## Primary Responsibility
12
-
13
- Create Angular route resolvers using Angular 14 patterns including class-based resolvers with constructor injection.
14
-
15
- ## When to Use
16
-
17
- - Pre-fetching data before route activation
18
- - Loading entity details before showing component
19
- - Ensuring data is available before component renders
20
-
21
- ## CRITICAL: Angular 14 Patterns (MANDATORY)
22
-
23
- **NEVER use functional resolvers. ALWAYS use class-based resolvers:**
24
-
25
- | Feature | ✅ CORRECT (Angular 14) | ❌ WRONG (Angular 15+) |
26
- |---------|------------------------|----------------------|
27
- | Resolver type | Class implementing `Resolve<T>` | `ResolveFn<T>` |
28
- | DI | Constructor injection | `inject()` |
29
-
30
- ## Resolver Templates
31
-
32
- ### Basic Data Resolver
33
-
34
- ```typescript
35
- import { Injectable } from '@angular/core';
36
- import {
37
- Resolve,
38
- ActivatedRouteSnapshot,
39
- RouterStateSnapshot,
40
- Router,
41
- } from '@angular/router';
42
- import { Observable, EMPTY } from 'rxjs';
43
- import { catchError, take } from 'rxjs/operators';
44
-
45
- import { ItemService } from '../services/item.service';
46
- import { Item } from '../models/item.model';
47
-
48
- @Injectable({
49
- providedIn: 'root',
50
- })
51
- export class ItemResolver implements Resolve<Item> {
52
- // Constructor injection (NOT inject())
53
- constructor(
54
- private readonly itemService: ItemService,
55
- private readonly router: Router
56
- ) {}
57
-
58
- resolve(
59
- route: ActivatedRouteSnapshot,
60
- state: RouterStateSnapshot
61
- ): Observable<Item> {
62
- const id = route.paramMap.get('id');
63
-
64
- if (!id) {
65
- this.router.navigate(['/items']);
66
- return EMPTY;
67
- }
68
-
69
- return this.itemService.getById(id).pipe(
70
- take(1),
71
- catchError(error => {
72
- console.error('Error loading item:', error);
73
- this.router.navigate(['/items']);
74
- return EMPTY;
75
- })
76
- );
77
- }
78
- }
79
- ```
80
-
81
- ### List Data Resolver
82
-
83
- ```typescript
84
- import { Injectable } from '@angular/core';
85
- import {
86
- Resolve,
87
- ActivatedRouteSnapshot,
88
- RouterStateSnapshot,
89
- } from '@angular/router';
90
- import { Observable } from 'rxjs';
91
- import { take } from 'rxjs/operators';
92
-
93
- import { ItemService } from '../services/item.service';
94
- import { Item } from '../models/item.model';
95
-
96
- @Injectable({
97
- providedIn: 'root',
98
- })
99
- export class ItemListResolver implements Resolve<Item[]> {
100
- // Constructor injection (NOT inject())
101
- constructor(private readonly itemService: ItemService) {}
102
-
103
- resolve(
104
- route: ActivatedRouteSnapshot,
105
- state: RouterStateSnapshot
106
- ): Observable<Item[]> {
107
- // Get query params for filtering
108
- const page = route.queryParamMap.get('page') || '1';
109
- const limit = route.queryParamMap.get('limit') || '10';
110
-
111
- return this.itemService.getList({
112
- page: parseInt(page, 10),
113
- limit: parseInt(limit, 10),
114
- }).pipe(take(1));
115
- }
116
- }
117
- ```
118
-
119
- ### Multiple Data Resolver
120
-
121
- ```typescript
122
- import { Injectable } from '@angular/core';
123
- import {
124
- Resolve,
125
- ActivatedRouteSnapshot,
126
- RouterStateSnapshot,
127
- } from '@angular/router';
128
- import { Observable, forkJoin } from 'rxjs';
129
- import { map, take } from 'rxjs/operators';
130
-
131
- import { UserService } from '../services/user.service';
132
- import { CategoryService } from '../services/category.service';
133
-
134
- export interface ProfilePageData {
135
- user: User;
136
- categories: Category[];
137
- }
138
-
139
- @Injectable({
140
- providedIn: 'root',
141
- })
142
- export class ProfilePageResolver implements Resolve<ProfilePageData> {
143
- // Constructor injection (NOT inject())
144
- constructor(
145
- private readonly userService: UserService,
146
- private readonly categoryService: CategoryService
147
- ) {}
148
-
149
- resolve(
150
- route: ActivatedRouteSnapshot,
151
- state: RouterStateSnapshot
152
- ): Observable<ProfilePageData> {
153
- const userId = route.paramMap.get('id')!;
154
-
155
- return forkJoin({
156
- user: this.userService.getById(userId).pipe(take(1)),
157
- categories: this.categoryService.getAll().pipe(take(1)),
158
- });
159
- }
160
- }
161
- ```
162
-
163
- ### Resolver with Loading State
164
-
165
- ```typescript
166
- import { Injectable } from '@angular/core';
167
- import {
168
- Resolve,
169
- ActivatedRouteSnapshot,
170
- RouterStateSnapshot,
171
- } from '@angular/router';
172
- import { Observable } from 'rxjs';
173
- import { finalize, take } from 'rxjs/operators';
174
-
175
- import { ItemService } from '../services/item.service';
176
- import { LoadingService } from '../services/loading.service';
177
- import { Item } from '../models/item.model';
178
-
179
- @Injectable({
180
- providedIn: 'root',
181
- })
182
- export class ItemResolverWithLoading implements Resolve<Item> {
183
- // Constructor injection (NOT inject())
184
- constructor(
185
- private readonly itemService: ItemService,
186
- private readonly loadingService: LoadingService
187
- ) {}
188
-
189
- resolve(
190
- route: ActivatedRouteSnapshot,
191
- state: RouterStateSnapshot
192
- ): Observable<Item> {
193
- const id = route.paramMap.get('id')!;
194
-
195
- this.loadingService.show();
196
-
197
- return this.itemService.getById(id).pipe(
198
- take(1),
199
- finalize(() => this.loadingService.hide())
200
- );
201
- }
202
- }
203
- ```
204
-
205
- ## Routing Configuration
206
-
207
- ```typescript
208
- import { NgModule } from '@angular/core';
209
- import { RouterModule, Routes } from '@angular/router';
210
-
211
- import { ItemResolver } from './resolvers/item.resolver';
212
- import { ItemListResolver } from './resolvers/item-list.resolver';
213
- import { ProfilePageResolver } from './resolvers/profile-page.resolver';
214
-
215
- const routes: Routes = [
216
- {
217
- path: 'items',
218
- component: ItemListComponent,
219
- resolve: {
220
- items: ItemListResolver,
221
- },
222
- },
223
- {
224
- path: 'items/:id',
225
- component: ItemDetailComponent,
226
- resolve: {
227
- item: ItemResolver,
228
- },
229
- },
230
- {
231
- path: 'profile/:id',
232
- component: ProfileComponent,
233
- resolve: {
234
- pageData: ProfilePageResolver,
235
- },
236
- },
237
- ];
238
-
239
- @NgModule({
240
- imports: [RouterModule.forChild(routes)],
241
- exports: [RouterModule],
242
- })
243
- export class ItemsRoutingModule {}
244
- ```
245
-
246
- ## Component Usage
247
-
248
- ```typescript
249
- import { Component, OnInit } from '@angular/core';
250
- import { ActivatedRoute } from '@angular/router';
251
-
252
- import { Item } from '../models/item.model';
253
-
254
- @Component({
255
- selector: 'app-item-detail',
256
- templateUrl: './item-detail.component.html',
257
- })
258
- export class ItemDetailComponent implements OnInit {
259
- item!: Item;
260
-
261
- // Constructor injection (NOT inject())
262
- constructor(private readonly route: ActivatedRoute) {}
263
-
264
- ngOnInit(): void {
265
- // Data is already resolved and available
266
- this.item = this.route.snapshot.data['item'];
267
-
268
- // Or subscribe to data changes
269
- this.route.data.subscribe(data => {
270
- this.item = data['item'];
271
- });
272
- }
273
- }
274
- ```
275
-
276
- ## Checklist
277
-
278
- - [ ] Uses class implementing `Resolve<T>`
279
- - [ ] Uses constructor injection (NOT `inject()`)
280
- - [ ] Returns `Observable<T>` with `take(1)`
281
- - [ ] Handles errors with `catchError`
282
- - [ ] Redirects on error if appropriate
283
- - [ ] Has `providedIn: 'root'` or is provided in module
284
- - [ ] Has unit tests
285
-
286
- ## Output Format
287
-
288
- ```markdown
289
- ## Resolver Created
290
-
291
- ### File
292
-
293
- `item.resolver.ts`
294
-
295
- ### Type
296
-
297
- `Resolve<Item>`
298
-
299
- ### Dependencies
300
-
301
- - `ItemService` - For fetching item data
302
- - `Router` - For error redirects
303
-
304
- ### Behavior
305
-
306
- - Fetches item by ID from route params
307
- - Redirects to list on error
308
- - Returns EMPTY on missing ID
309
-
310
- ### Angular 14 Patterns Used
311
-
312
- - ✅ Class-based resolver
313
- - ✅ Constructor injection
314
- - ✅ Observable with take(1)
315
- - ✅ Error handling with catchError
316
-
317
- ### Routing Usage
318
-
319
- ```typescript
320
- {
321
- path: 'items/:id',
322
- component: ItemDetailComponent,
323
- resolve: { item: ItemResolver }
324
- }
325
- ```
326
-
327
- ### Component Access
328
-
329
- ```typescript
330
- this.item = this.route.snapshot.data['item'];
331
- ```
332
- ```