jqwidgets-ng 18.0.0 → 18.1.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 (159) hide show
  1. package/package.json +1 -1
  2. package/schematics/cdk/schematics/collection.json +2 -1
  3. package/schematics/cdk/schematics/index.d.ts +2 -1
  4. package/schematics/cdk/schematics/index.js +4 -4
  5. package/schematics/cdk/schematics/index.mjs +4 -4
  6. package/schematics/cdk/schematics/migration.json +4 -39
  7. package/schematics/cdk/schematics/ng-add/index.js +1 -1
  8. package/schematics/cdk/schematics/ng-add/index.mjs +1 -1
  9. package/schematics/cdk/schematics/ng-generate/drag-drop/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.spec.ts.template +6 -10
  10. package/schematics/cdk/schematics/ng-generate/drag-drop/files/__path__/__name@dasherize@if-flat__/__name@dasherize__.component.ts.template +7 -5
  11. package/schematics/cdk/schematics/ng-generate/drag-drop/index.js +9 -15
  12. package/schematics/cdk/schematics/ng-generate/drag-drop/index.mjs +9 -15
  13. package/schematics/cdk/schematics/ng-generate/drag-drop/schema.json +7 -0
  14. package/schematics/cdk/schematics/ng-update/data/attribute-selectors.js +2 -13
  15. package/schematics/cdk/schematics/ng-update/data/attribute-selectors.mjs +2 -13
  16. package/schematics/cdk/schematics/ng-update/data/class-names.js +2 -32
  17. package/schematics/cdk/schematics/ng-update/data/class-names.mjs +2 -32
  18. package/schematics/cdk/schematics/ng-update/data/constructor-checks.d.ts +1 -1
  19. package/schematics/cdk/schematics/ng-update/data/constructor-checks.js +2 -59
  20. package/schematics/cdk/schematics/ng-update/data/constructor-checks.mjs +2 -59
  21. package/schematics/cdk/schematics/ng-update/data/css-selectors.js +2 -5
  22. package/schematics/cdk/schematics/ng-update/data/css-selectors.mjs +2 -5
  23. package/schematics/cdk/schematics/ng-update/data/element-selectors.js +2 -5
  24. package/schematics/cdk/schematics/ng-update/data/element-selectors.mjs +2 -5
  25. package/schematics/cdk/schematics/ng-update/data/input-names.js +2 -95
  26. package/schematics/cdk/schematics/ng-update/data/input-names.mjs +2 -95
  27. package/schematics/cdk/schematics/ng-update/data/method-call-checks.js +2 -47
  28. package/schematics/cdk/schematics/ng-update/data/method-call-checks.mjs +2 -47
  29. package/schematics/cdk/schematics/ng-update/data/output-names.js +2 -19
  30. package/schematics/cdk/schematics/ng-update/data/output-names.mjs +2 -19
  31. package/schematics/cdk/schematics/ng-update/data/property-names.js +2 -127
  32. package/schematics/cdk/schematics/ng-update/data/property-names.mjs +2 -127
  33. package/schematics/cdk/schematics/ng-update/devkit-file-system.js +10 -6
  34. package/schematics/cdk/schematics/ng-update/devkit-file-system.mjs +10 -6
  35. package/schematics/cdk/schematics/ng-update/devkit-migration-rule.d.ts +2 -2
  36. package/schematics/cdk/schematics/ng-update/devkit-migration-rule.js +6 -14
  37. package/schematics/cdk/schematics/ng-update/devkit-migration-rule.mjs +6 -14
  38. package/schematics/cdk/schematics/ng-update/devkit-migration.d.ts +5 -5
  39. package/schematics/cdk/schematics/ng-update/devkit-migration.js +1 -1
  40. package/schematics/cdk/schematics/ng-update/devkit-migration.mjs +1 -1
  41. package/schematics/cdk/schematics/ng-update/find-stylesheets.js +2 -2
  42. package/schematics/cdk/schematics/ng-update/find-stylesheets.mjs +2 -2
  43. package/schematics/cdk/schematics/ng-update/html-parsing/elements.d.ts +1 -2
  44. package/schematics/cdk/schematics/ng-update/html-parsing/elements.js +2 -3
  45. package/schematics/cdk/schematics/ng-update/html-parsing/elements.mjs +2 -3
  46. package/schematics/cdk/schematics/ng-update/index.d.ts +2 -16
  47. package/schematics/cdk/schematics/ng-update/index.js +7 -43
  48. package/schematics/cdk/schematics/ng-update/index.mjs +7 -43
  49. package/schematics/cdk/schematics/ng-update/migrations/attribute-selectors.js +5 -8
  50. package/schematics/cdk/schematics/ng-update/migrations/attribute-selectors.mjs +5 -8
  51. package/schematics/cdk/schematics/ng-update/migrations/class-inheritance.js +8 -11
  52. package/schematics/cdk/schematics/ng-update/migrations/class-inheritance.mjs +8 -11
  53. package/schematics/cdk/schematics/ng-update/migrations/class-names.js +12 -15
  54. package/schematics/cdk/schematics/ng-update/migrations/class-names.mjs +12 -15
  55. package/schematics/cdk/schematics/ng-update/migrations/constructor-signature.js +7 -10
  56. package/schematics/cdk/schematics/ng-update/migrations/constructor-signature.mjs +7 -10
  57. package/schematics/cdk/schematics/ng-update/migrations/css-selectors.js +5 -8
  58. package/schematics/cdk/schematics/ng-update/migrations/css-selectors.mjs +5 -8
  59. package/schematics/cdk/schematics/ng-update/migrations/element-selectors.js +5 -8
  60. package/schematics/cdk/schematics/ng-update/migrations/element-selectors.mjs +5 -8
  61. package/schematics/cdk/schematics/ng-update/migrations/input-names.js +5 -8
  62. package/schematics/cdk/schematics/ng-update/migrations/input-names.mjs +5 -8
  63. package/schematics/cdk/schematics/ng-update/migrations/method-call-arguments.js +5 -8
  64. package/schematics/cdk/schematics/ng-update/migrations/method-call-arguments.mjs +5 -8
  65. package/schematics/cdk/schematics/ng-update/migrations/misc-template.js +4 -20
  66. package/schematics/cdk/schematics/ng-update/migrations/misc-template.mjs +4 -20
  67. package/schematics/cdk/schematics/ng-update/migrations/output-names.js +5 -8
  68. package/schematics/cdk/schematics/ng-update/migrations/output-names.mjs +5 -8
  69. package/schematics/cdk/schematics/ng-update/migrations/property-names.js +5 -8
  70. package/schematics/cdk/schematics/ng-update/migrations/property-names.mjs +5 -8
  71. package/schematics/cdk/schematics/ng-update/migrations/symbol-removal.js +6 -10
  72. package/schematics/cdk/schematics/ng-update/migrations/symbol-removal.mjs +6 -10
  73. package/schematics/cdk/schematics/ng-update/public-api.d.ts +2 -0
  74. package/schematics/cdk/schematics/ng-update/public-api.js +3 -1
  75. package/schematics/cdk/schematics/ng-update/public-api.mjs +3 -1
  76. package/schematics/cdk/schematics/ng-update/upgrade-data.js +4 -1
  77. package/schematics/cdk/schematics/ng-update/upgrade-data.mjs +4 -1
  78. package/schematics/cdk/schematics/tsconfig.json +1 -0
  79. package/schematics/cdk/schematics/update-tool/component-resource-collector.d.ts +1 -0
  80. package/schematics/cdk/schematics/update-tool/component-resource-collector.js +34 -15
  81. package/schematics/cdk/schematics/update-tool/component-resource-collector.mjs +34 -15
  82. package/schematics/cdk/schematics/update-tool/file-system.d.ts +3 -3
  83. package/schematics/cdk/schematics/update-tool/file-system.js +1 -1
  84. package/schematics/cdk/schematics/update-tool/file-system.mjs +1 -1
  85. package/schematics/cdk/schematics/update-tool/index.d.ts +6 -2
  86. package/schematics/cdk/schematics/update-tool/index.js +27 -11
  87. package/schematics/cdk/schematics/update-tool/index.mjs +27 -11
  88. package/schematics/cdk/schematics/update-tool/migration.d.ts +13 -7
  89. package/schematics/cdk/schematics/update-tool/migration.js +14 -4
  90. package/schematics/cdk/schematics/update-tool/migration.mjs +14 -4
  91. package/schematics/cdk/schematics/update-tool/public-api.d.ts +1 -0
  92. package/schematics/cdk/schematics/update-tool/public-api.js +2 -1
  93. package/schematics/cdk/schematics/update-tool/public-api.mjs +2 -1
  94. package/schematics/cdk/schematics/update-tool/target-version.d.ts +1 -8
  95. package/schematics/cdk/schematics/update-tool/target-version.js +3 -10
  96. package/schematics/cdk/schematics/update-tool/target-version.mjs +3 -10
  97. package/schematics/cdk/schematics/update-tool/utils/decorators.d.ts +1 -1
  98. package/schematics/cdk/schematics/update-tool/utils/diagnostics.d.ts +11 -0
  99. package/schematics/cdk/schematics/update-tool/utils/diagnostics.js +19 -0
  100. package/schematics/cdk/schematics/update-tool/utils/diagnostics.mjs +19 -0
  101. package/schematics/cdk/schematics/update-tool/utils/parse-tsconfig.d.ts +8 -0
  102. package/schematics/cdk/schematics/update-tool/utils/parse-tsconfig.js +30 -4
  103. package/schematics/cdk/schematics/update-tool/utils/parse-tsconfig.mjs +30 -4
  104. package/schematics/cdk/schematics/update-tool/utils/property-name.d.ts +1 -1
  105. package/schematics/cdk/schematics/update-tool/utils/virtual-host.d.ts +2 -0
  106. package/schematics/cdk/schematics/update-tool/utils/virtual-host.js +13 -3
  107. package/schematics/cdk/schematics/update-tool/utils/virtual-host.mjs +13 -3
  108. package/schematics/cdk/schematics/update-tool/version-changes.d.ts +3 -3
  109. package/schematics/cdk/schematics/utils/ast.d.ts +2 -2
  110. package/schematics/cdk/schematics/utils/ast.js +15 -25
  111. package/schematics/cdk/schematics/utils/ast.mjs +15 -25
  112. package/schematics/cdk/schematics/utils/build-component.js +22 -27
  113. package/schematics/cdk/schematics/utils/build-component.mjs +22 -27
  114. package/schematics/cdk/schematics/utils/get-project.d.ts +2 -2
  115. package/schematics/cdk/schematics/utils/get-project.js +7 -2
  116. package/schematics/cdk/schematics/utils/get-project.mjs +7 -2
  117. package/schematics/cdk/schematics/utils/html-manipulation.d.ts +1 -1
  118. package/schematics/cdk/schematics/utils/html-manipulation.js +2 -2
  119. package/schematics/cdk/schematics/utils/html-manipulation.mjs +2 -2
  120. package/schematics/cdk/schematics/utils/index.d.ts +1 -0
  121. package/schematics/cdk/schematics/utils/index.js +2 -1
  122. package/schematics/cdk/schematics/utils/index.mjs +2 -1
  123. package/schematics/cdk/schematics/utils/parse5-element.d.ts +3 -1
  124. package/schematics/cdk/schematics/utils/parse5-element.js +1 -1
  125. package/schematics/cdk/schematics/utils/parse5-element.mjs +1 -1
  126. package/schematics/cdk/schematics/utils/project-index-file.d.ts +2 -3
  127. package/schematics/cdk/schematics/utils/project-index-file.js +4 -4
  128. package/schematics/cdk/schematics/utils/project-index-file.mjs +4 -4
  129. package/schematics/cdk/schematics/utils/project-main-file.d.ts +2 -3
  130. package/schematics/cdk/schematics/utils/project-main-file.js +6 -3
  131. package/schematics/cdk/schematics/utils/project-main-file.mjs +6 -3
  132. package/schematics/cdk/schematics/utils/project-style-file.d.ts +2 -2
  133. package/schematics/cdk/schematics/utils/project-style-file.js +4 -3
  134. package/schematics/cdk/schematics/utils/project-style-file.mjs +4 -3
  135. package/schematics/cdk/schematics/utils/project-targets.d.ts +6 -10
  136. package/schematics/cdk/schematics/utils/project-targets.js +18 -13
  137. package/schematics/cdk/schematics/utils/project-targets.mjs +18 -13
  138. package/schematics/cdk/schematics/utils/project-tsconfig-paths.d.ts +3 -3
  139. package/schematics/cdk/schematics/utils/project-tsconfig-paths.js +14 -29
  140. package/schematics/cdk/schematics/utils/project-tsconfig-paths.mjs +14 -29
  141. package/schematics/cdk/schematics/utils/schematic-options.d.ts +5 -2
  142. package/schematics/cdk/schematics/utils/schematic-options.js +25 -5
  143. package/schematics/cdk/schematics/utils/schematic-options.mjs +25 -5
  144. package/schematics/fonts/material-fonts.js +8 -19
  145. package/schematics/fonts/material-fonts.mjs +35 -0
  146. package/schematics/ng-add/schema.json +1 -0
  147. package/schematics/theming/create-custom-theme.d.ts +9 -2
  148. package/schematics/theming/create-custom-theme.js +51 -11
  149. package/schematics/theming/create-custom-theme.mjs +51 -0
  150. package/schematics/theming/theming.d.ts +13 -6
  151. package/schematics/theming/theming.js +167 -179
  152. package/schematics/theming/theming.mjs +152 -0
  153. package/schematics/theming/theming2.js +179 -0
  154. package/schematics/cdk/schematics/ng-update/migrations/tilde-import-v13/tilde-import-migration.d.ts +0 -14
  155. package/schematics/cdk/schematics/ng-update/migrations/tilde-import-v13/tilde-import-migration.js +0 -39
  156. package/schematics/cdk/schematics/ng-update/migrations/tilde-import-v13/tilde-import-migration.mjs +0 -39
  157. package/schematics/cdk/schematics/utils/vendored-ast-utils/index.d.ts +0 -70
  158. package/schematics/cdk/schematics/utils/vendored-ast-utils/index.js +0 -480
  159. package/schematics/cdk/schematics/utils/vendored-ast-utils/index.mjs +0 -480
