@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.
- package/README.md +131 -0
- package/fesm2022/opendevstack-ngx-appshell.mjs +727 -0
- package/fesm2022/opendevstack-ngx-appshell.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/appshell-breadcrumb/appshell-breadcrumb.component.d.ts +7 -0
- package/lib/components/appshell-chip/appshell-chip.component.d.ts +6 -0
- package/lib/components/appshell-filters/appshell-filters.component.d.ts +12 -0
- package/lib/components/appshell-header/appshell-header.component.d.ts +24 -0
- package/lib/components/appshell-icon/appshell-icon.component.d.ts +12 -0
- package/lib/components/appshell-layout/appshell-layout.component.d.ts +25 -0
- package/lib/components/appshell-page-header/appshell-page-header.component.d.ts +18 -0
- package/lib/components/appshell-platform-header/appshell-platform-header.component.d.ts +37 -0
- package/lib/components/appshell-platform-layout/appshell-platform-layout.component.d.ts +30 -0
- package/lib/components/appshell-product-card/appshell-product-card.component.d.ts +23 -0
- package/lib/components/appshell-product-card-v2/appshell-product-card-v2.component.d.ts +16 -0
- package/lib/components/appshell-select/appshell-select.component.d.ts +9 -0
- package/lib/components/appshell-sidebar-menu/appshell-sidebar-menu.component.d.ts +12 -0
- package/lib/components/appshell-toast/appshell-toast.component.d.ts +9 -0
- package/lib/components/appshell-toasts/appshell-toasts.component.d.ts +14 -0
- package/lib/components/index.d.ts +15 -0
- package/lib/directives/appshell-link.directive.d.ts +15 -0
- package/lib/directives/index.d.ts +1 -0
- package/lib/models/appshell-button.d.ts +5 -0
- package/lib/models/appshell-filter.d.ts +4 -0
- package/lib/models/appshell-link.d.ts +6 -0
- package/lib/models/appshell-links-group.d.ts +5 -0
- package/lib/models/appshell-notification.d.ts +10 -0
- package/lib/models/appshell-picker.d.ts +9 -0
- package/lib/models/appshell-product.d.ts +12 -0
- package/lib/models/appshell-tag.d.ts +4 -0
- package/lib/models/appshell-toast.d.ts +6 -0
- package/lib/models/appshell-user.d.ts +5 -0
- package/lib/models/index.d.ts +10 -0
- package/lib/screens/appshell-notifications-screen/appshell-notifications-screen.component.d.ts +23 -0
- package/lib/screens/appshell-product-catalog-screen/appshell-product-catalog-screen.component.d.ts +16 -0
- package/lib/screens/appshell-product-view-screen/appshell-product-view-screen.component.d.ts +19 -0
- package/lib/screens/index.d.ts +3 -0
- package/lib/services/appshell-toast.service.d.ts +12 -0
- package/lib/services/icon-registry.service.d.ts +14 -0
- package/lib/services/index.d.ts +2 -0
- package/opendevstack-ngx-appshell-19.0.5.tgz +0 -0
- package/package.json +44 -0
- package/public-api.d.ts +5 -0
- package/schematics/azure-login/files/app-config/config.json.template +12 -0
- package/schematics/azure-login/files/app-config-service/app-config.service.spec.ts.template +48 -0
- package/schematics/azure-login/files/app-config-service/app-config.service.ts.template +39 -0
- package/schematics/azure-login/files/azure-config/azure.config.ts.template +94 -0
- package/schematics/azure-login/files/azure-service/azure.service.spec.ts.template +311 -0
- package/schematics/azure-login/files/azure-service/azure.service.ts.template +161 -0
- package/schematics/azure-login/index.d.ts +2 -0
- package/schematics/azure-login/index.js +325 -0
- package/schematics/azure-login/index.js.map +1 -0
- package/schematics/azure-login/schema.json +8 -0
- package/schematics/collection.json +19 -0
- package/schematics/nats-notifications/files/nats-service/nats.service.spec.ts.template +473 -0
- package/schematics/nats-notifications/files/nats-service/nats.service.ts.template +255 -0
- package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.html.template +7 -0
- package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.spec.ts.template +152 -0
- package/schematics/nats-notifications/files/notifications-screen/notifications-screen.component.ts.template +61 -0
- package/schematics/nats-notifications/index.d.ts +2 -0
- package/schematics/nats-notifications/index.js +502 -0
- package/schematics/nats-notifications/index.js.map +1 -0
- package/schematics/nats-notifications/schema.json +8 -0
- package/schematics/ng-add/files/_fonts.scss +85 -0
- package/schematics/ng-add/files/styles.scss +47 -0
- package/schematics/ng-add/index.d.ts +2 -0
- package/schematics/ng-add/index.js +442 -0
- package/schematics/ng-add/index.js.map +1 -0
- package/styles/appshell-typography-config.scss +19 -0
- package/styles/appshell.theme.scss +75 -0
- package/styles/palette.css +92 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
@use '@angular/material' as mat;
|
|
2
|
+
@use "@appshell/ngx-appshell/styles/appshell-typography-config" as config;
|
|
3
|
+
@use '@appshell/ngx-appshell/styles/appshell.theme.scss' as appshell;
|
|
4
|
+
@use "sass:map";
|
|
5
|
+
@use "fonts";
|
|
6
|
+
|
|
7
|
+
@include mat.typography-hierarchy(config.$appshell-typography);
|
|
8
|
+
|
|
9
|
+
:root {
|
|
10
|
+
--main-color: #{map.get(appshell.$appshell-primary-palette, 800)};
|
|
11
|
+
--main-color-contrast: #{map.get(appshell.$appshell-accent-palette, 500)};
|
|
12
|
+
--main-color-contrast-hover: #{map.get(appshell.$appshell-accent-palette, 200)};
|
|
13
|
+
--main-color-dark: #{map.get(appshell.$appshell-primary-palette, 900)};
|
|
14
|
+
--text-color-on-main-color: #{map.get(map.get(appshell.$appshell-primary-palette, contrast), 800)};
|
|
15
|
+
--background-color: #{map.get(appshell.$appshell-theme, background-color)};
|
|
16
|
+
--text-color-on-background: #{map.get(appshell.$appshell-primary-palette, 900)};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
html, body {
|
|
20
|
+
margin: 0;
|
|
21
|
+
padding: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
h1,h2,h3 {
|
|
25
|
+
font-family: AppShellHeadingFont!important;
|
|
26
|
+
font-weight: 500!important; // Needed since angular material theming for typographies is not working with all headings
|
|
27
|
+
}
|
|
28
|
+
h4,h5,h6 {
|
|
29
|
+
font-family: AppShellHeadingFont!important;
|
|
30
|
+
font-weight: 700!important; // Needed since angular material theming for typographies is not working with all headings
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
router-outlet+* {
|
|
34
|
+
width: 100%;
|
|
35
|
+
height: 100%;
|
|
36
|
+
background-color: var(--background-color);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.mat-mdc-tooltip>div {
|
|
40
|
+
background-color: var(--background-color)!important;
|
|
41
|
+
color: var(--text-color-on-background)!important;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.toast-container .appshell-toast .appshell-toast-content h4 {
|
|
45
|
+
line-clamp: unset!important;
|
|
46
|
+
-webkit-line-clamp: unset!important;
|
|
47
|
+
}
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ngAdd = ngAdd;
|
|
4
|
+
const schematics_1 = require("@angular-devkit/schematics");
|
|
5
|
+
const tasks_1 = require("@angular-devkit/schematics/tasks");
|
|
6
|
+
const ts = require("typescript");
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
function ngAdd() {
|
|
10
|
+
return (_tree, context) => {
|
|
11
|
+
context.logger.info('Adding ngx-appshell to your project');
|
|
12
|
+
context.logger.info('Installing packages...');
|
|
13
|
+
context.addTask(new tasks_1.NodePackageInstallTask());
|
|
14
|
+
return (0, schematics_1.chain)([
|
|
15
|
+
updateIndexHtml(),
|
|
16
|
+
createFontsFile(),
|
|
17
|
+
updateStylesScss(),
|
|
18
|
+
updateAngularJson(),
|
|
19
|
+
addRequiredProvidersInAppConfig(),
|
|
20
|
+
updateAppComponent()
|
|
21
|
+
]);
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function updateIndexHtml() {
|
|
25
|
+
return (tree, context) => {
|
|
26
|
+
const indexPath = 'src/index.html';
|
|
27
|
+
let content = readFileContent(tree, indexPath, context);
|
|
28
|
+
if (!content)
|
|
29
|
+
return tree;
|
|
30
|
+
// Add Google Fonts link to head if not present
|
|
31
|
+
const fontsLink = '<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght@200" />';
|
|
32
|
+
if (!content.includes('fonts.googleapis.com/css2?family=Material+Symbols+Outlined')) {
|
|
33
|
+
const headMatch = content.match(/<head([^>]*)>/);
|
|
34
|
+
if (headMatch) {
|
|
35
|
+
const headTag = headMatch[0];
|
|
36
|
+
content = content.replace(headTag, `${headTag}\n ${fontsLink}`);
|
|
37
|
+
context.logger.info(`Added Google Fonts link to head in ${indexPath}.`);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
context.logger.warn(`Could not find head tag in ${indexPath}.`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
context.logger.info(`Google Fonts link already present in ${indexPath}.`);
|
|
45
|
+
}
|
|
46
|
+
// Add mat-typography class to body if not present
|
|
47
|
+
const bodyMatch = content.match(/<body([^>]*)>/);
|
|
48
|
+
if (!bodyMatch) {
|
|
49
|
+
context.logger.error(`Could not find body tag in ${indexPath}.`);
|
|
50
|
+
tree.overwrite(indexPath, content);
|
|
51
|
+
return tree;
|
|
52
|
+
}
|
|
53
|
+
const [bodyTag, bodyAttrs = ''] = bodyMatch;
|
|
54
|
+
if (bodyAttrs.includes('mat-typography')) {
|
|
55
|
+
context.logger.info(`Class "mat-typography" already present in body tag.`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const newBodyTag = bodyAttrs.includes('class="')
|
|
59
|
+
? bodyTag.replace(/class="([^"]*)"/, 'class="$1 mat-typography"')
|
|
60
|
+
: bodyTag.replace(/<body/, '<body class="mat-typography"');
|
|
61
|
+
content = content.replace(bodyTag, newBodyTag);
|
|
62
|
+
context.logger.info(`Added class "mat-typography" to body tag in ${indexPath}.`);
|
|
63
|
+
}
|
|
64
|
+
tree.overwrite(indexPath, content);
|
|
65
|
+
return tree;
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function createFontsFile() {
|
|
69
|
+
return (tree, context) => {
|
|
70
|
+
const fontsPath = 'src/_fonts.scss';
|
|
71
|
+
const templatePath = (0, path_1.join)(__dirname, 'files/_fonts.scss');
|
|
72
|
+
const templateContent = (0, fs_1.readFileSync)(templatePath, 'utf-8');
|
|
73
|
+
tree.create(fontsPath, templateContent);
|
|
74
|
+
context.logger.info(`Created ${fontsPath}.`);
|
|
75
|
+
return tree;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function updateStylesScss() {
|
|
79
|
+
return (tree, context) => {
|
|
80
|
+
const stylesPath = 'src/styles.scss';
|
|
81
|
+
if (!tree.exists(stylesPath)) {
|
|
82
|
+
context.logger.error(`File ${stylesPath} does not exist.`);
|
|
83
|
+
return tree;
|
|
84
|
+
}
|
|
85
|
+
const templatePath = (0, path_1.join)(__dirname, 'files/styles.scss');
|
|
86
|
+
const templateContent = (0, fs_1.readFileSync)(templatePath, 'utf-8');
|
|
87
|
+
tree.overwrite(stylesPath, templateContent);
|
|
88
|
+
context.logger.info(`Replaced ${stylesPath} with required imports and styles.`);
|
|
89
|
+
return tree;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function updateAngularJson() {
|
|
93
|
+
return (tree, context) => {
|
|
94
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
95
|
+
const angularJsonPath = 'angular.json';
|
|
96
|
+
const content = readFileContent(tree, angularJsonPath, context);
|
|
97
|
+
if (!content)
|
|
98
|
+
return tree;
|
|
99
|
+
const angularJson = JSON.parse(content);
|
|
100
|
+
const paletteStyle = 'node_modules/@appshell/ngx-appshell/styles/palette.css';
|
|
101
|
+
const stylePreprocessorPath = 'node_modules/@appshell/ngx-appshell';
|
|
102
|
+
let updated = false;
|
|
103
|
+
const projects = angularJson.projects;
|
|
104
|
+
for (const projectName in projects) {
|
|
105
|
+
const project = projects[projectName];
|
|
106
|
+
const buildOptions = (_b = (_a = project === null || project === void 0 ? void 0 : project.architect) === null || _a === void 0 ? void 0 : _a.build) === null || _b === void 0 ? void 0 : _b.options;
|
|
107
|
+
const productionConfig = (_e = (_d = (_c = project === null || project === void 0 ? void 0 : project.architect) === null || _c === void 0 ? void 0 : _c.build) === null || _d === void 0 ? void 0 : _d.configurations) === null || _e === void 0 ? void 0 : _e.production;
|
|
108
|
+
const testOptions = (_g = (_f = project === null || project === void 0 ? void 0 : project.architect) === null || _f === void 0 ? void 0 : _f.test) === null || _g === void 0 ? void 0 : _g.options;
|
|
109
|
+
if (buildOptions) {
|
|
110
|
+
// Add palette.css to styles array
|
|
111
|
+
if (Array.isArray(buildOptions.styles)) {
|
|
112
|
+
if (!buildOptions.styles.includes(paletteStyle)) {
|
|
113
|
+
buildOptions.styles.push(paletteStyle);
|
|
114
|
+
updated = true;
|
|
115
|
+
context.logger.info(`Added palette.css to styles in project "${projectName}".`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
context.logger.info(`palette.css already present in project "${projectName}".`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Add stylePreprocessorOptions
|
|
122
|
+
if (!buildOptions.stylePreprocessorOptions) {
|
|
123
|
+
buildOptions.stylePreprocessorOptions = { includePaths: [] };
|
|
124
|
+
}
|
|
125
|
+
if (!buildOptions.stylePreprocessorOptions.includePaths) {
|
|
126
|
+
buildOptions.stylePreprocessorOptions.includePaths = [];
|
|
127
|
+
}
|
|
128
|
+
if (!buildOptions.stylePreprocessorOptions.includePaths.includes(stylePreprocessorPath)) {
|
|
129
|
+
buildOptions.stylePreprocessorOptions.includePaths.push(stylePreprocessorPath);
|
|
130
|
+
updated = true;
|
|
131
|
+
context.logger.info(`Added stylePreprocessorOptions includePath in project "${projectName}".`);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
context.logger.info(`stylePreprocessorOptions includePath already present in project "${projectName}".`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Clear styles in test configuration
|
|
138
|
+
if (testOptions) {
|
|
139
|
+
if (!testOptions.styles || testOptions.styles.length > 0) {
|
|
140
|
+
testOptions.styles = [];
|
|
141
|
+
updated = true;
|
|
142
|
+
context.logger.info(`Cleared test styles in project "${projectName}".`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Update budgets in production configuration
|
|
146
|
+
if (productionConfig) {
|
|
147
|
+
if (!productionConfig.budgets) {
|
|
148
|
+
productionConfig.budgets = [];
|
|
149
|
+
}
|
|
150
|
+
const requiredBudgets = [
|
|
151
|
+
{ type: 'initial', maximumWarning: '2MB', maximumError: '4MB' },
|
|
152
|
+
{ type: 'anyComponentStyle', maximumWarning: '2kB', maximumError: '4kB' }
|
|
153
|
+
];
|
|
154
|
+
for (const requiredBudget of requiredBudgets) {
|
|
155
|
+
const existingBudget = productionConfig.budgets.find((b) => b.type === requiredBudget.type);
|
|
156
|
+
if (existingBudget) {
|
|
157
|
+
const warningUpdated = updateBudgetValue(existingBudget, 'maximumWarning', requiredBudget.maximumWarning);
|
|
158
|
+
const errorUpdated = updateBudgetValue(existingBudget, 'maximumError', requiredBudget.maximumError);
|
|
159
|
+
if (warningUpdated || errorUpdated) {
|
|
160
|
+
updated = true;
|
|
161
|
+
context.logger.info(`Updated ${requiredBudget.type} budget in project "${projectName}".`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
productionConfig.budgets.push(requiredBudget);
|
|
166
|
+
updated = true;
|
|
167
|
+
context.logger.info(`Added ${requiredBudget.type} budget in project "${projectName}".`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (updated) {
|
|
173
|
+
tree.overwrite(angularJsonPath, JSON.stringify(angularJson, null, 2));
|
|
174
|
+
}
|
|
175
|
+
return tree;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function updateBudgetValue(budget, key, minValue) {
|
|
179
|
+
const parseSize = (size) => {
|
|
180
|
+
const units = { B: 1, kB: 1024, MB: 1024 * 1024, GB: 1024 * 1024 * 1024 };
|
|
181
|
+
const match = size.match(/^(\d+(?:\.\d+)?)\s*(B|kB|MB|GB)$/);
|
|
182
|
+
if (!match)
|
|
183
|
+
return 0;
|
|
184
|
+
return parseFloat(match[1]) * units[match[2]];
|
|
185
|
+
};
|
|
186
|
+
const currentSize = parseSize(budget[key] || '0B');
|
|
187
|
+
const requiredSize = parseSize(minValue);
|
|
188
|
+
if (currentSize < requiredSize) {
|
|
189
|
+
budget[key] = minValue;
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
function addRequiredProvidersInAppConfig() {
|
|
195
|
+
return (tree, context) => {
|
|
196
|
+
const appConfigPath = 'src/app/app.config.ts';
|
|
197
|
+
let content = readFileContent(tree, appConfigPath, context);
|
|
198
|
+
if (!content)
|
|
199
|
+
return tree;
|
|
200
|
+
let sourceFile = ts.createSourceFile(appConfigPath, content, ts.ScriptTarget.Latest, true);
|
|
201
|
+
content = addProviderIfMissing(content, sourceFile, 'provideAnimations', `import { provideAnimations } from '@angular/platform-browser/animations';`, 'provideAnimations()', context);
|
|
202
|
+
sourceFile = ts.createSourceFile(appConfigPath, content, ts.ScriptTarget.Latest, true);
|
|
203
|
+
content = addProviderIfMissing(content, sourceFile, 'provideHttpClient', `import { provideHttpClient, withFetch, withInterceptorsFromDi } from '@angular/common/http';`, 'provideHttpClient(withInterceptorsFromDi(), withFetch())', context);
|
|
204
|
+
sourceFile = ts.createSourceFile(appConfigPath, content, ts.ScriptTarget.Latest, true);
|
|
205
|
+
content = addObjectProviderIfMissing(content, sourceFile, 'MAT_FORM_FIELD_DEFAULT_OPTIONS', `import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';`, `{\n provide: MAT_FORM_FIELD_DEFAULT_OPTIONS,\n useValue: {\n subscriptSizing: 'dynamic'\n }\n }`, context);
|
|
206
|
+
sourceFile = ts.createSourceFile(appConfigPath, content, ts.ScriptTarget.Latest, true);
|
|
207
|
+
content = addAppInitializerProviderIfMissing(content, sourceFile, context);
|
|
208
|
+
tree.overwrite(appConfigPath, content);
|
|
209
|
+
context.logger.info(`Added required imports and providers in ${appConfigPath}.`);
|
|
210
|
+
return tree;
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function readFileContent(tree, filePath, context) {
|
|
214
|
+
if (!tree.exists(filePath)) {
|
|
215
|
+
context.logger.error(`File ${filePath} does not exist.`);
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
const buffer = tree.read(filePath);
|
|
219
|
+
if (!buffer) {
|
|
220
|
+
context.logger.error(`Could not read file ${filePath}.`);
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
return buffer.toString('utf-8');
|
|
224
|
+
}
|
|
225
|
+
function addProviderIfMissing(content, sourceFile, importName, importStatement, providerCall, context) {
|
|
226
|
+
const hasImport = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes(importName));
|
|
227
|
+
if (hasImport)
|
|
228
|
+
return content;
|
|
229
|
+
const providersMatch = content.match(/providers:\s*\[([\s\S]*?)\]/);
|
|
230
|
+
if (!providersMatch) {
|
|
231
|
+
context.logger.warn('Could not locate providers array to update');
|
|
232
|
+
return content;
|
|
233
|
+
}
|
|
234
|
+
const providersContent = providersMatch[1].trim();
|
|
235
|
+
const needsComma = providersContent.length > 0 && !providersContent.endsWith(',');
|
|
236
|
+
const updatedProviders = providersContent.length > 0
|
|
237
|
+
? `${providersContent}${needsComma ? ',' : ''}\n ${providerCall}`
|
|
238
|
+
: providerCall;
|
|
239
|
+
content = `${importStatement}\n${content}`;
|
|
240
|
+
content = content.replace(providersMatch[0], `providers: [\n ${updatedProviders}\n ]`);
|
|
241
|
+
context.logger.info(`Updated providers array to include ${importName}`);
|
|
242
|
+
return content;
|
|
243
|
+
}
|
|
244
|
+
function addObjectProviderIfMissing(content, sourceFile, importName, importStatement, providerObject, context) {
|
|
245
|
+
const hasImport = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes(importName));
|
|
246
|
+
if (hasImport) {
|
|
247
|
+
context.logger.info(`${importName} already imported, skipping provider addition`);
|
|
248
|
+
return content;
|
|
249
|
+
}
|
|
250
|
+
const providersMatch = content.match(/providers:\s*\[([\s\S]*?)\]/);
|
|
251
|
+
if (!providersMatch) {
|
|
252
|
+
context.logger.warn('Could not locate providers array to update');
|
|
253
|
+
return content;
|
|
254
|
+
}
|
|
255
|
+
const providersContent = providersMatch[1].trim();
|
|
256
|
+
const needsComma = providersContent.length > 0 && !providersContent.endsWith(',');
|
|
257
|
+
const updatedProviders = providersContent.length > 0
|
|
258
|
+
? `${providersContent}${needsComma ? ',' : ''}\n ${providerObject}`
|
|
259
|
+
: providerObject;
|
|
260
|
+
content = `${importStatement}\n${content}`;
|
|
261
|
+
content = content.replace(providersMatch[0], `providers: [\n ${updatedProviders}\n ]`);
|
|
262
|
+
context.logger.info(`Updated providers array to include ${importName}`);
|
|
263
|
+
return content;
|
|
264
|
+
}
|
|
265
|
+
function addAppInitializerProviderIfMissing(content, sourceFile, context) {
|
|
266
|
+
const hasIconRegistryImport = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes('IconRegistryService'));
|
|
267
|
+
if (hasIconRegistryImport) {
|
|
268
|
+
context.logger.info('IconRegistryService already imported, skipping app initializer provider');
|
|
269
|
+
return content;
|
|
270
|
+
}
|
|
271
|
+
const providersMatch = content.match(/providers:\s*\[([\s\S]*?)\]/);
|
|
272
|
+
if (!providersMatch) {
|
|
273
|
+
context.logger.warn('Could not locate providers array to update');
|
|
274
|
+
return content;
|
|
275
|
+
}
|
|
276
|
+
const providersContent = providersMatch[1].trim();
|
|
277
|
+
const needsComma = providersContent.length > 0 && !providersContent.endsWith(',');
|
|
278
|
+
const providerCode = `provideAppInitializer(() => {\n const iconService = inject(IconRegistryService);\n return iconService.registerIconsFromManifest('assets/icons.json');\n })`;
|
|
279
|
+
const updatedProviders = providersContent.length > 0
|
|
280
|
+
? `${providersContent}${needsComma ? ',' : ''}\n ${providerCode}`
|
|
281
|
+
: providerCode;
|
|
282
|
+
// Add necessary imports
|
|
283
|
+
const hasProvideAppInitializer = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes('provideAppInitializer'));
|
|
284
|
+
const hasInject = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes('inject'));
|
|
285
|
+
if (!hasProvideAppInitializer || !hasInject) {
|
|
286
|
+
// Check if there's already an import from @angular/core
|
|
287
|
+
const coreImportMatch = content.match(/import\s*{([^}]*)}\s*from\s*['"]@angular\/core['"]/);
|
|
288
|
+
if (coreImportMatch) {
|
|
289
|
+
const imports = coreImportMatch[1].split(',').map(i => i.trim());
|
|
290
|
+
const missingImports = [];
|
|
291
|
+
if (!hasProvideAppInitializer && !imports.includes('provideAppInitializer')) {
|
|
292
|
+
missingImports.push('provideAppInitializer');
|
|
293
|
+
}
|
|
294
|
+
if (!hasInject && !imports.includes('inject')) {
|
|
295
|
+
missingImports.push('inject');
|
|
296
|
+
}
|
|
297
|
+
if (missingImports.length > 0) {
|
|
298
|
+
const updatedImports = [...imports, ...missingImports].join(', ');
|
|
299
|
+
content = content.replace(coreImportMatch[0], `import { ${updatedImports} } from '@angular/core'`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
const neededImports = [];
|
|
304
|
+
if (!hasProvideAppInitializer)
|
|
305
|
+
neededImports.push('provideAppInitializer');
|
|
306
|
+
if (!hasInject)
|
|
307
|
+
neededImports.push('inject');
|
|
308
|
+
content = `import { ${neededImports.join(', ')} } from '@angular/core';\n${content}`;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
content = `import { IconRegistryService } from '@appshell/ngx-appshell';\n${content}`;
|
|
312
|
+
content = content.replace(providersMatch[0], `providers: [\n ${updatedProviders}\n ]`);
|
|
313
|
+
context.logger.info('Updated providers array to include icon registry app initializer');
|
|
314
|
+
return content;
|
|
315
|
+
}
|
|
316
|
+
function updateAppComponent() {
|
|
317
|
+
return (tree, context) => {
|
|
318
|
+
const appComponentPath = 'src/app/app.component.ts';
|
|
319
|
+
let content = readFileContent(tree, appComponentPath, context);
|
|
320
|
+
if (!content)
|
|
321
|
+
return tree;
|
|
322
|
+
let sourceFile = ts.createSourceFile(appComponentPath, content, ts.ScriptTarget.Latest, true);
|
|
323
|
+
// Check if MatIconRegistry is already imported
|
|
324
|
+
const hasMatIconRegistryImport = sourceFile.statements.some((node) => ts.isImportDeclaration(node) && node.getText().includes('MatIconRegistry'));
|
|
325
|
+
if (hasMatIconRegistryImport) {
|
|
326
|
+
context.logger.info('MatIconRegistry already imported in app.component.ts, skipping update');
|
|
327
|
+
return tree;
|
|
328
|
+
}
|
|
329
|
+
// Add MatIconRegistry import
|
|
330
|
+
const matIconRegistryImport = `import { MatIconRegistry } from '@angular/material/icon';`;
|
|
331
|
+
const firstImportMatch = content.match(/^import\s/m);
|
|
332
|
+
if (firstImportMatch) {
|
|
333
|
+
content = `${matIconRegistryImport}\n${content}`;
|
|
334
|
+
}
|
|
335
|
+
// Add MatIconRegistry to constructor parameters or create constructor if it doesn't exist
|
|
336
|
+
const constructorMatch = content.match(/constructor\s*\(([^)]*)\)/);
|
|
337
|
+
if (constructorMatch) {
|
|
338
|
+
const params = constructorMatch[1].trim();
|
|
339
|
+
const needsComma = params.length > 0 && !params.endsWith(',');
|
|
340
|
+
const newParam = 'private matIconReg: MatIconRegistry';
|
|
341
|
+
const updatedParams = params.length > 0
|
|
342
|
+
? `${params}${needsComma ? ',' : ''}\n ${newParam}`
|
|
343
|
+
: newParam;
|
|
344
|
+
content = content.replace(constructorMatch[0], `constructor(\n ${updatedParams}\n )`);
|
|
345
|
+
context.logger.info('Added MatIconRegistry parameter to constructor');
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
// No constructor exists, create one
|
|
349
|
+
const classBodyMatch = content.match(/export\s+class\s+\w+[^{]*\{/);
|
|
350
|
+
if (classBodyMatch) {
|
|
351
|
+
const classBodyStart = content.indexOf(classBodyMatch[0]) + classBodyMatch[0].length;
|
|
352
|
+
const beforeClassBody = content.substring(0, classBodyStart);
|
|
353
|
+
const afterClassBody = content.substring(classBodyStart);
|
|
354
|
+
const newConstructor = `\n\n constructor(private matIconReg: MatIconRegistry) {}\n`;
|
|
355
|
+
content = `${beforeClassBody}${newConstructor}${afterClassBody}`;
|
|
356
|
+
context.logger.info('Created constructor with MatIconRegistry parameter');
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
context.logger.warn('Could not find class declaration in app.component.ts');
|
|
360
|
+
return tree;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Check if class implements OnInit
|
|
364
|
+
const classMatch = content.match(/export\s+class\s+\w+\s+implements\s+([^{]+)\{/);
|
|
365
|
+
const implementsOnInit = classMatch && classMatch[1].includes('OnInit');
|
|
366
|
+
if (!implementsOnInit) {
|
|
367
|
+
// Add OnInit to implements clause
|
|
368
|
+
if (classMatch) {
|
|
369
|
+
const interfaces = classMatch[1].trim();
|
|
370
|
+
const updatedInterfaces = interfaces.length > 0
|
|
371
|
+
? `${interfaces}, OnInit`
|
|
372
|
+
: 'OnInit';
|
|
373
|
+
content = content.replace(classMatch[0], classMatch[0].replace(classMatch[1], ` ${updatedInterfaces} `));
|
|
374
|
+
context.logger.info('Added OnInit interface to class');
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
// No implements clause, add one
|
|
378
|
+
const classDeclarationMatch = content.match(/export\s+class\s+\w+\s*\{/);
|
|
379
|
+
if (classDeclarationMatch) {
|
|
380
|
+
content = content.replace(classDeclarationMatch[0], classDeclarationMatch[0].replace('{', 'implements OnInit {'));
|
|
381
|
+
context.logger.info('Added OnInit interface to class');
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// Check if OnInit is imported
|
|
385
|
+
const coreImportMatch = content.match(/import\s*{([^}]*)}\s*from\s*['"]@angular\/core['"]/);
|
|
386
|
+
if (coreImportMatch) {
|
|
387
|
+
const imports = coreImportMatch[1].split(',').map(i => i.trim());
|
|
388
|
+
if (!imports.includes('OnInit')) {
|
|
389
|
+
const updatedImports = [...imports, 'OnInit'].join(', ');
|
|
390
|
+
content = content.replace(coreImportMatch[0], `import { ${updatedImports} } from '@angular/core'`);
|
|
391
|
+
context.logger.info('Added OnInit to @angular/core imports');
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Add or update ngOnInit method
|
|
396
|
+
const ngOnInitMatch = content.match(/ngOnInit\s*\(\s*\)\s*:\s*\w+\s*\{/);
|
|
397
|
+
if (ngOnInitMatch) {
|
|
398
|
+
// ngOnInit exists, add the setDefaultFontSetClass call at the beginning
|
|
399
|
+
const methodBodyStart = content.indexOf('{', content.indexOf('ngOnInit'));
|
|
400
|
+
const insertPosition = methodBodyStart + 1;
|
|
401
|
+
const beforeInsert = content.substring(0, insertPosition);
|
|
402
|
+
const afterInsert = content.substring(insertPosition);
|
|
403
|
+
content = `${beforeInsert}\n this.matIconReg.setDefaultFontSetClass('material-symbols-outlined');${afterInsert}`;
|
|
404
|
+
context.logger.info('Added setDefaultFontSetClass call to existing ngOnInit method');
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
// ngOnInit doesn't exist, create it after the constructor
|
|
408
|
+
const constructorMatch = content.match(/constructor\s*\([^)]*\)\s*\{/);
|
|
409
|
+
if (constructorMatch) {
|
|
410
|
+
const constructorStartIndex = content.indexOf(constructorMatch[0]);
|
|
411
|
+
const constructorBodyStart = constructorStartIndex + constructorMatch[0].length;
|
|
412
|
+
// Find the matching closing brace for the constructor using brace counting
|
|
413
|
+
let braceCount = 1;
|
|
414
|
+
let constructorEnd = constructorBodyStart;
|
|
415
|
+
for (let i = constructorBodyStart; i < content.length && braceCount > 0; i++) {
|
|
416
|
+
if (content[i] === '{') {
|
|
417
|
+
braceCount++;
|
|
418
|
+
}
|
|
419
|
+
else if (content[i] === '}') {
|
|
420
|
+
braceCount--;
|
|
421
|
+
if (braceCount === 0) {
|
|
422
|
+
constructorEnd = i + 1;
|
|
423
|
+
break;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
const beforeConstructor = content.substring(0, constructorEnd);
|
|
428
|
+
const afterConstructor = content.substring(constructorEnd);
|
|
429
|
+
const ngOnInitMethod = `\n\n ngOnInit(): void {\n this.matIconReg.setDefaultFontSetClass('material-symbols-outlined');\n }`;
|
|
430
|
+
content = `${beforeConstructor}${ngOnInitMethod}${afterConstructor}`;
|
|
431
|
+
context.logger.info('Created ngOnInit method with setDefaultFontSetClass call');
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
context.logger.warn('Could not find suitable location to add ngOnInit method');
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
tree.overwrite(appComponentPath, content);
|
|
438
|
+
context.logger.info(`Updated ${appComponentPath} with MatIconRegistry configuration`);
|
|
439
|
+
return tree;
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../projects/ngx-appshell/schematics/ng-add/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
@use '@angular/material' as mat;
|
|
2
|
+
|
|
3
|
+
$heading-font-family: 'AppShellHeadingFont';
|
|
4
|
+
$regular-font-family: 'AppShellTextFont';
|
|
5
|
+
|
|
6
|
+
$appshell-typography: mat.m2-define-typography-config(
|
|
7
|
+
$font-family: $regular-font-family,
|
|
8
|
+
$headline-1: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 112px),
|
|
9
|
+
$headline-2: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 56px),
|
|
10
|
+
$headline-3: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 45px),
|
|
11
|
+
$headline-4: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 34px),
|
|
12
|
+
$headline-5: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 24px),
|
|
13
|
+
$headline-6: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 20px),
|
|
14
|
+
$subtitle-1: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 18px),
|
|
15
|
+
$subtitle-2: mat.m2-define-typography-level($font-family: $heading-font-family, $font-size: 18px),
|
|
16
|
+
$body-2: mat.m2-define-typography-level($font-size: 16px),
|
|
17
|
+
$body-1: mat.m2-define-typography-level($font-size: 16px),
|
|
18
|
+
$button: mat.m2-define-typography-level($font-size: 16px),
|
|
19
|
+
);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
@use '@angular/material' as mat;
|
|
2
|
+
@use "./appshell-typography-config" as config;
|
|
3
|
+
|
|
4
|
+
@include mat.elevation-classes();
|
|
5
|
+
@include mat.app-background();
|
|
6
|
+
|
|
7
|
+
$appshell-primary-palette: (
|
|
8
|
+
200: var(--appshell-color-secondary-light),
|
|
9
|
+
600: var(--appshell-color-secondary-medium),
|
|
10
|
+
800: var(--appshell-color-secondary-main),
|
|
11
|
+
900: var(--appshell-color-secondary-dark),
|
|
12
|
+
contrast: (
|
|
13
|
+
200: var(--appshell-color-black-main),
|
|
14
|
+
600: var(--appshell-color-secondary-contrast),
|
|
15
|
+
800: var(--appshell-color-secondary-contrast),
|
|
16
|
+
900: var(--appshell-color-secondary-contrast),
|
|
17
|
+
)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
$appshell-accent-palette: (
|
|
21
|
+
100: var(--appshell-color-accent-green-light),
|
|
22
|
+
200: var(--appshell-color-accent-green-medium),
|
|
23
|
+
500: var(--appshell-color-accent-green-main),
|
|
24
|
+
600: var(--appshell-color-accent-green-dark),
|
|
25
|
+
contrast: (
|
|
26
|
+
100: var(--appshell-color-accent-green-contrast),
|
|
27
|
+
200: var(--appshell-color-accent-green-contrast),
|
|
28
|
+
500: var(--appshell-color-accent-green-contrast),
|
|
29
|
+
600: var(--appshell-color-accent-green-neutral),
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
$appshell-warn-palette: (
|
|
34
|
+
100: var(--appshell-color-danger-main),
|
|
35
|
+
500: var(--appshell-color-danger-medium),
|
|
36
|
+
800: var(--appshell-color-danger-dark),
|
|
37
|
+
contrast: (
|
|
38
|
+
100: var(--appshell-color-black-main),
|
|
39
|
+
500: var(--appshell-color-white-main),
|
|
40
|
+
800: var(--appshell-color-white-main),
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
$appshell-primary: mat.m2-define-palette($appshell-primary-palette, 800, 600, 900, 200);
|
|
45
|
+
$appshell-accent: mat.m2-define-palette($appshell-accent-palette, 500, 200, 600, 100);
|
|
46
|
+
$appshell-warn: mat.m2-define-palette($appshell-warn-palette, 500, 100, 800);
|
|
47
|
+
|
|
48
|
+
$appshell-theme: mat.m2-define-light-theme((
|
|
49
|
+
color: (
|
|
50
|
+
primary: $appshell-primary,
|
|
51
|
+
accent: $appshell-accent,
|
|
52
|
+
warn: $appshell-warn
|
|
53
|
+
),
|
|
54
|
+
typography: config.$appshell-typography,
|
|
55
|
+
density: 0,
|
|
56
|
+
background-color: #ffffff,
|
|
57
|
+
));
|
|
58
|
+
|
|
59
|
+
button {
|
|
60
|
+
&:hover {
|
|
61
|
+
background-color: var(--main-color-contrast-hover);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
&:focus:focus-visible {
|
|
65
|
+
outline: 2px solid #0069E5;
|
|
66
|
+
outline-offset: .2rem;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
a:focus:focus-visible {
|
|
71
|
+
outline: 2px solid #0069E5;
|
|
72
|
+
outline-offset: .2rem;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@include mat.all-component-themes($appshell-theme);
|