Skip to content

Commit

Permalink
feat(@angular-devkit/schematics): add parameter to `listSchematicName…
Browse files Browse the repository at this point in the history
…s` to allow returning hidden schematics.

The return value of `listSchematicNames` will include hidden schematics when is invoked with true as first parameter.

By default, hidden schematics are not returned.
  • Loading branch information
alan-agius4 authored and dgp1130 committed Mar 22, 2022
1 parent 4e472b9 commit c9c781c
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 22 deletions.
8 changes: 4 additions & 4 deletions goldens/public-api/angular_devkit/schematics/src/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ export interface Collection<CollectionMetadataT extends object, SchematicMetadat
// (undocumented)
readonly description: CollectionDescription<CollectionMetadataT>;
// (undocumented)
listSchematicNames(): string[];
listSchematicNames(includeHidden?: boolean): string[];
}

// @public
Expand All @@ -178,7 +178,7 @@ export class CollectionImpl<CollectionT extends object, SchematicT extends objec
// (undocumented)
get description(): CollectionDescription<CollectionT>;
// (undocumented)
listSchematicNames(): string[];
listSchematicNames(includeHidden?: boolean): string[];
// (undocumented)
get name(): string;
}
Expand Down Expand Up @@ -380,7 +380,7 @@ export interface EngineHost<CollectionMetadataT extends object, SchematicMetadat
// (undocumented)
hasTaskExecutor(name: string): boolean;
// (undocumented)
listSchematicNames(collection: CollectionDescription<CollectionMetadataT>): string[];
listSchematicNames(collection: CollectionDescription<CollectionMetadataT>, includeHidden?: boolean): string[];
// (undocumented)
transformContext(context: TypedSchematicContext<CollectionMetadataT, SchematicMetadataT>): TypedSchematicContext<CollectionMetadataT, SchematicMetadataT> | void;
// (undocumented)
Expand Down Expand Up @@ -755,7 +755,7 @@ export class SchematicEngine<CollectionT extends object, SchematicT extends obje
// (undocumented)
executePostTasks(): Observable<void>;
// (undocumented)
listSchematicNames(collection: Collection<CollectionT, SchematicT>): string[];
listSchematicNames(collection: Collection<CollectionT, SchematicT>, includeHidden?: boolean): string[];
// (undocumented)
transformOptions<OptionT extends object, ResultT extends object>(schematic: Schematic<CollectionT, SchematicT>, options: OptionT, context?: TypedSchematicContext<CollectionT, SchematicT>): Observable<ResultT>;
// (undocumented)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ export abstract class FileSystemEngineHostBase implements FileSystemEngineHost_2
// (undocumented)
hasTaskExecutor(name: string): boolean;
// (undocumented)
listSchematicNames(collection: FileSystemCollectionDesc): string[];
listSchematicNames(collection: FileSystemCollectionDesc, includeHidden?: boolean): string[];
// (undocumented)
registerContextTransform(t: ContextTransform): void;
// (undocumented)
Expand Down
19 changes: 12 additions & 7 deletions packages/angular_devkit/schematics/src/engine/engine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ export class UnknownTaskDependencyException extends BaseException {
}

