/
index.ts
120 lines (105 loc) · 4.46 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import { Rule, chain, mergeWith, MergeStrategy, apply, url, move, Tree, SchematicContext } from '@angular-devkit/schematics';
import { applyAndLog, createOrOverwriteFile, addOrReplaceScriptInPackageJson, addEntryToEnvironment, updateBoostrapFirebug, addDependencyToPackageJson } from '@ng-toolkit/_utils';
import { getFileContent } from '@schematics/angular/utility/test';
import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks';
import { Path } from '../node_modules/@angular-devkit/core';
import { getWorkspace } from '@schematics/angular/utility/config';
import { NodeDependencyType } from '@schematics/angular/utility/dependencies';
import { IFirebugSchema } from './schema';
import bugsnag from '@bugsnag/js';
const bugsnagClient = bugsnag('0b326fddc255310e516875c9874fed91');
export default function addFirebug(options: IFirebugSchema): Rule {
if (!options.clientProject) {
options.clientProject = options.project;
}
// Register bugsnag in order to catch and notify any rule error.
bugsnagClient.config.beforeSend = (report: any) => {
report.metaData = {
subsystem: {
package: 'firebug',
options: options
}
}
}
const templateSource = apply(url('files'), [
move(options.directory)
]);
const rules: Rule[] = [];
// adding build script and dependencies
rules.push(addOrReplaceScriptInPackageJson(options, 'build:firebug', `node getFirebug.js && ng serve -c firebug`));
rules.push(updateCLIConfig(options));
rules.push(updatePackageDependencies(options));
rules.push(updateConfigFiles(options));
rules.push(mergeWith(templateSource, MergeStrategy.Overwrite));
rules.push((tree: Tree) => {
tree.rename(`/src/bootstrapScripts/firebug.ts`, `${getSourceRoot(tree, options)}/bootstrapScripts/firebug.ts`);
tree.rename(`/src/environments/environment.firebug.ts`, `${getSourceRoot(tree, options)}/environments/environment.firebug.ts`);
return tree;
});
if (!options.disableBugsnag) {
return applyAndLog(chain(rules), bugsnagClient);
} else {
return chain(rules);
}
}
function getSourceRoot(tree: Tree, options: IFirebugSchema): string {
const workspace = getWorkspace(tree);
return `/${workspace.projects[options.clientProject].sourceRoot}`;
}
function updateCLIConfig(options: IFirebugSchema): Rule {
return (tree: Tree) => {
const CLIConfig = JSON.parse(getFileContent(tree, `angular.json`));
CLIConfig.projects[options.clientProject].architect.build.configurations.firebug = {
fileReplacements: [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.firebug.ts"
}
]
};
CLIConfig.projects[options.clientProject].architect.serve.configurations.firebug = { "browserTarget": `${options.clientProject}:build:firebug` };
CLIConfig.projects[options.clientProject].architect.build.options.assets.push({
"glob": "**/*.*",
"input": "firebug-lite",
"output": "/firebug-lite"
});
createOrOverwriteFile(tree, `angular.json`, JSON.stringify(CLIConfig, null, 2));
return tree;
}
}
function updateConfigFiles(options: IFirebugSchema): Rule {
return (tree: Tree, context: SchematicContext) => {
// update configuration files
tree.getDir(`${getSourceRoot(tree, options)}/environments`).visit((path: Path) => {
if (path.endsWith('.ts')) {
addEntryToEnvironment(tree, path, 'firebug', false);
}
});
//update bootstrap
updateBoostrapFirebug(tree, options);
if (!options.skipInstall) {
context.addTask(new NodePackageInstallTask());
}
return tree;
}
}
function updatePackageDependencies(options: IFirebugSchema): Rule {
return (tree: Tree) => {
addDependencyToPackageJson(tree, options, {
type: NodeDependencyType.Dev,
name: 'node-wget',
version: '^0.4.2'
});
addDependencyToPackageJson(tree, options, {
type: NodeDependencyType.Dev,
name: 'decompress',
version: '^4.2.0'
});
addDependencyToPackageJson(tree, options, {
type: NodeDependencyType.Dev,
name: 'decompress-targz',
version: '^4.1.1'
});
return tree;
}
}