@opendevstack/ngx-appshell 19.0.5

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 (71) hide show
  1. package/README.md +131 -0
  2. package/fesm2022/opendevstack-ngx-appshell.mjs +727 -0
  3. package/fesm2022/opendevstack-ngx-appshell.mjs.map +1 -0
  4. package/index.d.ts +5 -0
  5. package/lib/components/appshell-breadcrumb/appshell-breadcrumb.component.d.ts +7 -0
  6. package/lib/components/appshell-chip/appshell-chip.component.d.ts +6 -0
  7. package/lib/components/appshell-filters/appshell-filters.component.d.ts +12 -0
  8. package/lib/components/appshell-header/appshell-header.component.d.ts +24 -0
  9. package/lib/components/appshell-icon/appshell-icon.component.d.ts +12 -0
  10. package/lib/components/appshell-layout/appshell-layout.component.d.ts +25 -0
  11. package/lib/components/appshell-page-header/appshell-page-header.component.d.ts +18 -0
  12. package/lib/components/appshell-platform-header/appshell-platform-header.component.d.ts +37 -0
  13. package/lib/components/appshell-platform-layout/appshell-platform-layout.component.d.ts +30 -0
  14. package/lib/components/appshell-product-card/appshell-product-card.component.d.ts +23 -0
  15. package/lib/components/appshell-product-card-v2/appshell-product-card-v2.component.d.ts +16 -0
  16. package/lib/components/appshell-select/appshell-select.component.d.ts +9 -0
  17. package/lib/components/appshell-sidebar-menu/appshell-sidebar-menu.component.d.ts +12 -0
  18. package/lib/components/appshell-toast/appshell-toast.component.d.ts +9 -0
  19. package/lib/components/appshell-toasts/appshell-toasts.component.d.ts +14 -0
  20. package/lib/components/index.d.ts +15 -0
  21. package/lib/directives/appshell-link.directive.d.ts +15 -0
  22. package/lib/directives/index.d.ts +1 -0
  23. package/lib/models/appshell-button.d.ts +5 -0
  24. package/lib/models/appshell-filter.d.ts +4 -0
  25. package/lib/models/appshell-link.d.ts +6 -0
  26. package/lib/models/appshell-links-group.d.ts +5 -0
  27. package/lib/models/appshell-notification.d.ts +10 -0
  28. package/lib/models/appshell-picker.d.ts +9 -0
  29. package/lib/models/appshell-product.d.ts +12 -0
  30. package/lib/models/appshell-tag.d.ts +4 -0
  31. package/lib/models/appshell-toast.d.ts +6 -0
  32. package/lib/models/appshell-user.d.ts +5 -0
  33. package/lib/models/index.d.ts +10 -0
  34. package/lib/screens/appshell-notifications-screen/appshell-notifications-screen.component.d.ts +23 -0
  35. package/lib/screens/appshell-product-catalog-screen/appshell-product-catalog-screen.component.d.ts +16 -0
  36. package/lib/screens/appshell-product-view-screen/appshell-product-view-screen.component.d.ts +19 -0
  37. package/lib/screens/index.d.ts +3 -0
  38. package/lib/services/appshell-toast.service.d.ts +12 -0
  39. package/lib/services/icon-registry.service.d.ts +14 -0
  40. package/lib/services/index.d.ts +2 -0
  41. package/opendevstack-ngx-appshell-19.0.5.tgz +0 -0
  42. package/package.json +44 -0
  43. package/public-api.d.ts +5 -0
  44. package/schematics/azure-login/files/app-config/config.json.template +12 -0
  45. package/schematics/azure-login/files/app-config-service/app-config.service.spec.ts.template +48 -0
  46. package/schematics/azure-login/files/app-config-service/app-config.service.ts.template +39 -0
  47. package/schematics/azure-login/files/azure-config/azure.config.ts.template +94 -0
  48. package/schematics/azure-login/files/azure-service/azure.service.spec.ts.template +311 -0
  49. package/schematics/azure-login/files/azure-service/azure.service.ts.template +161 -0
  50. package/schematics/azure-login/index.d.ts +2 -0
  51. package/schematics/azure-login/index.js +325 -0
  52. package/schematics/azure-login/index.js.map +1 -0
  53. package/schematics/azure-login/schema.json +8 -0
  54. package/schematics/collection.json +19 -0
  55. package/schematics/nats-notifications/files/nats-service/nats.service.spec.ts.template +473 -0
  56. package/schematics/nats-notifications/files/nats-service/nats.service.ts.template +255 -0
  57. package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.html.template +7 -0
  58. package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.spec.ts.template +152 -0
  59. package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.ts.template +61 -0
  60. package/schematics/nats-notifications/index.d.ts +2 -0
  61. package/schematics/nats-notifications/index.js +502 -0
  62. package/schematics/nats-notifications/index.js.map +1 -0
  63. package/schematics/nats-notifications/schema.json +8 -0
  64. package/schematics/ng-add/files/_fonts.scss +85 -0
  65. package/schematics/ng-add/files/styles.scss +47 -0
  66. package/schematics/ng-add/index.d.ts +2 -0
  67. package/schematics/ng-add/index.js +442 -0
  68. package/schematics/ng-add/index.js.map +1 -0
  69. package/styles/appshell-typography-config.scss +19 -0
  70. package/styles/appshell.theme.scss +75 -0
  71. package/styles/palette.css +92 -0