@@ -1,179 +1,167 @@
1
- "use strict";
2
- /**
3
- * @license
4
- * Copyright Google LLC All Rights Reserved.
5
- *
6
- * Use of this source code is governed by an MIT-style license that can be
7
- * found in the LICENSE file at https://angular.io/license
8
- */
9
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
10
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
11
- return new (P || (P = Promise))(function (resolve, reject) {
12
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
13
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
14
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
15
- step((generator = generator.apply(thisArg, _arguments || [])).next());
16
- });
17
- };
18
- Object.defineProperty(exports, "__esModule", { value: true });
19
- exports.addTypographyClass = exports.addThemeToAppStyles = void 0;
20
- const core_1 = require("@angular-devkit/core");
21
- const schematics_1 = require("@angular-devkit/schematics");
22
- const schematics_2 = require("jqwidgets-ng/schematics/cdk/schematics");
23
- const change_1 = require("@schematics/angular/utility/change");
24
- const workspace_1 = require("@schematics/angular/utility/workspace");
25
- const path_1 = require("path");
26
- const create_custom_theme_1 = require("./create-custom-theme");
27
- /** Path segment that can be found in paths that refer to a prebuilt theme. */
28
- let prebuiltThemePathSegment = 'jqwidgets-ng/jqwidgets/styles';
29
- /** Default file name of the custom theme that can be generated. */
30
- const defaultCustomThemeFilename = 'custom-theme.scss';
31
- /** Add pre-built styles to the main project style file. */
32
- function addThemeToAppStyles(options) {
33
- return (host, context) => {
34
- const themeName = options.theme || 'base';
35
-
36
- return themeName === 'custom' ?
37
- insertCustomTheme(options.project, host, context.logger) :
38
- insertPrebuiltTheme(options.project, 'jqx.' + themeName, context.logger);
39
- };
40
- }
41
- exports.addThemeToAppStyles = addThemeToAppStyles;
42
- /** Adds the global typography class to the body element. */
43
- function addTypographyClass(options) {
44
- return (host) => __awaiter(this, void 0, void 0, function* () {
45
- const workspace = yield workspace_1.getWorkspace(host);
46
- const project = schematics_2.getProjectFromWorkspace(workspace, options.project);
47
- const projectIndexFiles = schematics_2.getProjectIndexFiles(project);
48
- if (!projectIndexFiles.length) {
49
- throw new schematics_1.SchematicsException('No project index HTML file could be found.');
50
- }
51
- if (options.typography) {
52
- projectIndexFiles.forEach(path => schematics_2.addBodyClass(host, path, 'mat-typography'));
53
- }
54
- });
55
- }
56
- exports.addTypographyClass = addTypographyClass;
57
- /**
58
- * Insert a custom theme to project style file. If no valid style file could be found, a new
59
- * Scss file for the custom theme will be created.
60
- */
61
- function insertCustomTheme(projectName, host, logger) {
62
- return __awaiter(this, void 0, void 0, function* () {
63
- const workspace = yield workspace_1.getWorkspace(host);
64
- const project = schematics_2.getProjectFromWorkspace(workspace, projectName);
65
- const stylesPath = schematics_2.getProjectStyleFile(project, 'scss');
66
- const themeContent = create_custom_theme_1.createCustomTheme(projectName);
67
- if (!stylesPath) {
68
- if (!project.sourceRoot) {
69
- throw new schematics_1.SchematicsException(`Could not find source root for project: "${projectName}". ` +
70
- `Please make sure that the "sourceRoot" property is set in the workspace config.`);
71
- }
72
- // Normalize the path through the devkit utilities because we want to avoid having
73
- // unnecessary path segments and windows backslash delimiters.
74
- const customThemePath = core_1.normalize(path_1.join(project.sourceRoot, defaultCustomThemeFilename));
75
- if (host.exists(customThemePath)) {
76
- logger.warn(`Cannot create a custom Angular Material theme because
77
- ${customThemePath} already exists. Skipping custom theme generation.`);
78
- return schematics_1.noop();
79
- }
80
- host.create(customThemePath, themeContent);
81
- return addThemeStyleToTarget(projectName, 'build', customThemePath, logger);
82
- }
83
- const insertion = new change_1.InsertChange(stylesPath, 0, themeContent);
84
- const recorder = host.beginUpdate(stylesPath);
85
- recorder.insertLeft(insertion.pos, insertion.toAdd);
86
- host.commitUpdate(recorder);
87
- return schematics_1.noop();
88
- });
89
- }
90
- /** Insert a pre-built theme into the angular.json file. */
91
- function insertPrebuiltTheme(project, theme, logger) {
92
- // Path needs to be always relative to the `package.json` or workspace root.
93
- const baseThemePath = `./node_modules/jqwidgets-ng/jqwidgets/styles/jqx.base.css`;
94
- const themePath = `./node_modules/jqwidgets-ng/jqwidgets/styles/${theme}.css`;
95
-
96
- if (theme === 'jqx.base') {
97
- return schematics_1.chain([
98
- addThemeStyleToTarget(project, 'build', themePath, logger),
99
- addThemeStyleToTarget(project, 'test', themePath, logger)
100
- ]);
101
- }
102
- else {
103
- prebuiltThemePathSegment += "/" + theme;
104
-
105
- return schematics_1.chain([
106
- addThemeStyleToTarget(project, 'build', baseThemePath, logger),
107
- addThemeStyleToTarget(project, 'test', baseThemePath, logger),
108
- addThemeStyleToTarget(project, 'build', themePath, logger),
109
- addThemeStyleToTarget(project, 'test', themePath, logger)
110
- ]);
111
- }
112
- }
113
- /** Adds a theming style entry to the given project target options. */
114
- function addThemeStyleToTarget(projectName, targetName, assetPath, logger) {
115
- return workspace_1.updateWorkspace(workspace => {
116
- const project = schematics_2.getProjectFromWorkspace(workspace, projectName);
117
- // Do not update the builder options in case the target does not use the default CLI builder.
118
- if (!validateDefaultTargetBuilder(project, targetName, logger)) {
119
- return;
120
- }
121
- const targetOptions = schematics_2.getProjectTargetOptions(project, targetName);
122
- const styles = targetOptions.styles;
123
- if (!styles) {
124
- targetOptions.styles = [assetPath];
125
- }
126
- else {
127
- const existingStyles = styles.map(s => typeof s === 'string' ? s : s.input);
128
- for (let [index, stylePath] of existingStyles.entries()) {
129
- // If the given asset is already specified in the styles, we don't need to do anything.
130
- if (stylePath === assetPath) {
131
- return;
132
- }
133
- // In case a prebuilt theme is already set up, we can safely replace the theme with the new
134
- // theme file. If a custom theme is set up, we are not able to safely replace the custom
135
- // theme because these files can contain custom styles, while prebuilt themes are
136
- // always packaged and considered replaceable.
137
- if (stylePath.includes(defaultCustomThemeFilename)) {
138
- logger.error(`Could not add the selected theme to the CLI project ` +
139
- `configuration because there is already a custom theme file referenced.`);
140
- logger.info(`Please manually add the following style file to your configuration:`);
141
- logger.info(` ${assetPath}`);
142
- return;
143
- }
144
- else if (stylePath.includes(prebuiltThemePathSegment)) {
145
- styles.splice(index, 1);
146
- }
147
- }
148
- styles.push(assetPath);
149
- }
150
- });
151
- }
152
- /**
153
- * Validates that the specified project target is configured with the default builders which are
154
- * provided by the Angular CLI. If the configured builder does not match the default builder,
155
- * this function can either throw or just show a warning.
156
- */
157
- function validateDefaultTargetBuilder(project, targetName, logger) {
158
- const defaultBuilder = schematics_2.defaultTargetBuilders[targetName];
159
- const targetConfig = project.targets && project.targets.get(targetName);
160
- const isDefaultBuilder = targetConfig && targetConfig['builder'] === defaultBuilder;
161
- // Because the build setup for the Angular CLI can be customized by developers, we can't know
162
- // where to put the theme file in the workspace configuration if custom builders are being
163
- // used. In case the builder has been changed for the "build" target, we throw an error and
164
- // exit because setting up a theme is a primary goal of `ng-add`. Otherwise if just the "test"
165
- // builder has been changed, we warn because a theme is not mandatory for running tests
166
- // with Material. See: https://github.com/angular/components/issues/14176
167
- if (!isDefaultBuilder && targetName === 'build') {
168
- throw new schematics_1.SchematicsException(`Your project is not using the default builders for ` +
169
- `"${targetName}". The Angular Material schematics cannot add a theme to the workspace ` +
170
- `configuration if the builder has been changed.`);
171
- }
172
- else if (!isDefaultBuilder) {
173
- // for non-build targets we gracefully report the error without actually aborting the
174
- // setup schematic. This is because a theme is not mandatory for running tests.
175
- logger.warn(`Your project is not using the default builders for "${targetName}". This ` +
176
- `means that we cannot add the configured theme to the "${targetName}" target.`);
177
- }
178
- return isDefaultBuilder;
179
- }
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.addTypographyClass = exports.addThemeToAppStyles = void 0;
11
+ const core_1 = require("@angular-devkit/core");
12
+ const schematics_1 = require("@angular-devkit/schematics");
13
+ const schematics_2 = require("../cdk/schematics");
14
+ const change_1 = require("@schematics/angular/utility/change");
15
+ const workspace_1 = require("@schematics/angular/utility/workspace");
16
+ const path_1 = require("path");
17
+ const create_custom_theme_1 = require("./create-custom-theme");
18
+ /** Path segment that can be found in paths that refer to a prebuilt theme. */
19
+ let prebuiltThemePathSegment = 'jqwidgets-ng/jqwidgets/styles';
20
+
21
+ /** Default file name of the custom theme that can be generated. */
22
+ const defaultCustomThemeFilename = 'custom-theme.scss';
23
+ /** Add pre-built styles to the main project style file. */
24
+ function addThemeToAppStyles(options) {
25
+ return (host, context) => {
26
+ const themeName = options.theme || 'base';
27
+ return themeName === 'custom'
28
+ ? insertCustomTheme(options.project, host, context.logger)
29
+ : insertPrebuiltTheme(options.project, 'jqx.' + themeName, context.logger);
30
+ };
31
+ }
32
+ exports.addThemeToAppStyles = addThemeToAppStyles;
33
+ /** Adds the global typography class to the body element. */
34
+ function addTypographyClass(options) {
35
+ return async (host) => {
36
+ const workspace = await (0, workspace_1.getWorkspace)(host);
37
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, options.project);
38
+ const projectIndexFiles = (0, schematics_2.getProjectIndexFiles)(project);
39
+ if (!projectIndexFiles.length) {
40
+ throw new schematics_1.SchematicsException('No project index HTML file could be found.');
41
+ }
42
+ if (options.typography) {
43
+ projectIndexFiles.forEach(path => (0, schematics_2.addBodyClass)(host, path, 'mat-typography'));
44
+ }
45
+ };
46
+ }
47
+ exports.addTypographyClass = addTypographyClass;
48
+ /**
49
+ * Insert a custom theme to project style file. If no valid style file could be found, a new
50
+ * Scss file for the custom theme will be created.
51
+ */
52
+ async function insertCustomTheme(projectName, host, logger) {
53
+ const workspace = await (0, workspace_1.getWorkspace)(host);
54
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
55
+ const stylesPath = (0, schematics_2.getProjectStyleFile)(project, 'scss');
56
+ const themeContent = (0, create_custom_theme_1.createCustomTheme)(projectName);
57
+ if (!stylesPath) {
58
+ if (!project.sourceRoot) {
59
+ throw new schematics_1.SchematicsException(`Could not find source root for project: "${projectName}". ` +
60
+ `Please make sure that the "sourceRoot" property is set in the workspace config.`);
61
+ }
62
+ // Normalize the path through the devkit utilities because we want to avoid having
63
+ // unnecessary path segments and windows backslash delimiters.
64
+ const customThemePath = (0, core_1.normalize)((0, path_1.join)(project.sourceRoot, defaultCustomThemeFilename));
65
+ if (host.exists(customThemePath)) {
66
+ logger.warn(`Cannot create a custom Angular Material theme because
67
+ ${customThemePath} already exists. Skipping custom theme generation.`);
68
+ return (0, schematics_1.noop)();
69
+ }
70
+ host.create(customThemePath, themeContent);
71
+ return addThemeStyleToTarget(projectName, 'build', customThemePath, logger);
72
+ }
73
+ const insertion = new change_1.InsertChange(stylesPath, 0, themeContent);
74
+ const recorder = host.beginUpdate(stylesPath);
75
+ recorder.insertLeft(insertion.pos, insertion.toAdd);
76
+ host.commitUpdate(recorder);
77
+ return (0, schematics_1.noop)();
78
+ }
79
+ /** Insert a pre-built theme into the angular.json file. */
80
+ function insertPrebuiltTheme(project, theme, logger) {
81
+ const baseThemePath = `./node_modules/jqwidgets-ng/jqwidgets/styles/jqx.base.css`;
82
+ const themePath = `./node_modules/jqwidgets-ng/jqwidgets/styles/${theme}.css`;
83
+
84
+ if (theme === 'jqx.base') {
85
+ return schematics_1.chain([
86
+ addThemeStyleToTarget(project, 'build', themePath, logger),
87
+ addThemeStyleToTarget(project, 'test', themePath, logger)
88
+ ]);
89
+ }
90
+ else {
91
+ prebuiltThemePathSegment += "/" + theme;
92
+
93
+ return schematics_1.chain([
94
+ addThemeStyleToTarget(project, 'build', baseThemePath, logger),
95
+ addThemeStyleToTarget(project, 'test', baseThemePath, logger),
96
+ addThemeStyleToTarget(project, 'build', themePath, logger),
97
+ addThemeStyleToTarget(project, 'test', themePath, logger)
98
+ ]);
99
+ }
100
+ }
101
+ /** Adds a theming style entry to the given project target options. */
102
+ function addThemeStyleToTarget(projectName, targetName, assetPath, logger) {
103
+ return (0, workspace_1.updateWorkspace)(workspace => {
104
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
105
+ // Do not update the builder options in case the target does not use the default CLI builder.
106
+ if (!validateDefaultTargetBuilder(project, targetName, logger)) {
107
+ return;
108
+ }
109
+ const targetOptions = (0, schematics_2.getProjectTargetOptions)(project, targetName);
110
+ const styles = targetOptions['styles'];
111
+ if (!styles) {
112
+ targetOptions['styles'] = [assetPath];
113
+ }
114
+ else {
115
+ const existingStyles = styles.map(s => (typeof s === 'string' ? s : s.input));
116
+ for (let [index, stylePath] of existingStyles.entries()) {
117
+ // If the given asset is already specified in the styles, we don't need to do anything.
118
+ if (stylePath === assetPath) {
119
+ return;
120
+ }
121
+ // In case a prebuilt theme is already set up, we can safely replace the theme with the new
122
+ // theme file. If a custom theme is set up, we are not able to safely replace the custom
123
+ // theme because these files can contain custom styles, while prebuilt themes are
124
+ // always packaged and considered replaceable.
125
+ if (stylePath.includes(defaultCustomThemeFilename)) {
126
+ logger.error(`Could not add the selected theme to the CLI project ` +
127
+ `configuration because there is already a custom theme file referenced.`);
128
+ logger.info(`Please manually add the following style file to your configuration:`);
129
+ logger.info(` ${assetPath}`);
130
+ return;
131
+ }
132
+ else if (stylePath.includes(prebuiltThemePathSegment)) {
133
+ styles.splice(index, 1);
134
+ }
135
+ }
136
+ styles.unshift(assetPath);
137
+ }
138
+ });
139
+ }
140
+ /**
141
+ * Validates that the specified project target is configured with the default builders which are
142
+ * provided by the Angular CLI. If the configured builder does not match the default builder,
143
+ * this function can either throw or just show a warning.
144
+ */
145
+ function validateDefaultTargetBuilder(project, targetName, logger) {
146
+ const targets = targetName === 'test' ? (0, schematics_2.getProjectTestTargets)(project) : (0, schematics_2.getProjectBuildTargets)(project);
147
+ const isDefaultBuilder = targets.length > 0;
148
+ // Because the build setup for the Angular CLI can be customized by developers, we can't know
149
+ // where to put the theme file in the workspace configuration if custom builders are being
150
+ // used. In case the builder has been changed for the "build" target, we throw an error and
151
+ // exit because setting up a theme is a primary goal of `ng-add`. Otherwise if just the "test"
152
+ // builder has been changed, we warn because a theme is not mandatory for running tests
153
+ // with Material. See: https://github.com/angular/components/issues/14176
154
+ if (!isDefaultBuilder && targetName === 'build') {
155
+ throw new schematics_1.SchematicsException(`Your project is not using the default builders for ` +
156
+ `"${targetName}". The Angular Material schematics cannot add a theme to the workspace ` +
157
+ `configuration if the builder has been changed.`);
158
+ }
159
+ else if (!isDefaultBuilder) {
160
+ // for non-build targets we gracefully report the error without actually aborting the
161
+ // setup schematic. This is because a theme is not mandatory for running tests.
162
+ logger.warn(`Your project is not using the default builders for "${targetName}". This ` +
163
+ `means that we cannot add the configured theme to the "${targetName}" target.`);
164
+ }
165
+ return isDefaultBuilder;
166
+ }
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9zY2hlbWF0aWNzL25nLWFkZC90aGVtaW5nL3RoZW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBRUgsK0NBQW9FO0FBQ3BFLDJEQU9vQztBQUNwQyx3REFRaUM7QUFDakMsK0RBQWdFO0FBQ2hFLHFFQUFvRjtBQUNwRiwrQkFBMEI7QUFFMUIsK0RBQXdEO0FBRXhELDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUFHLG1DQUFtQyxDQUFDO0FBRXJFLG1FQUFtRTtBQUNuRSxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBRXZELDJEQUEyRDtBQUMzRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFlO0lBQ2pELE9BQU8sQ0FBQyxJQUFVLEVBQUUsT0FBeUIsRUFBRSxFQUFFO1FBQy9DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDO1FBQ2pELE9BQU8sU0FBUyxLQUFLLFFBQVE7WUFDM0IsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDMUQsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7QUFDSixDQUFDO0FBUEQsa0RBT0M7QUFFRCw0REFBNEQ7QUFDNUQsU0FBZ0Isa0JBQWtCLENBQUMsT0FBZTtJQUNoRCxPQUFPLEtBQUssRUFBRSxJQUFVLEVBQUUsRUFBRTtRQUMxQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFBLG9DQUF1QixFQUFDLFNBQVMs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QGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge25vcm1hbGl6ZSwgbG9nZ2luZywgd29ya3NwYWNlc30gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtcbiAgY2hhaW4sXG4gIG5vb3AsXG4gIFJ1bGUsXG4gIFNjaGVtYXRpY0NvbnRleHQsXG4gIFNjaGVtYXRpY3NFeGNlcHRpb24sXG4gIFRyZWUsXG59IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzJztcbmltcG9ydCB7XG4gIGFkZEJvZHlDbGFzcyxcbiAgZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2UsXG4gIGdldFByb2plY3RTdHlsZUZpbGUsXG4gIGdldFByb2plY3RUYXJnZXRPcHRpb25zLFxuICBnZXRQcm9qZWN0SW5kZXhGaWxlcyxcbiAgZ2V0UHJvamVjdFRlc3RUYXJnZXRzLFxuICBnZXRQcm9qZWN0QnVpbGRUYXJnZXRzLFxufSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5pbXBvcnQge0luc2VydENoYW5nZX0gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5L2NoYW5nZSc7XG5pbXBvcnQge2dldFdvcmtzcGFjZSwgdXBkYXRlV29ya3NwYWNlfSBmcm9tICdAc2NoZW1hdGljcy9hbmd1bGFyL3V0aWxpdHkvd29ya3NwYWNlJztcbmltcG9ydCB7am9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1NjaGVtYX0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7Y3JlYXRlQ3VzdG9tVGhlbWV9IGZyb20gJy4vY3JlYXRlLWN1c3RvbS10aGVtZSc7XG5cbi8qKiBQYXRoIHNlZ21lbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gcGF0aHMgdGhhdCByZWZlciB0byBhIHByZWJ1aWx0IHRoZW1lLiAqL1xuY29uc3QgcHJlYnVpbHRUaGVtZVBhdGhTZWdtZW50ID0gJ0Bhbmd1bGFyL21hdGVyaWFsL3ByZWJ1aWx0LXRoZW1lcyc7XG5cbi8qKiBEZWZhdWx0IGZpbGUgbmFtZSBvZiB0aGUgY3VzdG9tIHRoZW1lIHRoYXQgY2FuIGJlIGdlbmVyYXRlZC4gKi9cbmNvbnN0IGRlZmF1bHRDdXN0b21UaGVtZUZpbGVuYW1lID0gJ2N1c3RvbS10aGVtZS5zY3NzJztcblxuLyoqIEFkZCBwcmUtYnVpbHQgc3R5bGVzIHRvIHRoZSBtYWluIHByb2plY3Qgc3R5bGUgZmlsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUaGVtZVRvQXBwU3R5bGVzKG9wdGlvbnM6IFNjaGVtYSk6IFJ1bGUge1xuICByZXR1cm4gKGhvc3Q6IFRyZWUsIGNvbnRleHQ6IFNjaGVtYXRpY0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB0aGVtZU5hbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpbmRpZ28tcGluayc7XG4gICAgcmV0dXJuIHRoZW1lTmFtZSA9PT0gJ2N1c3RvbSdcbiAgICAgID8gaW5zZXJ0Q3VzdG9tVGhlbWUob3B0aW9ucy5wcm9qZWN0LCBob3N0LCBjb250ZXh0LmxvZ2dlcilcbiAgICAgIDogaW5zZXJ0UHJlYnVpbHRUaGVtZShvcHRpb25zLnByb2plY3QsIHRoZW1lTmFtZSwgY29udGV4dC5sb2dnZXIpO1xuICB9O1xufVxuXG4vKiogQWRkcyB0aGUgZ2xvYmFsIHR5cG9ncmFwaHkgY2xhc3MgdG8gdGhlIGJvZHkgZWxlbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUeXBvZ3JhcGh5Q2xhc3Mob3B0aW9uczogU2NoZW1hKTogUnVsZSB7XG4gIHJldHVybiBhc3luYyAoaG9zdDogVHJlZSkgPT4ge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IGF3YWl0IGdldFdvcmtzcGFjZShob3N0KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2Uod29ya3NwYWNlLCBvcHRpb25zLnByb2plY3QpO1xuICAgIGNvbnN0IHByb2plY3RJbmRleEZpbGVzID0gZ2V0UHJvamVjdEluZGV4RmlsZXMocHJvamVjdCk7XG5cbiAgICBpZiAoIXByb2plY3RJbmRleEZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oJ05vIHByb2plY3QgaW5kZXggSFRNTCBmaWxlIGNvdWxkIGJlIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnR5cG9ncmFwaHkpIHtcbiAgICAgIHByb2plY3RJbmRleEZpbGVzLmZvckVhY2gocGF0aCA9PiBhZGRCb2R5Q2xhc3MoaG9zdCwgcGF0aCwgJ21hdC10eXBvZ3JhcGh5JykpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBJbnNlcnQgYSBjdXN0b20gdGhlbWUgdG8gcHJvamVjdCBzdHlsZSBmaWxlLiBJZiBubyB2YWxpZCBzdHlsZSBmaWxlIGNvdWxkIGJlIGZvdW5kLCBhIG5ld1xuICogU2NzcyBmaWxlIGZvciB0aGUgY3VzdG9tIHRoZW1lIHdpbGwgYmUgY3JlYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zZXJ0Q3VzdG9tVGhlbWUoXG4gIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gIGhvc3Q6IFRyZWUsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pOiBQcm9taXNlPFJ1bGU+IHtcbiAgY29uc3Qgd29ya3NwYWNlID0gYXdhaXQgZ2V0V29ya3NwYWNlKGhvc3QpO1xuICBjb25zdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2Uod29ya3NwYWNlLCBwcm9qZWN0TmFtZSk7XG4gIGNvbnN0IHN0eWxlc1BhdGggPSBnZXRQcm9qZWN0U3R5bGVGaWxlKHByb2plY3QsICdzY3NzJyk7XG4gIGNvbnN0IHRoZW1lQ29udGVudCA9IGNyZWF0ZUN1c3RvbVRoZW1lKHByb2plY3ROYW1lKTtcblxuICBpZiAoIXN0eWxlc1BhdGgpIHtcbiAgICBpZiAoIXByb2plY3Quc291cmNlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBzb3VyY2Ugcm9vdCBmb3IgcHJvamVjdDogXCIke3Byb2plY3ROYW1lfVwiLiBgICtcbiAgICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBcInNvdXJjZVJvb3RcIiBwcm9wZXJ0eSBpcyBzZXQgaW4gdGhlIHdvcmtzcGFjZSBjb25maWcuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIHRocm91Z2ggdGhlIGRldmtpdCB1dGlsaXRpZXMgYmVjYXVzZSB3ZSB3YW50IHRvIGF2b2lkIGhhdmluZ1xuICAgIC8vIHVubmVjZXNzYXJ5IHBhdGggc2VnbWVudHMgYW5kIHdpbmRvd3MgYmFja3NsYXNoIGRlbGltaXRlcnMuXG4gICAgY29uc3QgY3VzdG9tVGhlbWVQYXRoID0gbm9ybWFsaXplKGpvaW4ocHJvamVjdC5zb3VyY2VSb290LCBkZWZhdWx0Q3VzdG9tVGhlbWVGaWxlbmFtZSkpO1xuXG4gICAgaWYgKGhvc3QuZXhpc3RzKGN1c3RvbVRoZW1lUGF0aCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgY3JlYXRlIGEgY3VzdG9tIEFuZ3VsYXIgTWF0ZXJpYWwgdGhlbWUgYmVjYXVzZVxuICAgICAgICAgICR7Y3VzdG9tVGhlbWVQYXRofSBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgY3VzdG9tIHRoZW1lIGdlbmVyYXRpb24uYCk7XG4gICAgICByZXR1cm4gbm9vcCgpO1xuICAgIH1cblxuICAgIGhvc3QuY3JlYXRlKGN1c3RvbVRoZW1lUGF0aCwgdGhlbWVDb250ZW50KTtcbiAgICByZXR1cm4gYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KHByb2plY3ROYW1lLCAnYnVpbGQnLCBjdXN0b21UaGVtZVBhdGgsIGxvZ2dlcik7XG4gIH1cblxuICBjb25zdCBpbnNlcnRpb24gPSBuZXcgSW5zZXJ0Q2hhbmdlKHN0eWxlc1BhdGgsIDAsIHRoZW1lQ29udGVudCk7XG4gIGNvbnN0IHJlY29yZGVyID0gaG9zdC5iZWdpblVwZGF0ZShzdHlsZXNQYXRoKTtcblxuICByZWNvcmRlci5pbnNlcnRMZWZ0KGluc2VydGlvbi5wb3MsIGluc2VydGlvbi50b0FkZCk7XG4gIGhvc3QuY29tbWl0VXBkYXRlKHJlY29yZGVyKTtcbiAgcmV0dXJuIG5vb3AoKTtcbn1cblxuLyoqIEluc2VydCBhIHByZS1idWlsdCB0aGVtZSBpbnRvIHRoZSBhbmd1bGFyLmpzb24gZmlsZS4gKi9cbmZ1bmN0aW9uIGluc2VydFByZWJ1aWx0VGhlbWUocHJvamVjdDogc3RyaW5nLCB0aGVtZTogc3RyaW5nLCBsb2dnZXI6IGxvZ2dpbmcuTG9nZ2VyQXBpKTogUnVsZSB7XG4gIGNvbnN0IHRoZW1lUGF0aCA9IGBAYW5ndWxhci9tYXRlcmlhbC9wcmVidWlsdC10aGVtZXMvJHt0aGVtZX0uY3NzYDtcblxuICByZXR1cm4gY2hhaW4oW1xuICAgIGFkZFRoZW1lU3R5bGVUb1RhcmdldChwcm9qZWN0LCAnYnVpbGQnLCB0aGVtZVBhdGgsIGxvZ2dlciksXG4gICAgYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KHByb2plY3QsICd0ZXN0JywgdGhlbWVQYXRoLCBsb2dnZXIpLFxuICBdKTtcbn1cblxuLyoqIEFkZHMgYSB0aGVtaW5nIHN0eWxlIGVudHJ5IHRvIHRoZSBnaXZlbiBwcm9qZWN0IHRhcmdldCBvcHRpb25zLiAqL1xuZnVuY3Rpb24gYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KFxuICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICB0YXJnZXROYW1lOiAndGVzdCcgfCAnYnVpbGQnLFxuICBhc3NldFBhdGg6IHN0cmluZyxcbiAgbG9nZ2VyOiBsb2dnaW5nLkxvZ2dlckFwaSxcbik6IFJ1bGUge1xuICByZXR1cm4gdXBkYXRlV29ya3NwYWNlKHdvcmtzcGFjZSA9PiB7XG4gICAgY29uc3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tV29ya3NwYWNlKHdvcmtzcGFjZSwgcHJvamVjdE5hbWUpO1xuXG4gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgYnVpbGRlciBvcHRpb25zIGluIGNhc2UgdGhlIHRhcmdldCBkb2VzIG5vdCB1c2UgdGhlIGRlZmF1bHQgQ0xJIGJ1aWxkZXIuXG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHRUYXJnZXRCdWlsZGVyKHByb2plY3QsIHRhcmdldE5hbWUsIGxvZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRPcHRpb25zID0gZ2V0UHJvamVjdFRhcmdldE9wdGlvbnMocHJvamVjdCwgdGFyZ2V0TmFtZSk7XG4gICAgY29uc3Qgc3R5bGVzID0gdGFyZ2V0T3B0aW9uc1snc3R5bGVzJ10gYXMgKHN0cmluZyB8IHtpbnB1dDogc3RyaW5nfSlbXTtcblxuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICB0YXJnZXRPcHRpb25zWydzdHlsZXMnXSA9IFthc3NldFBhdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleGlzdGluZ1N0eWxlcyA9IHN0eWxlcy5tYXAocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMuaW5wdXQpKTtcblxuICAgICAgZm9yIChsZXQgW2luZGV4LCBzdHlsZVBhdGhdIG9mIGV4aXN0aW5nU3R5bGVzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gYXNzZXQgaXMgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlcywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy5cbiAgICAgICAgaWYgKHN0eWxlUGF0aCA9PT0gYXNzZXRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gY2FzZSBhIHByZWJ1aWx0IHRoZW1lIGlzIGFscmVhZHkgc2V0IHVwLCB3ZSBjYW4gc2FmZWx5IHJlcGxhY2UgdGhlIHRoZW1lIHdpdGggdGhlIG5ld1xuICAgICAgICAvLyB0aGVtZSBmaWxlLiBJZiBhIGN1c3RvbSB0aGVtZSBpcyBzZXQgdXAsIHdlIGFyZSBub3QgYWJsZSB0byBzYWZlbHkgcmVwbGFjZSB0aGUgY3VzdG9tXG4gICAgICAgIC8vIHRoZW1lIGJlY2F1c2UgdGhlc2UgZmlsZXMgY2FuIGNvbnRhaW4gY3VzdG9tIHN0eWxlcywgd2hpbGUgcHJlYnVpbHQgdGhlbWVzIGFyZVxuICAgICAgICAvLyBhbHdheXMgcGFja2FnZWQgYW5kIGNvbnNpZGVyZWQgcmVwbGFjZWFibGUuXG4gICAgICAgIGlmIChzdHlsZVBhdGguaW5jbHVkZXMoZGVmYXVsdEN1c3RvbVRoZW1lRmlsZW5hbWUpKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBhZGQgdGhlIHNlbGVjdGVkIHRoZW1lIHRvIHRoZSBDTEkgcHJvamVjdCBgICtcbiAgICAgICAgICAgICAgYGNvbmZpZ3VyYXRpb24gYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgY3VzdG9tIHRoZW1lIGZpbGUgcmVmZXJlbmNlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFBsZWFzZSBtYW51YWxseSBhZGQgdGhlIGZvbGxvd2luZyBzdHlsZSBmaWxlIHRvIHlvdXIgY29uZmlndXJhdGlvbjpgKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgICAgICR7YXNzZXRQYXRofWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChzdHlsZVBhdGguaW5jbHVkZXMocHJlYnVpbHRUaGVtZVBhdGhTZWdtZW50KSkge1xuICAgICAgICAgIHN0eWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0eWxlcy51bnNoaWZ0KGFzc2V0UGF0aCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHByb2plY3QgdGFyZ2V0IGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZGVmYXVsdCBidWlsZGVycyB3aGljaCBhcmVcbiAqIHByb3ZpZGVkIGJ5IHRoZSBBbmd1bGFyIENMSS4gSWYgdGhlIGNvbmZpZ3VyZWQgYnVpbGRlciBkb2VzIG5vdCBtYXRjaCB0aGUgZGVmYXVsdCBidWlsZGVyLFxuICogdGhpcyBmdW5jdGlvbiBjYW4gZWl0aGVyIHRocm93IG9yIGp1c3Qgc2hvdyBhIHdhcm5pbmcuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGVmYXVsdFRhcmdldEJ1aWxkZXIoXG4gIHByb2plY3Q6IHdvcmtzcGFjZXMuUHJvamVjdERlZmluaXRpb24sXG4gIHRhcmdldE5hbWU6ICdidWlsZCcgfCAndGVzdCcsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pIHtcbiAgY29uc3QgdGFyZ2V0cyA9XG4gICAgdGFyZ2V0TmFtZSA9PT0gJ3Rlc3QnID8gZ2V0UHJvamVjdFRlc3RUYXJnZXRzKHByb2plY3QpIDogZ2V0UHJvamVjdEJ1aWxkVGFyZ2V0cyhwcm9qZWN0KTtcbiAgY29uc3QgaXNEZWZhdWx0QnVpbGRlciA9IHRhcmdldHMubGVuZ3RoID4gMDtcblxuICAvLyBCZWNhdXNlIHRoZSBidWlsZCBzZXR1cCBmb3IgdGhlIEFuZ3VsYXIgQ0xJIGNhbiBiZSBjdXN0b21pemVkIGJ5IGRldmVsb3BlcnMsIHdlIGNhbid0IGtub3dcbiAgLy8gd2hlcmUgdG8gcHV0IHRoZSB0aGVtZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBpZiBjdXN0b20gYnVpbGRlcnMgYXJlIGJlaW5nXG4gIC8vIHVzZWQuIEluIGNhc2UgdGhlIGJ1aWxkZXIgaGFzIGJlZW4gY2hhbmdlZCBmb3IgdGhlIFwiYnVpbGRcIiB0YXJnZXQsIHdlIHRocm93IGFuIGVycm9yIGFuZFxuICAvLyBleGl0IGJlY2F1c2Ugc2V0dGluZyB1cCBhIHRoZW1lIGlzIGEgcHJpbWFyeSBnb2FsIG9mIGBuZy1hZGRgLiBPdGhlcndpc2UgaWYganVzdCB0aGUgXCJ0ZXN0XCJcbiAgLy8gYnVpbGRlciBoYXMgYmVlbiBjaGFuZ2VkLCB3ZSB3YXJuIGJlY2F1c2UgYSB0aGVtZSBpcyBub3QgbWFuZGF0b3J5IGZvciBydW5uaW5nIHRlc3RzXG4gIC8vIHdpdGggTWF0ZXJpYWwuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTQxNzZcbiAgaWYgKCFpc0RlZmF1bHRCdWlsZGVyICYmIHRhcmdldE5hbWUgPT09ICdidWlsZCcpIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgIGBZb3VyIHByb2plY3QgaXMgbm90IHVzaW5nIHRoZSBkZWZhdWx0IGJ1aWxkZXJzIGZvciBgICtcbiAgICAgICAgYFwiJHt0YXJnZXROYW1lfVwiLiBUaGUgQW5ndWxhciBNYXRlcmlhbCBzY2hlbWF0aWNzIGNhbm5vdCBhZGQgYSB0aGVtZSB0byB0aGUgd29ya3NwYWNlIGAgK1xuICAgICAgICBgY29uZmlndXJhdGlvbiBpZiB0aGUgYnVpbGRlciBoYXMgYmVlbiBjaGFuZ2VkLmAsXG4gICAgKTtcbiAgfSBlbHNlIGlmICghaXNEZWZhdWx0QnVpbGRlcikge1xuICAgIC8vIGZvciBub24tYnVpbGQgdGFyZ2V0cyB3ZSBncmFjZWZ1bGx5IHJlcG9ydCB0aGUgZXJyb3Igd2l0aG91dCBhY3R1YWxseSBhYm9ydGluZyB0aGVcbiAgICAvLyBzZXR1cCBzY2hlbWF0aWMuIFRoaXMgaXMgYmVjYXVzZSBhIHRoZW1lIGlzIG5vdCBtYW5kYXRvcnkgZm9yIHJ1bm5pbmcgdGVzdHMuXG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgWW91ciBwcm9qZWN0IGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBidWlsZGVycyBmb3IgXCIke3RhcmdldE5hbWV9XCIuIFRoaXMgYCArXG4gICAgICAgIGBtZWFucyB0aGF0IHdlIGNhbm5vdCBhZGQgdGhlIGNvbmZpZ3VyZWQgdGhlbWUgdG8gdGhlIFwiJHt0YXJnZXROYW1lfVwiIHRhcmdldC5gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaXNEZWZhdWx0QnVpbGRlcjtcbn1cbiJdfQ==
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * @license
4
+ * Copyright Google LLC All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.addTypographyClass = exports.addThemeToAppStyles = void 0;
11
+ const core_1 = require("@angular-devkit/core");
12
+ const schematics_1 = require("@angular-devkit/schematics");
13
+ const schematics_2 = require("@angular/cdk/schematics");
14
+ const change_1 = require("@schematics/angular/utility/change");
15
+ const workspace_1 = require("@schematics/angular/utility/workspace");
16
+ const path_1 = require("path");
17
+ const create_custom_theme_1 = require("./create-custom-theme");
18
+ /** Path segment that can be found in paths that refer to a prebuilt theme. */
19
+ const prebuiltThemePathSegment = '@angular/material/prebuilt-themes';
20
+ /** Default file name of the custom theme that can be generated. */
21
+ const defaultCustomThemeFilename = 'custom-theme.scss';
22
+ /** Add pre-built styles to the main project style file. */
23
+ function addThemeToAppStyles(options) {
24
+ return (host, context) => {
25
+ const themeName = options.theme || 'indigo-pink';
26
+ return themeName === 'custom'
27
+ ? insertCustomTheme(options.project, host, context.logger)
28
+ : insertPrebuiltTheme(options.project, themeName, context.logger);
29
+ };
30
+ }
31
+ exports.addThemeToAppStyles = addThemeToAppStyles;
32
+ /** Adds the global typography class to the body element. */
33
+ function addTypographyClass(options) {
34
+ return async (host) => {
35
+ const workspace = await (0, workspace_1.getWorkspace)(host);
36
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, options.project);
37
+ const projectIndexFiles = (0, schematics_2.getProjectIndexFiles)(project);
38
+ if (!projectIndexFiles.length) {
39
+ throw new schematics_1.SchematicsException('No project index HTML file could be found.');
40
+ }
41
+ if (options.typography) {
42
+ projectIndexFiles.forEach(path => (0, schematics_2.addBodyClass)(host, path, 'mat-typography'));
43
+ }
44
+ };
45
+ }
46
+ exports.addTypographyClass = addTypographyClass;
47
+ /**
48
+ * Insert a custom theme to project style file. If no valid style file could be found, a new
49
+ * Scss file for the custom theme will be created.
50
+ */
51
+ async function insertCustomTheme(projectName, host, logger) {
52
+ const workspace = await (0, workspace_1.getWorkspace)(host);
53
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
54
+ const stylesPath = (0, schematics_2.getProjectStyleFile)(project, 'scss');
55
+ const themeContent = (0, create_custom_theme_1.createCustomTheme)(projectName);
56
+ if (!stylesPath) {
57
+ if (!project.sourceRoot) {
58
+ throw new schematics_1.SchematicsException(`Could not find source root for project: "${projectName}". ` +
59
+ `Please make sure that the "sourceRoot" property is set in the workspace config.`);
60
+ }
61
+ // Normalize the path through the devkit utilities because we want to avoid having
62
+ // unnecessary path segments and windows backslash delimiters.
63
+ const customThemePath = (0, core_1.normalize)((0, path_1.join)(project.sourceRoot, defaultCustomThemeFilename));
64
+ if (host.exists(customThemePath)) {
65
+ logger.warn(`Cannot create a custom Angular Material theme because
66
+ ${customThemePath} already exists. Skipping custom theme generation.`);
67
+ return (0, schematics_1.noop)();
68
+ }
69
+ host.create(customThemePath, themeContent);
70
+ return addThemeStyleToTarget(projectName, 'build', customThemePath, logger);
71
+ }
72
+ const insertion = new change_1.InsertChange(stylesPath, 0, themeContent);
73
+ const recorder = host.beginUpdate(stylesPath);
74
+ recorder.insertLeft(insertion.pos, insertion.toAdd);
75
+ host.commitUpdate(recorder);
76
+ return (0, schematics_1.noop)();
77
+ }
78
+ /** Insert a pre-built theme into the angular.json file. */
79
+ function insertPrebuiltTheme(project, theme, logger) {
80
+ const themePath = `@angular/material/prebuilt-themes/${theme}.css`;
81
+ return (0, schematics_1.chain)([
82
+ addThemeStyleToTarget(project, 'build', themePath, logger),
83
+ addThemeStyleToTarget(project, 'test', themePath, logger),
84
+ ]);
85
+ }
86
+ /** Adds a theming style entry to the given project target options. */
87
+ function addThemeStyleToTarget(projectName, targetName, assetPath, logger) {
88
+ return (0, workspace_1.updateWorkspace)(workspace => {
89
+ const project = (0, schematics_2.getProjectFromWorkspace)(workspace, projectName);
90
+ // Do not update the builder options in case the target does not use the default CLI builder.
91
+ if (!validateDefaultTargetBuilder(project, targetName, logger)) {
92
+ return;
93
+ }
94
+ const targetOptions = (0, schematics_2.getProjectTargetOptions)(project, targetName);
95
+ const styles = targetOptions['styles'];
96
+ if (!styles) {
97
+ targetOptions['styles'] = [assetPath];
98
+ }
99
+ else {
100
+ const existingStyles = styles.map(s => (typeof s === 'string' ? s : s.input));
101
+ for (let [index, stylePath] of existingStyles.entries()) {
102
+ // If the given asset is already specified in the styles, we don't need to do anything.
103
+ if (stylePath === assetPath) {
104
+ return;
105
+ }
106
+ // In case a prebuilt theme is already set up, we can safely replace the theme with the new
107
+ // theme file. If a custom theme is set up, we are not able to safely replace the custom
108
+ // theme because these files can contain custom styles, while prebuilt themes are
109
+ // always packaged and considered replaceable.
110
+ if (stylePath.includes(defaultCustomThemeFilename)) {
111
+ logger.error(`Could not add the selected theme to the CLI project ` +
112
+ `configuration because there is already a custom theme file referenced.`);
113
+ logger.info(`Please manually add the following style file to your configuration:`);
114
+ logger.info(` ${assetPath}`);
115
+ return;
116
+ }
117
+ else if (stylePath.includes(prebuiltThemePathSegment)) {
118
+ styles.splice(index, 1);
119
+ }
120
+ }
121
+ styles.unshift(assetPath);
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * Validates that the specified project target is configured with the default builders which are
127
+ * provided by the Angular CLI. If the configured builder does not match the default builder,
128
+ * this function can either throw or just show a warning.
129
+ */
130
+ function validateDefaultTargetBuilder(project, targetName, logger) {
131
+ const targets = targetName === 'test' ? (0, schematics_2.getProjectTestTargets)(project) : (0, schematics_2.getProjectBuildTargets)(project);
132
+ const isDefaultBuilder = targets.length > 0;
133
+ // Because the build setup for the Angular CLI can be customized by developers, we can't know
134
+ // where to put the theme file in the workspace configuration if custom builders are being
135
+ // used. In case the builder has been changed for the "build" target, we throw an error and
136
+ // exit because setting up a theme is a primary goal of `ng-add`. Otherwise if just the "test"
137
+ // builder has been changed, we warn because a theme is not mandatory for running tests
138
+ // with Material. See: https://github.com/angular/components/issues/14176
139
+ if (!isDefaultBuilder && targetName === 'build') {
140
+ throw new schematics_1.SchematicsException(`Your project is not using the default builders for ` +
141
+ `"${targetName}". The Angular Material schematics cannot add a theme to the workspace ` +
142
+ `configuration if the builder has been changed.`);
143
+ }
144
+ else if (!isDefaultBuilder) {
145
+ // for non-build targets we gracefully report the error without actually aborting the
146
+ // setup schematic. This is because a theme is not mandatory for running tests.
147
+ logger.warn(`Your project is not using the default builders for "${targetName}". This ` +
148
+ `means that we cannot add the configured theme to the "${targetName}" target.`);
149
+ }
150
+ return isDefaultBuilder;
151
+ }
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9zY2hlbWF0aWNzL25nLWFkZC90aGVtaW5nL3RoZW1pbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBRUgsK0NBQW9FO0FBQ3BFLDJEQU9vQztBQUNwQyx3REFRaUM7QUFDakMsK0RBQWdFO0FBQ2hFLHFFQUFvRjtBQUNwRiwrQkFBMEI7QUFFMUIsK0RBQXdEO0FBRXhELDhFQUE4RTtBQUM5RSxNQUFNLHdCQUF3QixHQUFHLG1DQUFtQyxDQUFDO0FBRXJFLG1FQUFtRTtBQUNuRSxNQUFNLDBCQUEwQixHQUFHLG1CQUFtQixDQUFDO0FBRXZELDJEQUEyRDtBQUMzRCxTQUFnQixtQkFBbUIsQ0FBQyxPQUFlO0lBQ2pELE9BQU8sQ0FBQyxJQUFVLEVBQUUsT0FBeUIsRUFBRSxFQUFFO1FBQy9DLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDO1FBQ2pELE9BQU8sU0FBUyxLQUFLLFFBQVE7WUFDM0IsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDMUQsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUM7QUFDSixDQUFDO0FBUEQsa0RBT0M7QUFFRCw0REFBNEQ7QUFDNUQsU0FBZ0Isa0JBQWtCLENBQUMsT0FBZTtJQUNoRCxPQUFPLEtBQUssRUFBRSxJQUFVLEVBQUUsRUFBRTtRQUMxQixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUEsd0JBQVksRUFBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFBLG9DQUF1QixFQUFDLFNBQVMs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QGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge25vcm1hbGl6ZSwgbG9nZ2luZywgd29ya3NwYWNlc30gZnJvbSAnQGFuZ3VsYXItZGV2a2l0L2NvcmUnO1xuaW1wb3J0IHtcbiAgY2hhaW4sXG4gIG5vb3AsXG4gIFJ1bGUsXG4gIFNjaGVtYXRpY0NvbnRleHQsXG4gIFNjaGVtYXRpY3NFeGNlcHRpb24sXG4gIFRyZWUsXG59IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9zY2hlbWF0aWNzJztcbmltcG9ydCB7XG4gIGFkZEJvZHlDbGFzcyxcbiAgZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2UsXG4gIGdldFByb2plY3RTdHlsZUZpbGUsXG4gIGdldFByb2plY3RUYXJnZXRPcHRpb25zLFxuICBnZXRQcm9qZWN0SW5kZXhGaWxlcyxcbiAgZ2V0UHJvamVjdFRlc3RUYXJnZXRzLFxuICBnZXRQcm9qZWN0QnVpbGRUYXJnZXRzLFxufSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5pbXBvcnQge0luc2VydENoYW5nZX0gZnJvbSAnQHNjaGVtYXRpY3MvYW5ndWxhci91dGlsaXR5L2NoYW5nZSc7XG5pbXBvcnQge2dldFdvcmtzcGFjZSwgdXBkYXRlV29ya3NwYWNlfSBmcm9tICdAc2NoZW1hdGljcy9hbmd1bGFyL3V0aWxpdHkvd29ya3NwYWNlJztcbmltcG9ydCB7am9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1NjaGVtYX0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7Y3JlYXRlQ3VzdG9tVGhlbWV9IGZyb20gJy4vY3JlYXRlLWN1c3RvbS10aGVtZSc7XG5cbi8qKiBQYXRoIHNlZ21lbnQgdGhhdCBjYW4gYmUgZm91bmQgaW4gcGF0aHMgdGhhdCByZWZlciB0byBhIHByZWJ1aWx0IHRoZW1lLiAqL1xuY29uc3QgcHJlYnVpbHRUaGVtZVBhdGhTZWdtZW50ID0gJ0Bhbmd1bGFyL21hdGVyaWFsL3ByZWJ1aWx0LXRoZW1lcyc7XG5cbi8qKiBEZWZhdWx0IGZpbGUgbmFtZSBvZiB0aGUgY3VzdG9tIHRoZW1lIHRoYXQgY2FuIGJlIGdlbmVyYXRlZC4gKi9cbmNvbnN0IGRlZmF1bHRDdXN0b21UaGVtZUZpbGVuYW1lID0gJ2N1c3RvbS10aGVtZS5zY3NzJztcblxuLyoqIEFkZCBwcmUtYnVpbHQgc3R5bGVzIHRvIHRoZSBtYWluIHByb2plY3Qgc3R5bGUgZmlsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUaGVtZVRvQXBwU3R5bGVzKG9wdGlvbnM6IFNjaGVtYSk6IFJ1bGUge1xuICByZXR1cm4gKGhvc3Q6IFRyZWUsIGNvbnRleHQ6IFNjaGVtYXRpY0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB0aGVtZU5hbWUgPSBvcHRpb25zLnRoZW1lIHx8ICdpbmRpZ28tcGluayc7XG4gICAgcmV0dXJuIHRoZW1lTmFtZSA9PT0gJ2N1c3RvbSdcbiAgICAgID8gaW5zZXJ0Q3VzdG9tVGhlbWUob3B0aW9ucy5wcm9qZWN0LCBob3N0LCBjb250ZXh0LmxvZ2dlcilcbiAgICAgIDogaW5zZXJ0UHJlYnVpbHRUaGVtZShvcHRpb25zLnByb2plY3QsIHRoZW1lTmFtZSwgY29udGV4dC5sb2dnZXIpO1xuICB9O1xufVxuXG4vKiogQWRkcyB0aGUgZ2xvYmFsIHR5cG9ncmFwaHkgY2xhc3MgdG8gdGhlIGJvZHkgZWxlbWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUeXBvZ3JhcGh5Q2xhc3Mob3B0aW9uczogU2NoZW1hKTogUnVsZSB7XG4gIHJldHVybiBhc3luYyAoaG9zdDogVHJlZSkgPT4ge1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IGF3YWl0IGdldFdvcmtzcGFjZShob3N0KTtcbiAgICBjb25zdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2Uod29ya3NwYWNlLCBvcHRpb25zLnByb2plY3QpO1xuICAgIGNvbnN0IHByb2plY3RJbmRleEZpbGVzID0gZ2V0UHJvamVjdEluZGV4RmlsZXMocHJvamVjdCk7XG5cbiAgICBpZiAoIXByb2plY3RJbmRleEZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oJ05vIHByb2plY3QgaW5kZXggSFRNTCBmaWxlIGNvdWxkIGJlIGZvdW5kLicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnR5cG9ncmFwaHkpIHtcbiAgICAgIHByb2plY3RJbmRleEZpbGVzLmZvckVhY2gocGF0aCA9PiBhZGRCb2R5Q2xhc3MoaG9zdCwgcGF0aCwgJ21hdC10eXBvZ3JhcGh5JykpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBJbnNlcnQgYSBjdXN0b20gdGhlbWUgdG8gcHJvamVjdCBzdHlsZSBmaWxlLiBJZiBubyB2YWxpZCBzdHlsZSBmaWxlIGNvdWxkIGJlIGZvdW5kLCBhIG5ld1xuICogU2NzcyBmaWxlIGZvciB0aGUgY3VzdG9tIHRoZW1lIHdpbGwgYmUgY3JlYXRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5zZXJ0Q3VzdG9tVGhlbWUoXG4gIHByb2plY3ROYW1lOiBzdHJpbmcsXG4gIGhvc3Q6IFRyZWUsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pOiBQcm9taXNlPFJ1bGU+IHtcbiAgY29uc3Qgd29ya3NwYWNlID0gYXdhaXQgZ2V0V29ya3NwYWNlKGhvc3QpO1xuICBjb25zdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21Xb3Jrc3BhY2Uod29ya3NwYWNlLCBwcm9qZWN0TmFtZSk7XG4gIGNvbnN0IHN0eWxlc1BhdGggPSBnZXRQcm9qZWN0U3R5bGVGaWxlKHByb2plY3QsICdzY3NzJyk7XG4gIGNvbnN0IHRoZW1lQ29udGVudCA9IGNyZWF0ZUN1c3RvbVRoZW1lKHByb2plY3ROYW1lKTtcblxuICBpZiAoIXN0eWxlc1BhdGgpIHtcbiAgICBpZiAoIXByb2plY3Quc291cmNlUm9vdCkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYXRpY3NFeGNlcHRpb24oXG4gICAgICAgIGBDb3VsZCBub3QgZmluZCBzb3VyY2Ugcm9vdCBmb3IgcHJvamVjdDogXCIke3Byb2plY3ROYW1lfVwiLiBgICtcbiAgICAgICAgICBgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBcInNvdXJjZVJvb3RcIiBwcm9wZXJ0eSBpcyBzZXQgaW4gdGhlIHdvcmtzcGFjZSBjb25maWcuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIHRocm91Z2ggdGhlIGRldmtpdCB1dGlsaXRpZXMgYmVjYXVzZSB3ZSB3YW50IHRvIGF2b2lkIGhhdmluZ1xuICAgIC8vIHVubmVjZXNzYXJ5IHBhdGggc2VnbWVudHMgYW5kIHdpbmRvd3MgYmFja3NsYXNoIGRlbGltaXRlcnMuXG4gICAgY29uc3QgY3VzdG9tVGhlbWVQYXRoID0gbm9ybWFsaXplKGpvaW4ocHJvamVjdC5zb3VyY2VSb290LCBkZWZhdWx0Q3VzdG9tVGhlbWVGaWxlbmFtZSkpO1xuXG4gICAgaWYgKGhvc3QuZXhpc3RzKGN1c3RvbVRoZW1lUGF0aCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgY3JlYXRlIGEgY3VzdG9tIEFuZ3VsYXIgTWF0ZXJpYWwgdGhlbWUgYmVjYXVzZVxuICAgICAgICAgICR7Y3VzdG9tVGhlbWVQYXRofSBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgY3VzdG9tIHRoZW1lIGdlbmVyYXRpb24uYCk7XG4gICAgICByZXR1cm4gbm9vcCgpO1xuICAgIH1cblxuICAgIGhvc3QuY3JlYXRlKGN1c3RvbVRoZW1lUGF0aCwgdGhlbWVDb250ZW50KTtcbiAgICByZXR1cm4gYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KHByb2plY3ROYW1lLCAnYnVpbGQnLCBjdXN0b21UaGVtZVBhdGgsIGxvZ2dlcik7XG4gIH1cblxuICBjb25zdCBpbnNlcnRpb24gPSBuZXcgSW5zZXJ0Q2hhbmdlKHN0eWxlc1BhdGgsIDAsIHRoZW1lQ29udGVudCk7XG4gIGNvbnN0IHJlY29yZGVyID0gaG9zdC5iZWdpblVwZGF0ZShzdHlsZXNQYXRoKTtcblxuICByZWNvcmRlci5pbnNlcnRMZWZ0KGluc2VydGlvbi5wb3MsIGluc2VydGlvbi50b0FkZCk7XG4gIGhvc3QuY29tbWl0VXBkYXRlKHJlY29yZGVyKTtcbiAgcmV0dXJuIG5vb3AoKTtcbn1cblxuLyoqIEluc2VydCBhIHByZS1idWlsdCB0aGVtZSBpbnRvIHRoZSBhbmd1bGFyLmpzb24gZmlsZS4gKi9cbmZ1bmN0aW9uIGluc2VydFByZWJ1aWx0VGhlbWUocHJvamVjdDogc3RyaW5nLCB0aGVtZTogc3RyaW5nLCBsb2dnZXI6IGxvZ2dpbmcuTG9nZ2VyQXBpKTogUnVsZSB7XG4gIGNvbnN0IHRoZW1lUGF0aCA9IGBAYW5ndWxhci9tYXRlcmlhbC9wcmVidWlsdC10aGVtZXMvJHt0aGVtZX0uY3NzYDtcblxuICByZXR1cm4gY2hhaW4oW1xuICAgIGFkZFRoZW1lU3R5bGVUb1RhcmdldChwcm9qZWN0LCAnYnVpbGQnLCB0aGVtZVBhdGgsIGxvZ2dlciksXG4gICAgYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KHByb2plY3QsICd0ZXN0JywgdGhlbWVQYXRoLCBsb2dnZXIpLFxuICBdKTtcbn1cblxuLyoqIEFkZHMgYSB0aGVtaW5nIHN0eWxlIGVudHJ5IHRvIHRoZSBnaXZlbiBwcm9qZWN0IHRhcmdldCBvcHRpb25zLiAqL1xuZnVuY3Rpb24gYWRkVGhlbWVTdHlsZVRvVGFyZ2V0KFxuICBwcm9qZWN0TmFtZTogc3RyaW5nLFxuICB0YXJnZXROYW1lOiAndGVzdCcgfCAnYnVpbGQnLFxuICBhc3NldFBhdGg6IHN0cmluZyxcbiAgbG9nZ2VyOiBsb2dnaW5nLkxvZ2dlckFwaSxcbik6IFJ1bGUge1xuICByZXR1cm4gdXBkYXRlV29ya3NwYWNlKHdvcmtzcGFjZSA9PiB7XG4gICAgY29uc3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tV29ya3NwYWNlKHdvcmtzcGFjZSwgcHJvamVjdE5hbWUpO1xuXG4gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgYnVpbGRlciBvcHRpb25zIGluIGNhc2UgdGhlIHRhcmdldCBkb2VzIG5vdCB1c2UgdGhlIGRlZmF1bHQgQ0xJIGJ1aWxkZXIuXG4gICAgaWYgKCF2YWxpZGF0ZURlZmF1bHRUYXJnZXRCdWlsZGVyKHByb2plY3QsIHRhcmdldE5hbWUsIGxvZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRPcHRpb25zID0gZ2V0UHJvamVjdFRhcmdldE9wdGlvbnMocHJvamVjdCwgdGFyZ2V0TmFtZSk7XG4gICAgY29uc3Qgc3R5bGVzID0gdGFyZ2V0T3B0aW9uc1snc3R5bGVzJ10gYXMgKHN0cmluZyB8IHtpbnB1dDogc3RyaW5nfSlbXTtcblxuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICB0YXJnZXRPcHRpb25zWydzdHlsZXMnXSA9IFthc3NldFBhdGhdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleGlzdGluZ1N0eWxlcyA9IHN0eWxlcy5tYXAocyA9PiAodHlwZW9mIHMgPT09ICdzdHJpbmcnID8gcyA6IHMuaW5wdXQpKTtcblxuICAgICAgZm9yIChsZXQgW2luZGV4LCBzdHlsZVBhdGhdIG9mIGV4aXN0aW5nU3R5bGVzLmVudHJpZXMoKSkge1xuICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gYXNzZXQgaXMgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHN0eWxlcywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy5cbiAgICAgICAgaWYgKHN0eWxlUGF0aCA9PT0gYXNzZXRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gY2FzZSBhIHByZWJ1aWx0IHRoZW1lIGlzIGFscmVhZHkgc2V0IHVwLCB3ZSBjYW4gc2FmZWx5IHJlcGxhY2UgdGhlIHRoZW1lIHdpdGggdGhlIG5ld1xuICAgICAgICAvLyB0aGVtZSBmaWxlLiBJZiBhIGN1c3RvbSB0aGVtZSBpcyBzZXQgdXAsIHdlIGFyZSBub3QgYWJsZSB0byBzYWZlbHkgcmVwbGFjZSB0aGUgY3VzdG9tXG4gICAgICAgIC8vIHRoZW1lIGJlY2F1c2UgdGhlc2UgZmlsZXMgY2FuIGNvbnRhaW4gY3VzdG9tIHN0eWxlcywgd2hpbGUgcHJlYnVpbHQgdGhlbWVzIGFyZVxuICAgICAgICAvLyBhbHdheXMgcGFja2FnZWQgYW5kIGNvbnNpZGVyZWQgcmVwbGFjZWFibGUuXG4gICAgICAgIGlmIChzdHlsZVBhdGguaW5jbHVkZXMoZGVmYXVsdEN1c3RvbVRoZW1lRmlsZW5hbWUpKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYENvdWxkIG5vdCBhZGQgdGhlIHNlbGVjdGVkIHRoZW1lIHRvIHRoZSBDTEkgcHJvamVjdCBgICtcbiAgICAgICAgICAgICAgYGNvbmZpZ3VyYXRpb24gYmVjYXVzZSB0aGVyZSBpcyBhbHJlYWR5IGEgY3VzdG9tIHRoZW1lIGZpbGUgcmVmZXJlbmNlZC5gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFBsZWFzZSBtYW51YWxseSBhZGQgdGhlIGZvbGxvd2luZyBzdHlsZSBmaWxlIHRvIHlvdXIgY29uZmlndXJhdGlvbjpgKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgICAgICR7YXNzZXRQYXRofWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIGlmIChzdHlsZVBhdGguaW5jbHVkZXMocHJlYnVpbHRUaGVtZVBhdGhTZWdtZW50KSkge1xuICAgICAgICAgIHN0eWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN0eWxlcy51bnNoaWZ0KGFzc2V0UGF0aCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhhdCB0aGUgc3BlY2lmaWVkIHByb2plY3QgdGFyZ2V0IGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgZGVmYXVsdCBidWlsZGVycyB3aGljaCBhcmVcbiAqIHByb3ZpZGVkIGJ5IHRoZSBBbmd1bGFyIENMSS4gSWYgdGhlIGNvbmZpZ3VyZWQgYnVpbGRlciBkb2VzIG5vdCBtYXRjaCB0aGUgZGVmYXVsdCBidWlsZGVyLFxuICogdGhpcyBmdW5jdGlvbiBjYW4gZWl0aGVyIHRocm93IG9yIGp1c3Qgc2hvdyBhIHdhcm5pbmcuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRGVmYXVsdFRhcmdldEJ1aWxkZXIoXG4gIHByb2plY3Q6IHdvcmtzcGFjZXMuUHJvamVjdERlZmluaXRpb24sXG4gIHRhcmdldE5hbWU6ICdidWlsZCcgfCAndGVzdCcsXG4gIGxvZ2dlcjogbG9nZ2luZy5Mb2dnZXJBcGksXG4pIHtcbiAgY29uc3QgdGFyZ2V0cyA9XG4gICAgdGFyZ2V0TmFtZSA9PT0gJ3Rlc3QnID8gZ2V0UHJvamVjdFRlc3RUYXJnZXRzKHByb2plY3QpIDogZ2V0UHJvamVjdEJ1aWxkVGFyZ2V0cyhwcm9qZWN0KTtcbiAgY29uc3QgaXNEZWZhdWx0QnVpbGRlciA9IHRhcmdldHMubGVuZ3RoID4gMDtcblxuICAvLyBCZWNhdXNlIHRoZSBidWlsZCBzZXR1cCBmb3IgdGhlIEFuZ3VsYXIgQ0xJIGNhbiBiZSBjdXN0b21pemVkIGJ5IGRldmVsb3BlcnMsIHdlIGNhbid0IGtub3dcbiAgLy8gd2hlcmUgdG8gcHV0IHRoZSB0aGVtZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBpZiBjdXN0b20gYnVpbGRlcnMgYXJlIGJlaW5nXG4gIC8vIHVzZWQuIEluIGNhc2UgdGhlIGJ1aWxkZXIgaGFzIGJlZW4gY2hhbmdlZCBmb3IgdGhlIFwiYnVpbGRcIiB0YXJnZXQsIHdlIHRocm93IGFuIGVycm9yIGFuZFxuICAvLyBleGl0IGJlY2F1c2Ugc2V0dGluZyB1cCBhIHRoZW1lIGlzIGEgcHJpbWFyeSBnb2FsIG9mIGBuZy1hZGRgLiBPdGhlcndpc2UgaWYganVzdCB0aGUgXCJ0ZXN0XCJcbiAgLy8gYnVpbGRlciBoYXMgYmVlbiBjaGFuZ2VkLCB3ZSB3YXJuIGJlY2F1c2UgYSB0aGVtZSBpcyBub3QgbWFuZGF0b3J5IGZvciBydW5uaW5nIHRlc3RzXG4gIC8vIHdpdGggTWF0ZXJpYWwuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTQxNzZcbiAgaWYgKCFpc0RlZmF1bHRCdWlsZGVyICYmIHRhcmdldE5hbWUgPT09ICdidWlsZCcpIHtcbiAgICB0aHJvdyBuZXcgU2NoZW1hdGljc0V4Y2VwdGlvbihcbiAgICAgIGBZb3VyIHByb2plY3QgaXMgbm90IHVzaW5nIHRoZSBkZWZhdWx0IGJ1aWxkZXJzIGZvciBgICtcbiAgICAgICAgYFwiJHt0YXJnZXROYW1lfVwiLiBUaGUgQW5ndWxhciBNYXRlcmlhbCBzY2hlbWF0aWNzIGNhbm5vdCBhZGQgYSB0aGVtZSB0byB0aGUgd29ya3NwYWNlIGAgK1xuICAgICAgICBgY29uZmlndXJhdGlvbiBpZiB0aGUgYnVpbGRlciBoYXMgYmVlbiBjaGFuZ2VkLmAsXG4gICAgKTtcbiAgfSBlbHNlIGlmICghaXNEZWZhdWx0QnVpbGRlcikge1xuICAgIC8vIGZvciBub24tYnVpbGQgdGFyZ2V0cyB3ZSBncmFjZWZ1bGx5IHJlcG9ydCB0aGUgZXJyb3Igd2l0aG91dCBhY3R1YWxseSBhYm9ydGluZyB0aGVcbiAgICAvLyBzZXR1cCBzY2hlbWF0aWMuIFRoaXMgaXMgYmVjYXVzZSBhIHRoZW1lIGlzIG5vdCBtYW5kYXRvcnkgZm9yIHJ1bm5pbmcgdGVzdHMuXG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgWW91ciBwcm9qZWN0IGlzIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBidWlsZGVycyBmb3IgXCIke3RhcmdldE5hbWV9XCIuIFRoaXMgYCArXG4gICAgICAgIGBtZWFucyB0aGF0IHdlIGNhbm5vdCBhZGQgdGhlIGNvbmZpZ3VyZWQgdGhlbWUgdG8gdGhlIFwiJHt0YXJnZXROYW1lfVwiIHRhcmdldC5gLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gaXNEZWZhdWx0QnVpbGRlcjtcbn1cbiJdfQ==