export class CollectionImpl<CollectionT extends object, SchematicT extends object>
implements Collection<CollectionT, SchematicT> {
implements Collection<CollectionT, SchematicT>
{
constructor(
private _description: CollectionDescription<CollectionT>,
private _engine: SchematicEngine<CollectionT, SchematicT>,
Expand All @@ -101,8 +102,8 @@ export class CollectionImpl<CollectionT extends object, SchematicT extends objec
return this._engine.createSchematic(name, this, allowPrivate);
}

listSchematicNames(): string[] {
return this._engine.listSchematicNames(this);
listSchematicNames(includeHidden?: boolean): string[] {
return this._engine.listSchematicNames(this, includeHidden);
}
}

Expand Down Expand Up @@ -169,7 +170,8 @@ export class TaskScheduler {
}

export class SchematicEngine<CollectionT extends object, SchematicT extends object>
implements Engine<CollectionT, SchematicT> {
implements Engine<CollectionT, SchematicT>
{
private _collectionCache = new Map<string, CollectionImpl<CollectionT, SchematicT>>();
private _schematicCache = new WeakMap<
Collection<CollectionT, SchematicT>,
Expand Down Expand Up @@ -333,12 +335,15 @@ export class SchematicEngine<CollectionT extends object, SchematicT extends obje
return schematic;
}

listSchematicNames(collection: Collection<CollectionT, SchematicT>): string[] {
const names = this._host.listSchematicNames(collection.description);
listSchematicNames(
collection: Collection<CollectionT, SchematicT>,
includeHidden?: boolean,
): string[] {
const names = this._host.listSchematicNames(collection.description, includeHidden);

if (collection.baseDescriptions) {
for (const base of collection.baseDescriptions) {
names.push(...this._host.listSchematicNames(base));
names.push(...this._host.listSchematicNames(base, includeHidden));
}
}

Expand Down
7 changes: 5 additions & 2 deletions packages/angular_devkit/schematics/src/engine/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ export interface EngineHost<CollectionMetadataT extends object, SchematicMetadat
name: string,
requester?: CollectionDescription<CollectionMetadataT>,
): CollectionDescription<CollectionMetadataT>;
listSchematicNames(collection: CollectionDescription<CollectionMetadataT>): string[];
listSchematicNames(
collection: CollectionDescription<CollectionMetadataT>,
includeHidden?: boolean,
): string[];

createSchematicDescription(
name: string,
Expand Down Expand Up @@ -162,7 +165,7 @@ export interface Collection<CollectionMetadataT extends object, SchematicMetadat
name: string,
allowPrivate?: boolean,
): Schematic<CollectionMetadataT, SchematicMetadataT>;
listSchematicNames(): string[];
listSchematicNames(includeHidden?: boolean): string[];
}

/**
Expand Down
13 changes: 9 additions & 4 deletions packages/angular_devkit/schematics/tools/fallback-engine-host.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,11 @@ export class FallbackEngineHost implements EngineHost<{}, {}> {
context?: FallbackContext,
): Observable<ResultT> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return ((observableOf(options) as any).pipe(
return (observableOf(options) as any).pipe(
...this._hosts.map((host) =>
mergeMap((opt: {}) => host.transformOptions(schematic, opt, context)),
),
) as {}) as Observable<ResultT>;
) as {} as Observable<ResultT>;
}

transformContext(context: FallbackContext): FallbackContext {
Expand All @@ -107,11 +107,16 @@ export class FallbackEngineHost implements EngineHost<{}, {}> {
return result;
}

listSchematicNames(collection: CollectionDescription<FallbackCollectionDescription>): string[] {
listSchematicNames(
collection: CollectionDescription<FallbackCollectionDescription>,
includeHidden?: boolean,
): string[] {
const allNames = new Set<string>();
this._hosts.forEach((host) => {
try {
host.listSchematicNames(collection.description).forEach((name) => allNames.add(name));
host
.listSchematicNames(collection.description, includeHidden)
.forEach((name) => allNames.add(name));
} catch (_) {}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,12 @@ export abstract class FileSystemEngineHostBase implements FileSystemEngineHost {
private _contextTransforms: ContextTransform[] = [];
private _taskFactories = new Map<string, () => Observable<TaskExecutor>>();

listSchematicNames(collection: FileSystemCollectionDesc) {
listSchematicNames(collection: FileSystemCollectionDesc, includeHidden?: boolean) {
const schematics: string[] = [];
for (const key of Object.keys(collection.schematics)) {
const schematic = collection.schematics[key];

if (schematic.hidden || schematic.private) {
if ((schematic.hidden && !includeHidden) || schematic.private) {
continue;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,12 +245,38 @@ describe('FileSystemEngineHost', () => {
expect(() => engine.createCollection('invalid-aliases-2')).toThrow();
});

it('does not list hidden schematics', () => {
it(`does not list hidden schematics when 'includeHidden' is not specified`, () => {
const engineHost = new FileSystemEngineHost(root);
const engine = new SchematicEngine(engineHost);
const collection = engine.createCollection('hidden-schematics');

expect(collection.listSchematicNames()).toEqual(['schematic-1', 'schematic-2']);
expect(collection.listSchematicNames(/** includeHidden */)).toEqual([
'schematic-1',
'schematic-2',
]);
});

it(`does not list hidden schematics when 'includeHidden' is false`, () => {
const engineHost = new FileSystemEngineHost(root);
const engine = new SchematicEngine(engineHost);
const collection = engine.createCollection('hidden-schematics');

expect(collection.listSchematicNames(false /** includeHidden */)).toEqual([
'schematic-1',
'schematic-2',
]);
});

it(`does list hidden schematics when 'includeHidden' is true`, () => {
const engineHost = new FileSystemEngineHost(root);
const engine = new SchematicEngine(engineHost);
const collection = engine.createCollection('hidden-schematics');

expect(collection.listSchematicNames(true /** includeHidden */)).toEqual([
'hidden-schematic',
'schematic-1',
'schematic-2',
]);
});

it('does not list private schematics', () => {
Expand Down

0 comments on commit c9c781c

Please sign in to comment.