@@ -0,0 +1,502 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.natsNotificationsGenerator = natsNotificationsGenerator;
4
+ const schematics_1 = require("@angular-devkit/schematics");
5
+ const core_1 = require("@angular-devkit/core");
6
+ const ts = require("typescript");
7
+ const change_1 = require("@schematics/angular/utility/change");
8
+ function natsNotificationsGenerator() {
9
+ return (_tree, context) => {
10
+ context.logger.info('Integrating Nats notifications into the project');
11
+ const natsServiceTemplateSource = (0, schematics_1.apply)((0, schematics_1.url)('./files/nats-service'), [(0, schematics_1.applyTemplates)({}), (0, schematics_1.move)((0, core_1.normalize)(`/src/app/services`))]);
12
+ const notificationsScreenTemplateSource = (0, schematics_1.apply)((0, schematics_1.url)('./files/notifications-screen'), [(0, schematics_1.applyTemplates)({}), (0, schematics_1.move)((0, core_1.normalize)(`/src/app/screens/notifications-screen`))]);
13
+ return (0, schematics_1.chain)([
14
+ (0, schematics_1.externalSchematic)('@schematics/angular', 'service', { name: 'nats', path: `src/app/services` }),
15
+ (0, schematics_1.mergeWith)(natsServiceTemplateSource, schematics_1.MergeStrategy.Overwrite),
16
+ (0, schematics_1.externalSchematic)('@schematics/angular', 'component', { name: 'notifications-screen', path: `src/app/screens`, style: 'scss' }),
17
+ (0, schematics_1.mergeWith)(notificationsScreenTemplateSource, schematics_1.MergeStrategy.Overwrite),
18
+ (tree) => {
19
+ addRouteToAppRoutes(tree, 'NotificationsScreenComponent', 'notifications', './screens/notifications-screen/notifications-screen.component');
20
+ addPropertiesToAppShellConfiguration(tree);
21
+ addToastsToAppComponentUI(tree);
22
+ integrateNotificationsInAppComponent(tree);
23
+ integrateNotificationsInAppComponentTests(tree);
24
+ addMarkdownProviderToAppConfig(tree);
25
+ return tree;
26
+ }
27
+ ]);
28
+ };
29
+ }
30
+ function addMarkdownProviderToAppConfig(tree) {
31
+ const appConfigPath = `/src/app/app.config.ts`;
32
+ const text = tree.read(appConfigPath);
33
+ if (!text)
34
+ throw new Error(`File ${appConfigPath} does not exist.`);
35
+ const sourceText = text.toString('utf-8');
36
+ const providersArrayMatch = sourceText.match(/providers: \[((?:[^\[\]]|\[(?:[^\[\]]|\[[^\[\]]*\])*\])*)\]/);
37
+ if (!providersArrayMatch)
38
+ throw new Error(`Providers array not found in ${appConfigPath}.`);
39
+ const newProviders = `provideMarkdown()`;
40
+ const providersArrayContent = providersArrayMatch[1].trim();
41
+ const updatedProvidersArrayContent = providersArrayContent ? `${providersArrayContent},\n\t\t${newProviders}` : `\n${newProviders}`;
42
+ let updatedSourceText = sourceText.replace(providersArrayMatch[0], `providers: [\n\t\t${updatedProvidersArrayContent}\n]`);
43
+ const recorder = tree.beginUpdate(appConfigPath);
44
+ recorder.insertLeft(0, `import { provideMarkdown } from 'ngx-markdown';\n`);
45
+ recorder.remove(0, sourceText.length);
46
+ recorder.insertLeft(0, updatedSourceText);
47
+ tree.commitUpdate(recorder);
48
+ }
49
+ function addRouteToAppRoutes(tree, componentName, routePath, importPath) {
50
+ const appRoutesPath = `src/app/app.routes.ts`;
51
+ const text = tree.read(appRoutesPath);
52
+ if (!text)
53
+ throw new Error(`File ${appRoutesPath} does not exist.`);
54
+ const sourceText = text.toString('utf-8');
55
+ const route = `{ path: '${routePath}', component: ${componentName} }`;
56
+ const routesArrayMatch = sourceText.match(/export const routes: Routes = \[([\s\S]*?)\];/);
57
+ if (!routesArrayMatch)
58
+ throw new Error(`Routes array not found in ${appRoutesPath}.`);
59
+ const routesArrayContent = routesArrayMatch[1].trim();
60
+ const updatedRoutesArrayContent = routesArrayContent ? `${routesArrayContent},\n\t${route}` : `\n${route}`;
61
+ const updatedSourceText = sourceText.replace(routesArrayMatch[0], `export const routes: Routes = [\n\t${updatedRoutesArrayContent}\n];`);
62
+ const recorder = tree.beginUpdate(appRoutesPath);
63
+ recorder.insertLeft(0, `import { ${componentName} } from '${importPath}';\n`);
64
+ recorder.remove(0, sourceText.length);
65
+ recorder.insertLeft(0, updatedSourceText);
66
+ tree.commitUpdate(recorder);
67
+ }
68
+ function addPropertiesToAppShellConfiguration(tree) {
69
+ const appShellConfigPath = 'src/app/appshell.configuration.ts';
70
+ if (!tree.exists(appShellConfigPath)) {
71
+ throw new Error(`File ${appShellConfigPath} does not exist.`);
72
+ }
73
+ const sourceFile = ts.createSourceFile(appShellConfigPath, tree.read(appShellConfigPath).toString('utf-8'), ts.ScriptTarget.Latest, true);
74
+ const recorder = tree.beginUpdate(appShellConfigPath);
75
+ const classNode = sourceFile.statements.find(ts.isClassDeclaration);
76
+ if (!classNode) {
77
+ throw new Error(`Class not found in ${appShellConfigPath}.`);
78
+ }
79
+ const existingProperties = classNode.members.filter(ts.isPropertyDeclaration).map(prop => prop.name.getText());
80
+ const insertPosition = classNode.end - 1;
81
+ if (!existingProperties.includes('natsUrl')) {
82
+ recorder.insertLeft(insertPosition, `\n public static natsUrl = 'wss://nats.yourdomain.com';\n`);
83
+ }
84
+ if (!existingProperties.includes('toastLimitInScreen')) {
85
+ recorder.insertLeft(insertPosition, `\n public static toastLimitInScreen = 3;\n`);
86
+ }
87
+ if (!existingProperties.includes('appShellNotificationsLink')) {
88
+ recorder.insertLeft(insertPosition, `\n public static appShellNotificationsLink = {\n anchor: '/notifications',\n icon: 'notifications'\n };\n`);
89
+ }
90
+ tree.commitUpdate(recorder);
91
+ }
92
+ function addToastsToAppComponentUI(tree) {
93
+ const templateFilePath = 'src/app/app.component.html';
94
+ if (!tree.exists(templateFilePath)) {
95
+ throw new Error(`File ${templateFilePath} does not exist.`);
96
+ }
97
+ let templateContent = tree.read(templateFilePath).toString('utf-8');
98
+ if (!templateContent.includes('<appshell-layout') || templateContent.includes('[appShellNotificationsCount]') || templateContent.includes('<appshell-toasts')) {
99
+ throw new Error(`Template already has integrated notifications elements.`);
100
+ }
101
+ const layoutTagRegex = /<appshell-layout[^>]*>/;
102
+ const layoutTagMatch = templateContent.match(layoutTagRegex);
103
+ if (!layoutTagMatch) {
104
+ throw new Error(`appshell-layout tag not found in ${templateFilePath}.`);
105
+ }
106
+ const originalLayoutTag = layoutTagMatch[0];
107
+ const closingBracketIndex = originalLayoutTag.lastIndexOf('>');
108
+ const updatedLayoutTag = `${originalLayoutTag.substring(0, closingBracketIndex)}\n [appShellNotificationsLink]="appShellNotificationsLink"\n [appShellNotificationsCount]="appShellNotificationsCount"\n >`;
109
+ let updatedTemplate = templateContent.replace(originalLayoutTag, updatedLayoutTag);
110
+ if (!updatedTemplate.includes('<appshell-toasts')) {
111
+ const closingLayoutTagIndex = updatedTemplate.indexOf('</appshell-layout>');
112
+ if (closingLayoutTagIndex > -1) {
113
+ const insertPosition = closingLayoutTagIndex + '</appshell-layout>'.length;
114
+ updatedTemplate = updatedTemplate.substring(0, insertPosition) + '\n<appshell-toasts [toastsLimit]="toastLimitInScreen"></appshell-toasts>\n' + updatedTemplate.substring(insertPosition);
115
+ }
116
+ }
117
+ tree.overwrite(templateFilePath, updatedTemplate);
118
+ }
119
+ function integrateNotificationsInAppComponent(tree) {
120
+ const appComponentPath = 'src/app/app.component.ts';
121
+ const content = tree.read(appComponentPath);
122
+ if (!content) {
123
+ throw new Error(`File ${appComponentPath} does not exist.`);
124
+ }
125
+ const sourceText = content.toString('utf-8');
126
+ const sourceFile = ts.createSourceFile(appComponentPath, sourceText, ts.ScriptTarget.Latest, true);
127
+ const changes = [];
128
+ changes.push(updateImport(sourceFile, appComponentPath, '@appshell/ngx-appshell', ['AppShellLayoutComponent', 'AppShellToastService', 'AppShellToastsComponent', 'AppShellNotification']));
129
+ changes.push(addNatsServiceImport(sourceFile, appComponentPath));
130
+ changes.push(updateImport(sourceFile, appComponentPath, 'rxjs', ['Subject', 'Subscription']));
131
+ changes.push(updateComponentImports(sourceFile, appComponentPath, ['CommonModule', 'AppShellLayoutComponent', 'AppShellToastsComponent']));
132
+ changes.push(addClassProperties(sourceFile, appComponentPath, [
133
+ 'toastLimitInScreen: number = AppShellConfig.toastLimitInScreen;',
134
+ 'appShellNotificationsLink: AppShellLink = AppShellConfig.appShellNotificationsLink;',
135
+ 'appShellNotificationsCount: number = 0;',
136
+ 'private natsUrl: string = AppShellConfig.natsUrl;',
137
+ 'private unreadMessagesCountSubscription!: Subscription;',
138
+ 'private liveMessageSubscription!: Subscription;'
139
+ ]));
140
+ changes.push(updateConstructor(sourceFile, appComponentPath, ['private azureService: AzureService', 'private toastService: AppShellToastService', 'private natsService: NatsService']));
141
+ changes.push(updateNgOnInit(sourceFile, appComponentPath, `async ngOnInit(): Promise<void> {
142
+ await this.natsService.initialize(this.natsUrl);
143
+ this.azureService.initialize();
144
+ this.azureService.loggedUser$.subscribe((user) => {
145
+ this.loggedUser = user;
146
+ this.initUserNotifications(user);
147
+ });
148
+ this.initializeNatsListeners();
149
+ }`));
150
+ changes.push(updateNgOnDestroy(sourceFile, appComponentPath, `ngOnDestroy(): void {
151
+ this._destroying$.next(undefined);
152
+ this._destroying$.complete();
153
+ this.liveMessageSubscription?.unsubscribe();
154
+ this.unreadMessagesCountSubscription?.unsubscribe();
155
+ }`));
156
+ changes.push(addMethod(sourceFile, appComponentPath, `private initUserNotifications(user: AppShellUser|null) {
157
+ if(user) {
158
+ // We convert the username to a valid NATS user name based on their validations:
159
+ // validBucketRe = regexp.MustCompile(^[a-zA-Z0-9_-]+$)
160
+ // validKeyRe = regexp.MustCompile(^[-/_=\.a-zA-Z0-9]+$)
161
+ const natsUser = user.username.split('@')[0].replace(/[^a-zA-Z0-9_-]/g, '_')
162
+ this.natsService.initializeUser(natsUser);
163
+
164
+ // On login, leave 4 seconds for the NATS connection to be established and show a toast with the unread messages count
165
+ setTimeout(() => {
166
+ if(this.appShellNotificationsCount > 0) {
167
+ const notification = {
168
+ id: new Date().getTime().toString() + '-logged',
169
+ title: \`You have \${this.appShellNotificationsCount} unread notifications\`,
170
+ read: false,
171
+ subject: 'only-toast'
172
+ } as AppShellNotification;
173
+ this.toastService.showToast(notification, 8000);
174
+ }
175
+ }, 4000);
176
+ }
177
+ }`));
178
+ changes.push(addMethod(sourceFile, appComponentPath, `private initializeNatsListeners() {
179
+ this.unreadMessagesCountSubscription = this.natsService.unreadMessagesCount$.subscribe((count) => {
180
+ this.appShellNotificationsCount = count;
181
+ });
182
+ this.liveMessageSubscription = this.natsService.liveMessage$.subscribe((message) => {
183
+ if (!message || !message.data) {
184
+ return;
185
+ }
186
+ try {
187
+ if (this.natsService.isValidMessage(message.data)) {
188
+ console.log('Received valid message:', message);
189
+ const notification = {
190
+ id: message.id,
191
+ type: message.data.type,
192
+ title: \`You have 1 new notification\`,
193
+ date: new Date(message.data.date),
194
+ read: message.read,
195
+ subject: message.subject
196
+ };
197
+ // If you want to show the actual notification, you can show message.data instead of notification
198
+ this.toastService.showToast(notification, 8000);
199
+ } else {
200
+ console.log('Invalid message format:', message);
201
+ }
202
+ } catch (error) {
203
+ console.log('Invalid message format:', message);
204
+ }
205
+ });
206
+ }`));
207
+ const recorder = tree.beginUpdate(appComponentPath);
208
+ (0, change_1.applyToUpdateRecorder)(recorder, changes);
209
+ tree.commitUpdate(recorder);
210
+ }
211
+ function integrateNotificationsInAppComponentTests(tree) {
212
+ const testFilePath = 'src/app/app.component.spec.ts';
213
+ const content = tree.read(testFilePath);
214
+ if (!content) {
215
+ throw new Error(`File ${testFilePath} does not exist.`);
216
+ }
217
+ const sourceText = content.toString('utf-8');
218
+ const sourceFile = ts.createSourceFile(testFilePath, sourceText, ts.ScriptTarget.Latest, true);
219
+ // Update imports
220
+ const importsToAdd = [
221
+ ['ComponentFixture', 'fakeAsync', 'TestBed', 'tick'],
222
+ ['Subject'],
223
+ ['NatsMessage', 'NatsService'],
224
+ ['AppShellToastsComponent', 'AppShellToastService', 'AppShellUser']
225
+ ];
226
+ const importSources = [
227
+ '@angular/core/testing',
228
+ 'rxjs',
229
+ './services/nats.service',
230
+ '@appshell/ngx-appshell'
231
+ ];
232
+ let updatedSource = sourceText;
233
+ for (let i = 0; i < importsToAdd.length; i++) {
234
+ const change = updateImport(sourceFile, testFilePath, importSources[i], importsToAdd[i]);
235
+ if (change instanceof change_1.NoopChange) {
236
+ updatedSource = `import {${importsToAdd[i].join(', ')}} from '${importSources[i]}'\n` + updatedSource;
237
+ }
238
+ else if (change instanceof change_1.ReplaceChange) {
239
+ updatedSource = updatedSource.replace(change.oldText, change.newText);
240
+ }
241
+ }
242
+ const describeBlockStart = updatedSource.indexOf('describe(\'AppComponent\'');
243
+ const beforeEachStart = updatedSource.indexOf('beforeEach(', describeBlockStart);
244
+ const variablesToAdd = `let mockNatsService: jasmine.SpyObj<NatsService>;
245
+ let mockToastService: jasmine.SpyObj<AppShellToastService>;
246
+ let azureLoggedUser$: Subject<AppShellUser>;
247
+ let natsLiveMessage$: Subject<NatsMessage | null>;
248
+ let natsMessageCount$: Subject<number>;
249
+ `;
250
+ if (!updatedSource.includes('mockNatsService') ||
251
+ !updatedSource.includes('mockToastService') ||
252
+ !updatedSource.includes('natsLiveMessage$')) {
253
+ updatedSource = insertAtPosition(updatedSource, beforeEachStart, variablesToAdd);
254
+ }
255
+ const beforeEachBlockStart = updatedSource.indexOf('{', beforeEachStart) + 1;
256
+ const initializationCode = `
257
+ azureLoggedUser$ = new Subject<AppShellUser>();
258
+ natsLiveMessage$ = new Subject<NatsMessage | null>();
259
+ natsMessageCount$ = new Subject<number>();
260
+ mockAzureService = jasmine.createSpyObj('AzureService', ['initialize', 'login', 'logout'], { loggedUser$: azureLoggedUser$.asObservable() });
261
+ mockNatsService = jasmine.createSpyObj('NatsService', ['initialize', 'initializeUser', 'readMessages', 'isValidMessage'], { liveMessage$: natsLiveMessage$.asObservable(), unreadMessagesCount$: natsMessageCount$.asObservable() });
262
+ mockToastService = jasmine.createSpyObj('AppShellToastService', ['showToast'], { toasts$: of([]) });`;
263
+ // Check if initialization exists
264
+ if (!updatedSource.includes('mockNatsService = jasmine.createSpyObj')) {
265
+ updatedSource = updatedSource.replace(/mockAzureService = jasmine\.createSpyObj\(.*?;/, '');
266
+ updatedSource = insertAtPosition(updatedSource, beforeEachBlockStart, initializationCode);
267
+ }
268
+ // Update TestBed configuration
269
+ const testBedConfigStart = updatedSource.indexOf('TestBed.configureTestingModule', beforeEachBlockStart);
270
+ const importsStart = updatedSource.indexOf('imports:', testBedConfigStart);
271
+ const importsEnd = updatedSource.indexOf(']', importsStart);
272
+ // Add MockAppShellToastsComponent to imports
273
+ if (!updatedSource.substring(importsStart, importsEnd).includes('MockAppShellToastsComponent')) {
274
+ const importsList = updatedSource.substring(importsStart, importsEnd);
275
+ const lastImportPos = importsList.lastIndexOf(',') + 1;
276
+ const newImportsSection = importsList.substring(0, lastImportPos) + ' AppShellToastsComponent,' + importsList.substring(lastImportPos);
277
+ updatedSource = updatedSource.substring(0, importsStart) + newImportsSection + updatedSource.substring(importsEnd);
278
+ }
279
+ // Add providers for NatsService and AppShellToastService
280
+ const providersStart = updatedSource.indexOf('providers:', testBedConfigStart);
281
+ if (providersStart !== -1) {
282
+ const providersEnd = updatedSource.indexOf(']', providersStart);
283
+ const providersList = updatedSource.substring(providersStart, providersEnd);
284
+ if (!providersList.includes('NatsService') || !providersList.includes('AppShellToastService')) {
285
+ const lastProviderPos = providersList.lastIndexOf(',') + 1;
286
+ let newProviders = '';
287
+ if (!providersList.includes('NatsService')) {
288
+ newProviders += '\n { provide: NatsService, useValue: mockNatsService },';
289
+ }
290
+ if (!providersList.includes('AppShellToastService')) {
291
+ newProviders += '\n { provide: AppShellToastService, useValue: mockToastService },';
292
+ }
293
+ const newProvidersSection = providersList.substring(0, lastProviderPos) + newProviders + providersList.substring(lastProviderPos);
294
+ updatedSource = updatedSource.substring(0, providersStart) + newProvidersSection + updatedSource.substring(providersEnd);
295
+ }
296
+ }
297
+ const compileComponentsEnd = updatedSource.indexOf('.compileComponents()', testBedConfigStart);
298
+ const beforeEachEnd = updatedSource.indexOf('});', compileComponentsEnd);
299
+ if (!updatedSource.substring(compileComponentsEnd, beforeEachEnd).includes('whenStable')) {
300
+ const whenStableCode = `\n fixture = TestBed.createComponent(AppComponent);
301
+ component = fixture.componentInstance;
302
+ fixture.detectChanges();
303
+ await fixture.whenStable();\n `;
304
+ updatedSource = insertAtPosition(updatedSource, beforeEachEnd, whenStableCode);
305
+ updatedSource = updatedSource.replace(/beforeEach\(\(\) => \{[\s\S]*?fixture = TestBed\.createComponent\(AppComponent\);[\s\S]*?component = fixture\.componentInstance;[\s\S]*?fixture\.detectChanges\(\);[\s\S]*?\}\);/, '');
306
+ }
307
+ const describeEnd = updatedSource.lastIndexOf('});');
308
+ const testsToAdd = ` it('should call initializeUser with a valid NATS user name', fakeAsync(() => {
309
+ azureLoggedUser$.next({fullName: 'Fake', username: 'fake.user@fakemail.com'} as AppShellUser);
310
+ natsMessageCount$.next(0);
311
+ tick(5000);
312
+ expect(mockNatsService.initializeUser).toHaveBeenCalledWith('fake_user');
313
+ expect(mockToastService.showToast).not.toHaveBeenCalled();
314
+ }));
315
+
316
+ it('should show a toast with the initial notifications count', fakeAsync(() => {
317
+ azureLoggedUser$.next({fullName: 'Fake', username: 'fake.user@fakemail.com'} as AppShellUser);
318
+ natsMessageCount$.next(3);
319
+ tick(5000);
320
+ expect(mockNatsService.initializeUser).toHaveBeenCalledWith('fake_user');
321
+ expect(mockToastService.showToast).toHaveBeenCalled();
322
+ }));
323
+
324
+ it('should manage properly the received message from nats service', fakeAsync(() => {
325
+ mockToastService.showToast.calls.reset();
326
+ natsLiveMessage$.next(null);
327
+ expect(mockToastService.showToast).not.toHaveBeenCalled();
328
+ natsLiveMessage$.next({data: null} as NatsMessage);
329
+ expect(mockToastService.showToast).not.toHaveBeenCalled();
330
+ mockNatsService.isValidMessage.and.returnValue(false);
331
+ natsLiveMessage$.next({data: {}} as NatsMessage);
332
+ expect(mockToastService.showToast).not.toHaveBeenCalled();
333
+ mockNatsService.isValidMessage.and.throwError(new Error('Invalid message format'));
334
+ natsLiveMessage$.next({data: {}} as NatsMessage);
335
+ expect(mockToastService.showToast).not.toHaveBeenCalled();
336
+ mockNatsService.isValidMessage.and.returnValue(true);
337
+ natsLiveMessage$.next({data: {}} as NatsMessage);
338
+ expect(mockToastService.showToast).toHaveBeenCalled();
339
+ }));`;
340
+ updatedSource = insertAtPosition(updatedSource, describeEnd, testsToAdd);
341
+ // Write updated content
342
+ tree.overwrite(testFilePath, updatedSource);
343
+ }
344
+ function updateImport(sourceFile, filePath, importPath, importValues) {
345
+ const importNode = findImportNode(sourceFile, importPath);
346
+ if (!importNode) {
347
+ return new change_1.NoopChange();
348
+ }
349
+ const importClause = importNode.importClause;
350
+ if (!importClause || !importClause.namedBindings || !ts.isNamedImports(importClause.namedBindings)) {
351
+ return new change_1.NoopChange();
352
+ }
353
+ const namedImports = importClause.namedBindings.elements.map((element) => element.name.text);
354
+ const missingImports = importValues.filter((value) => !namedImports.includes(value));
355
+ if (missingImports.length === 0) {
356
+ return new change_1.NoopChange();
357
+ }
358
+ const updatedImports = [...namedImports, ...missingImports].sort();
359
+ const newImportClauseText = `{ ${updatedImports.join(', ')} }`;
360
+ return new change_1.ReplaceChange(filePath, importNode.getStart(), importNode.getText(), `import ${newImportClauseText} from '${importPath}';`);
361
+ }
362
+ function addNatsServiceImport(sourceFile, filePath) {
363
+ const natsServiceImportNode = findImportNode(sourceFile, './services/nats.service');
364
+ if (natsServiceImportNode) {
365
+ return new change_1.NoopChange();
366
+ }
367
+ return new change_1.InsertChange(filePath, 0, `import { NatsService } from './services/nats.service';\n`);
368
+ }
369
+ function updateComponentImports(sourceFile, filePath, importValues) {
370
+ const componentDecorator = findComponentDecorator(sourceFile);
371
+ if (!componentDecorator) {
372
+ return new change_1.NoopChange();
373
+ }
374
+ const importsProperty = findPropertyInDecorator(componentDecorator, 'imports');
375
+ if (!importsProperty || !importsProperty.initializer || !ts.isArrayLiteralExpression(importsProperty.initializer)) {
376
+ return new change_1.NoopChange();
377
+ }
378
+ const currentImports = importsProperty.initializer.elements.map((element) => element.getText());
379
+ const missingImports = importValues.filter((value) => !currentImports.includes(value));
380
+ if (missingImports.length === 0) {
381
+ return new change_1.NoopChange();
382
+ }
383
+ // Build new imports array text
384
+ const updatedImports = [...currentImports, ...missingImports];
385
+ const newImportsText = `[${updatedImports.join(', ')}]`;
386
+ return new change_1.ReplaceChange(filePath, importsProperty.initializer.getStart(), importsProperty.initializer.getText(), newImportsText);
387
+ }
388
+ function addClassProperties(sourceFile, filePath, properties) {
389
+ const classDeclaration = findClassDeclaration(sourceFile);
390
+ if (!classDeclaration) {
391
+ return new change_1.NoopChange();
392
+ }
393
+ // Find position to insert properties (after last property declaration)
394
+ const members = classDeclaration.members;
395
+ let insertPosition = members.length > 0
396
+ ? members[0].getStart()
397
+ : classDeclaration.getStart() + classDeclaration.name.getEnd() - classDeclaration.name.getStart() + 1;
398
+ const propertiesText = properties.map(prop => ` ${prop}\n`).join('');
399
+ return new change_1.InsertChange(filePath, insertPosition, propertiesText);
400
+ }
401
+ function updateConstructor(sourceFile, filePath, parameters) {
402
+ const classDeclaration = findClassDeclaration(sourceFile);
403
+ if (!classDeclaration) {
404
+ return new change_1.NoopChange();
405
+ }
406
+ const constructorMethod = classDeclaration.members.find((member) => ts.isConstructorDeclaration(member));
407
+ if (!constructorMethod) {
408
+ // Add new constructor
409
+ const constructorText = `
410
+ constructor(${parameters.join(', ')}) {
411
+ this.headerPicker = {
412
+ label: 'Catalogs',
413
+ options: ['Option 1', 'Option 2', 'Option 3']
414
+ };
415
+ }
416
+ `;
417
+ return new change_1.InsertChange(filePath, classDeclaration.members[0].getStart(), constructorText);
418
+ }
419
+ // Update existing constructor parameters
420
+ const currentParameters = constructorMethod.parameters.map((param) => param.getText());
421
+ const missingParameters = parameters.filter((param) => !currentParameters.includes(param));
422
+ if (missingParameters.length === 0) {
423
+ return new change_1.NoopChange();
424
+ }
425
+ // Build new parameters text
426
+ const updatedParameters = [...currentParameters, ...missingParameters];
427
+ const newParametersText = updatedParameters.join(', ');
428
+ return new change_1.ReplaceChange(filePath, constructorMethod.parameters.pos, [...currentParameters].join(', '), newParametersText);
429
+ }
430
+ function updateNgOnInit(sourceFile, filePath, methodContent) {
431
+ const classDeclaration = findClassDeclaration(sourceFile);
432
+ if (!classDeclaration) {
433
+ return new change_1.NoopChange();
434
+ }
435
+ const ngOnInitMethod = classDeclaration.members.find((member) => ts.isMethodDeclaration(member) &&
436
+ member.name.getText() === 'ngOnInit');
437
+ if (!ngOnInitMethod) {
438
+ // Add new ngOnInit method
439
+ return new change_1.InsertChange(filePath, classDeclaration.members[0].getStart(), `\n ${methodContent}\n`);
440
+ }
441
+ return new change_1.ReplaceChange(filePath, ngOnInitMethod.getStart(), ngOnInitMethod.getText(), methodContent);
442
+ }
443
+ function updateNgOnDestroy(sourceFile, filePath, methodContent) {
444
+ const classDeclaration = findClassDeclaration(sourceFile);
445
+ if (!classDeclaration) {
446
+ return new change_1.NoopChange();
447
+ }
448
+ const ngOnDestroyMethod = classDeclaration.members.find((member) => ts.isMethodDeclaration(member) &&
449
+ member.name.getText() === 'ngOnDestroy');
450
+ if (!ngOnDestroyMethod) {
451
+ // Add new ngOnDestroy method
452
+ return new change_1.InsertChange(filePath, classDeclaration.members[0].getStart(), `\n ${methodContent}\n`);
453
+ }
454
+ return new change_1.ReplaceChange(filePath, ngOnDestroyMethod.getStart(), ngOnDestroyMethod.getText(), methodContent);
455
+ }
456
+ function addMethod(sourceFile, filePath, methodContent) {
457
+ const classDeclaration = findClassDeclaration(sourceFile);
458
+ if (!classDeclaration) {
459
+ return new change_1.NoopChange();
460
+ }
461
+ // Add method at the end of the class
462
+ const closeBracePosition = classDeclaration.getEnd() - 1;
463
+ return new change_1.InsertChange(filePath, closeBracePosition, `\n ${methodContent}\n`);
464
+ }
465
+ // Utility functions
466
+ function findImportNode(sourceFile, moduleName) {
467
+ return sourceFile.statements.find((statement) => ts.isImportDeclaration(statement) &&
468
+ statement.moduleSpecifier.getText().includes(moduleName));
469
+ }
470
+ function getSourceNodes(sourceFile) {
471
+ const nodes = [sourceFile];
472
+ function visit(node) {
473
+ nodes.push(node);
474
+ ts.forEachChild(node, visit);
475
+ }
476
+ ts.forEachChild(sourceFile, visit);
477
+ return nodes;
478
+ }
479
+ function findComponentDecorator(sourceFile) {
480
+ const nodes = getSourceNodes(sourceFile);
481
+ const decorator = nodes.find((node) => ts.isDecorator(node) &&
482
+ node.expression.getText().startsWith('Component'));
483
+ if (!decorator || !ts.isCallExpression(decorator.expression)) {
484
+ return undefined;
485
+ }
486
+ const argument = decorator.expression.arguments[0];
487
+ if (!argument || !ts.isObjectLiteralExpression(argument)) {
488
+ return undefined;
489
+ }
490
+ return argument;
491
+ }
492
+ function findPropertyInDecorator(decorator, propertyName) {
493
+ return decorator.properties.find((property) => ts.isPropertyAssignment(property) &&
494
+ property.name.getText() === propertyName);
495
+ }
496
+ function findClassDeclaration(sourceFile) {
497
+ return sourceFile.statements.find((statement) => ts.isClassDeclaration(statement));
498
+ }
499
+ function insertAtPosition(source, position, content) {
500
+ return source.substring(0, position) + content + source.substring(position);
501
+ }
502
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../projects/ngx-appshell/schematics/nats-notifications/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "http://json-schema.org/schema",
3
+ "$id": "nats-notifications",
4
+ "title": "AppShell Nats Notifications Schema",
5
+ "type": "object",
6
+ "properties": {},
7
+ "required": []
8
+ }
@@ -0,0 +1,85 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,400;0,500;0,700;1,400;1,500;1,700&display=swap');
2
+
3
+ @font-face {
4
+ font-family: 'AppShellTextFont';
5
+ src: local('Roboto'), local('Roboto Regular');
6
+ font-weight: normal;
7
+ font-style: normal;
8
+ }
9
+
10
+ @font-face {
11
+ font-family: 'AppShellTextFont';
12
+ src: local('Roboto'), local('Roboto Italic');
13
+ font-weight: normal;
14
+ font-style: italic;
15
+ }
16
+
17
+ @font-face {
18
+ font-family: 'AppShellTextFont';
19
+ src: local('Roboto'), local('Roboto Medium');
20
+ font-weight: 500;
21
+ font-style: normal;
22
+ }
23
+
24
+ @font-face {
25
+ font-family: 'AppShellTextFont';
26
+ src: local('Roboto'), local('Roboto Medium Italic');
27
+ font-weight: 500;
28
+ font-style: italic;
29
+ }
30
+
31
+ @font-face {
32
+ font-family: 'AppShellTextFont';
33
+ src: local('Roboto'), local('Roboto Bold');
34
+ font-weight: bold;
35
+ font-style: normal;
36
+ }
37
+
38
+ @font-face {
39
+ font-family: 'AppShellTextFont';
40
+ src: local('Roboto'), local('Roboto Bold Italic');
41
+ font-weight: bold;
42
+ font-style: italic;
43
+ }
44
+
45
+ @font-face {
46
+ font-family: 'AppShellHeadingFont';
47
+ src: local('Roboto'), local('Roboto Regular');
48
+ font-weight: normal;
49
+ font-style: normal;
50
+ }
51
+
52
+ @font-face {
53
+ font-family: 'AppShellHeadingFont';
54
+ src: local('Roboto'), local('Roboto Italic');
55
+ font-weight: normal;
56
+ font-style: italic;
57
+ }
58
+
59
+ @font-face {
60
+ font-family: 'AppShellHeadingFont';
61
+ src: local('Roboto'), local('Roboto Medium');
62
+ font-weight: 500;
63
+ font-style: normal;
64
+ }
65
+
66
+ @font-face {
67
+ font-family: 'AppShellHeadingFont';
68
+ src: local('Roboto'), local('Roboto Medium Italic');
69
+ font-weight: 500;
70
+ font-style: italic;
71
+ }
72
+
73
+ @font-face {
74
+ font-family: 'AppShellHeadingFont';
75
+ src: local('Roboto'), local('Roboto Bold');
76
+ font-weight: bold;
77
+ font-style: normal;
78
+ }
79
+
80
+ @font-face {
81
+ font-family: 'AppShellHeadingFont';
82
+ src: local('Roboto'), local('Roboto Bold Italic');
83
+ font-weight: bold;
84
+ font-style: italic;
85
+ }