forked from angular/angular-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathschematic.ts
71 lines (64 loc) · 2.27 KB
/
schematic.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
/**
* @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
*/
import { last, map, of as observableOf } from 'rxjs';
import { ExecutionOptions, Rule, SchematicContext } from '../engine/interface';
import { MergeStrategy, Tree } from '../tree/interface';
import { branch } from '../tree/static';
/**
* Run a schematic from a separate collection.
*
* @param collectionName The name of the collection that contains the schematic to run.
* @param schematicName The name of the schematic to run.
* @param options The options to pass as input to the RuleFactory.
*/
export function externalSchematic<OptionT extends object>(
collectionName: string,
schematicName: string,
options: OptionT,
executionOptions?: Partial<ExecutionOptions>,
): Rule {
return (input: Tree, context: SchematicContext) => {
const collection = context.engine.createCollection(
collectionName,
context.schematic.collection,
);
const schematic = collection.createSchematic(schematicName);
return schematic.call(options, observableOf(branch(input)), context, executionOptions).pipe(
last(),
map((x) => {
input.merge(x, MergeStrategy.AllowOverwriteConflict);
return input;
}),
);
};
}
/**
* Run a schematic from the same collection.
*
* @param schematicName The name of the schematic to run.
* @param options The options to pass as input to the RuleFactory.
*/
export function schematic<OptionT extends object>(
schematicName: string,
options: OptionT,
executionOptions?: Partial<ExecutionOptions>,
): Rule {
return (input: Tree, context: SchematicContext) => {
const collection = context.schematic.collection;
const schematic = collection.createSchematic(schematicName, true);
return schematic.call(options, observableOf(branch(input)), context, executionOptions).pipe(
last(),
map((x) => {
// We allow overwrite conflict here because they're the only merge conflict we particularly
// don't want to deal with; the input tree might have an OVERWRITE which the sub
input.merge(x, MergeStrategy.AllowOverwriteConflict);
return input;
}),
);
};
}