mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
133 lines
7.3 KiB
133 lines
7.3 KiB
"use strict";
|
|
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.dev/license
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.addThemeToAppStyles = addThemeToAppStyles;
|
|
const core_1 = require("@angular-devkit/core");
|
|
const schematics_1 = require("@angular-devkit/schematics");
|
|
const schematics_2 = require("@angular/cdk/schematics");
|
|
const change_1 = require("@schematics/angular/utility/change");
|
|
const utility_1 = require("@schematics/angular/utility");
|
|
const path_1 = require("path");
|
|
const create_theme_1 = require("./create-theme");
|
|
/** Path segment that can be found in paths that refer to a prebuilt theme. */
|
|
const prebuiltThemePathSegment = '@angular/material/prebuilt-themes';
|
|
/** Default file name of the custom theme that can be generated. */
|
|
const defaultThemeFilename = 'material-theme.scss';
|
|
/** Add pre-built styles to the main project style file. */
|
|
function addThemeToAppStyles(options) {
|
|
return (host, context) => {
|
|
let palettes = options.theme || 'azure-blue';
|
|
// For a long time, theme param could be "custom" which meant to add a custom theme. This option
|
|
// was removed since we always add a custom theme, and we expect this option to be the
|
|
// user's preferred palettes. However it's possible that users will have hardcoded CLI commands
|
|
// that pass "--theme custom" and we can gracefully handle this by assuming azure-blue.
|
|
if (palettes === 'custom') {
|
|
palettes = 'azure-blue';
|
|
}
|
|
return insertTheme(palettes, options.project, host, context.logger);
|
|
};
|
|
}
|
|
/**
|
|
* Insert an Angular Material theme to project style file. If no valid style file could be found,
|
|
* a new Sass file for the theme will be created.
|
|
*/
|
|
async function insertTheme(palettes, projectName, host, logger) {
|
|
const workspace = await (0, utility_1.readWorkspace)(host);
|
|
const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
|
|
const stylesPath = (0, schematics_2.getProjectStyleFile)(project, 'scss');
|
|
const themeContent = (0, create_theme_1.createTheme)(palettes);
|
|
if (!stylesPath) {
|
|
if (!project.sourceRoot) {
|
|
throw new schematics_1.SchematicsException(`Could not find source root for project: "${projectName}". ` +
|
|
`Please make sure that the "sourceRoot" property is set in the workspace config.`);
|
|
}
|
|
// Normalize the path through the devkit utilities because we want to avoid having
|
|
// unnecessary path segments and windows backslash delimiters.
|
|
const themePath = (0, core_1.normalize)((0, path_1.join)(project.sourceRoot, defaultThemeFilename));
|
|
if (host.exists(themePath)) {
|
|
logger.warn(`Cannot create an Angular Material theme because
|
|
${themePath} already exists. Skipping theme generation.`);
|
|
return (0, schematics_1.noop)();
|
|
}
|
|
host.create(themePath, themeContent);
|
|
return addThemeStyleToTarget(projectName, 'build', themePath, logger);
|
|
}
|
|
const insertion = new change_1.InsertChange(stylesPath, 0, themeContent);
|
|
const recorder = host.beginUpdate(stylesPath);
|
|
recorder.insertLeft(insertion.pos, insertion.toAdd);
|
|
host.commitUpdate(recorder);
|
|
return (0, schematics_1.noop)();
|
|
}
|
|
/** Adds a theming style entry to the given project target options. */
|
|
function addThemeStyleToTarget(projectName, targetName, assetPath, logger) {
|
|
return (0, utility_1.updateWorkspace)(workspace => {
|
|
const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
|
|
// Do not update the builder options in case the target does not use the default CLI builder.
|
|
if (!validateDefaultTargetBuilder(project, targetName, logger)) {
|
|
return;
|
|
}
|
|
const targetOptions = (0, schematics_2.getProjectTargetOptions)(project, targetName);
|
|
const styles = targetOptions['styles'];
|
|
if (!styles) {
|
|
targetOptions['styles'] = [assetPath];
|
|
}
|
|
else {
|
|
const existingStyles = styles.map(s => (typeof s === 'string' ? s : s.input));
|
|
for (let [index, stylePath] of existingStyles.entries()) {
|
|
// If the given asset is already specified in the styles, we don't need to do anything.
|
|
if (stylePath === assetPath) {
|
|
return;
|
|
}
|
|
// In case a prebuilt theme is already set up, we can safely replace the theme with the new
|
|
// theme file. If a custom theme is set up, we are not able to safely replace the custom
|
|
// theme because these files can contain custom styles, while prebuilt themes are
|
|
// always packaged and considered replaceable.
|
|
if (stylePath.includes(defaultThemeFilename)) {
|
|
logger.error(`Could not add the selected theme to the CLI project ` +
|
|
`configuration because there is already a theme file referenced.`);
|
|
logger.info(`Please manually add the following style file to your configuration:`);
|
|
logger.info(` ${assetPath}`);
|
|
return;
|
|
}
|
|
else if (stylePath.includes(prebuiltThemePathSegment)) {
|
|
styles.splice(index, 1);
|
|
}
|
|
}
|
|
styles.unshift(assetPath);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* Validates that the specified project target is configured with the default builders which are
|
|
* provided by the Angular CLI. If the configured builder does not match the default builder,
|
|
* this function can either throw or just show a warning.
|
|
*/
|
|
function validateDefaultTargetBuilder(project, targetName, logger) {
|
|
const targets = targetName === 'test' ? (0, schematics_2.getProjectTestTargets)(project) : (0, schematics_2.getProjectBuildTargets)(project);
|
|
const isDefaultBuilder = targets.length > 0;
|
|
// Because the build setup for the Angular CLI can be customized by developers, we can't know
|
|
// where to put the theme file in the workspace configuration if custom builders are being
|
|
// used. In case the builder has been changed for the "build" target, we throw an error and
|
|
// exit because setting up a theme is a primary goal of `ng-add`. Otherwise if just the "test"
|
|
// builder has been changed, we warn because a theme is not mandatory for running tests
|
|
// with Material. See: https://github.com/angular/components/issues/14176
|
|
if (!isDefaultBuilder && targetName === 'build') {
|
|
throw new schematics_1.SchematicsException(`Your project is not using the default builders for ` +
|
|
`"${targetName}". The Angular Material schematics cannot add a theme to the workspace ` +
|
|
`configuration if the builder has been changed.`);
|
|
}
|
|
else if (!isDefaultBuilder) {
|
|
// for non-build targets we gracefully report the error without actually aborting the
|
|
// setup schematic. This is because a theme is not mandatory for running tests.
|
|
logger.warn(`Your project is not using the default builders for "${targetName}". This ` +
|
|
`means that we cannot add the configured theme to the "${targetName}" target.`);
|
|
}
|
|
return isDefaultBuilder;
|
|
}
|
|
//# sourceMappingURL=theming.js.map
|